(function($) { /** * File: CMSPageHistoryController.js * * Handles related interactions between the version selection form on the * left hand side of the panel and the version displaying on the right * hand side. */ $.entwine('ss', function($){ /** * Class: #Form_VersionsForm * * The left hand side version selection form is the main interface for * users to select a version to view, or to compare two versions */ $('#Form_VersionsForm').entwine({ /** * Constructor */ onmatch: function() { var self = this; /** * Event: :input[name=ShowUnpublished] change * * Changing the show unpublished checkbox toggles whether to show * or hide the unpublished versions. Because those rows may be being * compared this also ensures those rows are unselected. */ this.find(':input[name=ShowUnpublished]').bind('change', function(e) { if($(this).attr("checked")) { self.find("tr[data-published=false]").show(); } else { self.find("tr[data-published=false]").hide()._unselect(); } }); this._super(); }, /** * Function: submit. * * Submits either the compare versions form or the view single form * display based on whether we have two or 1 option selected * * Todo: * Handle coupling to admin url */ onsubmit: function(e, d) { var id, self = this; id = this.find(':input[name=ID]').val(); if(!id) return false; var button, url, selected, to, from, compare, data, metadata; metadata = this.metadata({type: 'class'}); compare = (this.find(":input[name=CompareMode]").is(":checked")); selected = this.find("table input[type=checkbox]").filter(":checked"); if(compare) { if(selected.length != 2) return false; to = selected.eq(0).val(); from = selected.eq(1).val(); button = this.find(':submit[name=action_doCompare]'); url = ss.i18n.sprintf(metadata['link-tmpl-compare'], id,from,to); } else { to = selected.eq(0).val(); button = this.find(':submit[name=action_doShowVersion]'); url = ss.i18n.sprintf(metadata['link-tmpl-show'], id,to); } window.History.pushState({selector: '.cms-edit-form'}, '', url); return false; } }); /** * Class: #Form_VersionsForm tr * * An individual row in the versions form. Selecting the row updates * the edit form depending on whether we're showing individual version * information or displaying comparsion. */ $("#Form_VersionsForm tbody tr").entwine({ /** * Function: onclick * * Selects or deselects the row (if in compare mode). Will trigger * an update of the edit form if either selected (in single mode) * or if this is the second row selected (in compare mode) */ onclick: function(e) { var compare, selected; // compare mode compare = this.parents("form").find(':input[name=CompareMode]').attr("checked"), selected = this.siblings(".active"); if(compare && this.hasClass('active')) { this._unselect(); return; } else if(compare) { // check if we have already selected more than two. if(selected.length > 1) { return alert(ss.i18n._t('ONLYSELECTTWO', 'Can only compare two versions at at time.')); } this._select(); // if this is the second selected then we can compare. if(selected.length == 1) { this.parents('form').submit(); } return; } else { this._select(); selected._unselect(); this.parents("form").submit(); } }, /** * Function: _unselect() * * Unselects the row from the form selection. */ _unselect: function() { this.removeClass('active'); this.find(":input[type=checkbox]").attr("checked", false); }, /** * Function: _select() * * Selects the currently matched row in the form selection */ _select: function() { this.addClass('active'); this.find(":input[type=checkbox]").attr("checked", true); } }) }); })(jQuery);