react-hook-core 0.3.0 → 0.3.2

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/core.js CHANGED
@@ -235,16 +235,3 @@ function getValidateForm(u, vf) {
235
235
  return (u && u.ui ? u.ui.validateForm : undefined);
236
236
  }
237
237
  exports.getValidateForm = getValidateForm;
238
- function handleToggle(target, on) {
239
- if (target) {
240
- if (on) {
241
- if (!target.classList.contains('on')) {
242
- target.classList.add('on');
243
- }
244
- }
245
- else {
246
- target.classList.remove('on');
247
- }
248
- }
249
- }
250
- exports.handleToggle = handleToggle;
package/lib/reflect.js CHANGED
@@ -152,6 +152,20 @@ function makeDiff(o1, o2, keys, version) {
152
152
  return obj3;
153
153
  }
154
154
  exports.makeDiff = makeDiff;
155
+ function hasDiff(o1, o2, keys, version) {
156
+ var diff = makeDiff(o1, o2, keys, version);
157
+ return !isEmptyObject(diff);
158
+ }
159
+ exports.hasDiff = hasDiff;
160
+ function goBack(navigate, confirm, resource, o1, o2, keys, version) {
161
+ if (!hasDiff(o1, o2, keys, version)) {
162
+ navigate(-1);
163
+ }
164
+ else {
165
+ confirm(resource.msg_confirm_back, function () { return navigate(-1); });
166
+ }
167
+ }
168
+ exports.goBack = goBack;
155
169
  function notIn(s1, s2) {
156
170
  var r = [];
157
171
  for (var _i = 0, s2_1 = s2; _i < s2_1.length; _i++) {
package/lib/search.js CHANGED
@@ -7,38 +7,58 @@ var __spreadArrays = (this && this.__spreadArrays) || function () {
7
7
  return r;
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ var reflect_1 = require("./reflect");
10
11
  var resources = (function () {
11
12
  function resources() {
12
13
  }
13
14
  resources.limit = 24;
15
+ resources.pages = [12, 24, 60, 100, 120, 180, 300, 600];
16
+ resources.pageMaxSize = 7;
14
17
  return resources;
15
18
  }());
16
19
  exports.resources = resources;
20
+ function getOffset(limit, page, firstLimit) {
21
+ var p = page && page > 0 ? page : 1;
22
+ if (firstLimit && firstLimit > 0) {
23
+ var offset = limit * (p - 2) + firstLimit;
24
+ return offset < 0 ? 0 : offset;
25
+ }
26
+ else {
27
+ var offset = limit * (p - 1);
28
+ return offset < 0 ? 0 : offset;
29
+ }
30
+ }
31
+ exports.getOffset = getOffset;
17
32
  function mergeFilter(obj, b, pageSizes, arrs) {
18
33
  var a = b;
19
34
  if (!b) {
20
35
  a = {};
21
36
  }
22
- var slimit = obj['limit'];
37
+ var keys = Object.keys(obj);
38
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
39
+ var key = keys_1[_i];
40
+ var p = a[key];
41
+ var v = obj[key];
42
+ if (v && v !== "") {
43
+ a[key] = isArray(key, p, arrs) ? v.split(",") : v;
44
+ }
45
+ }
46
+ var spage = obj["page"];
47
+ if (!isNaN(spage)) {
48
+ var page = parseInt(spage, 10);
49
+ a.page = page > 1 ? page : undefined;
50
+ }
51
+ var slimit = obj["limit"];
23
52
  if (!isNaN(slimit)) {
24
53
  var limit = parseInt(slimit, 10);
25
54
  if (pageSizes && pageSizes.length > 0) {
26
55
  if (pageSizes.indexOf(limit) >= 0) {
27
56
  a.limit = limit;
57
+ return a;
28
58
  }
29
59
  }
30
60
  else {
31
- a.limit = limit;
32
- }
33
- }
34
- delete obj['limit'];
35
- var keys = Object.keys(obj);
36
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
37
- var key = keys_1[_i];
38
- var p = a[key];
39
- var v = obj[key];
40
- if (v && v !== '') {
41
- a[key] = (isArray(key, p, arrs) ? v.split(',') : v);
61
+ a.limit = limit > 0 ? limit : 12;
42
62
  }
43
63
  }
44
64
  return a;
@@ -143,7 +163,6 @@ function changePage(com, pageIndex, pageSize) {
143
163
  }
144
164
  exports.changePage = changePage;
145
165
  function optimizeFilter(obj, searchable, fields) {
146
- var sLimit = searchable.limit;
147
166
  obj.fields = fields;
148
167
  if (searchable.pageIndex && searchable.pageIndex > 1) {
149
168
  obj.page = searchable.pageIndex;
@@ -151,12 +170,7 @@ function optimizeFilter(obj, searchable, fields) {
151
170
  else {
152
171
  delete obj.page;
153
172
  }
154
- if (sLimit) {
155
- obj.limit = searchable.limit;
156
- }
157
- else {
158
- obj.limit = searchable.pageSize;
159
- }
173
+ obj.limit = searchable.pageSize;
160
174
  if (searchable.appendMode && searchable.initPageSize !== searchable.pageSize) {
161
175
  obj.firstLimit = searchable.initPageSize;
162
176
  }
@@ -232,7 +246,10 @@ function showPaging(com, list, pageSize, total) {
232
246
  com.showPaging = (!total || com.pages <= 1 || (list && list.length >= total) ? false : true);
233
247
  }
234
248
  exports.showPaging = showPaging;
235
- function getFields(form) {
249
+ function getFields(form, arr) {
250
+ if (arr && arr.length > 0) {
251
+ return arr;
252
+ }
236
253
  if (!form) {
237
254
  return undefined;
238
255
  }
@@ -246,19 +263,19 @@ function getFields(form) {
246
263
  }
247
264
  }
248
265
  if (!nodes.querySelector) {
249
- return [];
266
+ return undefined;
250
267
  }
251
- var table = nodes.querySelector('table');
268
+ var table = nodes.querySelector("table");
252
269
  var fields = [];
253
270
  if (table) {
254
- var thead = table.querySelector('thead');
271
+ var thead = table.querySelector("thead");
255
272
  if (thead) {
256
- var ths = thead.querySelectorAll('th');
273
+ var ths = thead.querySelectorAll("th");
257
274
  if (ths) {
258
275
  var l = ths.length;
259
276
  for (var i = 0; i < l; i++) {
260
277
  var th = ths[i];
261
- var field = th.getAttribute('data-field');
278
+ var field = th.getAttribute("data-field");
262
279
  if (field) {
263
280
  fields.push(field);
264
281
  }
@@ -266,7 +283,7 @@ function getFields(form) {
266
283
  }
267
284
  }
268
285
  }
269
- return fields;
286
+ return fields.length > 0 ? fields : undefined;
270
287
  }
271
288
  exports.getFields = getFields;
272
289
  function formatResultsByComponent(results, c, lc) {
@@ -344,9 +361,34 @@ function getPageTotal(pageSize, total) {
344
361
  }
345
362
  }
346
363
  exports.getPageTotal = getPageTotal;
347
- function buildMessage(r, pageIndex, pageSize, results, total) {
364
+ function formatText() {
365
+ var args = [];
366
+ for (var _i = 0; _i < arguments.length; _i++) {
367
+ args[_i] = arguments[_i];
368
+ }
369
+ var formatted = args[0];
370
+ if (!formatted || formatted === "") {
371
+ return "";
372
+ }
373
+ if (args.length > 1 && Array.isArray(args[1])) {
374
+ var params = args[1];
375
+ for (var i = 0; i < params.length; i++) {
376
+ var regexp = new RegExp("\\{" + i + "\\}", "gi");
377
+ formatted = formatted.replace(regexp, params[i]);
378
+ }
379
+ }
380
+ else {
381
+ for (var i = 1; i < args.length; i++) {
382
+ var regexp = new RegExp("\\{" + (i - 1) + "\\}", "gi");
383
+ formatted = formatted.replace(regexp, args[i]);
384
+ }
385
+ }
386
+ return formatted;
387
+ }
388
+ exports.formatText = formatText;
389
+ function buildMessage(resource, results, pageSize, pageIndex, total) {
348
390
  if (!results || results.length === 0) {
349
- return r.value('msg_no_data_found');
391
+ return resource.msg_no_data_found;
350
392
  }
351
393
  else {
352
394
  if (!pageIndex) {
@@ -356,11 +398,11 @@ function buildMessage(r, pageIndex, pageSize, results, total) {
356
398
  var toIndex = fromIndex + results.length - 1;
357
399
  var pageTotal = getPageTotal(pageSize, total);
358
400
  if (pageTotal > 1) {
359
- var msg2 = r.format(r.value('msg_search_result_page_sequence'), fromIndex, toIndex, total, pageIndex, pageTotal);
401
+ var msg2 = formatText(resource.msg_search_result_page_sequence, fromIndex, toIndex, total, pageIndex, pageTotal);
360
402
  return msg2;
361
403
  }
362
404
  else {
363
- var msg3 = r.format(r.value('msg_search_result_sequence'), fromIndex, toIndex);
405
+ var msg3 = formatText(resource.msg_search_result_sequence, fromIndex, toIndex);
364
406
  return msg3;
365
407
  }
366
408
  }
@@ -370,7 +412,10 @@ function removeFormatUrl(url) {
370
412
  var startParams = url.indexOf('?');
371
413
  return startParams !== -1 ? url.substring(0, startParams) : url;
372
414
  }
373
- function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
415
+ function getPrefix(url) {
416
+ return url.indexOf("?") >= 0 ? "&" : "?";
417
+ }
418
+ function addParametersIntoUrl(ft, isFirstLoad, page, fields, limit) {
374
419
  if (!isFirstLoad) {
375
420
  if (!fields || fields.length === 0) {
376
421
  fields = 'fields';
@@ -378,6 +423,11 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
378
423
  if (!limit || limit.length === 0) {
379
424
  limit = 'limit';
380
425
  }
426
+ if (page && page > 1) {
427
+ if (!ft.page || ft.page <= 1) {
428
+ ft.page = page;
429
+ }
430
+ }
381
431
  var pageIndex = ft.page;
382
432
  if (pageIndex && !isNaN(pageIndex) && pageIndex <= 1) {
383
433
  delete ft.page;
@@ -393,31 +443,16 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
393
443
  if (typeof objValue === 'string' || typeof objValue === 'number') {
394
444
  if (key === limit) {
395
445
  if (objValue !== resources.limit) {
396
- if (url.indexOf('?') === -1) {
397
- url += "?" + key + "=" + objValue;
398
- }
399
- else {
400
- url += "&" + key + "=" + objValue;
401
- }
446
+ url += getPrefix(url) + (key + "=" + objValue);
402
447
  }
403
448
  }
404
449
  else {
405
- if (url.indexOf('?') === -1) {
406
- url += "?" + key + "=" + objValue;
407
- }
408
- else {
409
- url += "&" + key + "=" + objValue;
410
- }
450
+ url += getPrefix(url) + (key + "=" + objValue);
411
451
  }
412
452
  }
413
453
  else if (typeof objValue === 'object') {
414
454
  if (objValue instanceof Date) {
415
- if (url.indexOf('?') === -1) {
416
- url += "?" + key + "=" + objValue.toISOString();
417
- }
418
- else {
419
- url += "&" + key + "=" + objValue.toISOString();
420
- }
455
+ url += getPrefix(url) + (key + "=" + objValue.toISOString());
421
456
  }
422
457
  else {
423
458
  if (Array.isArray(objValue)) {
@@ -432,12 +467,7 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
432
467
  strs.push(subValue.toString());
433
468
  }
434
469
  }
435
- if (url.indexOf('?') === -1) {
436
- url += "?" + key + "=" + strs.join(',');
437
- }
438
- else {
439
- url += "&" + key + "=" + strs.join(',');
440
- }
470
+ url += getPrefix(url) + (key + "=" + strs.join(','));
441
471
  }
442
472
  }
443
473
  else {
@@ -445,21 +475,11 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
445
475
  for (var _b = 0, keysLvl2_1 = keysLvl2; _b < keysLvl2_1.length; _b++) {
446
476
  var key2 = keysLvl2_1[_b];
447
477
  var objValueLvl2 = objValue[key2];
448
- if (url.indexOf('?') === -1) {
449
- if (objValueLvl2 instanceof Date) {
450
- url += "?" + key + "." + key2 + "=" + objValueLvl2.toISOString();
451
- }
452
- else {
453
- url += "?" + key + "." + key2 + "=" + objValueLvl2;
454
- }
478
+ if (objValueLvl2 instanceof Date) {
479
+ url += getPrefix(url) + (key + "." + key2 + "=" + objValueLvl2.toISOString());
455
480
  }
456
481
  else {
457
- if (objValueLvl2 instanceof Date) {
458
- url += "&" + key + "." + key2 + "=" + objValueLvl2.toISOString();
459
- }
460
- else {
461
- url += "&" + key + "." + key2 + "=" + objValueLvl2;
462
- }
482
+ url += getPrefix(url) + (key + "." + key2 + "=" + objValueLvl2);
463
483
  }
464
484
  }
465
485
  }
@@ -471,7 +491,7 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
471
491
  var p = 'http://';
472
492
  var loc = window.location.href;
473
493
  if (loc.length >= 8) {
474
- var ss = loc.substr(0, 8);
494
+ var ss = loc.substring(0, 8);
475
495
  if (ss === 'https://') {
476
496
  p = 'https://';
477
497
  }
@@ -480,6 +500,50 @@ function addParametersIntoUrl(ft, isFirstLoad, fields, limit) {
480
500
  }
481
501
  }
482
502
  exports.addParametersIntoUrl = addParametersIntoUrl;
503
+ function buildSort(filter) {
504
+ var sort = {};
505
+ var st = filter.sort;
506
+ if (st && st.length > 0) {
507
+ var ch = st.charAt(0);
508
+ if (ch === "+" || ch === "-") {
509
+ sort.field = st.substring(1);
510
+ sort.type = ch;
511
+ }
512
+ else {
513
+ sort.field = st;
514
+ sort.type = "";
515
+ }
516
+ }
517
+ return sort;
518
+ }
519
+ exports.buildSort = buildSort;
520
+ function buildSortFilter(obj, sortable) {
521
+ var filter = reflect_1.clone(obj);
522
+ if (sortable.sortField && sortable.sortField.length > 0) {
523
+ filter.sort = sortable.sortType === "-" ? "-" + sortable.sortField : sortable.sortField;
524
+ }
525
+ else {
526
+ delete filter.sort;
527
+ }
528
+ delete filter.fields;
529
+ return filter;
530
+ }
531
+ exports.buildSortFilter = buildSortFilter;
532
+ function handleToggle(target, on) {
533
+ var off = !on;
534
+ if (target) {
535
+ if (on) {
536
+ if (!target.classList.contains('on')) {
537
+ target.classList.add('on');
538
+ }
539
+ }
540
+ else {
541
+ target.classList.remove('on');
542
+ }
543
+ }
544
+ return off;
545
+ }
546
+ exports.handleToggle = handleToggle;
483
547
  function handleSortEvent(event, com) {
484
548
  if (event && event.target) {
485
549
  var target = event.target;
@@ -490,6 +554,10 @@ function handleSortEvent(event, com) {
490
554
  }
491
555
  }
492
556
  exports.handleSortEvent = handleSortEvent;
557
+ function getSortElement(target) {
558
+ return target.nodeName === "I" ? target.parentElement : target;
559
+ }
560
+ exports.getSortElement = getSortElement;
493
561
  function handleSort(target, previousTarget, sortField, sortType) {
494
562
  var type = target.getAttribute('sort-type');
495
563
  var field = toggleSortStyle(target);
package/lib/useSearch.js CHANGED
@@ -40,7 +40,6 @@ exports.callSearch = function (se, search3, showResults3, searchError3, lc, next
40
40
  var fields = se.fields;
41
41
  delete se['page'];
42
42
  delete se['fields'];
43
- delete se['limit'];
44
43
  delete se['firstLimit'];
45
44
  search3(s, limit, next, fields).then(function (sr) {
46
45
  showResults3(s, sr, lc);
@@ -132,9 +131,8 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
132
131
  var getCurrencyCode = p && p.getCurrencyCode ? p.getCurrencyCode : _getCurrencyCode;
133
132
  var _c = merge_1.useMergeState(p), component = _c[0], setComponent = _c[1];
134
133
  var toggleFilter = function (event) {
135
- var x = !component.hideFilter;
136
- core_1.handleToggle(event.target, !x);
137
- setComponent({ hideFilter: x });
134
+ var hideFilter = search_1.handleToggle(event.target, component.hideFilter);
135
+ setComponent({ hideFilter: hideFilter });
138
136
  };
139
137
  var _getFields = function () {
140
138
  var fields = component.fields, initFields = component.initFields;
@@ -331,7 +329,7 @@ exports.useCoreSearch = function (refForm, initialState, service, p1, p2) {
331
329
  setList(results, setState);
332
330
  setComponent({ tmpPageIndex: s.page });
333
331
  if (s.limit) {
334
- var m1 = search_1.buildMessage(p1.resource, s.page, s.limit, sr.list, sr.total);
332
+ var m1 = search_1.buildMessage(p1.resource.resource(), sr.list, s.limit, s.page, sr.total);
335
333
  p1.showMessage(m1);
336
334
  }
337
335
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-hook-core",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "react",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./src/index.ts",
package/src/core.ts CHANGED
@@ -502,14 +502,3 @@ export function getDecodeFromForm(u?: UIParameter, d?: (form: HTMLFormElement, l
502
502
  return (u && u.ui ? u.ui.decodeFromForm : undefined);
503
503
  }
504
504
  */
505
- export function handleToggle(target?: HTMLInputElement, on?: boolean): void {
506
- if (target) {
507
- if (on) {
508
- if (!target.classList.contains('on')) {
509
- target.classList.add('on');
510
- }
511
- } else {
512
- target.classList.remove('on');
513
- }
514
- }
515
- }
package/src/reflect.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { NavigateFunction } from "react-router-dom"
2
+
1
3
  export function clone(obj: any): any {
2
4
  if (!obj) {
3
5
  return obj;
@@ -135,6 +137,28 @@ export function makeDiff<T>(o1: T, o2: T, keys?: string[], version?: string): Pa
135
137
  }
136
138
  return obj3;
137
139
  }
140
+ export function hasDiff<T>(o1: T, o2: T, keys?: string[], version?: string): boolean {
141
+ const diff = makeDiff(o1, o2, keys, version)
142
+ return !isEmptyObject(diff)
143
+ }
144
+ interface StringMap {
145
+ [key: string]: string;
146
+ }
147
+ export function goBack<T>(
148
+ navigate: NavigateFunction,
149
+ confirm: (msg: string, yesCallback?: () => void) => void,
150
+ resource: StringMap,
151
+ o1: T,
152
+ o2: T,
153
+ keys?: string[],
154
+ version?: string,
155
+ ) {
156
+ if (!hasDiff(o1, o2, keys, version)) {
157
+ navigate(-1)
158
+ } else {
159
+ confirm(resource.msg_confirm_back, () => navigate(-1))
160
+ }
161
+ }
138
162
 
139
163
  export function notIn(s1: string[], s2: string[]): string[] {
140
164
  const r = [];
package/src/route.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import { Filter } from "./core";
1
2
  import * as qs from "query-string";
2
3
 
3
- export function buildFromUrl<S>(modelT?: S): S {
4
+ export function buildFromUrl<S extends Filter>(modelT?: S): S {
4
5
  return buildParameters<S>(window.location.search, modelT);
5
6
  }
6
7
  export function buildParameters<T>(url: string, model?: T): T {
package/src/search.ts CHANGED
@@ -1,10 +1,15 @@
1
+ import { StringMap } from "./core";
2
+ import { clone } from "./reflect";
3
+
1
4
  // tslint:disable-next-line:class-name
2
5
  export class resources {
3
6
  static limit = 24;
7
+ static pages = [12, 24, 60, 100, 120, 180, 300, 600];
8
+ static pageMaxSize = 7;
4
9
  }
5
10
  interface Filter {
6
11
  page?: number;
7
- limit?: number;
12
+ limit: number;
8
13
  firstLimit?: number;
9
14
  fields?: string[];
10
15
  sort?: string;
@@ -35,8 +40,8 @@ export interface Sortable {
35
40
 
36
41
  export interface Pagination {
37
42
  initPageSize?: number;
38
- pageSize?: number;
39
- limit?: number;
43
+ pageSize: number;
44
+ // limit: number;
40
45
  pageIndex?: number;
41
46
  total?: number;
42
47
  pages?: number;
@@ -49,32 +54,47 @@ export interface Pagination {
49
54
  interface Searchable extends Pagination, Sortable {
50
55
  }
51
56
 
52
- export function mergeFilter<S extends Filter>(obj: S, b?: S, pageSizes?: number[], arrs?: string[]|any) {
53
- let a: any = b;
57
+ export function getOffset(limit: number, page?: number, firstLimit?: number): number {
58
+ const p = page && page > 0 ? page : 1
59
+ if (firstLimit && firstLimit > 0) {
60
+ const offset = limit * (p - 2) + firstLimit
61
+ return offset < 0 ? 0 : offset
62
+ } else {
63
+ const offset = limit * (p - 1)
64
+ return offset < 0 ? 0 : offset
65
+ }
66
+ }
67
+ export function mergeFilter<S extends Filter>(obj: S, b?: S, pageSizes?: number[], arrs?: string[] | any) {
68
+ let a: any = b
54
69
  if (!b) {
55
- a = {};
70
+ a = {}
71
+ }
72
+ const keys = Object.keys(obj)
73
+ for (const key of keys) {
74
+ const p = a[key]
75
+ const v = (obj as any)[key]
76
+ if (v && v !== "") {
77
+ a[key] = isArray(key, p, arrs) ? v.split(",") : v
78
+ }
79
+ }
80
+ const spage: any = obj["page"]
81
+ if (!isNaN(spage)) {
82
+ const page = parseInt(spage, 10)
83
+ a.page = page > 1 ? page : undefined
56
84
  }
57
- const slimit: any = obj['limit'];
85
+ const slimit: any = obj["limit"]
58
86
  if (!isNaN(slimit)) {
59
- const limit = parseInt(slimit, 10);
87
+ const limit = parseInt(slimit, 10)
60
88
  if (pageSizes && pageSizes.length > 0) {
61
89
  if (pageSizes.indexOf(limit) >= 0) {
62
- a.limit = limit;
90
+ a.limit = limit
91
+ return a
63
92
  }
64
93
  } 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);
94
+ a.limit = limit > 0 ? limit : 12
75
95
  }
76
96
  }
77
- return a;
97
+ return a
78
98
  }
79
99
  export function isArray(key: string, p: any, arrs: string[]|any): boolean {
80
100
  if (p) {
@@ -172,18 +192,14 @@ export function changePage(com: Pagination, pageIndex: number, pageSize: number)
172
192
  com.append = false;
173
193
  }
174
194
  export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable, fields?: string[]): S {
175
- const sLimit = searchable.limit;
195
+ // const sLimit = searchable.limit;
176
196
  obj.fields = fields;
177
197
  if (searchable.pageIndex && searchable.pageIndex > 1) {
178
198
  obj.page = searchable.pageIndex;
179
199
  } else {
180
200
  delete obj.page;
181
201
  }
182
- if (sLimit){
183
- obj.limit = searchable.limit;
184
- }else{
185
- obj.limit = searchable.pageSize;
186
- }
202
+ obj.limit = searchable.pageSize;
187
203
 
188
204
  if (searchable.appendMode && searchable.initPageSize !== searchable.pageSize) {
189
205
  obj.firstLimit = searchable.initPageSize;
@@ -196,7 +212,7 @@ export function optimizeFilter<S extends Filter>(obj: S, searchable: Searchable,
196
212
  delete obj.sort;
197
213
  }
198
214
  if(searchable) {
199
- mapObjects(obj, searchable as S);
215
+ mapObjects(obj, searchable as any);
200
216
  }
201
217
  return obj;
202
218
  }
@@ -268,40 +284,43 @@ export function showPaging<T>(com: Pagination, list: T[], pageSize?: number, tot
268
284
  com.showPaging = (!total || com.pages <= 1 || (list && list.length >= total) ? false : true);
269
285
  }
270
286
 
271
- export function getFields(form?: HTMLFormElement): string[]|undefined {
287
+ export function getFields(form?: HTMLFormElement, arr?: string[]): string[] | undefined {
288
+ if (arr && arr.length > 0) {
289
+ return arr
290
+ }
272
291
  if (!form) {
273
- return undefined;
292
+ return undefined
274
293
  }
275
- let nodes = form.nextSibling as HTMLElement;
294
+ let nodes = form.nextSibling as HTMLElement
276
295
  if (!nodes.querySelector) {
277
296
  if (!form.nextSibling) {
278
- return [];
297
+ return []
279
298
  } else {
280
- nodes = form.nextSibling.nextSibling as HTMLElement;
299
+ nodes = form.nextSibling.nextSibling as HTMLElement
281
300
  }
282
301
  }
283
302
  if (!nodes.querySelector) {
284
- return [];
303
+ return undefined
285
304
  }
286
- const table = nodes.querySelector('table');
287
- const fields: string[] = [];
305
+ const table = nodes.querySelector("table")
306
+ const fields: string[] = []
288
307
  if (table) {
289
- const thead = table.querySelector('thead');
308
+ const thead = table.querySelector("thead")
290
309
  if (thead) {
291
- const ths = thead.querySelectorAll('th');
310
+ const ths = thead.querySelectorAll("th")
292
311
  if (ths) {
293
- const l = ths.length;
312
+ const l = ths.length
294
313
  for (let i = 0; i < l; i++) {
295
- const th = ths[i];
296
- const field = th.getAttribute('data-field');
314
+ const th = ths[i]
315
+ const field = th.getAttribute("data-field")
297
316
  if (field) {
298
- fields.push(field);
317
+ fields.push(field)
299
318
  }
300
319
  }
301
320
  }
302
321
  }
303
322
  }
304
- return fields;
323
+ return fields.length > 0 ? fields : undefined
305
324
  }
306
325
  interface Component<T> {
307
326
  pageIndex?: number;
@@ -376,22 +395,41 @@ export function getPageTotal(pageSize?: number, total?: number): number {
376
395
  }
377
396
  }
378
397
 
379
- export function buildMessage<T>(r: ResourceService, pageIndex: number|undefined, pageSize: number, results: T[], total?: number): string {
398
+ export function formatText(...args: any[]): string {
399
+ let formatted = args[0]
400
+ if (!formatted || formatted === "") {
401
+ return ""
402
+ }
403
+ if (args.length > 1 && Array.isArray(args[1])) {
404
+ const params = args[1]
405
+ for (let i = 0; i < params.length; i++) {
406
+ const regexp = new RegExp("\\{" + i + "\\}", "gi")
407
+ formatted = formatted.replace(regexp, params[i])
408
+ }
409
+ } else {
410
+ for (let i = 1; i < args.length; i++) {
411
+ const regexp = new RegExp("\\{" + (i - 1) + "\\}", "gi")
412
+ formatted = formatted.replace(regexp, args[i])
413
+ }
414
+ }
415
+ return formatted
416
+ }
417
+ export function buildMessage<T>(resource: StringMap, results: T[], pageSize: number, pageIndex: number | undefined, total?: number): string {
380
418
  if (!results || results.length === 0) {
381
- return r.value('msg_no_data_found');
419
+ return resource.msg_no_data_found
382
420
  } else {
383
421
  if (!pageIndex) {
384
- pageIndex = 1;
422
+ pageIndex = 1
385
423
  }
386
- const fromIndex = (pageIndex - 1) * pageSize + 1;
387
- const toIndex = fromIndex + results.length - 1;
388
- const pageTotal = getPageTotal(pageSize, total);
424
+ const fromIndex = (pageIndex - 1) * pageSize + 1
425
+ const toIndex = fromIndex + results.length - 1
426
+ const pageTotal = getPageTotal(pageSize, total)
389
427
  if (pageTotal > 1) {
390
- const msg2 = r.format(r.value('msg_search_result_page_sequence'), fromIndex, toIndex, total, pageIndex, pageTotal);
391
- return msg2;
428
+ const msg2 = formatText(resource.msg_search_result_page_sequence, fromIndex, toIndex, total, pageIndex, pageTotal)
429
+ return msg2
392
430
  } else {
393
- const msg3 = r.format(r.value('msg_search_result_sequence'), fromIndex, toIndex);
394
- return msg3;
431
+ const msg3 = formatText(resource.msg_search_result_sequence, fromIndex, toIndex)
432
+ return msg3
395
433
  }
396
434
  }
397
435
  }
@@ -402,7 +440,10 @@ function removeFormatUrl(url: string): string {
402
440
  }
403
441
 
404
442
 
405
- export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: boolean, fields?: string, limit?: string): void {
443
+ function getPrefix(url: string): string {
444
+ return url.indexOf("?") >= 0 ? "&" : "?"
445
+ }
446
+ export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: boolean, page?: number, fields?: string, limit?: string): void {
406
447
  if (!isFirstLoad) {
407
448
  if (!fields || fields.length === 0) {
408
449
  fields = 'fields';
@@ -410,6 +451,11 @@ export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: bool
410
451
  if (!limit || limit.length === 0) {
411
452
  limit = 'limit';
412
453
  }
454
+ if (page && page > 1) {
455
+ if (!ft.page || ft.page <= 1) {
456
+ ft.page = page;
457
+ }
458
+ }
413
459
  const pageIndex = ft.page;
414
460
  if (pageIndex && !isNaN(pageIndex) && pageIndex <= 1) {
415
461
  delete ft.page;
@@ -424,30 +470,18 @@ export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: bool
424
470
  if (typeof objValue === 'string' || typeof objValue === 'number') {
425
471
  if (key === limit) {
426
472
  if (objValue !== resources.limit) {
427
- if (url.indexOf('?') === -1) {
428
- url += `?${key}=${objValue}`;
429
- } else {
430
- url += `&${key}=${objValue}`;
431
- }
473
+ url += getPrefix(url) + `${key}=${objValue}`;
432
474
  }
433
475
  } else {
434
- if (url.indexOf('?') === -1) {
435
- url += `?${key}=${objValue}`;
436
- } else {
437
- url += `&${key}=${objValue}`;
438
- }
476
+ url += getPrefix(url) + `${key}=${objValue}`;
439
477
  }
440
478
  } else if (typeof objValue === 'object') {
441
479
  if (objValue instanceof Date) {
442
- if (url.indexOf('?') === -1) {
443
- url += `?${key}=${objValue.toISOString()}`;
444
- } else {
445
- url += `&${key}=${objValue.toISOString()}`;
446
- }
480
+ url += getPrefix(url) + `${key}=${objValue.toISOString()}`;
447
481
  } else {
448
482
  if (Array.isArray(objValue)) {
449
483
  if (objValue.length > 0) {
450
- const strs = [];
484
+ const strs: string[] = [];
451
485
  for (const subValue of objValue) {
452
486
  if (typeof subValue === 'string') {
453
487
  strs.push(subValue);
@@ -455,28 +489,16 @@ export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: bool
455
489
  strs.push(subValue.toString());
456
490
  }
457
491
  }
458
- if (url.indexOf('?') === -1) {
459
- url += `?${key}=${strs.join(',')}`;
460
- } else {
461
- url += `&${key}=${strs.join(',')}`;
462
- }
492
+ url += getPrefix(url) + `${key}=${strs.join(',')}`;
463
493
  }
464
494
  } else {
465
495
  const keysLvl2 = Object.keys(objValue);
466
496
  for (const key2 of keysLvl2) {
467
497
  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
- }
498
+ if (objValueLvl2 instanceof Date) {
499
+ url += getPrefix(url) + `${key}.${key2}=${objValueLvl2.toISOString()}`;
474
500
  } else {
475
- if (objValueLvl2 instanceof Date) {
476
- url += `&${key}.${key2}=${objValueLvl2.toISOString()}`;
477
- } else {
478
- url += `&${key}.${key2}=${objValueLvl2}`;
479
- }
501
+ url += getPrefix(url) + `${key}.${key2}=${objValueLvl2}`;
480
502
  }
481
503
  }
482
504
  }
@@ -488,7 +510,7 @@ export function addParametersIntoUrl<S extends Filter>(ft: S, isFirstLoad?: bool
488
510
  let p = 'http://';
489
511
  const loc = window.location.href;
490
512
  if (loc.length >= 8) {
491
- const ss = loc.substr(0, 8);
513
+ const ss = loc.substring(0, 8);
492
514
  if (ss === 'https://') {
493
515
  p = 'https://';
494
516
  }
@@ -501,7 +523,44 @@ export interface Sort {
501
523
  field?: string;
502
524
  type?: string;
503
525
  }
504
-
526
+ export function buildSort<F extends Filter>(filter: F): Sort {
527
+ const sort: Sort = {}
528
+ const st = filter.sort
529
+ if (st && st.length > 0) {
530
+ const ch = st.charAt(0)
531
+ if (ch === "+" || ch === "-") {
532
+ sort.field = st.substring(1)
533
+ sort.type = ch
534
+ } else {
535
+ sort.field = st
536
+ sort.type = ""
537
+ }
538
+ }
539
+ return sort
540
+ }
541
+ export function buildSortFilter<S extends Filter>(obj: S, sortable: Sortable): S {
542
+ const filter: any = clone(obj)
543
+ if (sortable.sortField && sortable.sortField.length > 0) {
544
+ filter.sort = sortable.sortType === "-" ? "-" + sortable.sortField : sortable.sortField
545
+ } else {
546
+ delete filter.sort
547
+ }
548
+ delete filter.fields
549
+ return filter
550
+ }
551
+ export function handleToggle(target?: HTMLInputElement, on?: boolean): boolean {
552
+ const off = !on
553
+ if (target) {
554
+ if (on) {
555
+ if (!target.classList.contains('on')) {
556
+ target.classList.add('on');
557
+ }
558
+ } else {
559
+ target.classList.remove('on');
560
+ }
561
+ }
562
+ return off
563
+ }
505
564
  export function handleSortEvent(event: Event, com: Sortable): void {
506
565
  if (event && event.target) {
507
566
  const target = event.target as HTMLElement;
@@ -512,6 +571,9 @@ export function handleSortEvent(event: Event, com: Sortable): void {
512
571
  }
513
572
  }
514
573
 
574
+ export function getSortElement(target: HTMLElement): HTMLElement {
575
+ return target.nodeName === "I" ? (target.parentElement as HTMLElement) : target
576
+ }
515
577
  export function handleSort(target: HTMLElement, previousTarget?: HTMLElement, sortField?: string, sortType?: string): Sort {
516
578
  const type = target.getAttribute('sort-type');
517
579
  const field = toggleSortStyle(target);
package/src/useSearch.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import {useEffect, useState} from 'react';
2
- import {error, getName, getRemoveError, getValidateForm, handleToggle, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
2
+ import {error, getName, getRemoveError, getValidateForm, hideLoading, initForm, Locale, PageChange, pageSizes, removeFormError, ResourceService, SearchParameter, SearchResult, SearchService, showLoading} from './core';
3
3
  import {DispatchWithCallback, useMergeState} from './merge';
4
4
  import {clone} from './reflect';
5
5
  import {buildFromUrl} from './route';
6
- import {addParametersIntoUrl, append, buildMessage, formatResults, getFieldsFromForm, getModel, handleAppend, handleSort, initFilter, mergeFilter as mergeFilter2, Pagination, removeSortStatus, showPaging, Sortable, validate} from './search';
6
+ import {addParametersIntoUrl, append, buildMessage, formatResults, getFieldsFromForm, getModel, handleAppend, handleSort, handleToggle, initFilter, mergeFilter as mergeFilter2, Pagination, removeSortStatus, showPaging, Sortable, validate} from './search';
7
7
  import {enLocale} from './state';
8
8
  import {useUpdate} from './update';
9
9
 
@@ -13,7 +13,7 @@ export interface Searchable extends Pagination, Sortable {
13
13
  }
14
14
  interface Filter {
15
15
  page?: number;
16
- limit?: number;
16
+ limit: number;
17
17
  firstLimit?: number;
18
18
  fields?: string[];
19
19
  sort?: string;
@@ -39,7 +39,7 @@ export const callSearch = <T, S extends Filter>(se: S, search3: (s: S, limit?: n
39
39
  const fields = se.fields;
40
40
  delete se['page'];
41
41
  delete se['fields'];
42
- delete se['limit'];
42
+ // delete se['limit'];
43
43
  delete se['firstLimit'];
44
44
  search3(s, limit, next, fields).then(sr => {
45
45
  showResults3(s, sr, lc);
@@ -74,7 +74,7 @@ export interface SearchComponentParam<T, M extends Filter> {
74
74
  appendMode?: boolean;
75
75
  pageSizes?: number[];
76
76
  pageIndex?: number;
77
- pageSize?: number;
77
+ pageSize: number;
78
78
  initPageSize?: number;
79
79
  pageMaxSize?: number;
80
80
  ignoreUrlParam?: boolean;
@@ -257,9 +257,8 @@ export const useCoreSearch = <T, S extends Filter, ST>(
257
257
  const [component, setComponent] = useMergeState<SearchComponentState<T, S>>(p);
258
258
 
259
259
  const toggleFilter = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {
260
- const x = !component.hideFilter;
261
- handleToggle(event.target as HTMLInputElement, !x);
262
- setComponent({ hideFilter: x });
260
+ const hideFilter = handleToggle(event.target as HTMLInputElement, component.hideFilter);
261
+ setComponent({ hideFilter });
263
262
  };
264
263
 
265
264
  const _getFields = (): string[]|undefined => {
@@ -304,7 +303,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
304
303
  const runSearch = doSearch;
305
304
  if (auto) {
306
305
  setTimeout(() => {
307
- runSearch((obj2 as Searchable), true);
306
+ runSearch((obj2 as any), true);
308
307
  }, 0);
309
308
  }
310
309
  };
@@ -464,7 +463,7 @@ export const useCoreSearch = <T, S extends Filter, ST>(
464
463
  setList(results, setState as any);
465
464
  setComponent({ tmpPageIndex: s.page });
466
465
  if (s.limit) {
467
- const m1 = buildMessage(p1.resource, s.page, s.limit, sr.list, sr.total);
466
+ const m1 = buildMessage(p1.resource.resource(), sr.list, s.limit, s.page, sr.total);
468
467
  p1.showMessage(m1);
469
468
  }
470
469
  }
package/tsconfig.json CHANGED
@@ -17,7 +17,8 @@
17
17
  "dom",
18
18
  "es6",
19
19
  "es7",
20
- "es2017"
20
+ "es2017",
21
+ "es2022"
21
22
  ]
22
23
  },
23
24
  "include": [