@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.
package/dist/meta.js CHANGED
@@ -3839,6 +3839,227 @@ var RoleMemberPickerMeta = {
3839
3839
  },
3840
3840
  resize: { kind: "none" }
3841
3841
  };
3842
+ var FileDropzoneMeta = {
3843
+ name: "FileDropzone",
3844
+ label: "\uD30C\uC77C \uCCA8\uBD80",
3845
+ category: "input",
3846
+ icon: "paperclip",
3847
+ description: "\uB4DC\uB798\uADF8 \uC564 \uB4DC\uB86D \uB2E4\uC911 \uCCA8\uBD80. \uC5C5\uB85C\uB4DC \uACBD\uB85C\uAC00 \uC5C6\uAC70\uB098 \uBC31\uC5D4\uB4DC\uAC00 503\uC774\uBA74 object URL \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uB85C \uB5A8\uC5B4\uC9C4\uB2E4.",
3848
+ props: [
3849
+ {
3850
+ name: "value",
3851
+ kind: "array",
3852
+ label: "\uCCA8\uBD80 \uBAA9\uB85D",
3853
+ bindable: true,
3854
+ description: "\uC8FC\uBA74 controlled. \uC2E4\uCE21 6/7\uC774 \uC804\uBD80 $state \uBC14\uC778\uB529\uC774\uACE0 default\uAC00 \uBE48 \uBC30\uC5F4\uC774\uB2E4.",
3855
+ group: "data",
3856
+ // 실측 6/7. 원소 리터럴은 스펙에 한 건도 없어(전부 빈 배열) 형태의 근거는 타입뿐이다.
3857
+ item: [
3858
+ { name: "id", kind: "string", label: "\uC2DD\uBCC4\uC790", required: true },
3859
+ { name: "url", kind: "string", label: "URL", required: true },
3860
+ { name: "name", kind: "string", label: "\uD30C\uC77C\uBA85" }
3861
+ ]
3862
+ },
3863
+ {
3864
+ name: "onChange",
3865
+ kind: "action",
3866
+ label: "\uCCA8\uBD80 \uBCC0\uACBD",
3867
+ eventArg: "\uBCC0\uACBD\uB41C \uCCA8\uBD80 \uBAA9\uB85D \uBC30\uC5F4",
3868
+ group: "behavior"
3869
+ },
3870
+ // 실측 6/7 — 전부 setState + fromEvent
3871
+ {
3872
+ name: "endpoint",
3873
+ kind: "string",
3874
+ label: "\uC5C5\uB85C\uB4DC \uACBD\uB85C",
3875
+ description: '\uD30C\uC77C\uB9C8\uB2E4 FormData("file")\uB97C POST\uD558\uACE0 {id,url} \uC751\uB2F5\uC744 \uAE30\uB300\uD55C\uB2E4. \uC5C6\uC73C\uBA74 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30 \uBAA8\uB4DC\uB85C\uB9CC \uB3D9\uC791\uD55C\uB2E4.',
3876
+ group: "data"
3877
+ },
3878
+ // 실측 1/7 ("/asset/attachments")
3879
+ { name: "maxCount", kind: "number", label: "\uCD5C\uB300 \uCCA8\uBD80 \uC218", group: "behavior" },
3880
+ // 실측 7/7 (5×4, 8×3)
3881
+ {
3882
+ name: "accept",
3883
+ kind: "string",
3884
+ label: "\uD5C8\uC6A9 \uD615\uC2DD",
3885
+ default: "image/*",
3886
+ description: "input accept \uBB38\uBC95. \uB9DE\uC9C0 \uC54A\uB294 \uD30C\uC77C\uC740 \uC81C\uC678\uD558\uACE0 \uC778\uB77C\uC778 \uACBD\uACE0\uB85C \uC548\uB0B4\uD55C\uB2E4.",
3887
+ group: "behavior"
3888
+ },
3889
+ // 실측 7/7 ("image/*,.pdf"×4, "image/*"×3)
3890
+ { name: "hint", kind: "string", label: "\uBCF4\uC870 \uBB38\uAD6C", description: "\uB4DC\uB86D \uC601\uC5ED \uC544\uB798\uC5D0 \uBD99\uB294\uB2E4.", group: "content" },
3891
+ // 실측 7/7
3892
+ {
3893
+ name: "deleteEndpoint",
3894
+ kind: "string",
3895
+ label: "\uC0AD\uC81C \uACBD\uB85C \uAE30\uC900",
3896
+ description: "\uC8FC\uBA74 \uC378\uB124\uC77C \uC0AD\uC81C\uAC00 DELETE {\uC774 \uAC12}/{id}\uAE4C\uC9C0 \uBCF4\uB0B8\uB2E4(\uC608: /attachments). \uC774\uBBF8 \uC62C\uB77C\uAC04 \uC0AC\uC9C4\uC744 \uC774 \uCE78\uC5D0 \uCC44\uC6CC \uB458 \uB54C \uD544\uC218 \u2014 \uC5C6\uC73C\uBA74 \uC9C0\uC6B4 \uAC83\uCC98\uB7FC \uBCF4\uC774\uB294\uB370 \uC11C\uBC84\uC5D0\uB294 \uB0A8\uB294\uB2E4.",
3897
+ group: "data"
3898
+ },
3899
+ {
3900
+ name: "onRemove",
3901
+ kind: "action",
3902
+ label: "\uC0AD\uC81C \uD6C4",
3903
+ description: "\uC11C\uBC84\uC5D0\uC11C \uC2E4\uC81C\uB85C \uC9C0\uC6B4 \uB4A4 \uD55C \uBC88. \uBCF4\uD1B5 \uBAA9\uB85D\xB7\uC0C1\uC138\uB97C \uB2E4\uC2DC \uC77D\uB294 invalidate\uB97C \uAC74\uB2E4.",
3904
+ group: "behavior"
3905
+ },
3906
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" },
3907
+ // 실측 0/7 — 구현에는 있다
3908
+ {
3909
+ name: "onBusyChange",
3910
+ kind: "action",
3911
+ label: "\uC5C5\uB85C\uB4DC \uC9C4\uD589 \uC54C\uB9BC",
3912
+ eventArg: "\uC5C5\uB85C\uB4DC \uD050\uAC00 \uB3C4\uB294 \uB3D9\uC548 true, \uB05D\uB098\uBA74 false",
3913
+ description: "\uCCA8\uBD80\uAC00 \uC62C\uB77C\uAC00\uB294 \uB3D9\uC548 \uC800\uC7A5 \uBC84\uD2BC\uC744 \uC7A0\uAE00 \uB54C \uC4F4\uB2E4.",
3914
+ group: "behavior",
3915
+ advanced: true
3916
+ },
3917
+ // 실측 0/7 — 구현에는 있다
3918
+ {
3919
+ name: "fileField",
3920
+ kind: "string",
3921
+ label: "multipart \uD544\uB4DC \uC774\uB984",
3922
+ description: "\uAE30\uBCF8 'file'. \uC11C\uBC84\uAC00 \uB2E4\uB978 \uC774\uB984\uC744 \uBC1B\uC73C\uBA74 \uBC14\uAFBC\uB2E4.",
3923
+ group: "data",
3924
+ advanced: true
3925
+ },
3926
+ {
3927
+ name: "localFallbackOn503",
3928
+ kind: "boolean",
3929
+ label: "503\uC774\uBA74 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30",
3930
+ description: '503\uC744 "\uBC31\uC5D4\uB4DC \uBBF8\uC5F0\uB3D9"\uC73C\uB85C \uC77D\uC5B4 \uAC15\uB4F1\uD55C\uB2E4. \uAE30\uBCF8 \uAEBC\uC9D0 \u2014 \uC77C\uBC18 \uC11C\uBC84\uC758 \uACFC\uBD80\uD558 503\uC5D0\uC11C "\uC62C\uB9B0 \uAC83 \uAC19\uC740\uB370 \uC0C8\uB85C\uACE0\uCE68\uD558\uBA74 \uC5C6\uB294" \uD56D\uBAA9\uC744 \uB9CC\uB4E4\uBA74 \uC548 \uB418\uAE30 \uB54C\uBB38\uC774\uB2E4.',
3931
+ group: "behavior",
3932
+ advanced: true
3933
+ }
3934
+ ],
3935
+ children: { accepts: false },
3936
+ dom: { element: "div" },
3937
+ // 실측: 루트가 <div class="wp-col">
3938
+ // 프리셋에 endpoint를 넣지 않는다 — 넣으면 캔버스에서 파일을 놓는 순간 실제 업로드가 나간다.
3939
+ // 없으면 업로드 큐가 object URL로만 돌아 바깥으로 나가는 요청이 0건이다.
3940
+ preset: {
3941
+ component: "FileDropzone",
3942
+ props: {
3943
+ value: { $state: "form.attachments", default: [] },
3944
+ onChange: { action: "setState", key: "form.attachments", fromEvent: true },
3945
+ accept: "image/*",
3946
+ maxCount: 5,
3947
+ hint: "\uC774\uBBF8\uC9C0 \uD30C\uC77C\uC744 \uB04C\uC5B4\uB2E4 \uB193\uAC70\uB098 \uD074\uB9AD\uD574 \uC120\uD0DD\uD558\uC138\uC694"
3948
+ }
3949
+ },
3950
+ resize: { kind: "none" }
3951
+ };
3952
+ var ExcelUploadCardMeta = {
3953
+ name: "ExcelUploadCard",
3954
+ label: "\uC5D1\uC140 \uC77C\uAD04 \uC5C5\uB85C\uB4DC",
3955
+ category: "data",
3956
+ icon: "cloud-upload",
3957
+ description: "\uC5D1\uC140 \uC77C\uAD04 \uC5C5\uB85C\uB4DC \uCE74\uB4DC. server\uB294 \uD30C\uC77C\uC744 \uADF8\uB300\uB85C \uC62C\uB824 \uCC98\uB9AC \uC694\uC57D\uC744 \uBC1B\uACE0, preview\uB294 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uD30C\uC2F1\xB7\uAC80\uC99D\uD558\uACE0 \uC624\uB958 \uC140\uC744 \uACE0\uCE5C \uB4A4 \uC720\uD6A8 \uD589\uB9CC \uBCF4\uB0B8\uB2E4.",
3958
+ props: [
3959
+ {
3960
+ name: "mode",
3961
+ kind: "enum",
3962
+ label: "\uB3D9\uC791 \uBC29\uC2DD",
3963
+ default: "server",
3964
+ options: [
3965
+ { value: "server", label: "\uC11C\uBC84 \uC5C5\uB85C\uB4DC", description: "\uD30C\uC77C\uC744 multipart\uB85C \uC62C\uB9AC\uACE0 \uCC98\uB9AC \uC694\uC57D\xB7\uD589 \uC624\uB958\uB97C \uBC1B\uB294\uB2E4" },
3966
+ { value: "preview", label: "\uBBF8\uB9AC\uBCF4\uAE30 \uAC80\uC99D", description: "\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uD30C\uC2F1\xB7\uAC80\uC99D\uD558\uACE0 \uC624\uB958 \uC140\uC744 \uC778\uB77C\uC778 \uC218\uC815\uD55C \uB4A4 \uC720\uD6A8 \uD589\uB9CC \uBCF4\uB0B8\uB2E4" }
3967
+ ],
3968
+ group: "behavior"
3969
+ },
3970
+ // 실측 8/8 (preview×5, server×3)
3971
+ {
3972
+ name: "endpoint",
3973
+ kind: "string",
3974
+ label: "\uC5C5\uB85C\uB4DC \uACBD\uB85C",
3975
+ description: "server\uBA74 \uD30C\uC77C multipart POST \uB300\uC0C1, preview\uBA74 \uAC80\uC99D\uB41C { rows } JSON POST \uB300\uC0C1.",
3976
+ group: "data"
3977
+ },
3978
+ // 실측 7/8
3979
+ {
3980
+ name: "templateColumns",
3981
+ kind: "array",
3982
+ label: "\uD15C\uD50C\uB9BF \uCEEC\uB7FC",
3983
+ description: "\uC788\uC73C\uBA74 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uD15C\uD50C\uB9BF xlsx\uB97C \uB9CC\uB4E0\uB2E4(\uBC31\uC5D4\uB4DC \uBD88\uD544\uC694). 2\uD589\uC5D0 \uC608\uC2DC\uAC12\uC774 \uB4E4\uC5B4\uAC04\uB2E4.",
3984
+ group: "data",
3985
+ // 실측 8/8, 원소 54개 — key·header·example 세 키가 모두 54/54로 항상 채워져 있다.
3986
+ item: [
3987
+ { name: "key", kind: "string", label: "\uD0A4", required: true },
3988
+ { name: "header", kind: "string", label: "\uD5E4\uB354", required: true },
3989
+ { name: "example", kind: "string", label: "\uC608\uC2DC\uAC12", description: "\uD15C\uD50C\uB9BF 2\uD589\uC5D0 \uB4E4\uC5B4\uAC04\uB2E4." }
3990
+ ]
3991
+ },
3992
+ {
3993
+ name: "columns",
3994
+ kind: "array",
3995
+ label: "\uAC80\uC99D \uC2A4\uD0A4\uB9C8",
3996
+ description: "preview \uBAA8\uB4DC\uC758 \uD30C\uC2F1\xB7\uAC80\uC99D \uAE30\uC900. \uC2E4\uCE21\uC0C1 preview \uC778\uC2A4\uD134\uC2A4 5\uAC1C\uC640 \uC815\uD655\uD788 \uC77C\uCE58\uD55C\uB2E4.",
3997
+ group: "data",
3998
+ // 실측 5/8, 원소 34개 — key·header 34/34, required 17/34(값은 전부 true), options 9/34.
3999
+ item: [
4000
+ { name: "key", kind: "string", label: "\uD0A4", required: true },
4001
+ { name: "header", kind: "string", label: "\uC5D1\uC140 \uD5E4\uB354", required: true, description: "\uD55C\uAD6D\uC5B4 \uBCC4\uCE6D. key\uC640\uB3C4 \uB9E4\uCE6D\uB41C\uB2E4." },
4002
+ { name: "required", kind: "boolean", label: "\uD544\uC218", default: false },
4003
+ {
4004
+ name: "options",
4005
+ kind: "array",
4006
+ label: "\uD5C8\uC6A9\uAC12",
4007
+ description: "\uC788\uC73C\uBA74 \uC624\uB958 \uC140\uC744 Select\uB85C, \uC5C6\uC73C\uBA74 Input\uC73C\uB85C \uACE0\uCE5C\uB2E4.",
4008
+ item: [],
4009
+ itemKind: "string"
4010
+ }
4011
+ ]
4012
+ },
4013
+ {
4014
+ name: "summaryLabels",
4015
+ kind: "object",
4016
+ label: "\uC694\uC57D \uD0C0\uC77C \uB77C\uBCA8",
4017
+ // fields를 적지 않아 자유 JSON으로 둔다 — 키가 백엔드 응답의 숫자 필드 이름이라
4018
+ // 엔드포인트마다 다르다. 실측에서도 rows(3)·createdUnits(2) 외에 skippedRows·
4019
+ // createdAssets·skippedUnits·createdBorrows·skippedBorrows가 각 1회씩으로 전부 달랐다.
4020
+ description: "\uC11C\uBC84 \uC751\uB2F5\uC758 \uC22B\uC790 \uD544\uB4DC \uC774\uB984 \u2192 \uC694\uC57D \uD0C0\uC77C\uC5D0 \uC4F8 \uB77C\uBCA8. server \uBAA8\uB4DC\uC5D0\uC11C\uB9CC \uC4F0\uC778\uB2E4.",
4021
+ group: "content"
4022
+ },
4023
+ // 실측 3/8 — server 인스턴스 3개와 일치
4024
+ {
4025
+ name: "templateEndpoint",
4026
+ kind: "string",
4027
+ label: "\uD15C\uD50C\uB9BF \uB2E4\uC6B4\uB85C\uB4DC \uACBD\uB85C",
4028
+ description: "templateColumns\uAC00 \uC5C6\uC744 \uB54C\uB9CC \uC4F0\uC778\uB2E4(blob \uB2E4\uC6B4\uB85C\uB4DC).",
4029
+ group: "data",
4030
+ advanced: true
4031
+ },
4032
+ // 실측 0/8 — 구현에는 있다
4033
+ {
4034
+ name: "onComplete",
4035
+ kind: "action",
4036
+ label: "\uC644\uB8CC",
4037
+ eventArg: "server\uBA74 \uC751\uB2F5 JSON, preview\uBA74 \uC11C\uBC84 \uC751\uB2F5 \uB610\uB294 \uAC80\uC99D\uB41C \uC720\uD6A8 \uD589 \uBC30\uC5F4",
4038
+ group: "behavior"
4039
+ }
4040
+ // 실측 5/8 — 단일 toast×3, 액션 배열×2(close→toast)
4041
+ ],
4042
+ children: { accepts: false },
4043
+ dom: { element: "div" },
4044
+ // 실측: 루트가 라이브러리 Card → <div class="wp-card">
4045
+ // 프리셋에 endpoint·templateEndpoint를 넣지 않는다. 이 조합이면 템플릿은 브라우저에서
4046
+ // xlsx로 만들고, 가져오기도 onComplete만 부른다 → 바깥으로 나가는 요청이 0건이다.
4047
+ preset: {
4048
+ component: "ExcelUploadCard",
4049
+ props: {
4050
+ mode: "preview",
4051
+ templateColumns: [
4052
+ { key: "name", header: "\uD488\uBAA9\uBA85", example: "\uB178\uD2B8\uBD81" },
4053
+ { key: "qty", header: "\uC218\uB7C9", example: "3" }
4054
+ ],
4055
+ columns: [
4056
+ { key: "name", header: "\uD488\uBAA9\uBA85", required: true },
4057
+ { key: "qty", header: "\uC218\uB7C9", required: true }
4058
+ ]
4059
+ }
4060
+ },
4061
+ resize: { kind: "none" }
4062
+ };
3842
4063
  var AutocompleteFieldMeta = {
3843
4064
  name: "AutocompleteField",
3844
4065
  label: "\uC790\uB3D9\uC644\uC131",
@@ -5259,6 +5480,8 @@ var widgetComponentMeta = {
5259
5480
  ApprovalLineEditor: ApprovalLineEditorMeta,
5260
5481
  ApprovalOverridesEditor: ApprovalOverridesEditorMeta,
5261
5482
  ApprovalStepper: ApprovalStepperMeta,
5483
+ ExcelUploadCard: ExcelUploadCardMeta,
5484
+ FileDropzone: FileDropzoneMeta,
5262
5485
  PermissionMatrixEditor: PermissionMatrixEditorMeta,
5263
5486
  RoleMemberPicker: RoleMemberPickerMeta,
5264
5487
  OrgChartBoard: OrgChartBoardMeta,
@@ -5320,4 +5543,4 @@ function paletteGroups(catalog = allComponentMeta) {
5320
5543
  })).filter((group) => group.items.length > 0);
5321
5544
  }
5322
5545
 
5323
- export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
5546
+ export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, ExcelUploadCardMeta, FieldMeta, FileDropzoneMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
@@ -0,0 +1,37 @@
1
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
2
+ import React__default from 'react';
3
+
4
+ interface ExcelTemplateColumn {
5
+ key: string;
6
+ header: string;
7
+ /** 템플릿 2행에 들어갈 예시값 */
8
+ example?: string;
9
+ }
10
+ interface ExcelPreviewColumn {
11
+ key: string;
12
+ /** 엑셀 헤더(한국어 별칭). key와도 매칭된다. */
13
+ header: string;
14
+ required?: boolean;
15
+ /** 허용값 목록 — 있으면 오류 셀을 Select로 수정 */
16
+ options?: string[];
17
+ }
18
+ interface ExcelUploadCardProps {
19
+ /** server = 파일을 서버로 바로 업로드, preview = 클라이언트 파싱·검증 후 가져오기 */
20
+ mode?: 'server' | 'preview';
21
+ /** server: multipart POST 대상 / preview: 검증된 rows JSON POST 대상 */
22
+ endpoint?: string;
23
+ /** 템플릿 다운로드 GET 경로 (templateColumns 없을 때 사용) */
24
+ templateEndpoint?: string;
25
+ /** 있으면 클라이언트에서 템플릿 xlsx 생성 — 백엔드 없이 동작 */
26
+ templateColumns?: ExcelTemplateColumn[];
27
+ /** preview 모드 파싱·검증 스키마 */
28
+ columns?: ExcelPreviewColumn[];
29
+ /** server 응답 요약 타일 라벨 매핑 (응답 키 → 라벨) */
30
+ summaryLabels?: Record<string, string>;
31
+ /** server: 응답 JSON / preview: 서버 응답(없으면 유효 행 배열) */
32
+ onComplete?: (result: unknown) => void;
33
+ }
34
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다 — 자기 축(폭·여백)이 닿게 하는 통로. */
35
+ declare const ExcelUploadCard: React__default.FC<ExcelUploadCardProps & SduiBoxProps>;
36
+
37
+ export { type ExcelPreviewColumn, type ExcelTemplateColumn, ExcelUploadCard, type ExcelUploadCardProps };