2014-05-14 13:24:20 +00:00
/ *
* Scripts for the CMS page .
* /
+ function ( $ ) { "use strict" ;
2015-04-22 03:51:39 +00:00
var Base = $ . oc . foundation . base ,
BaseProto = Base . prototype
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
var CmsPage = function ( ) {
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
Base . call ( this )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
//
// Initialization
//
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
this . init ( )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype = Object . create ( BaseProto )
CmsPage . prototype . constructor = CmsPage
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . init = function ( ) {
$ ( document ) . ready ( this . proxy ( this . registerHandlers ) )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . updateTemplateList = function ( type ) {
var $form = $ ( '#cms-side-panel form[data-template-type=' + type + ']' ) ,
templateList = type + 'List'
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$form . request ( templateList + '::onUpdate' , {
complete : function ( ) {
$ ( 'button[data-control=delete-template]' , $form ) . trigger ( 'oc.triggerOn.update' )
2014-05-14 13:24:20 +00:00
}
2015-04-22 03:51:39 +00:00
} )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . registerHandlers = function ( ) {
var $document = $ ( document ) ,
2015-04-22 04:30:02 +00:00
$masterTabs = $ ( '#cms-master-tabs' )
2015-04-22 03:51:39 +00:00
$masterTabs . on ( 'closed.oc.tab' , this . proxy ( this . onTabClosed ) )
$masterTabs . on ( 'beforeClose.oc.tab' , this . proxy ( this . onBeforeTabClose ) )
$masterTabs . on ( 'oc.beforeRequest' , this . proxy ( this . onBeforeRequest ) )
$masterTabs . on ( 'shown.bs.tab' , this . proxy ( this . onTabShown ) )
$masterTabs . on ( 'initTab.oc.tab' , this . proxy ( this . onInitTab ) )
$masterTabs . on ( 'afterAllClosed.oc.tab' , this . proxy ( this . onAfterAllTabsClosed ) )
$ ( window ) . on ( 'ajaxInvalidField' , this . proxy ( this . ajaxInvalidField ) )
$document . on ( 'open.oc.list' , '#cms-side-panel' , this . proxy ( this . onOpenDocument ) )
$document . on ( 'ajaxUpdate' , '[data-control=filelist], [data-control=assetlist]' , this . proxy ( this . onAjaxUpdate ) )
$document . on ( 'ajaxError' , '#cms-master-tabs form' , this . proxy ( this . onAjaxError ) )
2015-04-22 04:30:02 +00:00
$document . on ( 'ajaxSuccess' , '#cms-master-tabs form' , this . proxy ( this . onAjaxSuccess ) )
2015-04-22 03:51:39 +00:00
$document . on ( 'click' , '#cms-side-panel form button[data-control=create-template], #cms-side-panel form li a[data-control=create-template]' , this . proxy ( this . onCreateTemplateClick ) )
$document . on ( 'click' , '#cms-side-panel form button[data-control=delete-template]' , this . proxy ( this . onDeleteTemplateClick ) )
$document . on ( 'showing.oc.inspector' , '[data-inspectable]' , this . proxy ( this . onInspectorShowing ) )
$document . on ( 'hidden.oc.inspector' , '[data-inspectable]' , this . proxy ( this . onInspectorHidden ) )
$document . on ( 'hiding.oc.inspector' , '[data-inspectable]' , this . proxy ( this . onInspectorHiding ) )
$document . on ( 'click' , '#cms-master-tabs > div.tab-content > .tab-pane.active .control-componentlist a.remove' , this . proxy ( this . onComponentRemove ) )
$document . on ( 'click' , '#cms-component-list [data-component]' , this . proxy ( this . onComponentClick ) )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
// EVENT HANDLERS
// ============================
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onOpenDocument = function ( event ) {
2014-05-14 13:24:20 +00:00
/ *
2015-04-22 03:51:39 +00:00
* Open a document when it ' s clicked in the sidebar
2014-05-14 13:24:20 +00:00
* /
2014-06-26 04:29:38 +00:00
2015-04-22 05:20:55 +00:00
var $item = $ ( event . relatedTarget ) ,
2015-04-22 03:51:39 +00:00
$form = $item . closest ( '[data-template-type]' ) ,
data = {
type : $form . data ( 'template-type' ) ,
theme : $item . data ( 'item-theme' ) ,
path : $item . data ( 'item-path' )
} ,
tabId = data . type + '-' + data . theme + '-' + data . path
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( data . type == 'asset' && $item . data ( 'editable' ) === undefined )
return true
2015-01-13 06:23:13 +00:00
2015-04-22 03:51:39 +00:00
if ( $form . length == 0 )
return false
2015-01-08 06:21:52 +00:00
2014-06-26 06:09:25 +00:00
/ *
2015-04-22 03:51:39 +00:00
* Find if the tab is already opened
2014-06-26 06:09:25 +00:00
* /
2015-04-22 03:51:39 +00:00
if ( $ ( '#cms-master-tabs' ) . data ( 'oc.tab' ) . goTo ( tabId ) )
return false
2014-06-26 06:09:25 +00:00
2015-04-22 03:51:39 +00:00
/ *
* Open a new tab
* /
$ . oc . stripeLoadIndicator . show ( )
2015-04-22 05:20:55 +00:00
2015-04-22 03:51:39 +00:00
$form . request ( 'onOpenTemplate' , {
2015-04-22 05:20:55 +00:00
data : data
} ) . done ( function ( data ) {
$ . oc . stripeLoadIndicator . hide ( )
$ ( '#cms-master-tabs' ) . ocTab ( 'addTab' , data . tabTitle , data . tab , tabId , $form . data ( 'type-icon' ) )
} ) . always ( function ( ) {
$ . oc . stripeLoadIndicator . hide ( )
} ) . fail ( function ( jqXHR , textStatus , errorThrown ) {
alert ( jqXHR . responseText . length ? jqXHR . responseText : jqXHR . statusText )
$ . oc . stripeLoadIndicator . hide ( )
2014-06-26 06:09:25 +00:00
} )
2015-04-22 03:51:39 +00:00
return false
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . ajaxInvalidField = function ( ev , element , name , messages , isFirst ) {
2015-04-22 03:51:39 +00:00
/ *
* Detect invalid fields , uncollapse the panel
* /
2015-04-22 05:20:55 +00:00
if ( ! isFirst )
return
2015-04-22 03:51:39 +00:00
2015-04-22 05:20:55 +00:00
ev . preventDefault ( )
2015-04-22 03:51:39 +00:00
2015-06-27 04:53:17 +00:00
var $el = $ ( element ) ,
$panel = $el . closest ( '.form-tabless-fields.collapsed' ) ,
2015-07-10 22:43:43 +00:00
$primaryPanel = $el . closest ( '.control-tabs.primary-tabs.collapsed' )
2015-04-22 03:51:39 +00:00
if ( $panel . length > 0 )
$panel . removeClass ( 'collapsed' )
if ( $primaryPanel . length > 0 ) {
$primaryPanel . removeClass ( 'collapsed' )
var pane = $primaryPanel . closest ( '.tab-pane' ) ,
2015-07-10 22:43:43 +00:00
$secondaryPanel = $ ( '.control-tabs.secondary-tabs' , pane )
2015-04-22 03:51:39 +00:00
$secondaryPanel . removeClass ( 'primary-collapsed' )
}
2015-06-27 04:53:17 +00:00
$el . focus ( )
2015-04-22 03:51:39 +00:00
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onTabClosed = function ( ev ) {
2015-04-22 03:51:39 +00:00
this . updateModifiedCounter ( )
if ( $ ( '> div.tab-content > div.tab-pane' , '#cms-master-tabs' ) . length == 0 )
this . setPageTitle ( '' )
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onBeforeTabClose = function ( ev ) {
2015-04-22 03:51:39 +00:00
if ( $ . fn . table !== undefined )
2015-04-22 05:20:55 +00:00
$ ( '[data-control=table]' , ev . relatedTarget ) . table ( 'dispose' )
2015-04-23 04:33:07 +00:00
2015-04-26 05:48:49 +00:00
$ . oc . foundation . controlUtils . disposeControls ( ev . relatedTarget . get ( 0 ) )
2015-04-22 03:51:39 +00:00
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onBeforeRequest = function ( ev ) {
var $form = $ ( ev . target )
2015-04-22 03:51:39 +00:00
if ( $ ( '.components .layout-cell.error-component' , $form ) . length > 0 ) {
if ( ! confirm ( 'The form contains unknown components. Their properties will be lost on save. Do you want to save the form?' ) )
2015-04-22 05:20:55 +00:00
ev . preventDefault ( )
2015-04-22 03:51:39 +00:00
}
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onTabShown = function ( ev ) {
2014-05-14 13:24:20 +00:00
/ *
* Listen for the tabs "shown" event to track the current template in the list
* /
2015-04-22 05:20:55 +00:00
var $target = $ ( ev . target )
2014-06-26 04:29:38 +00:00
2015-04-22 05:20:55 +00:00
if ( $target . closest ( '[data-control=tab]' ) . attr ( 'id' ) != 'cms-master-tabs' )
return
2014-06-26 04:29:38 +00:00
2015-04-22 05:20:55 +00:00
var dataId = $target . closest ( 'li' ) . attr ( 'data-tab-id' ) ,
title = $target . attr ( 'title' ) ,
$sidePanel = $ ( '#cms-side-panel' )
2015-04-22 03:51:39 +00:00
if ( title )
this . setPageTitle ( title )
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
$sidePanel . find ( '[data-control=filelist]' ) . fileList ( 'markActive' , dataId )
$sidePanel . find ( 'form' ) . trigger ( 'oc.list.setActiveItem' , [ dataId ] )
2015-04-22 03:51:39 +00:00
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onInitTab = function ( ev , data ) {
2014-05-14 13:24:20 +00:00
/ *
* Listen for the tabs "initTab" event to inject extra controls to the tab
* /
2015-04-22 05:20:55 +00:00
if ( $ ( ev . target ) . attr ( 'id' ) != 'cms-master-tabs' )
2015-04-22 03:51:39 +00:00
return
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
var $collapseIcon = $ ( '<a href="javascript:;" class="tab-collapse-icon tabless"><i class="icon-chevron-up"></i></a>' ) ,
$panel = $ ( '.form-tabless-fields' , data . pane )
2015-04-22 03:51:39 +00:00
$panel . append ( $collapseIcon ) ;
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$collapseIcon . click ( function ( ) {
$panel . toggleClass ( 'collapsed' )
if ( typeof ( localStorage ) !== 'undefined' )
localStorage . ocCmsTablessCollapsed = $panel . hasClass ( 'collapsed' ) ? 1 : 0
window . setTimeout ( function ( ) {
$ ( window ) . trigger ( 'oc.updateUi' )
} , 500 )
return false
} )
2015-04-22 05:20:55 +00:00
var $primaryCollapseIcon = $ ( '<a href="javascript:;" class="tab-collapse-icon primary"><i class="icon-chevron-down"></i></a>' ) ,
2015-07-10 22:43:43 +00:00
$primaryPanel = $ ( '.control-tabs.primary-tabs' , data . pane ) ,
$secondaryPanel = $ ( '.control-tabs.secondary-tabs' , data . pane ) ,
2015-04-22 05:20:55 +00:00
$primaryTabContainer = $ ( '.nav-tabs' , $primaryPanel )
2015-04-22 03:51:39 +00:00
$primaryTabContainer . addClass ( 'master-area' )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( $primaryPanel . length > 0 ) {
$secondaryPanel . append ( $primaryCollapseIcon ) ;
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$primaryCollapseIcon . click ( function ( ) {
$primaryPanel . toggleClass ( 'collapsed' )
$secondaryPanel . toggleClass ( 'primary-collapsed' )
$ ( window ) . trigger ( 'oc.updateUi' )
if ( typeof ( localStorage ) !== 'undefined' )
localStorage . ocCmsPrimaryCollapsed = $primaryPanel . hasClass ( 'collapsed' ) ? 1 : 0
2014-05-14 13:24:20 +00:00
return false
} )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( typeof ( localStorage ) !== 'undefined' ) {
if ( ! $ ( 'a' , data . tab ) . hasClass ( 'new-template' ) && localStorage . ocCmsTablessCollapsed == 1 )
$panel . addClass ( 'collapsed' )
2014-08-05 06:52:45 +00:00
2015-04-22 03:51:39 +00:00
if ( localStorage . ocCmsPrimaryCollapsed == 1 ) {
$primaryPanel . addClass ( 'collapsed' )
$secondaryPanel . addClass ( 'primary-collapsed' )
}
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
var $componentListFormGroup = $ ( '.control-componentlist' , data . pane ) . closest ( '.form-group' )
if ( $primaryPanel . length > 0 )
$primaryPanel . before ( $componentListFormGroup )
else
$secondaryPanel . parent ( ) . before ( $componentListFormGroup )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$componentListFormGroup . removeClass ( )
$componentListFormGroup . addClass ( 'layout-row min-size' )
this . updateComponentListClass ( data . pane )
this . updateFormEditorMode ( data . pane , true )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
var $form = $ ( 'form' , data . pane ) ,
self = this
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$form . on ( 'changed.oc.changeMonitor' , function ( ) {
$panel . trigger ( 'modified.oc.tab' )
self . updateModifiedCounter ( )
} )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$form . on ( 'unchanged.oc.changeMonitor' , function ( ) {
$panel . trigger ( 'unmodified.oc.tab' )
self . updateModifiedCounter ( )
} )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
this . addTokenExpanderToEditor ( data . pane , $form )
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onAfterAllTabsClosed = function ( ev ) {
var $sidePanel = $ ( '#cms-side-panel' )
$sidePanel . find ( '[data-control=filelist]' ) . fileList ( 'markActive' , null )
$sidePanel . find ( 'form' ) . trigger ( 'oc.list.setActiveItem' , [ null ] )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onAjaxUpdate = function ( ev ) {
var dataId = $ ( '#cms-master-tabs .nav-tabs li.active' ) . attr ( 'data-tab-id' ) ,
$sidePanel = $ ( '#cms-side-panel' )
$sidePanel . find ( '[data-control=filelist]' ) . fileList ( 'markActive' , dataId )
$sidePanel . find ( 'form' ) . trigger ( 'oc.list.setActiveItem' , [ dataId ] )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onAjaxSuccess = function ( ev , context , data ) {
var element = ev . target
2015-04-22 04:30:02 +00:00
2015-04-22 03:51:39 +00:00
if ( data . templatePath !== undefined ) {
2015-04-22 04:30:02 +00:00
$ ( 'input[name=templatePath]' , element ) . val ( data . templatePath )
$ ( 'input[name=templateMtime]' , element ) . val ( data . templateMtime )
$ ( '[data-control=delete-button]' , element ) . removeClass ( 'hide' )
$ ( '[data-control=preview-button]' , element ) . removeClass ( 'hide' )
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
if ( data . pageUrl !== undefined )
2015-04-22 04:30:02 +00:00
$ ( '[data-control=preview-button]' , element ) . attr ( 'href' , data . pageUrl )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( data . tabTitle !== undefined ) {
2015-04-22 04:30:02 +00:00
$ ( '#cms-master-tabs' ) . ocTab ( 'updateTitle' , $ ( element ) . closest ( '.tab-pane' ) , data . tabTitle )
2015-04-22 03:51:39 +00:00
this . setPageTitle ( data . tabTitle )
}
2014-05-14 13:24:20 +00:00
2015-04-22 04:30:02 +00:00
var tabId = $ ( 'input[name=templateType]' , element ) . val ( ) + '-'
+ $ ( 'input[name=theme]' , element ) . val ( ) + '-'
+ $ ( 'input[name=templatePath]' , element ) . val ( ) ;
2014-05-14 13:24:20 +00:00
2015-04-22 04:30:02 +00:00
$ ( '#cms-master-tabs' ) . ocTab ( 'updateIdentifier' , $ ( element ) . closest ( '.tab-pane' ) , tabId )
2014-05-14 13:24:20 +00:00
2015-04-22 04:30:02 +00:00
var templateType = $ ( 'input[name=templateType]' , element ) . val ( )
2015-04-22 03:51:39 +00:00
if ( templateType . length > 0 ) {
$ . oc . cmsPage . updateTemplateList ( templateType )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( templateType == 'layout' )
2015-04-22 04:30:02 +00:00
this . updateLayouts ( element )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
this . updateFormEditorMode ( $ ( element ) . closest ( '.tab-pane' ) , false )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( context . handler == 'onSave' && ( ! data [ 'X_OCTOBER_ERROR_FIELDS' ] && ! data [ 'X_OCTOBER_ERROR_MESSAGE' ] ) ) {
2015-04-22 04:30:02 +00:00
$ ( element ) . trigger ( 'unchange.oc.changeMonitor' )
2015-04-22 03:51:39 +00:00
}
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onAjaxError = function ( ev , context , data , jqXHR ) {
2015-04-22 03:51:39 +00:00
if ( context . handler == 'onSave' ) {
if ( jqXHR . responseText == 'mtime-mismatch' ) {
2015-04-22 05:20:55 +00:00
ev . preventDefault ( )
this . handleMtimeMismatch ( ev . target )
2014-05-14 13:24:20 +00:00
}
2015-04-22 03:51:39 +00:00
}
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onCreateTemplateClick = function ( ev ) {
var $form = $ ( ev . target ) . closest ( '[data-template-type]' ) ,
2015-04-22 03:51:39 +00:00
type = $form . data ( 'template-type' ) ,
tabId = type + Math . random ( ) ,
self = this
$ . oc . stripeLoadIndicator . show ( )
2015-04-22 05:20:55 +00:00
2015-04-22 03:51:39 +00:00
$form . request ( 'onCreateTemplate' , {
2015-04-22 05:20:55 +00:00
data : { type : type }
} ) . done ( function ( data ) {
$ ( '#cms-master-tabs' ) . ocTab ( 'addTab' , data . tabTitle , data . tab , tabId , $form . data ( 'type-icon' ) + ' new-template' )
$ ( '#layout-side-panel' ) . trigger ( 'close.oc.sidePanel' )
self . setPageTitle ( data . tabTitle )
} ) . always ( function ( ) {
$ . oc . stripeLoadIndicator . hide ( )
} )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onDeleteTemplateClick = function ( ev ) {
var $el = $ ( ev . currentTarget ) ,
2015-04-22 03:51:39 +00:00
$form = $el . closest ( 'form' ) ,
2015-04-22 05:20:55 +00:00
templateType = $form . data ( 'template-type' ) ,
self = this
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( ! confirm ( $el . data ( 'confirmation' ) ) )
return
2015-04-22 05:20:55 +00:00
$ . oc . stripeLoadIndicator . show ( )
2015-04-22 03:51:39 +00:00
$form . request ( 'onDeleteTemplates' , {
2015-04-22 05:20:55 +00:00
data : { type : templateType }
} ) . done ( function ( data ) {
var tabs = $ ( '#cms-master-tabs' ) . data ( 'oc.tab' ) ;
$ . each ( data . deleted , function ( index , path ) {
var
tabId = templateType + '-' + data . theme + '-' + path ,
tab = tabs . findByIdentifier ( tabId )
$ ( '#cms-master-tabs' ) . ocTab ( 'closeTab' , tab , true )
} )
if ( data . error !== undefined && $ . type ( data . error ) === 'string' && data . error . length )
$ . oc . flashMsg ( { text : data . error , 'class' : 'error' } )
} ) . always ( function ( ) {
self . updateTemplateList ( templateType )
$ . oc . stripeLoadIndicator . hide ( )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . onInspectorShowing = function ( ev , data ) {
$ ( ev . currentTarget ) . closest ( '[data-control="toolbar"]' ) . data ( 'oc.dragScroll' ) . goToElement ( ev . currentTarget , data . callback )
ev . stopPropagation ( )
}
2015-04-22 04:30:02 +00:00
CmsPage . prototype . onInspectorHidden = function ( ev ) {
var element = ev . target ,
values = $ . parseJSON ( $ ( '[data-inspector-values]' , element ) . val ( ) )
2015-04-22 03:51:39 +00:00
2015-04-22 04:30:02 +00:00
$ ( '[name="component_aliases[]"]' , element ) . val ( values [ 'oc.alias' ] )
$ ( 'span.alias' , element ) . text ( values [ 'oc.alias' ] )
2015-04-22 03:51:39 +00:00
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onInspectorHiding = function ( ev , values ) {
var element = ev . target ,
2015-04-22 04:30:02 +00:00
values = $ . parseJSON ( $ ( '[data-inspector-values]' , element ) . val ( ) ) ,
2015-04-22 03:51:39 +00:00
alias = values [ 'oc.alias' ] ,
$componentList = $ ( '#cms-master-tabs > div.tab-content > .tab-pane.active .control-componentlist .layout' ) ,
2015-04-22 05:20:55 +00:00
$cell = $ ( ev . target ) . parent ( )
2015-04-22 03:51:39 +00:00
$ ( 'div.layout-cell' , $componentList ) . each ( function ( ) {
if ( $cell . get ( 0 ) == this )
return true
2015-04-22 05:20:55 +00:00
var $input = $ ( 'input[name="component_aliases[]"]' , this )
2015-04-22 03:51:39 +00:00
if ( $input . val ( ) == alias ) {
2015-04-22 05:20:55 +00:00
ev . preventDefault ( )
2015-04-22 03:51:39 +00:00
alert ( 'The component alias "' + alias + '" is already used.' )
return false
}
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
}
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onComponentRemove = function ( ev ) {
var element = ev . currentTarget
2015-04-22 04:30:02 +00:00
$ ( element ) . trigger ( 'change' )
var pane = $ ( element ) . closest ( '.tab-pane' ) ,
component = $ ( element ) . closest ( 'div.layout-cell' )
2014-05-14 13:24:20 +00:00
/ *
2015-04-22 03:51:39 +00:00
* Remove any { % component % } tags in the editor for this component
2014-05-14 13:24:20 +00:00
* /
2015-04-22 03:51:39 +00:00
var editor = $ ( '[data-control=codeeditor]' , pane )
if ( editor . length ) {
var alias = $ ( 'input[name="component_aliases[]"]' , component ) . val ( ) ,
codeEditor = editor . codeEditor ( 'getEditorObject' )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
codeEditor . replace ( '' , {
needle : "{% component '" + alias + "' %}"
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
component . remove ( )
$ ( window ) . trigger ( 'oc.updateUi' )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
this . updateComponentListClass ( pane )
return false
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
CmsPage . prototype . onComponentClick = function ( ev ) {
2014-05-14 13:24:20 +00:00
/ *
2015-04-22 03:51:39 +00:00
* Determine if a page or layout is open in the master tabs
2014-05-14 13:24:20 +00:00
* /
2015-04-22 03:51:39 +00:00
var $componentList = $ ( '#cms-master-tabs > div.tab-content > .tab-pane.active .control-componentlist .layout' )
if ( $componentList . length == 0 ) {
alert ( 'Components can be added only to pages, partials and layouts.' )
return ;
}
2014-05-14 13:24:20 +00:00
2015-04-22 05:20:55 +00:00
var $component = $ ( ev . currentTarget ) . clone ( ) ,
2015-04-22 03:51:39 +00:00
$iconInput = $component . find ( '[data-component-icon]' ) ,
$componentContainer = $ ( '.layout-relative' , $component ) ,
$configInput = $component . find ( '[data-inspector-config]' ) ,
$aliasInput = $component . find ( '[data-component-default-alias]' ) ,
$valuesInput = $component . find ( '[data-inspector-values]' ) ,
$nameInput = $component . find ( '[data-component-name]' ) ,
$classInput = $component . find ( '[data-inspector-class]' ) ,
alias = $aliasInput . val ( ) ,
originalAlias = alias ,
counter = 2 ,
existingAliases = [ ]
$ ( 'div.layout-cell input[name="component_aliases[]"]' , $componentList ) . each ( function ( ) {
existingAliases . push ( $ ( this ) . val ( ) )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
while ( $ . inArray ( alias , existingAliases ) !== - 1 ) {
alias = originalAlias + counter
counter ++
2014-05-14 13:24:20 +00:00
}
2015-04-22 03:51:39 +00:00
// Set the last alias used so dragComponents can use it
2015-04-22 05:20:55 +00:00
$ ( 'input[name="component_aliases[]"]' , $ ( ev . currentTarget ) ) . val ( alias )
2015-04-22 03:51:39 +00:00
$component . attr ( 'data-component-attached' , true )
$componentContainer . addClass ( $iconInput . val ( ) )
$iconInput . remove ( )
2015-04-22 05:20:55 +00:00
$componentContainer . attr ( {
'data-inspectable' : '' ,
'data-inspector-title' : $component . find ( 'span.name' ) . text ( ) ,
'data-inspector-description' : $component . find ( 'span.description' ) . text ( ) ,
'data-inspector-config' : $configInput . val ( ) ,
'data-inspector-class' : $classInput . val ( )
} )
2015-04-22 03:51:39 +00:00
$configInput . remove ( )
$ ( 'input[name="component_names[]"]' , $component ) . val ( $nameInput . val ( ) )
$nameInput . remove ( )
$ ( 'input[name="component_aliases[]"]' , $component ) . val ( alias )
$component . find ( 'span.alias' ) . text ( alias )
$valuesInput . val ( $valuesInput . val ( ) . replace ( '--alias--' , alias ) )
$aliasInput . remove ( )
$component . addClass ( 'adding' )
$componentList . append ( $component )
$componentList . closest ( '[data-control="toolbar"]' ) . data ( 'oc.dragScroll' ) . goToElement ( $component )
$component . removeClass ( 'adding' )
$component . trigger ( 'change' )
this . updateComponentListClass ( $component . closest ( '.tab-pane' ) )
$ ( window ) . trigger ( 'oc.updateUi' )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
// INTERNAL METHODS
// ============================
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . updateComponentListClass = function ( pane ) {
var $componentList = $ ( '.control-componentlist' , pane ) ,
2015-07-10 22:43:43 +00:00
$primaryPanel = $ ( '.control-tabs.primary-tabs' , pane ) ,
2015-04-22 03:51:39 +00:00
$primaryTabContainer = $ ( '.nav-tabs' , $primaryPanel ) ,
hasComponents = $ ( '.layout' , $componentList ) . children ( ':not(.hidden)' ) . length > 0
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$primaryTabContainer . toggleClass ( 'component-area' , hasComponents )
$componentList . toggleClass ( 'has-components' , hasComponents )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . updateFormEditorMode = function ( pane , initialization ) {
var $contentTypeElement = $ ( '[data-toolbar-type]' , pane )
if ( $contentTypeElement . length == 0 )
return
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( $contentTypeElement . data ( 'toolbar-type' ) != 'content' )
return
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
var fileName = $ ( 'input[name=fileName]' , pane ) . val ( ) ,
parts = fileName . split ( '.' ) ,
extension = 'txt' ,
mode = 'plain_text' ,
modes = $ . oc . codeEditorExtensionModes ,
editor = $ ( '[data-control=codeeditor]' , pane )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( parts . length >= 2 )
extension = parts . pop ( ) . toLowerCase ( )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
if ( modes [ extension ] !== undefined )
mode = modes [ extension ] ;
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
var setEditorMode = function ( ) {
window . setTimeout ( function ( ) {
editor . data ( 'oc.codeEditor' ) . editor . getSession ( ) . setMode ( { path : 'ace/mode/' + mode } )
} , 200 )
2014-05-14 13:24:20 +00:00
}
2015-04-22 03:51:39 +00:00
if ( initialization )
editor . on ( 'oc.codeEditorReady' , setEditorMode )
else
setEditorMode ( )
}
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . updateModifiedCounter = function ( ) {
var counters = {
2015-07-10 22:43:43 +00:00
page : { menu : 'pages' , count : 0 } ,
partial : { menu : 'partials' , count : 0 } ,
layout : { menu : 'layouts' , count : 0 } ,
content : { menu : 'content' , count : 0 } ,
asset : { menu : 'assets' , count : 0 }
2015-04-22 03:51:39 +00:00
}
2014-09-09 21:25:11 +00:00
2015-04-22 03:51:39 +00:00
$ ( '> div.tab-content > div.tab-pane[data-modified]' , '#cms-master-tabs' ) . each ( function ( ) {
var inputType = $ ( '> form > input[name=templateType]' , this ) . val ( )
counters [ inputType ] . count ++
} )
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
$ . each ( counters , function ( type , data ) {
$ . oc . sideNav . setCounter ( 'cms/' + data . menu , data . count ) ;
} )
}
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . addTokenExpanderToEditor = function ( pane , $form ) {
var group = $ ( '[data-field-name=markup]' , pane ) ,
editor = $ ( '[data-control=codeeditor]' , group ) ,
canExpand = false ,
self = this
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
if ( ! editor . length || editor . data ( 'oc.tokenexpander' ) )
return
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
var toolbar = editor . codeEditor ( 'getToolbar' )
2014-08-30 06:21:16 +00:00
2015-04-22 03:51:39 +00:00
editor . tokenExpander ( )
2014-08-30 06:05:19 +00:00
2015-04-22 03:51:39 +00:00
var breakButton = $ ( '<li />' ) . prop ( { 'class' : 'tokenexpander-button' } ) . append (
$ ( '<a />' ) . prop ( { 'href' : 'javascript:; ' } ) . append (
$ ( '<i />' ) . prop ( { 'class' : 'icon-code-fork' } )
)
)
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
breakButton . hide ( ) . on ( 'click' , function ( ) {
self . handleExpandToken ( editor , $form )
return false
} )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$ ( 'ul:first' , toolbar ) . prepend ( breakButton )
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
editor
. on ( 'show.oc.tokenexpander' , function ( ) {
canExpand = true
breakButton . show ( )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
. on ( 'hide.oc.tokenexpander' , function ( ) {
canExpand = false
breakButton . hide ( )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 05:20:55 +00:00
. on ( 'dblclick' , function ( ev ) {
if ( ( ev . metaKey || ev . ctrlKey ) && canExpand ) {
2015-04-22 03:51:39 +00:00
self . handleExpandToken ( editor , $form )
2014-05-14 13:24:20 +00:00
}
} )
2015-04-22 03:51:39 +00:00
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . handleExpandToken = function ( editor , $form ) {
editor . tokenExpander ( 'expandToken' , function ( token , value ) {
return $form . request ( 'onExpandMarkupToken' , {
data : { tokenType : token , tokenName : value }
} )
} )
}
2014-06-26 04:29:38 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . handleMtimeMismatch = function ( form ) {
var $form = $ ( form )
$form . popup ( { handler : 'onOpenConcurrencyResolveForm' } )
2014-05-24 06:48:36 +00:00
2015-04-22 03:51:39 +00:00
var popup = $form . data ( 'oc.popup' ) ,
self = this
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
$ ( popup . $content ) . on ( 'click' , 'button[data-action=reload]' , function ( ) {
popup . hide ( )
self . reloadForm ( form )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
$ ( popup . $content ) . on ( 'click' , 'button[data-action=save]' , function ( ) {
popup . hide ( )
$ ( 'input[name=templateForceSave]' , $form ) . val ( 1 )
$ ( 'a[data-request=onSave]' , $form ) . trigger ( 'click' )
$ ( 'input[name=templateForceSave]' , $form ) . val ( 0 )
} )
}
CmsPage . prototype . reloadForm = function ( form ) {
var
$form = $ ( form ) ,
data = {
type : $ ( '[name=templateType]' , $form ) . val ( ) ,
theme : $ ( '[name=theme]' , $form ) . val ( ) ,
path : $ ( '[name=templatePath]' , $form ) . val ( ) ,
} ,
tabId = data . type + '-' + data . theme + '-' + data . path ,
tabs = $ ( '#cms-master-tabs' ) . data ( 'oc.tab' ) ,
tab = tabs . findByIdentifier ( tabId ) ,
self = this
2014-05-14 13:24:20 +00:00
/ *
2015-04-22 03:51:39 +00:00
* Update tab
2014-05-14 13:24:20 +00:00
* /
2015-04-22 03:51:39 +00:00
$ . oc . stripeLoadIndicator . show ( )
2015-04-22 05:20:55 +00:00
2015-04-22 03:51:39 +00:00
$form . request ( 'onOpenTemplate' , {
2015-04-22 05:20:55 +00:00
data : data
} ) . done ( function ( data ) {
$ ( '#cms-master-tabs' ) . ocTab ( 'updateTab' , tab , data . tabTitle , data . tab )
$ ( '#cms-master-tabs' ) . ocTab ( 'unmodifyTab' , tab )
self . updateModifiedCounter ( )
} ) . always ( function ( ) {
$ . oc . stripeLoadIndicator . hide ( )
} ) . fail ( function ( jqXHR , textStatus , errorThrown ) {
alert ( jqXHR . responseText . length ? jqXHR . responseText : jqXHR . statusText )
2014-05-14 13:24:20 +00:00
} )
2015-04-22 03:51:39 +00:00
}
CmsPage . prototype . setPageTitle = function ( title ) {
if ( title . length )
$ . oc . layout . setPageTitle ( title + ' | ' )
else
$ . oc . layout . setPageTitle ( title )
}
2014-05-14 13:24:20 +00:00
2015-04-22 03:51:39 +00:00
CmsPage . prototype . updateLayouts = function ( form ) {
2014-05-14 13:24:20 +00:00
$ ( form ) . request ( 'onGetTemplateList' , {
success : function ( data ) {
$ ( '#cms-master-tabs > .tab-content select[name="settings[layout]"]' ) . each ( function ( ) {
var
$select = $ ( this ) ,
value = $select . val ( )
$select . find ( 'option' ) . remove ( )
$ . each ( data . layouts , function ( layoutFile , layoutName ) {
$select . append ( $ ( '<option>' ) . attr ( 'value' , layoutFile ) . text ( layoutName ) )
} )
$select . trigger ( 'pause.oc.changeMonitor' )
$select . val ( value )
$select . trigger ( 'change' )
$select . trigger ( 'resume.oc.changeMonitor' )
} )
}
} )
}
2015-04-22 03:51:39 +00:00
$ . oc . cmsPage = new CmsPage ( ) ;
2014-05-14 13:24:20 +00:00
} ( window . jQuery ) ;