@sankhyalabs/core 5.9.1 → 5.10.0-dev.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.
@@ -25,6 +25,7 @@ import { getFormattedValue } from "./formatting/PrettyFormatter.js";
25
25
  import { v4 as uuid } from "uuid";
26
26
  import { DataUnitStorage } from "./DataUnitStorage.js";
27
27
  import { getInvalidFieldMessage, InvalidFieldsReducer } from "./state/slice/InvalidFieldsSlice.js";
28
+ import { promises } from "dns";
28
29
 
29
30
  const DEFAULT_DATAUNIT_NAME = "dataunit";
30
31
 
@@ -617,6 +618,17 @@ export default class DataUnit {
617
618
  this._filterProviders.set(this.getFielterProviderKey(provider), provider);
618
619
  }
619
620
 
621
+ /**
622
+ *
623
+ * Remove um FilterProvider.
624
+ *
625
+ * @param provider - FilterProvider que será removido.
626
+ *
627
+ */
628
+ public removeFilterProvider(provider: FilterProvider): boolean {
629
+ return this._filterProviders.delete(this.getFielterProviderKey(provider));
630
+ }
631
+
620
632
  /**
621
633
  *
622
634
  * Obtém informações de paginação dos registros.
@@ -0,0 +1,107 @@
1
+ import DataUnit, { Record } from './DataUnit.js';
2
+ import { DataType } from './metadata/DataType.js';
3
+ import { LoadDataRequest, LoadDataResponse, PaginationInfo, Sort, SortMode, StringUtils } from '../index.js';
4
+
5
+ const DISTINCT_FILTER_NAME_PREFIX = 'FILTRO_COLUNA_';
6
+
7
+ interface FilterSimplified {
8
+ column: string;
9
+ values: string[];
10
+ }
11
+
12
+ function sortRecords(sort: Array<Sort>, records: Record[]) {
13
+ sort.forEach(sortItem => {
14
+
15
+ records = records.sort((recordA, recordB) => {
16
+ const fieldA = recordA[sortItem.field];
17
+ const fieldB = recordB[sortItem.field];
18
+ const sortFn = getSortFn(sortItem.dataType);
19
+ return sortFn(fieldA, fieldB) * (sortItem.mode == SortMode.ASC ? 1 : -1);
20
+ });
21
+
22
+ });
23
+ return records;
24
+ }
25
+
26
+ export function defaultDataLoader(dataUnit: DataUnit, request: LoadDataRequest, recordsIn: Array<Record>): Promise<LoadDataResponse> {
27
+ const filters = getColumnFilters(dataUnit);
28
+ let records = applyFilters(filters, recordsIn, dataUnit);
29
+ records = request.sort ? sortRecords(request.sort, records) : records;
30
+ return Promise.resolve({ records: records, paginationInfo: buildPaginationInfo(request, records) });
31
+ }
32
+
33
+ function buildPaginationInfo({ offset, limit }: LoadDataRequest, records: Array<Record>): PaginationInfo | undefined {
34
+ if (offset === undefined || limit === undefined) {
35
+ return undefined;
36
+ }
37
+
38
+ const lastRecord = Math.min(offset + limit, records.length);
39
+ return {
40
+ currentPage: Math.ceil(offset / limit),
41
+ firstRecord: offset,
42
+ lastRecord: lastRecord,
43
+ total: records.length,
44
+ hasMore: !!(records.length - lastRecord),
45
+ };
46
+ }
47
+
48
+ function filterRecords(record: Record, filter: FilterSimplified, dataUnit: DataUnit) {
49
+ let fieldValue = record[filter.column];
50
+
51
+ if (dataUnit.getField(filter.column)?.dataType === DataType.OBJECT) {
52
+ fieldValue = fieldValue.value;
53
+ }
54
+
55
+ return filter.values.includes(fieldValue?.toString());
56
+ }
57
+
58
+ function applyFilters(filters: FilterSimplified[], recordsIn: Array<Record>, dataUnit: DataUnit) {
59
+ let records = [...recordsIn];
60
+
61
+ filters.forEach(filter => {
62
+ records = records.filter(record => filterRecords(record, filter, dataUnit));
63
+ });
64
+
65
+ return records;
66
+ }
67
+
68
+ function getColumnFilters(dataUnit: DataUnit): FilterSimplified[] {
69
+ const allFilters = dataUnit.getFilters() ?? [];
70
+ const columnFilters = allFilters.filter(({name}) => name?.includes(DISTINCT_FILTER_NAME_PREFIX)) ?? [];
71
+
72
+ return columnFilters.map(({name, params}) => {
73
+ return {
74
+ column: name?.replace(DISTINCT_FILTER_NAME_PREFIX, '') ?? '',
75
+ values: params?.map(param => param.value),
76
+ };
77
+ }) as FilterSimplified[];
78
+ }
79
+
80
+ function getSortFn(type: DataType): any {
81
+ switch (type) {
82
+ case DataType.NUMBER:
83
+ return sortNumber;
84
+ case DataType.DATE:
85
+ return sortDate;
86
+ case DataType.OBJECT:
87
+ return sortObject;
88
+ default:
89
+ return StringUtils.compare;
90
+ }
91
+ }
92
+
93
+ function sortObject(a: any, b: any): number {
94
+ return StringUtils.compare(a?.['label'], b?.['label']);
95
+ }
96
+
97
+ function sortNumber(a: number, b: number): number {
98
+ return a - b;
99
+ }
100
+
101
+ function sortDate(a: Date, b: Date): number {
102
+
103
+ let timeA = a.getTime(),
104
+ timeB = b.getTime();
105
+
106
+ return timeA === timeB ? 0 : (timeA < timeB ? -1 : 1);
107
+ }
package/src/index.ts CHANGED
@@ -31,6 +31,7 @@ import VersionUtils from './utils/VersionUtils.js'
31
31
  import { OnboardingUtils} from "./utils/OnboardingUtils.js";
32
32
  import {default as PromiseSync, PromiseSyncCallback} from "./async/PromiseSync.js";
33
33
  import { HTMLBuilder } from "./html/HTMLBuilder.js";
34
+ import { defaultDataLoader } from "./dataunit/DataUnitHelper.js";
34
35
 
35
36
  /*Classes públicas no pacote*/
36
37
  export {
@@ -89,5 +90,6 @@ export {
89
90
  OnboardingUtils,
90
91
  PromiseSync,
91
92
  PromiseSyncCallback,
92
- HTMLBuilder
93
+ HTMLBuilder,
94
+ defaultDataLoader
93
95
  };