ngx-universal-zone 0.0.1

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.
Files changed (44) hide show
  1. package/database/db-base.service.d.ts +37 -0
  2. package/database/db-setting-constant.d.ts +7 -0
  3. package/database/db-sql.service.d.ts +48 -0
  4. package/database/db-web.service.d.ts +50 -0
  5. package/database/db.module.d.ts +6 -0
  6. package/database/index.d.ts +6 -0
  7. package/database/schema.service.d.ts +25 -0
  8. package/fesm2022/ngx-universal-zone-database.mjs +608 -0
  9. package/fesm2022/ngx-universal-zone-database.mjs.map +1 -0
  10. package/fesm2022/ngx-universal-zone-pipes.mjs +87 -0
  11. package/fesm2022/ngx-universal-zone-pipes.mjs.map +1 -0
  12. package/fesm2022/ngx-universal-zone-pub-sub.mjs +147 -0
  13. package/fesm2022/ngx-universal-zone-pub-sub.mjs.map +1 -0
  14. package/fesm2022/ngx-universal-zone-ui.mjs +218 -0
  15. package/fesm2022/ngx-universal-zone-ui.mjs.map +1 -0
  16. package/fesm2022/ngx-universal-zone.mjs +966 -0
  17. package/fesm2022/ngx-universal-zone.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/package.json +40 -0
  20. package/pipes/formateDate.pipe.d.ts +8 -0
  21. package/pipes/index.d.ts +2 -0
  22. package/pipes/safe.pipe.d.ts +18 -0
  23. package/pub-sub/i-hash.d.ts +10 -0
  24. package/pub-sub/index.d.ts +2 -0
  25. package/pub-sub/ngx-pub-sub.module.d.ts +7 -0
  26. package/pub-sub/ngx-pub-sub.service.d.ts +27 -0
  27. package/pub-sub/subject-type.enum.d.ts +5 -0
  28. package/public-api.d.ts +6 -0
  29. package/shared/app-injector.d.ts +6 -0
  30. package/shared/app-setting.service.d.ts +18 -0
  31. package/shared/flag-based-preloading-strategy.d.ts +12 -0
  32. package/shared/helper.service.d.ts +15 -0
  33. package/shared/message-bus/index.d.ts +4 -0
  34. package/shared/message-bus/message-bus.d.ts +15 -0
  35. package/shared/message-bus/message-bus.testing.d.ts +9 -0
  36. package/shared/message-bus/messages.d.ts +2 -0
  37. package/shared/message-bus/models.d.ts +39 -0
  38. package/shared/universal-zone.module.d.ts +2 -0
  39. package/ui/directives/directives.module.d.ts +9 -0
  40. package/ui/directives/long-ress.directive.d.ts +21 -0
  41. package/ui/directives/only-number.directive.d.ts +7 -0
  42. package/ui/index.d.ts +5 -0
  43. package/ui/no-data/no-data.component.d.ts +13 -0
  44. package/ui/no-data/no-data.module.d.ts +8 -0
@@ -0,0 +1,966 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, makeEnvironmentProviders } from '@angular/core';
3
+ import { Observable, Subject, switchMap, of, forkJoin, defer, delay } from 'rxjs';
4
+ import Dexie from 'dexie';
5
+ import { filter } from 'rxjs/operators';
6
+ import * as i1 from '@angular/router';
7
+ import { PreloadingStrategy } from '@angular/router';
8
+
9
+ // https://blogs.msdn.microsoft.com/premier_developer/2018/06/17/angular-how-to-simplify-components-with-typescript-inheritance/
10
+ class AppInjector {
11
+ static setInjector(injector) {
12
+ AppInjector.injector = injector;
13
+ }
14
+ static getInjector() {
15
+ return AppInjector.injector;
16
+ }
17
+ }
18
+
19
+ // @ts-ignore
20
+ class DbServiceConfig {
21
+ }
22
+ var DbServiceType;
23
+ (function (DbServiceType) {
24
+ DbServiceType[DbServiceType["IndexDd"] = 0] = "IndexDd";
25
+ DbServiceType[DbServiceType["Sqlite"] = 1] = "Sqlite";
26
+ })(DbServiceType || (DbServiceType = {}));
27
+ class DbService {
28
+ constructor() {
29
+ this.dbInitialized$ = new Observable();
30
+ }
31
+ get Db() {
32
+ return;
33
+ }
34
+ putLocal(store, data) {
35
+ // @ts-ignore
36
+ return;
37
+ }
38
+ putLocalRx(store, data) {
39
+ // @ts-ignore
40
+ return;
41
+ }
42
+ get(store, key) {
43
+ // @ts-ignore
44
+ return;
45
+ }
46
+ getRx(store, key) {
47
+ // @ts-ignore
48
+ return;
49
+ }
50
+ getAll(store, opt) {
51
+ // @ts-ignore
52
+ return;
53
+ }
54
+ getAllRx(store, opt) {
55
+ // @ts-ignore
56
+ return;
57
+ }
58
+ remove(store, id) {
59
+ // @ts-ignore
60
+ return;
61
+ }
62
+ removeRx(store, key) {
63
+ // @ts-ignore
64
+ return;
65
+ }
66
+ removeAll(store) {
67
+ // @ts-ignore
68
+ return;
69
+ }
70
+ removeAllRx(store) {
71
+ // @ts-ignore
72
+ return;
73
+ }
74
+ count(store, opts) {
75
+ // @ts-ignore
76
+ return;
77
+ }
78
+ countRx(store, opts) {
79
+ // @ts-ignore
80
+ return;
81
+ }
82
+ deleteDb() {
83
+ // @ts-ignore
84
+ return;
85
+ }
86
+ deleteTable(store) {
87
+ // @ts-ignore
88
+ return;
89
+ }
90
+ }
91
+
92
+ // @Injectable()
93
+ class DbWebService extends Dexie {
94
+ constructor(config, schemaService) {
95
+ super(config.dbName);
96
+ this.config = config;
97
+ this.schemaService = schemaService;
98
+ this.dbInitialized = new Subject();
99
+ this.dbInitialized$ = this.dbInitialized.asObservable();
100
+ const schema = {};
101
+ schemaService.schema.stores.forEach((s) => {
102
+ let cols = ``;
103
+ for (let c of s.columns) {
104
+ cols += `${c.isPrimaryKey ? `++${c.name}` : `,${c.name}`}`;
105
+ }
106
+ schema[s.name] = cols;
107
+ });
108
+ this.version(1).stores(schema);
109
+ this.open()
110
+ .then((d) => {
111
+ this._db = d;
112
+ this.dbInitialized.next(d);
113
+ })
114
+ .catch((e) => alert(e));
115
+ }
116
+ get Db() {
117
+ return this._db;
118
+ }
119
+ putLocal(store, data) {
120
+ return new Promise(async (resolve, reject) => {
121
+ const schema = this.schemaService.schema.stores.filter((s) => s.name == store)[0];
122
+ const key = schema.columns.filter((s) => s.isPrimaryKey)[0];
123
+ const exist = data[key.name] ? await this.get(store, data[key.name]) : null;
124
+ if (exist) {
125
+ //update
126
+ this.Db
127
+ .table(store)
128
+ .update(data[key.name], data)
129
+ .then((r) => resolve(null), (e) => reject(e));
130
+ }
131
+ else {
132
+ this.Db
133
+ .table(store)
134
+ .add(data)
135
+ .then((r) => resolve(null), (e) => reject(e));
136
+ }
137
+ });
138
+ }
139
+ putLocalRx(store, data) {
140
+ return new Observable((observer) => {
141
+ this.putLocal(store, data).then((result) => {
142
+ observer.next(result);
143
+ observer.complete();
144
+ }, (e) => observer.error(e));
145
+ });
146
+ }
147
+ get(store, key) {
148
+ return new Promise((resolve, reject) => {
149
+ if (!this.Db) {
150
+ return reject('Database not initialized. Please wait for dbInitialized$ to emit.');
151
+ }
152
+ this.Db
153
+ .table(store)
154
+ .get(key)
155
+ .then((r) => {
156
+ resolve(r);
157
+ }, (e) => reject(e));
158
+ });
159
+ }
160
+ getRx(store, key) {
161
+ return new Observable((observer) => {
162
+ this.get(store, key).then((value) => {
163
+ observer.next(value);
164
+ observer.complete();
165
+ });
166
+ });
167
+ }
168
+ getByFieldName(storeName, fieldName, key) {
169
+ const filter = {};
170
+ filter[fieldName] = key;
171
+ return this.Db.table(storeName).where(filter).toArray();
172
+ }
173
+ getAll(store, opt) {
174
+ return new Promise(async (resolve, reject) => {
175
+ if (!this.Db) {
176
+ return reject('Database not initialized. Please wait for dbInitialized$ to emit.');
177
+ }
178
+ let table = this.Db.table(store);
179
+ let collection = table.toCollection();
180
+ if (opt?.sortBy) {
181
+ collection = table.orderBy(opt.sortBy);
182
+ }
183
+ if (opt?.sortType && opt?.sortType == 'desc') {
184
+ collection = table.reverse();
185
+ }
186
+ // collection = this.Db.table(store).toCollection();
187
+ if (opt && opt.key && opt.value) {
188
+ if (!opt.keyRange) {
189
+ opt.keyRange = KeyRangeType.equalTo;
190
+ }
191
+ switch (opt.keyRange) {
192
+ case KeyRangeType.startsWithIgnoreCase:
193
+ collection = this.Db
194
+ .table(store)
195
+ .where(opt.key)
196
+ .startsWithIgnoreCase(opt.value);
197
+ break;
198
+ case KeyRangeType.equalTo:
199
+ collection = this.Db
200
+ .table(store)
201
+ .where(opt.key)
202
+ .equals(opt.value);
203
+ break;
204
+ case KeyRangeType.notEqualTo:
205
+ collection = this.Db
206
+ .table(store)
207
+ .where(opt.key)
208
+ .notEqual(opt.value);
209
+ break;
210
+ case KeyRangeType.equalToIgnoreCase:
211
+ collection = this.Db
212
+ .table(store)
213
+ .where(opt.key)
214
+ .equalsIgnoreCase(opt.value);
215
+ break;
216
+ }
217
+ }
218
+ if (opt?.pageIndex != null) {
219
+ collection = collection.offset((opt.pageIndex - 1) * opt.pageSize);
220
+ }
221
+ if (opt?.pageSize != null) {
222
+ collection = collection.limit(opt.pageSize);
223
+ }
224
+ // let data!: T;
225
+ // if(opt?.sortBy) {
226
+ // data = <T>await collection.sortBy(opt.sortBy);
227
+ // } else {
228
+ // data = <T>await collection.toArray();
229
+ // }
230
+ // if(opt.sortType == 'desc') {
231
+ // data = <T>(<any[]>data).reverse();
232
+ // }
233
+ const data = await collection.toArray();
234
+ resolve(data);
235
+ });
236
+ }
237
+ getAllRx(store, opt) {
238
+ return new Observable((observer) => {
239
+ this.getAll(store, opt).then((value) => {
240
+ observer.next(value);
241
+ observer.complete();
242
+ }, (e) => observer.error(e));
243
+ });
244
+ }
245
+ remove(store, key) {
246
+ return this.Db.table(store).delete(key);
247
+ }
248
+ removeRx(store, key) {
249
+ return new Observable((observer) => {
250
+ this.remove(store, key).then((result) => {
251
+ observer.next(result);
252
+ observer.complete();
253
+ }, (e) => observer.error(e));
254
+ });
255
+ }
256
+ async removeAll(store) {
257
+ const all = await this.getAll(store);
258
+ const schema = this.schemaService.schema.stores.filter((s) => s.name == store)[0];
259
+ const key = schema.columns.filter((s) => s.isPrimaryKey)[0];
260
+ const promises = [];
261
+ for (let r of all) {
262
+ promises.push(this.Db.table(store).delete(key.name));
263
+ }
264
+ await Promise.all(promises);
265
+ }
266
+ removeAllRx(store) {
267
+ return this.getAllRx(store).pipe(switchMap((entries) => {
268
+ const observables = [];
269
+ for (let entry of entries) {
270
+ observables.push(this.removeRx(store, entry.id));
271
+ }
272
+ if (!observables.length) {
273
+ return of(null);
274
+ }
275
+ return forkJoin(observables);
276
+ }));
277
+ }
278
+ count(store, opts) {
279
+ if (opts && opts.key) {
280
+ const pk = this.schemaService.schema.stores
281
+ .filter((s) => s.name == store)[0]
282
+ .columns.filter((s) => s.isPrimaryKey)[0];
283
+ return this.Db.table(store).where(pk.name).equals(opts.key).count();
284
+ }
285
+ return this.Db.table(store).count();
286
+ }
287
+ countRx(store, opts) {
288
+ return new Observable((observer) => {
289
+ this.count(store, opts).then((value) => {
290
+ observer.next(value);
291
+ observer.complete();
292
+ }, (e) => observer.error(e));
293
+ });
294
+ }
295
+ deleteDb() {
296
+ return new Promise(async (resolve, reject) => {
297
+ await this.Db.delete();
298
+ resolve(null);
299
+ });
300
+ }
301
+ deleteTable(store) {
302
+ return new Observable((observer) => {
303
+ this.Db.table(store).clear().then((result) => {
304
+ observer.next(result);
305
+ observer.complete();
306
+ }, (e) => observer.error(e));
307
+ });
308
+ }
309
+ }
310
+ var KeyRangeType;
311
+ (function (KeyRangeType) {
312
+ KeyRangeType[KeyRangeType["equalToIgnoreCase"] = 1] = "equalToIgnoreCase";
313
+ KeyRangeType[KeyRangeType["startsWithIgnoreCase"] = 2] = "startsWithIgnoreCase";
314
+ KeyRangeType[KeyRangeType["equalTo"] = 3] = "equalTo";
315
+ KeyRangeType[KeyRangeType["notEqualTo"] = 4] = "notEqualTo";
316
+ })(KeyRangeType || (KeyRangeType = {}));
317
+
318
+ class SchemaService {
319
+ /**
320
+ * Represents a SchemaService that manages the database schema.
321
+ */
322
+ constructor() {
323
+ this.schema = {
324
+ stores: []
325
+ };
326
+ this.tables = {};
327
+ this._config = {};
328
+ }
329
+ get config() {
330
+ return this._config;
331
+ }
332
+ init(config) {
333
+ this._config = config;
334
+ if (config.schema && config.schema.length) {
335
+ this.schema.stores = this.config.schema;
336
+ this.schema.stores.forEach((s) => this.tables[s.name] = s.name);
337
+ }
338
+ }
339
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SchemaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
340
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SchemaService }); }
341
+ }
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SchemaService, decorators: [{
343
+ type: Injectable
344
+ }], ctorParameters: () => [] });
345
+
346
+ class DbSettingConstant {
347
+ static { this.SETTING = 'setting'; }
348
+ }
349
+ const DbSettingConfig = {
350
+ schema: {
351
+ name: DbSettingConstant.SETTING,
352
+ columns: [
353
+ {
354
+ name: 'key',
355
+ isPrimaryKey: true,
356
+ type: 'TEXT',
357
+ },
358
+ {
359
+ name: 'value',
360
+ type: 'TEXT',
361
+ },
362
+ ],
363
+ }
364
+ };
365
+
366
+ class DbSqliteService {
367
+ constructor(config, schemaSvc) {
368
+ this.config = config;
369
+ this.schemaSvc = schemaSvc;
370
+ this._isDbInitialized = false;
371
+ this.dbInitialized = new Subject();
372
+ this.dbInitialized$ = this.dbInitialized.asObservable();
373
+ this._dbName = config.dbName;
374
+ // await this._deleteDatabase();
375
+ // this._db = CapacitorSQLite;
376
+ this._db.open({ database: this._dbName }).then(async (response) => {
377
+ if (response.result) {
378
+ await this._dbSuccess();
379
+ this.initializeDb();
380
+ }
381
+ }, (e) => {
382
+ this._dbError(e);
383
+ });
384
+ }
385
+ getAllRx(store, opt) {
386
+ throw new Error('Method not implemented.');
387
+ }
388
+ testDb() {
389
+ this._db.transaction((tr) => {
390
+ tr.executeSql('SELECT upper(?) AS upperString', ['Test string'], (tr, rs) => {
391
+ console.log('Got upperString result: ' + rs.rows.item(0).upperString);
392
+ });
393
+ });
394
+ }
395
+ initializeDb() {
396
+ const delay = 50;
397
+ //workaround: don't proceed unless db is initialized...wait everytime 50ms
398
+ const _self = this;
399
+ let timerId = setTimeout(async function request() {
400
+ if (!_self._isDbInitialized) {
401
+ //retry
402
+ timerId = setTimeout(request, delay);
403
+ }
404
+ else {
405
+ //clear timeout
406
+ clearTimeout(timerId);
407
+ timerId = null;
408
+ await _self._prepareTables();
409
+ // heavy database operations should start from this...
410
+ _self.dbInitialized.next(_self._db);
411
+ }
412
+ }, delay);
413
+ }
414
+ get Db() {
415
+ return this._db;
416
+ }
417
+ putLocal(store, data) {
418
+ return new Promise(async (resolve, reject) => {
419
+ let sql = `BEGIN TRANSACTION;`;
420
+ const values = [];
421
+ const total = await this.count(store);
422
+ if (total) {
423
+ //update
424
+ sql = `UPDATE ${store} SET `;
425
+ //columns
426
+ for (let prop in data) {
427
+ if (data.hasOwnProperty(prop)) {
428
+ sql += `${prop}='${data[prop]}',`;
429
+ }
430
+ }
431
+ //remove extra ',' at the end
432
+ sql = sql.substr(0, sql.length - 1);
433
+ }
434
+ else {
435
+ //insert
436
+ sql = `INSERT INTO ${store} `;
437
+ //columns
438
+ sql += `(`;
439
+ for (let prop in data) {
440
+ if (data.hasOwnProperty(prop)) {
441
+ sql += `${prop},`;
442
+ }
443
+ }
444
+ //remove extra ',' at the end
445
+ sql = sql.substr(0, sql.length - 1);
446
+ sql += `)`;
447
+ //values
448
+ sql += ` VALUES (`;
449
+ for (let prop in data) {
450
+ sql += `?,`;
451
+ values.push(data[prop]);
452
+ }
453
+ sql = sql.substr(0, sql.length - 1);
454
+ sql += `)`;
455
+ }
456
+ sql += `COMMIT TRANSACTION;`;
457
+ const { changes } = await this._db.execute({
458
+ statements: sql,
459
+ values: values,
460
+ });
461
+ resolve(changes);
462
+ // this._db.transaction(async (tx) => {
463
+ // const res = await this._executeSql<{ rowsAffected, insertId }>(tx, sql, values);
464
+ // resolve(res);
465
+ // }, (error) => reject(error));
466
+ });
467
+ }
468
+ putLocalRx(store, data) {
469
+ return new Observable((observer) => {
470
+ this.putLocal(store, data).then((result) => {
471
+ observer.next(result);
472
+ observer.complete();
473
+ });
474
+ });
475
+ }
476
+ get(store, key) {
477
+ return new Promise(async (resolve, reject) => {
478
+ //get primary key field form schema
479
+ const table = this.schemaSvc.schema.stores.filter((s) => s.name === store)[0];
480
+ const pk = table.columns.filter((c) => c.isPrimaryKey)[0];
481
+ const pkName = pk.name;
482
+ let sql = `SELECT * FROM ${store} WHERE ${pkName} = '${key}' LIMIT 1`;
483
+ try {
484
+ let data;
485
+ const { values } = await this._db.query({ statement: sql, values: [] });
486
+ if (values.length) {
487
+ data = values[0];
488
+ }
489
+ resolve(data);
490
+ }
491
+ catch (e) {
492
+ reject(e);
493
+ }
494
+ });
495
+ }
496
+ getRx(store, key) {
497
+ // @ts-ignore
498
+ return;
499
+ }
500
+ getAll(store, opt) {
501
+ return new Promise(async (resolve, reject) => {
502
+ let sql = `SELECT * FROM ${store}`;
503
+ try {
504
+ let data;
505
+ const { values } = await this._db.query({ statement: sql, values: [] });
506
+ resolve(values);
507
+ }
508
+ catch (e) {
509
+ reject(e);
510
+ }
511
+ });
512
+ }
513
+ remove(store, key) {
514
+ return new Promise((resolve, reject) => {
515
+ throw 'remove not impleted in db-sql yet';
516
+ });
517
+ }
518
+ removeRx(store, key) {
519
+ throw 'remove not impleted in db-sql yet';
520
+ }
521
+ removeAll(store) {
522
+ return new Promise((resolve, reject) => {
523
+ throw 'removeAll not impleted in db-sql yet';
524
+ });
525
+ }
526
+ removeAllRx(store) {
527
+ throw 'removeAllRx not impleted in db-sql yet';
528
+ }
529
+ count(store, opts) {
530
+ return new Promise(async (resolve, reject) => {
531
+ let sql = `SELECT count(*) AS total FROM ${store} `;
532
+ const { values } = await this._db.query({ statement: sql, values: [] });
533
+ resolve(values);
534
+ });
535
+ }
536
+ countRx(store, opts) {
537
+ return new Observable((observer) => {
538
+ this.count(store, opts).then((result) => {
539
+ observer.next(result);
540
+ observer.complete();
541
+ }, (error) => observer.error(error));
542
+ });
543
+ }
544
+ deleteDb() {
545
+ return this._deleteDatabase();
546
+ }
547
+ deleteTable(store) {
548
+ throw 'deleteTable not impleted in db-sql yet';
549
+ }
550
+ _prepareTables() {
551
+ return new Promise(async (resolve, reject) => {
552
+ const schemas = this.schemaSvc.schema.stores;
553
+ const promises = [];
554
+ for (let schema of schemas) {
555
+ let sql = `BEGIN TRANSACTION;`;
556
+ sql += `CREATE TABLE IF NOT EXISTS ${schema.name} `;
557
+ sql += `(`;
558
+ for (let col of schema.columns) {
559
+ //TODO: for user table, need to fix primary key
560
+ // const ikPkTypeNumber = col['type'] == 'INTEGER';
561
+ sql += `${col.name}${col.type ? ' ' + col.type : ''}${col['isPrimaryKey'] ? ' PRIMARY KEY' : ''},`;
562
+ }
563
+ //remove extra ',' at the end
564
+ sql = sql.substr(0, sql.length - 1);
565
+ sql += `)`;
566
+ sql += `COMMIT TRANSACTION;`;
567
+ const promise = this._db.execute({ statements: sql });
568
+ promises.push(promise);
569
+ }
570
+ try {
571
+ await Promise.all(promises);
572
+ resolve(null);
573
+ }
574
+ catch (e) {
575
+ reject(e);
576
+ }
577
+ });
578
+ }
579
+ _deleteDatabase() {
580
+ return this._db.deleteDatabase({ database: this._dbName });
581
+ }
582
+ _dbSuccess() {
583
+ this._isDbInitialized = true;
584
+ }
585
+ _dbError(err) {
586
+ alert('Open database ERROR: ' + JSON.stringify(err));
587
+ }
588
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DbSqliteService, deps: [{ token: DbServiceConfig }, { token: SchemaService }], target: i0.ɵɵFactoryTarget.Injectable }); }
589
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DbSqliteService }); }
590
+ }
591
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DbSqliteService, decorators: [{
592
+ type: Injectable
593
+ }], ctorParameters: () => [{ type: DbServiceConfig }, { type: SchemaService }] });
594
+
595
+ function dbFactory(schemaSvc) {
596
+ const dbConfig = schemaSvc.config;
597
+ switch (dbConfig.dbType) {
598
+ case DbServiceType.IndexDd:
599
+ return new DbWebService(dbConfig, schemaSvc);
600
+ case DbServiceType.Sqlite:
601
+ return new DbSqliteService(dbConfig, schemaSvc);
602
+ }
603
+ }
604
+ const provideDb = () => {
605
+ const providers = [
606
+ SchemaService,
607
+ {
608
+ provide: DbService,
609
+ useFactory: dbFactory,
610
+ deps: [SchemaService],
611
+ }
612
+ ];
613
+ return makeEnvironmentProviders(providers);
614
+ };
615
+
616
+ class AppSettingService {
617
+ static { this.settingCache = new Map(); }
618
+ constructor(_dbService, _schemaSvc) {
619
+ this._dbService = _dbService;
620
+ this._schemaSvc = _schemaSvc;
621
+ }
622
+ get(key) {
623
+ if (AppSettingService.settingCache.has(key)) {
624
+ return new Promise((resolve, reject) => {
625
+ let settingCacheMap = AppSettingService.settingCache.get(key);
626
+ resolve(settingCacheMap);
627
+ });
628
+ }
629
+ else {
630
+ return this._dbService
631
+ .get(this._schemaSvc.tables[DbSettingConstant.SETTING], key)
632
+ .then((setting) => {
633
+ if (setting && setting.value) {
634
+ AppSettingService.settingCache.set(key, setting.value);
635
+ return setting.value;
636
+ }
637
+ return null;
638
+ });
639
+ }
640
+ }
641
+ getRx(key) {
642
+ return new Observable((obs) => {
643
+ this.get(key).then((setting) => {
644
+ obs.next(setting);
645
+ obs.complete();
646
+ }, (error) => obs.error(error));
647
+ });
648
+ }
649
+ put(key, values) {
650
+ return this._dbService
651
+ .putLocal(this._schemaSvc.tables[DbSettingConstant.SETTING], {
652
+ key: key,
653
+ value: values,
654
+ })
655
+ .then(() => {
656
+ AppSettingService.settingCache.set(key, values);
657
+ });
658
+ }
659
+ putRx(key, values) {
660
+ return new Observable((obs) => {
661
+ this.put(key, values).then(() => {
662
+ obs.next();
663
+ obs.complete();
664
+ }, (error) => obs.error(error));
665
+ });
666
+ }
667
+ remove(key) {
668
+ return this._dbService
669
+ .remove(this._schemaSvc.tables[DbSettingConstant.SETTING], key)
670
+ .then(() => {
671
+ AppSettingService.settingCache.delete(key);
672
+ });
673
+ }
674
+ removeRx(key) {
675
+ return new Observable((obs) => {
676
+ this.remove(key).then(() => {
677
+ obs.next();
678
+ obs.complete();
679
+ }, (error) => obs.error(error));
680
+ });
681
+ }
682
+ removeCache(key) {
683
+ AppSettingService.settingCache.delete(key);
684
+ }
685
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AppSettingService, deps: [{ token: DbService }, { token: SchemaService }], target: i0.ɵɵFactoryTarget.Injectable }); }
686
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AppSettingService }); }
687
+ }
688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AppSettingService, decorators: [{
689
+ type: Injectable
690
+ }], ctorParameters: () => [{ type: DbService }, { type: SchemaService }] });
691
+
692
+ class HelperService {
693
+ constructor() { }
694
+ deepCopy(obj) {
695
+ if (typeof obj !== 'object' || obj === null) {
696
+ return obj;
697
+ }
698
+ if (obj instanceof Date) {
699
+ return new Date(obj.getTime());
700
+ }
701
+ if (obj instanceof Array) {
702
+ return obj.reduce((arr, item, i) => {
703
+ arr[i] = this.deepCopy(item);
704
+ return arr;
705
+ }, []);
706
+ }
707
+ if (obj instanceof Object) {
708
+ return Object.keys(obj).reduce((newObj, key) => {
709
+ newObj[key] = this.deepCopy(obj[key]);
710
+ return newObj;
711
+ }, {});
712
+ }
713
+ }
714
+ //https://stackoverflow.com/a/20285053/859968
715
+ toDataURL(url) {
716
+ return new Promise((resolve) => {
717
+ let xhr = new XMLHttpRequest();
718
+ xhr.onload = function () {
719
+ const reader = new FileReader();
720
+ reader.onloadend = function () {
721
+ resolve(reader.result);
722
+ };
723
+ reader.readAsDataURL(xhr.response);
724
+ };
725
+ xhr.open('GET', url);
726
+ xhr.responseType = 'blob';
727
+ xhr.send();
728
+ });
729
+ }
730
+ //https://stackoverflow.com/a/2117523/859968
731
+ generateGuid() {
732
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
733
+ var r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
734
+ return v.toString(16);
735
+ });
736
+ }
737
+ getRandomNumber() {
738
+ const random = new Date().getTime() + Math.floor(Math.random() * 1000000);
739
+ return random;
740
+ }
741
+ getRandomColor() {
742
+ var letters = '0123456789ABCDEF';
743
+ var color = '#';
744
+ for (var i = 0; i < 6; i++) {
745
+ color += letters[Math.floor(Math.random() * 16)];
746
+ }
747
+ return color;
748
+ }
749
+ getFormValidationErrors(formName) {
750
+ Object.keys(formName.controls).forEach((key) => {
751
+ const controlErrors = formName.get(key).errors;
752
+ if (controlErrors != null) {
753
+ Object.keys(controlErrors).forEach((keyError) => {
754
+ console.log('Key control: ' + key + ', keyError: ' + keyError + ', err value: ', controlErrors[keyError]);
755
+ });
756
+ }
757
+ });
758
+ }
759
+ removeFormValidationErrors(formName, controlName, errorKey) {
760
+ const controlErrors = formName.get(controlName).errors;
761
+ if (controlErrors != null) {
762
+ const error = Object.keys(controlErrors).filter((k) => k == errorKey);
763
+ if (error) {
764
+ controlErrors[errorKey] = undefined;
765
+ delete controlErrors[errorKey];
766
+ }
767
+ }
768
+ }
769
+ downloadCanvasAsImage(canvas) {
770
+ // const download = document.getElementById("download");
771
+ const image = canvas
772
+ .toDataURL('image/png')
773
+ .replace('image/png', 'image/octet-stream');
774
+ const link = document.createElement('a');
775
+ link.setAttribute('href', image);
776
+ link.download = `${this.generateGuid()}.png`;
777
+ link.click();
778
+ // setTimeout(() => {
779
+ // link.remove();
780
+ // });
781
+ }
782
+ getParamsObjectsFromUrl(url) {
783
+ let obj;
784
+ if (url) {
785
+ url = decodeURI(url);
786
+ }
787
+ let urlArr = url.split(';');
788
+ if (urlArr.length) {
789
+ urlArr.shift();
790
+ }
791
+ for (const urlItem of urlArr) {
792
+ if (!obj) {
793
+ obj = {};
794
+ }
795
+ //e.g key = value
796
+ const urlItemObj = urlItem.split('=');
797
+ obj[urlItemObj[0]] = urlItemObj[1];
798
+ }
799
+ return obj;
800
+ }
801
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: HelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
802
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: HelperService }); }
803
+ }
804
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: HelperService, decorators: [{
805
+ type: Injectable
806
+ }], ctorParameters: () => [] });
807
+
808
+ const provideUniversalZone = () => {
809
+ const providers = [
810
+ AppSettingService, HelperService
811
+ ];
812
+ return makeEnvironmentProviders(providers);
813
+ };
814
+
815
+ const EVENT_NAME = 'uz-message-bus';
816
+ class MessageBus {
817
+ constructor() {
818
+ this.messageSubject = new Subject();
819
+ this.event$ = this.messageSubject.asObservable();
820
+ this.eventHandler = this.handleEvent.bind(this);
821
+ }
822
+ dispatch(message) {
823
+ const event = new CustomEvent(EVENT_NAME, { detail: message });
824
+ document.dispatchEvent(event);
825
+ }
826
+ startListening() {
827
+ document.addEventListener(EVENT_NAME, this.eventHandler);
828
+ }
829
+ stopListening() {
830
+ document.removeEventListener(EVENT_NAME, this.eventHandler);
831
+ }
832
+ handleEvent(customEvent) {
833
+ this.messageSubject.next(customEvent.detail);
834
+ }
835
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MessageBus, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
836
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MessageBus, providedIn: 'root' }); }
837
+ }
838
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MessageBus, decorators: [{
839
+ type: Injectable,
840
+ args: [{ providedIn: 'root' }]
841
+ }], ctorParameters: () => [] });
842
+
843
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
844
+ /* eslint-disable @typescript-eslint/ban-types */
845
+ /* eslint-disable @typescript-eslint/naming-convention */
846
+ function props() {
847
+ return { _as: 'props', _p: undefined };
848
+ }
849
+ const arraysAreNotAllowedMsg = 'arrays are not allowed in action creators';
850
+ const typePropertyIsNotAllowedMsg = 'type property is not allowed in action creators';
851
+ function createMessage(type, config) {
852
+ if (typeof config === 'function') {
853
+ return defineType(type, (...args) => ({
854
+ ...config(...args),
855
+ type,
856
+ }));
857
+ }
858
+ const as = config ? config._as : 'empty';
859
+ switch (as) {
860
+ case 'empty':
861
+ return defineType(type, () => ({ type }));
862
+ case 'props':
863
+ return defineType(type, (propz) => ({
864
+ ...propz,
865
+ type,
866
+ }));
867
+ default:
868
+ throw new Error('Unexpected config.');
869
+ }
870
+ }
871
+ function defineType(type, creator) {
872
+ return Object.defineProperty(creator, 'type', {
873
+ value: type,
874
+ writable: false,
875
+ }); // Cast added to fix type system.
876
+ }
877
+ function ofMessageType(...allowedTypes) {
878
+ return filter((action) => allowedTypes.some((typeOrActionCreator) => {
879
+ if (typeof typeOrActionCreator === 'string') {
880
+ // Comparing the string to type
881
+ return typeOrActionCreator === action.type;
882
+ }
883
+ // We are filtering by ActionCreator
884
+ return typeOrActionCreator.type === action.type;
885
+ }));
886
+ }
887
+
888
+ function provideTestMessages(getMessages) {
889
+ return {
890
+ provide: MessageBus,
891
+ useFactory: () => ({
892
+ event$: defer(getMessages),
893
+ }),
894
+ };
895
+ }
896
+
897
+ /** Indicates that the global styling has changed & loaded (Light/Dark) */
898
+ // export const applicationStylesChanged = createMessage('Application styles changed');
899
+
900
+ class FlagBasedPreloadingStrategy extends PreloadingStrategy {
901
+ constructor(router) {
902
+ super();
903
+ this.router = router;
904
+ }
905
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
906
+ preload(route, load) {
907
+ const preload = route.data?.["preload"];
908
+ const preloadNextRoutes = this.getCurrentRouteData()?.['preloadNextRoutes'] ?? [];
909
+ if (preload || preloadNextRoutes.length) {
910
+ if (preload) {
911
+ return load();
912
+ }
913
+ if (preloadNextRoutes.includes(route.path)) {
914
+ const delayTime = route.data?.["delay"] ?? 0;
915
+ return of(null).pipe(delay(delayTime), switchMap(() => this.waitForNetworkIdle()), switchMap(() => {
916
+ return load();
917
+ }));
918
+ }
919
+ }
920
+ return of(null);
921
+ }
922
+ getCurrentRouteData() {
923
+ let route = this.router.routerState.snapshot.root;
924
+ while (route.firstChild) {
925
+ route = route.firstChild;
926
+ }
927
+ return route.data;
928
+ }
929
+ waitForNetworkIdle() {
930
+ return new Observable((observer) => {
931
+ if (navigator.connection && navigator.connection.downlink > 0) {
932
+ observer.next();
933
+ observer.complete();
934
+ }
935
+ else {
936
+ const onNetworkIdle = () => {
937
+ if (navigator.connection.downlink > 0) {
938
+ observer.next();
939
+ observer.complete();
940
+ navigator.connection.removeEventListener('change', onNetworkIdle);
941
+ }
942
+ };
943
+ navigator.connection.addEventListener('change', onNetworkIdle);
944
+ }
945
+ });
946
+ }
947
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FlagBasedPreloadingStrategy, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
948
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FlagBasedPreloadingStrategy, providedIn: "root" }); }
949
+ }
950
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FlagBasedPreloadingStrategy, decorators: [{
951
+ type: Injectable,
952
+ args: [{ providedIn: "root" }]
953
+ }], ctorParameters: () => [{ type: i1.Router }] });
954
+
955
+ /*
956
+ * Public API Surface of ngx-universal-zone
957
+ */
958
+ //fix: Internal error: failed to get symbol for entrypoint
959
+ // export default {};
960
+
961
+ /**
962
+ * Generated bundle index. Do not edit.
963
+ */
964
+
965
+ export { AppInjector, AppSettingService, EVENT_NAME, FlagBasedPreloadingStrategy, HelperService, MessageBus, arraysAreNotAllowedMsg, createMessage, ofMessageType, props, provideTestMessages, provideUniversalZone, typePropertyIsNotAllowedMsg };
966
+ //# sourceMappingURL=ngx-universal-zone.mjs.map