Browse code

add handlerconfig

Louis authored on27/10/2021 21:00:13
Showing1 changed files
... ...
@@ -5,7 +5,7 @@
5 5
  * @typedef {Object} Clay~ConfigItem
6 6
  * @property {string} type
7 7
  * @property {string|boolean|number} defaultValue
8
- * @property {string} [appKey]
8
+ * @property {string} [messageKey]
9 9
  * @property {string} [id]
10 10
  * @property {string} [label]
11 11
  * @property {Object} [attributes]
... ...
@@ -36,7 +36,7 @@ function ClayConfig(settings, config, $rootContainer, meta) {
36 36
   var _settings = _.copyObj(settings);
37 37
   var _items;
38 38
   var _itemsById;
39
-  var _itemsByAppKey;
39
+  var _itemsByMessageKey;
40 40
   var _isBuilt;
41 41
 
42 42
   /**
... ...
@@ -47,7 +47,7 @@ function ClayConfig(settings, config, $rootContainer, meta) {
47 47
   function _initializeItems() {
48 48
     _items = [];
49 49
     _itemsById = {};
50
-    _itemsByAppKey = {};
50
+    _itemsByMessageKey = {};
51 51
     _isBuilt = false;
52 52
   }
53 53
 
... ...
@@ -77,18 +77,18 @@ function ClayConfig(settings, config, $rootContainer, meta) {
77 77
           _itemsById[_item.id] = clayItem;
78 78
         }
79 79
 
80
-        if (_item.appKey) {
81
-          _itemsByAppKey[_item.appKey] = clayItem;
80
+        if (_item.messageKey) {
81
+          _itemsByMessageKey[_item.messageKey] = clayItem;
82 82
         }
83 83
 
84 84
         _items.push(clayItem);
85 85
 
86 86
         // set the value of the item via the manipulator to ensure consistency
87
-        var value = typeof _settings[_item.appKey] !== 'undefined' ?
88
-          _settings[_item.appKey] :
89
-          (_item.defaultValue || '');
87
+        var value = typeof _settings[_item.messageKey] !== 'undefined' ?
88
+          _settings[_item.messageKey] :
89
+          _item.defaultValue;
90 90
 
91
-        clayItem.set(value);
91
+        clayItem.set(typeof value !== 'undefined' ? value : '');
92 92
 
93 93
         $container.add(clayItem.$element);
94 94
       }
... ...
@@ -154,12 +154,12 @@ function ClayConfig(settings, config, $rootContainer, meta) {
154 154
   };
155 155
 
156 156
   /**
157
-   * @param {string} appKey
157
+   * @param {string} messageKey
158 158
    * @returns {ClayItem}
159 159
    */
160
-  self.getItemByAppKey = function(appKey) {
161
-    _checkBuilt('getItemByAppKey');
162
-    return _itemsByAppKey[appKey];
160
+  self.getItemByMessageKey = function(messageKey) {
161
+    _checkBuilt('getItemByMessageKey');
162
+    return _itemsByMessageKey[messageKey];
163 163
   };
164 164
 
165 165
   /**
... ...
@@ -182,6 +182,17 @@ function ClayConfig(settings, config, $rootContainer, meta) {
182 182
     });
183 183
   };
184 184
 
185
+  /**
186
+   * @param {string} group
187
+   * @returns {Array.<ClayItem>}
188
+   */
189
+  self.getItemsByGroup = function(group) {
190
+    _checkBuilt('getItemsByGroup');
191
+    return _items.filter(function(item) {
192
+      return item.config.group === group;
193
+    });
194
+  };
195
+
185 196
   /**
186 197
    * @returns {Object}
187 198
    */
... ...
@@ -190,13 +201,13 @@ function ClayConfig(settings, config, $rootContainer, meta) {
190 201
 
191 202
     _settings = {};
192 203
 
193
-    _.eachObj(_itemsByAppKey, function(appKey, item) {
194
-      _settings[appKey] = {
204
+    _.eachObj(_itemsByMessageKey, function(messageKey, item) {
205
+      _settings[messageKey] = {
195 206
         value: item.get()
196 207
       };
197 208
 
198 209
       if (item.precision) {
199
-        _settings[appKey].precision = item.precision;
210
+        _settings[messageKey].precision = item.precision;
200 211
       }
201 212
     });
202 213
     return _settings;
Browse code

pebble-clay

Louis authored on26/10/2021 23:21:03
Showing1 changed files
... ...
@@ -5,7 +5,7 @@
5 5
  * @typedef {Object} Clay~ConfigItem
6 6
  * @property {string} type
7 7
  * @property {string|boolean|number} defaultValue
8
- * @property {string} [messageKey]
8
+ * @property {string} [appKey]
9 9
  * @property {string} [id]
10 10
  * @property {string} [label]
11 11
  * @property {Object} [attributes]
... ...
@@ -36,7 +36,7 @@ function ClayConfig(settings, config, $rootContainer, meta) {
36 36
   var _settings = _.copyObj(settings);
37 37
   var _items;
38 38
   var _itemsById;
39
-  var _itemsByMessageKey;
39
+  var _itemsByAppKey;
40 40
   var _isBuilt;
41 41
 
42 42
   /**
... ...
@@ -47,7 +47,7 @@ function ClayConfig(settings, config, $rootContainer, meta) {
47 47
   function _initializeItems() {
48 48
     _items = [];
49 49
     _itemsById = {};
50
-    _itemsByMessageKey = {};
50
+    _itemsByAppKey = {};
51 51
     _isBuilt = false;
52 52
   }
53 53
 
... ...
@@ -77,18 +77,18 @@ function ClayConfig(settings, config, $rootContainer, meta) {
77 77
           _itemsById[_item.id] = clayItem;
78 78
         }
79 79
 
80
-        if (_item.messageKey) {
81
-          _itemsByMessageKey[_item.messageKey] = clayItem;
80
+        if (_item.appKey) {
81
+          _itemsByAppKey[_item.appKey] = clayItem;
82 82
         }
83 83
 
84 84
         _items.push(clayItem);
85 85
 
86 86
         // set the value of the item via the manipulator to ensure consistency
87
-        var value = typeof _settings[_item.messageKey] !== 'undefined' ?
88
-          _settings[_item.messageKey] :
89
-          _item.defaultValue;
87
+        var value = typeof _settings[_item.appKey] !== 'undefined' ?
88
+          _settings[_item.appKey] :
89
+          (_item.defaultValue || '');
90 90
 
91
-        clayItem.set(typeof value !== 'undefined' ? value : '');
91
+        clayItem.set(value);
92 92
 
93 93
         $container.add(clayItem.$element);
94 94
       }
... ...
@@ -154,12 +154,12 @@ function ClayConfig(settings, config, $rootContainer, meta) {
154 154
   };
155 155
 
156 156
   /**
157
-   * @param {string} messageKey
157
+   * @param {string} appKey
158 158
    * @returns {ClayItem}
159 159
    */
160
-  self.getItemByMessageKey = function(messageKey) {
161
-    _checkBuilt('getItemByMessageKey');
162
-    return _itemsByMessageKey[messageKey];
160
+  self.getItemByAppKey = function(appKey) {
161
+    _checkBuilt('getItemByAppKey');
162
+    return _itemsByAppKey[appKey];
163 163
   };
164 164
 
165 165
   /**
... ...
@@ -182,17 +182,6 @@ function ClayConfig(settings, config, $rootContainer, meta) {
182 182
     });
183 183
   };
184 184
 
185
-  /**
186
-   * @param {string} group
187
-   * @returns {Array.<ClayItem>}
188
-   */
189
-  self.getItemsByGroup = function(group) {
190
-    _checkBuilt('getItemsByGroup');
191
-    return _items.filter(function(item) {
192
-      return item.config.group === group;
193
-    });
194
-  };
195
-
196 185
   /**
197 186
    * @returns {Object}
198 187
    */
... ...
@@ -201,13 +190,13 @@ function ClayConfig(settings, config, $rootContainer, meta) {
201 190
 
202 191
     _settings = {};
203 192
 
204
-    _.eachObj(_itemsByMessageKey, function(messageKey, item) {
205
-      _settings[messageKey] = {
193
+    _.eachObj(_itemsByAppKey, function(appKey, item) {
194
+      _settings[appKey] = {
206 195
         value: item.get()
207 196
       };
208 197
 
209 198
       if (item.precision) {
210
-        _settings[messageKey].precision = item.precision;
199
+        _settings[appKey].precision = item.precision;
211 200
       }
212 201
     });
213 202
     return _settings;
Louis authored on25/08/2018 23:51:28
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,314 @@
1
+'use strict';
2
+
3
+/**
4
+ * A Clay config Item
5
+ * @typedef {Object} Clay~ConfigItem
6
+ * @property {string} type
7
+ * @property {string|boolean|number} defaultValue
8
+ * @property {string} [messageKey]
9
+ * @property {string} [id]
10
+ * @property {string} [label]
11
+ * @property {Object} [attributes]
12
+ * @property {Array} [options]
13
+ * @property {Array} [items]
14
+ * @property {Array} [capabilities]
15
+ */
16
+
17
+var HTML = require('../vendor/minified').HTML;
18
+var _ = require('../vendor/minified')._;
19
+var ClayItem = require('./clay-item');
20
+var utils = require('../lib/utils');
21
+var ClayEvents = require('./clay-events');
22
+var componentStore = require('./component-registry');
23
+var manipulators = require('./manipulators');
24
+
25
+/**
26
+ * @extends ClayEvents
27
+ * @param {Object} settings - setting that were set from a previous session
28
+ * @param {Array|Object} config
29
+ * @param {M} $rootContainer
30
+ * @param {Object} meta
31
+ * @constructor
32
+ */
33
+function ClayConfig(settings, config, $rootContainer, meta) {
34
+  var self = this;
35
+
36
+  var _settings = _.copyObj(settings);
37
+  var _items;
38
+  var _itemsById;
39
+  var _itemsByMessageKey;
40
+  var _isBuilt;
41
+
42
+  /**
43
+   * Initialize the item arrays and objects
44
+   * @private
45
+   * @return {void}
46
+   */
47
+  function _initializeItems() {
48
+    _items = [];
49
+    _itemsById = {};
50
+    _itemsByMessageKey = {};
51
+    _isBuilt = false;
52
+  }
53
+
54
+  /**
55
+   * Add item(s) to the config
56
+   * @param {Clay~ConfigItem|Array} item
57
+   * @param {M} $container
58
+   * @return {void}
59
+   */
60
+  function _addItems(item, $container) {
61
+    if (Array.isArray(item)) {
62
+      item.forEach(function(item) {
63
+        _addItems(item, $container);
64
+      });
65
+    } else if (utils.includesCapability(meta.activeWatchInfo, item.capabilities)) {
66
+      if (item.type === 'section') {
67
+        var $wrapper = HTML('<div class="section">');
68
+        $container.add($wrapper);
69
+        _addItems(item.items, $wrapper);
70
+      } else {
71
+        var _item = _.copyObj(item);
72
+        _item.clayId = _items.length;
73
+
74
+        var clayItem = new ClayItem(_item).initialize(self);
75
+
76
+        if (_item.id) {
77
+          _itemsById[_item.id] = clayItem;
78
+        }
79
+
80
+        if (_item.messageKey) {
81
+          _itemsByMessageKey[_item.messageKey] = clayItem;
82
+        }
83
+
84
+        _items.push(clayItem);
85
+
86
+        // set the value of the item via the manipulator to ensure consistency
87
+        var value = typeof _settings[_item.messageKey] !== 'undefined' ?
88
+          _settings[_item.messageKey] :
89
+          _item.defaultValue;
90
+
91
+        clayItem.set(typeof value !== 'undefined' ? value : '');
92
+
93
+        $container.add(clayItem.$element);
94
+      }
95
+    }
96
+  }
97
+
98
+  /**
99
+   * Throws if the config has not been built yet.
100
+   * @param {string} fnName
101
+   * @returns {boolean}
102
+   * @private
103
+   */
104
+  function _checkBuilt(fnName) {
105
+    if (!_isBuilt) {
106
+      throw new Error(
107
+        'ClayConfig not built. build() must be run before ' +
108
+        'you can run ' + fnName + '()'
109
+      );
110
+    }
111
+    return true;
112
+  }
113
+
114
+  self.meta = meta;
115
+  self.$rootContainer = $rootContainer;
116
+
117
+  self.EVENTS = {
118
+    /**
119
+     * Called before framework has initialized. This is when you would attach your
120
+     * custom components.
121
+     * @const
122
+     */
123
+    BEFORE_BUILD: 'BEFORE_BUILD',
124
+
125
+    /**
126
+     * Called after the config has been parsed and all components have their initial
127
+     * value set
128
+     * @const
129
+     */
130
+    AFTER_BUILD: 'AFTER_BUILD',
131
+
132
+    /**
133
+     * Called if .build() is executed after the page has already been built and
134
+     * before the existing content is destroyed
135
+     * @const
136
+     */
137
+    BEFORE_DESTROY: 'BEFORE_DESTROY',
138
+
139
+    /**
140
+     * Called if .build() is executed after the page has already been built and after
141
+     * the existing content is destroyed
142
+     * @const
143
+     */
144
+    AFTER_DESTROY: 'AFTER_DESTROY'
145
+  };
146
+  utils.updateProperties(self.EVENTS, {writable: false});
147
+
148
+  /**
149
+   * @returns {Array.<ClayItem>}
150
+   */
151
+  self.getAllItems = function() {
152
+    _checkBuilt('getAllItems');
153
+    return _items;
154
+  };
155
+
156
+  /**
157
+   * @param {string} messageKey
158
+   * @returns {ClayItem}
159
+   */
160
+  self.getItemByMessageKey = function(messageKey) {
161
+    _checkBuilt('getItemByMessageKey');
162
+    return _itemsByMessageKey[messageKey];
163
+  };
164
+
165
+  /**
166
+   * @param {string} id
167
+   * @returns {ClayItem}
168
+   */
169
+  self.getItemById = function(id) {
170
+    _checkBuilt('getItemById');
171
+    return _itemsById[id];
172
+  };
173
+
174
+  /**
175
+   * @param {string} type
176
+   * @returns {Array.<ClayItem>}
177
+   */
178
+  self.getItemsByType = function(type) {
179
+    _checkBuilt('getItemsByType');
180
+    return _items.filter(function(item) {
181
+      return item.config.type === type;
182
+    });
183
+  };
184
+
185
+  /**
186
+   * @param {string} group
187
+   * @returns {Array.<ClayItem>}
188
+   */
189
+  self.getItemsByGroup = function(group) {
190
+    _checkBuilt('getItemsByGroup');
191
+    return _items.filter(function(item) {
192
+      return item.config.group === group;
193
+    });
194
+  };
195
+
196
+  /**
197
+   * @returns {Object}
198
+   */
199
+  self.serialize = function() {
200
+    _checkBuilt('serialize');
201
+
202
+    _settings = {};
203
+
204
+    _.eachObj(_itemsByMessageKey, function(messageKey, item) {
205
+      _settings[messageKey] = {
206
+        value: item.get()
207
+      };
208
+
209
+      if (item.precision) {
210
+        _settings[messageKey].precision = item.precision;
211
+      }
212
+    });
213
+    return _settings;
214
+  };
215
+
216
+  // @todo maybe don't do this and force the static method
217
+  self.registerComponent = ClayConfig.registerComponent;
218
+
219
+  /**
220
+   * Empties the root container
221
+   * @returns {ClayConfig}
222
+   */
223
+  self.destroy = function() {
224
+    var el = $rootContainer[0];
225
+    self.trigger(self.EVENTS.BEFORE_DESTROY);
226
+    while (el.firstChild) {
227
+      el.removeChild(el.firstChild);
228
+    }
229
+    _initializeItems();
230
+    self.trigger(self.EVENTS.AFTER_DESTROY);
231
+    return self;
232
+  };
233
+
234
+  /**
235
+   * Build the config page. This must be run before any of the get methods can be run
236
+   * If you call this method after the page has already been built, teh page will be
237
+   * destroyed and built again.
238
+   * @returns {ClayConfig}
239
+   */
240
+  self.build = function() {
241
+    if (_isBuilt) {
242
+      self.destroy();
243
+    }
244
+    self.trigger(self.EVENTS.BEFORE_BUILD);
245
+    _addItems(self.config, $rootContainer);
246
+    _isBuilt = true;
247
+    self.trigger(self.EVENTS.AFTER_BUILD);
248
+    return self;
249
+  };
250
+
251
+  _initializeItems();
252
+
253
+  // attach event methods
254
+  ClayEvents.call(self, $rootContainer);
255
+
256
+  // prevent external modifications of properties
257
+  utils.updateProperties(self, { writable: false, configurable: false });
258
+
259
+  // expose the config to allow developers to update it before the build is run
260
+  self.config = config;
261
+}
262
+
263
+/**
264
+ * Register a component to Clay. This must be called prior to .build();
265
+ * @param {Object} component - the clay component to register
266
+ * @param {string} component.name - the name of the component
267
+ * @param {string} component.template - HTML template to use for the component
268
+ * @param {string|Object} component.manipulator - methods to attach to the component
269
+ * @param {function} component.manipulator.set - set manipulator method
270
+ * @param {function} component.manipulator.get - get manipulator method
271
+ * @param {Object} [component.defaults] - template defaults
272
+ * @param {function} [component.initialize] - method to scaffold the component
273
+ * @return {boolean} - Returns true if component was registered correctly
274
+ */
275
+ClayConfig.registerComponent = function(component) {
276
+  var _component = _.copyObj(component);
277
+
278
+  if (componentStore[_component.name]) {
279
+    console.warn('Component: ' + _component.name +
280
+                 ' is already registered. If you wish to override the existing' +
281
+                 ' functionality, you must provide a new name');
282
+    return false;
283
+  }
284
+
285
+  if (typeof _component.manipulator === 'string') {
286
+    _component.manipulator = manipulators[component.manipulator];
287
+
288
+    if (!_component.manipulator) {
289
+      throw new Error('The manipulator: ' + component.manipulator +
290
+                      ' does not exist in the built-in manipulators.');
291
+    }
292
+  }
293
+
294
+  if (!_component.manipulator) {
295
+    throw new Error('The manipulator must be defined');
296
+  }
297
+
298
+  if (typeof _component.manipulator.set !== 'function' ||
299
+      typeof _component.manipulator.get !== 'function') {
300
+    throw new Error('The manipulator must have both a `get` and `set` method');
301
+  }
302
+
303
+  if (_component.style) {
304
+    var style = document.createElement('style');
305
+    style.type = 'text/css';
306
+    style.appendChild(document.createTextNode(_component.style));
307
+    document.head.appendChild(style);
308
+  }
309
+
310
+  componentStore[_component.name] = _component;
311
+  return true;
312
+};
313
+
314
+module.exports = ClayConfig;