@tipp/ui 2.3.23 → 2.3.24

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.
Files changed (138) hide show
  1. package/dist/app/index.js +100 -99
  2. package/dist/app/platform/coach-question-list.js +29 -29
  3. package/dist/app/platform/contents-card.js +29 -29
  4. package/dist/app/platform/curriculum-card.js +6 -6
  5. package/dist/app/platform/edit-coaching-time.js +78 -77
  6. package/dist/app/platform/edit-service-type.js +79 -78
  7. package/dist/app/platform/goal-manage-card-edit.js +78 -77
  8. package/dist/app/platform/goal-manage-card-read.js +29 -29
  9. package/dist/app/platform/on-offline-radio-card.js +78 -77
  10. package/dist/app/platform/report-card.js +29 -29
  11. package/dist/app/platform/reservation-card.js +79 -78
  12. package/dist/app/platform/session-card.js +81 -80
  13. package/dist/app/platform/session-review-simple-read.js +29 -29
  14. package/dist/app/platform/userInfos/coaching-customer-info/index.js +32 -32
  15. package/dist/app/platform/userInfos/coaching-customer-info/large.js +29 -29
  16. package/dist/app/platform/userInfos/coaching-customer-info/medium.js +29 -29
  17. package/dist/app/platform/userInfos/coaching-customer-info/small.js +29 -29
  18. package/dist/app/platform/userInfos/session-user-info-detail.js +29 -29
  19. package/dist/app/platform/userInfos/utils.js +28 -28
  20. package/dist/atoms/bullet-text.js +2 -2
  21. package/dist/atoms/dialog.js +2 -2
  22. package/dist/atoms/field-error-wrapper.js +2 -2
  23. package/dist/atoms/index.js +62 -62
  24. package/dist/atoms/list.js +2 -2
  25. package/dist/atoms/pagination.js +3 -3
  26. package/dist/chunk-3JADWKXT.js +230 -0
  27. package/dist/chunk-3JADWKXT.js.map +1 -0
  28. package/dist/chunk-6UXCNYVO.js +106 -0
  29. package/dist/chunk-6UXCNYVO.js.map +1 -0
  30. package/dist/chunk-77H5BUYO.js +55 -0
  31. package/dist/chunk-77H5BUYO.js.map +1 -0
  32. package/dist/chunk-7FIDFRJL.js +196 -0
  33. package/dist/chunk-7FIDFRJL.js.map +1 -0
  34. package/dist/chunk-ABMGYODX.js +196 -0
  35. package/dist/chunk-ABMGYODX.js.map +1 -0
  36. package/dist/chunk-ADLR7QZR.js +69 -0
  37. package/dist/chunk-ADLR7QZR.js.map +1 -0
  38. package/dist/chunk-BP5FU7EO.js +196 -0
  39. package/dist/chunk-BP5FU7EO.js.map +1 -0
  40. package/dist/chunk-E5W5TCRU.js +89 -0
  41. package/dist/chunk-E5W5TCRU.js.map +1 -0
  42. package/dist/chunk-FZ4F7FCO.js +63 -0
  43. package/dist/chunk-FZ4F7FCO.js.map +1 -0
  44. package/dist/chunk-HFVVQEOZ.js +1 -0
  45. package/dist/chunk-HFVVQEOZ.js.map +1 -0
  46. package/dist/chunk-I46BFZL6.js +69 -0
  47. package/dist/chunk-I46BFZL6.js.map +1 -0
  48. package/dist/chunk-JQH27TXL.js +89 -0
  49. package/dist/chunk-JQH27TXL.js.map +1 -0
  50. package/dist/chunk-K7LTEKQS.js +56 -0
  51. package/dist/chunk-K7LTEKQS.js.map +1 -0
  52. package/dist/chunk-SKA66SQI.js +144 -0
  53. package/dist/chunk-SKA66SQI.js.map +1 -0
  54. package/dist/chunk-TQMIIK56.js +230 -0
  55. package/dist/chunk-TQMIIK56.js.map +1 -0
  56. package/dist/chunk-XB2GOVFT.js +69 -0
  57. package/dist/chunk-XB2GOVFT.js.map +1 -0
  58. package/dist/chunk-Y7I4BEAO.js +69 -0
  59. package/dist/chunk-Y7I4BEAO.js.map +1 -0
  60. package/dist/context/index.js +5 -5
  61. package/dist/index.cjs +59 -34
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +1 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +159 -155
  66. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.js +16 -16
  67. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-comp.js +4 -4
  68. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.js +9 -9
  69. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-footer.js +2 -2
  70. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-header.js +3 -3
  71. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-layout.js +2 -2
  72. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-radio.js +5 -5
  73. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-option.js +5 -5
  74. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-text.js +5 -5
  75. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-text.js +5 -5
  76. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/complete-review.js +4 -4
  77. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +20 -20
  78. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/start-review.js +6 -6
  79. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-ai-traning.js +3 -3
  80. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-file-download.js +3 -3
  81. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +22 -22
  82. package/dist/molecules/curriculumV2/CurriculumContents/index.js +26 -26
  83. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/curriculum-item-title.js +2 -2
  84. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/section-item.js +4 -4
  85. package/dist/molecules/curriculumV2/CurriculumSidebar/index.js +8 -8
  86. package/dist/molecules/curriculumV2/CurriculumSidebar/sidebar-item.js +5 -5
  87. package/dist/molecules/curriculumV2/curriculum-sub-nav.js +4 -4
  88. package/dist/molecules/curriculumV2/curriculum-v2-layout.js +2 -2
  89. package/dist/molecules/curriculumV2/index.js +35 -35
  90. package/dist/molecules/date-picker/date-picker-button.js +6 -6
  91. package/dist/molecules/date-picker/index.js +5 -5
  92. package/dist/molecules/description-json-render.js +5 -5
  93. package/dist/molecules/download-card.js +2 -2
  94. package/dist/molecules/dynamic-field.js +5 -5
  95. package/dist/molecules/dynamic-form-editor-field-editor-panel.js +4 -4
  96. package/dist/molecules/dynamic-form-editor-field-list-panel.js +3 -3
  97. package/dist/molecules/dynamic-form-editor-issues-panel.js +3 -3
  98. package/dist/molecules/dynamic-form-editor-preview-panel.js +8 -8
  99. package/dist/molecules/dynamic-form-editor.js +15 -15
  100. package/dist/molecules/dynamic-form-response-item.cjs +59 -34
  101. package/dist/molecules/dynamic-form-response-item.cjs.map +1 -1
  102. package/dist/molecules/dynamic-form-response-item.js +2 -1
  103. package/dist/molecules/dynamic-form.js +6 -6
  104. package/dist/molecules/expand-table/index.js +4 -4
  105. package/dist/molecules/force-refresh.js +2 -2
  106. package/dist/molecules/ghost-post.js +4 -4
  107. package/dist/molecules/index.cjs +57 -34
  108. package/dist/molecules/index.cjs.map +1 -1
  109. package/dist/molecules/index.js +73 -72
  110. package/dist/molecules/learning-post.js +5 -5
  111. package/dist/molecules/navigation.js +3 -3
  112. package/dist/molecules/one-on-one-guide-list.js +3 -3
  113. package/dist/molecules/stepper.js +4 -4
  114. package/dist/molecules/tag-selector.js +5 -5
  115. package/dist/molecules/time-select.js +3 -2
  116. package/dist/molecules/training-info-guideline.js +7 -7
  117. package/dist/utils/get-dynamic-form-display-value.cjs +80 -0
  118. package/dist/utils/get-dynamic-form-display-value.cjs.map +1 -0
  119. package/dist/utils/get-dynamic-form-display-value.d.cts +5 -0
  120. package/dist/utils/get-dynamic-form-display-value.d.ts +5 -0
  121. package/dist/utils/get-dynamic-form-display-value.js +8 -0
  122. package/dist/utils/get-dynamic-form-display-value.js.map +1 -0
  123. package/dist/utils/get-dynamic-form-display-value.test.cjs +124 -0
  124. package/dist/utils/get-dynamic-form-display-value.test.cjs.map +1 -0
  125. package/dist/utils/get-dynamic-form-display-value.test.d.cts +2 -0
  126. package/dist/utils/get-dynamic-form-display-value.test.d.ts +2 -0
  127. package/dist/utils/get-dynamic-form-display-value.test.js +75 -0
  128. package/dist/utils/get-dynamic-form-display-value.test.js.map +1 -0
  129. package/dist/utils/index.cjs +54 -0
  130. package/dist/utils/index.cjs.map +1 -1
  131. package/dist/utils/index.d.cts +2 -0
  132. package/dist/utils/index.d.ts +2 -0
  133. package/dist/utils/index.js +9 -5
  134. package/package.json +1 -1
  135. package/src/molecules/dynamic-form-response-item.tsx +6 -44
  136. package/src/utils/get-dynamic-form-display-value.test.ts +81 -0
  137. package/src/utils/get-dynamic-form-display-value.ts +74 -0
  138. package/src/utils/index.ts +2 -1
@@ -0,0 +1,230 @@
1
+ import {
2
+ DynamicFormEditorPreviewPanel
3
+ } from "./chunk-ZA4NYPSW.js";
4
+ import {
5
+ DynamicFormEditorFieldEditorPanel
6
+ } from "./chunk-IQUJPIZD.js";
7
+ import {
8
+ DynamicFormEditorFieldListPanel
9
+ } from "./chunk-7R65MUL6.js";
10
+ import {
11
+ createDefaultField,
12
+ createUniqueFieldName,
13
+ duplicateField,
14
+ findFieldIndexByName,
15
+ getFieldTypes,
16
+ hasErrorIssues,
17
+ moveField,
18
+ normalizeSchema,
19
+ updateSchemaFields,
20
+ validateDynamicFormSchema
21
+ } from "./chunk-Z7WNKARH.js";
22
+ import {
23
+ DynamicFormEditorIssuesPanel
24
+ } from "./chunk-AA6OYHCE.js";
25
+ import {
26
+ Flex
27
+ } from "./chunk-25HMMI7R.js";
28
+ import {
29
+ Button
30
+ } from "./chunk-ZVDAEY5Q.js";
31
+ import {
32
+ __spreadProps,
33
+ __spreadValues
34
+ } from "./chunk-CRTRMMJ7.js";
35
+
36
+ // src/molecules/dynamic-form-editor.tsx
37
+ import { useCallback, useEffect, useMemo, useState } from "react";
38
+ import { jsx, jsxs } from "react/jsx-runtime";
39
+ function getInitialSchema(value, defaultValue) {
40
+ if (value !== void 0) return normalizeSchema(value);
41
+ return normalizeSchema(defaultValue);
42
+ }
43
+ function getSelectedField(schema, selectedFieldName) {
44
+ if (!selectedFieldName) return { field: null, index: -1 };
45
+ const index = findFieldIndexByName(schema.fields, selectedFieldName);
46
+ if (index < 0) return { field: null, index: -1 };
47
+ return { field: schema.fields[index], index };
48
+ }
49
+ function DynamicFormEditor(props) {
50
+ const {
51
+ value,
52
+ defaultValue,
53
+ onChange,
54
+ onSave,
55
+ onCancel,
56
+ readonly = false,
57
+ showPreview = false
58
+ } = props;
59
+ const isControlled = value !== void 0;
60
+ const [uncontrolledSchema, setUncontrolledSchema] = useState(
61
+ () => getInitialSchema(void 0, defaultValue)
62
+ );
63
+ const effectiveSchema = useMemo(() => {
64
+ if (isControlled) return normalizeSchema(value);
65
+ return uncontrolledSchema;
66
+ }, [isControlled, uncontrolledSchema, value]);
67
+ const [selectedFieldName, setSelectedFieldName] = useState(() => {
68
+ var _a, _b;
69
+ const initialSchema = getInitialSchema(value, defaultValue);
70
+ return (_b = (_a = initialSchema.fields[0]) == null ? void 0 : _a.name) != null ? _b : null;
71
+ });
72
+ const selected = useMemo(() => {
73
+ return getSelectedField(effectiveSchema, selectedFieldName);
74
+ }, [effectiveSchema, selectedFieldName]);
75
+ const issues = useMemo(() => {
76
+ return validateDynamicFormSchema(effectiveSchema);
77
+ }, [effectiveSchema]);
78
+ const errorFieldNameSet = useMemo(() => {
79
+ const set = /* @__PURE__ */ new Set();
80
+ issues.forEach((i) => {
81
+ if (i.level === "error" && i.fieldName) set.add(i.fieldName);
82
+ });
83
+ return set;
84
+ }, [issues]);
85
+ const hasFieldError = useCallback(
86
+ (fieldName) => {
87
+ return errorFieldNameSet.has(fieldName);
88
+ },
89
+ [errorFieldNameSet]
90
+ );
91
+ const fieldTypes = useMemo(() => getFieldTypes(), []);
92
+ useEffect(() => {
93
+ var _a, _b;
94
+ if (selectedFieldName && selected.field) return;
95
+ setSelectedFieldName((_b = (_a = effectiveSchema.fields[0]) == null ? void 0 : _a.name) != null ? _b : null);
96
+ }, [effectiveSchema.fields, selected.field, selectedFieldName]);
97
+ useEffect(() => {
98
+ if (isControlled) return;
99
+ setUncontrolledSchema(getInitialSchema(void 0, defaultValue));
100
+ }, [defaultValue, isControlled]);
101
+ const applySchema = useCallback(
102
+ (next) => {
103
+ onChange == null ? void 0 : onChange(next);
104
+ if (!isControlled) setUncontrolledSchema(next);
105
+ },
106
+ [isControlled, onChange]
107
+ );
108
+ const handleAddField = useCallback(
109
+ (type) => {
110
+ if (readonly) return;
111
+ const nextField = createDefaultField(type, effectiveSchema.fields);
112
+ const nextFields = [...effectiveSchema.fields, nextField];
113
+ applySchema(updateSchemaFields(effectiveSchema, nextFields));
114
+ setSelectedFieldName(nextField.name);
115
+ },
116
+ [applySchema, effectiveSchema, readonly]
117
+ );
118
+ const handleUpdateSelectedField = useCallback(
119
+ (nextField) => {
120
+ if (readonly) return;
121
+ if (!selected.field || selected.index < 0) return;
122
+ const nextFields = effectiveSchema.fields.map(
123
+ (f, i) => i === selected.index ? nextField : f
124
+ );
125
+ applySchema(updateSchemaFields(effectiveSchema, nextFields));
126
+ },
127
+ [applySchema, effectiveSchema, readonly, selected.field, selected.index]
128
+ );
129
+ const handleRenameSelected = useCallback(
130
+ (nextName) => {
131
+ if (readonly) return;
132
+ const currentField = selected.field;
133
+ if (!currentField) return;
134
+ const others = effectiveSchema.fields.filter(
135
+ (f) => f.name !== currentField.name
136
+ );
137
+ const uniqueName = createUniqueFieldName(others, nextName);
138
+ const nextField = __spreadProps(__spreadValues({}, currentField), { name: uniqueName });
139
+ handleUpdateSelectedField(nextField);
140
+ setSelectedFieldName(uniqueName);
141
+ },
142
+ [effectiveSchema.fields, handleUpdateSelectedField, readonly, selected.field]
143
+ );
144
+ const handleDeleteSelected = useCallback(() => {
145
+ if (readonly) return;
146
+ if (!selected.field || selected.index < 0) return;
147
+ const nextFields = effectiveSchema.fields.filter(
148
+ (_, i) => i !== selected.index
149
+ );
150
+ applySchema(updateSchemaFields(effectiveSchema, nextFields));
151
+ let nextSelected = null;
152
+ if (nextFields.length > selected.index) nextSelected = nextFields[selected.index].name;
153
+ else if (nextFields.length > 0) nextSelected = nextFields[0].name;
154
+ setSelectedFieldName(nextSelected);
155
+ }, [applySchema, effectiveSchema, readonly, selected.field, selected.index]);
156
+ const handleMoveSelected = useCallback(
157
+ (direction) => {
158
+ if (readonly) return;
159
+ if (!selected.field || selected.index < 0) return;
160
+ const toIndex = direction === "up" ? selected.index - 1 : selected.index + 1;
161
+ const nextFields = moveField(
162
+ effectiveSchema.fields,
163
+ selected.index,
164
+ toIndex
165
+ );
166
+ applySchema(updateSchemaFields(effectiveSchema, nextFields));
167
+ },
168
+ [applySchema, effectiveSchema, readonly, selected.field, selected.index]
169
+ );
170
+ const handleDuplicateSelected = useCallback(() => {
171
+ if (readonly) return;
172
+ if (!selected.field || selected.index < 0) return;
173
+ const nextFields = duplicateField(
174
+ effectiveSchema.fields,
175
+ selected.index
176
+ );
177
+ applySchema(updateSchemaFields(effectiveSchema, nextFields));
178
+ const duplicatedIndex = selected.index + 1;
179
+ const nextSelected = nextFields.length > duplicatedIndex ? nextFields[duplicatedIndex].name : selected.field.name;
180
+ setSelectedFieldName(nextSelected);
181
+ }, [applySchema, effectiveSchema, readonly, selected.field, selected.index]);
182
+ const handleSave = useCallback(() => {
183
+ if (!onSave) return;
184
+ const result = onSave(effectiveSchema);
185
+ void result;
186
+ }, [effectiveSchema, onSave]);
187
+ const disableSave = readonly || !onSave || hasErrorIssues(issues);
188
+ return /* @__PURE__ */ jsxs(Flex, { align: "start", gap: "4", style: { width: "100%" }, children: [
189
+ /* @__PURE__ */ jsx(
190
+ DynamicFormEditorFieldListPanel,
191
+ {
192
+ fieldTypes,
193
+ fields: effectiveSchema.fields,
194
+ hasFieldError,
195
+ onAddField: handleAddField,
196
+ onSelectFieldName: setSelectedFieldName,
197
+ readonly,
198
+ selectedFieldName
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "3", style: { flex: 1, minWidth: 520 }, children: [
202
+ /* @__PURE__ */ jsx(
203
+ DynamicFormEditorFieldEditorPanel,
204
+ {
205
+ field: selected.field,
206
+ fieldIndex: selected.index,
207
+ fieldTypes,
208
+ fields: effectiveSchema.fields,
209
+ onDeleteField: handleDeleteSelected,
210
+ onDuplicateField: handleDuplicateSelected,
211
+ onMoveField: handleMoveSelected,
212
+ onRenameField: handleRenameSelected,
213
+ onUpdateField: handleUpdateSelectedField,
214
+ readonly
215
+ }
216
+ ),
217
+ /* @__PURE__ */ jsx(DynamicFormEditorIssuesPanel, { issues }),
218
+ onSave || onCancel ? /* @__PURE__ */ jsxs(Flex, { gap: "2", justify: "end", children: [
219
+ onCancel ? /* @__PURE__ */ jsx(Button, { disabled: readonly, onClick: onCancel, variant: "soft", children: "\uCDE8\uC18C" }) : null,
220
+ onSave ? /* @__PURE__ */ jsx(Button, { disabled: disableSave, onClick: handleSave, children: "\uC800\uC7A5" }) : null
221
+ ] }) : null
222
+ ] }),
223
+ /* @__PURE__ */ jsx(DynamicFormEditorPreviewPanel, { fields: effectiveSchema.fields, show: showPreview })
224
+ ] });
225
+ }
226
+
227
+ export {
228
+ DynamicFormEditor
229
+ };
230
+ //# sourceMappingURL=chunk-TQMIIK56.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/dynamic-form-editor.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Button } from '@/atoms/button';\nimport { Flex } from '@/atoms/flex';\nimport type {\n DynamicFormFieldSchema,\n DynamicFormSchema,\n} from '@/types/dynamic-form-schema-generated';\nimport {\n createDefaultField,\n createUniqueFieldName,\n duplicateField,\n findFieldIndexByName,\n getFieldTypes,\n hasErrorIssues,\n moveField,\n normalizeSchema,\n updateSchemaFields,\n validateDynamicFormSchema,\n type FieldType,\n type SchemaIssue,\n} from './dynamic-form-editor-utils';\nimport { DynamicFormEditorFieldEditorPanel } from './dynamic-form-editor-field-editor-panel';\nimport { DynamicFormEditorFieldListPanel } from './dynamic-form-editor-field-list-panel';\nimport { DynamicFormEditorIssuesPanel } from './dynamic-form-editor-issues-panel';\nimport { DynamicFormEditorPreviewPanel } from './dynamic-form-editor-preview-panel';\n\nfunction getInitialSchema(\n value: DynamicFormSchema | undefined,\n defaultValue: DynamicFormSchema | undefined\n): DynamicFormSchema {\n if (value !== undefined) return normalizeSchema(value);\n return normalizeSchema(defaultValue);\n}\n\nfunction getSelectedField(\n schema: DynamicFormSchema,\n selectedFieldName: string | null\n): { field: DynamicFormFieldSchema | null; index: number } {\n if (!selectedFieldName) return { field: null, index: -1 };\n const index: number = findFieldIndexByName(schema.fields, selectedFieldName);\n if (index < 0) return { field: null, index: -1 };\n return { field: schema.fields[index], index };\n}\n\nexport interface DynamicFormEditorProps {\n value?: DynamicFormSchema;\n defaultValue?: DynamicFormSchema;\n onChange?: (next: DynamicFormSchema) => void;\n onSave?: (next: DynamicFormSchema) => void | Promise<void>;\n onCancel?: () => void;\n readonly?: boolean;\n showPreview?: boolean;\n}\n\nexport function DynamicFormEditor(props: DynamicFormEditorProps): React.ReactElement {\n const {\n value,\n defaultValue,\n onChange,\n onSave,\n onCancel,\n readonly = false,\n showPreview = false,\n } = props;\n\n const isControlled: boolean = value !== undefined;\n\n const [uncontrolledSchema, setUncontrolledSchema] = useState<DynamicFormSchema>(() =>\n getInitialSchema(undefined, defaultValue)\n );\n\n const effectiveSchema: DynamicFormSchema = useMemo(() => {\n if (isControlled) return normalizeSchema(value);\n return uncontrolledSchema;\n }, [isControlled, uncontrolledSchema, value]);\n\n const [selectedFieldName, setSelectedFieldName] = useState<string | null>(() => {\n const initialSchema = getInitialSchema(value, defaultValue);\n return initialSchema.fields[0]?.name ?? null;\n });\n\n const selected = useMemo(() => {\n return getSelectedField(effectiveSchema, selectedFieldName);\n }, [effectiveSchema, selectedFieldName]);\n\n const issues: SchemaIssue[] = useMemo(() => {\n return validateDynamicFormSchema(effectiveSchema);\n }, [effectiveSchema]);\n\n const errorFieldNameSet: Set<string> = useMemo(() => {\n const set = new Set<string>();\n issues.forEach((i) => {\n if (i.level === 'error' && i.fieldName) set.add(i.fieldName);\n });\n return set;\n }, [issues]);\n\n const hasFieldError = useCallback(\n (fieldName: string): boolean => {\n return errorFieldNameSet.has(fieldName);\n },\n [errorFieldNameSet]\n );\n\n const fieldTypes: FieldType[] = useMemo(() => getFieldTypes(), []);\n\n useEffect(() => {\n if (selectedFieldName && selected.field) return;\n setSelectedFieldName(effectiveSchema.fields[0]?.name ?? null);\n }, [effectiveSchema.fields, selected.field, selectedFieldName]);\n\n useEffect(() => {\n if (isControlled) return;\n setUncontrolledSchema(getInitialSchema(undefined, defaultValue));\n }, [defaultValue, isControlled]);\n\n const applySchema = useCallback(\n (next: DynamicFormSchema): void => {\n onChange?.(next);\n if (!isControlled) setUncontrolledSchema(next);\n },\n [isControlled, onChange]\n );\n\n const handleAddField = useCallback(\n (type: FieldType): void => {\n if (readonly) return;\n const nextField: DynamicFormFieldSchema = createDefaultField(type, effectiveSchema.fields);\n const nextFields: DynamicFormFieldSchema[] = [...effectiveSchema.fields, nextField];\n applySchema(updateSchemaFields(effectiveSchema, nextFields));\n setSelectedFieldName(nextField.name);\n },\n [applySchema, effectiveSchema, readonly]\n );\n\n const handleUpdateSelectedField = useCallback(\n (nextField: DynamicFormFieldSchema): void => {\n if (readonly) return;\n if (!selected.field || selected.index < 0) return;\n const nextFields: DynamicFormFieldSchema[] = effectiveSchema.fields.map((f, i) =>\n i === selected.index ? nextField : f\n );\n applySchema(updateSchemaFields(effectiveSchema, nextFields));\n },\n [applySchema, effectiveSchema, readonly, selected.field, selected.index]\n );\n\n const handleRenameSelected = useCallback(\n (nextName: string): void => {\n if (readonly) return;\n const currentField = selected.field;\n if (!currentField) return;\n\n const others: DynamicFormFieldSchema[] = effectiveSchema.fields.filter(\n (f) => f.name !== currentField.name\n );\n const uniqueName: string = createUniqueFieldName(others, nextName);\n const nextField: DynamicFormFieldSchema = { ...currentField, name: uniqueName };\n handleUpdateSelectedField(nextField);\n setSelectedFieldName(uniqueName);\n },\n [effectiveSchema.fields, handleUpdateSelectedField, readonly, selected.field]\n );\n\n const handleDeleteSelected = useCallback((): void => {\n if (readonly) return;\n if (!selected.field || selected.index < 0) return;\n const nextFields: DynamicFormFieldSchema[] = effectiveSchema.fields.filter(\n (_, i) => i !== selected.index\n );\n applySchema(updateSchemaFields(effectiveSchema, nextFields));\n let nextSelected: string | null = null;\n if (nextFields.length > selected.index) nextSelected = nextFields[selected.index].name;\n else if (nextFields.length > 0) nextSelected = nextFields[0].name;\n setSelectedFieldName(nextSelected);\n }, [applySchema, effectiveSchema, readonly, selected.field, selected.index]);\n\n const handleMoveSelected = useCallback(\n (direction: 'up' | 'down'): void => {\n if (readonly) return;\n if (!selected.field || selected.index < 0) return;\n const toIndex: number = direction === 'up' ? selected.index - 1 : selected.index + 1;\n const nextFields: DynamicFormFieldSchema[] = moveField(\n effectiveSchema.fields,\n selected.index,\n toIndex\n );\n applySchema(updateSchemaFields(effectiveSchema, nextFields));\n },\n [applySchema, effectiveSchema, readonly, selected.field, selected.index]\n );\n\n const handleDuplicateSelected = useCallback((): void => {\n if (readonly) return;\n if (!selected.field || selected.index < 0) return;\n const nextFields: DynamicFormFieldSchema[] = duplicateField(\n effectiveSchema.fields,\n selected.index\n );\n applySchema(updateSchemaFields(effectiveSchema, nextFields));\n const duplicatedIndex: number = selected.index + 1;\n const nextSelected: string =\n nextFields.length > duplicatedIndex\n ? nextFields[duplicatedIndex].name\n : selected.field.name;\n setSelectedFieldName(nextSelected);\n }, [applySchema, effectiveSchema, readonly, selected.field, selected.index]);\n\n const handleSave = useCallback((): void => {\n if (!onSave) return;\n const result = onSave(effectiveSchema);\n void result;\n }, [effectiveSchema, onSave]);\n\n const disableSave: boolean = readonly || !onSave || hasErrorIssues(issues);\n\n return (\n <Flex align=\"start\" gap=\"4\" style={{ width: '100%' }}>\n <DynamicFormEditorFieldListPanel\n fieldTypes={fieldTypes}\n fields={effectiveSchema.fields}\n hasFieldError={hasFieldError}\n onAddField={handleAddField}\n onSelectFieldName={setSelectedFieldName}\n readonly={readonly}\n selectedFieldName={selectedFieldName}\n />\n\n <Flex direction=\"column\" gap=\"3\" style={{ flex: 1, minWidth: 520 }}>\n <DynamicFormEditorFieldEditorPanel\n field={selected.field}\n fieldIndex={selected.index}\n fieldTypes={fieldTypes}\n fields={effectiveSchema.fields}\n onDeleteField={handleDeleteSelected}\n onDuplicateField={handleDuplicateSelected}\n onMoveField={handleMoveSelected}\n onRenameField={handleRenameSelected}\n onUpdateField={handleUpdateSelectedField}\n readonly={readonly}\n />\n\n <DynamicFormEditorIssuesPanel issues={issues} />\n\n {(onSave || onCancel) ? <Flex gap=\"2\" justify=\"end\">\n {onCancel ? (\n <Button disabled={readonly} onClick={onCancel} variant=\"soft\">\n 취소\n </Button>\n ) : null}\n {onSave ? (\n <Button disabled={disableSave} onClick={handleSave}>\n 저장\n </Button>\n ) : null}\n </Flex> : null}\n </Flex>\n\n <DynamicFormEditorPreviewPanel fields={effectiveSchema.fields} show={showPreview} />\n </Flex>\n );\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,aAAa,WAAW,SAAS,gBAAgB;AA0N3D,cA0B0B,YA1B1B;AAhMN,SAAS,iBACP,OACA,cACmB;AACnB,MAAI,UAAU,OAAW,QAAO,gBAAgB,KAAK;AACrD,SAAO,gBAAgB,YAAY;AACrC;AAEA,SAAS,iBACP,QACA,mBACyD;AACzD,MAAI,CAAC,kBAAmB,QAAO,EAAE,OAAO,MAAM,OAAO,GAAG;AACxD,QAAM,QAAgB,qBAAqB,OAAO,QAAQ,iBAAiB;AAC3E,MAAI,QAAQ,EAAG,QAAO,EAAE,OAAO,MAAM,OAAO,GAAG;AAC/C,SAAO,EAAE,OAAO,OAAO,OAAO,KAAK,GAAG,MAAM;AAC9C;AAYO,SAAS,kBAAkB,OAAmD;AACnF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,EAChB,IAAI;AAEJ,QAAM,eAAwB,UAAU;AAExC,QAAM,CAAC,oBAAoB,qBAAqB,IAAI;AAAA,IAA4B,MAC9E,iBAAiB,QAAW,YAAY;AAAA,EAC1C;AAEA,QAAM,kBAAqC,QAAQ,MAAM;AACvD,QAAI,aAAc,QAAO,gBAAgB,KAAK;AAC9C,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,oBAAoB,KAAK,CAAC;AAE5C,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAwB,MAAM;AA5ElF;AA6EI,UAAM,gBAAgB,iBAAiB,OAAO,YAAY;AAC1D,YAAO,yBAAc,OAAO,CAAC,MAAtB,mBAAyB,SAAzB,YAAiC;AAAA,EAC1C,CAAC;AAED,QAAM,WAAW,QAAQ,MAAM;AAC7B,WAAO,iBAAiB,iBAAiB,iBAAiB;AAAA,EAC5D,GAAG,CAAC,iBAAiB,iBAAiB,CAAC;AAEvC,QAAM,SAAwB,QAAQ,MAAM;AAC1C,WAAO,0BAA0B,eAAe;AAAA,EAClD,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,oBAAiC,QAAQ,MAAM;AACnD,UAAM,MAAM,oBAAI,IAAY;AAC5B,WAAO,QAAQ,CAAC,MAAM;AACpB,UAAI,EAAE,UAAU,WAAW,EAAE,UAAW,KAAI,IAAI,EAAE,SAAS;AAAA,IAC7D,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,gBAAgB;AAAA,IACpB,CAAC,cAA+B;AAC9B,aAAO,kBAAkB,IAAI,SAAS;AAAA,IACxC;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,aAA0B,QAAQ,MAAM,cAAc,GAAG,CAAC,CAAC;AAEjE,YAAU,MAAM;AA1GlB;AA2GI,QAAI,qBAAqB,SAAS,MAAO;AACzC,0BAAqB,2BAAgB,OAAO,CAAC,MAAxB,mBAA2B,SAA3B,YAAmC,IAAI;AAAA,EAC9D,GAAG,CAAC,gBAAgB,QAAQ,SAAS,OAAO,iBAAiB,CAAC;AAE9D,YAAU,MAAM;AACd,QAAI,aAAc;AAClB,0BAAsB,iBAAiB,QAAW,YAAY,CAAC;AAAA,EACjE,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,QAAM,cAAc;AAAA,IAClB,CAAC,SAAkC;AACjC,2CAAW;AACX,UAAI,CAAC,aAAc,uBAAsB,IAAI;AAAA,IAC/C;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,EACzB;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,SAA0B;AACzB,UAAI,SAAU;AACd,YAAM,YAAoC,mBAAmB,MAAM,gBAAgB,MAAM;AACzF,YAAM,aAAuC,CAAC,GAAG,gBAAgB,QAAQ,SAAS;AAClF,kBAAY,mBAAmB,iBAAiB,UAAU,CAAC;AAC3D,2BAAqB,UAAU,IAAI;AAAA,IACrC;AAAA,IACA,CAAC,aAAa,iBAAiB,QAAQ;AAAA,EACzC;AAEA,QAAM,4BAA4B;AAAA,IAChC,CAAC,cAA4C;AAC3C,UAAI,SAAU;AACd,UAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,EAAG;AAC3C,YAAM,aAAuC,gBAAgB,OAAO;AAAA,QAAI,CAAC,GAAG,MAC1E,MAAM,SAAS,QAAQ,YAAY;AAAA,MACrC;AACA,kBAAY,mBAAmB,iBAAiB,UAAU,CAAC;AAAA,IAC7D;AAAA,IACA,CAAC,aAAa,iBAAiB,UAAU,SAAS,OAAO,SAAS,KAAK;AAAA,EACzE;AAEA,QAAM,uBAAuB;AAAA,IAC3B,CAAC,aAA2B;AAC1B,UAAI,SAAU;AACd,YAAM,eAAe,SAAS;AAC9B,UAAI,CAAC,aAAc;AAEnB,YAAM,SAAmC,gBAAgB,OAAO;AAAA,QAC9D,CAAC,MAAM,EAAE,SAAS,aAAa;AAAA,MACjC;AACA,YAAM,aAAqB,sBAAsB,QAAQ,QAAQ;AACjE,YAAM,YAAoC,iCAAK,eAAL,EAAmB,MAAM,WAAW;AAC9E,gCAA0B,SAAS;AACnC,2BAAqB,UAAU;AAAA,IACjC;AAAA,IACA,CAAC,gBAAgB,QAAQ,2BAA2B,UAAU,SAAS,KAAK;AAAA,EAC9E;AAEA,QAAM,uBAAuB,YAAY,MAAY;AACnD,QAAI,SAAU;AACd,QAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,EAAG;AAC3C,UAAM,aAAuC,gBAAgB,OAAO;AAAA,MAClE,CAAC,GAAG,MAAM,MAAM,SAAS;AAAA,IAC3B;AACA,gBAAY,mBAAmB,iBAAiB,UAAU,CAAC;AAC3D,QAAI,eAA8B;AAClC,QAAI,WAAW,SAAS,SAAS,MAAO,gBAAe,WAAW,SAAS,KAAK,EAAE;AAAA,aACzE,WAAW,SAAS,EAAG,gBAAe,WAAW,CAAC,EAAE;AAC7D,yBAAqB,YAAY;AAAA,EACnC,GAAG,CAAC,aAAa,iBAAiB,UAAU,SAAS,OAAO,SAAS,KAAK,CAAC;AAE3E,QAAM,qBAAqB;AAAA,IACzB,CAAC,cAAmC;AAClC,UAAI,SAAU;AACd,UAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,EAAG;AAC3C,YAAM,UAAkB,cAAc,OAAO,SAAS,QAAQ,IAAI,SAAS,QAAQ;AACnF,YAAM,aAAuC;AAAA,QAC3C,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT;AAAA,MACF;AACA,kBAAY,mBAAmB,iBAAiB,UAAU,CAAC;AAAA,IAC7D;AAAA,IACA,CAAC,aAAa,iBAAiB,UAAU,SAAS,OAAO,SAAS,KAAK;AAAA,EACzE;AAEA,QAAM,0BAA0B,YAAY,MAAY;AACtD,QAAI,SAAU;AACd,QAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,EAAG;AAC3C,UAAM,aAAuC;AAAA,MAC3C,gBAAgB;AAAA,MAChB,SAAS;AAAA,IACX;AACA,gBAAY,mBAAmB,iBAAiB,UAAU,CAAC;AAC3D,UAAM,kBAA0B,SAAS,QAAQ;AACjD,UAAM,eACJ,WAAW,SAAS,kBAChB,WAAW,eAAe,EAAE,OAC5B,SAAS,MAAM;AACrB,yBAAqB,YAAY;AAAA,EACnC,GAAG,CAAC,aAAa,iBAAiB,UAAU,SAAS,OAAO,SAAS,KAAK,CAAC;AAE3E,QAAM,aAAa,YAAY,MAAY;AACzC,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,OAAO,eAAe;AACrC,SAAK;AAAA,EACP,GAAG,CAAC,iBAAiB,MAAM,CAAC;AAE5B,QAAM,cAAuB,YAAY,CAAC,UAAU,eAAe,MAAM;AAEzE,SACE,qBAAC,QAAK,OAAM,SAAQ,KAAI,KAAI,OAAO,EAAE,OAAO,OAAO,GACjD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,gBAAgB;AAAA,QACxB;AAAA,QACA,YAAY;AAAA,QACZ,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,QAAK,WAAU,UAAS,KAAI,KAAI,OAAO,EAAE,MAAM,GAAG,UAAU,IAAI,GAC/D;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB,YAAY,SAAS;AAAA,UACrB;AAAA,UACA,QAAQ,gBAAgB;AAAA,UACxB,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,aAAa;AAAA,UACb,eAAe;AAAA,UACf,eAAe;AAAA,UACf;AAAA;AAAA,MACF;AAAA,MAEA,oBAAC,gCAA6B,QAAgB;AAAA,MAE5C,UAAU,WAAY,qBAAC,QAAK,KAAI,KAAI,SAAQ,OACzC;AAAA,mBACC,oBAAC,UAAO,UAAU,UAAU,SAAS,UAAU,SAAQ,QAAO,0BAE9D,IACE;AAAA,QACH,SACC,oBAAC,UAAO,UAAU,aAAa,SAAS,YAAY,0BAEpD,IACE;AAAA,SACN,IAAU;AAAA,OACd;AAAA,IAEA,oBAAC,iCAA8B,QAAQ,gBAAgB,QAAQ,MAAM,aAAa;AAAA,KACpF;AAEJ;","names":[]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ curriculum_review_default
3
+ } from "./chunk-ABMGYODX.js";
4
+ import {
5
+ curriculum_video_default
6
+ } from "./chunk-KFUBWOCN.js";
7
+ import {
8
+ curriculum_ai_traning_default
9
+ } from "./chunk-ULZHPTB5.js";
10
+ import {
11
+ curriculum_file_download_default
12
+ } from "./chunk-ZFTQ2XBH.js";
13
+ import {
14
+ useCurriculumContext
15
+ } from "./chunk-WA5A2GB4.js";
16
+ import {
17
+ Typo
18
+ } from "./chunk-PMJIFLDT.js";
19
+ import {
20
+ Flex
21
+ } from "./chunk-25HMMI7R.js";
22
+ import {
23
+ InfoCircledIcon
24
+ } from "./chunk-LTEJYJUM.js";
25
+
26
+ // src/molecules/curriculumV2/CurriculumContents/index.tsx
27
+ import { jsx, jsxs } from "react/jsx-runtime";
28
+ function CurriculumBody() {
29
+ const { selectedItem, selectedSectionTitle } = useCurriculumContext();
30
+ switch (selectedItem.type) {
31
+ case "video":
32
+ return /* @__PURE__ */ jsx(curriculum_video_default, { item: selectedItem });
33
+ case "review":
34
+ return /* @__PURE__ */ jsx(
35
+ curriculum_review_default,
36
+ {
37
+ item: selectedItem,
38
+ sectionTitle: selectedSectionTitle == null ? void 0 : selectedSectionTitle.title
39
+ }
40
+ );
41
+ case "aiTraining":
42
+ return /* @__PURE__ */ jsx(curriculum_ai_traning_default, { item: selectedItem });
43
+ case "fileDownload":
44
+ return /* @__PURE__ */ jsx(curriculum_file_download_default, { item: selectedItem });
45
+ default:
46
+ return /* @__PURE__ */ jsxs(
47
+ Flex,
48
+ {
49
+ align: "center",
50
+ direction: "column",
51
+ gap: "2",
52
+ height: "100%",
53
+ justify: "center",
54
+ width: "100%",
55
+ children: [
56
+ /* @__PURE__ */ jsx(InfoCircledIcon, { height: 24, width: 24 }),
57
+ /* @__PURE__ */ jsx(Typo, { children: "\uCEE8\uD150\uCE20\uB97C \uB85C\uB529 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4" }),
58
+ /* @__PURE__ */ jsx(Typo, { align: "center", color: "gray", variant: "caption", children: `[debug info]
59
+ ${JSON.stringify(selectedItem)}` })
60
+ ]
61
+ }
62
+ );
63
+ }
64
+ }
65
+
66
+ export {
67
+ CurriculumBody
68
+ };
69
+ //# sourceMappingURL=chunk-XB2GOVFT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/curriculumV2/CurriculumContents/index.tsx"],"sourcesContent":["import React from 'react';\nimport { Flex } from '@/atoms/flex';\nimport { Typo } from '@/atoms/typo';\nimport { InfoCircledIcon } from '@/icon';\nimport { useCurriculumContext } from '../curriculum-context';\nimport CurriculumVideo from './curriculum-video';\nimport CurriculumReview from './curriculum-review';\nimport CurriculumAiTraning from './curriculum-ai-traning';\nimport CurriculumFileDownload from './curriculum-file-download';\n\nexport function CurriculumBody(): React.ReactNode {\n const { selectedItem, selectedSectionTitle } = useCurriculumContext();\n\n switch (selectedItem.type) {\n case 'video':\n return <CurriculumVideo item={selectedItem} />;\n case 'review':\n return (\n <CurriculumReview\n item={selectedItem}\n sectionTitle={selectedSectionTitle?.title}\n />\n );\n case 'aiTraining':\n return <CurriculumAiTraning item={selectedItem} />;\n case 'fileDownload':\n return <CurriculumFileDownload item={selectedItem} />;\n default:\n return (\n <Flex\n align=\"center\"\n direction=\"column\"\n gap=\"2\"\n height=\"100%\"\n justify=\"center\"\n width=\"100%\"\n >\n <InfoCircledIcon height={24} width={24} />\n <Typo>컨텐츠를 로딩 할 수 없습니다</Typo>\n <Typo align=\"center\" color=\"gray\" variant=\"caption\">\n {`[debug info]\n ${JSON.stringify(selectedItem)}`}\n </Typo>\n </Flex>\n );\n }\n} "],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAea,cAcL,YAdK;AALN,SAAS,iBAAkC;AAChD,QAAM,EAAE,cAAc,qBAAqB,IAAI,qBAAqB;AAEpE,UAAQ,aAAa,MAAM;AAAA,IACzB,KAAK;AACH,aAAO,oBAAC,4BAAgB,MAAM,cAAc;AAAA,IAC9C,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,cAAc,6DAAsB;AAAA;AAAA,MACtC;AAAA,IAEJ,KAAK;AACH,aAAO,oBAAC,iCAAoB,MAAM,cAAc;AAAA,IAClD,KAAK;AACH,aAAO,oBAAC,oCAAuB,MAAM,cAAc;AAAA,IACrD;AACE,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,KAAI;AAAA,UACJ,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,OAAM;AAAA,UAEN;AAAA,gCAAC,mBAAgB,QAAQ,IAAI,OAAO,IAAI;AAAA,YACxC,oBAAC,QAAK,0FAAgB;AAAA,YACtB,oBAAC,QAAK,OAAM,UAAS,OAAM,QAAO,SAAQ,WACvC;AAAA,cACC,KAAK,UAAU,YAAY,CAAC,IAChC;AAAA;AAAA;AAAA,MACF;AAAA,EAEN;AACF;","names":[]}
@@ -0,0 +1,69 @@
1
+ import {
2
+ curriculum_ai_traning_default
3
+ } from "./chunk-ULZHPTB5.js";
4
+ import {
5
+ curriculum_file_download_default
6
+ } from "./chunk-ZFTQ2XBH.js";
7
+ import {
8
+ curriculum_review_default
9
+ } from "./chunk-BP5FU7EO.js";
10
+ import {
11
+ curriculum_video_default
12
+ } from "./chunk-KFUBWOCN.js";
13
+ import {
14
+ useCurriculumContext
15
+ } from "./chunk-WA5A2GB4.js";
16
+ import {
17
+ Typo
18
+ } from "./chunk-PMJIFLDT.js";
19
+ import {
20
+ Flex
21
+ } from "./chunk-25HMMI7R.js";
22
+ import {
23
+ InfoCircledIcon
24
+ } from "./chunk-LTEJYJUM.js";
25
+
26
+ // src/molecules/curriculumV2/CurriculumContents/index.tsx
27
+ import { jsx, jsxs } from "react/jsx-runtime";
28
+ function CurriculumBody() {
29
+ const { selectedItem, selectedSectionTitle } = useCurriculumContext();
30
+ switch (selectedItem.type) {
31
+ case "video":
32
+ return /* @__PURE__ */ jsx(curriculum_video_default, { item: selectedItem });
33
+ case "review":
34
+ return /* @__PURE__ */ jsx(
35
+ curriculum_review_default,
36
+ {
37
+ item: selectedItem,
38
+ sectionTitle: selectedSectionTitle == null ? void 0 : selectedSectionTitle.title
39
+ }
40
+ );
41
+ case "aiTraining":
42
+ return /* @__PURE__ */ jsx(curriculum_ai_traning_default, { item: selectedItem });
43
+ case "fileDownload":
44
+ return /* @__PURE__ */ jsx(curriculum_file_download_default, { item: selectedItem });
45
+ default:
46
+ return /* @__PURE__ */ jsxs(
47
+ Flex,
48
+ {
49
+ align: "center",
50
+ direction: "column",
51
+ gap: "2",
52
+ height: "100%",
53
+ justify: "center",
54
+ width: "100%",
55
+ children: [
56
+ /* @__PURE__ */ jsx(InfoCircledIcon, { height: 24, width: 24 }),
57
+ /* @__PURE__ */ jsx(Typo, { children: "\uCEE8\uD150\uCE20\uB97C \uB85C\uB529 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4" }),
58
+ /* @__PURE__ */ jsx(Typo, { align: "center", color: "gray", variant: "caption", children: `[debug info]
59
+ ${JSON.stringify(selectedItem)}` })
60
+ ]
61
+ }
62
+ );
63
+ }
64
+ }
65
+
66
+ export {
67
+ CurriculumBody
68
+ };
69
+ //# sourceMappingURL=chunk-Y7I4BEAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/curriculumV2/CurriculumContents/index.tsx"],"sourcesContent":["import React from 'react';\nimport { Flex } from '@/atoms/flex';\nimport { Typo } from '@/atoms/typo';\nimport { InfoCircledIcon } from '@/icon';\nimport { useCurriculumContext } from '../curriculum-context';\nimport CurriculumVideo from './curriculum-video';\nimport CurriculumReview from './curriculum-review';\nimport CurriculumAiTraning from './curriculum-ai-traning';\nimport CurriculumFileDownload from './curriculum-file-download';\n\nexport function CurriculumBody(): React.ReactNode {\n const { selectedItem, selectedSectionTitle } = useCurriculumContext();\n\n switch (selectedItem.type) {\n case 'video':\n return <CurriculumVideo item={selectedItem} />;\n case 'review':\n return (\n <CurriculumReview\n item={selectedItem}\n sectionTitle={selectedSectionTitle?.title}\n />\n );\n case 'aiTraining':\n return <CurriculumAiTraning item={selectedItem} />;\n case 'fileDownload':\n return <CurriculumFileDownload item={selectedItem} />;\n default:\n return (\n <Flex\n align=\"center\"\n direction=\"column\"\n gap=\"2\"\n height=\"100%\"\n justify=\"center\"\n width=\"100%\"\n >\n <InfoCircledIcon height={24} width={24} />\n <Typo>컨텐츠를 로딩 할 수 없습니다</Typo>\n <Typo align=\"center\" color=\"gray\" variant=\"caption\">\n {`[debug info]\n ${JSON.stringify(selectedItem)}`}\n </Typo>\n </Flex>\n );\n }\n} "],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAea,cAcL,YAdK;AALN,SAAS,iBAAkC;AAChD,QAAM,EAAE,cAAc,qBAAqB,IAAI,qBAAqB;AAEpE,UAAQ,aAAa,MAAM;AAAA,IACzB,KAAK;AACH,aAAO,oBAAC,4BAAgB,MAAM,cAAc;AAAA,IAC9C,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,cAAc,6DAAsB;AAAA;AAAA,MACtC;AAAA,IAEJ,KAAK;AACH,aAAO,oBAAC,iCAAoB,MAAM,cAAc;AAAA,IAClD,KAAK;AACH,aAAO,oBAAC,oCAAuB,MAAM,cAAc;AAAA,IACrD;AACE,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,KAAI;AAAA,UACJ,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,OAAM;AAAA,UAEN;AAAA,gCAAC,mBAAgB,QAAQ,IAAI,OAAO,IAAI;AAAA,YACxC,oBAAC,QAAK,0FAAgB;AAAA,YACtB,oBAAC,QAAK,OAAM,UAAS,OAAM,QAAO,SAAQ,WACvC;AAAA,cACC,KAAK,UAAU,YAAY,CAAC,IAChC;AAAA;AAAA;AAAA,MACF;AAAA,EAEN;AACF;","names":[]}
@@ -1,14 +1,14 @@
1
1
  import "../chunk-P5EMTC35.js";
2
- import {
3
- UIStateContext,
4
- UIStateProvider,
5
- useUIState
6
- } from "../chunk-PT57HCAI.js";
7
2
  import {
8
3
  DynamicFormProvider,
9
4
  useDynamicForm
10
5
  } from "../chunk-4U6DFH7Z.js";
11
6
  import "../chunk-QDC3LFHS.js";
7
+ import {
8
+ UIStateContext,
9
+ UIStateProvider,
10
+ useUIState
11
+ } from "../chunk-PT57HCAI.js";
12
12
  import "../chunk-BESTU2AY.js";
13
13
  import "../chunk-PMJIFLDT.js";
14
14
  import "../chunk-LDBWASUA.js";
package/dist/index.cjs CHANGED
@@ -277,6 +277,7 @@ __export(index_exports, {
277
277
  getCalloutIconComponent: () => getCalloutIconComponent,
278
278
  getCellAlign: () => getCellAlign,
279
279
  getColumnMeta: () => getColumnMeta,
280
+ getDynamicFormDisplayValue: () => getDynamicFormDisplayValue,
280
281
  getTimeOption: () => getTimeOption,
281
282
  getTimeOptions: () => getTimeOptions,
282
283
  oneOnOneNoteTextReplacer: () => oneOnOneNoteTextReplacer,
@@ -3654,6 +3655,58 @@ function getCalloutIconComponent(iconName) {
3654
3655
  return (_a = iconByName[iconName]) != null ? _a : DEFAULT_ICON;
3655
3656
  }
3656
3657
 
3658
+ // src/utils/get-dynamic-form-display-value.ts
3659
+ function isEmptyDisplayValue(value) {
3660
+ return value === void 0 || value === null || value === "";
3661
+ }
3662
+ function findOptionLabel(options, value) {
3663
+ const valueString = String(value);
3664
+ const found = options.find(
3665
+ (option) => String(option.value) === valueString
3666
+ );
3667
+ return found == null ? void 0 : found.label;
3668
+ }
3669
+ function joinLabelsOrValues(options, values) {
3670
+ const labels = values.map((v) => {
3671
+ const label = findOptionLabel(options, v);
3672
+ return label != null ? label : String(v);
3673
+ });
3674
+ return labels.join(", ");
3675
+ }
3676
+ function getDynamicFormDisplayValue(field, value) {
3677
+ if (isEmptyDisplayValue(value)) return "";
3678
+ switch (field.type) {
3679
+ case "dropdown":
3680
+ case "choice":
3681
+ case "radio_cards": {
3682
+ const label = findOptionLabel(field.options, value);
3683
+ return label != null ? label : String(value);
3684
+ }
3685
+ case "image_radio_card": {
3686
+ const label = findOptionLabel(field.options, value);
3687
+ return label != null ? label : String(value);
3688
+ }
3689
+ case "choices": {
3690
+ if (Array.isArray(value)) {
3691
+ return joinLabelsOrValues(field.options, value);
3692
+ }
3693
+ const label = findOptionLabel(field.options, value);
3694
+ return label != null ? label : String(value);
3695
+ }
3696
+ case "yes_no": {
3697
+ if (value === true || value === "true" || value === "yes") return "\uB3D9\uC758";
3698
+ if (value === false || value === "false" || value === "no") return "\uBE44\uB3D9\uC758";
3699
+ return String(value);
3700
+ }
3701
+ case "short_text":
3702
+ case "long_text":
3703
+ case "number":
3704
+ case "email":
3705
+ default:
3706
+ return String(value);
3707
+ }
3708
+ }
3709
+
3657
3710
  // src/molecules/time-select.tsx
3658
3711
  var import_jsx_runtime55 = require("react/jsx-runtime");
3659
3712
  var getOptionValue = (date, timeValue) => {
@@ -6111,12 +6164,6 @@ function createYupValidation(field, validation) {
6111
6164
  function isRecord2(value) {
6112
6165
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
6113
6166
  }
6114
- function isFieldOption2(value) {
6115
- if (!isRecord2(value)) return false;
6116
- const label = value.label;
6117
- const optionValue = value.value;
6118
- return typeof label === "string" && (typeof optionValue === "string" || typeof optionValue === "number");
6119
- }
6120
6167
  function DynamicFormResponseItem({
6121
6168
  payload,
6122
6169
  questionType,
@@ -6126,47 +6173,24 @@ function DynamicFormResponseItem({
6126
6173
  if (value === void 0 || value === null || value === "") {
6127
6174
  return "\uC751\uB2F5 \uC5C6\uC74C";
6128
6175
  }
6129
- const getOptions2 = (fieldConfig) => {
6130
- if (!isRecord2(fieldConfig)) return void 0;
6131
- const options2 = fieldConfig.options;
6132
- if (!Array.isArray(options2)) return void 0;
6133
- if (!options2.every(isFieldOption2)) return void 0;
6134
- return options2;
6135
- };
6136
- const options = getOptions2(config);
6176
+ if (config) {
6177
+ const displayValue = getDynamicFormDisplayValue(config, value);
6178
+ return displayValue === "" ? "\uC751\uB2F5 \uC5C6\uC74C" : displayValue;
6179
+ }
6137
6180
  switch (questionType) {
6138
6181
  case "text":
6139
6182
  case "textarea":
6140
6183
  return String(value);
6141
6184
  case "radio":
6142
6185
  case "select":
6143
- case "choice":
6144
- case "radio_cards":
6145
- case "image_radio_card":
6146
- if (options) {
6147
- const option = options.find((opt) => String(opt.value) === String(value));
6148
- return option ? option.label : String(value);
6149
- }
6150
6186
  return String(value);
6151
6187
  case "checkbox":
6152
6188
  case "choices":
6153
6189
  if (Array.isArray(value)) {
6154
- if (options) {
6155
- return value.map((val) => {
6156
- const option = options.find(
6157
- (opt) => String(opt.value) === String(val)
6158
- );
6159
- return option ? option.label : String(val);
6160
- }).join(", ");
6161
- }
6162
- return value.join(", ");
6190
+ return value.map((v) => String(v)).join(", ");
6163
6191
  }
6164
6192
  return String(value);
6165
6193
  case "rating":
6166
- if (options) {
6167
- const option = options.find((opt) => opt.value === value);
6168
- return option ? option.label : String(value);
6169
- }
6170
6194
  return String(value);
6171
6195
  case "number":
6172
6196
  return String(value);
@@ -9232,6 +9256,7 @@ function CurriculumCard(props) {
9232
9256
  getCalloutIconComponent,
9233
9257
  getCellAlign,
9234
9258
  getColumnMeta,
9259
+ getDynamicFormDisplayValue,
9235
9260
  getTimeOption,
9236
9261
  getTimeOptions,
9237
9262
  oneOnOneNoteTextReplacer,