From 66f6ecc57ed6f33bcdad5fe89dde9895dd986e8c Mon Sep 17 00:00:00 2001 From: scott1702 Date: Tue, 26 Jan 2016 17:28:36 +1300 Subject: [PATCH] Implement RFC-7 JavaScript module loader in CMS --- .gitignore | 3 +- code/controllers/AssetAdmin.php | 2 +- code/controllers/CMSMain.php | 29 +- code/controllers/ContentController.php | 2 +- code/forms/SiteTreeURLSegmentField.php | 2 +- code/model/RedirectorPage.php | 2 +- gulpfile.js | 97 ++++ javascript/AssetAdmin.DragDrop.js | 99 ---- javascript/AssetAdmin.js | 141 ------ javascript/CMSMain.AddForm.js | 196 -------- javascript/CMSMain.EditForm.js | 469 ------------------- javascript/CMSMain.Tree.js | 176 -------- javascript/CMSMain.js | 111 ----- javascript/CMSPageHistoryController.js | 177 -------- javascript/RedirectorPage.js | 27 -- javascript/SilverStripeNavigator.js | 29 -- javascript/SiteTreeURLSegmentField.js | 138 ------ javascript/dist/AssetAdmin.js | 116 +++++ javascript/dist/CMSMain.AddForm.js | 177 ++++++++ javascript/dist/CMSMain.EditForm.js | 301 +++++++++++++ javascript/dist/CMSMain.Tree.js | 158 +++++++ javascript/dist/CMSMain.js | 94 ++++ javascript/dist/CMSPageHistoryController.js | 124 ++++++ javascript/dist/RedirectorPage.js | 49 ++ javascript/dist/SilverStripeNavigator.js | 47 ++ javascript/dist/SiteTreeURLSegmentField.js | 119 +++++ javascript/dist/bundle-lib.js | 1 + javascript/src/AssetAdmin.js | 142 ++++++ javascript/src/CMSMain.AddForm.js | 196 ++++++++ javascript/src/CMSMain.EditForm.js | 471 ++++++++++++++++++++ javascript/src/CMSMain.Tree.js | 175 ++++++++ javascript/src/CMSMain.js | 111 +++++ javascript/src/CMSPageHistoryController.js | 178 ++++++++ javascript/src/RedirectorPage.js | 27 ++ javascript/src/SilverStripeNavigator.js | 29 ++ javascript/src/SiteTreeURLSegmentField.js | 137 ++++++ javascript/src/bundles/lib.js | 8 + package.json | 47 ++ 38 files changed, 2823 insertions(+), 1584 deletions(-) create mode 100644 gulpfile.js delete mode 100644 javascript/AssetAdmin.DragDrop.js delete mode 100644 javascript/AssetAdmin.js delete mode 100644 javascript/CMSMain.AddForm.js delete mode 100644 javascript/CMSMain.EditForm.js delete mode 100644 javascript/CMSMain.Tree.js delete mode 100644 javascript/CMSMain.js delete mode 100644 javascript/CMSPageHistoryController.js delete mode 100644 javascript/RedirectorPage.js delete mode 100644 javascript/SilverStripeNavigator.js delete mode 100644 javascript/SiteTreeURLSegmentField.js create mode 100644 javascript/dist/AssetAdmin.js create mode 100644 javascript/dist/CMSMain.AddForm.js create mode 100644 javascript/dist/CMSMain.EditForm.js create mode 100644 javascript/dist/CMSMain.Tree.js create mode 100644 javascript/dist/CMSMain.js create mode 100644 javascript/dist/CMSPageHistoryController.js create mode 100644 javascript/dist/RedirectorPage.js create mode 100644 javascript/dist/SilverStripeNavigator.js create mode 100644 javascript/dist/SiteTreeURLSegmentField.js create mode 100644 javascript/dist/bundle-lib.js create mode 100644 javascript/src/AssetAdmin.js create mode 100644 javascript/src/CMSMain.AddForm.js create mode 100644 javascript/src/CMSMain.EditForm.js create mode 100644 javascript/src/CMSMain.Tree.js create mode 100644 javascript/src/CMSMain.js create mode 100644 javascript/src/CMSPageHistoryController.js create mode 100644 javascript/src/RedirectorPage.js create mode 100644 javascript/src/SilverStripeNavigator.js create mode 100644 javascript/src/SiteTreeURLSegmentField.js create mode 100644 javascript/src/bundles/lib.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 5cd3d290..8a9c5dfa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .sass-cache -.DS_Store \ No newline at end of file +.DS_Store +node_modules \ No newline at end of file diff --git a/code/controllers/AssetAdmin.php b/code/controllers/AssetAdmin.php index 8f74fedd..b627c05c 100644 --- a/code/controllers/AssetAdmin.php +++ b/code/controllers/AssetAdmin.php @@ -64,7 +64,7 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{ parent::init(); - Requirements::javascript(CMS_DIR . "/javascript/AssetAdmin.js"); + Requirements::javascript(CMS_DIR . "/javascript/dist/AssetAdmin.js"); Requirements::add_i18n_javascript(CMS_DIR . '/javascript/lang', false, true); Requirements::css(CMS_DIR . "/css/screen.css"); CMSBatchActionHandler::register('delete', 'AssetAdmin_DeleteBatchAction', 'Folder'); diff --git a/code/controllers/CMSMain.php b/code/controllers/CMSMain.php index ba1efdc2..2ac56a7f 100644 --- a/code/controllers/CMSMain.php +++ b/code/controllers/CMSMain.php @@ -78,22 +78,19 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr Requirements::css(CMS_DIR . '/css/screen.css'); Requirements::customCSS($this->generatePageIconsCss()); - - Requirements::combine_files( - 'cmsmain.js', - array_merge( - array( - CMS_DIR . '/javascript/CMSMain.js', - CMS_DIR . '/javascript/CMSMain.EditForm.js', - CMS_DIR . '/javascript/CMSMain.AddForm.js', - CMS_DIR . '/javascript/CMSPageHistoryController.js', - CMS_DIR . '/javascript/CMSMain.Tree.js', - CMS_DIR . '/javascript/SilverStripeNavigator.js', - CMS_DIR . '/javascript/SiteTreeURLSegmentField.js' - ), - Requirements::add_i18n_javascript(CMS_DIR . '/javascript/lang', true, true) - ) - ); + Requirements::add_i18n_javascript(CMS_DIR . '/javascript/lang', true, true); + Requirements::javascript(CMS_DIR . '/javascript/dist/bundle-lib.js', [ + 'provides' => [ + CMS_DIR . '/javascript/dist/CMSMain.AddForm.js', + CMS_DIR . '/javascript/dist/CMSMain.EditForm.js', + CMS_DIR . '/javascript/dist/CMSMain.js', + CMS_DIR . '/javascript/dist/CMSMain.Tree.js', + CMS_DIR . '/javascript/dist/CMSPageHistoryController.js', + CMS_DIR . '/javascript/dist/RedirectorPage.js', + CMS_DIR . '/javascript/dist/SilverStripeNavigator.js', + CMS_DIR . '/javascript/dist/SiteTreeURLSegmentField.js' + ] + ]); CMSBatchActionHandler::register('publish', 'CMSBatchAction_Publish'); CMSBatchActionHandler::register('unpublish', 'CMSBatchAction_Unpublish'); diff --git a/code/controllers/ContentController.php b/code/controllers/ContentController.php index b06ee273..966dfa6c 100755 --- a/code/controllers/ContentController.php +++ b/code/controllers/ContentController.php @@ -268,7 +268,7 @@ class ContentController extends Controller { if($this->dataRecord) { Requirements::css(CMS_DIR . '/css/SilverStripeNavigator.css'); Requirements::javascript(FRAMEWORK_DIR . '/thirdparty/jquery/jquery.js'); - Requirements::javascript(CMS_DIR . '/javascript/SilverStripeNavigator.js'); + Requirements::javascript(CMS_DIR . '/javascript/dist/SilverStripeNavigator.js'); $return = $nav = SilverStripeNavigator::get_for_record($this->dataRecord); $items = $return['items']; diff --git a/code/forms/SiteTreeURLSegmentField.php b/code/forms/SiteTreeURLSegmentField.php index 0ea7d87c..200e688a 100644 --- a/code/forms/SiteTreeURLSegmentField.php +++ b/code/forms/SiteTreeURLSegmentField.php @@ -37,7 +37,7 @@ class SiteTreeURLSegmentField extends TextField { } public function Field($properties = array()) { - Requirements::javascript(CMS_DIR . '/javascript/SiteTreeURLSegmentField.js'); + Requirements::javascript(CMS_DIR . '/javascript/dist/SiteTreeURLSegmentField.js'); Requirements::add_i18n_javascript(CMS_DIR . '/javascript/lang', false, true); Requirements::css(CMS_DIR . "/css/screen.css"); return parent::Field($properties); diff --git a/code/model/RedirectorPage.php b/code/model/RedirectorPage.php index d39c4d87..bcecdb9f 100644 --- a/code/model/RedirectorPage.php +++ b/code/model/RedirectorPage.php @@ -117,7 +117,7 @@ class RedirectorPage extends Page { } public function getCMSFields() { - Requirements::javascript(CMS_DIR . '/javascript/RedirectorPage.js'); + Requirements::javascript(CMS_DIR . '/javascript/dist/RedirectorPage.js'); $fields = parent::getCMSFields(); $fields->removeByName('Content', true); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..2fde3ee1 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,97 @@ +var gulp = require('gulp'), + babel = require('gulp-babel'), + diff = require('gulp-diff'), + notify = require('gulp-notify'), + uglify = require('gulp-uglify'); + gulpUtil = require('gulp-util'), + browserify = require('browserify'), + babelify = require('babelify'), + watchify = require('watchify'), + source = require('vinyl-source-stream'), + buffer = require('vinyl-buffer'), + path = require('path'), + glob = require('glob'), + eventStream = require('event-stream'), + semver = require('semver'), + packageJson = require('./package.json'); + +var PATHS = { + MODULES: './node_modules', + CMS_JAVASCRIPT_SRC: './javascript/src', + CMS_JAVASCRIPT_DIST: './javascript/dist' +}; + +var browserifyOptions = { + cache: {}, + packageCache: {}, + poll: true, + plugin: [watchify] +}; + +/** + * Transforms the passed JavaScript files to UMD modules. + * + * @param array files - The files to transform. + * @param string dest - The output directory. + * @return object + */ +function transformToUmd(files, dest) { + return eventStream.merge(files.map(function (file) { + return gulp.src(file) + .pipe(babel({ + presets: ['es2015'], + moduleId: 'ss.' + path.parse(file).name, + plugins: ['transform-es2015-modules-umd'] + })) + .on('error', notify.onError({ + message: 'Error: <%= error.message %>', + })) + .pipe(gulp.dest(dest)); + })); +} + +// Make sure the version of Node being used is valid. +if (!semver.satisfies(process.versions.node, packageJson.engines.node)) { + console.error('Invalid Node.js version. You need to be using ' + packageJson.engines.node + '. If you want to manage multiple Node.js versions try https://github.com/creationix/nvm'); + process.exit(1); +} + +if (process.env.npm_config_development) { + browserifyOptions.debug = true; +} + +gulp.task('build', ['umd-cms', 'umd-watch', 'bundle-lib']); + +gulp.task('bundle-lib', function bundleLib() { + var stream = browserify(Object.assign({}, browserifyOptions, { + entries: PATHS.CMS_JAVASCRIPT_SRC + '/bundles/lib.js' + })) + .transform(babelify.configure({ + presets: ['es2015'], + ignore: /(thirdparty)/ + })) + .on('log', function (msg) { gulpUtil.log('Finished bundle-lib.js ' + msg); }) + .on('update', bundleLib) + .external('jQuery') + .external('i18n') + .bundle() + .on('error', notify.onError({ + message: 'Error: <%= error.message %>', + })) + .pipe(source('bundle-lib.js')) + .pipe(buffer()); + + if (typeof process.env.npm_config_development === 'undefined') { + stream.pipe(uglify()); + } + + return stream.pipe(gulp.dest(PATHS.CMS_JAVASCRIPT_DIST)); +}); + +gulp.task('umd-cms', function () { + return transformToUmd(glob.sync(PATHS.CMS_JAVASCRIPT_SRC + '/*.js'), PATHS.CMS_JAVASCRIPT_DIST); +}); + +gulp.task('umd-watch', function () { + gulp.watch(PATHS.CMS_JAVASCRIPT_SRC + '/*.js', ['umd-cms']); +}); diff --git a/javascript/AssetAdmin.DragDrop.js b/javascript/AssetAdmin.DragDrop.js deleted file mode 100644 index e4c4a488..00000000 --- a/javascript/AssetAdmin.DragDrop.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * File: AssetAdmin.DragDrop.js - */ -(function($) { - $.entwine('ss', function($){ - - /** - * Class: .AssetTableField.dragdrop - */ - $('.AssetTableField.dragdrop').entwine({ - onmatch: function() { - var self = this; - $('.cms-tree li').each(function() { - $(this).droppable({ - greedy: true, - hoverClass: 'over', // same hover effect as normal tree - drop: function(e, ui) {self.drop(e, ui);} - }); - }); - - this._super(); - }, - onunmatch: function() { - this._super(); - }, - /** - * Function: drop - * - * Take selected files and move them to a folder target in the tree. - */ - drop: function(e, ui) { - var self = this; - if(e.target.id.match(/-([^-]+)$/)) { - var folderId = RegExp.$1; - $.post( - this.attr('href') + '/movemarked', - this.parents('form').serialize() + '&DestFolderID=' + folderId, - function(data, status) { - self.refresh(); - } - ) - } - }, - - /** - * Function: getSelected - * - * Get the IDs of all selected files in the table. - * Used for drag'n'drop. - * - * Returns: - * Array - */ - getSelected: function() { - return this.find(':input[name=Files\[\]]:checked').map(function() { - return $(this).val(); - }); - } - }); - - $('.AssetTableField .dragfile').entwine({ - // Constructor: onmatch - onmatch: function() { - var self = this; - var container = this.parents('.AssetTableField'); - - this.draggable({ - zIndex: 4000, - appendTo: 'body', - helper: function() { - return $( - '
' - ss.i18n.sprintf(ss.i18n._t('AssetTableField.MOVING'),container.getSelected().length) - '
' - ); - } - }); - - this._super(); - }, - onunmatch: function() { - this._super(); - }, - /** - * Function: onmousedown - * - * Parameters: - * (Event) e - * - * Automatically select the checkbox in the same table row - * to signify that this element is moved, and hint that - * all checkboxed elements will be moved along with it. - */ - onmousedown: function(e) { - this.siblings('.markingcheckbox').find(':input').attr('checked', 'checked'); - } - }); - }); -}(jQuery)); diff --git a/javascript/AssetAdmin.js b/javascript/AssetAdmin.js deleted file mode 100644 index 2f64baa9..00000000 --- a/javascript/AssetAdmin.js +++ /dev/null @@ -1,141 +0,0 @@ -/** - * File: AssetAdmin.js - */ - -(function($) { - $.entwine('ss', function($){ - /** - * Delete selected folders through "batch actions" tab. - */ - /* assets don't currently have batch actions; disabling for now - $(document).ready(function() { - $('#Form_BatchActionsForm').entwine('.ss.tree').register( - // TODO Hardcoding of base URL - 'admin/assets/batchactions/delete', - function(ids) { - var confirmed = confirm( - ss.i18n.sprintf( - ss.i18n._t('AssetAdmin.BATCHACTIONSDELETECONFIRM'), - ids.length - ) - ); - return (confirmed) ? ids : false; - } - ); - }); - */ - - /** - * Load folder detail view via controller methods - * rather than built-in GridField view (which is only geared towards showing files). - */ - $('.AssetAdmin.cms-edit-form .ss-gridfield-item').entwine({ - onclick: function(e) { - // Let actions do their own thing - if($(e.target).closest('.action').length) { - this._super(e); - return; - } - - var grid = this.closest('.ss-gridfield'); - if(this.data('class') == 'Folder') { - var url = grid.data('urlFolderTemplate').replace('%s', this.data('id')); - $('.cms-container').loadPanel(url); - return false; - } - - this._super(e); - } - }); - - $('.AssetAdmin.cms-edit-form .ss-gridfield .col-buttons .action.gridfield-button-delete, .AssetAdmin.cms-edit-form .Actions button.action.action-delete').entwine({ - onclick: function(e) { - var msg; - if(this.closest('.ss-gridfield-item').data('class') == 'Folder') { - msg = ss.i18n._t('AssetAdmin.ConfirmDelete'); - } else { - msg = ss.i18n._t('TABLEFIELD.DELETECONFIRMMESSAGE'); - } - if(!confirm(msg)) return false; - - this.getGridField().reload({data: [{name: this.attr('name'), value: this.val()}]}); - e.preventDefault(); - return false; - } - }); - - $('.AssetAdmin.cms-edit-form :submit[name=action_delete]').entwine({ - onclick: function(e) { - if(!confirm(ss.i18n._t('AssetAdmin.ConfirmDelete'))) return false; - else this._super(e); - } - }); - - /** - * Prompt for a new foldername, rather than using dedicated form. - * Better usability, but less flexibility in terms of inputs and validation. - * Mainly necessary because AssetAdmin->AddForm() returns don't play nicely - * with the nested AssetAdmin->EditForm() DOM structures. - */ - $('.AssetAdmin .cms-add-folder-link').entwine({ - onclick: function(e) { - var name = prompt(ss.i18n._t('Folder.Name')); - if(!name) return false; - - this.closest('.cms-container').loadPanel(this.data('url') + '&Name=' + name); - return false; - } - }); - - /** - * Class: #Form_SyncForm - */ - $('#Form_SyncForm').entwine({ - - /** - * Function: onsubmit - * - * Parameters: - * (Event) e - */ - onsubmit: function(e) { - var button = jQuery(this).find(':submit:first'); - button.addClass('loading'); - $.ajax({ - url: jQuery(this).attr('action'), - data: this.serializeArray(), - success: function() { - button.removeClass('loading'); - // reload current form and tree - var currNode = $('.cms-tree')[0].firstSelected(); - if(currNode) { - var url = $(currNode).find('a').attr('href'); - $('.cms-content').loadPanel(url); - } - $('.cms-tree')[0].setCustomURL('admin/assets/getsubtree'); - $('.cms-tree')[0].reload({onSuccess: function() { - // TODO Reset current tree node - }}); - } - }); - - return false; - } - }); - - /** - * Reload the gridfield to show the user the file has been added - */ - $('.AssetAdmin.cms-edit-form .ss-uploadfield-item-progress').entwine({ - onunmatch: function () { - $('.AssetAdmin.cms-edit-form .ss-gridfield').reload(); - } - }); - - $('.AssetAdmin .grid-levelup').entwine({ - onmatch: function () { - this.closest('.ui-tabs-panel').find('.cms-actions-row').prepend(this); - } - }) - }); -}(jQuery)); diff --git a/javascript/CMSMain.AddForm.js b/javascript/CMSMain.AddForm.js deleted file mode 100644 index 2681d7ab..00000000 --- a/javascript/CMSMain.AddForm.js +++ /dev/null @@ -1,196 +0,0 @@ -(function($) { - $.entwine('ss', function($){ - /** - * Reset the parent node selection if the type is - * set back to "toplevel page", to avoid submitting inconsistent state. - */ - $(".cms-add-form .parent-mode :input").entwine({ - onclick: function(e) { - if(this.val() == 'top') { - var parentField = this.closest('form').find('#Form_AddForm_ParentID_Holder .TreeDropdownField') - parentField.setValue(''); - parentField.setTitle(''); - } - } - }); - - $(".cms-add-form").entwine({ - ParentID: 0, // Last selected parentID - ParentCache: {}, // Cache allowed children for each selected page - onadd: function() { - var self = this; - this.find('#Form_AddForm_ParentID_Holder .TreeDropdownField').bind('change', function() { - self.updateTypeList(); - }); - this.find(".SelectionGroup.parent-mode").bind('change', function() { - self.updateTypeList(); - }); - this.updateTypeList(); - }, - loadCachedChildren: function(parentID) { - var cache = this.getParentCache(); - if(typeof cache[parentID] !== 'undefined') return cache[parentID]; - else return null; - }, - saveCachedChildren: function(parentID, children) { - var cache = this.getParentCache(); - cache[parentID] = children; - this.setParentCache(cache); - }, - /** - * Limit page type selection based on parent selection. - * Select of root classes is pre-computed, but selections with a given parent - * are updated on-demand. - * Similar implementation to LeftAndMain.Tree.js. - */ - updateTypeList: function() { - var hints = this.data('hints'), - parentTree = this.find('#Form_AddForm_ParentID_Holder .TreeDropdownField'), - parentMode = this.find("input[name=ParentModeField]:checked").val(), - metadata = parentTree.data('metadata'), - id = (metadata && parentMode === 'child') - ? (parentTree.getValue() || this.getParentID()) - : null, - newClassName = metadata ? metadata.ClassName : null, - hintKey = (newClassName && parentMode === 'child') - ? newClassName - : 'Root', - hint = (typeof hints[hintKey] !== 'undefined') ? hints[hintKey] : null, - self = this, - defaultChildClass = (hint && typeof hint.defaultChild !== 'undefined') - ? hint.defaultChild - : null, - disallowedChildren = []; - - if(id) { - // Prevent interface operations - if(this.hasClass('loading')) return; - this.addClass('loading'); - - // Enable last parent ID to be re-selected from memory - this.setParentID(id); - if(!parentTree.getValue()) parentTree.setValue(id); - - // Use cached data if available - disallowedChildren = this.loadCachedChildren(id); - if(disallowedChildren !== null) { - this.updateSelectionFilter(disallowedChildren, defaultChildClass); - this.removeClass('loading'); - return; - } - $.ajax({ - url: self.data('childfilter'), - data: {'ParentID': id}, - success: function(data) { - // reload current form and tree - self.saveCachedChildren(id, data); - self.updateSelectionFilter(data, defaultChildClass); - }, - complete: function() { - self.removeClass('loading'); - } - }); - - return false; - } else { - disallowedChildren = (hint && typeof hint.disallowedChildren !== 'undefined') - ? hint.disallowedChildren - : [], - this.updateSelectionFilter(disallowedChildren, defaultChildClass); - } - }, - /** - * Update the selection filter with the given blacklist and default selection - * - * @param array disallowedChildren - * @param string defaultChildClass - */ - updateSelectionFilter: function(disallowedChildren, defaultChildClass) { - // Limit selection - var allAllowed = null; // troolian - this.find('#Form_AddForm_PageType li').each(function() { - var className = $(this).find('input').val(), - isAllowed = ($.inArray(className, disallowedChildren) === -1); - - $(this).setEnabled(isAllowed); - if(!isAllowed) $(this).setSelected(false); - if(allAllowed === null) allAllowed = isAllowed; - else allAllowed = allAllowed && isAllowed; - }); - - // Set default child selection, or fall back to first available option - if(defaultChildClass) { - var selectedEl = this - .find('#Form_AddForm_PageType li input[value=' + defaultChildClass + ']') - .parents('li:first'); - } else { - var selectedEl = this.find('#Form_AddForm_PageType li:not(.disabled):first'); - } - selectedEl.setSelected(true); - selectedEl.siblings().setSelected(false); - - // Disable the "Create" button if none of the pagetypes are available - var buttonState = this.find('#Form_AddForm_PageType li:not(.disabled)').length - ? 'enable' - : 'disable'; - this.find('button[name=action_doAdd]').button(buttonState); - - this.find('.message-restricted')[allAllowed ? 'hide' : 'show'](); - } - }); - - $(".cms-add-form #Form_AddForm_PageType li").entwine({ - onclick: function(e) { - this.setSelected(true); - }, - setSelected: function(bool) { - var input = this.find('input'); - if(bool && !input.is(':disabled')) { - this.siblings().setSelected(false); - this.toggleClass('selected', true); - input.prop('checked', true); - } else { - this.toggleClass('selected', false); - input.prop('checked', false); - } - }, - setEnabled: function(bool) { - $(this).toggleClass('disabled', !bool); - if(!bool) $(this).find('input').attr('disabled', 'disabled').removeAttr('checked'); - else $(this).find('input').removeAttr('disabled'); - } - }); - - $(".cms-content-addpage-button").entwine({ - onclick: function(e) { - var tree = $('.cms-tree'), list = $('.cms-list'), parentId = 0; - - // Choose parent ID either from tree or list view, depending which is visible - if(tree.is(':visible')) { - var selected = tree.jstree('get_selected'); - parentId = selected ? $(selected[0]).data('id') : null; - } else { - var state = list.find('input[name="Page[GridState]"]').val(); - if(state) parentId = parseInt(JSON.parse(state).ParentID, 10); - } - - var data = {selector: this.data('targetPanel'),pjax: this.data('pjax')}, url; - if(parentId) { - extraParams = this.data('extraParams') ? this.data('extraParams') : ''; - url = $.path.addSearchParams(ss.i18n.sprintf(this.data('urlAddpage'), parentId), extraParams); - } else { - url = this.attr('href'); - } - - $('.cms-container').loadPanel(url, null, data); - e.preventDefault(); - - // Remove focussed state from button - this.blur(); - - // $('.cms-page-add-form-dialog').dialog('open'); - // e.preventDefault(); - } - }); - }); -}(jQuery)); diff --git a/javascript/CMSMain.EditForm.js b/javascript/CMSMain.EditForm.js deleted file mode 100644 index 3d92f5f3..00000000 --- a/javascript/CMSMain.EditForm.js +++ /dev/null @@ -1,469 +0,0 @@ -/** - * File: CMSMain.EditForm.js - */ -(function($) { - $.entwine('ss', function($){ - /** - * Class: .cms-edit-form :input[name=ClassName] - * Alert the user on change of page-type. This might have implications - * on the available form fields etc. - */ - $('.cms-edit-form :input[name=ClassName]').entwine({ - // Function: onchange - onchange: function() { - alert(ss.i18n._t('CMSMAIN.ALERTCLASSNAME')); - } - }); - - /** - * Class: .cms-edit-form input[name=Title] - * - * Input validation on the Title field - */ - $('.cms-edit-form input[name=Title]').entwine({ - // Constructor: onmatch - onmatch : function() { - var self = this; - - self.data('OrigVal', self.val()); - - var form = self.closest('form'); - var urlSegmentInput = $('input:text[name=URLSegment]', form); - var liveLinkInput = $('input[name=LiveLink]', form); - - if (urlSegmentInput.length > 0) { - self._addActions(); - this.bind('change', function(e) { - var origTitle = self.data('OrigVal'); - var title = self.val(); - self.data('OrigVal', title); - - // Criteria for defining a "new" page - if ( - urlSegmentInput.val().indexOf(urlSegmentInput.data('defaultUrl')) === 0 - && liveLinkInput.val() == '' - ) { - self.updateURLSegment(title); - } else { - $('.update', self.parent()).show(); - } - - self.updateRelatedFields(title, origTitle); - self.updateBreadcrumbLabel(title); - }); - } - - this._super(); - }, - onunmatch: function() { - this._super(); - }, - - /** - * Function: updateRelatedFields - * - * Update the related fields if appropriate - * (String) title The new title - * (Stirng) origTitle The original title - */ - updateRelatedFields: function(title, origTitle) { - // Update these fields only if their value was originally the same as the title - this.parents('form').find('input[name=MetaTitle], input[name=MenuTitle]').each(function() { - var $this = $(this); - if($this.val() == origTitle) { - $this.val(title); - // Onchange bubbling didn't work in IE8, so .trigger('change') couldn't be used - if($this.updatedRelatedFields) $this.updatedRelatedFields(); - } - }); - }, - - /** - * Function: updateURLSegment - * - * Update the URLSegment - * (String) title - */ - updateURLSegment: function(title) { - var urlSegmentInput = $('input:text[name=URLSegment]', this.closest('form')); - var urlSegmentField = urlSegmentInput.closest('.field.urlsegment'); - var updateURLFromTitle = $('.update', this.parent()); - urlSegmentField.update(title); - if (updateURLFromTitle.is(':visible')) { - updateURLFromTitle.hide(); - } - }, - - /** - * Function: updateBreadcrumbLabel - * - * Update the breadcrumb - * (String) title - */ - updateBreadcrumbLabel: function(title) { - var pageID = $('.cms-edit-form input[name=ID]').val(); - var panelCrumb = $('span.cms-panel-link.crumb'); - if (title && title != "") { - panelCrumb.text(title); - } - }, - - /** - * Function: _addActions - * - * Utility to add update from title action - * - */ - _addActions: function() { - var self = this; - var updateURLFromTitle; - - // update button - updateURLFromTitle = $('