@simplysm/solid 13.0.28 → 13.0.29
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/README.md +6 -5
- package/dist/components/data/Pagination.d.ts.map +1 -1
- package/dist/components/data/Pagination.js.map +1 -1
- package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/data/calendar/Calendar.js.map +1 -1
- package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
- package/dist/components/data/kanban/Kanban.js +2 -2
- package/dist/components/data/kanban/Kanban.js.map +2 -2
- package/dist/components/data/list/List.d.ts.map +1 -1
- package/dist/components/data/list/List.js.map +1 -1
- package/dist/components/data/list/ListItem.d.ts.map +1 -1
- package/dist/components/data/list/ListItem.js.map +1 -1
- package/dist/components/data/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/data/permission-table/PermissionTable.js.map +1 -1
- package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.js.map +1 -1
- package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.styles.js +23 -5
- package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
- package/dist/components/data/sheet/DataSheetColumn.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheetColumn.js.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
- package/dist/components/data/sheet/sheetUtils.d.ts.map +1 -1
- package/dist/components/data/sheet/sheetUtils.js.map +1 -1
- package/dist/components/disclosure/Collapse.d.ts.map +1 -1
- package/dist/components/disclosure/Collapse.js +0 -3
- package/dist/components/disclosure/Collapse.js.map +1 -1
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js.map +1 -1
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.js.map +1 -1
- package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
- package/dist/components/disclosure/DialogProvider.js.map +1 -1
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js.map +1 -1
- package/dist/components/disclosure/Tabs.d.ts.map +1 -1
- package/dist/components/disclosure/Tabs.js.map +1 -1
- package/dist/components/display/Alert.d.ts.map +1 -1
- package/dist/components/display/Alert.js.map +1 -1
- package/dist/components/display/Card.d.ts +0 -1
- package/dist/components/display/Card.d.ts.map +1 -1
- package/dist/components/display/Card.js +1 -2
- package/dist/components/display/Card.js.map +1 -1
- package/dist/components/display/Echarts.d.ts +1 -1
- package/dist/components/display/Echarts.d.ts.map +1 -1
- package/dist/components/display/Echarts.js +2 -2
- package/dist/components/display/Echarts.js.map +2 -2
- package/dist/components/display/Link.d.ts +5 -0
- package/dist/components/display/Link.d.ts.map +1 -0
- package/dist/components/display/Link.js +26 -0
- package/dist/components/display/Link.js.map +6 -0
- package/dist/components/feedback/busy/BusyContainer.d.ts +12 -0
- package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -0
- package/dist/components/feedback/{loading/LoadingContainer.js → busy/BusyContainer.js} +7 -7
- package/dist/components/feedback/busy/BusyContainer.js.map +6 -0
- package/dist/components/feedback/busy/BusyContext.d.ts +11 -0
- package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -0
- package/dist/components/feedback/busy/BusyContext.js +14 -0
- package/dist/components/feedback/busy/BusyContext.js.map +6 -0
- package/dist/components/feedback/busy/BusyProvider.d.ts +7 -0
- package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -0
- package/dist/components/feedback/{loading/LoadingProvider.js → busy/BusyProvider.js} +7 -7
- package/dist/components/feedback/busy/BusyProvider.js.map +6 -0
- package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.js.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
- package/dist/components/form-control/Button.d.ts.map +1 -1
- package/dist/components/form-control/Button.js +2 -2
- package/dist/components/form-control/Button.js.map +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.js +6 -1
- package/dist/components/form-control/DropdownTrigger.styles.js.map +1 -1
- package/dist/components/form-control/Invalid.d.ts.map +1 -1
- package/dist/components/form-control/Invalid.js +1 -1
- package/dist/components/form-control/Invalid.js.map +1 -1
- package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.js.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.js +5 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.js.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.js.map +1 -1
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +5 -5
- package/dist/components/form-control/combobox/Combobox.js.map +2 -2
- package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
- package/dist/components/form-control/editor/EditorToolbar.js.map +1 -1
- package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/form-control/editor/RichTextEditor.js.map +1 -1
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DatePicker.js.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
- package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
- package/dist/components/form-control/field/Field.styles.js +17 -3
- package/dist/components/form-control/field/Field.styles.js.map +1 -1
- package/dist/components/form-control/field/NumberInput.d.ts +3 -0
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +23 -5
- package/dist/components/form-control/field/NumberInput.js.map +2 -2
- package/dist/components/form-control/field/TextInput.d.ts +4 -1
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.js +23 -6
- package/dist/components/form-control/field/TextInput.js.map +2 -2
- package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
- package/dist/components/form-control/field/Textarea.js.map +1 -1
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.js.map +1 -1
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js.map +1 -1
- package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectItem.js.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
- package/dist/components/layout/FormGroup.d.ts.map +1 -1
- package/dist/components/layout/FormGroup.js.map +1 -1
- package/dist/components/layout/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/components/layout/sidebar/Sidebar.js +1 -1
- package/dist/components/layout/sidebar/Sidebar.js.map +1 -1
- package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarContainer.js.map +1 -1
- package/dist/components/layout/sidebar/SidebarMenu.js.map +1 -1
- package/dist/components/layout/sidebar/SidebarUser.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarUser.js +2 -2
- package/dist/components/layout/sidebar/SidebarUser.js.map +1 -1
- package/dist/components/layout/topbar/Topbar.js +1 -1
- package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.js.map +1 -1
- package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarUser.js.map +1 -1
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.js +17 -12
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/mergeStyles.d.ts.map +1 -1
- package/dist/helpers/mergeStyles.js +4 -1
- package/dist/helpers/mergeStyles.js.map +1 -1
- package/dist/helpers/splitSlots.d.ts.map +1 -1
- package/dist/helpers/splitSlots.js.map +1 -1
- package/dist/hooks/createControllableSignal.d.ts.map +1 -1
- package/dist/hooks/createControllableSignal.js.map +1 -1
- package/dist/hooks/useClipboardValueCopy.js +3 -1
- package/dist/hooks/useClipboardValueCopy.js.map +1 -1
- package/dist/hooks/useLocalStorage.d.ts.map +1 -1
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/dist/hooks/usePrint.d.ts.map +1 -1
- package/dist/hooks/usePrint.js +5 -3
- package/dist/hooks/usePrint.js.map +1 -1
- package/dist/hooks/useRouterLink.d.ts.map +1 -1
- package/dist/hooks/useRouterLink.js.map +1 -1
- package/dist/hooks/useSyncConfig.d.ts +3 -3
- package/dist/hooks/useSyncConfig.js +4 -4
- package/dist/hooks/useSyncConfig.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/providers/ConfigContext.d.ts +2 -2
- package/dist/providers/ConfigContext.d.ts.map +1 -1
- package/dist/providers/InitializeProvider.js +3 -3
- package/dist/providers/InitializeProvider.js.map +2 -2
- package/dist/providers/ServiceClientProvider.d.ts.map +1 -1
- package/dist/providers/ServiceClientProvider.js.map +1 -1
- package/dist/providers/ThemeContext.d.ts.map +1 -1
- package/dist/providers/ThemeContext.js.map +1 -1
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataChangeEvent.js +1 -3
- package/dist/providers/shared-data/SharedDataChangeEvent.js.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.d.ts +1 -1
- package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.js +6 -6
- package/dist/providers/shared-data/SharedDataProvider.js.map +2 -2
- package/dist/styles/patterns.styles.js +1 -1
- package/dist/styles/tokens.styles.d.ts +1 -1
- package/dist/styles/tokens.styles.js +1 -1
- package/docs/display.md +19 -2
- package/docs/feedback.md +10 -10
- package/docs/hooks.md +6 -6
- package/docs/layout.md +3 -3
- package/docs/providers.md +1 -1
- package/package.json +3 -3
- package/src/components/data/Pagination.tsx +6 -1
- package/src/components/data/calendar/Calendar.tsx +18 -4
- package/src/components/data/kanban/Kanban.tsx +62 -18
- package/src/components/data/list/List.tsx +11 -4
- package/src/components/data/list/ListItem.tsx +12 -2
- package/src/components/data/permission-table/PermissionTable.tsx +32 -5
- package/src/components/data/sheet/DataSheet.styles.ts +23 -5
- package/src/components/data/sheet/DataSheet.tsx +100 -25
- package/src/components/data/sheet/DataSheetColumn.tsx +5 -1
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +27 -5
- package/src/components/data/sheet/sheetUtils.ts +12 -3
- package/src/components/disclosure/Collapse.tsx +14 -3
- package/src/components/disclosure/Dialog.tsx +35 -6
- package/src/components/disclosure/DialogContext.ts +4 -1
- package/src/components/disclosure/DialogProvider.tsx +15 -3
- package/src/components/disclosure/Dropdown.tsx +12 -2
- package/src/components/disclosure/Tabs.tsx +29 -5
- package/src/components/display/Alert.tsx +3 -4
- package/src/components/display/Card.tsx +1 -2
- package/src/components/display/Echarts.tsx +12 -5
- package/src/components/display/Link.tsx +22 -0
- package/src/components/feedback/{loading/LoadingContainer.tsx → busy/BusyContainer.tsx} +43 -14
- package/src/components/feedback/busy/BusyContext.ts +20 -0
- package/src/components/feedback/{loading/LoadingProvider.tsx → busy/BusyProvider.tsx} +10 -10
- package/src/components/feedback/notification/NotificationBanner.tsx +13 -2
- package/src/components/feedback/notification/NotificationBell.tsx +17 -3
- package/src/components/feedback/notification/NotificationContext.ts +4 -1
- package/src/components/feedback/notification/NotificationProvider.tsx +3 -1
- package/src/components/form-control/Button.tsx +8 -3
- package/src/components/form-control/DropdownTrigger.styles.ts +7 -1
- package/src/components/form-control/Invalid.tsx +5 -1
- package/src/components/form-control/ThemeToggle.tsx +6 -2
- package/src/components/form-control/checkbox/Checkbox.styles.ts +5 -1
- package/src/components/form-control/color-picker/ColorPicker.tsx +15 -2
- package/src/components/form-control/combobox/Combobox.tsx +16 -8
- package/src/components/form-control/editor/EditorToolbar.tsx +16 -5
- package/src/components/form-control/editor/RichTextEditor.tsx +22 -4
- package/src/components/form-control/field/DatePicker.tsx +5 -1
- package/src/components/form-control/field/DateTimePicker.tsx +8 -1
- package/src/components/form-control/field/Field.styles.ts +17 -3
- package/src/components/form-control/field/NumberInput.tsx +24 -0
- package/src/components/form-control/field/TextInput.tsx +28 -5
- package/src/components/form-control/field/Textarea.tsx +2 -1
- package/src/components/form-control/field/TimePicker.tsx +5 -1
- package/src/components/form-control/select/Select.tsx +32 -7
- package/src/components/form-control/select/SelectItem.tsx +3 -1
- package/src/components/form-control/state-preset/StatePreset.tsx +39 -14
- package/src/components/layout/FormGroup.tsx +11 -2
- package/src/components/layout/sidebar/Sidebar.tsx +3 -2
- package/src/components/layout/sidebar/SidebarContainer.tsx +8 -1
- package/src/components/layout/sidebar/SidebarMenu.tsx +7 -1
- package/src/components/layout/sidebar/SidebarUser.tsx +9 -4
- package/src/components/layout/topbar/Topbar.tsx +1 -1
- package/src/components/layout/topbar/TopbarMenu.tsx +27 -5
- package/src/components/layout/topbar/TopbarUser.tsx +5 -1
- package/src/helpers/createAppStructure.ts +29 -15
- package/src/helpers/mergeStyles.ts +6 -2
- package/src/helpers/splitSlots.ts +4 -1
- package/src/hooks/createControllableSignal.ts +2 -1
- package/src/hooks/useClipboardValueCopy.ts +5 -2
- package/src/hooks/useLocalStorage.ts +3 -1
- package/src/hooks/usePrint.ts +9 -4
- package/src/hooks/useRouterLink.ts +3 -1
- package/src/hooks/useSyncConfig.ts +7 -7
- package/src/index.ts +5 -4
- package/src/providers/ConfigContext.ts +2 -2
- package/src/providers/InitializeProvider.tsx +2 -2
- package/src/providers/ServiceClientProvider.tsx +14 -3
- package/src/providers/ThemeContext.tsx +10 -2
- package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -3
- package/src/providers/shared-data/SharedDataContext.ts +1 -1
- package/src/providers/shared-data/SharedDataProvider.tsx +13 -8
- package/src/styles/patterns.styles.ts +1 -1
- package/src/styles/tokens.styles.ts +1 -1
- package/tailwind.config.ts +9 -0
- package/tailwind.css +1 -1
- package/dist/components/display/Card.css +0 -15
- package/dist/components/feedback/loading/LoadingContainer.d.ts +0 -12
- package/dist/components/feedback/loading/LoadingContainer.d.ts.map +0 -1
- package/dist/components/feedback/loading/LoadingContainer.js.map +0 -6
- package/dist/components/feedback/loading/LoadingContext.d.ts +0 -11
- package/dist/components/feedback/loading/LoadingContext.d.ts.map +0 -1
- package/dist/components/feedback/loading/LoadingContext.js +0 -14
- package/dist/components/feedback/loading/LoadingContext.js.map +0 -6
- package/dist/components/feedback/loading/LoadingProvider.d.ts +0 -7
- package/dist/components/feedback/loading/LoadingProvider.d.ts.map +0 -1
- package/dist/components/feedback/loading/LoadingProvider.js.map +0 -6
- package/src/components/display/Card.css +0 -15
- package/src/components/feedback/loading/LoadingContext.ts +0 -20
- /package/dist/components/feedback/{loading/LoadingContainer.css → busy/BusyContainer.css} +0 -0
- /package/src/components/feedback/{loading/LoadingContainer.css → busy/BusyContainer.css} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/solid",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.29",
|
|
4
4
|
"description": "심플리즘 패키지 - SolidJS 라이브러리",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"solid-tiptap": "^0.8.0",
|
|
50
50
|
"tailwind-merge": "^3.4.1",
|
|
51
51
|
"tailwindcss": "^3.4.19",
|
|
52
|
-
"@simplysm/core-browser": "13.0.
|
|
53
|
-
"@simplysm/core-common": "13.0.
|
|
52
|
+
"@simplysm/core-browser": "13.0.29",
|
|
53
|
+
"@simplysm/core-common": "13.0.29"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@solidjs/testing-library": "^0.8.10"
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { type Component, For, type JSX, splitProps } from "solid-js";
|
|
2
2
|
import clsx from "clsx";
|
|
3
3
|
import { twMerge } from "tailwind-merge";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
IconChevronLeft,
|
|
6
|
+
IconChevronRight,
|
|
7
|
+
IconChevronsLeft,
|
|
8
|
+
IconChevronsRight,
|
|
9
|
+
} from "@tabler/icons-solidjs";
|
|
5
10
|
import { Button } from "../form-control/Button";
|
|
6
11
|
import { Icon } from "../display/Icon";
|
|
7
12
|
|
|
@@ -4,7 +4,10 @@ import clsx from "clsx";
|
|
|
4
4
|
import { twMerge } from "tailwind-merge";
|
|
5
5
|
import { createControllableSignal } from "../../../hooks/createControllableSignal";
|
|
6
6
|
|
|
7
|
-
export interface CalendarProps<TValue> extends Omit<
|
|
7
|
+
export interface CalendarProps<TValue> extends Omit<
|
|
8
|
+
JSX.HTMLAttributes<HTMLTableElement>,
|
|
9
|
+
"children"
|
|
10
|
+
> {
|
|
8
11
|
items: TValue[];
|
|
9
12
|
getItemDate: (item: TValue, index: number) => DateOnly;
|
|
10
13
|
renderItem: (item: TValue, index: number) => JSX.Element;
|
|
@@ -116,14 +119,25 @@ function CalendarBase<TValue>(props: CalendarProps<TValue>) {
|
|
|
116
119
|
<tr>
|
|
117
120
|
<For each={row}>
|
|
118
121
|
{(cell) => (
|
|
119
|
-
<td
|
|
122
|
+
<td
|
|
123
|
+
class={twMerge(
|
|
124
|
+
notCurrentClass,
|
|
125
|
+
cell.date.month !== yearMonth().month && "not-current",
|
|
126
|
+
)}
|
|
127
|
+
>
|
|
120
128
|
<div
|
|
121
|
-
class={
|
|
129
|
+
class={
|
|
130
|
+
cell.date.month !== yearMonth().month
|
|
131
|
+
? twMerge(dayClass, notCurrentDayClass)
|
|
132
|
+
: dayClass
|
|
133
|
+
}
|
|
122
134
|
>
|
|
123
135
|
{cell.date.day}
|
|
124
136
|
</div>
|
|
125
137
|
<div class={contentClass}>
|
|
126
|
-
<For each={cell.items}>
|
|
138
|
+
<For each={cell.items}>
|
|
139
|
+
{(entry) => local.renderItem(entry.item, entry.index)}
|
|
140
|
+
</For>
|
|
127
141
|
</div>
|
|
128
142
|
</td>
|
|
129
143
|
)}
|
|
@@ -16,7 +16,7 @@ import { IconEye, IconEyeOff } from "@tabler/icons-solidjs";
|
|
|
16
16
|
import { Card } from "../../display/Card";
|
|
17
17
|
import { Checkbox } from "../../form-control/checkbox/Checkbox";
|
|
18
18
|
import { Icon } from "../../display/Icon";
|
|
19
|
-
import {
|
|
19
|
+
import { BusyContainer } from "../../feedback/busy/BusyContainer";
|
|
20
20
|
import { createControllableSignal } from "../../../hooks/createControllableSignal";
|
|
21
21
|
import { splitSlots } from "../../../helpers/splitSlots";
|
|
22
22
|
import "./Kanban.css";
|
|
@@ -34,15 +34,22 @@ import {
|
|
|
34
34
|
|
|
35
35
|
// ─── KanbanLaneTitle ─────────────────────────────────────────────
|
|
36
36
|
|
|
37
|
-
const KanbanLaneTitle: ParentComponent = (props) =>
|
|
37
|
+
const KanbanLaneTitle: ParentComponent = (props) => (
|
|
38
|
+
<div data-kanban-lane-title>{props.children}</div>
|
|
39
|
+
);
|
|
38
40
|
|
|
39
41
|
// ─── KanbanLaneTools ─────────────────────────────────────────────
|
|
40
42
|
|
|
41
|
-
const KanbanLaneTools: ParentComponent = (props) =>
|
|
43
|
+
const KanbanLaneTools: ParentComponent = (props) => (
|
|
44
|
+
<div data-kanban-lane-tools>{props.children}</div>
|
|
45
|
+
);
|
|
42
46
|
|
|
43
47
|
// ─── KanbanCard ──────────────────────────────────────────────────
|
|
44
48
|
|
|
45
|
-
export interface KanbanCardProps extends Omit<
|
|
49
|
+
export interface KanbanCardProps extends Omit<
|
|
50
|
+
JSX.HTMLAttributes<HTMLDivElement>,
|
|
51
|
+
"children" | "draggable"
|
|
52
|
+
> {
|
|
46
53
|
value?: unknown;
|
|
47
54
|
draggable?: boolean;
|
|
48
55
|
selectable?: boolean;
|
|
@@ -52,14 +59,25 @@ export interface KanbanCardProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>
|
|
|
52
59
|
|
|
53
60
|
const cardHostClass = clsx("relative block", "transition-opacity duration-200");
|
|
54
61
|
|
|
55
|
-
const cardContentClass = clsx(
|
|
62
|
+
const cardContentClass = clsx(
|
|
63
|
+
"select-none whitespace-normal",
|
|
64
|
+
"animate-none",
|
|
65
|
+
"transition-shadow duration-200",
|
|
66
|
+
);
|
|
56
67
|
|
|
57
68
|
const cardSelectedClass = clsx("ring-2 ring-primary-500/50", "shadow-md dark:shadow-black/30");
|
|
58
69
|
|
|
59
70
|
const LONG_PRESS_MS = 500;
|
|
60
71
|
|
|
61
72
|
const KanbanCard: ParentComponent<KanbanCardProps> = (props) => {
|
|
62
|
-
const [local, rest] = splitProps(props, [
|
|
73
|
+
const [local, rest] = splitProps(props, [
|
|
74
|
+
"children",
|
|
75
|
+
"class",
|
|
76
|
+
"value",
|
|
77
|
+
"draggable",
|
|
78
|
+
"selectable",
|
|
79
|
+
"contentClass",
|
|
80
|
+
]);
|
|
63
81
|
|
|
64
82
|
const boardCtx = useKanbanContext();
|
|
65
83
|
const laneCtx = useKanbanLaneContext();
|
|
@@ -182,7 +200,12 @@ const KanbanCard: ParentComponent<KanbanCardProps> = (props) => {
|
|
|
182
200
|
ref={hostRef}
|
|
183
201
|
data-kanban-card
|
|
184
202
|
draggable={isDraggable()}
|
|
185
|
-
class={twMerge(
|
|
203
|
+
class={twMerge(
|
|
204
|
+
cardHostClass,
|
|
205
|
+
isDraggable() && "cursor-grab",
|
|
206
|
+
isDragSource() && "opacity-30",
|
|
207
|
+
local.class,
|
|
208
|
+
)}
|
|
186
209
|
onDragStart={handleDragStart}
|
|
187
210
|
onDragOver={handleDragOver}
|
|
188
211
|
onDrop={handleDrop}
|
|
@@ -191,7 +214,9 @@ const KanbanCard: ParentComponent<KanbanCardProps> = (props) => {
|
|
|
191
214
|
onPointerCancel={handlePointerCancel}
|
|
192
215
|
onClick={handleClick}
|
|
193
216
|
>
|
|
194
|
-
<Card
|
|
217
|
+
<Card
|
|
218
|
+
class={twMerge(cardContentClass, isSelected() && cardSelectedClass, local.contentClass)}
|
|
219
|
+
>
|
|
195
220
|
{local.children}
|
|
196
221
|
</Card>
|
|
197
222
|
</div>
|
|
@@ -267,9 +292,9 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
267
292
|
|
|
268
293
|
const boardCtx = useKanbanContext();
|
|
269
294
|
|
|
270
|
-
const [registeredCards, setRegisteredCards] = createSignal<
|
|
271
|
-
|
|
272
|
-
);
|
|
295
|
+
const [registeredCards, setRegisteredCards] = createSignal<
|
|
296
|
+
Map<string, { value: unknown; selectable: boolean }>
|
|
297
|
+
>(new Map());
|
|
273
298
|
|
|
274
299
|
const registerCard = (id: string, info: { value: unknown; selectable: boolean }) => {
|
|
275
300
|
setRegisteredCards((prev) => new Map(prev).set(id, info));
|
|
@@ -396,7 +421,8 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
396
421
|
placeholderEl.style.height = `${dc.heightOnDrag}px`;
|
|
397
422
|
|
|
398
423
|
// 삽입 위치 계산
|
|
399
|
-
const referenceNode =
|
|
424
|
+
const referenceNode =
|
|
425
|
+
target.position === "before" ? target.element : target.element.nextElementSibling;
|
|
400
426
|
|
|
401
427
|
// 이미 올바른 위치면 DOM 조작 생략
|
|
402
428
|
if (placeholderEl.parentNode === bodyRef && placeholderEl.nextSibling === referenceNode) {
|
|
@@ -414,7 +440,7 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
414
440
|
});
|
|
415
441
|
|
|
416
442
|
return (
|
|
417
|
-
<
|
|
443
|
+
<BusyContainer busy={local.busy} variant="bar">
|
|
418
444
|
<div
|
|
419
445
|
{...rest}
|
|
420
446
|
data-kanban-lane
|
|
@@ -427,12 +453,21 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
427
453
|
<Show when={hasHeader()}>
|
|
428
454
|
<div class={laneHeaderBaseClass}>
|
|
429
455
|
<Show when={local.collapsible}>
|
|
430
|
-
<button
|
|
456
|
+
<button
|
|
457
|
+
type="button"
|
|
458
|
+
class={collapseButtonClass}
|
|
459
|
+
onClick={() => setCollapsed((prev) => !prev)}
|
|
460
|
+
>
|
|
431
461
|
<Icon icon={collapsed() ? IconEyeOff : IconEye} size="1em" />
|
|
432
462
|
</button>
|
|
433
463
|
</Show>
|
|
434
464
|
<Show when={hasSelectableCards()}>
|
|
435
|
-
<Checkbox
|
|
465
|
+
<Checkbox
|
|
466
|
+
value={isAllSelected()}
|
|
467
|
+
onValueChange={handleSelectAll}
|
|
468
|
+
inline
|
|
469
|
+
theme="primary"
|
|
470
|
+
/>
|
|
436
471
|
</Show>
|
|
437
472
|
<div class="flex-1">{slots().kanbanLaneTitle}</div>
|
|
438
473
|
<Show when={slots().kanbanLaneTools.length > 0}>
|
|
@@ -446,7 +481,7 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
446
481
|
</div>
|
|
447
482
|
</Show>
|
|
448
483
|
</div>
|
|
449
|
-
</
|
|
484
|
+
</BusyContainer>
|
|
450
485
|
);
|
|
451
486
|
};
|
|
452
487
|
|
|
@@ -459,7 +494,10 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
459
494
|
|
|
460
495
|
// ─── Kanban (Board) ──────────────────────────────────────────────
|
|
461
496
|
|
|
462
|
-
export interface KanbanProps extends Omit<
|
|
497
|
+
export interface KanbanProps extends Omit<
|
|
498
|
+
JSX.HTMLAttributes<HTMLDivElement>,
|
|
499
|
+
"children" | "onDrop"
|
|
500
|
+
> {
|
|
463
501
|
onDrop?: (info: KanbanDropInfo) => void;
|
|
464
502
|
selectedValues?: unknown[];
|
|
465
503
|
onSelectedValuesChange?: (values: unknown[]) => void;
|
|
@@ -477,7 +515,13 @@ interface KanbanComponent {
|
|
|
477
515
|
}
|
|
478
516
|
|
|
479
517
|
const KanbanBase = (props: KanbanProps) => {
|
|
480
|
-
const [local, rest] = splitProps(props, [
|
|
518
|
+
const [local, rest] = splitProps(props, [
|
|
519
|
+
"children",
|
|
520
|
+
"class",
|
|
521
|
+
"onDrop",
|
|
522
|
+
"selectedValues",
|
|
523
|
+
"onSelectedValuesChange",
|
|
524
|
+
]);
|
|
481
525
|
|
|
482
526
|
const [dragCard, setDragCard] = createSignal<KanbanCardRef>();
|
|
483
527
|
|
|
@@ -6,11 +6,15 @@ import { ListItem } from "./ListItem";
|
|
|
6
6
|
|
|
7
7
|
const baseClass = clsx("inline-flex flex-col rounded-md");
|
|
8
8
|
|
|
9
|
-
const rootClass = clsx(
|
|
9
|
+
const rootClass = clsx(
|
|
10
|
+
"border border-base-300 bg-base-50 p-px dark:border-base-700 dark:bg-base-900",
|
|
11
|
+
);
|
|
10
12
|
|
|
11
13
|
const nestedClass = clsx("rounded-none py-1");
|
|
12
14
|
|
|
13
|
-
const insetClass = clsx(
|
|
15
|
+
const insetClass = clsx(
|
|
16
|
+
"w-full border-transparent bg-transparent dark:border-transparent dark:bg-transparent",
|
|
17
|
+
);
|
|
14
18
|
|
|
15
19
|
export interface ListProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
16
20
|
/**
|
|
@@ -89,7 +93,8 @@ const ListBase: ParentComponent<ListProps> = (props) => {
|
|
|
89
93
|
current.click();
|
|
90
94
|
} else {
|
|
91
95
|
// Collapse의 이전 형제가 부모 button
|
|
92
|
-
const parentItem = current.closest("[data-collapse]")
|
|
96
|
+
const parentItem = current.closest("[data-collapse]")
|
|
97
|
+
?.previousElementSibling as HTMLElement | null;
|
|
93
98
|
if (parentItem?.hasAttribute("data-list-item")) {
|
|
94
99
|
parentItem.focus();
|
|
95
100
|
}
|
|
@@ -100,7 +105,9 @@ const ListBase: ParentComponent<ListProps> = (props) => {
|
|
|
100
105
|
const current = e.target as HTMLElement;
|
|
101
106
|
if (!current.hasAttribute("data-list-item")) return;
|
|
102
107
|
|
|
103
|
-
const allItems = [
|
|
108
|
+
const allItems = [
|
|
109
|
+
...listRef.querySelectorAll('[data-list-item]:not([aria-disabled="true"])'),
|
|
110
|
+
] as HTMLElement[];
|
|
104
111
|
const visibleItems = allItems.filter((el) => isVisible(el));
|
|
105
112
|
const idx = visibleItems.indexOf(current);
|
|
106
113
|
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
children,
|
|
3
|
+
type Component,
|
|
4
|
+
type JSX,
|
|
5
|
+
type ParentComponent,
|
|
6
|
+
Show,
|
|
7
|
+
splitProps,
|
|
8
|
+
} from "solid-js";
|
|
2
9
|
import { IconChevronDown, type IconProps } from "@tabler/icons-solidjs";
|
|
3
10
|
import { Icon } from "../../display/Icon";
|
|
4
11
|
import clsx from "clsx";
|
|
@@ -52,7 +59,10 @@ const ListItemChildren: ParentComponent = (props) => (
|
|
|
52
59
|
</div>
|
|
53
60
|
);
|
|
54
61
|
|
|
55
|
-
export interface ListItemProps extends Omit<
|
|
62
|
+
export interface ListItemProps extends Omit<
|
|
63
|
+
JSX.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
64
|
+
"onClick"
|
|
65
|
+
> {
|
|
56
66
|
/**
|
|
57
67
|
* 중첩 리스트의 열림 상태 (controlled 모드)
|
|
58
68
|
*/
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { JSX } from "solid-js";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type Component,
|
|
4
|
+
createEffect,
|
|
5
|
+
createMemo,
|
|
6
|
+
createSignal,
|
|
7
|
+
For,
|
|
8
|
+
on,
|
|
9
|
+
Show,
|
|
10
|
+
splitProps,
|
|
11
|
+
} from "solid-js";
|
|
3
12
|
import clsx from "clsx";
|
|
4
13
|
import { twMerge } from "tailwind-merge";
|
|
5
14
|
import { DataSheet } from "../sheet/DataSheet";
|
|
@@ -113,7 +122,10 @@ export function changePermCheck<TModule>(
|
|
|
113
122
|
// --- 내부 헬퍼 ---
|
|
114
123
|
|
|
115
124
|
/** 모듈 필터에 의해 보이는지 확인 (객체 참조 유지) */
|
|
116
|
-
function isItemVisible<TModule>(
|
|
125
|
+
function isItemVisible<TModule>(
|
|
126
|
+
item: PermissionItem<TModule>,
|
|
127
|
+
modules: TModule[] | undefined,
|
|
128
|
+
): boolean {
|
|
117
129
|
if (!modules || modules.length === 0) return true;
|
|
118
130
|
if (item.modules && !item.modules.some((m) => modules.includes(m))) return false;
|
|
119
131
|
if (!item.perms && item.children) {
|
|
@@ -123,7 +135,10 @@ function isItemVisible<TModule>(item: PermissionItem<TModule>, modules: TModule[
|
|
|
123
135
|
}
|
|
124
136
|
|
|
125
137
|
/** 보이는 아이템에서만 고유 perm 타입 수집 */
|
|
126
|
-
function collectVisiblePerms<TModule>(
|
|
138
|
+
function collectVisiblePerms<TModule>(
|
|
139
|
+
items: PermissionItem<TModule>[],
|
|
140
|
+
modules: TModule[] | undefined,
|
|
141
|
+
): string[] {
|
|
127
142
|
const set = new Set<string>();
|
|
128
143
|
|
|
129
144
|
function walk(list: PermissionItem<TModule>[]) {
|
|
@@ -165,7 +180,11 @@ function hasPermInTree<TModule>(item: PermissionItem<TModule>, perm: string): bo
|
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
/** 기본 권한(perms[0])이 꺼져 있어서 비활성화해야 하는지 */
|
|
168
|
-
function isPermDisabled<TModule>(
|
|
183
|
+
function isPermDisabled<TModule>(
|
|
184
|
+
item: PermissionItem<TModule>,
|
|
185
|
+
perm: string,
|
|
186
|
+
value: Record<string, boolean>,
|
|
187
|
+
): boolean {
|
|
169
188
|
if (!item.perms || item.href == null || item.href === "") return false;
|
|
170
189
|
const basePerm = item.perms[0];
|
|
171
190
|
if (perm === basePerm) return false;
|
|
@@ -196,7 +215,15 @@ function collectExpandable<TModule>(
|
|
|
196
215
|
// --- 컴포넌트 ---
|
|
197
216
|
|
|
198
217
|
export const PermissionTable: Component<PermissionTableProps> = (props) => {
|
|
199
|
-
const [local] = splitProps(props, [
|
|
218
|
+
const [local] = splitProps(props, [
|
|
219
|
+
"items",
|
|
220
|
+
"value",
|
|
221
|
+
"onValueChange",
|
|
222
|
+
"modules",
|
|
223
|
+
"disabled",
|
|
224
|
+
"class",
|
|
225
|
+
"style",
|
|
226
|
+
]);
|
|
200
227
|
|
|
201
228
|
// 보이는 최상위 아이템 (객체 참조 유지)
|
|
202
229
|
const visibleItems = createMemo(() => {
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import clsx from "clsx";
|
|
2
2
|
import { borderDefault, borderSubtle } from "../../../styles/tokens.styles";
|
|
3
3
|
|
|
4
|
-
export const dataSheetContainerClass = clsx(
|
|
4
|
+
export const dataSheetContainerClass = clsx(
|
|
5
|
+
"relative",
|
|
6
|
+
"bg-white dark:bg-base-950",
|
|
7
|
+
"overflow-auto",
|
|
8
|
+
);
|
|
5
9
|
|
|
6
10
|
export const tableClass = clsx("border-separate border-spacing-0", "w-max");
|
|
7
11
|
|
|
@@ -111,7 +115,12 @@ export const expandToggleClass = clsx(
|
|
|
111
115
|
);
|
|
112
116
|
|
|
113
117
|
// 선택 컬럼 — single 모드 아이콘 래퍼
|
|
114
|
-
export const selectSingleClass = clsx(
|
|
118
|
+
export const selectSingleClass = clsx(
|
|
119
|
+
"flex items-center justify-center",
|
|
120
|
+
"size-6",
|
|
121
|
+
"cursor-pointer",
|
|
122
|
+
"rounded",
|
|
123
|
+
);
|
|
115
124
|
|
|
116
125
|
// single 모드 — 선택됨
|
|
117
126
|
export const selectSingleSelectedClass = clsx("text-primary-500", "dark:text-primary-400");
|
|
@@ -143,13 +152,22 @@ export const featureCellWrapperClass = clsx("flex items-center", "px-1");
|
|
|
143
152
|
export const featureCellBodyWrapperClass = clsx("flex h-full items-center", "px-1");
|
|
144
153
|
|
|
145
154
|
// 기능 컬럼 헤더 클릭 가능 래퍼 (전체 선택 등)
|
|
146
|
-
export const featureCellClickableClass = clsx(
|
|
155
|
+
export const featureCellClickableClass = clsx(
|
|
156
|
+
"flex cursor-pointer items-center justify-center",
|
|
157
|
+
"px-1",
|
|
158
|
+
);
|
|
147
159
|
|
|
148
160
|
// 기능 컬럼 바디 클릭 가능 래퍼 (선택/재정렬 등 — 전체 높이)
|
|
149
|
-
export const featureCellBodyClickableClass = clsx(
|
|
161
|
+
export const featureCellBodyClickableClass = clsx(
|
|
162
|
+
"flex h-full cursor-pointer items-center justify-center",
|
|
163
|
+
"px-1",
|
|
164
|
+
);
|
|
150
165
|
|
|
151
166
|
// 재정렬 핸들 래퍼 (touch-none 추가)
|
|
152
|
-
export const reorderCellWrapperClass = clsx(
|
|
167
|
+
export const reorderCellWrapperClass = clsx(
|
|
168
|
+
"flex h-full touch-none items-center justify-center",
|
|
169
|
+
"px-1",
|
|
170
|
+
);
|
|
153
171
|
|
|
154
172
|
// 설정 버튼
|
|
155
173
|
export const configButtonClass = clsx(
|