marc-leopold/cms/plugins/rainlab/builder/assets/js/builder.index.entity.versio...

272 lines
8.5 KiB
JavaScript

/*
* Builder Index controller Version entity controller
*/
+function ($) { "use strict";
if ($.oc.builder === undefined)
$.oc.builder = {}
if ($.oc.builder.entityControllers === undefined)
$.oc.builder.entityControllers = {}
var Base = $.oc.builder.entityControllers.base,
BaseProto = Base.prototype
var Version = function(indexController) {
Base.call(this, 'version', indexController)
this.hiddenHints = {}
}
Version.prototype = Object.create(BaseProto)
Version.prototype.constructor = Version
// PUBLIC METHODS
// ============================
Version.prototype.cmdCreateVersion = function(ev) {
var $link = $(ev.currentTarget),
versionType = $link.data('versionType')
this.indexController.openOrLoadMasterTab($link, 'onVersionCreateOrOpen', this.newTabId(), {
version_type: versionType
})
}
Version.prototype.cmdSaveVersion = function(ev) {
var $target = $(ev.currentTarget),
$form = $target.closest('form')
$target.request('onVersionSave').done(
this.proxy(this.saveVersionDone)
)
}
Version.prototype.cmdOpenVersion = function(ev) {
var versionNumber = $(ev.currentTarget).data('id'),
pluginCode = $(ev.currentTarget).data('pluginCode')
this.indexController.openOrLoadMasterTab($(ev.target), 'onVersionCreateOrOpen', this.makeTabId(pluginCode+'-'+versionNumber), {
original_version: versionNumber
})
}
Version.prototype.cmdDeleteVersion = function(ev) {
var $target = $(ev.currentTarget)
$.oc.confirm($target.data('confirm'), this.proxy(this.deleteConfirmed))
}
Version.prototype.cmdApplyVersion = function(ev) {
var $target = $(ev.currentTarget),
$pane = $target.closest('div.tab-pane'),
self = this
this.showHintPopup($pane, 'builder-version-apply', function(){
$target.request('onVersionApply').done(
self.proxy(self.applyVersionDone)
)
})
}
Version.prototype.cmdRollbackVersion = function(ev) {
var $target = $(ev.currentTarget),
$pane = $target.closest('div.tab-pane'),
self = this
this.showHintPopup($pane, 'builder-version-rollback', function(){
$target.request('onVersionRollback').done(
self.proxy(self.rollbackVersionDone)
)
})
}
// INTERNAL METHODS
// ============================
Version.prototype.saveVersionDone = function(data) {
if (data['builderResponseData'] === undefined) {
throw new Error('Invalid response data')
}
var $masterTabPane = this.getMasterTabsActivePane()
this.updateUiAfterSave($masterTabPane, data)
if (!data.builderResponseData.isApplied) {
this.showSavedNotAppliedHint($masterTabPane)
}
}
Version.prototype.showSavedNotAppliedHint = function($masterTabPane) {
this.showHintPopup($masterTabPane, 'builder-version-save-unapplied')
}
Version.prototype.showHintPopup = function($masterTabPane, code, callback) {
if (this.getDontShowHintAgain(code, $masterTabPane)) {
if (callback) {
callback.apply(this)
}
return
}
$masterTabPane.one('hide.oc.popup', this.proxy(this.onHintPopupHide))
if (callback) {
$masterTabPane.one('shown.oc.popup', function(ev, $element, $modal) {
$modal.find('form').one('submit', function(ev) {
callback.apply(this)
ev.preventDefault()
$(ev.target).trigger('close.oc.popup')
return false
})
})
}
$masterTabPane.popup({
content: this.getPopupContent($masterTabPane, code)
})
}
Version.prototype.onHintPopupHide = function(ev, $element, $modal) {
var cbValue = $modal.find('input[type=checkbox][name=dont_show_again]').is(':checked'),
code = $modal.find('input[type=hidden][name=hint_code]').val()
$modal.find('form').off('submit')
if (!cbValue) {
return
}
var $form = this.getMasterTabsActivePane().find('form[data-entity="versions"]')
$form.request('onHideBackendHint', {
data: {
name: code
}
})
this.setDontShowHintAgain(code)
}
Version.prototype.setDontShowHintAgain = function(code) {
this.hiddenHints[code] = true
}
Version.prototype.getDontShowHintAgain = function(code, $pane) {
if (this.hiddenHints[code] !== undefined) {
return this.hiddenHints[code]
}
return $pane.find('input[type=hidden][data-hint-hidden="'+code+'"]').val() == "true"
}
Version.prototype.getPopupContent = function($pane, code) {
var template = $pane.find('script[data-version-hint-template="'+code+'"]')
if (template.length === 0) {
throw new Error('Version popup template not found: '+code)
}
return template.html()
}
Version.prototype.updateUiAfterSave = function($masterTabPane, data) {
$masterTabPane.find('input[name=original_version]').val(data.builderResponseData.savedVersion)
this.updateMasterTabIdAndTitle($masterTabPane, data.builderResponseData)
this.unhideFormDeleteButton($masterTabPane)
this.getVersionList().fileList('markActive', data.builderResponseData.tabId)
this.getIndexController().unchangeTab($masterTabPane)
}
Version.prototype.deleteConfirmed = function() {
var $masterTabPane = this.getMasterTabsActivePane(),
$form = $masterTabPane.find('form')
$.oc.stripeLoadIndicator.show()
$form.request('onVersionDelete').always(
$.oc.builder.indexController.hideStripeIndicatorProxy
).done(
this.proxy(this.deleteDone)
)
}
Version.prototype.deleteDone = function() {
var $masterTabPane = this.getMasterTabsActivePane()
this.getIndexController().unchangeTab($masterTabPane)
this.forceCloseTab($masterTabPane)
}
Version.prototype.applyVersionDone = function(data) {
if (data['builderResponseData'] === undefined) {
throw new Error('Invalid response data')
}
var $masterTabPane = this.getMasterTabsActivePane()
this.updateUiAfterSave($masterTabPane, data)
this.updateVersionsButtons()
}
Version.prototype.rollbackVersionDone = function(data) {
if (data['builderResponseData'] === undefined) {
throw new Error('Invalid response data')
}
var $masterTabPane = this.getMasterTabsActivePane()
this.updateUiAfterSave($masterTabPane, data)
this.updateVersionsButtons()
}
Version.prototype.getVersionList = function() {
return $('#layout-side-panel form[data-content-id=version] [data-control=filelist]')
}
Version.prototype.updateVersionsButtons = function() {
var tabsObject = this.getMasterTabsObject(),
$tabs = tabsObject.$tabsContainer.find('> li'),
$versionList = this.getVersionList()
// Find all version tabs and update Apply and Rollback buttons
// basing on the version statuses in the version list.
for (var i=$tabs.length-1; i>=0; i--) {
var $tab = $($tabs[i]),
tabId = $tab.data('tabId')
if (!tabId || String(tabId).length == 0) {
continue
}
var $versionLi = $versionList.find('li[data-id="'+tabId+'"]')
if (!$versionLi.length) {
continue
}
var isApplied = $versionLi.data('applied'),
$pane = tabsObject.findPaneFromTab($tab)
if (isApplied) {
$pane.find('[data-builder-command="version:cmdApplyVersion"]').addClass('hide')
$pane.find('[data-builder-command="version:cmdRollbackVersion"]').removeClass('hide')
}
else {
$pane.find('[data-builder-command="version:cmdApplyVersion"]').removeClass('hide')
$pane.find('[data-builder-command="version:cmdRollbackVersion"]').addClass('hide')
}
}
}
// REGISTRATION
// ============================
$.oc.builder.entityControllers.version = Version;
}(window.jQuery);