@ryuzaki13/react-foundation-ui 3.4.3 → 3.5.0
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/badge/index.js +65 -2
- package/dist/badge/index.js.map +1 -0
- package/dist/barcode-scanner/index.js +18 -18
- package/dist/base-table/index.js +2 -2
- package/dist/button/index.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/chunks/{CalendarView-Dm55k0bN.js → CalendarView-CwbPJG2Y.js} +86 -86
- package/dist/chunks/{CalendarView-Dm55k0bN.js.map → CalendarView-CwbPJG2Y.js.map} +1 -1
- package/dist/chunks/{ImageViewerRuntime-HGBWp9NM.js → ImageViewerRuntime-DZpgxzF1.js} +25 -25
- package/dist/chunks/{ImageViewerRuntime-HGBWp9NM.js.map → ImageViewerRuntime-DZpgxzF1.js.map} +1 -1
- package/dist/chunks/{TextEditorLexicalClient-C8nSoz85.js → TextEditorLexicalClient-BRp8jHId.js} +354 -354
- package/dist/chunks/{TextEditorLexicalClient-C8nSoz85.js.map → TextEditorLexicalClient-BRp8jHId.js.map} +1 -1
- package/dist/chunks/{base-table-BWvKfI2W.js → base-table-BHmboNzl.js} +138 -138
- package/dist/chunks/{base-table-BWvKfI2W.js.map → base-table-BHmboNzl.js.map} +1 -1
- package/dist/chunks/{button-DF21yxVp.js → button-D7GAU2Wa.js} +20 -20
- package/dist/chunks/{button-DF21yxVp.js.map → button-D7GAU2Wa.js.map} +1 -1
- package/dist/chunks/{check-box-CZyhzmR0.js → check-box-D_Y6iIWv.js} +19 -19
- package/dist/chunks/{check-box-CZyhzmR0.js.map → check-box-D_Y6iIWv.js.map} +1 -1
- package/dist/chunks/{context-menu-DgvXGCuI.js → context-menu-BQePxRpu.js} +159 -159
- package/dist/chunks/{context-menu-DgvXGCuI.js.map → context-menu-BQePxRpu.js.map} +1 -1
- package/dist/chunks/{date-input-D7aBsPJc.js → date-input-Crijdmmq.js} +67 -67
- package/dist/chunks/{date-input-D7aBsPJc.js.map → date-input-Crijdmmq.js.map} +1 -1
- package/dist/chunks/{date-range-preset-select-BLnY47cv.js → date-range-preset-select-CyzGMvVp.js} +6 -6
- package/dist/chunks/{date-range-preset-select-BLnY47cv.js.map → date-range-preset-select-CyzGMvVp.js.map} +1 -1
- package/dist/chunks/{dialog-1Z1zCNCe.js → dialog-BcQGVNbu.js} +13 -13
- package/dist/chunks/{dialog-1Z1zCNCe.js.map → dialog-BcQGVNbu.js.map} +1 -1
- package/dist/chunks/{flex-C7njxZ74.js → flex-DtXK7OM4.js} +29 -29
- package/dist/chunks/{flex-C7njxZ74.js.map → flex-DtXK7OM4.js.map} +1 -1
- package/dist/chunks/{floating-arrow-DPKwJfww.js → floating-arrow-DKUKx2ZQ.js} +7 -7
- package/dist/chunks/{floating-arrow-DPKwJfww.js.map → floating-arrow-DKUKx2ZQ.js.map} +1 -1
- package/dist/chunks/{input-DSPKgiCK.js → input-CuRK9Vbz.js} +78 -78
- package/dist/chunks/{input-DSPKgiCK.js.map → input-CuRK9Vbz.js.map} +1 -1
- package/dist/chunks/{input-files-tIS17-zX.js → input-files-B8j6Pb_M.js} +31 -31
- package/dist/chunks/{input-files-tIS17-zX.js.map → input-files-B8j6Pb_M.js.map} +1 -1
- package/dist/chunks/{misc-DeGboAt-.js → misc-CGQOXXCy.js} +110 -110
- package/dist/chunks/{misc-DeGboAt-.js.map → misc-CGQOXXCy.js.map} +1 -1
- package/dist/chunks/{modal-dplfAaER.js → modal-febBsMyR.js} +58 -58
- package/dist/chunks/{modal-dplfAaER.js.map → modal-febBsMyR.js.map} +1 -1
- package/dist/chunks/{picker-lvm82d0A.js → picker-BA6okKnz.js} +91 -91
- package/dist/chunks/{picker-lvm82d0A.js.map → picker-BA6okKnz.js.map} +1 -1
- package/dist/chunks/popover-yl5DVe06.js +245 -0
- package/dist/chunks/{popover-Bne-Ljbs.js.map → popover-yl5DVe06.js.map} +1 -1
- package/dist/chunks/radio-group-CW-K1n9c.js +125 -0
- package/dist/chunks/{radio-group-sSnlYjAX.js.map → radio-group-CW-K1n9c.js.map} +1 -1
- package/dist/chunks/select-DblNSc5H.js +363 -0
- package/dist/chunks/{select-aTGupQan.js.map → select-DblNSc5H.js.map} +1 -1
- package/dist/chunks/{separator-B72Aq-6a.js → separator-CIqnk2z9.js} +2 -2
- package/dist/chunks/{separator-B72Aq-6a.js.map → separator-CIqnk2z9.js.map} +1 -1
- package/dist/chunks/{sortable-BKIwlqhI.js → sortable-CQmMHAF8.js} +38 -38
- package/dist/chunks/{sortable-BKIwlqhI.js.map → sortable-CQmMHAF8.js.map} +1 -1
- package/dist/chunks/{table-DxoSOvQK.js → table-BnvjPaE1.js} +18 -18
- package/dist/chunks/{table-DxoSOvQK.js.map → table-BnvjPaE1.js.map} +1 -1
- package/dist/chunks/{table-column-interactions-DzEvVuXe.js → table-column-interactions-Do8LFtiv.js} +20 -20
- package/dist/chunks/{table-column-interactions-DzEvVuXe.js.map → table-column-interactions-Do8LFtiv.js.map} +1 -1
- package/dist/chunks/{types-D9Wj9wrg.js → types-CxXyru6U.js} +21 -21
- package/dist/chunks/{types-D9Wj9wrg.js.map → types-CxXyru6U.js.map} +1 -1
- package/dist/chunks/{useODataSelectBase-DR4PrY1j.js → useODataSelectBase-DwR4Lfv-.js} +5 -5
- package/dist/chunks/{useODataSelectBase-DR4PrY1j.js.map → useODataSelectBase-DwR4Lfv-.js.map} +1 -1
- package/dist/chunks/{wheel-picker-FS58cRsQ.js → wheel-picker-DUHGy7wE.js} +23 -23
- package/dist/chunks/{wheel-picker-FS58cRsQ.js.map → wheel-picker-DUHGy7wE.js.map} +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-range-preset-select/index.js +1 -1
- package/dist/date-time-input/index.js +122 -122
- package/dist/date-time-input/index.js.map +1 -1
- package/dist/detail/index.js +22 -22
- package/dist/dialog/index.js +1 -1
- package/dist/disclosure/index.js +9 -9
- package/dist/drop-zone/index.js +21 -21
- package/dist/errors/index.js +50 -50
- package/dist/expandable-action-panel/index.js +24 -24
- package/dist/flex/index.js +1 -1
- package/dist/flex/useFlexClasses.d.ts +1 -1
- package/dist/floating-arrow/index.js +1 -1
- package/dist/fullscreen-portal/index.js +8 -8
- package/dist/image/index.js +119 -119
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +55 -55
- package/dist/input-file/index.js +16 -16
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +17 -17
- package/dist/input-search/index.js +30 -2
- package/dist/input-search/index.js.map +1 -0
- package/dist/layout-picker/index.js +93 -93
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/list/index.js +39 -39
- package/dist/listbox/index.js +33 -33
- package/dist/misc/index.js +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +466 -2
- package/dist/multi-select/index.js.map +1 -0
- package/dist/notifications/index.js +45 -45
- package/dist/option/index.js +30 -30
- package/dist/period-select/index.js +7 -7
- package/dist/picker/index.js +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/preset-range-date-input/index.js +10 -10
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js +9 -9
- package/dist/radio-group/index.js +1 -1
- package/dist/select/index.js +1 -1
- package/dist/separator/index.js +1 -1
- package/dist/simple-table/index.js +5 -5
- package/dist/slider/index.js +82 -82
- package/dist/slider/index.js.map +1 -1
- package/dist/sortable/index.js +1 -1
- package/dist/splitter/index.js +55 -55
- package/dist/state-select/index.js +17 -17
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +18 -18
- package/dist/table/index.js +1 -1
- package/dist/table-column-interactions/index.js +1 -1
- package/dist/table-editor/index.js +99 -99
- package/dist/table-sorting/index.js +13 -13
- package/dist/tabs/index.js +83 -83
- package/dist/tag-input/index.js +58 -58
- package/dist/tag-input/index.js.map +1 -1
- package/dist/text/index.js +18 -18
- package/dist/text-editor/index.js +3 -3
- package/dist/textarea/index.js +1 -1
- package/dist/three-scene/index.js +7 -7
- package/dist/toggle/index.js +20 -20
- package/dist/toolbar/index.js +16 -16
- package/dist/tree/index.js +24 -24
- package/dist/tree-select/index.js +189 -189
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +33 -33
- package/dist/tree-table/index.js.map +1 -1
- package/dist/wheel-picker/index.js +1 -1
- package/package.json +1 -5
- package/storybook-static/project.json +1 -1
- package/dist/advanced-search/index.d.ts +0 -3
- package/dist/advanced-search/index.d.ts.map +0 -1
- package/dist/advanced-search/index.js +0 -399
- package/dist/advanced-search/index.js.map +0 -1
- package/dist/advanced-search/lib/index.d.ts +0 -2
- package/dist/advanced-search/lib/index.d.ts.map +0 -1
- package/dist/advanced-search/lib/searchParts.d.ts +0 -3
- package/dist/advanced-search/lib/searchParts.d.ts.map +0 -1
- package/dist/advanced-search/model/index.d.ts +0 -5
- package/dist/advanced-search/model/index.d.ts.map +0 -1
- package/dist/advanced-search/model/types.d.ts +0 -55
- package/dist/advanced-search/model/types.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearch.d.ts +0 -11
- package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +0 -6
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +0 -1
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +0 -13
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +0 -23
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchModalSession.d.ts +0 -16
- package/dist/advanced-search/ui/AdvancedSearchModalSession.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +0 -9
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +0 -1
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +0 -9
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +0 -1
- package/dist/advanced-search/ui/index.d.ts +0 -2
- package/dist/advanced-search/ui/index.d.ts.map +0 -1
- package/dist/chunks/badge-6mXO9BWP.js +0 -65
- package/dist/chunks/badge-6mXO9BWP.js.map +0 -1
- package/dist/chunks/input-search-Cat4c7SM.js +0 -30
- package/dist/chunks/input-search-Cat4c7SM.js.map +0 -1
- package/dist/chunks/multi-select-BZ9N6Dal.js +0 -466
- package/dist/chunks/multi-select-BZ9N6Dal.js.map +0 -1
- package/dist/chunks/popover-Bne-Ljbs.js +0 -245
- package/dist/chunks/radio-group-sSnlYjAX.js +0 -125
- package/dist/chunks/select-aTGupQan.js +0 -363
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
import { t as e } from "../chunks/ui.module-oRwY3Zli.js";
|
|
2
|
-
import { n as t } from "../chunks/button-DF21yxVp.js";
|
|
3
|
-
import { c as n, g as r, h as i } from "../chunks/misc-DeGboAt-.js";
|
|
4
|
-
import { o as a } from "../chunks/flex-C7njxZ74.js";
|
|
5
|
-
import { r as o } from "../chunks/grid-dI94AAbi.js";
|
|
6
|
-
import { a as s, i as c, n as l, r as u } from "../chunks/modal-dplfAaER.js";
|
|
7
|
-
import { n as d, t as f } from "../chunks/badge-6mXO9BWP.js";
|
|
8
|
-
import { d as p, f as m } from "../chunks/input-DSPKgiCK.js";
|
|
9
|
-
import { t as h } from "../chunks/input-search-Cat4c7SM.js";
|
|
10
|
-
import { n as g } from "../chunks/multi-select-BZ9N6Dal.js";
|
|
11
|
-
import { t as _ } from "../chunks/table-DxoSOvQK.js";
|
|
12
|
-
import { useCallback as v, useMemo as y, useState as b } from "react";
|
|
13
|
-
import { odataQueryFn as x, useODataTableColumns as S } from "@ryuzaki13/react-foundation-api/odata";
|
|
14
|
-
import { createFilterContains as C, createFilterEqual as w, unwrapODataQueryResult as T } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
15
|
-
import { useInfiniteQuery as E, useQuery as D } from "@tanstack/react-query";
|
|
16
|
-
import { cn as O, stableStringify as k } from "@ryuzaki13/react-foundation-lib/utils";
|
|
17
|
-
import { Fragment as A, jsx as j, jsxs as M } from "react/jsx-runtime";
|
|
18
|
-
import { ChevronRightIcon as N, XIcon as P } from "lucide-react";
|
|
19
|
-
//#region src/advanced-search/lib/searchParts.ts
|
|
20
|
-
function F(e) {
|
|
21
|
-
let t = e.trim();
|
|
22
|
-
return t ? t.split("*").map((e) => e.trim()).filter((e) => e.length) : [];
|
|
23
|
-
}
|
|
24
|
-
function I(e, t, n) {
|
|
25
|
-
let r = t.map((e) => e.toLowerCase());
|
|
26
|
-
return e.filter((e) => {
|
|
27
|
-
for (let t of n) {
|
|
28
|
-
let n = String(e[t] || "").toLowerCase(), i = 0, a = !0;
|
|
29
|
-
for (let e of r) {
|
|
30
|
-
let t = n.indexOf(e, i);
|
|
31
|
-
if (t === -1) {
|
|
32
|
-
a = !1;
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
i = t + e.length;
|
|
36
|
-
}
|
|
37
|
-
if (a) return !0;
|
|
38
|
-
}
|
|
39
|
-
return !1;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
//#endregion
|
|
43
|
-
//#region src/advanced-search/model/useAdvancedSearch.ts
|
|
44
|
-
var L = 50;
|
|
45
|
-
function R(e) {
|
|
46
|
-
let [t, n] = b(""), [r, i] = b(() => Object.keys(e.segments ?? {}).reduce((e, t) => (e[t] = [], e), {})), a = F(t), o = a.length > 1, s = o ? 5e3 : L, c = E({
|
|
47
|
-
queryKey: [
|
|
48
|
-
"search",
|
|
49
|
-
e.odata.service,
|
|
50
|
-
e.odata.target,
|
|
51
|
-
r,
|
|
52
|
-
t
|
|
53
|
-
],
|
|
54
|
-
queryFn: async ({ pageParam: t = 0, signal: n, client: i }) => {
|
|
55
|
-
let c = e.columns.map((e) => e.key), l = await x({
|
|
56
|
-
odata: {
|
|
57
|
-
service: e.odata.service,
|
|
58
|
-
target: e.odata.target
|
|
59
|
-
},
|
|
60
|
-
options: {
|
|
61
|
-
top: s,
|
|
62
|
-
skip: t,
|
|
63
|
-
select: c,
|
|
64
|
-
expression: {
|
|
65
|
-
and: !0,
|
|
66
|
-
filters: [{ filters: a ? e.searchKeys.map((e) => ({ filters: a.map((t) => C(e, t)) })) : [] }, {
|
|
67
|
-
and: !0,
|
|
68
|
-
filters: Object.keys(r).map((e) => w(e, r[e]))
|
|
69
|
-
}]
|
|
70
|
-
},
|
|
71
|
-
sorts: [{ key: e.leadingKey }]
|
|
72
|
-
}
|
|
73
|
-
})({
|
|
74
|
-
signal: n,
|
|
75
|
-
client: i
|
|
76
|
-
});
|
|
77
|
-
return o ? I(l.data, a, e.searchKeys) : l.data;
|
|
78
|
-
},
|
|
79
|
-
getNextPageParam: (e, t) => {
|
|
80
|
-
if (!(e.length < s)) return t.length * s;
|
|
81
|
-
},
|
|
82
|
-
initialPageParam: 0
|
|
83
|
-
}), l = v((e) => {
|
|
84
|
-
n(e);
|
|
85
|
-
}, []), u = v(() => {
|
|
86
|
-
n("");
|
|
87
|
-
}, []);
|
|
88
|
-
return {
|
|
89
|
-
query: c,
|
|
90
|
-
items: y(() => c.data?.pages.flatMap((e) => e) ?? [], [c.data?.pages]),
|
|
91
|
-
searchTerm: t,
|
|
92
|
-
setSearch: l,
|
|
93
|
-
clearSearch: u,
|
|
94
|
-
filters: r,
|
|
95
|
-
setFilters: i
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
//#endregion
|
|
99
|
-
//#region src/advanced-search/model/useAdvancedSearchInitialSelected.ts
|
|
100
|
-
function z(e, t = []) {
|
|
101
|
-
let n = D({
|
|
102
|
-
queryKey: [
|
|
103
|
-
"searchSelected",
|
|
104
|
-
e.odata.service,
|
|
105
|
-
e.odata.target,
|
|
106
|
-
t
|
|
107
|
-
],
|
|
108
|
-
queryFn: async ({ client: n, signal: r }) => {
|
|
109
|
-
if (t.length === 0) return {
|
|
110
|
-
data: [],
|
|
111
|
-
totalCount: void 0
|
|
112
|
-
};
|
|
113
|
-
let i = e.columns.map((e) => e.key);
|
|
114
|
-
return await x({
|
|
115
|
-
odata: {
|
|
116
|
-
service: e.odata.service,
|
|
117
|
-
target: e.odata.target
|
|
118
|
-
},
|
|
119
|
-
options: {
|
|
120
|
-
select: i,
|
|
121
|
-
expression: { filters: t.map((t) => w(e.leadingKey, t)) }
|
|
122
|
-
}
|
|
123
|
-
})({
|
|
124
|
-
client: n,
|
|
125
|
-
signal: r
|
|
126
|
-
});
|
|
127
|
-
},
|
|
128
|
-
enabled: t.length > 0
|
|
129
|
-
});
|
|
130
|
-
return T(n);
|
|
131
|
-
}
|
|
132
|
-
//#endregion
|
|
133
|
-
//#region src/advanced-search/model/useAdvancedSearchSelection.ts
|
|
134
|
-
function B(e, t) {
|
|
135
|
-
let n = /* @__PURE__ */ new Map();
|
|
136
|
-
for (let r of e) n.set(String(r[t]), r);
|
|
137
|
-
return Array.from(n.values());
|
|
138
|
-
}
|
|
139
|
-
function V(e, t = []) {
|
|
140
|
-
let [n, r] = b(() => B(t, e.leadingKey)), i = v((t, n) => {
|
|
141
|
-
if (t.length !== n.length) return !1;
|
|
142
|
-
let r = new Set(n.map((t) => String(t[e.leadingKey])));
|
|
143
|
-
return t.every((t) => r.has(String(t[e.leadingKey])));
|
|
144
|
-
}, [e.leadingKey]), a = v((t) => {
|
|
145
|
-
r((n) => {
|
|
146
|
-
let r = B(t, e.leadingKey);
|
|
147
|
-
return i(n, r) ? n : r;
|
|
148
|
-
});
|
|
149
|
-
}, [i, e.leadingKey]);
|
|
150
|
-
return {
|
|
151
|
-
selectedItems: n,
|
|
152
|
-
select: v((t) => {
|
|
153
|
-
r((n) => n.some((n) => n[e.leadingKey] === t[e.leadingKey]) ? n : [...n, t]);
|
|
154
|
-
}, [e.leadingKey]),
|
|
155
|
-
deselect: v((t) => {
|
|
156
|
-
r((n) => n.filter((n) => n[e.leadingKey] !== t));
|
|
157
|
-
}, [e.leadingKey]),
|
|
158
|
-
replaceSelection: a,
|
|
159
|
-
clearSelection: v(() => {
|
|
160
|
-
r([]);
|
|
161
|
-
}, []),
|
|
162
|
-
isSelected: v((t) => n.some((n) => n[e.leadingKey] === t), [e.leadingKey, n])
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
//#endregion
|
|
166
|
-
//#region src/advanced-search/ui/AdvancedSearchModalSession.tsx
|
|
167
|
-
function H({ onClose: e, onItemsSelect: r, title: i, config: p, initialSelectedItems: m }) {
|
|
168
|
-
let b = y(() => p.columns.map((e) => ({
|
|
169
|
-
id: e.key,
|
|
170
|
-
accessorKey: e.key,
|
|
171
|
-
header: e.label,
|
|
172
|
-
meta: { width: e.width || "auto" }
|
|
173
|
-
})), [p.columns]), { columns: x, isLoading: C } = S({
|
|
174
|
-
service: p.odata.service,
|
|
175
|
-
target: p.odata.target,
|
|
176
|
-
mode: "enrich",
|
|
177
|
-
columns: b
|
|
178
|
-
}), { query: w, items: T, searchTerm: E, setSearch: D, clearSearch: O, filters: k, setFilters: A } = R(p), { selectedItems: N, deselect: P, replaceSelection: F } = V(p, m), I = v((e) => String(e[p.leadingKey]), [p.leadingKey]), L = y(() => N.map((e) => String(e[p.leadingKey])), [N, p.leadingKey]), z = y(() => new Set(T.map((e) => String(e[p.leadingKey]))), [T, p.leadingKey]), B = v(() => {
|
|
179
|
-
w.hasNextPage && !w.isFetchingNextPage && w.fetchNextPage();
|
|
180
|
-
}, [w]), H = v((e) => {
|
|
181
|
-
let t = new Set(e.map((e) => String(e[p.leadingKey]))), n = N.filter((e) => !z.has(String(e[p.leadingKey]))), r = T.filter((e) => t.has(String(e[p.leadingKey])));
|
|
182
|
-
F([...n, ...r]);
|
|
183
|
-
}, [
|
|
184
|
-
p.leadingKey,
|
|
185
|
-
T,
|
|
186
|
-
F,
|
|
187
|
-
N,
|
|
188
|
-
z
|
|
189
|
-
]), U = v((e) => {
|
|
190
|
-
P(String(e[p.leadingKey]));
|
|
191
|
-
}, [p.leadingKey, P]), W = v(() => {
|
|
192
|
-
r(N), e();
|
|
193
|
-
}, [
|
|
194
|
-
N,
|
|
195
|
-
r,
|
|
196
|
-
e
|
|
197
|
-
]), G = y(() => {
|
|
198
|
-
if ("segments" in p && p.segments) {
|
|
199
|
-
let e = Object.keys(p.segments);
|
|
200
|
-
if (e.length) return {
|
|
201
|
-
odata: {
|
|
202
|
-
...p.odata,
|
|
203
|
-
limitedKeys: e
|
|
204
|
-
},
|
|
205
|
-
segments: p.segments,
|
|
206
|
-
model: p.model
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
}, [p]);
|
|
210
|
-
return /* @__PURE__ */ M(l, {
|
|
211
|
-
isOpen: !0,
|
|
212
|
-
onClose: e,
|
|
213
|
-
title: i || p.title,
|
|
214
|
-
size: "lg",
|
|
215
|
-
height: "min(50em, 80dvh)",
|
|
216
|
-
children: [
|
|
217
|
-
/* @__PURE__ */ j(s, { children: /* @__PURE__ */ M(a, {
|
|
218
|
-
gap: "sm",
|
|
219
|
-
children: [G && /* @__PURE__ */ j(g, {
|
|
220
|
-
odata: G.odata,
|
|
221
|
-
segments: G.segments,
|
|
222
|
-
model: G.model,
|
|
223
|
-
values: k,
|
|
224
|
-
onChange: A
|
|
225
|
-
}), /* @__PURE__ */ j(h, {
|
|
226
|
-
size: "md",
|
|
227
|
-
placeholder: p.searchLabel ?? "Введите поисковый запрос",
|
|
228
|
-
value: E,
|
|
229
|
-
onChange: D,
|
|
230
|
-
onClear: O,
|
|
231
|
-
className: "flexGrow"
|
|
232
|
-
})]
|
|
233
|
-
}) }),
|
|
234
|
-
/* @__PURE__ */ j(u, { children: /* @__PURE__ */ M(o, {
|
|
235
|
-
gap: "md",
|
|
236
|
-
templateRows: "1fr auto",
|
|
237
|
-
className: "h100",
|
|
238
|
-
children: [/* @__PURE__ */ j(_, {
|
|
239
|
-
columns: x,
|
|
240
|
-
data: T,
|
|
241
|
-
selectionMode: "multi",
|
|
242
|
-
selectedRowIds: L,
|
|
243
|
-
getRowId: I,
|
|
244
|
-
isLoading: w.isLoading || C,
|
|
245
|
-
isFetching: w.isFetching,
|
|
246
|
-
onRowSelectionChange: H,
|
|
247
|
-
onReachEnd: B,
|
|
248
|
-
className: "w100"
|
|
249
|
-
}), /* @__PURE__ */ j("div", {
|
|
250
|
-
className: "marginBlockMd border",
|
|
251
|
-
children: /* @__PURE__ */ j(n, {
|
|
252
|
-
className: "paddingSm",
|
|
253
|
-
height: "6em",
|
|
254
|
-
children: /* @__PURE__ */ j(f, { children: N.map((e) => /* @__PURE__ */ j(d, {
|
|
255
|
-
size: "md",
|
|
256
|
-
tone: "info",
|
|
257
|
-
appearance: "outline",
|
|
258
|
-
onRemove: () => U(e),
|
|
259
|
-
children: p.leadingText && e[p.leadingText] || e[p.leadingKey]
|
|
260
|
-
}, e[p.leadingKey])) })
|
|
261
|
-
})
|
|
262
|
-
})]
|
|
263
|
-
}) }),
|
|
264
|
-
/* @__PURE__ */ M(c, { children: [/* @__PURE__ */ j(t, {
|
|
265
|
-
onClick: e,
|
|
266
|
-
children: "Отмена"
|
|
267
|
-
}), /* @__PURE__ */ j(t, {
|
|
268
|
-
variant: "successOutline",
|
|
269
|
-
onClick: W,
|
|
270
|
-
children: "Выбрать"
|
|
271
|
-
})] })
|
|
272
|
-
]
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
//#endregion
|
|
276
|
-
//#region src/advanced-search/ui/AdvancedSearchModal.tsx
|
|
277
|
-
function U(e, t) {
|
|
278
|
-
return k({
|
|
279
|
-
leadingKey: String(e.leadingKey),
|
|
280
|
-
service: e.odata.service,
|
|
281
|
-
target: e.odata.target,
|
|
282
|
-
selectedIds: t.map((t) => String(t[e.leadingKey])).sort()
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
function W({ onClose: e, onItemsSelect: n, initialSelection: a, title: o, config: s }) {
|
|
286
|
-
return a.status === "ready" ? /* @__PURE__ */ j(H, {
|
|
287
|
-
title: o,
|
|
288
|
-
config: s,
|
|
289
|
-
onClose: e,
|
|
290
|
-
onItemsSelect: n,
|
|
291
|
-
initialSelectedItems: a.items
|
|
292
|
-
}, U(s, a.items)) : /* @__PURE__ */ M(l, {
|
|
293
|
-
isOpen: !0,
|
|
294
|
-
onClose: e,
|
|
295
|
-
title: o || s.title,
|
|
296
|
-
size: "lg",
|
|
297
|
-
height: "min(50em, 80dvh)",
|
|
298
|
-
children: [/* @__PURE__ */ j(u, { children: a.status === "loading" ? /* @__PURE__ */ j(i, { text: "Загружаем выбранные элементы..." }) : /* @__PURE__ */ j(r, {
|
|
299
|
-
color: "error",
|
|
300
|
-
children: "Не удалось загрузить выбранные элементы"
|
|
301
|
-
}) }), /* @__PURE__ */ j(c, { children: /* @__PURE__ */ j(t, {
|
|
302
|
-
onClick: e,
|
|
303
|
-
children: "Закрыть"
|
|
304
|
-
}) })]
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
//#endregion
|
|
308
|
-
//#region src/advanced-search/ui/AdvancedSearchSelectUI.tsx
|
|
309
|
-
var G = ({ label: t, description: n, disabled: r, size: i, placeholder: o = "Выбрать", token: s, onOpen: c, onClear: l }) => {
|
|
310
|
-
let { controlId: u, labelId: d, descriptionId: f } = p({
|
|
311
|
-
hasLabel: t != null,
|
|
312
|
-
hasDescription: !!n
|
|
313
|
-
}), h = !!s;
|
|
314
|
-
return /* @__PURE__ */ M("div", {
|
|
315
|
-
"aria-disabled": r || void 0,
|
|
316
|
-
className: O(e.uiElement, e.uiSizable, i && e[i]),
|
|
317
|
-
children: [
|
|
318
|
-
t && /* @__PURE__ */ j("label", {
|
|
319
|
-
id: d,
|
|
320
|
-
htmlFor: u,
|
|
321
|
-
className: e.uiLabel,
|
|
322
|
-
children: t
|
|
323
|
-
}),
|
|
324
|
-
n && /* @__PURE__ */ j("p", {
|
|
325
|
-
id: f,
|
|
326
|
-
className: e.uiDescription,
|
|
327
|
-
children: n
|
|
328
|
-
}),
|
|
329
|
-
/* @__PURE__ */ M("div", {
|
|
330
|
-
className: e.uiInputContainer,
|
|
331
|
-
children: [/* @__PURE__ */ j("div", {
|
|
332
|
-
className: e.uiInputWithToggle,
|
|
333
|
-
children: !h && /* @__PURE__ */ j(a, {
|
|
334
|
-
align: "center",
|
|
335
|
-
className: "h100",
|
|
336
|
-
children: /* @__PURE__ */ j("div", {
|
|
337
|
-
className: e.uiPlaceholder,
|
|
338
|
-
children: o
|
|
339
|
-
})
|
|
340
|
-
})
|
|
341
|
-
}), /* @__PURE__ */ j("div", {
|
|
342
|
-
className: m.controlEndAdornment,
|
|
343
|
-
children: /* @__PURE__ */ M("div", {
|
|
344
|
-
className: e.uiToggleButtonContainer,
|
|
345
|
-
children: [
|
|
346
|
-
/* @__PURE__ */ j("div", {
|
|
347
|
-
className: "flexEllipsis fontSizeSm",
|
|
348
|
-
style: { maxWidth: "100%" },
|
|
349
|
-
children: s
|
|
350
|
-
}),
|
|
351
|
-
/* @__PURE__ */ j("button", {
|
|
352
|
-
type: "button",
|
|
353
|
-
disabled: !s,
|
|
354
|
-
className: e.uiClearButton,
|
|
355
|
-
onClick: l,
|
|
356
|
-
"aria-label": "Очистить все",
|
|
357
|
-
children: /* @__PURE__ */ j(P, {})
|
|
358
|
-
}),
|
|
359
|
-
/* @__PURE__ */ j("div", { className: e.uiButtonSeparator }),
|
|
360
|
-
/* @__PURE__ */ j("button", {
|
|
361
|
-
type: "button",
|
|
362
|
-
onClick: c,
|
|
363
|
-
className: e.uiToggleButton,
|
|
364
|
-
children: /* @__PURE__ */ j(N, { className: e.uiToggleIcon })
|
|
365
|
-
})
|
|
366
|
-
]
|
|
367
|
-
})
|
|
368
|
-
})]
|
|
369
|
-
})
|
|
370
|
-
]
|
|
371
|
-
});
|
|
372
|
-
}, K = [];
|
|
373
|
-
function q({ value: e = [], onChange: t, title: n, config: r, ...i }) {
|
|
374
|
-
let [a, o] = b(!1), s = z(r, e), c = s.data, l = e.length === 0 ? {
|
|
375
|
-
status: "ready",
|
|
376
|
-
items: K
|
|
377
|
-
} : c === void 0 ? s.isError ? { status: "error" } : { status: "loading" } : {
|
|
378
|
-
status: "ready",
|
|
379
|
-
items: c
|
|
380
|
-
}, u = v(() => o(!0), []), d = v(() => o(!1), []), f = v(() => t([]), [t]), p = v((e) => t(e.map((e) => String(e[r.leadingKey]))), [r.leadingKey, t]), m = v((e) => {
|
|
381
|
-
if (e?.length) return e.length > 1 ? `Выбрано ${e.length} элем.` : `${r.leadingText && e[0][r.leadingText] || e[0][r.leadingKey]}`;
|
|
382
|
-
}, [r.leadingKey, r.leadingText]);
|
|
383
|
-
return /* @__PURE__ */ M(A, { children: [/* @__PURE__ */ j(G, {
|
|
384
|
-
...i,
|
|
385
|
-
token: m(c),
|
|
386
|
-
onOpen: u,
|
|
387
|
-
onClear: f
|
|
388
|
-
}), a && /* @__PURE__ */ j(W, {
|
|
389
|
-
title: n,
|
|
390
|
-
config: r,
|
|
391
|
-
onClose: d,
|
|
392
|
-
onItemsSelect: p,
|
|
393
|
-
initialSelection: l
|
|
394
|
-
})] });
|
|
395
|
-
}
|
|
396
|
-
//#endregion
|
|
397
|
-
export { q as AdvancedSearchSelect, R as useAdvancedSearch, z as useAdvancedSearchInitialSelected, V as useAdvancedSearchSelection };
|
|
398
|
-
|
|
399
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/advanced-search/lib/searchParts.ts","../../src/advanced-search/model/useAdvancedSearch.ts","../../src/advanced-search/model/useAdvancedSearchInitialSelected.ts","../../src/advanced-search/model/useAdvancedSearchSelection.ts","../../src/advanced-search/ui/AdvancedSearchModalSession.tsx","../../src/advanced-search/ui/AdvancedSearchModal.tsx","../../src/advanced-search/ui/AdvancedSearchSelectUI.tsx","../../src/advanced-search/ui/AdvancedSearchSelect.tsx"],"sourcesContent":["export function buildSearchParts(searchTerm: string) {\n\tconst term = searchTerm.trim();\n\tif (!term) {\n\t\treturn [];\n\t}\n\n\tconst searchParts = term\n\t\t.split(\"*\")\n\t\t.map((part) => part.trim())\n\t\t.filter((part) => part.length);\n\n\treturn searchParts;\n\n\t// const filterConditions = searchKeys.map((key) => {\n\t// \treturn searchParts.map((part) => `substringof('${part}',${String(key)})`).join(\" and \");\n\t// });\n\n\t// return `(${filterConditions.join(\" or \")})`;\n}\n\nexport function filterBySearchParts<T extends Record<string, string>>(items: T[], searchParts: string[], searchKeys: (keyof T)[]) {\n\tconst lowerSearchParts = searchParts.map((part) => part.toLowerCase());\n\n\treturn items.filter((item) => {\n\t\tfor (const key of searchKeys) {\n\t\t\tconst value = String(item[key] || \"\").toLowerCase();\n\n\t\t\tlet lastIndex = 0;\n\t\t\tlet allPartsFound = true;\n\n\t\t\t// Ищем каждую часть строго после предыдущей\n\t\t\tfor (const part of lowerSearchParts) {\n\t\t\t\tconst index = value.indexOf(part, lastIndex);\n\t\t\t\tif (index === -1) {\n\t\t\t\t\tallPartsFound = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlastIndex = index + part.length; // следующая часть после найденной\n\t\t\t}\n\n\t\t\tif (allPartsFound) return true;\n\t\t}\n\t\treturn false;\n\t});\n\n\t// С регуляркой медленнее в 2-3 раза\n\n\t// // Паттерн: первая часть, затем любое количество символов, затем вторая часть\n\t// const searchPattern = searchParts.join(\".*?\");\n\t// const regExp = new RegExp(searchPattern, \"i\");\n\n\t// return items.filter((item) => {\n\t// \tfor (const key of searchKeys) {\n\t// \t\tif (regExp.test(item[key])) {\n\t// \t\t\treturn true;\n\t// \t\t}\n\t// \t}\n\t// \treturn false;\n\t// });\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { odataQueryFn } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { createFilterContains, createFilterEqual } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\n\nimport { buildSearchParts, filterBySearchParts } from \"../lib\";\n\nimport { SearchConfig } from \"./types\";\n\nconst PAGE_SIZE = 50;\n\nexport function useAdvancedSearch<T extends Record<string, string>>(config: SearchConfig<T>) {\n\tconst [term, setTerm] = useState(\"\");\n\tconst [filters, setFilters] = useState<Record<string, string[]>>(() =>\n\t\tObject.keys(config.segments ?? {}).reduce(\n\t\t\t(acc, key) => {\n\t\t\t\tacc[key] = [];\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, string[]>\n\t\t)\n\t);\n\n\tconst searchParts = buildSearchParts(term);\n\tconst isComplexSearch = searchParts.length > 1;\n\n\tconst top = isComplexSearch ? 5000 : PAGE_SIZE;\n\n\tconst query = useInfiniteQuery({\n\t\tqueryKey: [\"search\", config.odata.service, config.odata.target, filters, term],\n\t\tqueryFn: async ({ pageParam = 0, signal, client }) => {\n\t\t\tconst columnKeys = config.columns.map((col) => col.key);\n\n\t\t\tconst result = await odataQueryFn<T>({\n\t\t\t\todata: {\n\t\t\t\t\tservice: config.odata.service,\n\t\t\t\t\ttarget: config.odata.target\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\ttop: top,\n\t\t\t\t\tskip: pageParam,\n\t\t\t\t\tselect: columnKeys,\n\t\t\t\t\texpression: {\n\t\t\t\t\t\tand: true,\n\t\t\t\t\t\tfilters: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfilters: searchParts\n\t\t\t\t\t\t\t\t\t? config.searchKeys.map((key) => ({\n\t\t\t\t\t\t\t\t\t\t\tfilters: searchParts.map((part) => createFilterContains(key, part))\n\t\t\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t\t\t: []\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tand: true,\n\t\t\t\t\t\t\t\tfilters: Object.keys(filters).map((key) => createFilterEqual(key, filters[key]))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\tsorts: [{ key: config.leadingKey }]\n\t\t\t\t}\n\t\t\t})({ signal, client });\n\n\t\t\tif (isComplexSearch) {\n\t\t\t\treturn filterBySearchParts(result.data, searchParts, config.searchKeys);\n\t\t\t}\n\n\t\t\treturn result.data;\n\t\t},\n\t\tgetNextPageParam: (lastPage, allPages) => {\n\t\t\tif (lastPage.length < top) return undefined;\n\t\t\treturn allPages.length * top;\n\t\t},\n\t\tinitialPageParam: 0\n\t});\n\n\tconst search = useCallback((term: string) => {\n\t\tsetTerm(term);\n\t}, []);\n\n\tconst clearSearch = useCallback(() => {\n\t\tsetTerm(\"\");\n\t}, []);\n\n\tconst items = useMemo(() => {\n\t\treturn query.data?.pages.flatMap((page) => page) ?? [];\n\t}, [query.data?.pages]);\n\n\treturn {\n\t\tquery,\n\t\titems,\n\t\tsearchTerm: term,\n\t\tsetSearch: search,\n\t\tclearSearch,\n\t\tfilters,\n\t\tsetFilters\n\t};\n}\n","import { odataQueryFn } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { createFilterEqual, unwrapODataQueryResult } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport { SearchConfig } from \"./types\";\n\n/**\n * Хук для поиска клиентов с поддержкой бесконечной прокрутки через OData\n */\nexport function useAdvancedSearchInitialSelected<T extends Record<string, string>>(\n\tconfig: SearchConfig<T>,\n\tinitialSelectedKeys: string[] = []\n) {\n\tconst query = useQuery({\n\t\tqueryKey: [\"searchSelected\", config.odata.service, config.odata.target, initialSelectedKeys],\n\t\tqueryFn: async ({ client, signal }) => {\n\t\t\tif (initialSelectedKeys.length === 0) {\n\t\t\t\treturn { data: [] as T[], totalCount: undefined };\n\t\t\t}\n\n\t\t\t// Получаем ключи колонок для select параметра\n\t\t\tconst columnKeys = config.columns.map((col) => col.key);\n\n\t\t\t// Выполняем OData запрос\n\t\t\treturn await odataQueryFn<T>({\n\t\t\t\todata: { service: config.odata.service, target: config.odata.target },\n\t\t\t\toptions: {\n\t\t\t\t\tselect: columnKeys,\n\t\t\t\t\texpression: {\n\t\t\t\t\t\tfilters: initialSelectedKeys.map((key) => createFilterEqual(config.leadingKey, key))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})({ client, signal });\n\t\t},\n\t\tenabled: initialSelectedKeys.length > 0\n\t});\n\n\treturn unwrapODataQueryResult(query);\n}\n","import { useCallback, useState } from \"react\";\n\nimport { SearchConfig } from \"./types\";\n\n/**\n * Создаёт независимый набор выбора и сохраняет последнюю строку для каждого ведущего ключа.\n * Это единая структурная граница как для initial snapshot модалки, так и для дальнейших\n * обновлений выбора из таблицы.\n */\nfunction buildAdvancedSearchSelection<T extends Record<string, string>>(items: readonly T[], leadingKey: keyof T): T[] {\n\tconst selectionById = new Map<string, T>();\n\n\tfor (const item of items) {\n\t\tselectionById.set(String(item[leadingKey]), item);\n\t}\n\n\treturn Array.from(selectionById.values());\n}\n\n/**\n * Хук для управления выбором клиентов\n */\nexport function useAdvancedSearchSelection<T extends Record<string, string>>(\n\tconfig: SearchConfig<T>,\n\tinitialSelectedItems: readonly T[] = []\n) {\n\tconst [selectedItems, setSelectedItems] = useState<T[]>(() => buildAdvancedSearchSelection(initialSelectedItems, config.leadingKey));\n\n\t/**\n\t * Сравнивает наборы выбранных элементов по ведущему ключу без учёта порядка.\n\t */\n\tconst areSelectionsEqual = useCallback(\n\t\t(left: readonly T[], right: readonly T[]) => {\n\t\t\tif (left.length !== right.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst rightIds = new Set(right.map((item) => String(item[config.leadingKey])));\n\n\t\t\treturn left.every((item) => rightIds.has(String(item[config.leadingKey])));\n\t\t},\n\t\t[config.leadingKey]\n\t);\n\n\t/**\n\t * Нормализует новый набор выбора и удаляет дубликаты по ведущему ключу.\n\t */\n\tconst replaceSelection = useCallback(\n\t\t(nextItems: readonly T[]) => {\n\t\t\tsetSelectedItems((prev) => {\n\t\t\t\tconst normalizedItems = buildAdvancedSearchSelection(nextItems, config.leadingKey);\n\n\t\t\t\treturn areSelectionsEqual(prev, normalizedItems) ? prev : normalizedItems;\n\t\t\t});\n\t\t},\n\t\t[areSelectionsEqual, config.leadingKey]\n\t);\n\n\tconst select = useCallback(\n\t\t(item: T) => {\n\t\t\tsetSelectedItems((prev) => {\n\t\t\t\t// Проверяем, не выбран ли уже этот клиент\n\t\t\t\tif (prev.some((c) => c[config.leadingKey] === item[config.leadingKey])) {\n\t\t\t\t\treturn prev;\n\t\t\t\t}\n\t\t\t\treturn [...prev, item];\n\t\t\t});\n\t\t},\n\t\t[config.leadingKey]\n\t);\n\n\tconst deselect = useCallback(\n\t\t(id: string) => {\n\t\t\tsetSelectedItems((prev) => prev.filter((item) => item[config.leadingKey] !== id));\n\t\t},\n\t\t[config.leadingKey]\n\t);\n\n\tconst clearSelection = useCallback(() => {\n\t\tsetSelectedItems([]);\n\t}, []);\n\n\tconst isSelected = useCallback(\n\t\t(id: string) => {\n\t\t\treturn selectedItems.some((item) => item[config.leadingKey] === id);\n\t\t},\n\t\t[config.leadingKey, selectedItems]\n\t);\n\n\treturn {\n\t\tselectedItems,\n\t\tselect,\n\t\tdeselect,\n\t\treplaceSelection,\n\t\tclearSelection,\n\t\tisSelected\n\t};\n}\n","import { useCallback, useMemo } from \"react\";\n\nimport { useODataTableColumns } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { type TableColumnDef } from \"@ryuzaki13/react-foundation-lib/table\";\n\nimport { Badge, BadgeList } from \"../../badge\";\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { GridContainer } from \"../../grid\";\nimport { InputSearch } from \"../../input-search\";\nimport { Scrollable } from \"../../misc\";\nimport { Modal, ModalContent, ModalFooter, ModalToolbar } from \"../../modal\";\nimport { ODataDependentMultiSelect } from \"../../multi-select\";\nimport { Table } from \"../../table\";\nimport { SearchConfig, useAdvancedSearch, useAdvancedSearchSelection } from \"../model\";\n\ninterface AdvancedSearchModalSessionProps<T extends Record<string, string>> {\n\tonClose: () => void;\n\tonItemsSelect: (items: T[]) => void;\n\t/** Снимок committed-выбора, с которого начинается текущая сессия модалки. */\n\tinitialSelectedItems: readonly T[];\n\ttitle?: string;\n\tconfig: SearchConfig<T>;\n}\n\n/**\n * Интерактивная сессия расширенного поиска с собственным selection draft.\n * Компонент монтируется только после разрешения initial Query snapshot.\n */\nexport function AdvancedSearchModalSession<T extends Record<string, string>>({\n\tonClose,\n\tonItemsSelect,\n\ttitle,\n\tconfig,\n\tinitialSelectedItems\n}: AdvancedSearchModalSessionProps<T>) {\n\tconst tableColumns: TableColumnDef<T>[] = useMemo(\n\t\t() =>\n\t\t\tconfig.columns.map(\n\t\t\t\t(col) =>\n\t\t\t\t\t({\n\t\t\t\t\t\tid: col.key as keyof T,\n\t\t\t\t\t\taccessorKey: col.key as keyof T,\n\t\t\t\t\t\theader: col.label,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\twidth: col.width || \"auto\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as TableColumnDef<T>\n\t\t\t),\n\t\t[config.columns]\n\t);\n\n\tconst { columns, isLoading } = useODataTableColumns<T>({\n\t\tservice: config.odata.service,\n\t\ttarget: config.odata.target,\n\t\tmode: \"enrich\",\n\t\tcolumns: tableColumns\n\t});\n\n\tconst { query, items, searchTerm, setSearch, clearSearch, filters, setFilters } = useAdvancedSearch(config);\n\tconst { selectedItems, deselect, replaceSelection } = useAdvancedSearchSelection(config, initialSelectedItems);\n\tconst getRowId = useCallback((item: T) => String(item[config.leadingKey]), [config.leadingKey]);\n\tconst selectedRowIds = useMemo(() => selectedItems.map((item) => String(item[config.leadingKey])), [selectedItems, config.leadingKey]);\n\tconst visibleItemIds = useMemo(() => new Set(items.map((item) => String(item[config.leadingKey]))), [items, config.leadingKey]);\n\n\tconst handleReachEnd = useCallback(() => {\n\t\tif (query.hasNextPage && !query.isFetchingNextPage) {\n\t\t\tquery.fetchNextPage();\n\t\t}\n\t}, [query]);\n\n\t/**\n\t * При изменении видимого выбора сохраняет элементы, которые временно скрыты\n\t * поиском или сегментными фильтрами.\n\t */\n\tconst handleSelect = useCallback(\n\t\t(selectedVisibleItems: T[]) => {\n\t\t\tconst selectedVisibleIds = new Set(selectedVisibleItems.map((item) => String(item[config.leadingKey])));\n\t\t\tconst hiddenSelectedItems = selectedItems.filter((item) => !visibleItemIds.has(String(item[config.leadingKey])));\n\t\t\tconst nextVisibleSelectedItems = items.filter((item) => selectedVisibleIds.has(String(item[config.leadingKey])));\n\n\t\t\treplaceSelection([...hiddenSelectedItems, ...nextVisibleSelectedItems]);\n\t\t},\n\t\t[config.leadingKey, items, replaceSelection, selectedItems, visibleItemIds]\n\t);\n\n\t/** Удаляет отдельный элемент из общего выбора. */\n\tconst handleRemoveSelectedItem = useCallback(\n\t\t(item: T) => {\n\t\t\tdeselect(String(item[config.leadingKey]));\n\t\t},\n\t\t[config.leadingKey, deselect]\n\t);\n\n\t/** Передаёт committed-значение владельцу поля только по явному подтверждению. */\n\tconst handleConfirmSelection = useCallback(() => {\n\t\tonItemsSelect(selectedItems);\n\t\tonClose();\n\t}, [selectedItems, onItemsSelect, onClose]);\n\n\tconst filterConfig = useMemo(() => {\n\t\tif (\"segments\" in config && config.segments) {\n\t\t\tconst limitedKeys = Object.keys(config.segments);\n\t\t\tif (limitedKeys.length) {\n\t\t\t\treturn {\n\t\t\t\t\todata: { ...config.odata, limitedKeys },\n\t\t\t\t\tsegments: config.segments,\n\t\t\t\t\tmodel: config.model\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}, [config]);\n\n\treturn (\n\t\t<Modal isOpen onClose={onClose} title={title || config.title} size=\"lg\" height=\"min(50em, 80dvh)\">\n\t\t\t<ModalToolbar>\n\t\t\t\t<FlexContainer gap=\"sm\">\n\t\t\t\t\t{filterConfig && (\n\t\t\t\t\t\t<ODataDependentMultiSelect\n\t\t\t\t\t\t\todata={filterConfig.odata}\n\t\t\t\t\t\t\tsegments={filterConfig.segments}\n\t\t\t\t\t\t\tmodel={filterConfig.model}\n\t\t\t\t\t\t\tvalues={filters}\n\t\t\t\t\t\t\tonChange={setFilters}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<InputSearch\n\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\tplaceholder={config.searchLabel ?? \"Введите поисковый запрос\"}\n\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\tonChange={setSearch}\n\t\t\t\t\t\tonClear={clearSearch}\n\t\t\t\t\t\tclassName=\"flexGrow\"\n\t\t\t\t\t/>\n\t\t\t\t</FlexContainer>\n\t\t\t</ModalToolbar>\n\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\" templateRows=\"1fr auto\" className=\"h100\">\n\t\t\t\t\t<Table\n\t\t\t\t\t\tcolumns={columns}\n\t\t\t\t\t\tdata={items}\n\t\t\t\t\t\tselectionMode=\"multi\"\n\t\t\t\t\t\tselectedRowIds={selectedRowIds}\n\t\t\t\t\t\tgetRowId={getRowId}\n\t\t\t\t\t\tisLoading={query.isLoading || isLoading}\n\t\t\t\t\t\tisFetching={query.isFetching}\n\t\t\t\t\t\tonRowSelectionChange={handleSelect}\n\t\t\t\t\t\tonReachEnd={handleReachEnd}\n\t\t\t\t\t\tclassName=\"w100\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div className=\"marginBlockMd border\">\n\t\t\t\t\t\t<Scrollable className=\"paddingSm\" height=\"6em\">\n\t\t\t\t\t\t\t<BadgeList>\n\t\t\t\t\t\t\t\t{selectedItems.map((item) => (\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\tkey={item[config.leadingKey]}\n\t\t\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t\t\t\ttone=\"info\"\n\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\tonRemove={() => handleRemoveSelectedItem(item)}>\n\t\t\t\t\t\t\t\t\t\t{config.leadingText ? item[config.leadingText] || item[config.leadingKey] : item[config.leadingKey]}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</BadgeList>\n\t\t\t\t\t\t</Scrollable>\n\t\t\t\t\t</div>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\n\t\t\t<ModalFooter>\n\t\t\t\t<Button onClick={onClose}>Отмена</Button>\n\t\t\t\t<Button variant=\"successOutline\" onClick={handleConfirmSelection}>\n\t\t\t\t\tВыбрать\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { stableStringify } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Button } from \"../../button\";\nimport { LoadingMessage, Message } from \"../../misc\";\nimport { Modal, ModalContent, ModalFooter } from \"../../modal\";\nimport { SearchConfig } from \"../model\";\n\nimport { AdvancedSearchModalSession } from \"./AdvancedSearchModalSession\";\n\nexport type AdvancedSearchInitialSelection<T extends Record<string, string>> =\n\t{ status: \"loading\" } | { status: \"error\" } | { status: \"ready\"; items: readonly T[] };\n\ninterface SearchModalProps<T extends Record<string, string>> {\n\tonClose: () => void;\n\tonItemsSelect: (items: T[]) => void;\n\tinitialSelection: AdvancedSearchInitialSelection<T>;\n\ttitle?: string;\n\tconfig: SearchConfig<T>;\n}\n\n/**\n * Создаёт стабильную identity modal-session по владельцу данных и внешним ключам.\n * Новый Query object с теми же строками не должен пересоздавать пользовательский draft.\n */\nfunction buildAdvancedSearchModalSessionKey<T extends Record<string, string>>(config: SearchConfig<T>, items: readonly T[]) {\n\treturn stableStringify({\n\t\tleadingKey: String(config.leadingKey),\n\t\tservice: config.odata.service,\n\t\ttarget: config.odata.target,\n\t\tselectedIds: items.map((item) => String(item[config.leadingKey])).sort()\n\t});\n}\n\n/**\n * Query boundary начального выбора. Интерактивная сессия монтируется только после\n * успешной загрузки committed snapshot, поэтому поздний ответ не может стереть draft.\n */\nexport function AdvancedSearchModal<T extends Record<string, string>>({\n\tonClose,\n\tonItemsSelect,\n\tinitialSelection,\n\ttitle,\n\tconfig\n}: SearchModalProps<T>) {\n\tif (initialSelection.status === \"ready\") {\n\t\treturn (\n\t\t\t<AdvancedSearchModalSession\n\t\t\t\tkey={buildAdvancedSearchModalSessionKey(config, initialSelection.items)}\n\t\t\t\ttitle={title}\n\t\t\t\tconfig={config}\n\t\t\t\tonClose={onClose}\n\t\t\t\tonItemsSelect={onItemsSelect}\n\t\t\t\tinitialSelectedItems={initialSelection.items}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Modal isOpen onClose={onClose} title={title || config.title} size=\"lg\" height=\"min(50em, 80dvh)\">\n\t\t\t<ModalContent>\n\t\t\t\t{initialSelection.status === \"loading\" ? (\n\t\t\t\t\t<LoadingMessage text=\"Загружаем выбранные элементы...\" />\n\t\t\t\t) : (\n\t\t\t\t\t<Message color=\"error\">Не удалось загрузить выбранные элементы</Message>\n\t\t\t\t)}\n\t\t\t</ModalContent>\n\n\t\t\t<ModalFooter>\n\t\t\t\t<Button onClick={onClose}>Закрыть</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronRightIcon, XIcon } from \"lucide-react\";\n\nimport { FlexContainer } from \"../../flex\";\nimport { useInputFieldIds } from \"../../input\";\nimport inputStyles from \"../../input/Input.module.scss\";\nimport { UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface AdvancedSearchSelectUIProps extends Omit<UiBaseProps<string[]>, \"value\" | \"onChange\"> {\n\ttoken: string | undefined;\n\tonOpen: () => void;\n\tonClear: () => void;\n}\n\nexport const AdvancedSearchSelectUI = ({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tplaceholder = \"Выбрать\",\n\ttoken,\n\tonOpen,\n\tonClear\n}: AdvancedSearchSelectUIProps) => {\n\tconst { controlId, labelId, descriptionId } = useInputFieldIds({\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description\n\t});\n\tconst hasToken = Boolean(token);\n\n\treturn (\n\t\t<div aria-disabled={disabled || undefined} className={cn(uiStyles.uiElement, uiStyles.uiSizable, size && uiStyles[size])}>\n\t\t\t{label && (\n\t\t\t\t<label id={labelId} htmlFor={controlId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<p id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</p>\n\t\t\t)}\n\n\t\t\t<div className={uiStyles.uiInputContainer}>\n\t\t\t\t<div className={uiStyles.uiInputWithToggle}>\n\t\t\t\t\t{!hasToken && (\n\t\t\t\t\t\t<FlexContainer align=\"center\" className=\"h100\">\n\t\t\t\t\t\t\t<div className={uiStyles.uiPlaceholder}>{placeholder}</div>\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className={inputStyles.controlEndAdornment}>\n\t\t\t\t\t<div className={uiStyles.uiToggleButtonContainer}>\n\t\t\t\t\t\t<div className=\"flexEllipsis fontSizeSm\" style={{ maxWidth: \"100%\" }}>\n\t\t\t\t\t\t\t{token}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={!token}\n\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\tonClick={onClear}\n\t\t\t\t\t\t\taria-label=\"Очистить все\">\n\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div className={uiStyles.uiButtonSeparator} />\n\n\t\t\t\t\t\t<button type=\"button\" onClick={onOpen} className={uiStyles.uiToggleButton}>\n\t\t\t\t\t\t\t<ChevronRightIcon className={uiStyles.uiToggleIcon} />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { SearchConfig, useAdvancedSearchInitialSelected } from \"../model\";\n\nimport { AdvancedSearchModal, type AdvancedSearchInitialSelection } from \"./AdvancedSearchModal\";\nimport { AdvancedSearchSelectUI } from \"./AdvancedSearchSelectUI\";\n\ntype AdvancedSearchSelectProps<T extends Record<string, string>> = UiBaseProps<string[]> & {\n\ttitle?: string;\n\tconfig: SearchConfig<T>;\n};\n\nconst EMPTY_INITIAL_SELECTION: readonly never[] = [];\n\nexport function AdvancedSearchSelect<T extends Record<string, string>>({\n\tvalue = [],\n\tonChange,\n\ttitle,\n\tconfig,\n\t...props\n}: AdvancedSearchSelectProps<T>) {\n\tconst [isModalOpen, setIsModalOpen] = useState(false);\n\n\tconst initialSelectionQuery = useAdvancedSearchInitialSelected(config, value);\n\tconst selectedItems = initialSelectionQuery.data;\n\tconst initialSelection: AdvancedSearchInitialSelection<T> =\n\t\tvalue.length === 0\n\t\t\t? { status: \"ready\", items: EMPTY_INITIAL_SELECTION }\n\t\t\t: selectedItems !== undefined\n\t\t\t\t? { status: \"ready\", items: selectedItems }\n\t\t\t\t: initialSelectionQuery.isError\n\t\t\t\t\t? { status: \"error\" }\n\t\t\t\t\t: { status: \"loading\" };\n\n\tconst handleOpen = useCallback(() => setIsModalOpen(true), []);\n\tconst handleClose = useCallback(() => setIsModalOpen(false), []);\n\tconst handleRemove = useCallback(() => onChange([]), [onChange]);\n\tconst handleSelect = useCallback(\n\t\t(items: T[]) => onChange(items.map((item) => String(item[config.leadingKey]))),\n\t\t[config.leadingKey, onChange]\n\t);\n\tconst getDisplayText = useCallback(\n\t\t(items: T[] | undefined) => {\n\t\t\tif (!items?.length) return;\n\t\t\tif (items.length > 1) return `Выбрано ${items.length} элем.`;\n\t\t\treturn `${(config.leadingText && items[0][config.leadingText]) || items[0][config.leadingKey]}`;\n\t\t},\n\t\t[config.leadingKey, config.leadingText]\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<AdvancedSearchSelectUI {...props} token={getDisplayText(selectedItems)} onOpen={handleOpen} onClear={handleRemove} />\n\n\t\t\t{isModalOpen && (\n\t\t\t\t<AdvancedSearchModal\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tconfig={config}\n\t\t\t\t\tonClose={handleClose}\n\t\t\t\t\tonItemsSelect={handleSelect}\n\t\t\t\t\tinitialSelection={initialSelection}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAgB,EAAiB,GAAoB;CACpD,IAAM,IAAO,EAAW,KAAK;CAU7B,OATK,IAIe,EAClB,MAAM,GAAG,CAAC,CACV,KAAK,MAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,QAAQ,MAAS,EAAK,MAEjB,IARC,CAAC;AAeV;AAEA,SAAgB,EAAsD,GAAY,GAAuB,GAAyB;CACjI,IAAM,IAAmB,EAAY,KAAK,MAAS,EAAK,YAAY,CAAC;CAErE,OAAO,EAAM,QAAQ,MAAS;EAC7B,KAAK,IAAM,KAAO,GAAY;GAC7B,IAAM,IAAQ,OAAO,EAAK,MAAQ,EAAE,CAAC,CAAC,YAAY,GAE9C,IAAY,GACZ,IAAgB;GAGpB,KAAK,IAAM,KAAQ,GAAkB;IACpC,IAAM,IAAQ,EAAM,QAAQ,GAAM,CAAS;IAC3C,IAAI,MAAU,IAAI;KACjB,IAAgB;KAChB;IACD;IACA,IAAY,IAAQ,EAAK;GAC1B;GAEA,IAAI,GAAe,OAAO;EAC3B;EACA,OAAO;CACR,CAAC;AAgBF;;;ACjDA,IAAM,IAAY;AAElB,SAAgB,EAAoD,GAAyB;CAC5F,IAAM,CAAC,GAAM,KAAW,EAAS,EAAE,GAC7B,CAAC,GAAS,KAAc,QAC7B,OAAO,KAAK,EAAO,YAAY,CAAC,CAAC,CAAC,CAAC,QACjC,GAAK,OACL,EAAI,KAAO,CAAC,GACL,IAER,CAAC,CACF,CACD,GAEM,IAAc,EAAiB,CAAI,GACnC,IAAkB,EAAY,SAAS,GAEvC,IAAM,IAAkB,MAAO,GAE/B,IAAQ,EAAiB;EAC9B,UAAU;GAAC;GAAU,EAAO,MAAM;GAAS,EAAO,MAAM;GAAQ;GAAS;EAAI;EAC7E,SAAS,OAAO,EAAE,eAAY,GAAG,WAAQ,gBAAa;GACrD,IAAM,IAAa,EAAO,QAAQ,KAAK,MAAQ,EAAI,GAAG,GAEhD,IAAS,MAAM,EAAgB;IACpC,OAAO;KACN,SAAS,EAAO,MAAM;KACtB,QAAQ,EAAO,MAAM;IACtB;IACA,SAAS;KACH;KACL,MAAM;KACN,QAAQ;KACR,YAAY;MACX,KAAK;MACL,SAAS,CACR,EACC,SAAS,IACN,EAAO,WAAW,KAAK,OAAS,EAChC,SAAS,EAAY,KAAK,MAAS,EAAqB,GAAK,CAAI,CAAC,EACnE,EAAE,IACD,CAAC,EACL,GACA;OACC,KAAK;OACL,SAAS,OAAO,KAAK,CAAO,CAAC,CAAC,KAAK,MAAQ,EAAkB,GAAK,EAAQ,EAAI,CAAC;MAChF,CACD;KACD;KACA,OAAO,CAAC,EAAE,KAAK,EAAO,WAAW,CAAC;IACnC;GACD,CAAC,CAAC,CAAC;IAAE;IAAQ;GAAO,CAAC;GAMrB,OAJI,IACI,EAAoB,EAAO,MAAM,GAAa,EAAO,UAAU,IAGhE,EAAO;EACf;EACA,mBAAmB,GAAU,MAAa;GACrC,QAAS,SAAS,IACtB,OAAO,EAAS,SAAS;EAC1B;EACA,kBAAkB;CACnB,CAAC,GAEK,IAAS,GAAa,MAAiB;EAC5C,EAAQ,CAAI;CACb,GAAG,CAAC,CAAC,GAEC,IAAc,QAAkB;EACrC,EAAQ,EAAE;CACX,GAAG,CAAC,CAAC;CAML,OAAO;EACN;EACA,OANa,QACN,EAAM,MAAM,MAAM,SAAS,MAAS,CAAI,KAAK,CAAC,GACnD,CAAC,EAAM,MAAM,KAAK,CAIpB;EACA,YAAY;EACZ,WAAW;EACX;EACA;EACA;CACD;AACD;;;ACxFA,SAAgB,EACf,GACA,IAAgC,CAAC,GAChC;CACD,IAAM,IAAQ,EAAS;EACtB,UAAU;GAAC;GAAkB,EAAO,MAAM;GAAS,EAAO,MAAM;GAAQ;EAAmB;EAC3F,SAAS,OAAO,EAAE,WAAQ,gBAAa;GACtC,IAAI,EAAoB,WAAW,GAClC,OAAO;IAAE,MAAM,CAAC;IAAU,YAAY,KAAA;GAAU;GAIjD,IAAM,IAAa,EAAO,QAAQ,KAAK,MAAQ,EAAI,GAAG;GAGtD,OAAO,MAAM,EAAgB;IAC5B,OAAO;KAAE,SAAS,EAAO,MAAM;KAAS,QAAQ,EAAO,MAAM;IAAO;IACpE,SAAS;KACR,QAAQ;KACR,YAAY,EACX,SAAS,EAAoB,KAAK,MAAQ,EAAkB,EAAO,YAAY,CAAG,CAAC,EACpF;IACD;GACD,CAAC,CAAC,CAAC;IAAE;IAAQ;GAAO,CAAC;EACtB;EACA,SAAS,EAAoB,SAAS;CACvC,CAAC;CAED,OAAO,EAAuB,CAAK;AACpC;;;AC7BA,SAAS,EAA+D,GAAqB,GAA0B;CACtH,IAAM,oBAAgB,IAAI,IAAe;CAEzC,KAAK,IAAM,KAAQ,GAClB,EAAc,IAAI,OAAO,EAAK,EAAW,GAAG,CAAI;CAGjD,OAAO,MAAM,KAAK,EAAc,OAAO,CAAC;AACzC;AAKA,SAAgB,EACf,GACA,IAAqC,CAAC,GACrC;CACD,IAAM,CAAC,GAAe,KAAoB,QAAoB,EAA6B,GAAsB,EAAO,UAAU,CAAC,GAK7H,IAAqB,GACzB,GAAoB,MAAwB;EAC5C,IAAI,EAAK,WAAW,EAAM,QACzB,OAAO;EAGR,IAAM,IAAW,IAAI,IAAI,EAAM,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC;EAE7E,OAAO,EAAK,OAAO,MAAS,EAAS,IAAI,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC;CAC1E,GACA,CAAC,EAAO,UAAU,CACnB,GAKM,IAAmB,GACvB,MAA4B;EAC5B,GAAkB,MAAS;GAC1B,IAAM,IAAkB,EAA6B,GAAW,EAAO,UAAU;GAEjF,OAAO,EAAmB,GAAM,CAAe,IAAI,IAAO;EAC3D,CAAC;CACF,GACA,CAAC,GAAoB,EAAO,UAAU,CACvC;CAiCA,OAAO;EACN;EACA,QAjCc,GACb,MAAY;GACZ,GAAkB,MAEb,EAAK,MAAM,MAAM,EAAE,EAAO,gBAAgB,EAAK,EAAO,WAAW,IAC7D,IAED,CAAC,GAAG,GAAM,CAAI,CACrB;EACF,GACA,CAAC,EAAO,UAAU,CAuBlB;EACA,UArBgB,GACf,MAAe;GACf,GAAkB,MAAS,EAAK,QAAQ,MAAS,EAAK,EAAO,gBAAgB,CAAE,CAAC;EACjF,GACA,CAAC,EAAO,UAAU,CAiBlB;EACA;EACA,gBAhBsB,QAAkB;GACxC,EAAiB,CAAC,CAAC;EACpB,GAAG,CAAC,CAcH;EACA,YAbkB,GACjB,MACO,EAAc,MAAM,MAAS,EAAK,EAAO,gBAAgB,CAAE,GAEnE,CAAC,EAAO,YAAY,CAAa,CASjC;CACD;AACD;;;ACpEA,SAAgB,EAA6D,EAC5E,YACA,kBACA,UACA,WACA,2BACsC;CACtC,IAAM,IAAoC,QAExC,EAAO,QAAQ,KACb,OACC;EACA,IAAI,EAAI;EACR,aAAa,EAAI;EACjB,QAAQ,EAAI;EACZ,MAAM,EACL,OAAO,EAAI,SAAS,OACrB;CACD,EACF,GACD,CAAC,EAAO,OAAO,CAChB,GAEM,EAAE,YAAS,iBAAc,EAAwB;EACtD,SAAS,EAAO,MAAM;EACtB,QAAQ,EAAO,MAAM;EACrB,MAAM;EACN,SAAS;CACV,CAAC,GAEK,EAAE,UAAO,UAAO,eAAY,cAAW,gBAAa,YAAS,kBAAe,EAAkB,CAAM,GACpG,EAAE,kBAAe,aAAU,wBAAqB,EAA2B,GAAQ,CAAoB,GACvG,IAAW,GAAa,MAAY,OAAO,EAAK,EAAO,WAAW,GAAG,CAAC,EAAO,UAAU,CAAC,GACxF,IAAiB,QAAc,EAAc,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,GAAG,CAAC,GAAe,EAAO,UAAU,CAAC,GAC/H,IAAiB,QAAc,IAAI,IAAI,EAAM,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC,GAAG,CAAC,GAAO,EAAO,UAAU,CAAC,GAExH,IAAiB,QAAkB;EACxC,AAAI,EAAM,eAAe,CAAC,EAAM,sBAC/B,EAAM,cAAc;CAEtB,GAAG,CAAC,CAAK,CAAC,GAMJ,IAAe,GACnB,MAA8B;EAC9B,IAAM,IAAqB,IAAI,IAAI,EAAqB,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC,GAChG,IAAsB,EAAc,QAAQ,MAAS,CAAC,EAAe,IAAI,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC,GACzG,IAA2B,EAAM,QAAQ,MAAS,EAAmB,IAAI,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC;EAE/G,EAAiB,CAAC,GAAG,GAAqB,GAAG,CAAwB,CAAC;CACvE,GACA;EAAC,EAAO;EAAY;EAAO;EAAkB;EAAe;CAAc,CAC3E,GAGM,IAA2B,GAC/B,MAAY;EACZ,EAAS,OAAO,EAAK,EAAO,WAAW,CAAC;CACzC,GACA,CAAC,EAAO,YAAY,CAAQ,CAC7B,GAGM,IAAyB,QAAkB;EAEhD,AADA,EAAc,CAAa,GAC3B,EAAQ;CACT,GAAG;EAAC;EAAe;EAAe;CAAO,CAAC,GAEpC,IAAe,QAAc;EAClC,IAAI,cAAc,KAAU,EAAO,UAAU;GAC5C,IAAM,IAAc,OAAO,KAAK,EAAO,QAAQ;GAC/C,IAAI,EAAY,QACf,OAAO;IACN,OAAO;KAAE,GAAG,EAAO;KAAO;IAAY;IACtC,UAAU,EAAO;IACjB,OAAO,EAAO;GACf;EAEF;CACD,GAAG,CAAC,CAAM,CAAC;CAEX,OACC,kBAAC,GAAD;EAAO,QAAA;EAAgB;EAAS,OAAO,KAAS,EAAO;EAAO,MAAK;EAAK,QAAO;EAA/E,UAAA;GACC,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;IAAe,KAAI;IAAnB,UAAA,CACE,KACA,kBAAC,GAAD;KACC,OAAO,EAAa;KACpB,UAAU,EAAa;KACvB,OAAO,EAAa;KACpB,QAAQ;KACR,UAAU;IACV,CAAA,GAGF,kBAAC,GAAD;KACC,MAAK;KACL,aAAa,EAAO,eAAe;KACnC,OAAO;KACP,UAAU;KACV,SAAS;KACT,WAAU;IACV,CAAA,CACa;GACF,CAAA,EAAA,CAAA;GAEd,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;IAAe,KAAI;IAAK,cAAa;IAAW,WAAU;IAA1D,UAAA,CACC,kBAAC,GAAD;KACU;KACT,MAAM;KACN,eAAc;KACE;KACN;KACV,WAAW,EAAM,aAAa;KAC9B,YAAY,EAAM;KAClB,sBAAsB;KACtB,YAAY;KACZ,WAAU;IACV,CAAA,GAED,kBAAC,OAAD;KAAK,WAAU;KACd,UAAA,kBAAC,GAAD;MAAY,WAAU;MAAY,QAAO;MACxC,UAAA,kBAAC,GAAD,EAAA,UACE,EAAc,KAAK,MACnB,kBAAC,GAAD;OAEC,MAAK;OACL,MAAK;OACL,YAAW;OACX,gBAAgB,EAAyB,CAAI;OAC5C,UAAA,EAAO,eAAc,EAAK,EAAO,gBAA0C,EAAK,EAAO;MAClF,GAND,EAAK,EAAO,WAMX,CACP,EACS,CAAA;KACA,CAAA;IACR,CAAA,CACS;GACF,CAAA,EAAA,CAAA;GAEd,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;IAAQ,SAAS;IAAS,UAAA;GAAc,CAAA,GACxC,kBAAC,GAAD;IAAQ,SAAQ;IAAiB,SAAS;IAAwB,UAAA;GAE1D,CAAA,CACI,EAAA,CAAA;EACP;;AAET;;;AC5JA,SAAS,EAAqE,GAAyB,GAAqB;CAC3H,OAAO,EAAgB;EACtB,YAAY,OAAO,EAAO,UAAU;EACpC,SAAS,EAAO,MAAM;EACtB,QAAQ,EAAO,MAAM;EACrB,aAAa,EAAM,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC,CAAC,KAAK;CACxE,CAAC;AACF;AAMA,SAAgB,EAAsD,EACrE,YACA,kBACA,qBACA,UACA,aACuB;CAcvB,OAbI,EAAiB,WAAW,UAE9B,kBAAC,GAAD;EAEQ;EACC;EACC;EACM;EACf,sBAAsB,EAAiB;CACvC,GANK,EAAmC,GAAQ,EAAiB,KAAK,CAMtE,IAKF,kBAAC,GAAD;EAAO,QAAA;EAAgB;EAAS,OAAO,KAAS,EAAO;EAAO,MAAK;EAAK,QAAO;EAA/E,UAAA,CACC,kBAAC,GAAD,EAAA,UACE,EAAiB,WAAW,YAC5B,kBAAC,GAAD,EAAgB,MAAK,kCAAmC,CAAA,IAExD,kBAAC,GAAD;GAAS,OAAM;GAAQ,UAAA;EAAgD,CAAA,EAE3D,CAAA,GAEd,kBAAC,GAAD,EAAA,UACC,kBAAC,GAAD;GAAQ,SAAS;GAAS,UAAA;EAAe,CAAA,EAC7B,CAAA,CACP;;AAET;;;ACzDA,IAAa,KAA0B,EACtC,UACA,gBACA,aACA,SACA,iBAAc,WACd,UACA,WACA,iBACkC;CAClC,IAAM,EAAE,cAAW,YAAS,qBAAkB,EAAiB;EAC9D,UAAU,KAAiC;EAC3C,gBAAgB,CAAC,CAAC;CACnB,CAAC,GACK,IAAW,EAAQ;CAEzB,OACC,kBAAC,OAAD;EAAK,iBAAe,KAAY,KAAA;EAAW,WAAW,EAAG,EAAS,WAAW,EAAS,WAAW,KAAQ,EAAS,EAAK;EAAvH,UAAA;GACE,KACA,kBAAC,SAAD;IAAO,IAAI;IAAS,SAAS;IAAW,WAAW,EAAS;IAC1D,UAAA;GACK,CAAA;GAEP,KACA,kBAAC,KAAD;IAAG,IAAI;IAAe,WAAW,EAAS;IACxC,UAAA;GACC,CAAA;GAGJ,kBAAC,OAAD;IAAK,WAAW,EAAS;IAAzB,UAAA,CACC,kBAAC,OAAD;KAAK,WAAW,EAAS;KACvB,UAAA,CAAC,KACD,kBAAC,GAAD;MAAe,OAAM;MAAS,WAAU;MACvC,UAAA,kBAAC,OAAD;OAAK,WAAW,EAAS;OAAgB,UAAA;MAAiB,CAAA;KAC5C,CAAA;IAEZ,CAAA,GAEL,kBAAC,OAAD;KAAK,WAAW,EAAY;KAC3B,UAAA,kBAAC,OAAD;MAAK,WAAW,EAAS;MAAzB,UAAA;OACC,kBAAC,OAAD;QAAK,WAAU;QAA0B,OAAO,EAAE,UAAU,OAAO;QACjE,UAAA;OACG,CAAA;OAEL,kBAAC,UAAD;QACC,MAAK;QACL,UAAU,CAAC;QACX,WAAW,EAAS;QACpB,SAAS;QACT,cAAW;QACX,UAAA,kBAAC,GAAD,CAAQ,CAAA;OACD,CAAA;OAER,kBAAC,OAAD,EAAK,WAAW,EAAS,kBAAoB,CAAA;OAE7C,kBAAC,UAAD;QAAQ,MAAK;QAAS,SAAS;QAAQ,WAAW,EAAS;QAC1D,UAAA,kBAAC,GAAD,EAAkB,WAAW,EAAS,aAAe,CAAA;OAC9C,CAAA;MACJ;;IACD,CAAA,CACD;;EACD;;AAEP,GCjEM,IAA4C,CAAC;AAEnD,SAAgB,EAAuD,EACtE,WAAQ,CAAC,GACT,aACA,UACA,WACA,GAAG,KAC6B;CAChC,IAAM,CAAC,GAAa,KAAkB,EAAS,EAAK,GAE9C,IAAwB,EAAiC,GAAQ,CAAK,GACtE,IAAgB,EAAsB,MACtC,IACL,EAAM,WAAW,IACd;EAAE,QAAQ;EAAS,OAAO;CAAwB,IAClD,MAAkB,KAAA,IAEjB,EAAsB,UACrB,EAAE,QAAQ,QAAQ,IAClB,EAAE,QAAQ,UAAU,IAHrB;EAAE,QAAQ;EAAS,OAAO;CAAc,GAKvC,IAAa,QAAkB,EAAe,EAAI,GAAG,CAAC,CAAC,GACvD,IAAc,QAAkB,EAAe,EAAK,GAAG,CAAC,CAAC,GACzD,IAAe,QAAkB,EAAS,CAAC,CAAC,GAAG,CAAC,CAAQ,CAAC,GACzD,IAAe,GACnB,MAAe,EAAS,EAAM,KAAK,MAAS,OAAO,EAAK,EAAO,WAAW,CAAC,CAAC,GAC7E,CAAC,EAAO,YAAY,CAAQ,CAC7B,GACM,IAAiB,GACrB,MAA2B;EACtB,OAAO,QAEZ,OADI,EAAM,SAAS,IAAU,WAAW,EAAM,OAAO,UAC9C,GAAI,EAAO,eAAe,EAAM,EAAE,CAAC,EAAO,gBAAiB,EAAM,EAAE,CAAC,EAAO;CACnF,GACA,CAAC,EAAO,YAAY,EAAO,WAAW,CACvC;CAEA,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,GAAD;EAAwB,GAAI;EAAO,OAAO,EAAe,CAAa;EAAG,QAAQ;EAAY,SAAS;CAAe,CAAA,GAEpH,KACA,kBAAC,GAAD;EACQ;EACC;EACR,SAAS;EACT,eAAe;EACG;CAClB,CAAA,CAED,EAAA,CAAA;AAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"searchParts.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/lib/searchParts.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,YAkBlD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAuC/H"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,8BAA8B,CAAC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { type ODataCollectionConfig, type ODataCollectionModel, type ODataCollectionSegment } from "@ryuzaki13/react-foundation-api/odata";
|
|
2
|
-
/**
|
|
3
|
-
* Параметры поиска клиентов
|
|
4
|
-
*/
|
|
5
|
-
export type SearchParams = {
|
|
6
|
-
searchTerm: string;
|
|
7
|
-
filters?: Record<string, unknown>;
|
|
8
|
-
top?: number;
|
|
9
|
-
skip?: number;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Результат поиска клиентов
|
|
13
|
-
*/
|
|
14
|
-
export type SearchResult<T extends object> = {
|
|
15
|
-
clients: T[];
|
|
16
|
-
totalCount: number;
|
|
17
|
-
hasNextPage: boolean;
|
|
18
|
-
};
|
|
19
|
-
type BaseSearchConfig<T extends object> = {
|
|
20
|
-
/** Заголовок диалогового окна */
|
|
21
|
-
title: string;
|
|
22
|
-
odata: Omit<ODataCollectionConfig, "limitedKeys">;
|
|
23
|
-
/** Главный ключ, значения которого и будут использоваться в итоговом выборе */
|
|
24
|
-
leadingKey: keyof T;
|
|
25
|
-
/** Текстовый ключ главного ключа, используется для формирования "выбранного ключа" */
|
|
26
|
-
leadingText?: keyof T;
|
|
27
|
-
/** Список ключей, по которым будет отрабатывать фильтрация таблицы */
|
|
28
|
-
searchKeys: (keyof T)[];
|
|
29
|
-
/** Подпись для поля ввода поиска */
|
|
30
|
-
searchLabel?: string;
|
|
31
|
-
/** Список столбцов, которые должны выбираться для формирования таблицы */
|
|
32
|
-
columns: Array<{
|
|
33
|
-
key: keyof T;
|
|
34
|
-
label: string;
|
|
35
|
-
width?: number;
|
|
36
|
-
}>;
|
|
37
|
-
};
|
|
38
|
-
type SearchConfigWithoutFilters<T extends object> = BaseSearchConfig<T> & {
|
|
39
|
-
segments?: never;
|
|
40
|
-
model?: never;
|
|
41
|
-
};
|
|
42
|
-
type SearchConfigWithFilters<T extends object> = BaseSearchConfig<T> & {
|
|
43
|
-
segments: Record<string, ODataCollectionSegment>;
|
|
44
|
-
model?: Omit<ODataCollectionModel, "codeKey">;
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Интерфейс конфигурации поиска
|
|
48
|
-
*/
|
|
49
|
-
export type SearchConfig<T extends object> = SearchConfigWithoutFilters<T> | (SearchConfigWithFilters<T> & {});
|
|
50
|
-
/**
|
|
51
|
-
* Интерфейс регистра для конфигураций
|
|
52
|
-
*/
|
|
53
|
-
export type SearchConfigRegistry = Record<string, SearchConfig<Record<string, string>>>;
|
|
54
|
-
export {};
|
|
55
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/model/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE3I;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI;IAC5C,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI;IACzC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IAEd,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;IAElD,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC,CAAC;IAEpB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IAEtB,sEAAsE;IACtE,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAExB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,0EAA0E;IAC1E,OAAO,EAAE,KAAK,CAAC;QACd,GAAG,EAAE,MAAM,CAAC,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACH,CAAC;AAEF,KAAK,0BAA0B,CAAC,CAAC,SAAS,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG;IACzE,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,KAAK,uBAAuB,CAAC,CAAC,SAAS,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;CAC9C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAE/G;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { SearchConfig } from "./types";
|
|
2
|
-
export declare function useAdvancedSearch<T extends Record<string, string>>(config: SearchConfig<T>): {
|
|
3
|
-
query: import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/query-core").InfiniteData<T[], unknown>, Error>;
|
|
4
|
-
items: T[];
|
|
5
|
-
searchTerm: string;
|
|
6
|
-
setSearch: (term: string) => void;
|
|
7
|
-
clearSearch: () => void;
|
|
8
|
-
filters: Record<string, string[]>;
|
|
9
|
-
setFilters: import("react").Dispatch<import("react").SetStateAction<Record<string, string[]>>>;
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=useAdvancedSearch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAdvancedSearch.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/model/useAdvancedSearch.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;;;;sBAgExD,MAAM;;;;EAqBxC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { SearchConfig } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Хук для поиска клиентов с поддержкой бесконечной прокрутки через OData
|
|
4
|
-
*/
|
|
5
|
-
export declare function useAdvancedSearchInitialSelected<T extends Record<string, string>>(config: SearchConfig<T>, initialSelectedKeys?: string[]): import("@ryuzaki13/react-foundation-lib/odata-service").UnwrappedODataQueryResult<T[]>;
|
|
6
|
-
//# sourceMappingURL=useAdvancedSearchInitialSelected.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAdvancedSearchInitialSelected.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/model/useAdvancedSearchInitialSelected.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChF,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,mBAAmB,GAAE,MAAM,EAAO,0FA2BlC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { SearchConfig } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Хук для управления выбором клиентов
|
|
4
|
-
*/
|
|
5
|
-
export declare function useAdvancedSearchSelection<T extends Record<string, string>>(config: SearchConfig<T>, initialSelectedItems?: readonly T[]): {
|
|
6
|
-
selectedItems: T[];
|
|
7
|
-
select: (item: T) => void;
|
|
8
|
-
deselect: (id: string) => void;
|
|
9
|
-
replaceSelection: (nextItems: readonly T[]) => void;
|
|
10
|
-
clearSelection: () => void;
|
|
11
|
-
isSelected: (id: string) => boolean;
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=useAdvancedSearchSelection.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAdvancedSearchSelection.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/model/useAdvancedSearchSelection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiBvC;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1E,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,oBAAoB,GAAE,SAAS,CAAC,EAAO;;mBAmC/B,CAAC;mBAaH,MAAM;kCAxBC,SAAS,CAAC,EAAE;;qBAmCnB,MAAM;EAcZ"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { SearchConfig } from "../model";
|
|
2
|
-
export type AdvancedSearchInitialSelection<T extends Record<string, string>> = {
|
|
3
|
-
status: "loading";
|
|
4
|
-
} | {
|
|
5
|
-
status: "error";
|
|
6
|
-
} | {
|
|
7
|
-
status: "ready";
|
|
8
|
-
items: readonly T[];
|
|
9
|
-
};
|
|
10
|
-
interface SearchModalProps<T extends Record<string, string>> {
|
|
11
|
-
onClose: () => void;
|
|
12
|
-
onItemsSelect: (items: T[]) => void;
|
|
13
|
-
initialSelection: AdvancedSearchInitialSelection<T>;
|
|
14
|
-
title?: string;
|
|
15
|
-
config: SearchConfig<T>;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Query boundary начального выбора. Интерактивная сессия монтируется только после
|
|
19
|
-
* успешной загрузки committed snapshot, поэтому поздний ответ не может стереть draft.
|
|
20
|
-
*/
|
|
21
|
-
export declare function AdvancedSearchModal<T extends Record<string, string>>({ onClose, onItemsSelect, initialSelection, title, config }: SearchModalProps<T>): import("react").JSX.Element;
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=AdvancedSearchModal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdvancedSearchModal.d.ts","sourceRoot":"","sources":["../../../src/advanced-search/ui/AdvancedSearchModal.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,MAAM,MAAM,8BAA8B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAC1E;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAA;CAAE,CAAC;AAExF,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAC1D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IACpC,gBAAgB,EAAE,8BAA8B,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CACxB;AAeD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACrE,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BA6BrB"}
|