@wipco/sdui 0.29.0 → 0.31.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.
@@ -0,0 +1,65 @@
1
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
2
+ import React__default from 'react';
3
+
4
+ type FileDropzoneItem = {
5
+ id: string;
6
+ url: string;
7
+ name?: string;
8
+ };
9
+ interface FileDropzoneProps {
10
+ /** 백엔드 업로드 경로 (예: "/attachments"). 없으면 로컬 미리보기 모드 */
11
+ endpoint?: string;
12
+ /** 첨부 목록 — 주면 controlled */
13
+ value?: FileDropzoneItem[];
14
+ onChange?: (files: FileDropzoneItem[]) => void;
15
+ /** 업로드 큐 시작/종료 알림 */
16
+ onBusyChange?: (busy: boolean) => void;
17
+ /** 최대 첨부 수 */
18
+ maxCount?: number;
19
+ /** 허용 형식 (input accept 문법) */
20
+ accept?: string;
21
+ disabled?: boolean;
22
+ /** 드롭 영역 아래 보조 문구 */
23
+ hint?: string;
24
+ /**
25
+ * 첨부 삭제 경로의 **기준**(예: "/attachments"). 주면 썸네일의 삭제가 목록에서
26
+ * 빼는 데 그치지 않고 `DELETE {deleteEndpoint}/{id}` 까지 보낸다.
27
+ *
28
+ * 이게 없으면 이미 올라간 사진을 이 칸에 채워 둘 수 없다 — 지운 것처럼 보이는데
29
+ * 서버에는 그대로 남는 함정이 되기 때문이다(그래서 예전에는 "추가 전용"이었다).
30
+ * 아직 업로드 중이거나 로컬 미리보기(id가 `local-`)인 항목은 보낼 곳이 없어 건너뛴다.
31
+ */
32
+ /**
33
+ * 업로드를 직접 맡는다. 주면 `endpoint` 대신 이 함수가 불린다 — 위젯은 응답을
34
+ * 해석하지 않고 항목을 그대로 받는다(서버 봉투가 특수한 앱의 탈출구).
35
+ */
36
+ upload?: (file: File) => Promise<FileDropzoneItem>;
37
+ /** multipart 필드 이름. 기본 'file'. */
38
+ fileField?: string;
39
+ /**
40
+ * 503을 "백엔드 미연동"으로 읽어 로컬 미리보기로 강등한다. 기본 false —
41
+ * 일반 서버의 과부하 503에서 "올린 것처럼 보이는데 새로고침하면 없는" 항목을
42
+ * 만들면 안 되기 때문이다. 데모 모드를 503으로 합성하는 앱만 켠다.
43
+ */
44
+ localFallbackOn503?: boolean;
45
+ deleteEndpoint?: string;
46
+ /** 서버에서 실제로 지운 뒤 한 번 — 보통 목록·상세를 다시 읽는 invalidate를 건다 */
47
+ onRemove?: () => void;
48
+ }
49
+ /**
50
+ * 업로드 응답에서 `{id, url}` 을 꺼낸다 — **도메인 명사를 알지 않는다.**
51
+ *
52
+ * 단일 자원을 한 겹 감싸 주는 것은 REST 관례다(`{attachment:{…}}`·`{data:{…}}`).
53
+ * 그래서 이름 목록을 두는 대신 **모양**으로 판정한다: 최상위에 id·url 이 없고
54
+ * 객체 값을 가진 키가 **정확히 하나**면 그 안으로 한 겹 내려간다.
55
+ * 그 조건을 벗어나면(키가 둘 이상, 값이 객체가 아님) 벗기지 않는다 — 잘못 벗겨
56
+ * 엉뚱한 값을 집는 것보다 "응답 형식 오류"로 드러나는 편이 낫다.
57
+ */
58
+ declare function unwrapUploaded(payload: unknown): {
59
+ id?: unknown;
60
+ url?: unknown;
61
+ } | null;
62
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다 — 자기 축(폭·여백)이 닿게 하는 통로. */
63
+ declare const FileDropzone: React__default.FC<FileDropzoneProps & SduiBoxProps>;
64
+
65
+ export { FileDropzone, type FileDropzoneItem, type FileDropzoneProps, unwrapUploaded };
@@ -0,0 +1,6 @@
1
+ export { FileDropzone, unwrapUploaded } from '../chunk-DQVDS2VP.js';
2
+ import '../chunk-XPBZMECW.js';
3
+ import '../chunk-THEP3VWY.js';
4
+ import '../chunk-DKPNFEVU.js';
5
+ import '../chunk-WIDDHR7L.js';
6
+ import '../chunk-SAN4IX6N.js';
@@ -1,6 +1,6 @@
1
- export { OrgChartBoard } from '../chunk-KBLFOC37.js';
1
+ export { OrgChartBoard } from '../chunk-NGZI4V3O.js';
2
2
  import '../chunk-XPBZMECW.js';
3
3
  import '../chunk-THEP3VWY.js';
4
- import '../chunk-DVOPZFQS.js';
4
+ import '../chunk-DKPNFEVU.js';
5
5
  import '../chunk-WIDDHR7L.js';
6
6
  import '../chunk-SAN4IX6N.js';
@@ -1,4 +1,4 @@
1
- export { PermissionMatrixEditor } from '../chunk-WLQ7PLHB.js';
2
- import '../chunk-DVOPZFQS.js';
1
+ export { PermissionMatrixEditor } from '../chunk-N24VF6KI.js';
2
+ import '../chunk-DKPNFEVU.js';
3
3
  import '../chunk-WIDDHR7L.js';
4
4
  import '../chunk-SAN4IX6N.js';
@@ -1,6 +1,6 @@
1
- export { RankBoard } from '../chunk-DIVN4TBW.js';
1
+ export { RankBoard } from '../chunk-U6H7YN4I.js';
2
2
  import '../chunk-QU7YVMFA.js';
3
3
  import '../chunk-XQPTSEJC.js';
4
- import '../chunk-DVOPZFQS.js';
4
+ import '../chunk-DKPNFEVU.js';
5
5
  import '../chunk-WIDDHR7L.js';
6
6
  import '../chunk-SAN4IX6N.js';
@@ -1,4 +1,4 @@
1
- export { RoleMemberPicker } from '../chunk-XSCFMCLH.js';
2
- import '../chunk-DVOPZFQS.js';
1
+ export { RoleMemberPicker } from '../chunk-WXZDYDXG.js';
2
+ import '../chunk-DKPNFEVU.js';
3
3
  import '../chunk-WIDDHR7L.js';
4
4
  import '../chunk-SAN4IX6N.js';
@@ -57,6 +57,7 @@ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
57
57
  import { ApprovalLineEditorProps } from './ApprovalLineEditor.js';
58
58
  export { ApprovalLineEditor, ApprovalLineStep, CustomApprover } from './ApprovalLineEditor.js';
59
59
  export { AutocompleteField, AutocompleteFieldProps, AutocompleteOption, AutocompleteSearchFn, AutocompleteSearchResult, toAutocompleteOptions } from './AutocompleteField.js';
60
+ export { FileDropzone, FileDropzoneItem, FileDropzoneProps, unwrapUploaded } from './FileDropzone.js';
60
61
 
61
62
  /**
62
63
  * `createRegistry(widgetComponents)`로 어휘에 얹는 묶음.
@@ -1,3 +1,13 @@
1
+ import { Timeline } from '../chunk-EFYEOT47.js';
2
+ export { Timeline } from '../chunk-EFYEOT47.js';
3
+ import { TreePicker } from '../chunk-U3HYQCFA.js';
4
+ export { TreePicker } from '../chunk-U3HYQCFA.js';
5
+ import { TreeView } from '../chunk-X5R2HHEN.js';
6
+ export { TreeView, buildTreeNodes } from '../chunk-X5R2HHEN.js';
7
+ import { RecordSheet } from '../chunk-K3JBSWFI.js';
8
+ export { RecordSheet } from '../chunk-K3JBSWFI.js';
9
+ import { RoleMemberPicker } from '../chunk-WXZDYDXG.js';
10
+ export { RoleMemberPicker } from '../chunk-WXZDYDXG.js';
1
11
  import { SearchableMultiPicker } from '../chunk-C53NGSA3.js';
2
12
  export { SearchableMultiPicker } from '../chunk-C53NGSA3.js';
3
13
  import { SecureScreen } from '../chunk-IIRENCDS.js';
@@ -8,28 +18,23 @@ import { Strip } from '../chunk-ZH5MLOZS.js';
8
18
  export { Strip } from '../chunk-ZH5MLOZS.js';
9
19
  import { SummaryTable } from '../chunk-O4U7Y3XL.js';
10
20
  export { SummaryTable } from '../chunk-O4U7Y3XL.js';
11
- import { Timeline } from '../chunk-EFYEOT47.js';
12
- export { Timeline } from '../chunk-EFYEOT47.js';
13
- import { TreePicker } from '../chunk-U3HYQCFA.js';
14
- export { TreePicker } from '../chunk-U3HYQCFA.js';
15
- import { TreeView } from '../chunk-X5R2HHEN.js';
16
- export { TreeView, buildTreeNodes } from '../chunk-X5R2HHEN.js';
21
+ import { JsonField } from '../chunk-JVBZRDC2.js';
22
+ export { JsonField } from '../chunk-JVBZRDC2.js';
23
+ import { LiveClock } from '../chunk-Z3WGIFJP.js';
24
+ export { LiveClock } from '../chunk-Z3WGIFJP.js';
17
25
  import { OrgChart } from '../chunk-QWJ3OBBL.js';
18
26
  export { OrgChart } from '../chunk-QWJ3OBBL.js';
19
- import { OrgChartBoard } from '../chunk-KBLFOC37.js';
20
- export { OrgChartBoard } from '../chunk-KBLFOC37.js';
21
- import { PermissionMatrixEditor } from '../chunk-WLQ7PLHB.js';
22
- export { PermissionMatrixEditor } from '../chunk-WLQ7PLHB.js';
27
+ import { OrgChartBoard } from '../chunk-NGZI4V3O.js';
28
+ export { OrgChartBoard } from '../chunk-NGZI4V3O.js';
29
+ import { PermissionMatrixEditor } from '../chunk-N24VF6KI.js';
30
+ export { PermissionMatrixEditor } from '../chunk-N24VF6KI.js';
23
31
  import { PeriodFilter } from '../chunk-INWASR2G.js';
24
32
  export { PeriodFilter } from '../chunk-INWASR2G.js';
25
33
  import { PrintSheet } from '../chunk-MYJ2KEIP.js';
26
34
  export { PrintSheet } from '../chunk-MYJ2KEIP.js';
27
- import { RankBoard } from '../chunk-DIVN4TBW.js';
28
- export { RankBoard } from '../chunk-DIVN4TBW.js';
29
- import { RecordSheet } from '../chunk-K3JBSWFI.js';
30
- export { RecordSheet } from '../chunk-K3JBSWFI.js';
31
- import { RoleMemberPicker } from '../chunk-XSCFMCLH.js';
32
- export { RoleMemberPicker } from '../chunk-XSCFMCLH.js';
35
+ import { RankBoard } from '../chunk-U6H7YN4I.js';
36
+ export { RankBoard } from '../chunk-U6H7YN4I.js';
37
+ export { AutocompleteField, toAutocompleteOptions } from '../chunk-CVCP52OD.js';
33
38
  import { ColumnBoard } from '../chunk-C4JRSZGS.js';
34
39
  export { ColumnBoard } from '../chunk-C4JRSZGS.js';
35
40
  import { DiffView } from '../chunk-LDJ2CFFH.js';
@@ -38,29 +43,25 @@ import { Disclosure } from '../chunk-HIZ2OVJA.js';
38
43
  export { Disclosure } from '../chunk-HIZ2OVJA.js';
39
44
  import { EventCalendar } from '../chunk-C3JY6GA3.js';
40
45
  export { EventCalendar } from '../chunk-C3JY6GA3.js';
46
+ export { FileDropzone, unwrapUploaded } from '../chunk-DQVDS2VP.js';
41
47
  import { ImageLightbox } from '../chunk-XPBZMECW.js';
42
48
  export { ImageLightbox } from '../chunk-XPBZMECW.js';
43
49
  import { InlineEdit } from '../chunk-KT3ZVBLN.js';
44
50
  export { InlineEdit } from '../chunk-KT3ZVBLN.js';
45
- import { JsonField } from '../chunk-JVBZRDC2.js';
46
- export { JsonField } from '../chunk-JVBZRDC2.js';
47
- import { LiveClock } from '../chunk-Z3WGIFJP.js';
48
- export { LiveClock } from '../chunk-Z3WGIFJP.js';
49
51
  import '../chunk-QU7YVMFA.js';
50
52
  import '../chunk-THEP3VWY.js';
51
- import { ApprovalOverridesEditor } from '../chunk-ZDRERW4G.js';
52
- export { ApprovalOverridesEditor } from '../chunk-ZDRERW4G.js';
53
+ import { ApprovalOverridesEditor } from '../chunk-OR27SRKL.js';
54
+ export { ApprovalOverridesEditor } from '../chunk-OR27SRKL.js';
53
55
  import { TagMultiSelect } from '../chunk-QDEZXA34.js';
54
56
  export { TagMultiSelect } from '../chunk-QDEZXA34.js';
55
- import { ApprovalLineEditor } from '../chunk-SAPJVLZM.js';
56
- export { ApprovalLineEditor } from '../chunk-SAPJVLZM.js';
57
- import { ApprovalStepper } from '../chunk-ZTQEP3TR.js';
58
- export { ApprovalStepper } from '../chunk-ZTQEP3TR.js';
59
- export { AutocompleteField, toAutocompleteOptions } from '../chunk-6S5CFNFM.js';
57
+ import { ApprovalLineEditor } from '../chunk-S4LOH2TU.js';
58
+ export { ApprovalLineEditor } from '../chunk-S4LOH2TU.js';
60
59
  import '../chunk-BD75U73S.js';
61
60
  import '../chunk-EFMKWPZ3.js';
62
61
  import '../chunk-XQPTSEJC.js';
63
- import '../chunk-DVOPZFQS.js';
62
+ import '../chunk-DKPNFEVU.js';
63
+ import { ApprovalStepper } from '../chunk-ZTQEP3TR.js';
64
+ export { ApprovalStepper } from '../chunk-ZTQEP3TR.js';
64
65
  import '../chunk-WIDDHR7L.js';
65
66
  import '../chunk-SAN4IX6N.js';
66
67
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipco/sdui",
3
- "version": "0.29.0",
3
+ "version": "0.31.0",
4
4
  "description": "WIPCO 서버 주도 UI(SDUI) 렌더러 — JSON 페이지 스펙을 React 컴포넌트로 렌더링",
5
5
  "keywords": [
6
6
  "sdui",
@@ -32,6 +32,10 @@
32
32
  "types": "./dist/rich.d.ts",
33
33
  "default": "./dist/rich.js"
34
34
  },
35
+ "./rich/ExcelUploadCard": {
36
+ "types": "./dist/rich/ExcelUploadCard.d.ts",
37
+ "default": "./dist/rich/ExcelUploadCard.js"
38
+ },
35
39
  "./widgets": {
36
40
  "types": "./dist/widgets/index.d.ts",
37
41
  "default": "./dist/widgets/index.js"
@@ -68,6 +72,10 @@
68
72
  "types": "./dist/widgets/EventCalendar.d.ts",
69
73
  "default": "./dist/widgets/EventCalendar.js"
70
74
  },
75
+ "./widgets/FileDropzone": {
76
+ "types": "./dist/widgets/FileDropzone.d.ts",
77
+ "default": "./dist/widgets/FileDropzone.js"
78
+ },
71
79
  "./widgets/ImageLightbox": {
72
80
  "types": "./dist/widgets/ImageLightbox.d.ts",
73
81
  "default": "./dist/widgets/ImageLightbox.js"