marc-leopold/cms/plugins/rainlab/builder/assets/js/builder.dataregistry.js

170 lines
5.1 KiB
JavaScript

/*
* Builder client-side plugin data registry
*/
+function ($) { "use strict";
if ($.oc.builder === undefined)
$.oc.builder = {}
var Base = $.oc.foundation.base,
BaseProto = Base.prototype
var DataRegistry = function() {
this.data = {}
this.requestCache = {}
this.callbackCache = {}
Base.call(this)
}
/*
* Example:
* $.oc.builder.dataRegistry.set('rainlab.blog', 'model.forms', 'Categories', formsArray)
* $.oc.builder.dataRegistry.set('rainlab.blog', 'localization', null, stringsArray) // The registry contains only default language
*/
DataRegistry.prototype.set = function(plugin, type, subtype, data, params) {
this.storeData(plugin, type, subtype, data)
if (type == 'localization' && !subtype) {
this.localizationUpdated(plugin, params)
}
}
/*
* Example:
* $.oc.builder.dataRegistry.get($form, 'rainlab.blog', 'model.forms', 'Categories', function(data){ ... })
*/
DataRegistry.prototype.get = function($formElement, plugin, type, subtype, callback) {
if (this.data[plugin] === undefined
|| this.data[plugin][type] === undefined
|| this.data[plugin][type][subtype] === undefined
|| this.isCacheObsolete(this.data[plugin][type][subtype].timestamp)) {
return this.loadDataFromServer($formElement, plugin, type, subtype, callback)
}
callback(this.data[plugin][type][subtype].data)
}
// INTERNAL METHODS
// ============================
DataRegistry.prototype.makeCacheKey = function(plugin, type, subtype) {
var key = plugin + '-' + type
if (subtype) {
key += '-' + subtype
}
return key
}
DataRegistry.prototype.isCacheObsolete = function(timestamp) {
return (Date.now() - timestamp) > 60000*5 // 5 minutes cache TTL
}
DataRegistry.prototype.loadDataFromServer = function($formElement, plugin, type, subtype, callback) {
var self = this,
cacheKey = this.makeCacheKey(plugin, type, subtype)
if (this.requestCache[cacheKey] === undefined) {
this.requestCache[cacheKey] = $formElement.request('onPluginDataRegistryGetData', {
data: {
registry_plugin_code: plugin,
registry_data_type: type,
registry_data_subtype: subtype
}
}).done(
function(data) {
if (data.registryData === undefined) {
throw new Error('Invalid data registry response.')
}
self.storeData(plugin, type, subtype, data.registryData)
self.applyCallbacks(cacheKey, data.registryData)
self.requestCache[cacheKey] = undefined
}
)
}
this.addCallbackToQueue(callback, cacheKey)
return this.requestCache[cacheKey]
}
DataRegistry.prototype.addCallbackToQueue = function(callback, key) {
if (this.callbackCache[key] === undefined) {
this.callbackCache[key] = []
}
this.callbackCache[key].push(callback)
}
DataRegistry.prototype.applyCallbacks = function(key, registryData) {
if (this.callbackCache[key] === undefined) {
return
}
for (var i=this.callbackCache[key].length-1; i>=0; i--) {
this.callbackCache[key][i](registryData);
}
delete this.callbackCache[key]
}
DataRegistry.prototype.storeData = function(plugin, type, subtype, data) {
if (this.data[plugin] === undefined) {
this.data[plugin] = {}
}
if (this.data[plugin][type] === undefined) {
this.data[plugin][type] = {}
}
var dataItem = {
timestamp: Date.now(),
data: data
}
this.data[plugin][type][subtype] = dataItem
}
DataRegistry.prototype.clearCache = function(plugin, type) {
if (this.data[plugin] === undefined) {
return
}
if (this.data[plugin][type] === undefined) {
return
}
this.data[plugin][type] = undefined
}
// LOCALIZATION-SPECIFIC METHODS
// ============================
DataRegistry.prototype.getLocalizationString = function($formElement, plugin, key, callback) {
this.get($formElement, plugin, 'localization', null, function(data){
if (data[key] !== undefined) {
callback(data[key])
return
}
callback(key)
})
}
DataRegistry.prototype.localizationUpdated = function(plugin, params) {
$.oc.builder.localizationInput.updatePluginInputs(plugin)
if (params === undefined || !params.suppressLanguageEditorUpdate) {
$.oc.builder.indexController.entityControllers.localization.languageUpdated(plugin)
}
$.oc.builder.indexController.entityControllers.localization.updateOnScreenStrings(plugin)
}
$.oc.builder.dataRegistry = new DataRegistry()
}(window.jQuery);