@wipco/sdui 0.11.0 → 0.12.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/dist/{chunk-3YFDIRCI.js → chunk-PBGYAVQZ.js} +1 -1
- package/dist/{chunk-BJDWMECO.js → chunk-QIDMPWZH.js} +145 -63
- package/dist/{chunk-IEUPUFRF.js → chunk-UA5CT24N.js} +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.js +7 -3
- package/dist/styles.css +5 -1
- package/dist/widgets/AutocompleteField.js +2 -2
- package/dist/widgets/SearchableMultiPicker.js +2 -2
- package/dist/widgets/index.js +4 -4
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { includesLooseSearch } from './chunk-
|
|
1
|
+
import { includesLooseSearch } from './chunk-QIDMPWZH.js';
|
|
2
2
|
import { Icon, Button, Input, Spinner } from './chunk-B5JTXYDB.js';
|
|
3
3
|
import { boxed } from './chunk-SAN4IX6N.js';
|
|
4
4
|
import { useId, useRef, useState, useEffect, useMemo } from 'react';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Input, Button, IconButton, Tag, Field, Checkbox } from './chunk-B5JTXYDB.js';
|
|
2
2
|
import { useRef, useEffect, useState, useMemo } from 'react';
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -52,6 +52,63 @@ function Popover({
|
|
|
52
52
|
] })
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
|
+
function normalizeSearchOptions(options, valueKey, labelKey) {
|
|
56
|
+
if (!Array.isArray(options)) return [];
|
|
57
|
+
return options.flatMap((raw) => {
|
|
58
|
+
if (raw === null || typeof raw !== "object") return [];
|
|
59
|
+
const row = raw;
|
|
60
|
+
const value = valueKey ? row[valueKey] : row.value;
|
|
61
|
+
if (value === void 0 || value === null) return [];
|
|
62
|
+
const label = (labelKey ? row[labelKey] : row.label) ?? value;
|
|
63
|
+
return [{ value: String(value), label: String(label) }];
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function normalizeSearchFields(fields) {
|
|
67
|
+
return fields.map((field) => {
|
|
68
|
+
if (field.type === "select") {
|
|
69
|
+
if (!field.valueKey && !field.labelKey) return field;
|
|
70
|
+
return {
|
|
71
|
+
...field,
|
|
72
|
+
options: normalizeSearchOptions(field.options, field.valueKey, field.labelKey),
|
|
73
|
+
valueKey: void 0,
|
|
74
|
+
labelKey: void 0
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (field.type === "cascading" && field.tree) {
|
|
78
|
+
return { ...field, options: buildCascadingTree(field.options, field.tree), tree: void 0 };
|
|
79
|
+
}
|
|
80
|
+
return field;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function buildCascadingTree(rows, tree) {
|
|
84
|
+
if (!Array.isArray(rows)) return [];
|
|
85
|
+
const nodes = /* @__PURE__ */ new Map();
|
|
86
|
+
const parents = /* @__PURE__ */ new Map();
|
|
87
|
+
for (const raw of rows) {
|
|
88
|
+
if (raw === null || typeof raw !== "object") continue;
|
|
89
|
+
const row = raw;
|
|
90
|
+
const id = row[tree.idKey];
|
|
91
|
+
if (id === void 0 || id === null) continue;
|
|
92
|
+
const parent = row[tree.parentIdKey];
|
|
93
|
+
nodes.set(String(id), {
|
|
94
|
+
value: String(id),
|
|
95
|
+
label: String(row[tree.labelKey] ?? id),
|
|
96
|
+
children: []
|
|
97
|
+
});
|
|
98
|
+
parents.set(String(id), parent === void 0 || parent === null ? null : String(parent));
|
|
99
|
+
}
|
|
100
|
+
const roots = [];
|
|
101
|
+
for (const [id, node] of nodes) {
|
|
102
|
+
const parent = parents.get(id);
|
|
103
|
+
const parentNode = parent === null || parent === void 0 ? void 0 : nodes.get(parent);
|
|
104
|
+
if (parentNode) parentNode.children.push(node);
|
|
105
|
+
else roots.push(node);
|
|
106
|
+
}
|
|
107
|
+
for (const node of nodes.values()) {
|
|
108
|
+
if (node.children.length === 0) delete node.children;
|
|
109
|
+
}
|
|
110
|
+
return roots;
|
|
111
|
+
}
|
|
55
112
|
function splitMultiValue(value) {
|
|
56
113
|
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
57
114
|
}
|
|
@@ -179,7 +236,7 @@ function SearchToolbar({
|
|
|
179
236
|
search,
|
|
180
237
|
onSearchChange,
|
|
181
238
|
onSearch,
|
|
182
|
-
advancedFields = EMPTY_FIELDS,
|
|
239
|
+
advancedFields: rawAdvancedFields = EMPTY_FIELDS,
|
|
183
240
|
advancedValues = EMPTY_VALUES,
|
|
184
241
|
placeholder = "\uAC80\uC0C9",
|
|
185
242
|
className,
|
|
@@ -187,6 +244,7 @@ function SearchToolbar({
|
|
|
187
244
|
}) {
|
|
188
245
|
const [open, setOpen] = useState(false);
|
|
189
246
|
const [draft, setDraft] = useState(advancedValues);
|
|
247
|
+
const advancedFields = useMemo(() => normalizeSearchFields(rawAdvancedFields), [rawAdvancedFields]);
|
|
190
248
|
const hasAdvanced = advancedFields.length > 0;
|
|
191
249
|
useEffect(() => {
|
|
192
250
|
if (!open) setDraft(advancedValues);
|
|
@@ -223,59 +281,76 @@ function SearchToolbar({
|
|
|
223
281
|
setDraft(nextValues);
|
|
224
282
|
onSearch(search.trim(), cleanSearchValues(advancedFields, nextValues));
|
|
225
283
|
};
|
|
226
|
-
return
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
onChange: (event) => onSearchChange(event.target.value),
|
|
235
|
-
placeholder
|
|
236
|
-
}
|
|
237
|
-
),
|
|
238
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "secondary", icon: "search", children: "\uAC80\uC0C9" })
|
|
239
|
-
] }) : null,
|
|
240
|
-
hasAdvanced ? /* @__PURE__ */ jsx(
|
|
241
|
-
Popover,
|
|
284
|
+
return (
|
|
285
|
+
/*
|
|
286
|
+
* 세로 축(컨트롤 행 + 칩 행) — 원래 칩이 컨트롤과 같은 행 **앞**에 끼어들어,
|
|
287
|
+
* 조건 몇 개만 적용해도 검색창·보기 전환·등록 버튼이 밀려 헤더가 통째로
|
|
288
|
+
* 무너졌다(실사용 지적, 장비 목록 스크린샷). 칩은 자기 행에서 개행한다.
|
|
289
|
+
*/
|
|
290
|
+
/* @__PURE__ */ jsxs(
|
|
291
|
+
"form",
|
|
242
292
|
{
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
"
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
293
|
+
className: ["wp-col", className].filter(Boolean).join(" "),
|
|
294
|
+
style: { gap: "var(--wp-space-2)" },
|
|
295
|
+
onSubmit: submit,
|
|
296
|
+
children: [
|
|
297
|
+
/* @__PURE__ */ jsxs("div", { className: "wp-row", children: [
|
|
298
|
+
!hideSearchInput ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
299
|
+
/* @__PURE__ */ jsx(
|
|
300
|
+
Input,
|
|
301
|
+
{
|
|
302
|
+
icon: "search",
|
|
303
|
+
value: search,
|
|
304
|
+
onChange: (event) => onSearchChange(event.target.value),
|
|
305
|
+
placeholder
|
|
306
|
+
}
|
|
307
|
+
),
|
|
308
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "secondary", icon: "search", children: "\uAC80\uC0C9" })
|
|
309
|
+
] }) : null,
|
|
310
|
+
hasAdvanced ? /* @__PURE__ */ jsx(
|
|
311
|
+
Popover,
|
|
312
|
+
{
|
|
313
|
+
open,
|
|
314
|
+
onClose: () => setOpen(false),
|
|
315
|
+
alignLeft: false,
|
|
316
|
+
width: "min(560px, 80vw)",
|
|
317
|
+
trigger: (
|
|
318
|
+
// 검색 입력창 옆에 나란히 서는 자리라 테두리가 있어야 한 덩어리로 읽힌다.
|
|
319
|
+
// 열린 상태는 인라인 배경이 아니라 pressed(aria-pressed 틴트)로 알린다.
|
|
320
|
+
/* @__PURE__ */ jsx(
|
|
321
|
+
IconButton,
|
|
322
|
+
{
|
|
323
|
+
type: "button",
|
|
324
|
+
icon: "sliders-horizontal",
|
|
325
|
+
label: "\uC0C1\uC138\uAC80\uC0C9",
|
|
326
|
+
variant: "outlined",
|
|
327
|
+
pressed: open,
|
|
328
|
+
"aria-expanded": open,
|
|
329
|
+
onClick: () => setOpen((value) => !value)
|
|
330
|
+
}
|
|
331
|
+
)
|
|
332
|
+
),
|
|
333
|
+
footer: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
334
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", icon: "refresh-cw", onClick: resetAdvancedSearch, children: "\uCD08\uAE30\uD654" }),
|
|
335
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "primary", size: "sm", onClick: applyAdvancedSearch, children: "\uC801\uC6A9" })
|
|
336
|
+
] }),
|
|
337
|
+
children: /* @__PURE__ */ jsx("div", { className: "wp-grid wp-grid--2", children: advancedFields.map((field) => /* @__PURE__ */ jsx(
|
|
338
|
+
SearchFieldInput,
|
|
339
|
+
{
|
|
340
|
+
field,
|
|
341
|
+
values: draft,
|
|
342
|
+
onChange: (patch) => setDraft((current) => ({ ...current, ...patch }))
|
|
343
|
+
},
|
|
344
|
+
field.key
|
|
345
|
+
)) })
|
|
346
|
+
}
|
|
347
|
+
) : null
|
|
348
|
+
] }),
|
|
349
|
+
activeCriteria.length > 0 ? /* @__PURE__ */ jsx("div", { className: "wp-row", style: { flexWrap: "wrap" }, children: activeCriteria.map((criterion) => /* @__PURE__ */ jsx(Tag, { onRemove: () => removeCriterion(criterion), children: criterion.label }, criterion.key)) }) : null
|
|
350
|
+
]
|
|
276
351
|
}
|
|
277
|
-
)
|
|
278
|
-
|
|
352
|
+
)
|
|
353
|
+
);
|
|
279
354
|
}
|
|
280
355
|
function SearchFieldInput({
|
|
281
356
|
field,
|
|
@@ -382,7 +457,7 @@ function MultiSelectInput({
|
|
|
382
457
|
children: multiSelectLabel(field, selected)
|
|
383
458
|
}
|
|
384
459
|
),
|
|
385
|
-
children: /* @__PURE__ */ jsx("div", { className: "wp-col", children: field.options.map((option) => /* @__PURE__ */ jsx(
|
|
460
|
+
children: /* @__PURE__ */ jsx("div", { className: "wp-col", style: { maxHeight: "min(320px, 40vh)", overflowY: "auto" }, children: field.options.map((option) => /* @__PURE__ */ jsx(
|
|
386
461
|
Checkbox,
|
|
387
462
|
{
|
|
388
463
|
label: option.label,
|
|
@@ -528,17 +603,24 @@ function CascadingLevelSelect({
|
|
|
528
603
|
}
|
|
529
604
|
),
|
|
530
605
|
footer: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "xs", icon: "refresh-cw", onClick: onClear, children: allLabel }),
|
|
531
|
-
children: /* @__PURE__ */ jsx(
|
|
532
|
-
|
|
606
|
+
children: /* @__PURE__ */ jsx(
|
|
607
|
+
"div",
|
|
533
608
|
{
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
609
|
+
className: "wp-col",
|
|
610
|
+
style: { minWidth: 200, maxHeight: "min(320px, 40vh)", overflowY: "auto" },
|
|
611
|
+
children: options.map((option) => /* @__PURE__ */ jsx(
|
|
612
|
+
Checkbox,
|
|
613
|
+
{
|
|
614
|
+
label: cascadingOptionLabel(option, pathMap, showPathLabels),
|
|
615
|
+
checked: selectedSet.has(option.value),
|
|
616
|
+
onChange: (e) => onToggle(option, e.target.checked)
|
|
617
|
+
},
|
|
618
|
+
option.value
|
|
619
|
+
))
|
|
620
|
+
}
|
|
621
|
+
)
|
|
540
622
|
}
|
|
541
623
|
);
|
|
542
624
|
}
|
|
543
625
|
|
|
544
|
-
export { Popover, SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue };
|
|
626
|
+
export { Popover, SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchFields, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { includesLooseSearch } from './chunk-
|
|
1
|
+
import { includesLooseSearch } from './chunk-QIDMPWZH.js';
|
|
2
2
|
import { Button, Dialog, Input, Tag, Checkbox } from './chunk-B5JTXYDB.js';
|
|
3
3
|
import { boxed } from './chunk-SAN4IX6N.js';
|
|
4
4
|
import React, { useMemo, useState, useEffect } from 'react';
|
package/dist/index.d.ts
CHANGED
|
@@ -221,11 +221,21 @@ type SearchField = {
|
|
|
221
221
|
label: string;
|
|
222
222
|
placeholder?: string;
|
|
223
223
|
} | {
|
|
224
|
-
/**
|
|
224
|
+
/**
|
|
225
|
+
* 다중 선택 — 값은 쉼표로 합쳐 저장한다.
|
|
226
|
+
*
|
|
227
|
+
* `valueKey`/`labelKey` 를 주면 options 를 도메인 객체 배열로 받는다
|
|
228
|
+
* (`Select` 0.7.0 과 같은 계약). 스펙에서는 options 에
|
|
229
|
+
* `{"$state":"rt.departments","default":[]}` 를 바인딩하면 page.data 가 채운
|
|
230
|
+
* 실데이터가 그대로 선택지가 된다 — 정적 {label,value}만 받던 것이
|
|
231
|
+
* 예시값 필터가 화면마다 남던 근본 원인이었다(실사용 지적).
|
|
232
|
+
*/
|
|
225
233
|
type: 'select';
|
|
226
234
|
key: string;
|
|
227
235
|
label: string;
|
|
228
|
-
options: SearchOption
|
|
236
|
+
options: Array<SearchOption | Record<string, unknown>>;
|
|
237
|
+
valueKey?: string;
|
|
238
|
+
labelKey?: string;
|
|
229
239
|
allLabel?: string;
|
|
230
240
|
} | {
|
|
231
241
|
type: 'dateRange';
|
|
@@ -245,11 +255,20 @@ type SearchField = {
|
|
|
245
255
|
/**
|
|
246
256
|
* 계층 다중 선택 — 단계별 체크박스 목록 체인. 선택된 값들을 쉼표로 합쳐 저장하며,
|
|
247
257
|
* 부모를 선택하면 그 자손 선택은 제거되고 자손을 선택하면 그 조상 선택이 제거된다.
|
|
258
|
+
*
|
|
259
|
+
* `tree` 를 주면 options 를 **평면 행 배열**로 받아 여기서 계층을 세운다 —
|
|
260
|
+
* `/categories` 처럼 {id, parent_id, name} 평면 목록을 주는 API 를 스펙이
|
|
261
|
+
* 트리로 재조립할 방법이 없어서다($calc 에 그런 연산이 없다).
|
|
248
262
|
*/
|
|
249
263
|
type: 'cascading';
|
|
250
264
|
key: string;
|
|
251
265
|
label: string;
|
|
252
|
-
options: CascadingSearchOption
|
|
266
|
+
options: Array<CascadingSearchOption | Record<string, unknown>>;
|
|
267
|
+
tree?: {
|
|
268
|
+
idKey: string;
|
|
269
|
+
parentIdKey: string;
|
|
270
|
+
labelKey: string;
|
|
271
|
+
};
|
|
253
272
|
allLabel?: string;
|
|
254
273
|
};
|
|
255
274
|
type SearchValues = Record<string, string>;
|
|
@@ -277,7 +296,7 @@ interface SearchToolbarProps {
|
|
|
277
296
|
/** 필터 전용 모드: 검색 입력창 없이 상세검색 버튼+칩만 보여준다 */
|
|
278
297
|
hideSearchInput?: boolean;
|
|
279
298
|
}
|
|
280
|
-
declare function SearchToolbar({ search, onSearchChange, onSearch, advancedFields, advancedValues, placeholder, className, hideSearchInput, }: SearchToolbarProps): React__default.JSX.Element;
|
|
299
|
+
declare function SearchToolbar({ search, onSearchChange, onSearch, advancedFields: rawAdvancedFields, advancedValues, placeholder, className, hideSearchInput, }: SearchToolbarProps): React__default.JSX.Element;
|
|
281
300
|
|
|
282
301
|
/**
|
|
283
302
|
* 검색 결과 목록 — ERP `app/components/search/SearchResults.tsx`의 계약을 그대로 가져온 포팅.
|
|
@@ -403,7 +422,7 @@ interface SearchResultsProps<T> {
|
|
|
403
422
|
declare function normalizePageSizes(sizes: number[] | undefined): number[] | undefined;
|
|
404
423
|
declare function SearchResults<T extends {
|
|
405
424
|
id: string;
|
|
406
|
-
}>({ item, columns, gridConfig, leftFilters, rightFilters, initialView, views, pageSizes, className, style, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields, searchPlaceholder, virtual, }: SearchResultsProps<T>): React__default.JSX.Element;
|
|
425
|
+
}>({ item, columns, gridConfig, leftFilters, rightFilters, initialView, views, pageSizes, className, style, searchParams, onParamsChange, actions, disableGrid, disableList, onRowClick, title, headerActions, isLoading, hideHeader, advancedSearchFields: rawAdvancedSearchFields, searchPlaceholder, virtual, }: SearchResultsProps<T>): React__default.JSX.Element;
|
|
407
426
|
|
|
408
427
|
/**
|
|
409
428
|
* 셀 표현 어휘 — 목록 컬럼의 셀과 카드 행의 값이 **같은 규칙**을 쓴다.
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DEV, HoistedStyle, isSafeNavigationTarget, useSduiAdapter, hostFetchOf, DateRangePicker, DatePicker, useSduiSandbox, resolveAdapter, assetResolverOf, SduiAdapterContext } from './chunk-5A7BWIGN.js';
|
|
2
2
|
export { DatePicker, DateRangePicker, defaultAdapter, useSduiAssetResolver, useSduiSandbox } from './chunk-5A7BWIGN.js';
|
|
3
|
-
import { searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-
|
|
4
|
-
export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-
|
|
3
|
+
import { normalizeSearchFields, searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-QIDMPWZH.js';
|
|
4
|
+
export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-QIDMPWZH.js';
|
|
5
5
|
import { EmptyState, Button, Checkbox, SegmentedControl, Spinner, Select, Pagination, Icon, Card, Badge, ProgressBar, Tag, Toast, Textarea, Tabs, Table, Switch, StatCard, Input, IconButton, Field, Alert, warnOnce, Dialog } from './chunk-B5JTXYDB.js';
|
|
6
6
|
export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip } from './chunk-B5JTXYDB.js';
|
|
7
7
|
import { boxed, mergeStyle, containerLayoutStyle, joinClass, columnsClass, typographyStyle, LAYOUT_CSS, childLayoutFrom, CHILD_LAYOUT_PROPS } from './chunk-SAN4IX6N.js';
|
|
@@ -643,11 +643,15 @@ function SearchResults({
|
|
|
643
643
|
headerActions,
|
|
644
644
|
isLoading = false,
|
|
645
645
|
hideHeader = false,
|
|
646
|
-
advancedSearchFields = EMPTY_FIELDS,
|
|
646
|
+
advancedSearchFields: rawAdvancedSearchFields = EMPTY_FIELDS,
|
|
647
647
|
searchPlaceholder,
|
|
648
648
|
virtual
|
|
649
649
|
}) {
|
|
650
650
|
const hasActions = actions.length > 0;
|
|
651
|
+
const advancedSearchFields = useMemo(
|
|
652
|
+
() => normalizeSearchFields(rawAdvancedSearchFields),
|
|
653
|
+
[rawAdvancedSearchFields]
|
|
654
|
+
);
|
|
651
655
|
const sizeChoices = normalizePageSizes(pageSizes) ?? PAGE_SIZE_CHOICES;
|
|
652
656
|
const defaultPageSize = sizeChoices[0];
|
|
653
657
|
const page = Number(searchParams.get("page")) || 1;
|
package/dist/styles.css
CHANGED
|
@@ -947,7 +947,11 @@
|
|
|
947
947
|
z-index: var(--wp-z-dropdown);
|
|
948
948
|
}
|
|
949
949
|
.erp-popover--left { right: auto; left: 0; }
|
|
950
|
-
|
|
950
|
+
/* 내부 스크롤을 두지 않는다 — 낮은 창에서 60vh 캡이 필드 두 줄짜리 패널마저 잘라
|
|
951
|
+
컨트롤이 반쯤 걸친 채 스크롤됐다(실사용 지적, 법인차 관리). 패널은 내용만큼 크고,
|
|
952
|
+
화면보다 길면 페이지가 스크롤된다. 정말 긴 목록(분류 175종)은 목록 자신이
|
|
953
|
+
스크롤한다(SearchToolbar 의 옵션 목록 max-height). */
|
|
954
|
+
.erp-popover__body { padding: var(--wp-space-4); }
|
|
951
955
|
.erp-popover__foot {
|
|
952
956
|
display: flex; align-items: center; justify-content: space-between; gap: var(--wp-space-2);
|
|
953
957
|
padding: var(--wp-space-3); border-top: var(--wp-border-w) solid var(--wp-divider);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AutocompleteField, toAutocompleteOptions } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { AutocompleteField, toAutocompleteOptions } from '../chunk-PBGYAVQZ.js';
|
|
2
|
+
import '../chunk-QIDMPWZH.js';
|
|
3
3
|
import '../chunk-B5JTXYDB.js';
|
|
4
4
|
import '../chunk-SAN4IX6N.js';
|
package/dist/widgets/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SearchableMultiPicker } from '../chunk-
|
|
2
|
-
export { SearchableMultiPicker } from '../chunk-
|
|
1
|
+
import { SearchableMultiPicker } from '../chunk-UA5CT24N.js';
|
|
2
|
+
export { SearchableMultiPicker } from '../chunk-UA5CT24N.js';
|
|
3
3
|
import { SecureScreen } from '../chunk-4CZJF5PR.js';
|
|
4
4
|
export { SecureScreen } from '../chunk-4CZJF5PR.js';
|
|
5
5
|
import { StackedMeter } from '../chunk-BMZKZGJF.js';
|
|
@@ -32,8 +32,8 @@ import { PeriodFilter } from '../chunk-WJEGCCPY.js';
|
|
|
32
32
|
export { PeriodFilter } from '../chunk-WJEGCCPY.js';
|
|
33
33
|
import { PrintSheet } from '../chunk-JWYBFODH.js';
|
|
34
34
|
export { PrintSheet } from '../chunk-JWYBFODH.js';
|
|
35
|
-
export { AutocompleteField, toAutocompleteOptions } from '../chunk-
|
|
36
|
-
import '../chunk-
|
|
35
|
+
export { AutocompleteField, toAutocompleteOptions } from '../chunk-PBGYAVQZ.js';
|
|
36
|
+
import '../chunk-QIDMPWZH.js';
|
|
37
37
|
import { ColumnBoard } from '../chunk-VK6KWB65.js';
|
|
38
38
|
export { ColumnBoard } from '../chunk-VK6KWB65.js';
|
|
39
39
|
import { DiffView } from '../chunk-4IRLQWQC.js';
|