@katlux/providers 0.1.0-beta.2 → 0.1.0-beta.21
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/dist/index.cjs +252 -16
- package/dist/index.d.cts +14 -14
- package/dist/index.d.mts +14 -14
- package/dist/index.d.ts +14 -14
- package/dist/index.mjs +250 -14
- package/package.json +4 -5
package/dist/index.cjs
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
const useFilterLogic = require('@katlux/toolkit/composables/useFilterLogic');
|
|
5
|
-
const useSortLogic = require('@katlux/toolkit/composables/useSortLogic');
|
|
3
|
+
const providers = require('@katlux/providers');
|
|
6
4
|
|
|
7
|
-
var ECacheStrategy = /* @__PURE__ */ ((ECacheStrategy2) => {
|
|
8
|
-
ECacheStrategy2["Application"] = "Application";
|
|
9
|
-
ECacheStrategy2["Session"] = "Session";
|
|
10
|
-
ECacheStrategy2["Memory"] = "Memory";
|
|
11
|
-
ECacheStrategy2["LocalStorage"] = "LocalStorage";
|
|
12
|
-
ECacheStrategy2["IndexedDB"] = "IndexedDB";
|
|
13
|
-
ECacheStrategy2["Cookie"] = "Cookie";
|
|
14
|
-
return ECacheStrategy2;
|
|
15
|
-
})(ECacheStrategy || {});
|
|
16
5
|
var EDataFilterOperator = /* @__PURE__ */ ((EDataFilterOperator2) => {
|
|
17
6
|
EDataFilterOperator2["Equal"] = "==";
|
|
18
7
|
EDataFilterOperator2["NotEqual"] = "!=";
|
|
@@ -28,6 +17,15 @@ var EDataFilterOperator = /* @__PURE__ */ ((EDataFilterOperator2) => {
|
|
|
28
17
|
EDataFilterOperator2["Nor"] = "nor";
|
|
29
18
|
return EDataFilterOperator2;
|
|
30
19
|
})(EDataFilterOperator || {});
|
|
20
|
+
var ECacheStrategy = /* @__PURE__ */ ((ECacheStrategy2) => {
|
|
21
|
+
ECacheStrategy2["Application"] = "Application";
|
|
22
|
+
ECacheStrategy2["Session"] = "Session";
|
|
23
|
+
ECacheStrategy2["Memory"] = "Memory";
|
|
24
|
+
ECacheStrategy2["LocalStorage"] = "LocalStorage";
|
|
25
|
+
ECacheStrategy2["IndexedDB"] = "IndexedDB";
|
|
26
|
+
ECacheStrategy2["Cookie"] = "Cookie";
|
|
27
|
+
return ECacheStrategy2;
|
|
28
|
+
})(ECacheStrategy || {});
|
|
31
29
|
|
|
32
30
|
/**
|
|
33
31
|
* @vue/shared v3.5.24
|
|
@@ -2863,6 +2861,18 @@ if (!!(process.env.NODE_ENV !== "production")) {
|
|
|
2863
2861
|
initDev();
|
|
2864
2862
|
}
|
|
2865
2863
|
|
|
2864
|
+
const useDebounce = (callback, delay) => {
|
|
2865
|
+
let timeoutId = null;
|
|
2866
|
+
return function(...args) {
|
|
2867
|
+
if (timeoutId !== null) {
|
|
2868
|
+
clearTimeout(timeoutId);
|
|
2869
|
+
}
|
|
2870
|
+
timeoutId = setTimeout(() => {
|
|
2871
|
+
callback.apply(this, args);
|
|
2872
|
+
}, delay);
|
|
2873
|
+
};
|
|
2874
|
+
};
|
|
2875
|
+
|
|
2866
2876
|
const APP_MODULE = "#app";
|
|
2867
2877
|
class ADataProvider {
|
|
2868
2878
|
filter = ref(null);
|
|
@@ -2957,7 +2967,7 @@ class ADataProvider {
|
|
|
2957
2967
|
this.currentPage.value = 1;
|
|
2958
2968
|
this.loadPageData();
|
|
2959
2969
|
});
|
|
2960
|
-
watch(this.filter, useDebounce
|
|
2970
|
+
watch(this.filter, useDebounce(() => {
|
|
2961
2971
|
this.currentPage.value = 1;
|
|
2962
2972
|
this.loadPageData();
|
|
2963
2973
|
}, 300));
|
|
@@ -2980,8 +2990,234 @@ class ADataProvider {
|
|
|
2980
2990
|
}
|
|
2981
2991
|
}
|
|
2982
2992
|
|
|
2983
|
-
const
|
|
2984
|
-
const
|
|
2993
|
+
const useFilterLogic = () => {
|
|
2994
|
+
const evaluateFilter = (filter, row) => {
|
|
2995
|
+
if (filter.operator === providers.EDataFilterOperator.And || filter.operator === providers.EDataFilterOperator.Or || filter.operator === providers.EDataFilterOperator.Nand || filter.operator === providers.EDataFilterOperator.Nor) {
|
|
2996
|
+
return !filter.active || applyOperator(filter.operator, row, filter.field);
|
|
2997
|
+
}
|
|
2998
|
+
if ("operator" in filter.field && "field" in filter.field) {
|
|
2999
|
+
return !filter.active || evaluateFilter(filter.field, row);
|
|
3000
|
+
}
|
|
3001
|
+
const field = filter.field;
|
|
3002
|
+
const fieldKeys = Object.keys(field);
|
|
3003
|
+
return !filter.active || fieldKeys.every((key) => {
|
|
3004
|
+
const filterValue = field[key];
|
|
3005
|
+
const rowValue = row[key];
|
|
3006
|
+
return applyOperator(filter.operator, rowValue, filterValue);
|
|
3007
|
+
});
|
|
3008
|
+
};
|
|
3009
|
+
const applyOperator = (operator, rowValue, filterValue) => {
|
|
3010
|
+
switch (operator) {
|
|
3011
|
+
case providers.EDataFilterOperator.And:
|
|
3012
|
+
return compareAnd(rowValue, filterValue);
|
|
3013
|
+
case providers.EDataFilterOperator.Or:
|
|
3014
|
+
return compareOr(rowValue, filterValue);
|
|
3015
|
+
case providers.EDataFilterOperator.Nand:
|
|
3016
|
+
return !compareAnd(rowValue, filterValue);
|
|
3017
|
+
case providers.EDataFilterOperator.Nor:
|
|
3018
|
+
return !compareOr(rowValue, filterValue);
|
|
3019
|
+
case providers.EDataFilterOperator.Equal:
|
|
3020
|
+
return compareEqual(rowValue, filterValue);
|
|
3021
|
+
case providers.EDataFilterOperator.NotEqual:
|
|
3022
|
+
return !compareEqual(rowValue, filterValue);
|
|
3023
|
+
case providers.EDataFilterOperator.GreaterThan:
|
|
3024
|
+
return compareValues(rowValue, filterValue) > 0;
|
|
3025
|
+
case providers.EDataFilterOperator.LessThan:
|
|
3026
|
+
return compareValues(rowValue, filterValue) < 0;
|
|
3027
|
+
case providers.EDataFilterOperator.GreaterThanOrEqual:
|
|
3028
|
+
return compareValues(rowValue, filterValue) >= 0;
|
|
3029
|
+
case providers.EDataFilterOperator.LessThanOrEqual:
|
|
3030
|
+
return compareValues(rowValue, filterValue) <= 0;
|
|
3031
|
+
case providers.EDataFilterOperator.In:
|
|
3032
|
+
return compareIn(rowValue, filterValue);
|
|
3033
|
+
case providers.EDataFilterOperator.NotIn:
|
|
3034
|
+
return !compareIn(rowValue, filterValue);
|
|
3035
|
+
default:
|
|
3036
|
+
return compareEqual(rowValue, filterValue);
|
|
3037
|
+
}
|
|
3038
|
+
};
|
|
3039
|
+
const compareAnd = (row, nested) => {
|
|
3040
|
+
const subFilters = Array.isArray(nested) ? nested : nested && typeof nested === "object" ? Object.values(nested) : [];
|
|
3041
|
+
const validFilters = subFilters.filter((f) => f && typeof f === "object" && "operator" in f && "field" in f);
|
|
3042
|
+
if (validFilters.length === 0) return true;
|
|
3043
|
+
return validFilters.every((f) => {
|
|
3044
|
+
const active = f.active !== false;
|
|
3045
|
+
return active ? evaluateFilter(f, row) : true;
|
|
3046
|
+
});
|
|
3047
|
+
};
|
|
3048
|
+
const compareOr = (row, nested) => {
|
|
3049
|
+
const subFilters = Array.isArray(nested) ? nested : nested && typeof nested === "object" ? Object.values(nested) : [];
|
|
3050
|
+
const validFilters = subFilters.filter((f) => f && typeof f === "object" && "operator" in f && "field" in f);
|
|
3051
|
+
const activeFilters = validFilters.filter((f) => f.active !== false);
|
|
3052
|
+
if (activeFilters.length === 0) return true;
|
|
3053
|
+
return activeFilters.some((f) => {
|
|
3054
|
+
return evaluateFilter(f, row);
|
|
3055
|
+
});
|
|
3056
|
+
};
|
|
3057
|
+
const compareIn = (rowValue, filterValue) => {
|
|
3058
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3059
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
3060
|
+
}
|
|
3061
|
+
return false;
|
|
3062
|
+
};
|
|
3063
|
+
const compareEqual = (rowValue, filterValue) => {
|
|
3064
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3065
|
+
return rowValue.toLowerCase() == filterValue.toLowerCase();
|
|
3066
|
+
}
|
|
3067
|
+
if (typeof rowValue === "number" && typeof filterValue === "number") {
|
|
3068
|
+
return rowValue === filterValue;
|
|
3069
|
+
}
|
|
3070
|
+
if (typeof rowValue === "boolean" && typeof filterValue === "boolean") {
|
|
3071
|
+
return rowValue === filterValue;
|
|
3072
|
+
}
|
|
3073
|
+
return rowValue === filterValue;
|
|
3074
|
+
};
|
|
3075
|
+
const compareValues = (rowValue, filterValue) => {
|
|
3076
|
+
if (rowValue == null || filterValue == null) {
|
|
3077
|
+
return rowValue == null ? -1 : 1;
|
|
3078
|
+
}
|
|
3079
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3080
|
+
return rowValue.localeCompare(filterValue);
|
|
3081
|
+
}
|
|
3082
|
+
if (typeof rowValue === "number" && typeof filterValue === "number") {
|
|
3083
|
+
return rowValue - filterValue;
|
|
3084
|
+
}
|
|
3085
|
+
return String(rowValue).localeCompare(String(filterValue));
|
|
3086
|
+
};
|
|
3087
|
+
const filterTreeData = (nodes, filter, options) => {
|
|
3088
|
+
const { idKey, parentKey } = options;
|
|
3089
|
+
const nodeMap = new Map(nodes.map((node) => [node[idKey], node]));
|
|
3090
|
+
const childrenMap = /* @__PURE__ */ new Map();
|
|
3091
|
+
nodes.forEach((node) => {
|
|
3092
|
+
const pId = node[parentKey];
|
|
3093
|
+
if (pId != null) {
|
|
3094
|
+
if (!childrenMap.has(pId)) {
|
|
3095
|
+
childrenMap.set(pId, []);
|
|
3096
|
+
}
|
|
3097
|
+
childrenMap.get(pId).push(node);
|
|
3098
|
+
}
|
|
3099
|
+
});
|
|
3100
|
+
const matchingNodeIds = /* @__PURE__ */ new Set();
|
|
3101
|
+
const expandedNodes = /* @__PURE__ */ new Set();
|
|
3102
|
+
const visibleNodeIds = /* @__PURE__ */ new Set();
|
|
3103
|
+
nodes.forEach((node) => {
|
|
3104
|
+
const evalRow = node.data ? { ...node.data, ...node } : node;
|
|
3105
|
+
if (evaluateFilter(filter, evalRow)) {
|
|
3106
|
+
matchingNodeIds.add(node[idKey]);
|
|
3107
|
+
}
|
|
3108
|
+
});
|
|
3109
|
+
const addDescendants = (nodeId) => {
|
|
3110
|
+
const children = childrenMap.get(nodeId);
|
|
3111
|
+
if (children && children.length > 0) {
|
|
3112
|
+
expandedNodes.add(nodeId);
|
|
3113
|
+
children.forEach((child) => {
|
|
3114
|
+
visibleNodeIds.add(child[idKey]);
|
|
3115
|
+
addDescendants(child[idKey]);
|
|
3116
|
+
});
|
|
3117
|
+
}
|
|
3118
|
+
};
|
|
3119
|
+
matchingNodeIds.forEach((id) => {
|
|
3120
|
+
visibleNodeIds.add(id);
|
|
3121
|
+
addDescendants(id);
|
|
3122
|
+
let currentId = id;
|
|
3123
|
+
while (currentId != null) {
|
|
3124
|
+
visibleNodeIds.add(currentId);
|
|
3125
|
+
const node = nodeMap.get(currentId);
|
|
3126
|
+
if (node) {
|
|
3127
|
+
if (node[parentKey] != null) {
|
|
3128
|
+
expandedNodes.add(node[parentKey]);
|
|
3129
|
+
currentId = node[parentKey];
|
|
3130
|
+
} else {
|
|
3131
|
+
currentId = null;
|
|
3132
|
+
}
|
|
3133
|
+
} else {
|
|
3134
|
+
break;
|
|
3135
|
+
}
|
|
3136
|
+
}
|
|
3137
|
+
});
|
|
3138
|
+
const visibleNodes = nodes.filter((node) => visibleNodeIds.has(node[idKey]));
|
|
3139
|
+
return {
|
|
3140
|
+
visibleNodes,
|
|
3141
|
+
expandedNodes
|
|
3142
|
+
};
|
|
3143
|
+
};
|
|
3144
|
+
const filterData = (data, filter, options) => {
|
|
3145
|
+
if (options?.treeOptions) {
|
|
3146
|
+
const { visibleNodes, expandedNodes } = filterTreeData(
|
|
3147
|
+
data,
|
|
3148
|
+
filter,
|
|
3149
|
+
options.treeOptions
|
|
3150
|
+
);
|
|
3151
|
+
return { results: visibleNodes, expandedNodes };
|
|
3152
|
+
}
|
|
3153
|
+
const results = data.filter((row) => evaluateFilter(filter, row));
|
|
3154
|
+
return { results };
|
|
3155
|
+
};
|
|
3156
|
+
return {
|
|
3157
|
+
evaluateFilter,
|
|
3158
|
+
filterTreeData,
|
|
3159
|
+
filterData
|
|
3160
|
+
};
|
|
3161
|
+
};
|
|
3162
|
+
|
|
3163
|
+
const useSortLogic = () => {
|
|
3164
|
+
const sortData = (sortList, rows) => {
|
|
3165
|
+
if (!sortList || sortList.length === 0 || !rows || rows.length === 0) {
|
|
3166
|
+
return rows;
|
|
3167
|
+
}
|
|
3168
|
+
const sortedRows = [...rows];
|
|
3169
|
+
const compare = (a, b) => {
|
|
3170
|
+
for (const sort of sortList) {
|
|
3171
|
+
const aVal = a[sort.field];
|
|
3172
|
+
const bVal = b[sort.field];
|
|
3173
|
+
if (aVal === null || aVal === void 0) {
|
|
3174
|
+
if (bVal === null || bVal === void 0) continue;
|
|
3175
|
+
return sort.direction === "asc" ? -1 : 1;
|
|
3176
|
+
}
|
|
3177
|
+
if (bVal === null || bVal === void 0) {
|
|
3178
|
+
return sort.direction === "asc" ? 1 : -1;
|
|
3179
|
+
}
|
|
3180
|
+
if (aVal < bVal) {
|
|
3181
|
+
return sort.direction === "asc" ? -1 : 1;
|
|
3182
|
+
} else if (aVal > bVal) {
|
|
3183
|
+
return sort.direction === "asc" ? 1 : -1;
|
|
3184
|
+
}
|
|
3185
|
+
}
|
|
3186
|
+
return 0;
|
|
3187
|
+
};
|
|
3188
|
+
const merge = (left, right) => {
|
|
3189
|
+
const result = [];
|
|
3190
|
+
let leftIndex = 0;
|
|
3191
|
+
let rightIndex = 0;
|
|
3192
|
+
while (leftIndex < left.length && rightIndex < right.length) {
|
|
3193
|
+
if (compare(left[leftIndex], right[rightIndex]) <= 0) {
|
|
3194
|
+
result.push(left[leftIndex]);
|
|
3195
|
+
leftIndex++;
|
|
3196
|
+
} else {
|
|
3197
|
+
result.push(right[rightIndex]);
|
|
3198
|
+
rightIndex++;
|
|
3199
|
+
}
|
|
3200
|
+
}
|
|
3201
|
+
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
|
|
3202
|
+
};
|
|
3203
|
+
const mergeSort = (arr) => {
|
|
3204
|
+
if (arr.length <= 1) {
|
|
3205
|
+
return arr;
|
|
3206
|
+
}
|
|
3207
|
+
const mid = Math.floor(arr.length / 2);
|
|
3208
|
+
const left = mergeSort(arr.slice(0, mid));
|
|
3209
|
+
const right = mergeSort(arr.slice(mid));
|
|
3210
|
+
return merge(left, right);
|
|
3211
|
+
};
|
|
3212
|
+
return mergeSort(sortedRows);
|
|
3213
|
+
};
|
|
3214
|
+
return {
|
|
3215
|
+
sortData
|
|
3216
|
+
};
|
|
3217
|
+
};
|
|
3218
|
+
|
|
3219
|
+
const { filterData: filterData$1 } = useFilterLogic();
|
|
3220
|
+
const { sortData } = useSortLogic();
|
|
2985
3221
|
class CFlatClientDataProvider extends ADataProvider {
|
|
2986
3222
|
allData = ref([]);
|
|
2987
3223
|
filteredData = ref([]);
|
|
@@ -4645,7 +4881,7 @@ class AAPIDataProvider {
|
|
|
4645
4881
|
}
|
|
4646
4882
|
}
|
|
4647
4883
|
|
|
4648
|
-
const {
|
|
4884
|
+
const { filterData } = useFilterLogic();
|
|
4649
4885
|
class CTreeClientDataProvider extends CFlatClientDataProvider {
|
|
4650
4886
|
// Tree configuration
|
|
4651
4887
|
parentKey = "parentId";
|
package/dist/index.d.cts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
declare enum EDataFilterOperator {
|
|
2
|
+
Equal = "==",
|
|
3
|
+
NotEqual = "!=",
|
|
4
|
+
GreaterThan = ">",
|
|
5
|
+
LessThan = "<",
|
|
6
|
+
GreaterThanOrEqual = ">=",
|
|
7
|
+
LessThanOrEqual = "<=",
|
|
8
|
+
In = "in",
|
|
9
|
+
NotIn = "nin",
|
|
10
|
+
And = "and",
|
|
11
|
+
Or = "or",
|
|
12
|
+
Nand = "nand",
|
|
13
|
+
Nor = "nor"
|
|
14
|
+
}
|
|
1
15
|
declare enum ECacheStrategy {
|
|
2
16
|
Application = "Application",
|
|
3
17
|
Session = "Session",
|
|
@@ -31,20 +45,6 @@ interface IKDatatableAction {
|
|
|
31
45
|
type TDataRow = {
|
|
32
46
|
[key: string]: any;
|
|
33
47
|
};
|
|
34
|
-
declare enum EDataFilterOperator {
|
|
35
|
-
Equal = "==",
|
|
36
|
-
NotEqual = "!=",
|
|
37
|
-
GreaterThan = ">",
|
|
38
|
-
LessThan = "<",
|
|
39
|
-
GreaterThanOrEqual = ">=",
|
|
40
|
-
LessThanOrEqual = "<=",
|
|
41
|
-
In = "in",
|
|
42
|
-
NotIn = "nin",
|
|
43
|
-
And = "and",
|
|
44
|
-
Or = "or",
|
|
45
|
-
Nand = "nand",
|
|
46
|
-
Nor = "nor"
|
|
47
|
-
}
|
|
48
48
|
interface IDataFilter {
|
|
49
49
|
operator: EDataFilterOperator;
|
|
50
50
|
field: TDataRow | IDataFilter[];
|
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
declare enum EDataFilterOperator {
|
|
2
|
+
Equal = "==",
|
|
3
|
+
NotEqual = "!=",
|
|
4
|
+
GreaterThan = ">",
|
|
5
|
+
LessThan = "<",
|
|
6
|
+
GreaterThanOrEqual = ">=",
|
|
7
|
+
LessThanOrEqual = "<=",
|
|
8
|
+
In = "in",
|
|
9
|
+
NotIn = "nin",
|
|
10
|
+
And = "and",
|
|
11
|
+
Or = "or",
|
|
12
|
+
Nand = "nand",
|
|
13
|
+
Nor = "nor"
|
|
14
|
+
}
|
|
1
15
|
declare enum ECacheStrategy {
|
|
2
16
|
Application = "Application",
|
|
3
17
|
Session = "Session",
|
|
@@ -31,20 +45,6 @@ interface IKDatatableAction {
|
|
|
31
45
|
type TDataRow = {
|
|
32
46
|
[key: string]: any;
|
|
33
47
|
};
|
|
34
|
-
declare enum EDataFilterOperator {
|
|
35
|
-
Equal = "==",
|
|
36
|
-
NotEqual = "!=",
|
|
37
|
-
GreaterThan = ">",
|
|
38
|
-
LessThan = "<",
|
|
39
|
-
GreaterThanOrEqual = ">=",
|
|
40
|
-
LessThanOrEqual = "<=",
|
|
41
|
-
In = "in",
|
|
42
|
-
NotIn = "nin",
|
|
43
|
-
And = "and",
|
|
44
|
-
Or = "or",
|
|
45
|
-
Nand = "nand",
|
|
46
|
-
Nor = "nor"
|
|
47
|
-
}
|
|
48
48
|
interface IDataFilter {
|
|
49
49
|
operator: EDataFilterOperator;
|
|
50
50
|
field: TDataRow | IDataFilter[];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
declare enum EDataFilterOperator {
|
|
2
|
+
Equal = "==",
|
|
3
|
+
NotEqual = "!=",
|
|
4
|
+
GreaterThan = ">",
|
|
5
|
+
LessThan = "<",
|
|
6
|
+
GreaterThanOrEqual = ">=",
|
|
7
|
+
LessThanOrEqual = "<=",
|
|
8
|
+
In = "in",
|
|
9
|
+
NotIn = "nin",
|
|
10
|
+
And = "and",
|
|
11
|
+
Or = "or",
|
|
12
|
+
Nand = "nand",
|
|
13
|
+
Nor = "nor"
|
|
14
|
+
}
|
|
1
15
|
declare enum ECacheStrategy {
|
|
2
16
|
Application = "Application",
|
|
3
17
|
Session = "Session",
|
|
@@ -31,20 +45,6 @@ interface IKDatatableAction {
|
|
|
31
45
|
type TDataRow = {
|
|
32
46
|
[key: string]: any;
|
|
33
47
|
};
|
|
34
|
-
declare enum EDataFilterOperator {
|
|
35
|
-
Equal = "==",
|
|
36
|
-
NotEqual = "!=",
|
|
37
|
-
GreaterThan = ">",
|
|
38
|
-
LessThan = "<",
|
|
39
|
-
GreaterThanOrEqual = ">=",
|
|
40
|
-
LessThanOrEqual = "<=",
|
|
41
|
-
In = "in",
|
|
42
|
-
NotIn = "nin",
|
|
43
|
-
And = "and",
|
|
44
|
-
Or = "or",
|
|
45
|
-
Nand = "nand",
|
|
46
|
-
Nor = "nor"
|
|
47
|
-
}
|
|
48
48
|
interface IDataFilter {
|
|
49
49
|
operator: EDataFilterOperator;
|
|
50
50
|
field: TDataRow | IDataFilter[];
|
package/dist/index.mjs
CHANGED
|
@@ -1,16 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useFilterLogic } from '@katlux/toolkit/composables/useFilterLogic';
|
|
3
|
-
import { useSortLogic } from '@katlux/toolkit/composables/useSortLogic';
|
|
1
|
+
import { EDataFilterOperator as EDataFilterOperator$1 } from '@katlux/providers';
|
|
4
2
|
|
|
5
|
-
var ECacheStrategy = /* @__PURE__ */ ((ECacheStrategy2) => {
|
|
6
|
-
ECacheStrategy2["Application"] = "Application";
|
|
7
|
-
ECacheStrategy2["Session"] = "Session";
|
|
8
|
-
ECacheStrategy2["Memory"] = "Memory";
|
|
9
|
-
ECacheStrategy2["LocalStorage"] = "LocalStorage";
|
|
10
|
-
ECacheStrategy2["IndexedDB"] = "IndexedDB";
|
|
11
|
-
ECacheStrategy2["Cookie"] = "Cookie";
|
|
12
|
-
return ECacheStrategy2;
|
|
13
|
-
})(ECacheStrategy || {});
|
|
14
3
|
var EDataFilterOperator = /* @__PURE__ */ ((EDataFilterOperator2) => {
|
|
15
4
|
EDataFilterOperator2["Equal"] = "==";
|
|
16
5
|
EDataFilterOperator2["NotEqual"] = "!=";
|
|
@@ -26,6 +15,15 @@ var EDataFilterOperator = /* @__PURE__ */ ((EDataFilterOperator2) => {
|
|
|
26
15
|
EDataFilterOperator2["Nor"] = "nor";
|
|
27
16
|
return EDataFilterOperator2;
|
|
28
17
|
})(EDataFilterOperator || {});
|
|
18
|
+
var ECacheStrategy = /* @__PURE__ */ ((ECacheStrategy2) => {
|
|
19
|
+
ECacheStrategy2["Application"] = "Application";
|
|
20
|
+
ECacheStrategy2["Session"] = "Session";
|
|
21
|
+
ECacheStrategy2["Memory"] = "Memory";
|
|
22
|
+
ECacheStrategy2["LocalStorage"] = "LocalStorage";
|
|
23
|
+
ECacheStrategy2["IndexedDB"] = "IndexedDB";
|
|
24
|
+
ECacheStrategy2["Cookie"] = "Cookie";
|
|
25
|
+
return ECacheStrategy2;
|
|
26
|
+
})(ECacheStrategy || {});
|
|
29
27
|
|
|
30
28
|
/**
|
|
31
29
|
* @vue/shared v3.5.24
|
|
@@ -2861,6 +2859,18 @@ if (!!(process.env.NODE_ENV !== "production")) {
|
|
|
2861
2859
|
initDev();
|
|
2862
2860
|
}
|
|
2863
2861
|
|
|
2862
|
+
const useDebounce = (callback, delay) => {
|
|
2863
|
+
let timeoutId = null;
|
|
2864
|
+
return function(...args) {
|
|
2865
|
+
if (timeoutId !== null) {
|
|
2866
|
+
clearTimeout(timeoutId);
|
|
2867
|
+
}
|
|
2868
|
+
timeoutId = setTimeout(() => {
|
|
2869
|
+
callback.apply(this, args);
|
|
2870
|
+
}, delay);
|
|
2871
|
+
};
|
|
2872
|
+
};
|
|
2873
|
+
|
|
2864
2874
|
const APP_MODULE = "#app";
|
|
2865
2875
|
class ADataProvider {
|
|
2866
2876
|
filter = ref(null);
|
|
@@ -2978,7 +2988,233 @@ class ADataProvider {
|
|
|
2978
2988
|
}
|
|
2979
2989
|
}
|
|
2980
2990
|
|
|
2981
|
-
const
|
|
2991
|
+
const useFilterLogic = () => {
|
|
2992
|
+
const evaluateFilter = (filter, row) => {
|
|
2993
|
+
if (filter.operator === EDataFilterOperator$1.And || filter.operator === EDataFilterOperator$1.Or || filter.operator === EDataFilterOperator$1.Nand || filter.operator === EDataFilterOperator$1.Nor) {
|
|
2994
|
+
return !filter.active || applyOperator(filter.operator, row, filter.field);
|
|
2995
|
+
}
|
|
2996
|
+
if ("operator" in filter.field && "field" in filter.field) {
|
|
2997
|
+
return !filter.active || evaluateFilter(filter.field, row);
|
|
2998
|
+
}
|
|
2999
|
+
const field = filter.field;
|
|
3000
|
+
const fieldKeys = Object.keys(field);
|
|
3001
|
+
return !filter.active || fieldKeys.every((key) => {
|
|
3002
|
+
const filterValue = field[key];
|
|
3003
|
+
const rowValue = row[key];
|
|
3004
|
+
return applyOperator(filter.operator, rowValue, filterValue);
|
|
3005
|
+
});
|
|
3006
|
+
};
|
|
3007
|
+
const applyOperator = (operator, rowValue, filterValue) => {
|
|
3008
|
+
switch (operator) {
|
|
3009
|
+
case EDataFilterOperator$1.And:
|
|
3010
|
+
return compareAnd(rowValue, filterValue);
|
|
3011
|
+
case EDataFilterOperator$1.Or:
|
|
3012
|
+
return compareOr(rowValue, filterValue);
|
|
3013
|
+
case EDataFilterOperator$1.Nand:
|
|
3014
|
+
return !compareAnd(rowValue, filterValue);
|
|
3015
|
+
case EDataFilterOperator$1.Nor:
|
|
3016
|
+
return !compareOr(rowValue, filterValue);
|
|
3017
|
+
case EDataFilterOperator$1.Equal:
|
|
3018
|
+
return compareEqual(rowValue, filterValue);
|
|
3019
|
+
case EDataFilterOperator$1.NotEqual:
|
|
3020
|
+
return !compareEqual(rowValue, filterValue);
|
|
3021
|
+
case EDataFilterOperator$1.GreaterThan:
|
|
3022
|
+
return compareValues(rowValue, filterValue) > 0;
|
|
3023
|
+
case EDataFilterOperator$1.LessThan:
|
|
3024
|
+
return compareValues(rowValue, filterValue) < 0;
|
|
3025
|
+
case EDataFilterOperator$1.GreaterThanOrEqual:
|
|
3026
|
+
return compareValues(rowValue, filterValue) >= 0;
|
|
3027
|
+
case EDataFilterOperator$1.LessThanOrEqual:
|
|
3028
|
+
return compareValues(rowValue, filterValue) <= 0;
|
|
3029
|
+
case EDataFilterOperator$1.In:
|
|
3030
|
+
return compareIn(rowValue, filterValue);
|
|
3031
|
+
case EDataFilterOperator$1.NotIn:
|
|
3032
|
+
return !compareIn(rowValue, filterValue);
|
|
3033
|
+
default:
|
|
3034
|
+
return compareEqual(rowValue, filterValue);
|
|
3035
|
+
}
|
|
3036
|
+
};
|
|
3037
|
+
const compareAnd = (row, nested) => {
|
|
3038
|
+
const subFilters = Array.isArray(nested) ? nested : nested && typeof nested === "object" ? Object.values(nested) : [];
|
|
3039
|
+
const validFilters = subFilters.filter((f) => f && typeof f === "object" && "operator" in f && "field" in f);
|
|
3040
|
+
if (validFilters.length === 0) return true;
|
|
3041
|
+
return validFilters.every((f) => {
|
|
3042
|
+
const active = f.active !== false;
|
|
3043
|
+
return active ? evaluateFilter(f, row) : true;
|
|
3044
|
+
});
|
|
3045
|
+
};
|
|
3046
|
+
const compareOr = (row, nested) => {
|
|
3047
|
+
const subFilters = Array.isArray(nested) ? nested : nested && typeof nested === "object" ? Object.values(nested) : [];
|
|
3048
|
+
const validFilters = subFilters.filter((f) => f && typeof f === "object" && "operator" in f && "field" in f);
|
|
3049
|
+
const activeFilters = validFilters.filter((f) => f.active !== false);
|
|
3050
|
+
if (activeFilters.length === 0) return true;
|
|
3051
|
+
return activeFilters.some((f) => {
|
|
3052
|
+
return evaluateFilter(f, row);
|
|
3053
|
+
});
|
|
3054
|
+
};
|
|
3055
|
+
const compareIn = (rowValue, filterValue) => {
|
|
3056
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3057
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
3058
|
+
}
|
|
3059
|
+
return false;
|
|
3060
|
+
};
|
|
3061
|
+
const compareEqual = (rowValue, filterValue) => {
|
|
3062
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3063
|
+
return rowValue.toLowerCase() == filterValue.toLowerCase();
|
|
3064
|
+
}
|
|
3065
|
+
if (typeof rowValue === "number" && typeof filterValue === "number") {
|
|
3066
|
+
return rowValue === filterValue;
|
|
3067
|
+
}
|
|
3068
|
+
if (typeof rowValue === "boolean" && typeof filterValue === "boolean") {
|
|
3069
|
+
return rowValue === filterValue;
|
|
3070
|
+
}
|
|
3071
|
+
return rowValue === filterValue;
|
|
3072
|
+
};
|
|
3073
|
+
const compareValues = (rowValue, filterValue) => {
|
|
3074
|
+
if (rowValue == null || filterValue == null) {
|
|
3075
|
+
return rowValue == null ? -1 : 1;
|
|
3076
|
+
}
|
|
3077
|
+
if (typeof rowValue === "string" && typeof filterValue === "string") {
|
|
3078
|
+
return rowValue.localeCompare(filterValue);
|
|
3079
|
+
}
|
|
3080
|
+
if (typeof rowValue === "number" && typeof filterValue === "number") {
|
|
3081
|
+
return rowValue - filterValue;
|
|
3082
|
+
}
|
|
3083
|
+
return String(rowValue).localeCompare(String(filterValue));
|
|
3084
|
+
};
|
|
3085
|
+
const filterTreeData = (nodes, filter, options) => {
|
|
3086
|
+
const { idKey, parentKey } = options;
|
|
3087
|
+
const nodeMap = new Map(nodes.map((node) => [node[idKey], node]));
|
|
3088
|
+
const childrenMap = /* @__PURE__ */ new Map();
|
|
3089
|
+
nodes.forEach((node) => {
|
|
3090
|
+
const pId = node[parentKey];
|
|
3091
|
+
if (pId != null) {
|
|
3092
|
+
if (!childrenMap.has(pId)) {
|
|
3093
|
+
childrenMap.set(pId, []);
|
|
3094
|
+
}
|
|
3095
|
+
childrenMap.get(pId).push(node);
|
|
3096
|
+
}
|
|
3097
|
+
});
|
|
3098
|
+
const matchingNodeIds = /* @__PURE__ */ new Set();
|
|
3099
|
+
const expandedNodes = /* @__PURE__ */ new Set();
|
|
3100
|
+
const visibleNodeIds = /* @__PURE__ */ new Set();
|
|
3101
|
+
nodes.forEach((node) => {
|
|
3102
|
+
const evalRow = node.data ? { ...node.data, ...node } : node;
|
|
3103
|
+
if (evaluateFilter(filter, evalRow)) {
|
|
3104
|
+
matchingNodeIds.add(node[idKey]);
|
|
3105
|
+
}
|
|
3106
|
+
});
|
|
3107
|
+
const addDescendants = (nodeId) => {
|
|
3108
|
+
const children = childrenMap.get(nodeId);
|
|
3109
|
+
if (children && children.length > 0) {
|
|
3110
|
+
expandedNodes.add(nodeId);
|
|
3111
|
+
children.forEach((child) => {
|
|
3112
|
+
visibleNodeIds.add(child[idKey]);
|
|
3113
|
+
addDescendants(child[idKey]);
|
|
3114
|
+
});
|
|
3115
|
+
}
|
|
3116
|
+
};
|
|
3117
|
+
matchingNodeIds.forEach((id) => {
|
|
3118
|
+
visibleNodeIds.add(id);
|
|
3119
|
+
addDescendants(id);
|
|
3120
|
+
let currentId = id;
|
|
3121
|
+
while (currentId != null) {
|
|
3122
|
+
visibleNodeIds.add(currentId);
|
|
3123
|
+
const node = nodeMap.get(currentId);
|
|
3124
|
+
if (node) {
|
|
3125
|
+
if (node[parentKey] != null) {
|
|
3126
|
+
expandedNodes.add(node[parentKey]);
|
|
3127
|
+
currentId = node[parentKey];
|
|
3128
|
+
} else {
|
|
3129
|
+
currentId = null;
|
|
3130
|
+
}
|
|
3131
|
+
} else {
|
|
3132
|
+
break;
|
|
3133
|
+
}
|
|
3134
|
+
}
|
|
3135
|
+
});
|
|
3136
|
+
const visibleNodes = nodes.filter((node) => visibleNodeIds.has(node[idKey]));
|
|
3137
|
+
return {
|
|
3138
|
+
visibleNodes,
|
|
3139
|
+
expandedNodes
|
|
3140
|
+
};
|
|
3141
|
+
};
|
|
3142
|
+
const filterData = (data, filter, options) => {
|
|
3143
|
+
if (options?.treeOptions) {
|
|
3144
|
+
const { visibleNodes, expandedNodes } = filterTreeData(
|
|
3145
|
+
data,
|
|
3146
|
+
filter,
|
|
3147
|
+
options.treeOptions
|
|
3148
|
+
);
|
|
3149
|
+
return { results: visibleNodes, expandedNodes };
|
|
3150
|
+
}
|
|
3151
|
+
const results = data.filter((row) => evaluateFilter(filter, row));
|
|
3152
|
+
return { results };
|
|
3153
|
+
};
|
|
3154
|
+
return {
|
|
3155
|
+
evaluateFilter,
|
|
3156
|
+
filterTreeData,
|
|
3157
|
+
filterData
|
|
3158
|
+
};
|
|
3159
|
+
};
|
|
3160
|
+
|
|
3161
|
+
const useSortLogic = () => {
|
|
3162
|
+
const sortData = (sortList, rows) => {
|
|
3163
|
+
if (!sortList || sortList.length === 0 || !rows || rows.length === 0) {
|
|
3164
|
+
return rows;
|
|
3165
|
+
}
|
|
3166
|
+
const sortedRows = [...rows];
|
|
3167
|
+
const compare = (a, b) => {
|
|
3168
|
+
for (const sort of sortList) {
|
|
3169
|
+
const aVal = a[sort.field];
|
|
3170
|
+
const bVal = b[sort.field];
|
|
3171
|
+
if (aVal === null || aVal === void 0) {
|
|
3172
|
+
if (bVal === null || bVal === void 0) continue;
|
|
3173
|
+
return sort.direction === "asc" ? -1 : 1;
|
|
3174
|
+
}
|
|
3175
|
+
if (bVal === null || bVal === void 0) {
|
|
3176
|
+
return sort.direction === "asc" ? 1 : -1;
|
|
3177
|
+
}
|
|
3178
|
+
if (aVal < bVal) {
|
|
3179
|
+
return sort.direction === "asc" ? -1 : 1;
|
|
3180
|
+
} else if (aVal > bVal) {
|
|
3181
|
+
return sort.direction === "asc" ? 1 : -1;
|
|
3182
|
+
}
|
|
3183
|
+
}
|
|
3184
|
+
return 0;
|
|
3185
|
+
};
|
|
3186
|
+
const merge = (left, right) => {
|
|
3187
|
+
const result = [];
|
|
3188
|
+
let leftIndex = 0;
|
|
3189
|
+
let rightIndex = 0;
|
|
3190
|
+
while (leftIndex < left.length && rightIndex < right.length) {
|
|
3191
|
+
if (compare(left[leftIndex], right[rightIndex]) <= 0) {
|
|
3192
|
+
result.push(left[leftIndex]);
|
|
3193
|
+
leftIndex++;
|
|
3194
|
+
} else {
|
|
3195
|
+
result.push(right[rightIndex]);
|
|
3196
|
+
rightIndex++;
|
|
3197
|
+
}
|
|
3198
|
+
}
|
|
3199
|
+
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
|
|
3200
|
+
};
|
|
3201
|
+
const mergeSort = (arr) => {
|
|
3202
|
+
if (arr.length <= 1) {
|
|
3203
|
+
return arr;
|
|
3204
|
+
}
|
|
3205
|
+
const mid = Math.floor(arr.length / 2);
|
|
3206
|
+
const left = mergeSort(arr.slice(0, mid));
|
|
3207
|
+
const right = mergeSort(arr.slice(mid));
|
|
3208
|
+
return merge(left, right);
|
|
3209
|
+
};
|
|
3210
|
+
return mergeSort(sortedRows);
|
|
3211
|
+
};
|
|
3212
|
+
return {
|
|
3213
|
+
sortData
|
|
3214
|
+
};
|
|
3215
|
+
};
|
|
3216
|
+
|
|
3217
|
+
const { filterData: filterData$1 } = useFilterLogic();
|
|
2982
3218
|
const { sortData } = useSortLogic();
|
|
2983
3219
|
class CFlatClientDataProvider extends ADataProvider {
|
|
2984
3220
|
allData = ref([]);
|
|
@@ -4643,7 +4879,7 @@ class AAPIDataProvider {
|
|
|
4643
4879
|
}
|
|
4644
4880
|
}
|
|
4645
4881
|
|
|
4646
|
-
const {
|
|
4882
|
+
const { filterData } = useFilterLogic();
|
|
4647
4883
|
class CTreeClientDataProvider extends CFlatClientDataProvider {
|
|
4648
4884
|
// Tree configuration
|
|
4649
4885
|
parentKey = "parentId";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@katlux/providers",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.21",
|
|
4
4
|
"description": "Core data calculation and caching providers for the Katlux ecosystem",
|
|
5
5
|
"author": "Katlux",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "unbuild",
|
|
14
|
-
"dev": "unbuild --stub"
|
|
14
|
+
"dev": "unbuild --stub",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
15
16
|
},
|
|
16
17
|
"exports": {
|
|
17
18
|
".": {
|
|
@@ -20,9 +21,7 @@
|
|
|
20
21
|
"require": "./dist/index.cjs"
|
|
21
22
|
}
|
|
22
23
|
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@katlux/toolkit": "*"
|
|
25
|
-
},
|
|
24
|
+
"dependencies": {},
|
|
26
25
|
"files": [
|
|
27
26
|
"dist"
|
|
28
27
|
]
|