133 lines
3.0 KiB
JavaScript
133 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
var inherits = require('inherits');
|
|
|
|
var getTemplate = require('./Helper').getTemplate;
|
|
|
|
var PropertiesActivator = require('../../../PropertiesActivator');
|
|
|
|
var HIGHER_PRIORITY = 1100;
|
|
|
|
/**
|
|
* Applies template visibility settings.
|
|
*
|
|
* Controlled using `entriesVisible` on template config object:
|
|
*
|
|
* ```json
|
|
* "entriesVisible": {
|
|
* "_all": true|false,
|
|
* "entryName": true|false,
|
|
* ...
|
|
* }
|
|
* ```
|
|
*
|
|
* @param {EventBus} eventBus
|
|
* @param {ElementTemplates} elementTemplates
|
|
*/
|
|
function CustomElementsPropertiesActivator(eventBus, elementTemplates) {
|
|
PropertiesActivator.call(this, eventBus, HIGHER_PRIORITY);
|
|
|
|
this.isEntryVisible = function(entry, element) {
|
|
|
|
var template = getTemplate(element, elementTemplates);
|
|
|
|
if (template && !isEntryVisible(entry, template)) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
this.isPropertyEditable = function(entry, propertyName, element) {
|
|
|
|
var template = getTemplate(element, elementTemplates);
|
|
|
|
if (template && !isEntryEditable(entry, template)) {
|
|
return false;
|
|
}
|
|
};
|
|
}
|
|
|
|
CustomElementsPropertiesActivator.$inject = [ 'eventBus', 'elementTemplates' ];
|
|
|
|
inherits(CustomElementsPropertiesActivator, PropertiesActivator);
|
|
|
|
module.exports = CustomElementsPropertiesActivator;
|
|
|
|
|
|
|
|
// helpers ////////////////////////////////////
|
|
|
|
|
|
var CUSTOM_PROPERTIES_PATTERN = /^custom-/;
|
|
|
|
var DEFAULT_ENTRIES_VISIBLE = {
|
|
_all: false,
|
|
id: true,
|
|
name: true
|
|
};
|
|
|
|
function isCustomEntry(entry) {
|
|
return CUSTOM_PROPERTIES_PATTERN.test(entry.id);
|
|
}
|
|
|
|
function isEntryVisible(entry, template) {
|
|
|
|
var entryId = entry.id;
|
|
|
|
if (entryId === 'elementTemplate-chooser' || isCustomEntry(entry)) {
|
|
return true;
|
|
}
|
|
|
|
var entriesVisible = template.entriesVisible || DEFAULT_ENTRIES_VISIBLE;
|
|
|
|
if (typeof entriesVisible === 'boolean') {
|
|
return entriesVisible;
|
|
}
|
|
|
|
var defaultVisible = entriesVisible._all || false,
|
|
entryVisible = entriesVisible[entryId];
|
|
|
|
// d = true, e = false => false
|
|
// d = false, e = true => true
|
|
// d = false, e = false
|
|
return (
|
|
(defaultVisible === true && entryVisible !== false) ||
|
|
(defaultVisible === false && entryVisible === true)
|
|
);
|
|
}
|
|
|
|
function isEntryEditable(entry, template) {
|
|
|
|
var property;
|
|
|
|
if (isCustomEntry(entry)) {
|
|
property = getProperty(template, entry);
|
|
|
|
return property && property.editable !== false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function getProperty(template, entry) {
|
|
|
|
var index;
|
|
var idx = entry.id.replace('custom-' + template.id + '-', '');
|
|
if (idx.indexOf('-') !== -1) {
|
|
var indexes = idx.split('-');
|
|
if (indexes.length == 2) {
|
|
var scopeName = indexes[0].replace(/_/g, ':');
|
|
index = parseInt(indexes[1], 10);
|
|
if (scopeName && !isNaN(index)) {
|
|
return template.scopes[scopeName].properties[index];
|
|
}
|
|
}
|
|
} else {
|
|
index = parseInt(idx, 10);
|
|
if (!isNaN(index)) {
|
|
return template.properties[index];
|
|
}
|
|
}
|
|
|
|
throw new Error('cannot extract property index for entry <' + entry.id + '>');
|
|
}
|