Index: branches/5.2.x/core/admin_templates/js/template_manager.js =================================================================== diff -u -N -r14244 -r14856 --- branches/5.2.x/core/admin_templates/js/template_manager.js (.../template_manager.js) (revision 14244) +++ branches/5.2.x/core/admin_templates/js/template_manager.js (.../template_manager.js) (revision 14856) @@ -1,13 +1,18 @@ -function TemplateManager ($edit_url, $browse_url, $save_layout_url, $edting_mode) { - this._editUrl = $edit_url; - this.browseUrl = $browse_url; - this._saveLayoutUrl = $save_layout_url; - this.editingMode = $edting_mode; // from {1 - browse, 2 - content, 3 - design} +function TemplateManager ( $settings ) { + this.pageId = 0; + this.editUrl = ''; + this.browseUrl = ''; + this.saveLayoutUrl = ''; + this.editingMode = 0; // from {1 - browse, 2 - content, 3 - design} + this.pageInfo = {editors: [], revisions: {}}; // information about page in "Content Mode" + this._blocks = {}; this._blockOrder = Array (); this.inDrag = false; // don't process mouse over/out events while in drag mode + $.extend(this, $settings); + var $template_manager = this; $(document).ready( @@ -51,6 +56,20 @@ // make all spans with phrases clickable $template_manager.setupEditTranslationButtons(document); + + // hide "Revision History" div on every body click (bubbled), but not a "toolbar button", that opens it + $('body').click( + function ($e) { + var $target = $($e.target), + $id = $target.attr('id'); + + if ( $id && ($id == 'tool_history' || $id == 'div_history') ) { + return ; + } + + $('#cms-revision-dropdown:visible').hide(); + } + ); } if ($template_manager.editingMode == 3) { @@ -96,10 +115,196 @@ $(this).css('opacity', 0.5); } ); + + // related to content revision control toolbar + $('#cms-toggle-revision-toolbar').click( + function ($e) { + var $me = $(this); + + if ( $me.hasClass('opened') ) { + var $height = $('#cms-revision-toolbar').height(); + + $('#cms-revision-toolbar-layer').animate({top: (-1) * $height}, 'fast'); + $('#cms-editing-notice, #cms-revision-dropdown').hide(); + setCookie('toolbar_hidden', 1); + } + else { + $('#cms-revision-toolbar-layer').animate({top: 0}, 'fast'); + setCookie('toolbar_hidden', 0); + } + + $me.toggleClass('opened'); + + return false; + } + ); + + $('#cms-close-toolbar').click( + function () { + var $height = $('#cms-revision-toolbar').height(); + + $('#cms-toggle-revision-toolbar').removeClass('opened'); + $('#cms-revision-toolbar-layer').css('top', (-1) * $height); + + $('#cms-editing-notice, #cms-revision-dropdown').hide(); + setCookie('toolbar_hidden', 1); + + return false; + } + ); + + $('#cms-close-editing-notice').click( + function () { + $('#cms-editing-notice').hide(); + + return false; + } + ); + + $('.toolbar-button', '#cms-revision-toolbar').click( + function ($e) { + var $button_name = $(this).attr('id').replace(/^(tool|div)_/, ''); + + $template_manager.revisionToolbarClick($button_name); + } + ); + + setInterval( + function () { + $.getJSON( + $('#kf_revisions_' + $template_manager.pageId).attr('action') + '&events[page-revision]=OnGetInfo', + function ($data) { + $template_manager.pageInfo = $data; + $template_manager.processPageInfo(); + } + ); + }, 20 * 1000 // 20 seconds + ); + + if ( !$.isEmptyObject($template_manager.pageInfo) ) { + $template_manager.processPageInfo(); + } } ); } +TemplateManager.prototype.processPageInfo = function () { + var $class_mapping = { + 1: 'cms-revision-published', + 2: 'cms-revision-pending', + 0: 'cms-revision-declined' + }; + + var $title = $('.revision-title', '#cms-current-revision-info'); + + $title.html( this.pageInfo.current_revision.title ); + $('.draft-saved', '#cms-current-revision-info').html( this.pageInfo.current_revision.saved ); + + for (var $status in $class_mapping) { + $title.toggleClass( $class_mapping[$status], $status === this.pageInfo.current_revision.status ); + } + + if ( $('#cms-toggle-revision-toolbar').hasClass('opened') ) { + var $notice = $('#cms-editing-notice'); + + if ( this.pageInfo.editors.length ) { + if ( $('span:first', $notice).attr('prev_editors') != this.pageInfo.editors.join(',') ) { + // show notice, only when editors change occurs + $('span:first', $notice).html(this.pageInfo.editors_warning).attr('prev_editors', this.pageInfo.editors.join(',')); + + if ( $notice.is(':hidden') ) { + $notice.fadeIn(); + } + } + } + else if ( $notice.is(':visible') ) { + $notice.fadeOut(); + } + } + + var $revision_container = $('.top', '#cms-revision-dropdown'), + $revision_mask = '
\ + {TITLE} ({STATUS_LABEL})\ +
{DATETIME}
\ +
{AUTHOR}
\ +
\ +
'; + + $revision_container.empty(); + + if ( $.isArray(this.pageInfo.revisions) ) { + // no revisions yet + } + else { + for (var $revision in this.pageInfo.revisions) { + var $html = $revision_mask, + $revision_info = this.pageInfo.revisions[$revision]; + + for (var $field in $revision_info) { + $html = $html.replace( new RegExp('{' + $field.toUpperCase() + '}', 'g'), $revision_info[$field] ); + } + + $html = $html.replace(/{CLASS}/g, $class_mapping[$revision_info.status] ); + + if ( $revision_info['draft'] ) { + $html = $html.replace(/{LINK}/g, this.browseUrl.replace('#EDITING_MODE#', 2) ); + } + else { + $html = $html.replace(/{LINK}/g, this.browseUrl.replace('#EDITING_MODE#', 2) + '&revision=' + $revision.substr(1) ); + } + + $revision_container.append($html); + } + + $('.item', '#cms-revision-dropdown .top').each( + function () { + var $row = $(this); + + $('a:first', $row).click( + function ($e) { + $e.stopPropagation(); + } + ); + + $row.click( + function ($e) { + window.location.href = $('a:first', this).attr('href'); + } + ); + } + ); + } +} + +TemplateManager.prototype.revisionToolbarClick = function ($button_name) { +// console.log('button ', $button_name, ' clicked'); + + var $button_event_map = { + 'select': 'OnSave', + 'delete': 'OnDiscard', + 'approve': 'OnPublish', + 'decline': 'OnDecline' + }; + + if ( $button_event_map[$button_name] !== undefined ) { + $form_name = 'kf_revisions_' + this.pageId; + submit_event('page-revision', $button_event_map[$button_name]); + + return ; + } + + switch ( $button_name ) { + case 'preview': + var $url = this.browseUrl.replace('#EDITING_MODE#', 0).replace(/&(admin|editing_mode)=[\d]/g, ''); + window.open( $url + '&preview=1' ); + break; + + case 'history': + $('#cms-revision-dropdown').toggle(); + break; + } +} + TemplateManager.prototype.setupEditTranslationButtons = function ($container) { $("span[name='cms-translate-phrase']", $container).each( function() { @@ -198,7 +403,7 @@ var $me = this; var $settings = { - url: this._saveLayoutUrl + '&' + $sort_order + '&width=200&height=70&modal=true', + url: this.saveLayoutUrl + '&' + $sort_order + '&width=200&height=70&modal=true', caption: 'Layout Saving Result', onDataReceived: function ($data) { var $message = ''; @@ -229,7 +434,7 @@ TemplateManager.prototype.onBtnClick = function ($e, $element) { var $id = $element.id.replace(/_btn$/, ''); var $block_info = this._blocks[$id]; - var $url = this._editUrl.replace('#BLOCK#', $block_info.block_name + ':' + $block_info.function_name).replace('#EVENT#', 'OnLoadBlock'); + var $url = this.editUrl.replace('#BLOCK#', $block_info.block_name + ':' + $block_info.function_name).replace('#EVENT#', 'OnLoadBlock'); direct_edit('theme-file', $url);