@ittinc/strapi-plugin-kanban-board 0.0.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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/admin/custom.d.ts +2 -0
  4. package/admin/src/components/Initializer.tsx +19 -0
  5. package/admin/src/components/KanbanInput/index.tsx +605 -0
  6. package/admin/src/components/PluginIcon.tsx +5 -0
  7. package/admin/src/index.ts +136 -0
  8. package/admin/src/pages/App.tsx +15 -0
  9. package/admin/src/pages/HomePage.tsx +398 -0
  10. package/admin/src/pluginId.ts +1 -0
  11. package/admin/src/translations/en.json +5 -0
  12. package/admin/src/translations/ru.json +5 -0
  13. package/admin/src/utils/getTranslation.ts +5 -0
  14. package/admin/tsconfig.build.json +10 -0
  15. package/admin/tsconfig.json +8 -0
  16. package/dist/_chunks/App-BEiW65up.js +343 -0
  17. package/dist/_chunks/App-DXTlN9Fm.mjs +341 -0
  18. package/dist/_chunks/en-C0sbENwZ.js +8 -0
  19. package/dist/_chunks/en-CHHvJuav.mjs +8 -0
  20. package/dist/_chunks/index-9nQMm6ez.js +465 -0
  21. package/dist/_chunks/index-DI_QN_uF.mjs +463 -0
  22. package/dist/_chunks/ru-B7uE6tx_.mjs +8 -0
  23. package/dist/_chunks/ru-Bl2jLOwG.js +8 -0
  24. package/dist/admin/index.js +156 -0
  25. package/dist/admin/index.mjs +157 -0
  26. package/dist/admin/src/components/Initializer.d.ts +5 -0
  27. package/dist/admin/src/components/KanbanInput/index.d.ts +33 -0
  28. package/dist/admin/src/components/PluginIcon.d.ts +2 -0
  29. package/dist/admin/src/index.d.ts +10 -0
  30. package/dist/admin/src/pages/App.d.ts +2 -0
  31. package/dist/admin/src/pages/HomePage.d.ts +2 -0
  32. package/dist/admin/src/pluginId.d.ts +1 -0
  33. package/dist/admin/src/utils/getTranslation.d.ts +2 -0
  34. package/dist/server/index.js +73 -0
  35. package/dist/server/index.mjs +74 -0
  36. package/dist/server/src/bootstrap.d.ts +5 -0
  37. package/dist/server/src/config/index.d.ts +5 -0
  38. package/dist/server/src/content-types/index.d.ts +2 -0
  39. package/dist/server/src/controllers/controller.d.ts +7 -0
  40. package/dist/server/src/controllers/index.d.ts +2 -0
  41. package/dist/server/src/destroy.d.ts +5 -0
  42. package/dist/server/src/index.d.ts +2 -0
  43. package/dist/server/src/middlewares/index.d.ts +2 -0
  44. package/dist/server/src/policies/index.d.ts +2 -0
  45. package/dist/server/src/register.d.ts +5 -0
  46. package/dist/server/src/routes/admin/index.d.ts +5 -0
  47. package/dist/server/src/routes/content-api/index.d.ts +12 -0
  48. package/dist/server/src/routes/index.d.ts +18 -0
  49. package/dist/server/src/services/index.d.ts +2 -0
  50. package/dist/server/src/services/service.d.ts +7 -0
  51. package/package.json +101 -0
  52. package/server/src/bootstrap.ts +7 -0
  53. package/server/src/config/index.ts +4 -0
  54. package/server/src/content-types/index.ts +1 -0
  55. package/server/src/controllers/controller.ts +13 -0
  56. package/server/src/controllers/index.ts +5 -0
  57. package/server/src/destroy.ts +7 -0
  58. package/server/src/index.ts +30 -0
  59. package/server/src/middlewares/index.ts +1 -0
  60. package/server/src/policies/index.ts +1 -0
  61. package/server/src/register.ts +13 -0
  62. package/server/src/routes/admin/index.ts +4 -0
  63. package/server/src/routes/content-api/index.ts +14 -0
  64. package/server/src/routes/index.ts +9 -0
  65. package/server/src/services/index.ts +5 -0
  66. package/server/src/services/service.ts +9 -0
  67. package/server/tsconfig.build.json +10 -0
  68. package/server/tsconfig.json +8 -0
@@ -0,0 +1,465 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const designSystem = require("@strapi/design-system");
6
+ const icons = require("@strapi/icons");
7
+ const styled = require("styled-components");
8
+ const reactIntl = require("react-intl");
9
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
+ const styled__default = /* @__PURE__ */ _interopDefault(styled);
11
+ const DEFAULT_ITEM_SCHEMA = [
12
+ { name: "title", label: "Title", type: "text", required: true },
13
+ { name: "subtitle", label: "Subtitle", type: "text" }
14
+ ];
15
+ const DEFAULT_COLUMNS = ["To Do", "In Progress", "Done"];
16
+ const BoardContainer = styled__default.default(designSystem.Flex)`
17
+ gap: 16px;
18
+ padding: 16px;
19
+ align-items: flex-start;
20
+ overflow-x: auto;
21
+ border: 1px solid ${({ theme }) => theme.colors.neutral200};
22
+ border-radius: ${({ theme }) => theme.borderRadius};
23
+ background: ${({ theme }) => theme.colors.neutral100};
24
+ `;
25
+ const ColumnContainer = styled__default.default(designSystem.Box)`
26
+ background: ${({ theme }) => theme.colors.neutral0};
27
+ border: 1px solid ${({ theme }) => theme.colors.neutral200};
28
+ border-radius: ${({ theme }) => theme.borderRadius};
29
+ min-width: 280px;
30
+ width: 280px;
31
+ display: flex;
32
+ flex-direction: column;
33
+ flex-shrink: 0;
34
+ `;
35
+ const ColumnHeader = styled__default.default(designSystem.Box)`
36
+ padding: 12px;
37
+ border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};
38
+ background: ${({ theme }) => theme.colors.neutral100};
39
+ border-top-left-radius: ${({ theme }) => theme.borderRadius};
40
+ border-top-right-radius: ${({ theme }) => theme.borderRadius};
41
+ `;
42
+ const ItemList = styled__default.default(designSystem.Box)`
43
+ padding: 12px;
44
+ flex-grow: 1;
45
+ min-height: 80px;
46
+ background: ${({ theme, $isDraggingOver }) => $isDraggingOver ? theme.colors.primary100 : "transparent"};
47
+ transition: background 0.2s;
48
+ `;
49
+ const CardItem = styled__default.default(designSystem.Box)`
50
+ background: ${({ theme }) => theme.colors.neutral0};
51
+ border: 1px solid ${({ theme }) => theme.colors.neutral200};
52
+ border-radius: ${({ theme }) => theme.borderRadius};
53
+ padding: 8px;
54
+ margin-bottom: 8px;
55
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
56
+ cursor: grab;
57
+ opacity: ${({ $isDragging }) => $isDragging ? 0.5 : 1};
58
+
59
+ &:hover {
60
+ border-color: ${({ theme }) => theme.colors.primary500};
61
+ }
62
+ `;
63
+ const AddItemButton = styled__default.default.button`
64
+ background: none;
65
+ border: none;
66
+ color: ${({ theme }) => theme.colors.primary600};
67
+ cursor: pointer;
68
+ padding: 8px;
69
+ width: 100%;
70
+ text-align: left;
71
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
72
+
73
+ &:hover {
74
+ text-decoration: underline;
75
+ background: ${({ theme }) => theme.colors.neutral100};
76
+ }
77
+ `;
78
+ const KanbanInput = ({ name, value, onChange, intlLabel, attribute }) => {
79
+ const { formatMessage } = reactIntl.useIntl();
80
+ const [columns, setColumns] = react.useState([]);
81
+ const [draggedItem, setDraggedItem] = react.useState(null);
82
+ const [dragOverColId, setDragOverColId] = react.useState(null);
83
+ const options = attribute?.options || {};
84
+ const canAddColumns = options.canAddColumns !== false;
85
+ const canDeleteColumns = options.canDeleteColumns !== false;
86
+ const canRenameColumns = options.canRenameColumns !== false;
87
+ const itemSchema = react.useMemo(() => {
88
+ let schema = options.itemSchema;
89
+ if (!schema) return DEFAULT_ITEM_SCHEMA;
90
+ if (typeof schema === "string") {
91
+ try {
92
+ schema = JSON.parse(schema);
93
+ } catch (e) {
94
+ console.error("KanbanBoard: Invalid Item Schema JSON string", e);
95
+ return DEFAULT_ITEM_SCHEMA;
96
+ }
97
+ }
98
+ return Array.isArray(schema) ? schema : DEFAULT_ITEM_SCHEMA;
99
+ }, [options.itemSchema]);
100
+ const defaultColumnsList = react.useMemo(() => {
101
+ let cols = options.defaultColumns;
102
+ if (!cols) return DEFAULT_COLUMNS;
103
+ if (typeof cols === "string") {
104
+ try {
105
+ cols = JSON.parse(cols);
106
+ } catch (e) {
107
+ console.error("KanbanBoard: Invalid Default Columns JSON string", e);
108
+ return DEFAULT_COLUMNS;
109
+ }
110
+ }
111
+ return Array.isArray(cols) ? cols : DEFAULT_COLUMNS;
112
+ }, [options.defaultColumns]);
113
+ const [isModalOpen, setIsModalOpen] = react.useState(false);
114
+ const [activeColId, setActiveColId] = react.useState(null);
115
+ const [newItemData, setNewItemData] = react.useState({});
116
+ const [editingItemId, setEditingItemId] = react.useState(null);
117
+ const [isColumnModalOpen, setIsColumnModalOpen] = react.useState(false);
118
+ const [columnFormData, setColumnFormData] = react.useState({ id: "", title: "", code: "" });
119
+ const [editingColumnId, setEditingColumnId] = react.useState(null);
120
+ react.useEffect(() => {
121
+ if (value) {
122
+ try {
123
+ const parsed = typeof value === "string" ? JSON.parse(value) : value;
124
+ if (Array.isArray(parsed) && parsed.length > 0) {
125
+ setColumns(parsed);
126
+ return;
127
+ }
128
+ } catch (e) {
129
+ console.error("Failed to parse Kanban data", e);
130
+ }
131
+ }
132
+ if (Array.isArray(defaultColumnsList)) {
133
+ const initCols = defaultColumnsList.map((col, index) => {
134
+ if (typeof col === "object" && col !== null && col.title) {
135
+ return {
136
+ id: col.id || `col-${index}-${Date.now()}`,
137
+ title: col.title,
138
+ code: col.code || "",
139
+ items: []
140
+ };
141
+ }
142
+ return {
143
+ id: `col-${index}-${Date.now()}`,
144
+ title: String(col),
145
+ items: []
146
+ };
147
+ });
148
+ setColumns(initCols);
149
+ }
150
+ }, [value, defaultColumnsList]);
151
+ const updateState = (newCols) => {
152
+ setColumns(newCols);
153
+ onChange({
154
+ target: {
155
+ name,
156
+ value: newCols,
157
+ type: "json"
158
+ }
159
+ });
160
+ };
161
+ const handleDragStart = (e, itemId, sourceColId) => {
162
+ e.stopPropagation();
163
+ setDraggedItem({ itemId, sourceColId });
164
+ e.dataTransfer.effectAllowed = "move";
165
+ };
166
+ const handleDragOver = (e, colId) => {
167
+ e.preventDefault();
168
+ e.stopPropagation();
169
+ e.dataTransfer.dropEffect = "move";
170
+ setDragOverColId(colId);
171
+ };
172
+ const handleDrop = (e, targetColId, targetItemId) => {
173
+ e.preventDefault();
174
+ e.stopPropagation();
175
+ setDragOverColId(null);
176
+ if (!draggedItem) return;
177
+ const { itemId: sourceItemId, sourceColId } = draggedItem;
178
+ const newColumns = JSON.parse(JSON.stringify(columns));
179
+ const sourceCol = newColumns.find((c) => c.id === sourceColId);
180
+ const targetCol = newColumns.find((c) => c.id === targetColId);
181
+ if (!sourceCol || !targetCol) return;
182
+ const itemIndex = sourceCol.items.findIndex((i) => i.id === sourceItemId);
183
+ if (itemIndex === -1) return;
184
+ const [itemToMove] = sourceCol.items.splice(itemIndex, 1);
185
+ if (!targetItemId) {
186
+ targetCol.items.push(itemToMove);
187
+ } else {
188
+ const targetItemIndex = targetCol.items.findIndex((i) => i.id === targetItemId);
189
+ if (targetItemIndex !== -1) {
190
+ targetCol.items.splice(targetItemIndex, 0, itemToMove);
191
+ } else {
192
+ targetCol.items.push(itemToMove);
193
+ }
194
+ }
195
+ updateState(newColumns);
196
+ setDraggedItem(null);
197
+ };
198
+ const handleOpenAddItem = (colId) => {
199
+ setActiveColId(colId);
200
+ setEditingItemId(null);
201
+ setNewItemData({});
202
+ setIsModalOpen(true);
203
+ };
204
+ const handleOpenEditItem = (colId, item) => {
205
+ setActiveColId(colId);
206
+ setEditingItemId(item.id);
207
+ setNewItemData({ ...item });
208
+ setIsModalOpen(true);
209
+ };
210
+ const handleCloseModal = () => {
211
+ setIsModalOpen(false);
212
+ setActiveColId(null);
213
+ setEditingItemId(null);
214
+ };
215
+ const handleConfirmItemForm = () => {
216
+ if (!activeColId) return;
217
+ for (const field of itemSchema) {
218
+ if (field.required && !newItemData[field.name]) {
219
+ alert(`${field.label || field.name} is required`);
220
+ return;
221
+ }
222
+ }
223
+ if (editingItemId) {
224
+ const newColumns = columns.map((col) => {
225
+ if (col.id === activeColId) {
226
+ return {
227
+ ...col,
228
+ items: col.items.map(
229
+ (item) => item.id === editingItemId ? { ...newItemData, id: editingItemId } : item
230
+ )
231
+ };
232
+ }
233
+ return col;
234
+ });
235
+ updateState(newColumns);
236
+ } else {
237
+ const newItem = {
238
+ id: Date.now().toString(),
239
+ ...newItemData
240
+ };
241
+ const newColumns = columns.map((col) => {
242
+ if (col.id === activeColId) {
243
+ return { ...col, items: [...col.items, newItem] };
244
+ }
245
+ return col;
246
+ });
247
+ updateState(newColumns);
248
+ }
249
+ handleCloseModal();
250
+ };
251
+ const handleDeleteItem = (colId, itemId) => {
252
+ if (confirm("Are you sure you want to delete this item?")) {
253
+ const newColumns = columns.map((col) => {
254
+ if (col.id === colId) {
255
+ return {
256
+ ...col,
257
+ items: col.items.filter((item) => item.id !== itemId)
258
+ };
259
+ }
260
+ return col;
261
+ });
262
+ updateState(newColumns);
263
+ }
264
+ };
265
+ const handleOpenAddColumn = () => {
266
+ if (!canAddColumns) return;
267
+ setEditingColumnId(null);
268
+ setColumnFormData({ id: "", title: "", code: "" });
269
+ setIsColumnModalOpen(true);
270
+ };
271
+ const handleOpenEditColumn = (col) => {
272
+ if (!canRenameColumns) return;
273
+ setEditingColumnId(col.id);
274
+ setColumnFormData({ id: col.id, title: col.title, code: col.code || "" });
275
+ setIsColumnModalOpen(true);
276
+ };
277
+ const handleCloseColumnModal = () => {
278
+ setIsColumnModalOpen(false);
279
+ setColumnFormData({ id: "", title: "", code: "" });
280
+ setEditingColumnId(null);
281
+ };
282
+ const handleConfirmColumnForm = () => {
283
+ if (!columnFormData.title) {
284
+ alert("Column Title is required");
285
+ return;
286
+ }
287
+ if (editingColumnId) {
288
+ const newColumns = columns.map(
289
+ (col) => col.id === editingColumnId ? { ...col, title: columnFormData.title, code: columnFormData.code } : col
290
+ );
291
+ updateState(newColumns);
292
+ } else {
293
+ const newCol = {
294
+ id: `col-${Date.now()}`,
295
+ title: columnFormData.title,
296
+ code: columnFormData.code,
297
+ items: []
298
+ };
299
+ updateState([...columns, newCol]);
300
+ }
301
+ handleCloseColumnModal();
302
+ };
303
+ const handleDeleteColumn = (colId) => {
304
+ if (!canDeleteColumns) return;
305
+ if (confirm("Are you sure you want to delete this column? All items in it will be lost.")) {
306
+ const newColumns = columns.filter((col) => col.id !== colId);
307
+ updateState(newColumns);
308
+ }
309
+ };
310
+ let labelText = name;
311
+ if (intlLabel) {
312
+ if (typeof intlLabel === "string") labelText = intlLabel;
313
+ else if (intlLabel.id) {
314
+ try {
315
+ labelText = formatMessage(intlLabel);
316
+ } catch (e) {
317
+ labelText = intlLabel.defaultMessage || name;
318
+ }
319
+ }
320
+ }
321
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { children: [
322
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "center", paddingBottom: 2, children: [
323
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: labelText }),
324
+ canAddColumns && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}), onClick: handleOpenAddColumn, size: "S", variant: "secondary", children: "Add Column" })
325
+ ] }),
326
+ /* @__PURE__ */ jsxRuntime.jsx(BoardContainer, { children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(ColumnContainer, { children: [
327
+ /* @__PURE__ */ jsxRuntime.jsx(ColumnHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "center", children: [
328
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", children: [
329
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: [
330
+ col.title,
331
+ " (",
332
+ col.items.length,
333
+ ")"
334
+ ] }),
335
+ col.code && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "sigma", textColor: "neutral600", children: [
336
+ "Code: ",
337
+ col.code
338
+ ] })
339
+ ] }),
340
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, children: [
341
+ canRenameColumns && /* @__PURE__ */ jsxRuntime.jsx(
342
+ designSystem.Button,
343
+ {
344
+ onClick: () => handleOpenEditColumn(col),
345
+ variant: "ghost",
346
+ size: "S",
347
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
348
+ }
349
+ ),
350
+ canDeleteColumns && /* @__PURE__ */ jsxRuntime.jsx(
351
+ designSystem.Button,
352
+ {
353
+ onClick: () => handleDeleteColumn(col.id),
354
+ variant: "ghost",
355
+ size: "S",
356
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
357
+ }
358
+ )
359
+ ] })
360
+ ] }) }),
361
+ /* @__PURE__ */ jsxRuntime.jsx(
362
+ ItemList,
363
+ {
364
+ $isDraggingOver: dragOverColId === col.id,
365
+ onDragOver: (e) => handleDragOver(e, col.id),
366
+ onDragLeave: () => setDragOverColId(null),
367
+ onDrop: (e) => handleDrop(e, col.id),
368
+ children: col.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
369
+ CardItem,
370
+ {
371
+ draggable: true,
372
+ onDragStart: (e) => handleDragStart(e, item.id, col.id),
373
+ onDragOver: (e) => {
374
+ e.preventDefault();
375
+ e.stopPropagation();
376
+ e.dataTransfer.dropEffect = "move";
377
+ },
378
+ onDrop: (e) => handleDrop(e, col.id, item.id),
379
+ $isDragging: draggedItem?.itemId === item.id,
380
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "start", children: [
381
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { flexGrow: 1, children: itemSchema.map((field, idx) => {
382
+ const val = item[field.name];
383
+ if (!val) return null;
384
+ if (idx === 0) {
385
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "bold", as: "div", children: val }, field.name);
386
+ }
387
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", as: "div", children: val }, field.name);
388
+ }) }),
389
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, style: { opacity: 0.5 }, children: [
390
+ /* @__PURE__ */ jsxRuntime.jsx(
391
+ designSystem.Button,
392
+ {
393
+ onClick: () => handleOpenEditItem(col.id, item),
394
+ variant: "ghost",
395
+ size: "S",
396
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
397
+ }
398
+ ),
399
+ /* @__PURE__ */ jsxRuntime.jsx(
400
+ designSystem.Button,
401
+ {
402
+ onClick: () => handleDeleteItem(col.id, item.id),
403
+ variant: "ghost",
404
+ size: "S",
405
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, {})
406
+ }
407
+ )
408
+ ] })
409
+ ] })
410
+ },
411
+ item.id
412
+ ))
413
+ }
414
+ ),
415
+ /* @__PURE__ */ jsxRuntime.jsx(AddItemButton, { type: "button", onClick: () => handleOpenAddItem(col.id), children: "+ Add Item" })
416
+ ] }, col.id)) }),
417
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Root, { open: isModalOpen, onOpenChange: setIsModalOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Content, { children: [
418
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Title, { children: editingItemId ? "Edit Item" : "Add New Item" }) }),
419
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", gap: 4, children: itemSchema.map((field) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
420
+ designSystem.TextInput,
421
+ {
422
+ label: field.label || field.name,
423
+ placeholder: `Enter ${field.label || field.name}`,
424
+ value: newItemData[field.name] || "",
425
+ onChange: (e) => setNewItemData({ ...newItemData, [field.name]: e.target.value }),
426
+ required: field.required
427
+ }
428
+ ) }, field.name)) }) }),
429
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
430
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Close, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleCloseModal, children: "Cancel" }) }),
431
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirmItemForm, children: editingItemId ? "Save" : "Add" })
432
+ ] })
433
+ ] }) }),
434
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Root, { open: isColumnModalOpen, onOpenChange: setIsColumnModalOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Content, { children: [
435
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Title, { children: editingColumnId ? "Edit Column" : "Add New Column" }) }),
436
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 4, children: [
437
+ /* @__PURE__ */ jsxRuntime.jsx(
438
+ designSystem.TextInput,
439
+ {
440
+ label: "Column Title",
441
+ placeholder: "Enter column title",
442
+ value: columnFormData.title,
443
+ onChange: (e) => setColumnFormData({ ...columnFormData, title: e.target.value }),
444
+ required: true
445
+ }
446
+ ),
447
+ /* @__PURE__ */ jsxRuntime.jsx(
448
+ designSystem.TextInput,
449
+ {
450
+ label: "Column Code",
451
+ placeholder: "Enter column code (optional)",
452
+ hint: "A unique code for frontend logic (e.g. 'todo', 'done')",
453
+ value: columnFormData.code,
454
+ onChange: (e) => setColumnFormData({ ...columnFormData, code: e.target.value })
455
+ }
456
+ )
457
+ ] }) }),
458
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
459
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Close, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", onClick: handleCloseColumnModal, children: "Cancel" }) }),
460
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirmColumnForm, children: editingColumnId ? "Save" : "Add" })
461
+ ] })
462
+ ] }) })
463
+ ] }) });
464
+ };
465
+ exports.KanbanInput = KanbanInput;