CustomElementsPropertiesActivator.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. 'use strict';
  2. var inherits = require('inherits');
  3. var getTemplate = require('./Helper').getTemplate;
  4. var PropertiesActivator = require('../../../PropertiesActivator');
  5. var HIGHER_PRIORITY = 1100;
  6. /**
  7. * Applies template visibility settings.
  8. *
  9. * Controlled using `entriesVisible` on template config object:
  10. *
  11. * ```json
  12. * "entriesVisible": {
  13. * "_all": true|false,
  14. * "entryName": true|false,
  15. * ...
  16. * }
  17. * ```
  18. *
  19. * @param {EventBus} eventBus
  20. * @param {ElementTemplates} elementTemplates
  21. */
  22. function CustomElementsPropertiesActivator(eventBus, elementTemplates) {
  23. PropertiesActivator.call(this, eventBus, HIGHER_PRIORITY);
  24. this.isEntryVisible = function(entry, element) {
  25. var template = getTemplate(element, elementTemplates);
  26. if (template && !isEntryVisible(entry, template)) {
  27. return false;
  28. }
  29. };
  30. this.isPropertyEditable = function(entry, propertyName, element) {
  31. var template = getTemplate(element, elementTemplates);
  32. if (template && !isEntryEditable(entry, template)) {
  33. return false;
  34. }
  35. };
  36. }
  37. CustomElementsPropertiesActivator.$inject = [ 'eventBus', 'elementTemplates' ];
  38. inherits(CustomElementsPropertiesActivator, PropertiesActivator);
  39. module.exports = CustomElementsPropertiesActivator;
  40. // helpers ////////////////////////////////////
  41. var CUSTOM_PROPERTIES_PATTERN = /^custom-/;
  42. var DEFAULT_ENTRIES_VISIBLE = {
  43. _all: false,
  44. id: true,
  45. name: true
  46. };
  47. function isCustomEntry(entry) {
  48. return CUSTOM_PROPERTIES_PATTERN.test(entry.id);
  49. }
  50. function isEntryVisible(entry, template) {
  51. var entryId = entry.id;
  52. if (entryId === 'elementTemplate-chooser' || isCustomEntry(entry)) {
  53. return true;
  54. }
  55. var entriesVisible = template.entriesVisible || DEFAULT_ENTRIES_VISIBLE;
  56. if (typeof entriesVisible === 'boolean') {
  57. return entriesVisible;
  58. }
  59. var defaultVisible = entriesVisible._all || false,
  60. entryVisible = entriesVisible[entryId];
  61. // d = true, e = false => false
  62. // d = false, e = true => true
  63. // d = false, e = false
  64. return (
  65. (defaultVisible === true && entryVisible !== false) ||
  66. (defaultVisible === false && entryVisible === true)
  67. );
  68. }
  69. function isEntryEditable(entry, template) {
  70. var property;
  71. if (isCustomEntry(entry)) {
  72. property = getProperty(template, entry);
  73. return property && property.editable !== false;
  74. }
  75. return true;
  76. }
  77. function getProperty(template, entry) {
  78. var index;
  79. var idx = entry.id.replace('custom-' + template.id + '-', '');
  80. if (idx.indexOf('-') !== -1) {
  81. var indexes = idx.split('-');
  82. if (indexes.length == 2) {
  83. var scopeName = indexes[0].replace(/_/g, ':');
  84. index = parseInt(indexes[1], 10);
  85. if (scopeName && !isNaN(index)) {
  86. return template.scopes[scopeName].properties[index];
  87. }
  88. }
  89. } else {
  90. index = parseInt(idx, 10);
  91. if (!isNaN(index)) {
  92. return template.properties[index];
  93. }
  94. }
  95. throw new Error('cannot extract property index for entry <' + entry.id + '>');
  96. }