1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-26 03:30:48 +03:00

Компонент media перенесен во фреймворк

This commit is contained in:
Denis Shakhov 2016-12-17 03:32:38 +07:00
parent d821eecd92
commit da032e459d
15 changed files with 1 additions and 643 deletions

View file

@ -1,3 +0,0 @@
# Компонент media
Загрузка/управление медиа-файлами для последующей вставки в редактор (компонент editor).

View file

@ -1,27 +0,0 @@
{
"name": "media",
"version": "1.0.0",
"dependencies": {
"modal": "*",
"tabs": "*",
"uploader": "*"
},
"templates": {
"content": "media-content.tpl",
"media": "media.tpl",
"pane.insert": "panes/pane.insert.tpl",
"pane.photoset": "panes/pane.photoset.tpl",
"pane.preview": "panes/pane.preview.tpl",
"pane": "panes/pane.tpl",
"pane.url": "panes/pane.url.tpl",
"uploader-block.insert.image": "uploader/uploader-block.insert.image.tpl",
"uploader-block.photoset": "uploader/uploader-block.photoset.tpl",
"uploader": "uploader/uploader.tpl"
},
"scripts": {
"media": "js/media.js"
},
"styles": {
"media": "css/media.css"
}
}

View file

@ -1,47 +0,0 @@
/**
* Media
*/
.ls-modal.ls-media {
max-width: 1130px;
border: none;
background: #222;
}
/* Nav */
.ls-media-nav .ls-tab-list {
width: 160px;
padding-top: 15px;
}
.ls-media-nav .ls-tab {
padding: 10px 15px;
background: #222;
color: #eee;
}
.ls-media-nav .ls-tab:hover {
background: #2a2a2a;
}
.ls-media-nav .ls-tab.active {
background: #333;
}
/* Panes */
.ls-media-nav .ls-tabs-panes {
overflow: hidden;
margin-left: 160px;
background: #fff;
}
/* Content */
.ls-media-pane-content {
min-height: 300px;
padding: 15px;
}
/* Footer */
.ls-media-pane-footer {
padding: 15px;
background: #fafafa;
border-top: 1px solid #eee;
text-align: right;
}

View file

@ -1,351 +0,0 @@
/**
* Media
*
* @module ls/media
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*
* TODO: Фильтрация файлов по типу при переключении табов
*/
(function($) {
"use strict";
$.widget( "livestreet.lsMedia", $.livestreet.lsComponent, {
/**
* Дефолтные опции
*/
options: {
// Редактор к которому привязано текущее окно
editor: $(),
// Ссылки
urls: {
// Вставка файла
insert: aRouter.ajax + 'media/submit-insert/',
// Вставка фотосета
photoset: aRouter.ajax + 'media/submit-create-photoset',
// Загрузка файла по ссылке
url_upload: aRouter.ajax + 'media/upload-link/',
// Вставка файла по ссылке
url_insert: aRouter.ajax + 'media/upload-insert/'
},
// Селекторы
selectors: {
nav: '.js-media-nav',
uploader: '.js-media-uploader',
block: '.js-media-info-block',
blocks: '.js-media-uploader .js-media-info-block',
insert_submit: '.js-media-insert-submit',
photoset_submit: '.js-media-photoset-submit',
url: {
form: '.js-media-url-form',
url: '.js-media-url-form-url',
block_container: '.js-media-url-settings-blocks',
blocks: '.js-media-url-settings-blocks .js-media-info-block',
submit_upload: '.js-media-url-submit-upload',
submit_insert: '.js-media-url-submit-insert',
image_preview: '.js-media-url-image-preview'
}
},
uploader_options: {},
params: {}
},
/**
* Конструктор
*
* @constructor
* @private
*/
_create: function () {
this._super();
// Получаем редактор
! this.option( 'editor' ).length && this.option( 'editor', $( '#' + this.element.data( 'media-editor') ) );
// Иниц-ия загрузчика
this.elements.uploader.lsUploader( $.extend( {}, this.option( 'uploader_options' ), {
autoload: false,
params: {
security_ls_key: LIVESTREET_SECURITY_KEY
},
filebeforeactivate: this._onFileBeforeActivate.bind( this )
}));
this._list = this.elements.uploader.lsUploader( 'getElement', 'list' );
this._originalTargetType = this.elements.uploader.lsUploader( 'option', 'params.target_type' );
// Табы
this.elements.nav.lsTabs({
tabactivate: this._onTabActivate.bind( this )
});
// Иниц-ия модального окна
this.element.lsModal({
aftershow: this.reload.bind( this )
});
//
// INSERT
//
this._on( this.elements.insert_submit, { click: '_onInsertSubmit' } );
this._on( this.elements.photoset_submit, { click: '_onPhotosetSubmit' } );
//
// INSERT FROM URL
//
this._on( this.elements.url.type, { click: 'onUrlTypeChange' } );
this._on( this.elements.url.url, { keyup: 'onUrlChange', change: 'onUrlChange' } );
this._on( this.elements.url.submit_upload, { click: this.urlInsert.bind( this, true ) } );
this._on( this.elements.url.submit_insert, { click: this.urlInsert.bind( this, false ) } );
},
/**
*
*/
_onInsertSubmit: function( event ) {
this.insertSelectedFiles( 'insert', this.getSettings() );
},
/**
*
*/
_onPhotosetSubmit: function( event ) {
this.insertSelectedFiles( 'photoset', this.getSettings() );
},
/**
*
*/
_onFileBeforeActivate: function( event, data ) {
this.activateInfoBlock( data.element );
},
/**
*
*/
_onTabActivate: function( event, data ) {
var type = data.element.data( 'media-name' );
this.moveUploader( data );
if ( type === 'photoset' ) {
this._list.lsUploaderFileList( 'option', 'multiselect_ctrl', false );
this.elements.uploader.lsUploader( 'filterFilesByType', [ '1' ] );
}
if ( type === 'url' ) {
this.disableUrlButtons( ! this.elements.url.url.val());
}
},
/**
* Перемещение uploader'а из одного таба в другой
*/
moveUploader: function( tab ) {
this.resetUploader();
// Перемещение
if ( tab.element.hasClass( 'js-tab-show-gallery' ) ) {
this.elements.uploader
.lsUploader( 'resetFilter' )
.lsUploader( 'unselectAll' )
.lsUploader( 'setTargetTypeFilter', 'uploaded' )
.appendTo( this.getPaneContent( tab ) );
}
},
/**
*
*/
resetUploader: function() {
this._list.lsUploaderFileList( 'option', 'params.target_type', this._originalTargetType );
this._list.lsUploaderFileList( 'option', 'multiselect_ctrl', true );
},
/**
*
*/
getPaneContent: function( tab ) {
return tab.getPane().find( '.js-media-pane-content' );
},
/**
*
*/
show: function() {
this.element.lsModal( 'show' );
},
/**
*
*/
hide: function() {
this.element.lsModal( 'hide' );
},
/**
*
*/
getSettings: function() {
return this.elements.blocks
.filter( ':visible' )
.find( 'form' )
.serializeJSON();
},
/**
*
*/
insertSelectedFiles: function( url, params ) {
this.insertFiles( url, params, this.elements.uploader.lsUploader( 'getSelectedFiles' ) );
},
/**
* Вставляет выделенные файлы в редактор
*/
insertFiles: function( url, params, files ) {
if ( ! files.length ) return;
// Формируем список ID файлов
var ids = $.map( files, function ( file ) {
return $( file ).lsUploaderFile( 'getProperty', 'id' );
});
this._load( url, $.extend( true, {}, { ids: ids }, params || {} ), function( response ) {
this.option( 'editor' ).lsEditor( 'insert', response.sTextResult );
this.element.lsModal( 'hide' );
});
},
/**
*
*/
activateInfoBlock: function( file ) {
this.elements.blocks.hide();
// Показываем блок настроек только для активного типа файла
this.elements.blocks
.filter( '[data-type=' + this.getActiveTabName() + ']' )
.filter( '[data-filetype=' + file.lsUploaderFile( 'getProperty', 'type' ) + ']' )
.show();
// Обновляем настройки
if ( this.getActiveTabName() == 'insert' && file.lsUploaderFile( 'getProperty', 'type' ) == '1' ) {
var block = this.elements.blocks.filter('.js-media-info-block-image-options');
var sizes = block.find( 'select[name=size]' );
sizes.find( 'option:not([value=original])' ).remove();
sizes.append($.map( file.data('mediaImageSizes'), function ( v, k ) {
// Расчитываем пропорциональную высоту изображения
var height = v.h || parseInt( v.w * file.lsUploaderFile( 'getProperty', 'height' ) / file.lsUploaderFile( 'getProperty', 'width' ) );
return '<option value="' + v.w + 'x' + ( v.h ? v.h : '' ) + ( v.crop ? 'crop' : '' ) + '">' + v.w + ' × ' + height + '</option>';
}).join( '' ));
}
// TODO: Add hook
},
/**
*
*/
reload: function() {
this.elements.uploader.lsUploader( 'reload' );
},
/**
*
*/
getActiveTab: function() {
return this.elements.nav.lsTabs( 'getActiveTab' );
},
/**
*
*/
getActiveTabName: function() {
return this.getActiveTab().data( 'media-name' );
},
//
// INSERT FROM URL
//
/**
*
*/
onUrlTypeChange: function ( event ) {
this.elements.url.blocks.hide();
this.elements.url.blocks.filter( '[data-filetype=' + this.elements.url.type.val() + ']' ).show();
this.elements.url.url.val( '' );
this.elements.url.image_preview.hide().empty();
},
/**
*
*/
onUrlChange: function ( event ) {
var _this = this,
url = this.elements.url.url.val();
this.disableUrlButtons( ! url);
$('<img />', {
src: url,
style: 'max-width: 50%',
error: function () {
_this.elements.url.image_preview.hide().empty();
},
load: function () {
_this.elements.url.image_preview.show().html( $( this ) );
}
});
},
/**
*
*/
disableUrlButtons: function ( disable ) {
this.elements.url.submit_insert.prop( 'disabled', disable );
this.elements.url.submit_upload.prop( 'disabled', disable );
},
/**
*
*/
urlInsert: function ( upload ) {
var upload = upload || false,
params = $.extend(
{},
{ upload: upload },
this.elements.url.form.serializeJSON(),
this.elements.url.blocks.filter( ':visible' ).find('form').serializeJSON(),
this.elements.uploader.lsUploader( 'option', 'params' )
);
this.disableUrlButtons(true);
this._load( 'url_upload', params, function ( response ) {
this.option( 'editor' ).lsEditor( 'insert', response.sText );
this.element.lsModal( 'hide' );
this.reload();
}, {
// TODO: Fix validation
validate: false,
submitButton: this.elements.url[ upload ? 'submit_upload' : 'submit_insert' ],
onComplete: function () {
this.disableUrlButtons(false);
}.bind(this)
});
}
});
})(jQuery);

View file

@ -1,11 +0,0 @@
{**
* Media content
*}
<div class="ls-media ls-clearfix {$smarty.local.classes}">
{component 'tabs' classes='ls-media-nav js-media-nav' mods='align-left' tabs=[
[ 'text' => {lang 'media.nav.insert'}, 'body' => {component 'media' template='pane.insert'}, 'classes' => 'js-tab-show-gallery', 'attributes' => [ 'data-media-name' => 'insert' ] ],
[ 'text' => {lang 'media.nav.photoset'}, 'body' => {component 'media' template='pane.photoset'}, 'classes' => 'js-tab-show-gallery', 'attributes' => [ 'data-media-name' => 'photoset' ] ],
[ 'text' => {lang 'media.nav.url'}, 'body' => {component 'media' template='pane.url'}, 'attributes' => [ 'data-media-name' => 'url' ] ]
]}
</div>

View file

@ -1,13 +0,0 @@
{**
* Загрузка медиа-файлов
*}
{extends 'Component@modal.modal'}
{block 'modal_options' append}
{$classes = "$classes ls-media js-modal-media"}
{$title = {lang name='media.title'}}
{$options = array_merge( $options|default:[], [ 'center' => 'false' ] )}
{$showFooter = false}
{$body = {component 'media' template='content'}}
{/block}

View file

@ -1,22 +0,0 @@
{extends './pane.tpl'}
{block 'media_pane_options' append}
{$id = 'tab-media-insert'}
{/block}
{block 'media_pane_content'}
{component 'media' template='uploader'
attributes = [ 'id' => 'media-uploader' ]
classes = 'js-media-uploader'
targetParams = $aTargetParams
targetType = $sMediaTargetType
targetId = $sMediaTargetId
targetTmp = $sMediaTargetTmp}
{/block}
{block 'media_pane_footer' prepend}
{component 'button'
mods = 'primary'
classes = 'js-media-insert-submit'
text = {lang name='media.insert.submit'}}
{/block}

View file

@ -1,12 +0,0 @@
{extends './pane.tpl'}
{block 'media_pane_options' append}
{$id = 'tab-media-photoset'}
{/block}
{block 'media_pane_footer' prepend}
{component 'button'
mods = 'primary'
classes = 'js-media-photoset-submit'
text = {lang name='media.photoset.submit'}}
{/block}

View file

@ -1,23 +0,0 @@
{extends './pane.tpl'}
{block 'media_pane_options' append}
{$id = 'tab-media-preview'}
{/block}
{block 'media_pane_content'}
{if $aTargetItems}
{foreach $aTargetItems as $oTarget}
<p class="ls-mb-20">
<a href="#" class="button" onclick="ls.media.removePreviewFile({$oTarget->getMediaId()}); return false;">Удалить превью</a>
</p>
{$aPreview = $oTarget->getPreviewImageItemsWebPath()}
{foreach $aPreview as $sPreviewFile}
<img src="{$sPreviewFile}" alt=""><br>
{/foreach}
{/foreach}
{else}
Превью можно <a href="#" onclick="jQuery('.js-tab-show-gallery').first().click(); return false;">выбрать из галереи</a>.
{/if}
{/block}

View file

@ -1,11 +0,0 @@
{block 'media_pane_options'}
{component_define_params params=[ 'id' ]}
{/block}
<div class="ls-media-pane-content js-media-pane-content">
{block 'media_pane_content'}{/block}
</div>
<div class="ls-media-pane-footer">
{block 'media_pane_footer'}{/block}
</div>

View file

@ -1,43 +0,0 @@
{extends './pane.tpl'}
{block 'media_pane_options' append}
{$id = 'tab-media-url'}
{/block}
{block 'media_pane_content'}
<form method="post" action="" enctype="multipart/form-data" class="ls-mb-20 js-media-url-form">
{* Типы файлов *}
{* TODO: Add hook *}
{*component 'field' template='select'
name = 'filetype'
label = 'Type'
inputClasses = 'ls-width-300 js-media-url-type'
items = [
[ 'value' => '1', 'text' => 'Image' ]
]*}
{* Ссылка *}
{component 'field' template='text'
name = 'url'
inputClasses = 'js-media-url-form-url'
label = {lang 'media.url.fields.url.label'}}
</form>
<div class="ls-mb-15 js-media-url-image-preview" style="display: none"></div>
<div class="js-media-url-settings-blocks">
{component 'media' template='uploader-block.insert.image' useSizes=false}
</div>
{/block}
{block 'media_pane_footer' prepend}
{component 'button'
mods = 'primary'
classes = 'js-media-url-submit-insert'
text = {lang 'media.url.submit_insert'}}
{component 'button'
mods = 'primary'
classes = 'js-media-url-submit-upload'
text = {lang 'media.url.submit_upload'}}
{/block}

View file

@ -1,36 +0,0 @@
{**
* Опции вставки
*
* @param boolean $useSizes
*}
{component_define_params params=[ 'useSizes' ]}
{capture 'block_content'}
<form method="post" action="" enctype="multipart/form-data">
{* Выравнивание *}
{component 'field' template='select'
name = 'align'
label = {lang name='media.image_align.title'}
items = [
[ 'value' => '', 'text' => {lang name='media.image_align.no'} ],
[ 'value' => 'left', 'text' => {lang name='media.image_align.left'} ],
[ 'value' => 'right', 'text' => {lang name='media.image_align.right'} ],
[ 'value' => 'center', 'text' => {lang name='media.image_align.center'} ]
]}
{* Размер *}
{if $useSizes|default:true}
{component 'field' template='select'
name = 'size'
label = {lang name='media.insert.settings.fields.size.label'}
items = [[ 'value' => 'original', 'text' => {lang name='media.insert.settings.fields.size.original'} ]]}
{/if}
</form>
{/capture}
{component 'uploader' template='block'
title = {lang 'media.insert.settings.title'}
content = $smarty.capture.block_content
classes = 'js-media-info-block js-media-info-block-image-options'
attributes = [ 'data-type' => 'insert', 'data-filetype' => '1' ]}

View file

@ -1,24 +0,0 @@
{**
* Опции фотосета
*}
{capture 'block_content'}
<form method="post" action="" enctype="multipart/form-data">
{* Показывать ленту с превьюшками *}
{component 'field' template='checkbox'
name = 'use_thumbs'
checked = true
label = {lang name='media.photoset.settings.fields.use_thumbs.label'}}
{* Показывать описания фотографий *}
{component 'field' template='checkbox'
name = 'show_caption'
label = {lang name='media.photoset.settings.fields.show_caption.label'}}
</form>
{/capture}
{component 'uploader' template='block'
title = {lang 'media.photoset.settings.title'}
content = $smarty.capture.block_content
classes = 'js-media-info-block'
attributes = [ 'data-type' => 'photoset', 'data-filetype' => '1' ]}

View file

@ -1,19 +0,0 @@
{extends 'Component@uploader.uploader'}
{block 'uploader_options' append}
{component_define_params params=[ 'targetType', 'targetId', 'targetTmp' ]}
{$attributes = array_merge( $attributes|default:[], [
'data-param-target_type' => {json var=$targetType},
'data-param-target_id' => {json var=$targetId},
'data-param-target_tmp' => {json var=$targetTmp}
])}
{/block}
{block 'uploader_aside' append}
{* Основные настройки *}
{component 'media' template='uploader-block.insert.image'}
{* Опции фотосета *}
{component 'media' template='uploader-block.photoset'}
{/block}

@ -1 +1 @@
Subproject commit f8f411f865e78f77a1f63bb687023247fab36425
Subproject commit 753410e04acd92c1c3e5c25b74970b47412f8731