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.
- package/database/db-base.service.d.ts +37 -0
- package/database/db-setting-constant.d.ts +7 -0
- package/database/db-sql.service.d.ts +48 -0
- package/database/db-web.service.d.ts +50 -0
- package/database/db.module.d.ts +6 -0
- package/database/index.d.ts +6 -0
- package/database/schema.service.d.ts +25 -0
- package/fesm2022/ngx-universal-zone-database.mjs +608 -0
- package/fesm2022/ngx-universal-zone-database.mjs.map +1 -0
- package/fesm2022/ngx-universal-zone-pipes.mjs +87 -0
- package/fesm2022/ngx-universal-zone-pipes.mjs.map +1 -0
- package/fesm2022/ngx-universal-zone-pub-sub.mjs +147 -0
- package/fesm2022/ngx-universal-zone-pub-sub.mjs.map +1 -0
- package/fesm2022/ngx-universal-zone-ui.mjs +218 -0
- package/fesm2022/ngx-universal-zone-ui.mjs.map +1 -0
- package/fesm2022/ngx-universal-zone.mjs +966 -0
- package/fesm2022/ngx-universal-zone.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +40 -0
- package/pipes/formateDate.pipe.d.ts +8 -0
- package/pipes/index.d.ts +2 -0
- package/pipes/safe.pipe.d.ts +18 -0
- package/pub-sub/i-hash.d.ts +10 -0
- package/pub-sub/index.d.ts +2 -0
- package/pub-sub/ngx-pub-sub.module.d.ts +7 -0
- package/pub-sub/ngx-pub-sub.service.d.ts +27 -0
- package/pub-sub/subject-type.enum.d.ts +5 -0
- package/public-api.d.ts +6 -0
- package/shared/app-injector.d.ts +6 -0
- package/shared/app-setting.service.d.ts +18 -0
- package/shared/flag-based-preloading-strategy.d.ts +12 -0
- package/shared/helper.service.d.ts +15 -0
- package/shared/message-bus/index.d.ts +4 -0
- package/shared/message-bus/message-bus.d.ts +15 -0
- package/shared/message-bus/message-bus.testing.d.ts +9 -0
- package/shared/message-bus/messages.d.ts +2 -0
- package/shared/message-bus/models.d.ts +39 -0
- package/shared/universal-zone.module.d.ts +2 -0
- package/ui/directives/directives.module.d.ts +9 -0
- package/ui/directives/long-ress.directive.d.ts +21 -0
- package/ui/directives/only-number.directive.d.ts +7 -0
- package/ui/index.d.ts +5 -0
- package/ui/no-data/no-data.component.d.ts +13 -0
- 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
|