not-bulma 1.0.46 → 1.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "not-bulma",
3
- "version": "1.0.46",
3
+ "version": "1.0.47",
4
4
  "description": "not-* family UI components on Bulma CSS Framework",
5
5
  "main": "src/index.js",
6
6
  "svelte": "src/index.js",
@@ -1,4 +1,4 @@
1
- import notPath from 'not-path';
1
+ import notPath from "not-path";
2
2
 
3
3
  /*
4
4
  https://github.com/TehShrike/is-mergeable-object
@@ -9,27 +9,29 @@ start of my code marked.
9
9
  */
10
10
 
11
11
  let isMergeableObject = function isMergeableObject(value) {
12
- return isNonNullObject(value) && !isSpecial(value);
12
+ return isNonNullObject(value) && !isSpecial(value);
13
13
  };
14
14
 
15
15
  function isNonNullObject(value) {
16
- return !!value && typeof value === 'object';
16
+ return !!value && typeof value === "object";
17
17
  }
18
18
 
19
19
  function isSpecial(value) {
20
- var stringValue = Object.prototype.toString.call(value);
20
+ var stringValue = Object.prototype.toString.call(value);
21
21
 
22
- return stringValue === '[object RegExp]' ||
23
- stringValue === '[object Date]' ||
24
- isReactElement(value);
22
+ return (
23
+ stringValue === "[object RegExp]" ||
24
+ stringValue === "[object Date]" ||
25
+ isReactElement(value)
26
+ );
25
27
  }
26
28
 
27
29
  // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
28
- var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
29
- var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
30
+ var canUseSymbol = typeof Symbol === "function" && Symbol.for;
31
+ var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for("react.element") : 0xeac7;
30
32
 
31
33
  function isReactElement(value) {
32
- return value.$$typeof === REACT_ELEMENT_TYPE;
34
+ return value.$$typeof === REACT_ELEMENT_TYPE;
33
35
  }
34
36
 
35
37
  /*
@@ -58,618 +60,680 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
58
60
  THE SOFTWARE.
59
61
  */
60
62
 
61
-
62
63
  function emptyTarget(val) {
63
- return Array.isArray(val) ? [] : {};
64
+ return Array.isArray(val) ? [] : {};
64
65
  }
65
66
 
66
67
  function cloneUnlessOtherwiseSpecified(value, optionsArgument) {
67
- var clone = !optionsArgument || optionsArgument.clone !== false;
68
+ var clone = !optionsArgument || optionsArgument.clone !== false;
68
69
 
69
- return (clone && isMergeableObject(value)) ?
70
- deepmerge(emptyTarget(value), value, optionsArgument) :
71
- value;
70
+ return clone && isMergeableObject(value)
71
+ ? deepmerge(emptyTarget(value), value, optionsArgument)
72
+ : value;
72
73
  }
73
74
 
74
75
  function defaultArrayMerge(target, source, optionsArgument) {
75
- return target.concat(source).map(function(element) {
76
- return cloneUnlessOtherwiseSpecified(element, optionsArgument);
77
- });
76
+ return target.concat(source).map(function (element) {
77
+ return cloneUnlessOtherwiseSpecified(element, optionsArgument);
78
+ });
78
79
  }
79
80
 
80
81
  function mergeObject(target, source, optionsArgument) {
81
- var destination = {};
82
- if (isMergeableObject(target)) {
83
- Object.keys(target).forEach(function(key) {
84
- destination[key] = cloneUnlessOtherwiseSpecified(target[key], optionsArgument);
85
- });
86
- }
87
- Object.keys(source).forEach(function(key) {
88
- if (!isMergeableObject(source[key]) || !target[key]) {
89
- destination[key] = cloneUnlessOtherwiseSpecified(source[key], optionsArgument);
90
- } else {
91
- destination[key] = deepmerge(target[key], source[key], optionsArgument);
82
+ var destination = {};
83
+ if (isMergeableObject(target)) {
84
+ Object.keys(target).forEach(function (key) {
85
+ destination[key] = cloneUnlessOtherwiseSpecified(
86
+ target[key],
87
+ optionsArgument
88
+ );
89
+ });
92
90
  }
93
- });
94
- return destination;
91
+ Object.keys(source).forEach(function (key) {
92
+ if (!isMergeableObject(source[key]) || !target[key]) {
93
+ destination[key] = cloneUnlessOtherwiseSpecified(
94
+ source[key],
95
+ optionsArgument
96
+ );
97
+ } else {
98
+ destination[key] = deepmerge(
99
+ target[key],
100
+ source[key],
101
+ optionsArgument
102
+ );
103
+ }
104
+ });
105
+ return destination;
95
106
  }
96
107
 
97
108
  function deepmerge(target, source, optionsArgument) {
98
- var sourceIsArray = Array.isArray(source);
99
- var targetIsArray = Array.isArray(target);
100
- var options = optionsArgument || {
101
- arrayMerge: defaultArrayMerge
102
- };
103
- var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
104
-
105
- if (!sourceAndTargetTypesMatch) {
106
- return cloneUnlessOtherwiseSpecified(source, optionsArgument);
107
- } else if (sourceIsArray) {
108
- var arrayMerge = options.arrayMerge || defaultArrayMerge;
109
- return arrayMerge(target, source, optionsArgument);
110
- } else {
111
- return mergeObject(target, source, optionsArgument);
112
- }
109
+ var sourceIsArray = Array.isArray(source);
110
+ var targetIsArray = Array.isArray(target);
111
+ var options = optionsArgument || {
112
+ arrayMerge: defaultArrayMerge,
113
+ };
114
+ var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
115
+
116
+ if (!sourceAndTargetTypesMatch) {
117
+ return cloneUnlessOtherwiseSpecified(source, optionsArgument);
118
+ } else if (sourceIsArray) {
119
+ var arrayMerge = options.arrayMerge || defaultArrayMerge;
120
+ return arrayMerge(target, source, optionsArgument);
121
+ } else {
122
+ return mergeObject(target, source, optionsArgument);
123
+ }
113
124
  }
114
125
 
115
126
  deepmerge.all = function deepmergeAll(array, optionsArgument) {
116
- if (!Array.isArray(array)) {
117
- throw new Error('first argument should be an array');
118
- }
127
+ if (!Array.isArray(array)) {
128
+ throw new Error("first argument should be an array");
129
+ }
119
130
 
120
- return array.reduce(function(prev, next) {
121
- return deepmerge(prev, next, optionsArgument);
122
- }, {});
131
+ return array.reduce(function (prev, next) {
132
+ return deepmerge(prev, next, optionsArgument);
133
+ }, {});
123
134
  };
124
135
 
125
-
126
136
  class notCommon {
127
- static MANAGER = null;
128
- static LOG = 'console';
129
-
130
- static deepMerge = deepmerge;
131
-
132
- static isError(e) {
133
- return (e instanceof Error) || (Object.prototype.hasOwnProperty.call(e, 'status') && e.status === 'error');
134
- }
135
-
136
- static TZ_OFFSET = (new Date().getTimezoneOffset() / 60) * -1;
137
- static DEV_ENV = 'production';
138
- static ENV_TYPE = window.NOT_ENV_TYPE ? window.NOT_ENV_TYPE : this.DEV_ENV;
139
- static NOOP = () => {};
140
-
141
- static mute() {
142
- this.ENV_TYPE = 'production';
143
- }
144
-
145
- static pad(n) {
146
- return n < 10 ? '0' + n : n;
147
- }
148
- /**
149
- * Returns today Date object without hours, minutes, seconds
150
- * @return {number} current date with 00:00:00 in ms of unix time
151
- */
152
- static getTodayDate(){
153
- let t = new Date();
154
- return (new Date(t.getFullYear(), t.getMonth(),t.getDate())).getTime();
155
- }
156
-
157
-
158
- /**
159
- * Returns true if object has field of name
160
- * @param {object} obj some object
161
- * @param {string} name field name
162
- * @return {boolean} if object contains field with name
163
- **/
164
- static objHas(obj, name){
165
- return Object.prototype.hasOwnProperty.call(obj, name);
166
- }
167
-
168
- /**
169
- * Copies object to secure it from changes
170
- * @param {object} obj original object
171
- * @return {object} copy of object
172
- **/
173
- static copyObj(obj){
174
- return JSON.parse(JSON.stringify(obj));
175
- }
176
-
177
- /**
178
- * Copies object to secure it from changes
179
- * @param {object} obj original object
180
- * @return {object} copy of object
181
- **/
182
- static partCopyObj(obj, list){
183
- let partObj = Object.keys(obj).reduce((prev, curr)=>{
184
- if(list.includes(curr)){
185
- prev[curr] = obj[curr];
186
- }
187
- return prev;
188
- }, {});
189
- return JSON.parse(JSON.stringify(partObj));
190
- }
191
-
192
-
193
- /**
194
- * Test argument type to be 'function'
195
- * @param {any} func possible function
196
- * @return {boolean} if this is a function
197
- **/
198
- static isFunc(func){
199
- return typeof func === 'function';
200
- }
201
-
202
- /**
203
- * Returns true if argument is Async function
204
- * @param {function} func to test
205
- * @return {boolean} if this function is constructed as AsyncFunction
206
- **/
207
- static isAsync(func){
208
- return func.constructor.name === 'AsyncFunction';
209
- }
210
-
211
- /**
212
- * Executes method of object in appropriate way inside Promise
213
- * @param {object} obj original object
214
- * @param {string} name method name to execute
215
- * @param {Array} params array of params
216
- * @return {Promise} results of method execution
217
- **/
218
- static async executeObjectFunction(obj, name, params){
219
- if (obj){
220
- const proc = notPath.get(':' + name, obj);
221
- if(notCommon.isFunc(proc)){
222
- if(notCommon.isAsync(proc)){
223
- return await proc(...params);
224
- }else{
225
- return proc(...params);
137
+ static MANAGER = null;
138
+ static LOG = "console";
139
+
140
+ static deepMerge = deepmerge;
141
+
142
+ static isError(e) {
143
+ return (
144
+ e instanceof Error ||
145
+ (Object.prototype.hasOwnProperty.call(e, "status") &&
146
+ e.status === "error")
147
+ );
148
+ }
149
+
150
+ static TZ_OFFSET = (new Date().getTimezoneOffset() / 60) * -1;
151
+ static DEV_ENV = "production";
152
+ static ENV_TYPE = window.NOT_ENV_TYPE ? window.NOT_ENV_TYPE : this.DEV_ENV;
153
+ static NOOP = () => {};
154
+
155
+ static mute() {
156
+ this.ENV_TYPE = "production";
157
+ }
158
+
159
+ static pad(n) {
160
+ return n < 10 ? "0" + n : n;
161
+ }
162
+ /**
163
+ * Returns today Date object without hours, minutes, seconds
164
+ * @return {number} current date with 00:00:00 in ms of unix time
165
+ */
166
+ static getTodayDate() {
167
+ let t = new Date();
168
+ return new Date(t.getFullYear(), t.getMonth(), t.getDate()).getTime();
169
+ }
170
+
171
+ /**
172
+ * Returns true if object has field of name
173
+ * @param {object} obj some object
174
+ * @param {string} name field name
175
+ * @return {boolean} if object contains field with name
176
+ **/
177
+ static objHas(obj, name) {
178
+ return Object.prototype.hasOwnProperty.call(obj, name);
179
+ }
180
+
181
+ /**
182
+ * Copies object to secure it from changes
183
+ * @param {object} obj original object
184
+ * @return {object} copy of object
185
+ **/
186
+ static copyObj(obj) {
187
+ return JSON.parse(JSON.stringify(obj));
188
+ }
189
+
190
+ /**
191
+ * Copies object to secure it from changes
192
+ * @param {object} obj original object
193
+ * @return {object} copy of object
194
+ **/
195
+ static partCopyObj(obj, list) {
196
+ let partObj = Object.keys(obj).reduce((prev, curr) => {
197
+ if (list.includes(curr)) {
198
+ prev[curr] = obj[curr];
199
+ }
200
+ return prev;
201
+ }, {});
202
+ return JSON.parse(JSON.stringify(partObj));
203
+ }
204
+
205
+ /**
206
+ * Test argument type to be 'function'
207
+ * @param {any} func possible function
208
+ * @return {boolean} if this is a function
209
+ **/
210
+ static isFunc(func) {
211
+ return typeof func === "function";
212
+ }
213
+
214
+ /**
215
+ * Returns true if argument is Async function
216
+ * @param {function} func to test
217
+ * @return {boolean} if this function is constructed as AsyncFunction
218
+ **/
219
+ static isAsync(func) {
220
+ return func.constructor.name === "AsyncFunction";
221
+ }
222
+
223
+ /**
224
+ * Executes method of object in appropriate way inside Promise
225
+ * @param {object} obj original object
226
+ * @param {string} name method name to execute
227
+ * @param {Array} params array of params
228
+ * @return {Promise} results of method execution
229
+ **/
230
+ static async executeObjectFunction(obj, name, params) {
231
+ if (obj) {
232
+ const proc = notPath.get(":" + name, obj);
233
+ if (notCommon.isFunc(proc)) {
234
+ if (notCommon.isAsync(proc)) {
235
+ return await proc(...params);
236
+ } else {
237
+ return proc(...params);
238
+ }
239
+ }
226
240
  }
227
- }
228
- }
229
- }
230
-
231
- /**
232
- * Executes method of object in apropriate way inside Promise
233
- * @param {Object} from original object
234
- * @param {Object} name method name to execute
235
- * @param {Array} list array of params
236
- * @return {Promise} results of method execution
237
- **/
238
- static mapBind(from, to, list){
239
- list.forEach((item)=>{
240
- if (typeof from[item] === 'function') {
241
- to[item] = from[item].bind(from);
242
- }
243
- });
244
- }
241
+ }
245
242
 
243
+ /**
244
+ * Executes method of object in apropriate way inside Promise
245
+ * @param {Object} from original object
246
+ * @param {Object} name method name to execute
247
+ * @param {Array} list array of params
248
+ * @return {Promise} results of method execution
249
+ **/
250
+ static mapBind(from, to, list) {
251
+ list.forEach((item) => {
252
+ if (typeof from[item] === "function") {
253
+ to[item] = from[item].bind(from);
254
+ }
255
+ });
256
+ }
246
257
 
247
- static isClass(fn){
248
- return /^\s*class/.test(fn.toString());
249
- }
258
+ static isClass(fn) {
259
+ return /^\s*class/.test(fn.toString());
260
+ }
250
261
 
251
- static detectType(testie){
252
- if (typeof testie !== 'function') {
253
- return typeof testie;
254
- } else {
255
- if (this.isClass(testie)) {
256
- return 'class';
257
- } else {
258
- return 'function';
259
- }
260
- }
261
- }
262
-
263
- //Проверка является ли переменная массивом
264
- static isArray(data) {
265
- return (typeof data == "object") && (data instanceof Array);
266
- }
267
-
268
- static localIsoDate(date) {
269
- date = date || new Date;
270
- let localIsoString = date.getFullYear() + '-' +
271
- this.pad(date.getMonth() + 1) + '-' +
272
- this.pad(date.getDate()) + 'T' +
273
- this.pad(date.getHours()) + ':' +
274
- this.pad(date.getMinutes()) + ':' +
275
- this.pad(date.getSeconds());
276
- return localIsoString;
277
- }
278
-
279
- static getToday() {
280
- let today = new Date;
281
- let date = today.getFullYear() + '-' + this.pad(today.getMonth() + 1) + '-' + this.pad(today.getDate());
282
- return date;
283
- }
284
-
285
- static backlog = [];
286
-
287
- static backlogAdd(msg, type = 'log'){
288
- if(this.get('backlog') === true){
289
- this.backlog.push({ msg, type});
290
- }
291
- }
292
-
293
- static dumpBacklog(){
294
- while(this.backlog.length){
295
- let row = this.backlog.shift();
296
- window[this.LOG][row.type](...row.msg);
297
- }
298
- }
299
-
300
- static logMsg() {
301
- let now = this.localIsoDate();
302
- // eslint-disable-next-line no-console
303
- window[this.LOG].log(`[${now}]: `, ...arguments);
304
- this.backlogAdd([`[${now}]: `, ...arguments], 'log');
305
- }
306
-
307
- static log(){
308
- this.logMsg(...arguments);
309
- }
310
-
311
- static createLogger(prefix){
312
- return {
313
- log: this.genLogMsg(prefix),
314
- error: this.genLogError(prefix),
315
- debug: this.genLogDebug(prefix),
316
- report: this.report
317
- };
318
- }
319
-
320
- //Генерация метода вывода сообщений в консоль с указанием префикса.
321
- static genLogMsg(prefix) {
322
- return function(){ //not arrow bc of arguments special var is not available in arrow functions
323
- let now = notCommon.localIsoDate();
324
- // eslint-disable-next-line no-console
325
- window[notCommon.LOG].log(`[${now}]: ${prefix}::`, ...arguments);
326
- notCommon.backlogAdd([`[${now}]: ${prefix}::`, ...arguments], 'log');
327
- };
328
- }
329
-
330
- /**
331
- * Определяет является ли окружение окружением разработки
332
- * @returns {boolean} true если это запущено в окружении разработки
333
- **/
334
- static isDev() {
335
- return this.ENV_TYPE === this.DEV_ENV;
336
- }
337
-
338
- static debug(){
339
- if (this.isDev()) {
340
- return this.logMsg(...arguments);
341
- } else {
342
- return this.NOOP;
262
+ static detectType(testie) {
263
+ if (typeof testie !== "function") {
264
+ return typeof testie;
265
+ } else {
266
+ if (this.isClass(testie)) {
267
+ return "class";
268
+ } else {
269
+ return "function";
270
+ }
271
+ }
343
272
  }
344
- }
345
273
 
346
- static genLogDebug(prefix) {
347
- if (this.isDev()) {
348
- return this.genLogMsg(prefix);
349
- } else {
350
- return this.NOOP;
351
- }
352
- }
353
-
354
- static error(){
355
- this.logError(...arguments);
356
- }
357
-
358
- //Функция вывода сообщения об ошибке
359
- static logError() {
360
- let now = this.localIsoDate();
361
- // eslint-disable-next-line no-console
362
- window[this.LOG].error(`[${now}]: `, ...arguments);
363
- this.backlogAdd([`[${now}]: `, ...arguments], 'error');
364
- }
365
-
366
- static genLogError(prefix) {
367
- return function(){//do not change to arrow function, bc of arguments
368
- let now = notCommon.localIsoDate();
369
- // eslint-disable-next-line no-console
370
- window[notCommon.LOG].error(`[${now}]: ${prefix}::`, ...arguments);
371
- notCommon.backlogAdd([`[${now}]: ${prefix}::`, ...arguments], 'error');
372
- };
373
- }
374
-
375
- static report(e) {
376
- if (this.getApp()) {
377
- let reporter = this.getApp().getService('nsErrorReporter');
378
- if (reporter) {
379
- reporter.report(e).catch(this.error.bind(this));
380
- }
381
- } else {
382
- if (!this.get('production')) {
383
- this.error(...arguments);
384
- }
385
- }
386
- }
387
-
388
- static trace() {
389
- if (!this.get('production')) {
390
- this.trace(...arguments);
391
- }
392
- }
393
-
394
- static trimBackslash(str){
395
- if(str.indexOf('/') === 0){
396
- str = str.substring(1);
397
- }
398
- if(str[str.length - 1] === '/'){
399
- str = str.substring(0, str.length - 1);
400
- }
401
- return str;
402
- }
403
-
404
- /**
405
- * Builds URL with structure like prefix/module/model/id/action
406
- * If some part absent or set to false it will be excluded from result
407
- *
408
- * @return {string} url path
409
- */
410
- static buildURL({ prefix, module, model, id, action }){
411
- let url = ['/'];
412
- if(prefix) { url.push(encodeURIComponent(this.trimBackslash(prefix)));}
413
- if(module) { url.push(encodeURIComponent(this.trimBackslash(module)));}
414
- if(model) { url.push(encodeURIComponent(this.trimBackslash(model)));}
415
- if(id) { url.push(encodeURIComponent(this.trimBackslash(id))); }
416
- if(action) { url.push(encodeURIComponent(this.trimBackslash(action))); }
417
- url = url.filter(el => el !== '' );
418
- return url.join('/').replace(/\/\//g, '/');
419
- }
420
-
421
-
422
- static capitalizeFirstLetter(name) {
423
- return name.charAt(0).toUpperCase() + name.slice(1);
424
- }
425
-
426
- static lowerFirstLetter(string) {
427
- return string.charAt(0).toLowerCase() + string.slice(1);
428
- }
429
-
430
- static strLengthCap(str, MAX_TITLE_LENGTH = 50, POST_FIX = '...'){
431
- if(str.length > MAX_TITLE_LENGTH){
432
- return str.substr(0, MAX_TITLE_LENGTH) + POST_FIX;
433
- }else{
434
- return str;
435
- }
436
- }
437
-
438
- static escapeHtml(unsafe) {
439
- return unsafe
440
- .replace(/&/g, '&amp;')
441
- .replace(/</g, '&lt;')
442
- .replace(/>/g, '&gt;')
443
- .replace(/"/g, '&quot;')
444
- .replace(/'/g, '&#039;');
445
- }
446
-
447
- static startApp(starter) {
448
- document.addEventListener('DOMContentLoaded', starter);
449
- }
450
-
451
- static getApp() {
452
- return this.get('app');
453
- }
454
-
455
- static extendAppConfig(conf, conf2) {
456
- return this.deepMerge(conf, conf2);
457
- }
458
-
459
- static absorbModule() {
460
- let defaultConf, //app options
461
- mod, //module options
462
- targets = {}; //various collections
463
- if(arguments.length == 1){
464
- targets = {...arguments[0]};
465
- if(Object.hasOwnProperty.call(arguments[0], 'defaultConf')){
466
- defaultConf = arguments[0].defaultConf;
467
- delete targets.defaultConf;
468
- }
469
- if(Object.hasOwnProperty.call(arguments[0], 'mod')){
470
- mod = arguments[0].mod;
471
- delete targets.mod;
472
- }
473
- }else{
474
- this.log('WARNING: absorbModule format obsoleted, use object {defaultConf, mod, services, uis, wsc, etc}');
475
- defaultConf = arguments[0];
476
- mod = arguments[1];
477
- if(arguments.length > 2){targets.services = arguments[2];}
478
- if(arguments.length > 3){targets.uis = arguments[3];}
479
- if(arguments.length > 4){targets.wcs = arguments[4];}
480
- }
481
- for (let prop in mod) {
482
- //add manifest to other
483
- if(prop === 'manifest'){
484
- defaultConf = this.extendAppConfig(defaultConf, mod.manifest);
485
- continue;
486
- }
487
- if(typeof this.get(`absorb.${prop}`) === 'function'){
488
- if(!Object.prototype.hasOwnProperty.call(targets, prop)){
489
- targets[prop] = {};
490
- this.log(`WARNING: no accamulator object provided for '${prop}' collection`);
274
+ //Проверка является ли переменная массивом
275
+ static isArray(data) {
276
+ return typeof data == "object" && data instanceof Array;
277
+ }
278
+
279
+ static localIsoDate(date) {
280
+ date = date || new Date();
281
+ let localIsoString =
282
+ date.getFullYear() +
283
+ "-" +
284
+ this.pad(date.getMonth() + 1) +
285
+ "-" +
286
+ this.pad(date.getDate()) +
287
+ "T" +
288
+ this.pad(date.getHours()) +
289
+ ":" +
290
+ this.pad(date.getMinutes()) +
291
+ ":" +
292
+ this.pad(date.getSeconds());
293
+ return localIsoString;
294
+ }
295
+
296
+ static getToday() {
297
+ let today = new Date();
298
+ let date =
299
+ today.getFullYear() +
300
+ "-" +
301
+ this.pad(today.getMonth() + 1) +
302
+ "-" +
303
+ this.pad(today.getDate());
304
+ return date;
305
+ }
306
+
307
+ static backlog = [];
308
+
309
+ static backlogAdd(msg, type = "log") {
310
+ if (this.get("backlog") === true) {
311
+ this.backlog.push({ msg, type });
491
312
  }
492
- this.get(`absorb.${prop}`)(targets[prop], mod[prop]);
493
- }else if(prop.indexOf('nc') === 0){
494
- if(!Object.prototype.hasOwnProperty.call(defaultConf, 'controllers')){
495
- defaultConf.controllers = {};
313
+ }
314
+
315
+ static dumpBacklog() {
316
+ while (this.backlog.length) {
317
+ let row = this.backlog.shift();
318
+ window[this.LOG][row.type](...row.msg);
496
319
  }
497
- defaultConf.controllers[prop] = mod[prop];
498
- }else {
499
- //in case of some other stuff presented, isolating it in special var
500
- if(!Object.prototype.hasOwnProperty.call(window, 'notEnv')){
501
- window.notEnv = {};
320
+ }
321
+
322
+ static logMsg() {
323
+ let now = this.localIsoDate();
324
+ // eslint-disable-next-line no-console
325
+ window[this.LOG].log(`[${now}]: `, ...arguments);
326
+ this.backlogAdd([`[${now}]: `, ...arguments], "log");
327
+ }
328
+
329
+ static log() {
330
+ this.logMsg(...arguments);
331
+ }
332
+
333
+ static createLogger(prefix) {
334
+ return {
335
+ log: this.genLogMsg(prefix),
336
+ error: this.genLogError(prefix),
337
+ debug: this.genLogDebug(prefix),
338
+ report: this.report,
339
+ };
340
+ }
341
+
342
+ //Генерация метода вывода сообщений в консоль с указанием префикса.
343
+ static genLogMsg(prefix) {
344
+ return function () {
345
+ //not arrow bc of arguments special var is not available in arrow functions
346
+ let now = notCommon.localIsoDate();
347
+ // eslint-disable-next-line no-console
348
+ window[notCommon.LOG].log(`[${now}]: ${prefix}::`, ...arguments);
349
+ notCommon.backlogAdd(
350
+ [`[${now}]: ${prefix}::`, ...arguments],
351
+ "log"
352
+ );
353
+ };
354
+ }
355
+
356
+ /**
357
+ * Определяет является ли окружение окружением разработки
358
+ * @returns {boolean} true если это запущено в окружении разработки
359
+ **/
360
+ static isDev() {
361
+ return this.ENV_TYPE === this.DEV_ENV;
362
+ }
363
+
364
+ static debug() {
365
+ if (this.isDev()) {
366
+ return this.logMsg(...arguments);
367
+ } else {
368
+ return this.NOOP;
502
369
  }
503
- window.notEnv[prop] = mod[prop];
504
- }
505
370
  }
506
- return defaultConf;
507
- }
508
371
 
509
- static defineIfNotExists(obj, key, defaultValue) {
510
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
511
- obj[key] = defaultValue;
372
+ static genLogDebug(prefix) {
373
+ if (this.isDev()) {
374
+ return this.genLogMsg(prefix);
375
+ } else {
376
+ return this.NOOP;
377
+ }
512
378
  }
513
- }
514
379
 
515
- static registry = {};
380
+ static error() {
381
+ this.logError(...arguments);
382
+ }
516
383
 
517
- static register(key, val) {
518
- this.registry[key] = val;
519
- }
384
+ //Функция вывода сообщения об ошибке
385
+ static logError() {
386
+ let now = this.localIsoDate();
387
+ // eslint-disable-next-line no-console
388
+ window[this.LOG].error(`[${now}]: `, ...arguments);
389
+ this.backlogAdd([`[${now}]: `, ...arguments], "error");
390
+ }
391
+
392
+ static genLogError(prefix) {
393
+ return function () {
394
+ //do not change to arrow function, bc of arguments
395
+ let now = notCommon.localIsoDate();
396
+ // eslint-disable-next-line no-console
397
+ window[notCommon.LOG].error(`[${now}]: ${prefix}::`, ...arguments);
398
+ notCommon.backlogAdd(
399
+ [`[${now}]: ${prefix}::`, ...arguments],
400
+ "error"
401
+ );
402
+ };
403
+ }
404
+
405
+ static report(e) {
406
+ if (this.getApp()) {
407
+ let reporter = this.getApp().getService("nsErrorReporter");
408
+ if (reporter) {
409
+ reporter.report(e).catch(this.error.bind(this));
410
+ }
411
+ } else {
412
+ if (!this.get("production")) {
413
+ this.error(...arguments);
414
+ }
415
+ }
416
+ }
417
+
418
+ static trace() {
419
+ if (!this.get("production")) {
420
+ this.trace(...arguments);
421
+ }
422
+ }
423
+
424
+ static trimBackslash(str) {
425
+ if (str.indexOf("/") === 0) {
426
+ str = str.substring(1);
427
+ }
428
+ if (str[str.length - 1] === "/") {
429
+ str = str.substring(0, str.length - 1);
430
+ }
431
+ return str;
432
+ }
433
+
434
+ /**
435
+ * Builds URL with structure like prefix/module/model/id/action
436
+ * If some part absent or set to false it will be excluded from result
437
+ *
438
+ * @return {string} url path
439
+ */
440
+ static buildURL({ prefix, module, model, id, action }) {
441
+ let url = ["/"];
442
+ if (prefix) {
443
+ url.push(encodeURIComponent(this.trimBackslash(prefix)));
444
+ }
445
+ if (module) {
446
+ url.push(encodeURIComponent(this.trimBackslash(module)));
447
+ }
448
+ if (model) {
449
+ url.push(encodeURIComponent(this.trimBackslash(model)));
450
+ }
451
+ if (id) {
452
+ url.push(encodeURIComponent(this.trimBackslash(id)));
453
+ }
454
+ if (action) {
455
+ url.push(encodeURIComponent(this.trimBackslash(action)));
456
+ }
457
+ url = url.filter((el) => el !== "");
458
+ return url.join("/").replace(/\/\//g, "/");
459
+ }
460
+
461
+ static capitalizeFirstLetter(name) {
462
+ return name.charAt(0).toUpperCase() + name.slice(1);
463
+ }
464
+
465
+ static lowerFirstLetter(string) {
466
+ return string.charAt(0).toLowerCase() + string.slice(1);
467
+ }
468
+
469
+ static strLengthCap(str, MAX_TITLE_LENGTH = 50, POST_FIX = "...") {
470
+ if (str.length > MAX_TITLE_LENGTH) {
471
+ return str.substr(0, MAX_TITLE_LENGTH) + POST_FIX;
472
+ } else {
473
+ return str;
474
+ }
475
+ }
520
476
 
521
- static get(key) {
522
- return Object.prototype.hasOwnProperty.call(this.registry, key) ? this.registry[key] : null;
523
- }
477
+ static escapeHtml(unsafe) {
478
+ return unsafe
479
+ .replace(/&/g, "&amp;")
480
+ .replace(/</g, "&lt;")
481
+ .replace(/>/g, "&gt;")
482
+ .replace(/"/g, "&quot;")
483
+ .replace(/'/g, "&#039;");
484
+ }
485
+
486
+ static startApp(starter) {
487
+ document.addEventListener("DOMContentLoaded", starter);
488
+ }
524
489
 
525
- static moveItem(array, old_index, new_index) {
526
- if (new_index >= array.length) {
527
- var k = new_index - array.length;
528
- while ((k--) + 1) {
529
- array.push(undefined);
530
- }
490
+ static getApp() {
491
+ return this.get("app");
531
492
  }
532
- array.splice(new_index, 0, array.splice(old_index, 1)[0]);
533
- }
534
493
 
535
- static stripProxy(obj) {
536
- if (typeof obj !== 'undefined' && obj !== null) {
537
- if (obj.isProxy) {
538
- if (Array.isArray(obj)) {
539
- obj = Array.from(obj);
494
+ static extendAppConfig(conf, conf2) {
495
+ return this.deepMerge(conf, conf2);
496
+ }
497
+
498
+ static absorbModule() {
499
+ let defaultConf, //app options
500
+ mod, //module options
501
+ targets = {}; //various collections
502
+ if (arguments.length == 1) {
503
+ targets = { ...arguments[0] };
504
+ if (Object.hasOwnProperty.call(arguments[0], "defaultConf")) {
505
+ defaultConf = arguments[0].defaultConf;
506
+ delete targets.defaultConf;
507
+ }
508
+ if (Object.hasOwnProperty.call(arguments[0], "mod")) {
509
+ mod = arguments[0].mod;
510
+ delete targets.mod;
511
+ }
540
512
  } else {
541
- obj = Object.assign({}, obj);
513
+ this.log(
514
+ "WARNING: absorbModule format obsoleted, use object {defaultConf, mod, services, uis, wsc, etc}"
515
+ );
516
+ defaultConf = arguments[0];
517
+ mod = arguments[1];
518
+ if (arguments.length > 2) {
519
+ targets.services = arguments[2];
520
+ }
521
+ if (arguments.length > 3) {
522
+ targets.uis = arguments[3];
523
+ }
524
+ if (arguments.length > 4) {
525
+ targets.wcs = arguments[4];
526
+ }
527
+ }
528
+ for (let prop in mod) {
529
+ //add manifest to other
530
+ if (prop === "manifest") {
531
+ defaultConf = this.extendAppConfig(defaultConf, mod.manifest);
532
+ continue;
533
+ }
534
+ if (typeof this.get(`absorb.${prop}`) === "function") {
535
+ if (!Object.prototype.hasOwnProperty.call(targets, prop)) {
536
+ targets[prop] = {};
537
+ this.log(
538
+ `WARNING: no accamulator object provided for '${prop}' collection`
539
+ );
540
+ }
541
+ this.get(`absorb.${prop}`)(targets[prop], mod[prop]);
542
+ } else if (prop.indexOf("nc") === 0) {
543
+ if (
544
+ !Object.prototype.hasOwnProperty.call(
545
+ defaultConf,
546
+ "controllers"
547
+ )
548
+ ) {
549
+ defaultConf.controllers = {};
550
+ }
551
+ defaultConf.controllers[prop] = mod[prop];
552
+ } else {
553
+ //in case of some other stuff presented, isolating it in special var
554
+ if (!Object.prototype.hasOwnProperty.call(window, "notEnv")) {
555
+ window.notEnv = {};
556
+ }
557
+ window.notEnv[prop] = mod[prop];
558
+ }
559
+ }
560
+ return defaultConf;
561
+ }
562
+
563
+ static defineIfNotExists(obj, key, defaultValue) {
564
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
565
+ obj[key] = defaultValue;
542
566
  }
543
- for (let t in obj) {
544
- if (Object.prototype.hasOwnProperty.call(obj, t)) {
545
- obj[t] = this.stripProxy(obj[t]);
546
- }
567
+ }
568
+
569
+ static registry = {};
570
+
571
+ static register(key, val) {
572
+ this.registry[key] = val;
573
+ }
574
+
575
+ static get(key) {
576
+ return Object.prototype.hasOwnProperty.call(this.registry, key)
577
+ ? this.registry[key]
578
+ : null;
579
+ }
580
+
581
+ static moveItem(array, old_index, new_index) {
582
+ if (new_index >= array.length) {
583
+ var k = new_index - array.length;
584
+ while (k-- + 1) {
585
+ array.push(undefined);
586
+ }
547
587
  }
548
- }
588
+ array.splice(new_index, 0, array.splice(old_index, 1)[0]);
549
589
  }
550
- return obj;
551
- }
552
590
 
553
- static pipe(data /* feed data */ , funcs /* functions array */ ) {
554
- let result;
555
- for (let func of funcs) {
556
- result = func(result || data);
591
+ static stripProxy(obj) {
592
+ if (typeof obj !== "undefined" && obj !== null) {
593
+ if (obj.isProxy) {
594
+ if (Array.isArray(obj)) {
595
+ obj = Array.from(obj);
596
+ } else {
597
+ obj = Object.assign({}, obj);
598
+ }
599
+ for (let t in obj) {
600
+ if (Object.prototype.hasOwnProperty.call(obj, t)) {
601
+ obj[t] = this.stripProxy(obj[t]);
602
+ }
603
+ }
604
+ }
605
+ }
606
+ return obj;
557
607
  }
558
- return result;
559
- }
560
608
 
561
- static getAPI(type) {
562
- return this.getManager() ? this.getManager().getAPI(type) : null;
563
- }
609
+ static pipe(data /* feed data */, funcs /* functions array */) {
610
+ let result;
611
+ for (let func of funcs) {
612
+ result = func(result || data);
613
+ }
614
+ return result;
615
+ }
564
616
 
565
- static setManager(v) {
566
- this.MANAGER = v;
567
- }
617
+ static getAPI(type) {
618
+ return this.getManager() ? this.getManager().getAPI(type) : null;
619
+ }
568
620
 
569
- static getManager() {
570
- return this.MANAGER;
571
- }
621
+ static setManager(v) {
622
+ this.MANAGER = v;
623
+ }
572
624
 
573
- static getJSON(url){
574
- return fetch(url).then(response => response.json());
575
- }
625
+ static getManager() {
626
+ return this.MANAGER;
627
+ }
576
628
 
577
- static wait(sec){
578
- return new Promise((res)=>{
579
- setTimeout(res, sec * 1000);
580
- });
581
- }
629
+ static getJSON(url) {
630
+ return fetch(url).then((response) => response.json());
631
+ }
582
632
 
583
- static registerWidgetEvents(events){
584
- if(this.getApp()){
585
- Object.keys(events).forEach(eventName => {
586
- this.getApp().on(eventName, events[eventName]);
587
- });
633
+ static wait(sec) {
634
+ return new Promise((res) => {
635
+ setTimeout(res, sec * 1000);
636
+ });
588
637
  }
589
- }
590
- }
591
638
 
592
- function absorbServices(target, src){
593
- if (target){
594
- for(let serv in src){
595
- if(Object.prototype.hasOwnProperty.call(target, serv)){
596
- notCommon.logError(`services property duplication ${serv}`);
597
- }
598
- target[serv] = src[serv];
639
+ static registerWidgetEvents(events) {
640
+ if (this.getApp()) {
641
+ Object.keys(events).forEach((eventName) => {
642
+ this.getApp().on(eventName, events[eventName]);
643
+ });
644
+ }
645
+ }
646
+
647
+ static navigate(url) {
648
+ this.getApp() && this.getApp().getWorking("router").navigate(url);
599
649
  }
600
- }
601
650
  }
602
651
 
603
- function extendWSClient(wcs, wscName, wscOptions){
604
- if(!Object.prototype.hasOwnProperty.call(wcs, wscName)){
605
- wcs[wscName] = {
606
- connection: {},
607
- router: {
608
- routes:{}
609
- },
610
- messenger: {}
611
- };
612
- }
613
- let target = wcs[wscName];
614
- if(Object.prototype.hasOwnProperty.call(wscOptions, 'router')){
615
- if(Object.prototype.hasOwnProperty.call(wscOptions.router, 'routes')){
616
- for(let routeType in wscOptions.router.routes){
617
- if(!Object.prototype.hasOwnProperty.call(target.router.routes, routeType)){
618
- target.router.routes[routeType] = {};
652
+ function absorbServices(target, src) {
653
+ if (target) {
654
+ for (let serv in src) {
655
+ if (Object.prototype.hasOwnProperty.call(target, serv)) {
656
+ notCommon.logError(`services property duplication ${serv}`);
657
+ }
658
+ target[serv] = src[serv];
619
659
  }
620
- Object.assign(target.router.routes[routeType], {...wscOptions.router.routes[routeType]});
621
- }
622
- }
623
- }
624
- if(Object.prototype.hasOwnProperty.call(wscOptions, 'messenger')){
625
- Object.assign(target.messenger, {...wscOptions.messenger});
626
- }
627
- if(Object.prototype.hasOwnProperty.call(wscOptions, 'connection')){
628
- Object.assign(target.connection, {...wscOptions.connection});
629
- }
630
- for(let t of ['name', 'getToken', 'logger', 'identity', 'credentials']){
631
- if(Object.prototype.hasOwnProperty.call(wscOptions, t)){
632
- target[t] = wscOptions[t];
633
- }
634
- }
660
+ }
635
661
  }
636
662
 
637
- function absorbWSC(target, src){
638
- if (target){
639
- for(let wsClientName in src){
640
- extendWSClient(target, wsClientName, src[wsClientName]);
663
+ function extendWSClient(wcs, wscName, wscOptions) {
664
+ if (!Object.prototype.hasOwnProperty.call(wcs, wscName)) {
665
+ wcs[wscName] = {
666
+ connection: {},
667
+ router: {
668
+ routes: {},
669
+ },
670
+ messenger: {},
671
+ };
672
+ }
673
+ let target = wcs[wscName];
674
+ if (Object.prototype.hasOwnProperty.call(wscOptions, "router")) {
675
+ if (Object.prototype.hasOwnProperty.call(wscOptions.router, "routes")) {
676
+ for (let routeType in wscOptions.router.routes) {
677
+ if (
678
+ !Object.prototype.hasOwnProperty.call(
679
+ target.router.routes,
680
+ routeType
681
+ )
682
+ ) {
683
+ target.router.routes[routeType] = {};
684
+ }
685
+ Object.assign(target.router.routes[routeType], {
686
+ ...wscOptions.router.routes[routeType],
687
+ });
688
+ }
689
+ }
690
+ }
691
+ if (Object.prototype.hasOwnProperty.call(wscOptions, "messenger")) {
692
+ Object.assign(target.messenger, { ...wscOptions.messenger });
693
+ }
694
+ if (Object.prototype.hasOwnProperty.call(wscOptions, "connection")) {
695
+ Object.assign(target.connection, { ...wscOptions.connection });
696
+ }
697
+ for (let t of ["name", "getToken", "logger", "identity", "credentials"]) {
698
+ if (Object.prototype.hasOwnProperty.call(wscOptions, t)) {
699
+ target[t] = wscOptions[t];
700
+ }
641
701
  }
642
- }
643
702
  }
644
703
 
645
-
646
- function absorbUIs(target, src){
647
- if (target){
648
- for(let ui in src){
649
- if(Object.prototype.hasOwnProperty.call(target, ui)){
650
- notCommon.logError(`uis property duplication ${ui}`);
651
- }
652
- target[ui] = src[ui];
704
+ function absorbWSC(target, src) {
705
+ if (target) {
706
+ for (let wsClientName in src) {
707
+ extendWSClient(target, wsClientName, src[wsClientName]);
708
+ }
653
709
  }
654
- }
655
710
  }
656
711
 
657
-
658
- function absorbFields(target, src){
659
- if (target){
660
- for(let ui in src){
661
- if(Object.prototype.hasOwnProperty.call(target, ui)){
662
- notCommon.logError(`fields property duplication ${ui}`);
663
- }
664
- target[ui] = src[ui];
712
+ function absorbUIs(target, src) {
713
+ if (target) {
714
+ for (let ui in src) {
715
+ if (Object.prototype.hasOwnProperty.call(target, ui)) {
716
+ notCommon.logError(`uis property duplication ${ui}`);
717
+ }
718
+ target[ui] = src[ui];
719
+ }
665
720
  }
666
- }
667
721
  }
668
722
 
723
+ function absorbFields(target, src) {
724
+ if (target) {
725
+ for (let ui in src) {
726
+ if (Object.prototype.hasOwnProperty.call(target, ui)) {
727
+ notCommon.logError(`fields property duplication ${ui}`);
728
+ }
729
+ target[ui] = src[ui];
730
+ }
731
+ }
732
+ }
669
733
 
670
- notCommon.register('absorb.wsc', absorbWSC);
671
- notCommon.register('absorb.services', absorbServices);
672
- notCommon.register('absorb.uis', absorbUIs);
673
- notCommon.register('absorb.uis', absorbFields);
734
+ notCommon.register("absorb.wsc", absorbWSC);
735
+ notCommon.register("absorb.services", absorbServices);
736
+ notCommon.register("absorb.uis", absorbUIs);
737
+ notCommon.register("absorb.uis", absorbFields);
674
738
 
675
739
  export default notCommon;
@@ -67,6 +67,7 @@ class notSideMenu extends Menu {
67
67
  },
68
68
  });
69
69
  this.initSizeResponse();
70
+
70
71
  this.interval = setInterval(this.updateMenuActiveItem.bind(this), 200);
71
72
  this.bindToggle();
72
73
  }
@@ -158,21 +159,33 @@ class notSideMenu extends Menu {
158
159
 
159
160
  static toggle(e) {
160
161
  e && e.preventDefault();
161
- this.aside.classList.toggle("is-active");
162
+ if (this.isTouch()) {
163
+ this.aside.classList.toggle("is-active");
164
+ } else {
165
+ this.aside.classList.toggle("is-closed");
166
+ }
162
167
  this.resizeMain();
163
168
  return false;
164
169
  }
165
170
 
166
171
  static hide(e) {
167
172
  e && e.preventDefault();
168
- this.aside.classList.remove("is-active");
173
+ if (this.isTouch()) {
174
+ this.aside.classList.remove("is-active");
175
+ } else {
176
+ this.aside.classList.add("is-closed");
177
+ }
169
178
  this.resizeMain();
170
179
  return false;
171
180
  }
172
181
 
173
182
  static show(e) {
174
183
  e && e.preventDefault();
175
- this.classList.add("is-active");
184
+ if (this.isTouch()) {
185
+ this.classList.add("is-active");
186
+ } else {
187
+ this.aside.classList.remove("is-closed");
188
+ }
176
189
  this.resizeMain();
177
190
  return false;
178
191
  }
@@ -17,6 +17,14 @@ aside.menu{
17
17
  }
18
18
  }
19
19
 
20
+
21
+ aside.menu.is-closed{
22
+ left: 0px;
23
+ width: 0px;
24
+ display:none;
25
+ }
26
+
27
+
20
28
  @media screen and (min-width: 1024px){
21
29
  aside.menu{
22
30
  width: 20em;