react-hook-core 0.2.4 → 0.2.6
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/lib/index.js +3 -1
- package/package.json +1 -1
- package/src/com.ts +53 -53
- package/src/edit.ts +1 -1
- package/src/index.ts +4 -1
- package/src/merge.ts +23 -23
- package/src/route.ts +90 -90
- package/src/search.ts +618 -618
- package/src/state.ts +194 -194
- package/src/update.ts +86 -86
- package/src/useEdit.ts +12 -2
package/src/search.ts
CHANGED
|
@@ -1,618 +1,618 @@
|
|
|
1
|
-
// tslint:disable-next-line:class-name
|
|
2
|
-
export class resources {
|
|
3
|
-
static limit = 24;
|
|
4
|
-
}
|
|
5
|
-
interface Filter {
|
|
6
|
-
page?: number;
|
|
7
|
-
limit?: number;
|
|
8
|
-
firstLimit?: number;
|
|
9
|
-
fields?: string[];
|
|
10
|
-
sort?: string;
|
|
11
|
-
}
|
|
12
|
-
interface Locale {
|
|
13
|
-
id?: string;
|
|
14
|
-
countryCode: string;
|
|
15
|
-
dateFormat: string;
|
|
16
|
-
firstDayOfWeek: number;
|
|
17
|
-
decimalSeparator: string;
|
|
18
|
-
groupSeparator: string;
|
|
19
|
-
decimalDigits: number;
|
|
20
|
-
currencyCode: string;
|
|
21
|
-
currencySymbol: string;
|
|
22
|
-
currencyPattern: number;
|
|
23
|
-
currencySample?: string;
|
|
24
|
-
}
|
|
25
|
-
interface ResourceService {
|
|
26
|
-
value(key: string, param?: any): string;
|
|
27
|
-
format(f: string, ...args: any[]): string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface Sortable {
|
|
31
|
-
sortField?: string;
|
|
32
|
-
sortType?: string;
|
|
33
|
-
sortTarget?: HTMLElement;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface Pagination {
|
|
37
|
-
initPageSize?: number;
|
|
38
|
-
pageSize?: number;
|
|
39
|
-
limit?: number;
|
|
40
|
-
pageIndex?: number;
|
|
41
|
-
total?: number;
|
|
42
|
-
pages?: number;
|
|
43
|
-
showPaging?: boolean;
|
|
44
|
-
append?: boolean;
|
|
45
|
-
appendMode?: boolean;
|
|
46
|
-
appendable?: boolean;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
interface Searchable extends Pagination, Sortable {
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function mergeFilter<S extends Filter>(obj: S, b?: S, pageSizes?: number[], arrs?: string[]|any) {
|
|
53
|
-
let a: any = b;
|
|
54
|
-
if (!b) {
|
|
55
|
-
a = {};
|
|
56
|
-
}
|
|
57
|
-
const slimit: any = obj['limit'];
|
|
58
|
-
if (!isNaN(slimit)) {
|
|
59
|
-
const limit = parseInt(slimit, 10);
|
|
60
|
-
if (pageSizes && pageSizes.length > 0) {
|
|
61
|
-
if (pageSizes.indexOf(limit) >= 0) {
|
|
62
|
-
a.limit = limit;
|
|
63
|
-
}
|
|
64
|
-
} else {
|
|
65
|
-
a.limit = limit;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
delete obj['limit'];
|
|
69
|
-
const keys = Object.keys(obj);
|
|
70
|
-
for (const key of keys) {
|
|
71
|
-
const p = a[key];
|
|
72
|
-
const v = (obj as any)[key];
|
|
73
|
-
if (v && v !== '') {
|
|
74
|
-
a[key] = (isArray(key, p, arrs) ? v.split(',') : v);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return a;
|
|
78
|
-
}
|
|
79
|
-
export function isArray(key: string, p: any, arrs: string[]|any): boolean {
|
|
80
|
-
if (p) {
|
|
81
|
-
if (Array.isArray(p)) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (arrs) {
|
|
86
|
-
if (Array.isArray(arrs)) {
|
|
87
|
-
if (arrs.indexOf(key) >= 0) {
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
} else {
|
|
91
|
-
const v = arrs[key];
|
|
92
|
-
if (v && Array.isArray(v)) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// m is search model or an object which is parsed from url
|
|
101
|
-
export function initFilter<S extends Filter>(m: S, com: Searchable): S {
|
|
102
|
-
if (!isNaN(m.page as any)) {
|
|
103
|
-
const page = parseInt(m.page as any, 10);
|
|
104
|
-
m.page = page;
|
|
105
|
-
if (page >= 1) {
|
|
106
|
-
com.pageIndex = page;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (!isNaN(m.limit as any)) {
|
|
110
|
-
const pageSize = parseInt(m.limit as any, 10);
|
|
111
|
-
m.limit = pageSize;
|
|
112
|
-
if (pageSize > 0) {
|
|
113
|
-
com.pageSize = pageSize;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (!m.limit && com.pageSize) {
|
|
117
|
-
m.limit = com.pageSize;
|
|
118
|
-
}
|
|
119
|
-
if (!isNaN(m.firstLimit as any)) {
|
|
120
|
-
const initPageSize = parseInt(m.firstLimit as any, 10);
|
|
121
|
-
if (initPageSize > 0) {
|
|
122
|
-
m.firstLimit = initPageSize;
|
|
123
|
-
com.initPageSize = initPageSize;
|
|
124
|
-
} else {
|
|
125
|
-
com.initPageSize = com.pageSize;
|
|
126
|
-
}
|
|
127
|
-
} else {
|
|
128
|
-
com.initPageSize = com.pageSize;
|
|
129
|
-
}
|
|
130
|
-
const st = m.sort;
|
|
131
|
-
if (st && st.length > 0) {
|
|
132
|
-
const ch = st.charAt(0);
|
|
133
|
-
if (ch === '+' || ch === '-') {
|
|
134
|
-
com.sortField = st.substring(1);
|
|
135
|
-
com.sortType = ch;
|
|
136
|
-
} else {
|
|
137
|
-
com.sortField = st;
|
|
138
|
-
com.sortType = '';
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/*
|
|
142
|
-
delete m.page;
|
|
143
|
-
delete m.limit;
|
|
144
|
-
delete m.firstLimit;
|
|
145
|
-
*/
|
|
146
|
-
return m;
|
|
147
|
-
}
|
|
148
|
-
export function more(com: Pagination): void {
|
|
149
|
-
com.append = true;
|
|
150
|
-
if (!com.pageIndex) {
|
|
151
|
-
com.pageIndex = 1;
|
|
152
|
-
} else {
|
|
153
|
-
com.pageIndex = com.pageIndex + 1;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export function reset(com: Searchable): void {
|
|
158
|
-
removeSortStatus(com.sortTarget);
|
|
159
|
-
com.sortTarget = undefined;
|
|
160
|
-
com.sortField = undefined;
|
|
161
|
-
com.append = false;
|
|
162
|
-
com.pageIndex = 1;
|
|
163
|
-
}
|
|
164
|
-
export function changePageSize(com: Pagination, size: number): void {
|
|
165
|
-
com.initPageSize = size;
|
|
166
|
-
com.pageSize = size;
|
|
167
|
-
com.pageIndex = 1;
|
|
168
|
-
}
|
|
169
|
-
export function changePage(com: Pagination, pageIndex: number, pageSize: number): void {
|
|
170
|
-
com.pageIndex = pageIndex;
|
|
171
|
-
com.pageSize = pageSize;
|
|
172
|
-
com.append = false;
|
|
173
|
-
}
|
|
174
|
-
export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable, fields?: string[]): S {
|
|
175
|
-
const sLimit = searchable.limit;
|
|
176
|
-
obj.fields = fields;
|
|
177
|
-
if (searchable.pageIndex && searchable.pageIndex > 1) {
|
|
178
|
-
obj.page = searchable.pageIndex;
|
|
179
|
-
} else {
|
|
180
|
-
delete obj.page;
|
|
181
|
-
}
|
|
182
|
-
if (sLimit){
|
|
183
|
-
obj.limit = searchable.limit;
|
|
184
|
-
}else{
|
|
185
|
-
obj.limit = searchable.pageSize;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (searchable.appendMode && searchable.initPageSize !== searchable.pageSize) {
|
|
189
|
-
obj.firstLimit = searchable.initPageSize;
|
|
190
|
-
} else {
|
|
191
|
-
delete obj.firstLimit;
|
|
192
|
-
}
|
|
193
|
-
if (searchable.sortField && searchable.sortField.length > 0) {
|
|
194
|
-
obj.sort = (searchable.sortType === '-' ? '-' + searchable.sortField : searchable.sortField);
|
|
195
|
-
} else {
|
|
196
|
-
delete obj.sort;
|
|
197
|
-
}
|
|
198
|
-
if(searchable) {
|
|
199
|
-
mapObjects(obj, searchable as S);
|
|
200
|
-
}
|
|
201
|
-
return obj;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function mapObjects(dest: any, src: any): void {
|
|
205
|
-
for (let key in dest) {
|
|
206
|
-
if (src.hasOwnProperty(key) && src[key] !== null && src[key] !== undefined) {
|
|
207
|
-
if(Array.isArray(dest[key]) && typeof src[key] === 'string' && src[key].length > 0) {
|
|
208
|
-
const arrayObjKeySrc = src[key].length > 0 ? (src[key])?.split(',') : [];
|
|
209
|
-
if(arrayObjKeySrc && arrayObjKeySrc.length > 1) {
|
|
210
|
-
dest[key] = [...arrayObjKeySrc];
|
|
211
|
-
} else {
|
|
212
|
-
dest[key] = [];
|
|
213
|
-
dest[key].push(src[key])
|
|
214
|
-
}
|
|
215
|
-
} else {
|
|
216
|
-
dest[key] = src[key];
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export function append<T>(list?: T[], results?: T[]): T[] {
|
|
223
|
-
if (list && results) {
|
|
224
|
-
for (const obj of results) {
|
|
225
|
-
list.push(obj);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (!list) {
|
|
229
|
-
return [];
|
|
230
|
-
}
|
|
231
|
-
return list;
|
|
232
|
-
}
|
|
233
|
-
/*
|
|
234
|
-
export function showResults<T>(com: Pagination, s: Filter, list: T[], total?: number, nextPageToken?: string): void {
|
|
235
|
-
com.pageIndex = (s.page && s.page >= 1 ? s.page : 1);
|
|
236
|
-
if (total) {
|
|
237
|
-
com.itemTotal = total;
|
|
238
|
-
}
|
|
239
|
-
if (com.appendMode) {
|
|
240
|
-
let limit = s.limit;
|
|
241
|
-
if (s.page <= 1 && s.firstLimit && s.firstLimit > 0) {
|
|
242
|
-
limit = s.firstLimit;
|
|
243
|
-
}
|
|
244
|
-
handleAppend(com, limit, list, nextPageToken);
|
|
245
|
-
} else {
|
|
246
|
-
showPaging(com, s.limit, list, total);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
*/
|
|
250
|
-
export function handleAppend<T>(com: Pagination, list: T[], limit?: number, nextPageToken?: string): void {
|
|
251
|
-
if (!limit || limit === 0) {
|
|
252
|
-
com.appendable = false;
|
|
253
|
-
} else {
|
|
254
|
-
if (!nextPageToken || nextPageToken.length === 0 || list.length < limit) {
|
|
255
|
-
com.appendable = false;
|
|
256
|
-
} else {
|
|
257
|
-
com.appendable = true;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
if (!list || list.length === 0) {
|
|
261
|
-
com.appendable = false;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
export function showPaging<T>(com: Pagination, list: T[], pageSize?: number, total?: number): void {
|
|
265
|
-
com.total = total;
|
|
266
|
-
const pageTotal = getPageTotal(pageSize, total);
|
|
267
|
-
com.pages = pageTotal;
|
|
268
|
-
com.showPaging = (!total || com.pages <= 1 || (list && list.length >= total) ? false : true);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
export function getFields(form?: HTMLFormElement): string[]|undefined {
|
|
272
|
-
if (!form) {
|
|
273
|
-
return undefined;
|
|
274
|
-
}
|
|
275
|
-
let nodes = form.nextSibling as HTMLElement;
|
|
276
|
-
if (!nodes.querySelector) {
|
|
277
|
-
if (!form.nextSibling) {
|
|
278
|
-
return [];
|
|
279
|
-
} else {
|
|
280
|
-
nodes = form.nextSibling.nextSibling as HTMLElement;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
if (!nodes.querySelector) {
|
|
284
|
-
return [];
|
|
285
|
-
}
|
|
286
|
-
const table = nodes.querySelector('table');
|
|
287
|
-
const fields: string[] = [];
|
|
288
|
-
if (table) {
|
|
289
|
-
const thead = table.querySelector('thead');
|
|
290
|
-
if (thead) {
|
|
291
|
-
const ths = thead.querySelectorAll('th');
|
|
292
|
-
if (ths) {
|
|
293
|
-
const l = ths.length;
|
|
294
|
-
for (let i = 0; i < l; i++) {
|
|
295
|
-
const th = ths[i];
|
|
296
|
-
const field = th.getAttribute('data-field');
|
|
297
|
-
if (field) {
|
|
298
|
-
fields.push(field);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return fields;
|
|
305
|
-
}
|
|
306
|
-
interface Component<T> {
|
|
307
|
-
pageIndex?: number;
|
|
308
|
-
pageSize?: number;
|
|
309
|
-
initPageSize?: number;
|
|
310
|
-
sequenceNo?: string;
|
|
311
|
-
format?: (oj: T, lc?: Locale) => T;
|
|
312
|
-
}
|
|
313
|
-
export function formatResultsByComponent<T>(results: T[], c: Component<T>, lc: Locale) {
|
|
314
|
-
formatResults(results, c.pageIndex, c.pageSize, c.pageSize, c.sequenceNo, c.format, lc);
|
|
315
|
-
}
|
|
316
|
-
export function formatResults<T>(results: T[], pageIndex?: number, pageSize?: number, initPageSize?: number, sequenceNo?: string, ft?: (oj: T, lc?: Locale) => T, lc?: Locale): void {
|
|
317
|
-
if (results && results.length > 0) {
|
|
318
|
-
let hasSequencePro = false;
|
|
319
|
-
if (ft) {
|
|
320
|
-
if (sequenceNo && sequenceNo.length > 0) {
|
|
321
|
-
for (const obj of results) {
|
|
322
|
-
if ((obj as any)[sequenceNo]) {
|
|
323
|
-
hasSequencePro = true;
|
|
324
|
-
}
|
|
325
|
-
ft(obj, lc);
|
|
326
|
-
}
|
|
327
|
-
} else {
|
|
328
|
-
for (const obj of results) {
|
|
329
|
-
ft(obj, lc);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
} else if (sequenceNo && sequenceNo.length > 0) {
|
|
333
|
-
for (const obj of results) {
|
|
334
|
-
if ((obj as any)[sequenceNo]) {
|
|
335
|
-
hasSequencePro = true;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
if (sequenceNo && sequenceNo.length > 0 && !hasSequencePro) {
|
|
340
|
-
if (!pageIndex) {
|
|
341
|
-
pageIndex = 1;
|
|
342
|
-
}
|
|
343
|
-
if (pageSize) {
|
|
344
|
-
if (!initPageSize) {
|
|
345
|
-
initPageSize = pageSize;
|
|
346
|
-
}
|
|
347
|
-
if (pageIndex <= 1) {
|
|
348
|
-
for (let i = 0; i < results.length; i++) {
|
|
349
|
-
(results[i] as any)[sequenceNo] = i - pageSize + pageSize * pageIndex + 1;
|
|
350
|
-
}
|
|
351
|
-
} else {
|
|
352
|
-
for (let i = 0; i < results.length; i++) {
|
|
353
|
-
(results[i] as any)[sequenceNo] = i - pageSize + pageSize * pageIndex + 1 - (pageSize - initPageSize);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
} else {
|
|
357
|
-
for (let i = 0; i < results.length; i++) {
|
|
358
|
-
(results[i] as any)[sequenceNo] = i + 1;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
export function getPageTotal(pageSize?: number, total?: number): number {
|
|
366
|
-
if (!pageSize || pageSize <= 0) {
|
|
367
|
-
return 1;
|
|
368
|
-
} else {
|
|
369
|
-
if (!total) {
|
|
370
|
-
total = 0;
|
|
371
|
-
}
|
|
372
|
-
if ((total % pageSize) === 0) {
|
|
373
|
-
return Math.floor((total / pageSize));
|
|
374
|
-
}
|
|
375
|
-
return Math.floor((total / pageSize) + 1);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
export function buildMessage<T>(r: ResourceService, pageIndex: number|undefined, pageSize: number, results: T[], total?: number): string {
|
|
380
|
-
if (!results || results.length === 0) {
|
|
381
|
-
return r.value('msg_no_data_found');
|
|
382
|
-
} else {
|
|
383
|
-
if (!pageIndex) {
|
|
384
|
-
pageIndex = 1;
|
|
385
|
-
}
|
|
386
|
-
const fromIndex = (pageIndex - 1) * pageSize + 1;
|
|
387
|
-
const toIndex = fromIndex + results.length - 1;
|
|
388
|
-
const pageTotal = getPageTotal(pageSize, total);
|
|
389
|
-
if (pageTotal > 1) {
|
|
390
|
-
const msg2 = r.format(r.value('msg_search_result_page_sequence'), fromIndex, toIndex, total, pageIndex, pageTotal);
|
|
391
|
-
return msg2;
|
|
392
|
-
} else {
|
|
393
|
-
const msg3 = r.format(r.value('msg_search_result_sequence'), fromIndex, toIndex);
|
|
394
|
-
return msg3;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
function removeFormatUrl(url: string): string {
|
|
400
|
-
const startParams = url.indexOf('?');
|
|
401
|
-
return startParams !== -1 ? url.substring(0, startParams) : url;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: boolean, fields?: string, limit?: string): void {
|
|
406
|
-
if (!isFirstLoad) {
|
|
407
|
-
if (!fields || fields.length === 0) {
|
|
408
|
-
fields = 'fields';
|
|
409
|
-
}
|
|
410
|
-
if (!limit || limit.length === 0) {
|
|
411
|
-
limit = 'limit';
|
|
412
|
-
}
|
|
413
|
-
const pageIndex = ft.page;
|
|
414
|
-
if (pageIndex && !isNaN(pageIndex) && pageIndex <= 1) {
|
|
415
|
-
delete ft.page;
|
|
416
|
-
}
|
|
417
|
-
const keys = Object.keys(ft);
|
|
418
|
-
const currentUrl = window.location.host + window.location.pathname;
|
|
419
|
-
let url = removeFormatUrl(currentUrl);
|
|
420
|
-
for (const key of keys) {
|
|
421
|
-
const objValue = (ft as any)[key];
|
|
422
|
-
if (objValue) {
|
|
423
|
-
if (key !== fields) {
|
|
424
|
-
if (typeof objValue === 'string' || typeof objValue === 'number') {
|
|
425
|
-
if (key === limit) {
|
|
426
|
-
if (objValue !== resources.limit) {
|
|
427
|
-
if (url.indexOf('?') === -1) {
|
|
428
|
-
url += `?${key}=${objValue}`;
|
|
429
|
-
} else {
|
|
430
|
-
url += `&${key}=${objValue}`;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
} else {
|
|
434
|
-
if (url.indexOf('?') === -1) {
|
|
435
|
-
url += `?${key}=${objValue}`;
|
|
436
|
-
} else {
|
|
437
|
-
url += `&${key}=${objValue}`;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
} else if (typeof objValue === 'object') {
|
|
441
|
-
if (objValue instanceof Date) {
|
|
442
|
-
if (url.indexOf('?') === -1) {
|
|
443
|
-
url += `?${key}=${objValue.toISOString()}`;
|
|
444
|
-
} else {
|
|
445
|
-
url += `&${key}=${objValue.toISOString()}`;
|
|
446
|
-
}
|
|
447
|
-
} else {
|
|
448
|
-
if (Array.isArray(objValue)) {
|
|
449
|
-
if (objValue.length > 0) {
|
|
450
|
-
const strs = [];
|
|
451
|
-
for (const subValue of objValue) {
|
|
452
|
-
if (typeof subValue === 'string') {
|
|
453
|
-
strs.push(subValue);
|
|
454
|
-
} else if (typeof subValue === 'number') {
|
|
455
|
-
strs.push(subValue.toString());
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
if (url.indexOf('?') === -1) {
|
|
459
|
-
url += `?${key}=${strs.join(',')}`;
|
|
460
|
-
} else {
|
|
461
|
-
url += `&${key}=${strs.join(',')}`;
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
} else {
|
|
465
|
-
const keysLvl2 = Object.keys(objValue);
|
|
466
|
-
for (const key2 of keysLvl2) {
|
|
467
|
-
const objValueLvl2 = objValue[key2];
|
|
468
|
-
if (url.indexOf('?') === -1) {
|
|
469
|
-
if (objValueLvl2 instanceof Date) {
|
|
470
|
-
url += `?${key}.${key2}=${objValueLvl2.toISOString()}`;
|
|
471
|
-
} else {
|
|
472
|
-
url += `?${key}.${key2}=${objValueLvl2}`;
|
|
473
|
-
}
|
|
474
|
-
} else {
|
|
475
|
-
if (objValueLvl2 instanceof Date) {
|
|
476
|
-
url += `&${key}.${key2}=${objValueLvl2.toISOString()}`;
|
|
477
|
-
} else {
|
|
478
|
-
url += `&${key}.${key2}=${objValueLvl2}`;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
let p = 'http://';
|
|
489
|
-
const loc = window.location.href;
|
|
490
|
-
if (loc.length >= 8) {
|
|
491
|
-
const ss = loc.substr(0, 8);
|
|
492
|
-
if (ss === 'https://') {
|
|
493
|
-
p = 'https://';
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
window.history.replaceState({path: currentUrl}, '', p + url);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
export interface Sort {
|
|
501
|
-
field?: string;
|
|
502
|
-
type?: string;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
export function handleSortEvent(event: Event, com: Sortable): void {
|
|
506
|
-
if (event && event.target) {
|
|
507
|
-
const target = event.target as HTMLElement;
|
|
508
|
-
const s = handleSort(target, com.sortTarget, com.sortField, com.sortType);
|
|
509
|
-
com.sortField = s.field;
|
|
510
|
-
com.sortType = s.type;
|
|
511
|
-
com.sortTarget = target;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
export function handleSort(target: HTMLElement, previousTarget?: HTMLElement, sortField?: string, sortType?: string): Sort {
|
|
516
|
-
const type = target.getAttribute('sort-type');
|
|
517
|
-
const field = toggleSortStyle(target);
|
|
518
|
-
const s = sort(sortField, sortType, field, type == null ? undefined : type);
|
|
519
|
-
if (sortField !== field) {
|
|
520
|
-
removeSortStatus(previousTarget);
|
|
521
|
-
}
|
|
522
|
-
return s;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
export function sort(preField?: string, preSortType?: string, field?: string, sortType?: string): Sort {
|
|
526
|
-
if (!preField || preField === '') {
|
|
527
|
-
const s: Sort = {
|
|
528
|
-
field,
|
|
529
|
-
type: '+'
|
|
530
|
-
};
|
|
531
|
-
return s;
|
|
532
|
-
} else if (preField !== field) {
|
|
533
|
-
const s: Sort = {
|
|
534
|
-
field,
|
|
535
|
-
type: (!sortType ? '+' : sortType)
|
|
536
|
-
};
|
|
537
|
-
return s;
|
|
538
|
-
} else if (preField === field) {
|
|
539
|
-
const type = (preSortType === '+' ? '-' : '+');
|
|
540
|
-
const s: Sort = {field, type};
|
|
541
|
-
return s;
|
|
542
|
-
} else {
|
|
543
|
-
return {field, type: sortType};
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
export function removeSortStatus(target?: HTMLElement): void {
|
|
548
|
-
if (target && target.children.length > 0) {
|
|
549
|
-
target.removeChild(target.children[0]);
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
export function toggleSortStyle(target: HTMLElement): string {
|
|
554
|
-
let field = target.getAttribute('data-field');
|
|
555
|
-
if (!field) {
|
|
556
|
-
const p = target.parentNode as HTMLElement;
|
|
557
|
-
if (p) {
|
|
558
|
-
field = p.getAttribute('data-field');
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
if (!field || field.length === 0) {
|
|
562
|
-
return '';
|
|
563
|
-
}
|
|
564
|
-
if (target.nodeName === 'I') {
|
|
565
|
-
target = target.parentNode as HTMLElement;
|
|
566
|
-
}
|
|
567
|
-
let i = null;
|
|
568
|
-
if (target.children.length === 0) {
|
|
569
|
-
target.innerHTML = target.innerHTML + '<i class="sort-up"></i>';
|
|
570
|
-
} else {
|
|
571
|
-
i = target.children[0];
|
|
572
|
-
if (i.classList.contains('sort-up')) {
|
|
573
|
-
i.classList.remove('sort-up');
|
|
574
|
-
i.classList.add('sort-down');
|
|
575
|
-
} else if (i.classList.contains('sort-down')) {
|
|
576
|
-
i.classList.remove('sort-down');
|
|
577
|
-
i.classList.add('sort-up');
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
return field;
|
|
581
|
-
}
|
|
582
|
-
export function getModel<S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[]|number[]): S {
|
|
583
|
-
let obj2 = getModelFromState(state, modelName);
|
|
584
|
-
|
|
585
|
-
const obj: any = obj2 ? obj2 : {};
|
|
586
|
-
const obj3 = optimizeFilter(obj, searchable, fields);
|
|
587
|
-
obj3.excluding = excluding;
|
|
588
|
-
return obj3;
|
|
589
|
-
}
|
|
590
|
-
function getModelFromState(state: any, modelName: string): any {
|
|
591
|
-
if (!modelName || modelName.length === 0) {
|
|
592
|
-
return state;
|
|
593
|
-
}
|
|
594
|
-
if (!state) {
|
|
595
|
-
return state;
|
|
596
|
-
}
|
|
597
|
-
return state[modelName];
|
|
598
|
-
}
|
|
599
|
-
export function getFieldsFromForm(fields?: string[], initFields?: boolean, form?: HTMLFormElement|null): string[]|undefined {
|
|
600
|
-
if (fields && fields.length > 0) {
|
|
601
|
-
return fields;
|
|
602
|
-
}
|
|
603
|
-
if (!initFields) {
|
|
604
|
-
if (form) {
|
|
605
|
-
return getFields(form);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
return fields;
|
|
609
|
-
}
|
|
610
|
-
export function validate<S extends Filter>(se: S, callback: () => void, form?: HTMLFormElement|null, lc?: Locale, vf?: (f: HTMLFormElement, lc2?: Locale, focus?: boolean, scr?: boolean) => boolean): void {
|
|
611
|
-
let valid = true;
|
|
612
|
-
if (form && vf) {
|
|
613
|
-
valid = vf(form, lc);
|
|
614
|
-
}
|
|
615
|
-
if (valid === true) {
|
|
616
|
-
callback();
|
|
617
|
-
}
|
|
618
|
-
}
|
|
1
|
+
// tslint:disable-next-line:class-name
|
|
2
|
+
export class resources {
|
|
3
|
+
static limit = 24;
|
|
4
|
+
}
|
|
5
|
+
interface Filter {
|
|
6
|
+
page?: number;
|
|
7
|
+
limit?: number;
|
|
8
|
+
firstLimit?: number;
|
|
9
|
+
fields?: string[];
|
|
10
|
+
sort?: string;
|
|
11
|
+
}
|
|
12
|
+
interface Locale {
|
|
13
|
+
id?: string;
|
|
14
|
+
countryCode: string;
|
|
15
|
+
dateFormat: string;
|
|
16
|
+
firstDayOfWeek: number;
|
|
17
|
+
decimalSeparator: string;
|
|
18
|
+
groupSeparator: string;
|
|
19
|
+
decimalDigits: number;
|
|
20
|
+
currencyCode: string;
|
|
21
|
+
currencySymbol: string;
|
|
22
|
+
currencyPattern: number;
|
|
23
|
+
currencySample?: string;
|
|
24
|
+
}
|
|
25
|
+
interface ResourceService {
|
|
26
|
+
value(key: string, param?: any): string;
|
|
27
|
+
format(f: string, ...args: any[]): string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface Sortable {
|
|
31
|
+
sortField?: string;
|
|
32
|
+
sortType?: string;
|
|
33
|
+
sortTarget?: HTMLElement;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface Pagination {
|
|
37
|
+
initPageSize?: number;
|
|
38
|
+
pageSize?: number;
|
|
39
|
+
limit?: number;
|
|
40
|
+
pageIndex?: number;
|
|
41
|
+
total?: number;
|
|
42
|
+
pages?: number;
|
|
43
|
+
showPaging?: boolean;
|
|
44
|
+
append?: boolean;
|
|
45
|
+
appendMode?: boolean;
|
|
46
|
+
appendable?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface Searchable extends Pagination, Sortable {
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function mergeFilter<S extends Filter>(obj: S, b?: S, pageSizes?: number[], arrs?: string[]|any) {
|
|
53
|
+
let a: any = b;
|
|
54
|
+
if (!b) {
|
|
55
|
+
a = {};
|
|
56
|
+
}
|
|
57
|
+
const slimit: any = obj['limit'];
|
|
58
|
+
if (!isNaN(slimit)) {
|
|
59
|
+
const limit = parseInt(slimit, 10);
|
|
60
|
+
if (pageSizes && pageSizes.length > 0) {
|
|
61
|
+
if (pageSizes.indexOf(limit) >= 0) {
|
|
62
|
+
a.limit = limit;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
a.limit = limit;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
delete obj['limit'];
|
|
69
|
+
const keys = Object.keys(obj);
|
|
70
|
+
for (const key of keys) {
|
|
71
|
+
const p = a[key];
|
|
72
|
+
const v = (obj as any)[key];
|
|
73
|
+
if (v && v !== '') {
|
|
74
|
+
a[key] = (isArray(key, p, arrs) ? v.split(',') : v);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return a;
|
|
78
|
+
}
|
|
79
|
+
export function isArray(key: string, p: any, arrs: string[]|any): boolean {
|
|
80
|
+
if (p) {
|
|
81
|
+
if (Array.isArray(p)) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (arrs) {
|
|
86
|
+
if (Array.isArray(arrs)) {
|
|
87
|
+
if (arrs.indexOf(key) >= 0) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
const v = arrs[key];
|
|
92
|
+
if (v && Array.isArray(v)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// m is search model or an object which is parsed from url
|
|
101
|
+
export function initFilter<S extends Filter>(m: S, com: Searchable): S {
|
|
102
|
+
if (!isNaN(m.page as any)) {
|
|
103
|
+
const page = parseInt(m.page as any, 10);
|
|
104
|
+
m.page = page;
|
|
105
|
+
if (page >= 1) {
|
|
106
|
+
com.pageIndex = page;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!isNaN(m.limit as any)) {
|
|
110
|
+
const pageSize = parseInt(m.limit as any, 10);
|
|
111
|
+
m.limit = pageSize;
|
|
112
|
+
if (pageSize > 0) {
|
|
113
|
+
com.pageSize = pageSize;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!m.limit && com.pageSize) {
|
|
117
|
+
m.limit = com.pageSize;
|
|
118
|
+
}
|
|
119
|
+
if (!isNaN(m.firstLimit as any)) {
|
|
120
|
+
const initPageSize = parseInt(m.firstLimit as any, 10);
|
|
121
|
+
if (initPageSize > 0) {
|
|
122
|
+
m.firstLimit = initPageSize;
|
|
123
|
+
com.initPageSize = initPageSize;
|
|
124
|
+
} else {
|
|
125
|
+
com.initPageSize = com.pageSize;
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
com.initPageSize = com.pageSize;
|
|
129
|
+
}
|
|
130
|
+
const st = m.sort;
|
|
131
|
+
if (st && st.length > 0) {
|
|
132
|
+
const ch = st.charAt(0);
|
|
133
|
+
if (ch === '+' || ch === '-') {
|
|
134
|
+
com.sortField = st.substring(1);
|
|
135
|
+
com.sortType = ch;
|
|
136
|
+
} else {
|
|
137
|
+
com.sortField = st;
|
|
138
|
+
com.sortType = '';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/*
|
|
142
|
+
delete m.page;
|
|
143
|
+
delete m.limit;
|
|
144
|
+
delete m.firstLimit;
|
|
145
|
+
*/
|
|
146
|
+
return m;
|
|
147
|
+
}
|
|
148
|
+
export function more(com: Pagination): void {
|
|
149
|
+
com.append = true;
|
|
150
|
+
if (!com.pageIndex) {
|
|
151
|
+
com.pageIndex = 1;
|
|
152
|
+
} else {
|
|
153
|
+
com.pageIndex = com.pageIndex + 1;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function reset(com: Searchable): void {
|
|
158
|
+
removeSortStatus(com.sortTarget);
|
|
159
|
+
com.sortTarget = undefined;
|
|
160
|
+
com.sortField = undefined;
|
|
161
|
+
com.append = false;
|
|
162
|
+
com.pageIndex = 1;
|
|
163
|
+
}
|
|
164
|
+
export function changePageSize(com: Pagination, size: number): void {
|
|
165
|
+
com.initPageSize = size;
|
|
166
|
+
com.pageSize = size;
|
|
167
|
+
com.pageIndex = 1;
|
|
168
|
+
}
|
|
169
|
+
export function changePage(com: Pagination, pageIndex: number, pageSize: number): void {
|
|
170
|
+
com.pageIndex = pageIndex;
|
|
171
|
+
com.pageSize = pageSize;
|
|
172
|
+
com.append = false;
|
|
173
|
+
}
|
|
174
|
+
export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable, fields?: string[]): S {
|
|
175
|
+
const sLimit = searchable.limit;
|
|
176
|
+
obj.fields = fields;
|
|
177
|
+
if (searchable.pageIndex && searchable.pageIndex > 1) {
|
|
178
|
+
obj.page = searchable.pageIndex;
|
|
179
|
+
} else {
|
|
180
|
+
delete obj.page;
|
|
181
|
+
}
|
|
182
|
+
if (sLimit){
|
|
183
|
+
obj.limit = searchable.limit;
|
|
184
|
+
}else{
|
|
185
|
+
obj.limit = searchable.pageSize;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (searchable.appendMode && searchable.initPageSize !== searchable.pageSize) {
|
|
189
|
+
obj.firstLimit = searchable.initPageSize;
|
|
190
|
+
} else {
|
|
191
|
+
delete obj.firstLimit;
|
|
192
|
+
}
|
|
193
|
+
if (searchable.sortField && searchable.sortField.length > 0) {
|
|
194
|
+
obj.sort = (searchable.sortType === '-' ? '-' + searchable.sortField : searchable.sortField);
|
|
195
|
+
} else {
|
|
196
|
+
delete obj.sort;
|
|
197
|
+
}
|
|
198
|
+
if(searchable) {
|
|
199
|
+
mapObjects(obj, searchable as S);
|
|
200
|
+
}
|
|
201
|
+
return obj;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function mapObjects(dest: any, src: any): void {
|
|
205
|
+
for (let key in dest) {
|
|
206
|
+
if (src.hasOwnProperty(key) && src[key] !== null && src[key] !== undefined) {
|
|
207
|
+
if(Array.isArray(dest[key]) && typeof src[key] === 'string' && src[key].length > 0) {
|
|
208
|
+
const arrayObjKeySrc = src[key].length > 0 ? (src[key])?.split(',') : [];
|
|
209
|
+
if(arrayObjKeySrc && arrayObjKeySrc.length > 1) {
|
|
210
|
+
dest[key] = [...arrayObjKeySrc];
|
|
211
|
+
} else {
|
|
212
|
+
dest[key] = [];
|
|
213
|
+
dest[key].push(src[key])
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
dest[key] = src[key];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function append<T>(list?: T[], results?: T[]): T[] {
|
|
223
|
+
if (list && results) {
|
|
224
|
+
for (const obj of results) {
|
|
225
|
+
list.push(obj);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!list) {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
return list;
|
|
232
|
+
}
|
|
233
|
+
/*
|
|
234
|
+
export function showResults<T>(com: Pagination, s: Filter, list: T[], total?: number, nextPageToken?: string): void {
|
|
235
|
+
com.pageIndex = (s.page && s.page >= 1 ? s.page : 1);
|
|
236
|
+
if (total) {
|
|
237
|
+
com.itemTotal = total;
|
|
238
|
+
}
|
|
239
|
+
if (com.appendMode) {
|
|
240
|
+
let limit = s.limit;
|
|
241
|
+
if (s.page <= 1 && s.firstLimit && s.firstLimit > 0) {
|
|
242
|
+
limit = s.firstLimit;
|
|
243
|
+
}
|
|
244
|
+
handleAppend(com, limit, list, nextPageToken);
|
|
245
|
+
} else {
|
|
246
|
+
showPaging(com, s.limit, list, total);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
*/
|
|
250
|
+
export function handleAppend<T>(com: Pagination, list: T[], limit?: number, nextPageToken?: string): void {
|
|
251
|
+
if (!limit || limit === 0) {
|
|
252
|
+
com.appendable = false;
|
|
253
|
+
} else {
|
|
254
|
+
if (!nextPageToken || nextPageToken.length === 0 || list.length < limit) {
|
|
255
|
+
com.appendable = false;
|
|
256
|
+
} else {
|
|
257
|
+
com.appendable = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (!list || list.length === 0) {
|
|
261
|
+
com.appendable = false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export function showPaging<T>(com: Pagination, list: T[], pageSize?: number, total?: number): void {
|
|
265
|
+
com.total = total;
|
|
266
|
+
const pageTotal = getPageTotal(pageSize, total);
|
|
267
|
+
com.pages = pageTotal;
|
|
268
|
+
com.showPaging = (!total || com.pages <= 1 || (list && list.length >= total) ? false : true);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function getFields(form?: HTMLFormElement): string[]|undefined {
|
|
272
|
+
if (!form) {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
let nodes = form.nextSibling as HTMLElement;
|
|
276
|
+
if (!nodes.querySelector) {
|
|
277
|
+
if (!form.nextSibling) {
|
|
278
|
+
return [];
|
|
279
|
+
} else {
|
|
280
|
+
nodes = form.nextSibling.nextSibling as HTMLElement;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (!nodes.querySelector) {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
const table = nodes.querySelector('table');
|
|
287
|
+
const fields: string[] = [];
|
|
288
|
+
if (table) {
|
|
289
|
+
const thead = table.querySelector('thead');
|
|
290
|
+
if (thead) {
|
|
291
|
+
const ths = thead.querySelectorAll('th');
|
|
292
|
+
if (ths) {
|
|
293
|
+
const l = ths.length;
|
|
294
|
+
for (let i = 0; i < l; i++) {
|
|
295
|
+
const th = ths[i];
|
|
296
|
+
const field = th.getAttribute('data-field');
|
|
297
|
+
if (field) {
|
|
298
|
+
fields.push(field);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return fields;
|
|
305
|
+
}
|
|
306
|
+
interface Component<T> {
|
|
307
|
+
pageIndex?: number;
|
|
308
|
+
pageSize?: number;
|
|
309
|
+
initPageSize?: number;
|
|
310
|
+
sequenceNo?: string;
|
|
311
|
+
format?: (oj: T, lc?: Locale) => T;
|
|
312
|
+
}
|
|
313
|
+
export function formatResultsByComponent<T>(results: T[], c: Component<T>, lc: Locale) {
|
|
314
|
+
formatResults(results, c.pageIndex, c.pageSize, c.pageSize, c.sequenceNo, c.format, lc);
|
|
315
|
+
}
|
|
316
|
+
export function formatResults<T>(results: T[], pageIndex?: number, pageSize?: number, initPageSize?: number, sequenceNo?: string, ft?: (oj: T, lc?: Locale) => T, lc?: Locale): void {
|
|
317
|
+
if (results && results.length > 0) {
|
|
318
|
+
let hasSequencePro = false;
|
|
319
|
+
if (ft) {
|
|
320
|
+
if (sequenceNo && sequenceNo.length > 0) {
|
|
321
|
+
for (const obj of results) {
|
|
322
|
+
if ((obj as any)[sequenceNo]) {
|
|
323
|
+
hasSequencePro = true;
|
|
324
|
+
}
|
|
325
|
+
ft(obj, lc);
|
|
326
|
+
}
|
|
327
|
+
} else {
|
|
328
|
+
for (const obj of results) {
|
|
329
|
+
ft(obj, lc);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
} else if (sequenceNo && sequenceNo.length > 0) {
|
|
333
|
+
for (const obj of results) {
|
|
334
|
+
if ((obj as any)[sequenceNo]) {
|
|
335
|
+
hasSequencePro = true;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (sequenceNo && sequenceNo.length > 0 && !hasSequencePro) {
|
|
340
|
+
if (!pageIndex) {
|
|
341
|
+
pageIndex = 1;
|
|
342
|
+
}
|
|
343
|
+
if (pageSize) {
|
|
344
|
+
if (!initPageSize) {
|
|
345
|
+
initPageSize = pageSize;
|
|
346
|
+
}
|
|
347
|
+
if (pageIndex <= 1) {
|
|
348
|
+
for (let i = 0; i < results.length; i++) {
|
|
349
|
+
(results[i] as any)[sequenceNo] = i - pageSize + pageSize * pageIndex + 1;
|
|
350
|
+
}
|
|
351
|
+
} else {
|
|
352
|
+
for (let i = 0; i < results.length; i++) {
|
|
353
|
+
(results[i] as any)[sequenceNo] = i - pageSize + pageSize * pageIndex + 1 - (pageSize - initPageSize);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
} else {
|
|
357
|
+
for (let i = 0; i < results.length; i++) {
|
|
358
|
+
(results[i] as any)[sequenceNo] = i + 1;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export function getPageTotal(pageSize?: number, total?: number): number {
|
|
366
|
+
if (!pageSize || pageSize <= 0) {
|
|
367
|
+
return 1;
|
|
368
|
+
} else {
|
|
369
|
+
if (!total) {
|
|
370
|
+
total = 0;
|
|
371
|
+
}
|
|
372
|
+
if ((total % pageSize) === 0) {
|
|
373
|
+
return Math.floor((total / pageSize));
|
|
374
|
+
}
|
|
375
|
+
return Math.floor((total / pageSize) + 1);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function buildMessage<T>(r: ResourceService, pageIndex: number|undefined, pageSize: number, results: T[], total?: number): string {
|
|
380
|
+
if (!results || results.length === 0) {
|
|
381
|
+
return r.value('msg_no_data_found');
|
|
382
|
+
} else {
|
|
383
|
+
if (!pageIndex) {
|
|
384
|
+
pageIndex = 1;
|
|
385
|
+
}
|
|
386
|
+
const fromIndex = (pageIndex - 1) * pageSize + 1;
|
|
387
|
+
const toIndex = fromIndex + results.length - 1;
|
|
388
|
+
const pageTotal = getPageTotal(pageSize, total);
|
|
389
|
+
if (pageTotal > 1) {
|
|
390
|
+
const msg2 = r.format(r.value('msg_search_result_page_sequence'), fromIndex, toIndex, total, pageIndex, pageTotal);
|
|
391
|
+
return msg2;
|
|
392
|
+
} else {
|
|
393
|
+
const msg3 = r.format(r.value('msg_search_result_sequence'), fromIndex, toIndex);
|
|
394
|
+
return msg3;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function removeFormatUrl(url: string): string {
|
|
400
|
+
const startParams = url.indexOf('?');
|
|
401
|
+
return startParams !== -1 ? url.substring(0, startParams) : url;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: boolean, fields?: string, limit?: string): void {
|
|
406
|
+
if (!isFirstLoad) {
|
|
407
|
+
if (!fields || fields.length === 0) {
|
|
408
|
+
fields = 'fields';
|
|
409
|
+
}
|
|
410
|
+
if (!limit || limit.length === 0) {
|
|
411
|
+
limit = 'limit';
|
|
412
|
+
}
|
|
413
|
+
const pageIndex = ft.page;
|
|
414
|
+
if (pageIndex && !isNaN(pageIndex) && pageIndex <= 1) {
|
|
415
|
+
delete ft.page;
|
|
416
|
+
}
|
|
417
|
+
const keys = Object.keys(ft);
|
|
418
|
+
const currentUrl = window.location.host + window.location.pathname;
|
|
419
|
+
let url = removeFormatUrl(currentUrl);
|
|
420
|
+
for (const key of keys) {
|
|
421
|
+
const objValue = (ft as any)[key];
|
|
422
|
+
if (objValue) {
|
|
423
|
+
if (key !== fields) {
|
|
424
|
+
if (typeof objValue === 'string' || typeof objValue === 'number') {
|
|
425
|
+
if (key === limit) {
|
|
426
|
+
if (objValue !== resources.limit) {
|
|
427
|
+
if (url.indexOf('?') === -1) {
|
|
428
|
+
url += `?${key}=${objValue}`;
|
|
429
|
+
} else {
|
|
430
|
+
url += `&${key}=${objValue}`;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
} else {
|
|
434
|
+
if (url.indexOf('?') === -1) {
|
|
435
|
+
url += `?${key}=${objValue}`;
|
|
436
|
+
} else {
|
|
437
|
+
url += `&${key}=${objValue}`;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
} else if (typeof objValue === 'object') {
|
|
441
|
+
if (objValue instanceof Date) {
|
|
442
|
+
if (url.indexOf('?') === -1) {
|
|
443
|
+
url += `?${key}=${objValue.toISOString()}`;
|
|
444
|
+
} else {
|
|
445
|
+
url += `&${key}=${objValue.toISOString()}`;
|
|
446
|
+
}
|
|
447
|
+
} else {
|
|
448
|
+
if (Array.isArray(objValue)) {
|
|
449
|
+
if (objValue.length > 0) {
|
|
450
|
+
const strs = [];
|
|
451
|
+
for (const subValue of objValue) {
|
|
452
|
+
if (typeof subValue === 'string') {
|
|
453
|
+
strs.push(subValue);
|
|
454
|
+
} else if (typeof subValue === 'number') {
|
|
455
|
+
strs.push(subValue.toString());
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (url.indexOf('?') === -1) {
|
|
459
|
+
url += `?${key}=${strs.join(',')}`;
|
|
460
|
+
} else {
|
|
461
|
+
url += `&${key}=${strs.join(',')}`;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
} else {
|
|
465
|
+
const keysLvl2 = Object.keys(objValue);
|
|
466
|
+
for (const key2 of keysLvl2) {
|
|
467
|
+
const objValueLvl2 = objValue[key2];
|
|
468
|
+
if (url.indexOf('?') === -1) {
|
|
469
|
+
if (objValueLvl2 instanceof Date) {
|
|
470
|
+
url += `?${key}.${key2}=${objValueLvl2.toISOString()}`;
|
|
471
|
+
} else {
|
|
472
|
+
url += `?${key}.${key2}=${objValueLvl2}`;
|
|
473
|
+
}
|
|
474
|
+
} else {
|
|
475
|
+
if (objValueLvl2 instanceof Date) {
|
|
476
|
+
url += `&${key}.${key2}=${objValueLvl2.toISOString()}`;
|
|
477
|
+
} else {
|
|
478
|
+
url += `&${key}.${key2}=${objValueLvl2}`;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
let p = 'http://';
|
|
489
|
+
const loc = window.location.href;
|
|
490
|
+
if (loc.length >= 8) {
|
|
491
|
+
const ss = loc.substr(0, 8);
|
|
492
|
+
if (ss === 'https://') {
|
|
493
|
+
p = 'https://';
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
window.history.replaceState({path: currentUrl}, '', p + url);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
export interface Sort {
|
|
501
|
+
field?: string;
|
|
502
|
+
type?: string;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export function handleSortEvent(event: Event, com: Sortable): void {
|
|
506
|
+
if (event && event.target) {
|
|
507
|
+
const target = event.target as HTMLElement;
|
|
508
|
+
const s = handleSort(target, com.sortTarget, com.sortField, com.sortType);
|
|
509
|
+
com.sortField = s.field;
|
|
510
|
+
com.sortType = s.type;
|
|
511
|
+
com.sortTarget = target;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export function handleSort(target: HTMLElement, previousTarget?: HTMLElement, sortField?: string, sortType?: string): Sort {
|
|
516
|
+
const type = target.getAttribute('sort-type');
|
|
517
|
+
const field = toggleSortStyle(target);
|
|
518
|
+
const s = sort(sortField, sortType, field, type == null ? undefined : type);
|
|
519
|
+
if (sortField !== field) {
|
|
520
|
+
removeSortStatus(previousTarget);
|
|
521
|
+
}
|
|
522
|
+
return s;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
export function sort(preField?: string, preSortType?: string, field?: string, sortType?: string): Sort {
|
|
526
|
+
if (!preField || preField === '') {
|
|
527
|
+
const s: Sort = {
|
|
528
|
+
field,
|
|
529
|
+
type: '+'
|
|
530
|
+
};
|
|
531
|
+
return s;
|
|
532
|
+
} else if (preField !== field) {
|
|
533
|
+
const s: Sort = {
|
|
534
|
+
field,
|
|
535
|
+
type: (!sortType ? '+' : sortType)
|
|
536
|
+
};
|
|
537
|
+
return s;
|
|
538
|
+
} else if (preField === field) {
|
|
539
|
+
const type = (preSortType === '+' ? '-' : '+');
|
|
540
|
+
const s: Sort = {field, type};
|
|
541
|
+
return s;
|
|
542
|
+
} else {
|
|
543
|
+
return {field, type: sortType};
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
export function removeSortStatus(target?: HTMLElement): void {
|
|
548
|
+
if (target && target.children.length > 0) {
|
|
549
|
+
target.removeChild(target.children[0]);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
export function toggleSortStyle(target: HTMLElement): string {
|
|
554
|
+
let field = target.getAttribute('data-field');
|
|
555
|
+
if (!field) {
|
|
556
|
+
const p = target.parentNode as HTMLElement;
|
|
557
|
+
if (p) {
|
|
558
|
+
field = p.getAttribute('data-field');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
if (!field || field.length === 0) {
|
|
562
|
+
return '';
|
|
563
|
+
}
|
|
564
|
+
if (target.nodeName === 'I') {
|
|
565
|
+
target = target.parentNode as HTMLElement;
|
|
566
|
+
}
|
|
567
|
+
let i = null;
|
|
568
|
+
if (target.children.length === 0) {
|
|
569
|
+
target.innerHTML = target.innerHTML + '<i class="sort-up"></i>';
|
|
570
|
+
} else {
|
|
571
|
+
i = target.children[0];
|
|
572
|
+
if (i.classList.contains('sort-up')) {
|
|
573
|
+
i.classList.remove('sort-up');
|
|
574
|
+
i.classList.add('sort-down');
|
|
575
|
+
} else if (i.classList.contains('sort-down')) {
|
|
576
|
+
i.classList.remove('sort-down');
|
|
577
|
+
i.classList.add('sort-up');
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return field;
|
|
581
|
+
}
|
|
582
|
+
export function getModel<S extends Filter>(state: any, modelName: string, searchable: Searchable, fields?: string[], excluding?: string[]|number[]): S {
|
|
583
|
+
let obj2 = getModelFromState(state, modelName);
|
|
584
|
+
|
|
585
|
+
const obj: any = obj2 ? obj2 : {};
|
|
586
|
+
const obj3 = optimizeFilter(obj, searchable, fields);
|
|
587
|
+
obj3.excluding = excluding;
|
|
588
|
+
return obj3;
|
|
589
|
+
}
|
|
590
|
+
function getModelFromState(state: any, modelName: string): any {
|
|
591
|
+
if (!modelName || modelName.length === 0) {
|
|
592
|
+
return state;
|
|
593
|
+
}
|
|
594
|
+
if (!state) {
|
|
595
|
+
return state;
|
|
596
|
+
}
|
|
597
|
+
return state[modelName];
|
|
598
|
+
}
|
|
599
|
+
export function getFieldsFromForm(fields?: string[], initFields?: boolean, form?: HTMLFormElement|null): string[]|undefined {
|
|
600
|
+
if (fields && fields.length > 0) {
|
|
601
|
+
return fields;
|
|
602
|
+
}
|
|
603
|
+
if (!initFields) {
|
|
604
|
+
if (form) {
|
|
605
|
+
return getFields(form);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return fields;
|
|
609
|
+
}
|
|
610
|
+
export function validate<S extends Filter>(se: S, callback: () => void, form?: HTMLFormElement|null, lc?: Locale, vf?: (f: HTMLFormElement, lc2?: Locale, focus?: boolean, scr?: boolean) => boolean): void {
|
|
611
|
+
let valid = true;
|
|
612
|
+
if (form && vf) {
|
|
613
|
+
valid = vf(form, lc);
|
|
614
|
+
}
|
|
615
|
+
if (valid === true) {
|
|
616
|
+
callback();
|
|
617
|
+
}
|
|
618
|
+
}
|