@m4l/components 9.43.0 → 9.43.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/DynamicFilter/helpers/getPurgedInitialFiltersApplied.d.ts +2 -1
- package/components/DynamicFilter/helpers/getPurgedInitialFiltersApplied.d.ts.map +1 -1
- package/components/DynamicFilter/helpers/getPurgedInitialFiltersApplied.js +5 -4
- package/components/DynamicFilter/store/DynamicFilterContext.d.ts.map +1 -1
- package/components/DynamicFilter/store/DynamicFilterContext.js +54 -51
- package/components/DynamicFilter/store/DynamicFilterStore.d.ts.map +1 -1
- package/components/DynamicFilter/store/DynamicFilterStore.js +2 -1
- package/components/DynamicFilter/store/types.d.ts +7 -1
- package/components/DynamicFilter/store/types.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.d.ts +3 -3
- package/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.js +57 -56
- package/components/DynamicFilter/subcomponents/FieldTypes/FieldTypeInterface.d.ts +15 -3
- package/components/DynamicFilter/subcomponents/FieldTypes/FieldTypeInterface.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/InputFilter/InputFilter.d.ts +1 -1
- package/components/DynamicFilter/subcomponents/InputFilter/InputFilter.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/InputFilter/InputFilter.js +25 -26
- package/components/DynamicFilter/subcomponents/InputFilter/useInputFilter.d.ts +0 -4
- package/components/DynamicFilter/subcomponents/InputFilter/useInputFilter.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/InputFilter/useInputFilter.js +23 -27
- package/components/DynamicFilter/subcomponents/PopoverFilter/usePopoverFilter.d.ts.map +1 -1
- package/components/DynamicFilter/subcomponents/PopoverFilter/usePopoverFilter.js +25 -25
- package/package.json +8 -8
|
@@ -4,7 +4,8 @@ import { FilterField, FilterFieldApplied, InitialFilterApplied } from '../types'
|
|
|
4
4
|
* @param fields todos los campos que pueden aparecer en el filtro no Inclute el AllField
|
|
5
5
|
* @param initialFilters Filtros que van a ser purgados (Eliminados si tienen errores)
|
|
6
6
|
* @param getFieldByName Funcion para obtener el Field a través del nombre
|
|
7
|
+
* @param timeZoneName Zona horaria del usuario para construir los filtros por defecto de fecha
|
|
7
8
|
* @returns Array de filtros aplicados excluyendo los que tengan errores
|
|
8
9
|
*/
|
|
9
|
-
export declare function getPurgedInitialFiltersApplied(fields: Array<FilterField>, initialFilters: Array<InitialFilterApplied>, getFieldByName: (name: string) => FilterField): Array<FilterFieldApplied>;
|
|
10
|
+
export declare function getPurgedInitialFiltersApplied(fields: Array<FilterField>, initialFilters: Array<InitialFilterApplied>, getFieldByName: (name: string) => FilterField, timeZoneName?: string): Array<FilterFieldApplied>;
|
|
10
11
|
//# sourceMappingURL=getPurgedInitialFiltersApplied.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPurgedInitialFiltersApplied.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/helpers/getPurgedInitialFiltersApplied.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEtF
|
|
1
|
+
{"version":3,"file":"getPurgedInitialFiltersApplied.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/helpers/getPurgedInitialFiltersApplied.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEtF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,EAC1B,cAAc,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAC3C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,KAAK,CAAC,kBAAkB,CAAC,CA2D3B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fieldFactory as p } from "../subcomponents/FieldTypes/fieldFactory.js";
|
|
2
|
-
function
|
|
2
|
+
function x(f, t, a, c) {
|
|
3
3
|
const o = [], i = [];
|
|
4
4
|
for (let n = 0; n < t.length; n++)
|
|
5
5
|
try {
|
|
@@ -16,7 +16,7 @@ function u(f, t, a) {
|
|
|
16
16
|
};
|
|
17
17
|
if (!e)
|
|
18
18
|
continue;
|
|
19
|
-
p(e.type).verifyFilter(d, e) && (r.fieldType === "datetime" && (r.operand1 = /* @__PURE__ */ new Date(r.operand1 + ""), r.operand2 = /* @__PURE__ */ new Date(r.operand2 + "")), e.presence === "fixed" && (i.findIndex((
|
|
19
|
+
p(e.type).verifyFilter(d, e) && (r.fieldType === "datetime" && (r.operand1 = /* @__PURE__ */ new Date(r.operand1 + ""), r.operand2 = /* @__PURE__ */ new Date(r.operand2 + "")), e.presence === "fixed" && (i.findIndex((s) => s === e.name) === -1 ? (r.fixed = !0, i.push(e.name)) : r.fixed = !1), r.isSet = !0, r.id = o.length + 1, o.push(r));
|
|
20
20
|
} catch {
|
|
21
21
|
}
|
|
22
22
|
for (let n = 0; n < f.length; n++) {
|
|
@@ -24,7 +24,8 @@ function u(f, t, a) {
|
|
|
24
24
|
if ((d.presence === "initialized" || d.presence === "fixed") && !t.find((e) => e.name === d.name)) {
|
|
25
25
|
const e = p(d.type).getDefaultFilter(
|
|
26
26
|
d,
|
|
27
|
-
d.presence === "fixed"
|
|
27
|
+
d.presence === "fixed",
|
|
28
|
+
c
|
|
28
29
|
);
|
|
29
30
|
e.id = -(o.length + 1), o.push(e);
|
|
30
31
|
}
|
|
@@ -32,5 +33,5 @@ function u(f, t, a) {
|
|
|
32
33
|
return o;
|
|
33
34
|
}
|
|
34
35
|
export {
|
|
35
|
-
|
|
36
|
+
x as getPurgedInitialFiltersApplied
|
|
36
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicFilterContext.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/DynamicFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DynamicFilterContext.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/DynamicFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAaf,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAQhE,QAAA,MAAM,oBAAoB,6GAAiD,CAAC;AAC5E,UAAU,yBAA0B,SAAQ,kBAAkB;IAC5D,QAAQ,EAAE,SAAS,CAAC;CACrB;AACD;;GAEG;AACH,QAAA,MAAM,qBAAqB,wHAyMzB,CAAC;AAEH,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,43 +1,46 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { forwardRef as V, useRef as
|
|
1
|
+
import { jsx as f } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { forwardRef as V, useRef as Z, useImperativeHandle as j, useEffect as s, createContext as B } from "react";
|
|
3
3
|
import { useStore as r } from "zustand";
|
|
4
4
|
import { shallow as i } from "zustand/shallow";
|
|
5
|
-
import { useModuleDictionary as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { useModuleDictionary as H, useUserPreferences as U, useModuleSkeleton as _ } from "@m4l/core";
|
|
6
|
+
import { Icon as $ } from "@m4l/base";
|
|
7
|
+
import { FileFolderAuditOutlined as q } from "@m4l/icons";
|
|
8
|
+
import { useIsMobile as G, useFirstRender as J } from "@m4l/graphics";
|
|
9
|
+
import { useComponentSize as Q } from "../../../hooks/useComponentSize/index.js";
|
|
8
10
|
import { ALL_FIELD as W } from "../constants.js";
|
|
9
11
|
import { formatToRawFilter as X } from "../helpers/formatToRowFilter.js";
|
|
10
12
|
import { formatToInitialFilters as Y } from "../helpers/formatToInitialFilters.js";
|
|
11
|
-
import { createDynamicFilterStore as
|
|
12
|
-
const
|
|
13
|
+
import { createDynamicFilterStore as K } from "./DynamicFilterStore.js";
|
|
14
|
+
const ee = B(null), de = V((S, h) => {
|
|
13
15
|
const {
|
|
14
|
-
automatic:
|
|
15
|
-
withAllField:
|
|
16
|
-
fields:
|
|
17
|
-
initialAppliedFilters:
|
|
18
|
-
onChangeFilters:
|
|
16
|
+
automatic: m = !0,
|
|
17
|
+
withAllField: v = !0,
|
|
18
|
+
fields: y,
|
|
19
|
+
initialAppliedFilters: C = [],
|
|
20
|
+
onChangeFilters: D,
|
|
19
21
|
onDirty: u,
|
|
20
|
-
dataTestId:
|
|
21
|
-
size:
|
|
22
|
+
dataTestId: w = "",
|
|
23
|
+
size: A,
|
|
22
24
|
children: E,
|
|
23
25
|
storeId: R,
|
|
24
26
|
storeDevtoolsEnabled: b = !1,
|
|
25
27
|
visibleRefresh: l = !0
|
|
26
|
-
} =
|
|
27
|
-
e.current || (e.current =
|
|
28
|
+
} = S, { currentSize: o } = Q(A), { getLabel: M } = H(), x = U().timeZone?.name, e = Z(null), a = !G(), c = _(), z = J([a, c]);
|
|
29
|
+
e.current || (e.current = K(
|
|
28
30
|
{
|
|
29
31
|
allField: {
|
|
30
32
|
...W,
|
|
31
|
-
|
|
33
|
+
icon: /* @__PURE__ */ f($, { src: /* @__PURE__ */ f(q, {}) })
|
|
32
34
|
},
|
|
33
|
-
withAllField:
|
|
34
|
-
fields:
|
|
35
|
-
automatic:
|
|
36
|
-
getLabel:
|
|
37
|
-
dataTestId:
|
|
38
|
-
size:
|
|
35
|
+
withAllField: v,
|
|
36
|
+
fields: y,
|
|
37
|
+
automatic: m,
|
|
38
|
+
getLabel: M,
|
|
39
|
+
dataTestId: w,
|
|
40
|
+
size: o,
|
|
39
41
|
storeId: R,
|
|
40
42
|
visibleRefresh: l,
|
|
43
|
+
timeZoneName: x,
|
|
41
44
|
ownerState: {
|
|
42
45
|
isSkeleton: c,
|
|
43
46
|
isDirty: !1,
|
|
@@ -45,11 +48,11 @@ const K = H(null), fe = V((g, S) => {
|
|
|
45
48
|
isValid: !0,
|
|
46
49
|
isMobile: !a,
|
|
47
50
|
isEmpty: !0,
|
|
48
|
-
size:
|
|
51
|
+
size: o
|
|
49
52
|
}
|
|
50
53
|
},
|
|
51
54
|
b
|
|
52
|
-
), e.current.getState().actions.init(
|
|
55
|
+
), e.current.getState().actions.init(C));
|
|
53
56
|
const I = r(
|
|
54
57
|
e.current,
|
|
55
58
|
(t) => t.actions.fireOnChangeFilters,
|
|
@@ -62,62 +65,62 @@ const K = H(null), fe = V((g, S) => {
|
|
|
62
65
|
e.current,
|
|
63
66
|
(t) => t.actions.showPopoverFilterForAdd,
|
|
64
67
|
i
|
|
65
|
-
),
|
|
68
|
+
), L = (t) => {
|
|
66
69
|
try {
|
|
67
|
-
const
|
|
68
|
-
if (!
|
|
70
|
+
const n = e.current?.getState();
|
|
71
|
+
if (!n)
|
|
69
72
|
return;
|
|
70
|
-
const
|
|
71
|
-
(
|
|
72
|
-
),
|
|
73
|
-
if (
|
|
73
|
+
const F = n.actions.getFieldByName(t), T = n.appliedFilters.some(
|
|
74
|
+
(g) => g.field.name === t && g.isSet
|
|
75
|
+
), N = F.multiple;
|
|
76
|
+
if (T && !N)
|
|
74
77
|
return;
|
|
75
|
-
P(
|
|
76
|
-
} catch (
|
|
77
|
-
throw new Error(`Error al agregar el filtro externo: ${
|
|
78
|
+
P(F);
|
|
79
|
+
} catch (n) {
|
|
80
|
+
throw new Error(`Error al agregar el filtro externo: ${n}`);
|
|
78
81
|
}
|
|
79
|
-
},
|
|
82
|
+
}, k = r(
|
|
80
83
|
e.current,
|
|
81
84
|
(t) => () => t.appliedFilters,
|
|
82
85
|
i
|
|
83
86
|
);
|
|
84
|
-
|
|
87
|
+
j(h, () => ({
|
|
85
88
|
fireOnChangeFilter: I,
|
|
86
89
|
openPopoverMenuFields: O,
|
|
87
|
-
addExternalFilter:
|
|
88
|
-
getCurrentFilters:
|
|
90
|
+
addExternalFilter: L,
|
|
91
|
+
getCurrentFilters: k
|
|
89
92
|
}));
|
|
90
|
-
const
|
|
93
|
+
const p = r(
|
|
91
94
|
e.current,
|
|
92
95
|
(t) => t.countOnChangeFiltersApplied,
|
|
93
96
|
i
|
|
94
|
-
),
|
|
97
|
+
), d = r(
|
|
95
98
|
e.current,
|
|
96
99
|
(t) => t.ownerState.isDirty,
|
|
97
100
|
i
|
|
98
101
|
);
|
|
99
102
|
return s(() => {
|
|
100
|
-
if (
|
|
103
|
+
if (p === 0)
|
|
101
104
|
return;
|
|
102
105
|
const t = e.current?.getState();
|
|
103
|
-
t &&
|
|
106
|
+
t && D?.(
|
|
104
107
|
Y(t.appliedFilters),
|
|
105
108
|
X(t.appliedFilters)
|
|
106
109
|
);
|
|
107
|
-
}, [
|
|
110
|
+
}, [p]), s(() => {
|
|
108
111
|
z || e.current?.getState().actions.setExternalState({ isMobile: !a, isSkeleton: c });
|
|
109
112
|
}, [a, c]), s(() => {
|
|
110
|
-
if (
|
|
113
|
+
if (m) {
|
|
111
114
|
e.current?.getState().actions.fireOnChangeFilters();
|
|
112
115
|
return;
|
|
113
116
|
}
|
|
114
117
|
}, []), s(() => {
|
|
115
|
-
u &&
|
|
116
|
-
}, [
|
|
117
|
-
e.current?.getState().size !==
|
|
118
|
-
}, [
|
|
118
|
+
u && d && u();
|
|
119
|
+
}, [d, u]), s(() => {
|
|
120
|
+
e.current?.getState().size !== o && e.current?.getState().actions.setSize(o), e.current?.getState().visibleRefresh !== l && e.current?.getState().actions.setVisibleRefresh(l);
|
|
121
|
+
}, [o, l]), /* @__PURE__ */ f(ee.Provider, { value: e.current, children: E });
|
|
119
122
|
});
|
|
120
123
|
export {
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
ee as DynamicFilterContext,
|
|
125
|
+
de as DynamicFilterProvider
|
|
123
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicFilterStore.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/DynamicFilterStore.ts"],"names":[],"mappings":"AAaA,OAAO,EAAsB,6BAA6B,EAAsB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAgDnH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,WAAW,iBAAiB,EAAE,8BAA4B,
|
|
1
|
+
{"version":3,"file":"DynamicFilterStore.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/DynamicFilterStore.ts"],"names":[],"mappings":"AAaA,OAAO,EAAsB,6BAA6B,EAAsB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAgDnH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,WAAW,iBAAiB,EAAE,8BAA4B,8DA4PlG,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|
|
@@ -73,6 +73,12 @@ export interface DynamicFilterState extends Pick<DynamicFilterProps, 'visibleRef
|
|
|
73
73
|
* Función utilizada para el dictionary
|
|
74
74
|
*/
|
|
75
75
|
getLabel: GetLabelType;
|
|
76
|
+
/**
|
|
77
|
+
* "timeZoneName" IANA time-zone name from the user preferences (e.g.
|
|
78
|
+
* "America/Bogota"). Date filters use it so the picker, the applied chip and
|
|
79
|
+
* the network query all agree on the user's clock. Undefined = local time.
|
|
80
|
+
*/
|
|
81
|
+
timeZoneName?: string;
|
|
76
82
|
}
|
|
77
83
|
export interface DynamicFilterStateWithActions extends DynamicFilterState {
|
|
78
84
|
actions: {
|
|
@@ -182,5 +188,5 @@ export interface DynamicFilterStateWithActions extends DynamicFilterState {
|
|
|
182
188
|
setVisibleRefresh: (newVisibleRefresh: boolean) => void;
|
|
183
189
|
};
|
|
184
190
|
}
|
|
185
|
-
export type InitialStoreProps = Pick<DynamicFilterState, 'automatic' | 'fields' | 'withAllField' | 'getLabel' | 'allField' | 'ownerState' | 'dataTestId' | 'size' | 'storeId' | 'visibleRefresh'>;
|
|
191
|
+
export type InitialStoreProps = Pick<DynamicFilterState, 'automatic' | 'fields' | 'withAllField' | 'getLabel' | 'allField' | 'ownerState' | 'dataTestId' | 'size' | 'storeId' | 'visibleRefresh' | 'timeZoneName'>;
|
|
186
192
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACX,MAAM,UAAU,CAAC;AAClB,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAGrC,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAKlB;AACD,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,OAAO,EAAE,KAAK,CAAC;IACf;;OAEG;IACH,KAAK,EAAE,WAAW,CAAC;CACpB;AACD,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;CACpB;AACD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;AAC7E;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;AAG7E;;GAEG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,QAAQ,CAAC;IAChI;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;OAEG;IACH,QAAQ,EAAE,WAAW,CAAC;IAEtB;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACpC;;OAEG;IACH,cAAc,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC1C;;;OAGG;IACH,2BAA2B,EAAE,MAAM,CAAC;IACpC;;OAEG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/components/DynamicFilter/store/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,15 +12,15 @@ export declare class DateTimeFilterHelpers implements IFieldType<FormFilterValue
|
|
|
12
12
|
/**
|
|
13
13
|
* getDefaultFilter devuelve un filtro por defecto para un campo de fecha y hora.
|
|
14
14
|
*/
|
|
15
|
-
getDefaultFilter(field: FilterField, fixed: boolean): FilterFieldApplied;
|
|
15
|
+
getDefaultFilter(field: FilterField, fixed: boolean, timeZoneName?: string): FilterFieldApplied;
|
|
16
16
|
/**
|
|
17
17
|
* getFormValue convierte un valor de filtro en un valor de formulario.
|
|
18
18
|
*/
|
|
19
|
-
getFormValue(field: FilterField, getLabel: GetLabelType, filterValueDateTime?: FilterValue): FormFilterValueDateTime;
|
|
19
|
+
getFormValue(field: FilterField, getLabel: GetLabelType, filterValueDateTime?: FilterValue, timeZoneName?: string): FormFilterValueDateTime;
|
|
20
20
|
/**
|
|
21
21
|
* getFilterFromFormValue convierte un valor de formulario en un valor de filtro.
|
|
22
22
|
*/
|
|
23
|
-
getFilterFromFormValue(formFilterValue: FormFilterValueDateTime): FilterValue;
|
|
23
|
+
getFilterFromFormValue(formFilterValue: FormFilterValueDateTime, timeZoneName?: string): FilterValue;
|
|
24
24
|
/**
|
|
25
25
|
* getlabels devuelve las etiquetas de un filtro de fecha y hora.
|
|
26
26
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/FieldTypes/DateTimeFilter/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,YAAY,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,KAAK,EACV,mBAAmB,EAEnB,WAAW,EACX,kBAAkB,EAClB,WAAW,EAEX,uBAAuB,EAEvB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAqF,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC3J;;GAEG;AACH,qBAAa,qBACb,YAAW,UAAU,CAAC,uBAAuB,CAAC;IAE5C,YAAY;IAGZ;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,kBAAkB;IAuC/F;;OAEG;IACH,YAAY,CACV,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,YAAY,EACtB,mBAAmB,CAAC,EAAE,WAAW,EACjC,YAAY,CAAC,EAAE,MAAM,GACpB,uBAAuB;IAoC1B;;OAEG;IACH,sBAAsB,CACpB,eAAe,EAAE,uBAAuB,EACxC,YAAY,CAAC,EAAE,MAAM,GACpB,WAAW;IAwBd;;OAEG;IACH,SAAS,CACP,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,WAAW,GAClB,mBAAmB;IA8BtB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAAC,uBAAuB,CAAC;IA+BjG;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO;CAuB1E"}
|
|
@@ -1,87 +1,88 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
1
|
+
import { convertDateToUserTimeZone as d, convertDateFromUserTimeZone as l } from "@m4l/core";
|
|
2
|
+
import * as u from "yup";
|
|
3
|
+
import { DATE_TIME_OPERATORS as V } from "../../../constants.js";
|
|
4
|
+
import { DYNAMIC_FILTER_DICTIONARY_ID as c, DICCTIONARY as p } from "../../../dictionary.js";
|
|
5
|
+
import { DateTimeFilter as T } from "./index.js";
|
|
6
|
+
import { startOfDay as F, endOfDay as b, differenceInDays as I } from "date-fns";
|
|
7
|
+
import { isValidDate as m } from "../../../../../utils/isValidDate.js";
|
|
8
|
+
import { createValidationSchema as w, createValidationFullObject as x, createValidationPartialObject as $ } from "../../../../hook-form/RHFormProvider/schema.js";
|
|
9
|
+
class g {
|
|
9
10
|
getComponent() {
|
|
10
|
-
return
|
|
11
|
+
return T;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* getDefaultFilter devuelve un filtro por defecto para un campo de fecha y hora.
|
|
14
15
|
*/
|
|
15
|
-
getDefaultFilter(e, o) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
let
|
|
20
|
-
return
|
|
16
|
+
getDefaultFilter(e, o, a) {
|
|
17
|
+
const t = d(/* @__PURE__ */ new Date(), a), r = new Date(t), n = new Date(t);
|
|
18
|
+
r.setHours(0, 0, 0, 0), n.setHours(23, 59, 59, 999);
|
|
19
|
+
const s = e.defaultOperand1 && e.defaultOperand1 instanceof Date ? e.defaultOperand1 : l(r, a), i = e.defaultOperand2 && e.defaultOperand2 instanceof Date ? e.defaultOperand2 : l(n, a);
|
|
20
|
+
let f = !1;
|
|
21
|
+
return s !== void 0 && (f = !0), {
|
|
21
22
|
id: 0,
|
|
22
23
|
fieldType: "datetime",
|
|
23
24
|
field: e,
|
|
24
25
|
fixed: o,
|
|
25
|
-
isSet:
|
|
26
|
+
isSet: f,
|
|
26
27
|
operator: "b",
|
|
27
|
-
operand1:
|
|
28
|
-
operand2:
|
|
28
|
+
operand1: s,
|
|
29
|
+
operand2: i
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
/**
|
|
32
33
|
* getFormValue convierte un valor de filtro en un valor de formulario.
|
|
33
34
|
*/
|
|
34
|
-
getFormValue(e, o, a) {
|
|
35
|
-
const r = a,
|
|
35
|
+
getFormValue(e, o, a, t) {
|
|
36
|
+
const r = a, n = r ? r.operator : e.defaultOperator ?? "b", s = d(/* @__PURE__ */ new Date(), t), i = F(s), f = b(s), O = e.defaultOperand1 && e.defaultOperand1 instanceof Date ? d(e.defaultOperand1, t) : i, D = e.defaultOperand2 && e.defaultOperand2 instanceof Date ? d(e.defaultOperand2, t) : f, _ = r ? d(r.operand1, t) : O, y = r && r.operator === "b" ? d(r.operand2, t) : D;
|
|
36
37
|
return {
|
|
37
38
|
fieldType: "datetime",
|
|
38
39
|
formValueOperator: {
|
|
39
|
-
id:
|
|
40
|
-
label: o(`${
|
|
40
|
+
id: n,
|
|
41
|
+
label: o(`${c}.operator_${n}`)
|
|
41
42
|
},
|
|
42
|
-
formValueOperand1:
|
|
43
|
-
formValueOperand2:
|
|
43
|
+
formValueOperand1: _,
|
|
44
|
+
formValueOperand2: y
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
48
|
* getFilterFromFormValue convierte un valor de formulario en un valor de filtro.
|
|
48
49
|
*/
|
|
49
|
-
getFilterFromFormValue(e) {
|
|
50
|
-
const
|
|
51
|
-
if (
|
|
52
|
-
const r = e.formValueOperand2;
|
|
50
|
+
getFilterFromFormValue(e, o) {
|
|
51
|
+
const a = e.formValueOperator.id, t = l(e.formValueOperand1, o);
|
|
52
|
+
if (a === "b") {
|
|
53
|
+
const r = e.formValueOperand2, n = r && l(r, o);
|
|
53
54
|
return {
|
|
54
55
|
fieldType: "datetime",
|
|
55
|
-
operator:
|
|
56
|
-
operand1:
|
|
57
|
-
operand2:
|
|
56
|
+
operator: a,
|
|
57
|
+
operand1: t,
|
|
58
|
+
operand2: n
|
|
58
59
|
};
|
|
59
60
|
} else
|
|
60
61
|
return {
|
|
61
62
|
fieldType: "datetime",
|
|
62
|
-
operator:
|
|
63
|
-
operand1:
|
|
63
|
+
operator: a,
|
|
64
|
+
operand1: t
|
|
64
65
|
};
|
|
65
66
|
}
|
|
66
67
|
/**
|
|
67
68
|
* getlabels devuelve las etiquetas de un filtro de fecha y hora.
|
|
68
69
|
*/
|
|
69
|
-
getLabels(e, o, a,
|
|
70
|
-
const { dateFormatter:
|
|
70
|
+
getLabels(e, o, a, t) {
|
|
71
|
+
const { dateFormatter: r } = a;
|
|
71
72
|
let n;
|
|
72
|
-
return e.operator === "b" ? n = e.operand1 && e.operand2 ? `${
|
|
73
|
+
return e.operator === "b" ? n = e.operand1 && e.operand2 ? `${r.formatDate(
|
|
73
74
|
e.operand1,
|
|
74
|
-
|
|
75
|
-
)} - ${
|
|
75
|
+
r.datetimeFormat
|
|
76
|
+
)} - ${r.formatDate(
|
|
76
77
|
e.operand2,
|
|
77
|
-
|
|
78
|
-
)}` : "" : n = e.operand1 ?
|
|
78
|
+
r.datetimeFormat
|
|
79
|
+
)}` : "" : n = e.operand1 ? r.formatDate(
|
|
79
80
|
e.operand1,
|
|
80
|
-
|
|
81
|
+
r.datetimeFormat
|
|
81
82
|
) : "", {
|
|
82
83
|
labelField: e.field.label ?? o(e.field.dictionaryId),
|
|
83
84
|
labelOperator: o(
|
|
84
|
-
`${
|
|
85
|
+
`${c}.operator_${e.operator}`
|
|
85
86
|
),
|
|
86
87
|
labelOperands: n
|
|
87
88
|
};
|
|
@@ -91,22 +92,22 @@ class v {
|
|
|
91
92
|
*/
|
|
92
93
|
getSchema(e, o) {
|
|
93
94
|
const a = o?.maxDays;
|
|
94
|
-
return
|
|
95
|
-
formValueOperator:
|
|
96
|
-
formValueOperand1:
|
|
97
|
-
formValueOperand2:
|
|
95
|
+
return w(x($({
|
|
96
|
+
formValueOperator: u.object().nullable().required(e(p.error_operator_required)),
|
|
97
|
+
formValueOperand1: u.date().required(e(p.error_invalid_date)).typeError(e(p.error_invalid_date)),
|
|
98
|
+
formValueOperand2: u.mixed().when(["formValueOperator.id"], {
|
|
98
99
|
is: "b",
|
|
99
|
-
then:
|
|
100
|
-
|
|
101
|
-
e(
|
|
100
|
+
then: u.date().typeError(e(p.error_invalid_date)).min(
|
|
101
|
+
u.ref("formValueOperand1"),
|
|
102
|
+
e(p.error_invalid_date)
|
|
102
103
|
).test(
|
|
103
104
|
"max-days",
|
|
104
|
-
`${e(
|
|
105
|
-
function(
|
|
106
|
-
if (!a || !
|
|
105
|
+
`${e(p.error_max_days_exceeded)} (Máx. ${a})`,
|
|
106
|
+
function(t) {
|
|
107
|
+
if (!a || !t)
|
|
107
108
|
return !0;
|
|
108
|
-
const
|
|
109
|
-
return
|
|
109
|
+
const r = this.parent.formValueOperand1;
|
|
110
|
+
return r ? I(t, r) <= a : !0;
|
|
110
111
|
}
|
|
111
112
|
)
|
|
112
113
|
})
|
|
@@ -116,9 +117,9 @@ class v {
|
|
|
116
117
|
* verifyFilter verifica si un filtro de fecha y hora es válido.
|
|
117
118
|
*/
|
|
118
119
|
verifyFilter(e, o) {
|
|
119
|
-
return !(typeof e.operator != "string" ||
|
|
120
|
+
return !(typeof e.operator != "string" || V.findIndex((a) => a === e.operator) === -1 || typeof e.operand1 != "string" || !m(new Date(e.operand1)) || e.operator === "b" && (typeof e.operand2 != "string" || !m(new Date(e.operand1))));
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
123
|
export {
|
|
123
|
-
|
|
124
|
+
g as DateTimeFilterHelpers
|
|
124
125
|
};
|
|
@@ -10,11 +10,23 @@ export interface IFieldType<T extends RHFormValues> {
|
|
|
10
10
|
getComponent(): FC<{
|
|
11
11
|
[key: string]: any;
|
|
12
12
|
}>;
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* `timeZoneName` (optional) lets date-based field types build their default
|
|
15
|
+
* operands in the user-preference time zone. Non-date field types ignore it.
|
|
16
|
+
*/
|
|
17
|
+
getDefaultFilter(field: FilterField, fixed: boolean, timeZoneName?: string): FilterFieldApplied;
|
|
14
18
|
getLabels(filter: FilterFieldApplied, getLabel: GetLabelType, formatters: Formatters, field: FilterField): DataTypeFilerLabels;
|
|
15
19
|
getSchema(getLabel: GetLabelType, field?: FilterField): ValidationSchema<T>;
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
/**
|
|
21
|
+
* `timeZoneName` (optional) lets date-based field types convert stored
|
|
22
|
+
* instants into the wall-clock the picker shows. Non-date field types ignore it.
|
|
23
|
+
*/
|
|
24
|
+
getFormValue(field: FilterField, getLabel: GetLabelType, filterValue?: FilterValue, timeZoneName?: string): T;
|
|
25
|
+
/**
|
|
26
|
+
* `timeZoneName` (optional) lets date-based field types convert the picker
|
|
27
|
+
* wall-clock back into the stored instant. Non-date field types ignore it.
|
|
28
|
+
*/
|
|
29
|
+
getFilterFromFormValue(formFilterValue: T, timeZoneName?: string): FilterValue;
|
|
18
30
|
verifyFilter(filter: InitialFilterApplied, field?: FilterField): boolean;
|
|
19
31
|
}
|
|
20
32
|
//# sourceMappingURL=FieldTypeInterface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldTypeInterface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/FieldTypes/FieldTypeInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,YAAY;IAChD,YAAY,IAAI,EAAE,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAC;IAC3C,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"FieldTypeInterface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/FieldTypes/FieldTypeInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,YAAY;IAChD,YAAY,IAAI,EAAE,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC,CAAC;IAC3C;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAChG,SAAS,CACP,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,WAAW,GACjB,mBAAmB,CAAC;IACvB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC5E;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC9G;;;OAGG;IACH,sBAAsB,CAAC,eAAe,EAAE,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/E,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CAC1E"}
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* campos. Al hacerle clic abre `PopoverMenuFields`, el cual contiene el input
|
|
4
4
|
* "Filtrar por" y el listado de campos disponibles.
|
|
5
5
|
*/
|
|
6
|
-
declare const InputFilter: () => import("@emotion/react/jsx-runtime").JSX.Element
|
|
6
|
+
declare const InputFilter: () => import("@emotion/react/jsx-runtime").JSX.Element;
|
|
7
7
|
export default InputFilter;
|
|
8
8
|
//# sourceMappingURL=InputFilter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/InputFilter/InputFilter.tsx"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,QAAA,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"InputFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/InputFilter/InputFilter.tsx"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,QAAA,MAAM,WAAW,wDA8ChB,CAAC;AACF,eAAe,WAAW,CAAC"}
|
|
@@ -1,54 +1,53 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { ActionsFilterDuotone as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { jsxs as c, Fragment as F, jsx as r } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { useRef as x, useEffect as g } from "react";
|
|
3
|
+
import { ActionsFilterDuotone as I } from "@m4l/icons";
|
|
4
|
+
import P from "../DynamicFilterBase/useDynamicFilterBase.js";
|
|
5
|
+
import v from "./useInputFilter.js";
|
|
6
6
|
import { InputFilterTriggerButtonStyled as S } from "../../slots/dynamicFilterSlots.js";
|
|
7
7
|
import h from "../PopoverMenuFields/PopoverMenuFields.js";
|
|
8
|
-
const
|
|
8
|
+
const B = () => {
|
|
9
9
|
const {
|
|
10
|
-
isSkeleton:
|
|
11
|
-
inputPlaceHolder:
|
|
10
|
+
isSkeleton: i,
|
|
11
|
+
inputPlaceHolder: n,
|
|
12
12
|
inputData: l,
|
|
13
13
|
inputHandlersProps: s,
|
|
14
|
-
|
|
15
|
-
filteredFields: d,
|
|
14
|
+
filteredFields: a,
|
|
16
15
|
selectedFieldIndex: p,
|
|
17
|
-
setElementRef:
|
|
16
|
+
setElementRef: o,
|
|
18
17
|
isOpenPopoverMenuFields: e,
|
|
19
|
-
isOpenPopoverFilter:
|
|
20
|
-
handleTriggerClick:
|
|
21
|
-
} =
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
}, [
|
|
18
|
+
isOpenPopoverFilter: d,
|
|
19
|
+
handleTriggerClick: u
|
|
20
|
+
} = v(), t = x(null), { ownerState: f, size: m } = P();
|
|
21
|
+
return g(() => {
|
|
22
|
+
o(t);
|
|
23
|
+
}, [o, t]), /* @__PURE__ */ c(F, { children: [
|
|
25
24
|
/* @__PURE__ */ r(
|
|
26
25
|
S,
|
|
27
26
|
{
|
|
28
27
|
ref: t,
|
|
29
|
-
icon: /* @__PURE__ */ r(
|
|
28
|
+
icon: /* @__PURE__ */ r(I, {}),
|
|
30
29
|
variant: "outline",
|
|
31
30
|
color: e ? "info" : "default",
|
|
32
31
|
size: m,
|
|
33
32
|
"aria-label": "searchbox",
|
|
34
|
-
"aria-expanded": e ||
|
|
35
|
-
ownerState: { ...
|
|
36
|
-
onClick:
|
|
33
|
+
"aria-expanded": e || d,
|
|
34
|
+
ownerState: { ...f, selected: e },
|
|
35
|
+
onClick: u
|
|
37
36
|
}
|
|
38
37
|
),
|
|
39
38
|
/* @__PURE__ */ r(
|
|
40
39
|
h,
|
|
41
40
|
{
|
|
42
|
-
fields:
|
|
41
|
+
fields: a,
|
|
43
42
|
selectFieldIndex: p,
|
|
44
43
|
inputData: l,
|
|
45
|
-
inputPlaceHolder:
|
|
44
|
+
inputPlaceHolder: n,
|
|
46
45
|
inputHandlersProps: s,
|
|
47
|
-
isSkeleton:
|
|
46
|
+
isSkeleton: i
|
|
48
47
|
}
|
|
49
48
|
)
|
|
50
|
-
] })
|
|
49
|
+
] });
|
|
51
50
|
};
|
|
52
51
|
export {
|
|
53
|
-
|
|
52
|
+
B as default
|
|
54
53
|
};
|
|
@@ -33,10 +33,6 @@ declare function useInputFilter(): {
|
|
|
33
33
|
*/
|
|
34
34
|
onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
35
35
|
};
|
|
36
|
-
/**
|
|
37
|
-
* Si no hay campos disponibles y no se permite filtrar por todos, no se renderiza el inputFilter
|
|
38
|
-
*/
|
|
39
|
-
canRender: boolean;
|
|
40
36
|
/**
|
|
41
37
|
* Campos filtrados por el inputFilter
|
|
42
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/InputFilter/useInputFilter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAuB,MAAM,OAAO,CAAC;AAInG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C;;GAEG;AACH,iBAAS,cAAc;IAyHnB;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;QAlFH;;WAEG;0BACe,UAAU,CAAC,gBAAgB,CAAC;QAG9C;;WAEG;0BACe,WAAW,CAAC,gBAAgB,CAAC;QAO/C;;WAEG;2BACgB,aAAa,CAAC,gBAAgB,CAAC;;IAiElD;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;
|
|
1
|
+
{"version":3,"file":"useInputFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/InputFilter/useInputFilter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAuB,MAAM,OAAO,CAAC;AAInG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C;;GAEG;AACH,iBAAS,cAAc;IAyHnB;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;QAlFH;;WAEG;0BACe,UAAU,CAAC,gBAAgB,CAAC;QAG9C;;WAEG;0BACe,WAAW,CAAC,gBAAgB,CAAC;QAO/C;;WAEG;2BACgB,aAAa,CAAC,gBAAgB,CAAC;;IAiElD;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;EAGN;AACD,eAAe,cAAc,CAAC"}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
import { useModuleDictionary as M, useModuleSkeleton as S } from "@m4l/core";
|
|
2
|
-
import { useState as
|
|
2
|
+
import { useState as F, useEffect as C } from "react";
|
|
3
3
|
import { ALL_FIELD as E } from "../../constants.js";
|
|
4
4
|
import { DICCTIONARY as O } from "../../dictionary.js";
|
|
5
|
-
import { useDynamicFilterStore as
|
|
6
|
-
function
|
|
7
|
-
const [t, d] =
|
|
5
|
+
import { useDynamicFilterStore as l } from "../../store/useDynamicFilterStore.js";
|
|
6
|
+
function H() {
|
|
7
|
+
const [t, d] = F(-1), [i, f] = F([]), { getLabel: a } = M(), m = S(), n = l((e) => e.isOpenPopoverMenuFields), g = l((e) => !!e.popoverFilterData), h = l((e) => e.withAllField), u = l((e) => e.availableFields), r = l((e) => e.inputData), {
|
|
8
8
|
addFilter: I,
|
|
9
9
|
closePopoverMenuFields: s,
|
|
10
10
|
getFieldByName: w,
|
|
11
11
|
getNewId: y,
|
|
12
12
|
hidePopoverFilter: D,
|
|
13
|
-
openPopoverMenuFields:
|
|
14
|
-
setInputData:
|
|
13
|
+
openPopoverMenuFields: p,
|
|
14
|
+
setInputData: c,
|
|
15
15
|
showPopoverFilterForAdd: P,
|
|
16
16
|
setElementRef: v
|
|
17
|
-
} =
|
|
17
|
+
} = l((e) => e.actions);
|
|
18
18
|
C(() => {
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
n ? (f(
|
|
20
|
+
u.filter(
|
|
21
21
|
(e) => (e.label ?? a(e.dictionaryId)).includes(r)
|
|
22
22
|
)
|
|
23
23
|
), d(-1)) : f([]);
|
|
24
|
-
}, [
|
|
24
|
+
}, [n, r, u, a]);
|
|
25
25
|
function k(e) {
|
|
26
26
|
s(), P(e);
|
|
27
27
|
}
|
|
28
28
|
function A() {
|
|
29
|
-
|
|
29
|
+
n ? s() : p();
|
|
30
30
|
}
|
|
31
31
|
const x = {
|
|
32
32
|
/**
|
|
33
33
|
* Evento de foco del inputFilter
|
|
34
34
|
*/
|
|
35
35
|
onFocus: (e) => {
|
|
36
|
-
|
|
36
|
+
p();
|
|
37
37
|
},
|
|
38
38
|
/**
|
|
39
39
|
* Evento de cambio del inputFilter
|
|
40
40
|
*/
|
|
41
41
|
onChange: (e) => {
|
|
42
|
-
|
|
42
|
+
c(e.target.value), n || p(), D(!0);
|
|
43
43
|
},
|
|
44
44
|
/**
|
|
45
45
|
* Evento de teclado del inputFilter
|
|
46
46
|
*/
|
|
47
47
|
onKeyDown: (e) => {
|
|
48
48
|
if (e.key === "ArrowDown") {
|
|
49
|
-
let
|
|
50
|
-
i.length > 0 && (t < i.length - 1 ?
|
|
49
|
+
let o = -1;
|
|
50
|
+
i.length > 0 && (t < i.length - 1 ? o = t + 1 : o = i.length - 1), d(o);
|
|
51
51
|
}
|
|
52
52
|
if (e.key === "ArrowUp") {
|
|
53
|
-
let
|
|
54
|
-
i.length > 0 && t > -1 && (
|
|
53
|
+
let o = -1;
|
|
54
|
+
i.length > 0 && t > -1 && (o = t - 1), d(o);
|
|
55
55
|
}
|
|
56
56
|
if (e.key === "Escape" && s(), e.key === "Enter")
|
|
57
57
|
if (t === -1) {
|
|
@@ -59,7 +59,7 @@ function _() {
|
|
|
59
59
|
s();
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
h && (I({
|
|
63
63
|
id: y(),
|
|
64
64
|
fieldType: "string",
|
|
65
65
|
field: w(E.name),
|
|
@@ -67,7 +67,7 @@ function _() {
|
|
|
67
67
|
fixed: !1,
|
|
68
68
|
operator: "c",
|
|
69
69
|
operand1: r
|
|
70
|
-
}),
|
|
70
|
+
}), c(""), s());
|
|
71
71
|
} else
|
|
72
72
|
k(i[t]);
|
|
73
73
|
}
|
|
@@ -76,7 +76,7 @@ function _() {
|
|
|
76
76
|
/**
|
|
77
77
|
* Si es esqueleto mostrar la versión de esqueleton
|
|
78
78
|
*/
|
|
79
|
-
isSkeleton:
|
|
79
|
+
isSkeleton: m,
|
|
80
80
|
/**
|
|
81
81
|
* Texto de placeholder del inputFilter
|
|
82
82
|
*/
|
|
@@ -89,10 +89,6 @@ function _() {
|
|
|
89
89
|
* Props para el handler de eventos del inputFilter
|
|
90
90
|
*/
|
|
91
91
|
inputHandlersProps: x,
|
|
92
|
-
/**
|
|
93
|
-
* Si no hay campos disponibles y no se permite filtrar por todos, no se renderiza el inputFilter
|
|
94
|
-
*/
|
|
95
|
-
canRender: !(!u && p.length === 0),
|
|
96
92
|
/**
|
|
97
93
|
* Campos filtrados por el inputFilter
|
|
98
94
|
*/
|
|
@@ -108,11 +104,11 @@ function _() {
|
|
|
108
104
|
/**
|
|
109
105
|
* Indica si el menú de campos está abierto
|
|
110
106
|
*/
|
|
111
|
-
isOpenPopoverMenuFields:
|
|
107
|
+
isOpenPopoverMenuFields: n,
|
|
112
108
|
/**
|
|
113
109
|
* Indica si el popoverSort está abierto
|
|
114
110
|
*/
|
|
115
|
-
isOpenPopoverFilter:
|
|
111
|
+
isOpenPopoverFilter: g,
|
|
116
112
|
/**
|
|
117
113
|
* Handler del click en el IconButton trigger (abre/cierra el popover)
|
|
118
114
|
*/
|
|
@@ -120,5 +116,5 @@ function _() {
|
|
|
120
116
|
};
|
|
121
117
|
}
|
|
122
118
|
export {
|
|
123
|
-
|
|
119
|
+
H as default
|
|
124
120
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePopoverFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/PopoverFilter/usePopoverFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"usePopoverFilter.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/components/src/components/DynamicFilter/subcomponents/PopoverFilter/usePopoverFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA2C,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAgC,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExF;;GAEG;AACH,iBAAS,gBAAgB;;;;;iCA2DyB,aAAa,CAAC,cAAc,CAAC;;gCAWpC,WAAW;;;;;;EA+BrD;AACD,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { useModuleDictionary as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import { shallow as
|
|
4
|
-
import { useDynamicFilterStore as
|
|
5
|
-
import { fieldFactory as
|
|
1
|
+
import { useModuleDictionary as R, useUserPreferences as C } from "@m4l/core";
|
|
2
|
+
import { useRef as E, useMemo as k, useCallback as y } from "react";
|
|
3
|
+
import { shallow as x } from "zustand/shallow";
|
|
4
|
+
import { useDynamicFilterStore as d } from "../../store/useDynamicFilterStore.js";
|
|
5
|
+
import { fieldFactory as u } from "../FieldTypes/fieldFactory.js";
|
|
6
6
|
function _() {
|
|
7
7
|
let a, t, l, r, s;
|
|
8
|
-
const { getLabel: i } =
|
|
8
|
+
const { getLabel: i } = R(), c = C().timeZone?.name, o = d((e) => e.popoverFilterData), p = d((e) => e.actions.getElementRef(), x), { hidePopoverFilter: n, addFilter: h, updateFilter: g, getNewId: S } = d(
|
|
9
9
|
(e) => e.actions
|
|
10
|
-
),
|
|
10
|
+
), m = E(o), P = k(() => {
|
|
11
11
|
let e;
|
|
12
|
-
return o &&
|
|
12
|
+
return o && m.current === void 0 ? e = "ready" : o ? e = "reload_values_provider" : e = "initial", m.current = o, e;
|
|
13
13
|
}, [o]);
|
|
14
14
|
if (o?.openFor === "add") {
|
|
15
|
-
a =
|
|
16
|
-
const e =
|
|
17
|
-
s = e.getSchema(i, t), r = e.getFormValue(t, i), l = {
|
|
15
|
+
a = p?.current, t = o.field;
|
|
16
|
+
const e = u(t.type);
|
|
17
|
+
s = e.getSchema(i, t), r = e.getFormValue(t, i, void 0, c), l = {
|
|
18
18
|
field: t,
|
|
19
|
-
id:
|
|
19
|
+
id: S(),
|
|
20
20
|
isSet: !0,
|
|
21
21
|
fixed: !1,
|
|
22
22
|
...r
|
|
23
23
|
};
|
|
24
24
|
} else if (o) {
|
|
25
|
-
a =
|
|
26
|
-
const e =
|
|
27
|
-
s = e.getSchema(i, t), r = e.getFormValue(t, i, o.filter), l = { ...o?.filter, ...r };
|
|
25
|
+
a = p?.current, t = o?.filter.field;
|
|
26
|
+
const e = u(t.type);
|
|
27
|
+
s = e.getSchema(i, t), r = e.getFormValue(t, i, o.filter, c), l = { ...o?.filter, ...r };
|
|
28
28
|
} else
|
|
29
29
|
r = {}, t = {}, l = {}, a = {};
|
|
30
30
|
const f = y(() => {
|
|
@@ -32,32 +32,32 @@ function _() {
|
|
|
32
32
|
}, [n]), D = y((e) => {
|
|
33
33
|
e.key === "Escape" && f();
|
|
34
34
|
}, [f]);
|
|
35
|
-
function
|
|
35
|
+
function b() {
|
|
36
36
|
n(!1);
|
|
37
37
|
}
|
|
38
|
-
async function
|
|
39
|
-
const
|
|
38
|
+
async function V(e) {
|
|
39
|
+
const F = { ...r, ...e }, v = {
|
|
40
40
|
...l,
|
|
41
41
|
// todo: mejorar el tipado que se le envía a getFilterFromFormValue
|
|
42
|
-
...
|
|
42
|
+
...u(F.fieldType).getFilterFromFormValue(F, c),
|
|
43
43
|
isSet: !0
|
|
44
44
|
};
|
|
45
|
-
o?.openFor === "add" ? h(
|
|
45
|
+
o?.openFor === "add" ? h(v) : g(v), n(!1);
|
|
46
46
|
}
|
|
47
|
-
const
|
|
47
|
+
const w = t?.label ?? i(t?.dictionaryId ?? "");
|
|
48
48
|
return {
|
|
49
49
|
field: t,
|
|
50
|
-
labelField:
|
|
50
|
+
labelField: w,
|
|
51
51
|
canRender: !!o,
|
|
52
52
|
anchorEl: a,
|
|
53
53
|
handleKeyDownPopper: D,
|
|
54
|
-
handleClosePopover:
|
|
55
|
-
onSubmit:
|
|
54
|
+
handleClosePopover: b,
|
|
55
|
+
onSubmit: V,
|
|
56
56
|
onClose: f,
|
|
57
57
|
filterFormValue: r,
|
|
58
58
|
formFilter: l,
|
|
59
59
|
popupValidationSchema: s,
|
|
60
|
-
statusLoad:
|
|
60
|
+
statusLoad: P
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m4l/components",
|
|
3
|
-
"version": "9.43.
|
|
3
|
+
"version": "9.43.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -52,24 +52,24 @@
|
|
|
52
52
|
"@hookform/resolvers": "2.9.11",
|
|
53
53
|
"nprogress": "0.2.0",
|
|
54
54
|
"react-transition-group": "4.4.5",
|
|
55
|
+
"react-color": "2.19.3",
|
|
55
56
|
"react-rnd": "10.5.2",
|
|
56
|
-
"react-draggable": "4.5.0",
|
|
57
57
|
"react-spinners": "0.13.8",
|
|
58
|
-
"react-color": "2.19.3",
|
|
59
|
-
"react-dropzone": "14.4.1",
|
|
60
58
|
"@mui/x-date-pickers": "6.20.2",
|
|
61
|
-
"
|
|
62
|
-
"react-
|
|
63
|
-
"react-simple-code-editor": "0.14.1",
|
|
59
|
+
"react-draggable": "4.5.0",
|
|
60
|
+
"react-dropzone": "14.4.1",
|
|
64
61
|
"chart.js": "4.5.1",
|
|
65
62
|
"chartjs-chart-error-bars": "4.4.5",
|
|
66
63
|
"qrcode.react": "3.2.0",
|
|
64
|
+
"react-simple-code-editor": "0.14.1",
|
|
65
|
+
"simplebar-react": "3.2.6",
|
|
67
66
|
"react-data-grid": "7.0.0-beta.47",
|
|
68
67
|
"react-dnd": "16.0.1",
|
|
69
68
|
"react-dnd-html5-backend": "16.0.1",
|
|
69
|
+
"react-resizable-panels": "2.1.9",
|
|
70
|
+
"date-fns": "2.30.0",
|
|
70
71
|
"react-resizable": "3.1.3",
|
|
71
72
|
"react-window": "1.8.11",
|
|
72
|
-
"date-fns": "2.30.0",
|
|
73
73
|
"@tanstack/react-virtual": "3.13.23"
|
|
74
74
|
}
|
|
75
75
|
}
|