@j-solution/components 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/assets/jwms-portal-frontend-BtHTA-UF.css +1 -0
- package/assets/styles/global-utilities.css +34 -0
- package/assets/styles/j-components.css +1 -1
- package/assets/styles/themes.css +21 -21
- package/components/atoms/JButton.vue.cjs +6 -1
- package/components/atoms/JButton.vue.cjs.map +1 -1
- package/components/atoms/JButton.vue.js +10 -85
- package/components/atoms/JButton.vue.js.map +1 -1
- package/components/atoms/JButton.vue2.cjs +1 -1
- package/components/atoms/JButton.vue2.cjs.map +1 -1
- package/components/atoms/JButton.vue2.js +85 -2
- package/components/atoms/JButton.vue2.js.map +1 -1
- package/components/atoms/JGrid.vue.cjs +1 -1
- package/components/atoms/JGrid.vue.js +1 -1
- package/components/atoms/JGrid.vue2.cjs +1 -1
- package/components/atoms/JGrid.vue2.cjs.map +1 -1
- package/components/atoms/JGrid.vue2.js +39 -35
- package/components/atoms/JGrid.vue2.js.map +1 -1
- package/components/atoms/JLabel.vue.cjs +1 -1
- package/components/atoms/JLabel.vue.cjs.map +1 -1
- package/components/atoms/JLabel.vue.js +26 -22
- package/components/atoms/JLabel.vue.js.map +1 -1
- package/components/atoms/JSectionTitle.vue.cjs +7 -0
- package/components/atoms/JSectionTitle.vue.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue.js +13 -0
- package/components/atoms/JSectionTitle.vue.js.map +1 -0
- package/components/atoms/JSectionTitle.vue2.cjs +2 -0
- package/components/atoms/JSectionTitle.vue2.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue2.js +67 -0
- package/components/atoms/JSectionTitle.vue2.js.map +1 -0
- package/components/atoms/JSplitter.vue.cjs +6 -1
- package/components/atoms/JSplitter.vue.cjs.map +1 -1
- package/components/atoms/JSplitter.vue.js +10 -59
- package/components/atoms/JSplitter.vue.js.map +1 -1
- package/components/atoms/JSplitter.vue2.cjs +1 -1
- package/components/atoms/JSplitter.vue2.cjs.map +1 -1
- package/components/atoms/JSplitter.vue2.js +59 -2
- package/components/atoms/JSplitter.vue2.js.map +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs.map +1 -1
- package/components/examples/ExampleCrudPage.vue.js +228 -208
- package/components/examples/ExampleCrudPage.vue.js.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.js +341 -368
- package/components/examples/ExampleTabMappingPage.vue.js.map +1 -1
- package/components/molecules/JAlert.vue.cjs +1 -1
- package/components/molecules/JAlert.vue.cjs.map +1 -1
- package/components/molecules/JAlert.vue.js +18 -16
- package/components/molecules/JAlert.vue.js.map +1 -1
- package/components/molecules/JCard.vue.cjs +1 -1
- package/components/molecules/JCard.vue.cjs.map +1 -1
- package/components/molecules/JCard.vue.js +55 -39
- package/components/molecules/JCard.vue.js.map +1 -1
- package/components/molecules/JEmptyState.vue.cjs +7 -0
- package/components/molecules/JEmptyState.vue.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue.js +13 -0
- package/components/molecules/JEmptyState.vue.js.map +1 -0
- package/components/molecules/JEmptyState.vue2.cjs +2 -0
- package/components/molecules/JEmptyState.vue2.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue2.js +127 -0
- package/components/molecules/JEmptyState.vue2.js.map +1 -0
- package/components/molecules/JFormField.vue.cjs +6 -1
- package/components/molecules/JFormField.vue.cjs.map +1 -1
- package/components/molecules/JFormField.vue.js +10 -264
- package/components/molecules/JFormField.vue.js.map +1 -1
- package/components/molecules/JFormField.vue2.cjs +2 -0
- package/components/molecules/JFormField.vue2.cjs.map +1 -0
- package/components/molecules/JFormField.vue2.js +271 -0
- package/components/molecules/JFormField.vue2.js.map +1 -0
- package/components/molecules/JTabs.vue.cjs +1 -1
- package/components/molecules/JTabs.vue.js +1 -1
- package/components/molecules/JTabs.vue2.cjs +1 -1
- package/components/molecules/JTabs.vue2.cjs.map +1 -1
- package/components/molecules/JTabs.vue2.js +44 -50
- package/components/molecules/JTabs.vue2.js.map +1 -1
- package/components/molecules/JTitlebar.vue.cjs +1 -1
- package/components/molecules/JTitlebar.vue.cjs.map +1 -1
- package/components/molecules/JTitlebar.vue.js +23 -20
- package/components/molecules/JTitlebar.vue.js.map +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
- package/components/organisms/JDynamicForm.vue2.js +35 -32
- package/components/organisms/JDynamicForm.vue2.js.map +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs.map +1 -1
- package/components/organisms/JDynamicTabs.vue.js +47 -52
- package/components/organisms/JDynamicTabs.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue.cjs +6 -1
- package/components/organisms/JFilterBar.vue.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue.js +10 -137
- package/components/organisms/JFilterBar.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue2.cjs +1 -1
- package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue2.js +141 -2
- package/components/organisms/JFilterBar.vue2.js.map +1 -1
- package/components/organisms/JFormModal.vue.cjs +1 -1
- package/components/organisms/JFormModal.vue.cjs.map +1 -1
- package/components/organisms/JFormModal.vue.js +54 -49
- package/components/organisms/JFormModal.vue.js.map +1 -1
- package/components/organisms/JHeader.vue.cjs +1 -1
- package/components/organisms/JHeader.vue.cjs.map +1 -1
- package/components/organisms/JHeader.vue.js +191 -190
- package/components/organisms/JHeader.vue.js.map +1 -1
- package/components/organisms/JModal.vue.cjs +1 -1
- package/components/organisms/JModal.vue.cjs.map +1 -1
- package/components/organisms/JModal.vue.js +47 -45
- package/components/organisms/JModal.vue.js.map +1 -1
- package/components/organisms/JPageContainer.vue.cjs +1 -1
- package/components/organisms/JPageContainer.vue.cjs.map +1 -1
- package/components/organisms/JPageContainer.vue.js +22 -22
- package/components/organisms/JPageContainer.vue.js.map +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
- package/components/organisms/JSearchPanel.vue2.js +34 -32
- package/components/organisms/JSearchPanel.vue2.js.map +1 -1
- package/components/organisms/JShuttle.vue.cjs +7 -0
- package/components/organisms/JShuttle.vue.cjs.map +1 -0
- package/components/organisms/JShuttle.vue.js +13 -0
- package/components/organisms/JShuttle.vue.js.map +1 -0
- package/components/organisms/JShuttle.vue2.cjs +2 -0
- package/components/organisms/JShuttle.vue2.cjs.map +1 -0
- package/components/organisms/JShuttle.vue2.js +216 -0
- package/components/organisms/JShuttle.vue2.js.map +1 -0
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +52 -52
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -1
- package/components/shadcn/Card.vue.cjs +1 -1
- package/components/shadcn/Card.vue.cjs.map +1 -1
- package/components/shadcn/Card.vue.js +1 -1
- package/components/shadcn/Card.vue.js.map +1 -1
- package/components/shadcn/CardContent.vue.cjs +1 -1
- package/components/shadcn/CardContent.vue.cjs.map +1 -1
- package/components/shadcn/CardContent.vue.js +4 -4
- package/components/shadcn/CardContent.vue.js.map +1 -1
- package/components/shadcn/CardHeader.vue.cjs +1 -1
- package/components/shadcn/CardHeader.vue.cjs.map +1 -1
- package/components/shadcn/CardHeader.vue.js +5 -5
- package/components/shadcn/CardHeader.vue.js.map +1 -1
- package/components/shadcn/Input.vue.cjs +1 -1
- package/components/shadcn/Input.vue.cjs.map +1 -1
- package/components/shadcn/Input.vue.js +3 -3
- package/components/shadcn/Input.vue.js.map +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
- package/components/shadcn/SelectTrigger.vue.js +1 -1
- package/components/shadcn/SelectTrigger.vue.js.map +1 -1
- package/components/shadcn/TabsContent.vue.cjs +1 -1
- package/components/shadcn/TabsContent.vue.cjs.map +1 -1
- package/components/shadcn/TabsContent.vue.js +1 -1
- package/components/shadcn/TabsContent.vue.js.map +1 -1
- package/components/shadcn/TabsList.vue.cjs +1 -1
- package/components/shadcn/TabsList.vue.cjs.map +1 -1
- package/components/shadcn/TabsList.vue.js +10 -10
- package/components/shadcn/TabsList.vue.js.map +1 -1
- package/components/shadcn/Textarea.vue.cjs +1 -1
- package/components/shadcn/Textarea.vue.cjs.map +1 -1
- package/components/shadcn/Textarea.vue.js +1 -1
- package/components/shadcn/Textarea.vue.js.map +1 -1
- package/components/shadcn/index.cjs +1 -1
- package/components/shadcn/index.cjs.map +1 -1
- package/components/shadcn/index.js +4 -4
- package/components/shadcn/index.js.map +1 -1
- package/components/templates/JLayout.vue.cjs.map +1 -1
- package/components/templates/JLayout.vue.js.map +1 -1
- package/index.cjs +1 -1
- package/index.js +73 -67
- package/package.json +1 -1
- package/types/index.d.ts +920 -777
- package/assets/jwms-portal-frontend-CwxPfHfa.css +0 -1
- package/components/molecules/JFormField.vue3.cjs +0 -2
- package/components/molecules/JFormField.vue3.cjs.map +0 -1
- package/components/molecules/JFormField.vue3.js +0 -6
- package/components/molecules/JFormField.vue3.js.map +0 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as $, ref as s, createBlock as v, openBlock as f, withCtx as r, createVNode as i, unref as o, createElementVNode as m, createTextVNode as p, createCommentVNode as h } from "vue";
|
|
2
2
|
import d from "../molecules/JFormField.vue.js";
|
|
3
|
-
/* empty css */
|
|
4
3
|
import "../shadcn/index.js";
|
|
5
4
|
import "@vueuse/core";
|
|
6
5
|
import "reka-ui";
|
|
@@ -10,8 +9,8 @@ import "lucide-vue-next";
|
|
|
10
9
|
/* empty css */
|
|
11
10
|
/* empty css */
|
|
12
11
|
/* empty css */
|
|
13
|
-
import
|
|
14
|
-
import
|
|
12
|
+
import J from "../molecules/JCard.vue.js";
|
|
13
|
+
import c from "../atoms/JButton.vue.js";
|
|
15
14
|
import "@internationalized/date";
|
|
16
15
|
import "md-editor-v3";
|
|
17
16
|
/* empty css */
|
|
@@ -21,44 +20,47 @@ import "../shadcn/badge-variants.js";
|
|
|
21
20
|
import "../shadcn/avatar-variants.js";
|
|
22
21
|
import "dompurify";
|
|
23
22
|
/* empty css */
|
|
24
|
-
import
|
|
25
|
-
import
|
|
23
|
+
import S from "../atoms/JGrid.vue.js";
|
|
24
|
+
import G from "../atoms/JSplitter.vue.js";
|
|
25
|
+
/* empty css */
|
|
26
26
|
import "vue-sonner";
|
|
27
|
-
import
|
|
27
|
+
import _ from "../molecules/JEmptyState.vue.js";
|
|
28
28
|
/* empty css */
|
|
29
29
|
/* empty css */
|
|
30
|
-
import
|
|
30
|
+
import D from "../organisms/JFilterBar.vue.js";
|
|
31
31
|
import "vue-router";
|
|
32
32
|
/* empty css */
|
|
33
33
|
/* empty css */
|
|
34
|
-
|
|
34
|
+
import E from "../organisms/JPageContainer.vue.js";
|
|
35
|
+
/* empty css */
|
|
36
|
+
const F = { class: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2" }, H = { class: "h-full overflow-auto bg-background" }, O = { class: "h-full overflow-y-auto bg-muted/30" }, T = { class: "grid grid-cols-1 md:grid-cols-2 gap-2" }, W = { class: "grid grid-cols-1 md:grid-cols-2 gap-2 mt-2" }, L = { class: "grid grid-cols-1 gap-2 mt-2" }, Be = /* @__PURE__ */ $({
|
|
35
37
|
__name: "ExampleCrudPage",
|
|
36
|
-
setup(
|
|
37
|
-
const
|
|
38
|
+
setup(X, { expose: k }) {
|
|
39
|
+
const y = s(!1), n = s({
|
|
38
40
|
isActive: "",
|
|
39
41
|
keyword: ""
|
|
40
|
-
}),
|
|
42
|
+
}), V = {
|
|
41
43
|
isActive: {
|
|
42
44
|
label: "활성여부",
|
|
43
|
-
displayValue: (
|
|
45
|
+
displayValue: (t) => t === "Y" ? "Y:활성" : t === "N" ? "N:비활성" : ""
|
|
44
46
|
},
|
|
45
47
|
keyword: {
|
|
46
48
|
label: "검색어"
|
|
47
49
|
}
|
|
48
|
-
},
|
|
50
|
+
}, A = [
|
|
49
51
|
{ value: "Y", label: "Y:활성" },
|
|
50
52
|
{ value: "N", label: "N:비활성" }
|
|
51
|
-
],
|
|
53
|
+
], C = [
|
|
52
54
|
{ value: "A", label: "A등급" },
|
|
53
55
|
{ value: "B", label: "B등급" },
|
|
54
56
|
{ value: "C", label: "C등급" }
|
|
55
|
-
],
|
|
57
|
+
], g = s(), w = s([
|
|
56
58
|
{ code: "C001", name: "제이솔루션", category: "A", isActive: "Y", remark: "주력 고객사" },
|
|
57
59
|
{ code: "C002", name: "ABC물류", category: "B", isActive: "Y", remark: "" },
|
|
58
60
|
{ code: "C003", name: "XYZ유통", category: "A", isActive: "N", remark: "비활성" },
|
|
59
61
|
{ code: "C004", name: "대한물류", category: "B", isActive: "Y", remark: "" },
|
|
60
62
|
{ code: "C005", name: "글로벌이커머스", category: "A", isActive: "Y", remark: "신규 고객사" }
|
|
61
|
-
]),
|
|
63
|
+
]), x = s([
|
|
62
64
|
{
|
|
63
65
|
field: "code",
|
|
64
66
|
headerName: "코드",
|
|
@@ -86,7 +88,7 @@ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" },
|
|
|
86
88
|
field: "isActive",
|
|
87
89
|
headerName: "활성",
|
|
88
90
|
width: 100,
|
|
89
|
-
cellRenderer: (
|
|
91
|
+
cellRenderer: (t) => t.value === "Y" ? "✓" : "",
|
|
90
92
|
enableRowGroup: !0,
|
|
91
93
|
// Row Group으로 사용 가능
|
|
92
94
|
enablePivot: !0
|
|
@@ -99,18 +101,18 @@ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" },
|
|
|
99
101
|
enableValue: !0
|
|
100
102
|
// 집계 가능 (count)
|
|
101
103
|
}
|
|
102
|
-
]),
|
|
104
|
+
]), N = [
|
|
103
105
|
{
|
|
104
106
|
icon: "pencil",
|
|
105
107
|
label: "수정",
|
|
106
108
|
tooltip: "편집",
|
|
107
|
-
onClick: (
|
|
108
|
-
|
|
109
|
-
code:
|
|
110
|
-
name:
|
|
111
|
-
category:
|
|
112
|
-
isActive:
|
|
113
|
-
remark:
|
|
109
|
+
onClick: (t) => {
|
|
110
|
+
u.value = !1, l.value = {
|
|
111
|
+
code: t.code,
|
|
112
|
+
name: t.name,
|
|
113
|
+
category: t.category,
|
|
114
|
+
isActive: t.isActive,
|
|
115
|
+
remark: t.remark
|
|
114
116
|
};
|
|
115
117
|
}
|
|
116
118
|
},
|
|
@@ -119,20 +121,20 @@ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" },
|
|
|
119
121
|
label: "삭제",
|
|
120
122
|
tooltip: "삭제",
|
|
121
123
|
styletype: "danger",
|
|
122
|
-
onClick: (
|
|
123
|
-
confirm(`${
|
|
124
|
+
onClick: (t) => {
|
|
125
|
+
confirm(`${t.name}을(를) 삭제하시겠습니까?`) && (console.log("삭제:", t.code), alert(`삭제되었습니다: ${t.name}`));
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
|
-
],
|
|
128
|
+
], u = s(!1), l = s({
|
|
127
129
|
code: "",
|
|
128
130
|
name: "",
|
|
129
131
|
category: "",
|
|
130
132
|
isActive: "Y",
|
|
131
133
|
remark: ""
|
|
132
134
|
});
|
|
133
|
-
function
|
|
134
|
-
|
|
135
|
-
const e =
|
|
135
|
+
function z(t) {
|
|
136
|
+
u.value = !1;
|
|
137
|
+
const e = t.data;
|
|
136
138
|
l.value = {
|
|
137
139
|
code: e.code,
|
|
138
140
|
name: e.name,
|
|
@@ -141,8 +143,8 @@ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" },
|
|
|
141
143
|
remark: e.remark
|
|
142
144
|
};
|
|
143
145
|
}
|
|
144
|
-
function
|
|
145
|
-
|
|
146
|
+
function Y() {
|
|
147
|
+
u.value = !0, l.value = {
|
|
146
148
|
code: "",
|
|
147
149
|
name: "",
|
|
148
150
|
category: "",
|
|
@@ -150,209 +152,227 @@ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" },
|
|
|
150
152
|
remark: ""
|
|
151
153
|
};
|
|
152
154
|
}
|
|
153
|
-
function
|
|
155
|
+
function B() {
|
|
154
156
|
console.log("저장:", l.value), alert(`저장되었습니다: ${l.value.name}`);
|
|
155
157
|
}
|
|
156
|
-
function
|
|
158
|
+
function U() {
|
|
157
159
|
confirm(`${l.value.name}을(를) 삭제하시겠습니까?`) && (console.log("삭제:", l.value.code), alert(`삭제되었습니다: ${l.value.name}`));
|
|
158
160
|
}
|
|
159
|
-
function
|
|
161
|
+
function b() {
|
|
160
162
|
n.value = {
|
|
161
163
|
isActive: "",
|
|
162
164
|
keyword: ""
|
|
163
165
|
}, console.log("필터 초기화");
|
|
164
166
|
}
|
|
165
|
-
function
|
|
167
|
+
function P() {
|
|
166
168
|
console.log("조회 조건:", n.value);
|
|
167
169
|
}
|
|
168
|
-
function
|
|
170
|
+
function R() {
|
|
169
171
|
alert("고객사 관리 페이지 도움말");
|
|
170
172
|
}
|
|
171
|
-
return
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
default: r(() => [...e[10] || (e[10] = [
|
|
205
|
-
c("조회", -1)
|
|
206
|
-
])]),
|
|
207
|
-
_: 1
|
|
208
|
-
}),
|
|
209
|
-
i(a(p), {
|
|
210
|
-
size: "sm",
|
|
211
|
-
styletype: "primary",
|
|
212
|
-
onClick: x
|
|
213
|
-
}, {
|
|
214
|
-
default: r(() => [...e[11] || (e[11] = [
|
|
215
|
-
c("신규", -1)
|
|
216
|
-
])]),
|
|
217
|
-
_: 1
|
|
218
|
-
})
|
|
219
|
-
]),
|
|
220
|
-
filters: r(() => [
|
|
221
|
-
u("div", T, [
|
|
222
|
-
i(a(d), {
|
|
223
|
-
type: "combo",
|
|
224
|
-
label: "활성여부",
|
|
225
|
-
modelValue: n.value.isActive,
|
|
226
|
-
"onUpdate:modelValue": e[0] || (e[0] = (t) => n.value.isActive = t),
|
|
227
|
-
options: k,
|
|
228
|
-
orientation: "horizontal",
|
|
229
|
-
labelWidth: "30%"
|
|
230
|
-
}, null, 8, ["modelValue"]),
|
|
231
|
-
i(a(d), {
|
|
232
|
-
type: "input",
|
|
233
|
-
label: "검색어",
|
|
234
|
-
modelValue: n.value.keyword,
|
|
235
|
-
"onUpdate:modelValue": e[1] || (e[1] = (t) => n.value.keyword = t),
|
|
236
|
-
orientation: "horizontal",
|
|
237
|
-
labelWidth: "30%"
|
|
238
|
-
}, null, 8, ["modelValue"])
|
|
239
|
-
])
|
|
240
|
-
]),
|
|
241
|
-
_: 1
|
|
242
|
-
}, 8, ["collapsed", "filterValues"]),
|
|
243
|
-
i(a(E), {
|
|
244
|
-
direction: "horizontal",
|
|
245
|
-
"default-size": 60,
|
|
246
|
-
"min-size": 30,
|
|
247
|
-
"second-min-size": 20,
|
|
248
|
-
"second-max-size": 60,
|
|
249
|
-
gap: 2,
|
|
250
|
-
class: "flex-1"
|
|
251
|
-
}, {
|
|
252
|
-
left: r(() => [
|
|
253
|
-
u("div", W, [
|
|
254
|
-
i(a(D), {
|
|
255
|
-
ref_key: "gridRef",
|
|
256
|
-
ref: v,
|
|
257
|
-
columnDefs: C.value,
|
|
258
|
-
rowData: A.value,
|
|
259
|
-
"action-buttons": w,
|
|
260
|
-
enableGrouping: !0,
|
|
261
|
-
enablePivot: !0,
|
|
262
|
-
enableColumnsToolPanel: !0,
|
|
263
|
-
rowGroupPanelShow: "always",
|
|
264
|
-
pivotPanelShow: "always",
|
|
265
|
-
groupDefaultExpanded: 1,
|
|
266
|
-
compactFooter: !0,
|
|
267
|
-
onRowClicked: _
|
|
268
|
-
}, null, 8, ["columnDefs", "rowData"])
|
|
269
|
-
])
|
|
270
|
-
]),
|
|
271
|
-
right: r(() => [
|
|
272
|
-
u("div", j, [
|
|
273
|
-
i(a(G), {
|
|
274
|
-
class: "h-full",
|
|
275
|
-
title: m.value ? "신규 등록" : "상세 정보"
|
|
173
|
+
return k({ gridRef: g }), (t, e) => (f(), v(E, {
|
|
174
|
+
title: "고객사 관리",
|
|
175
|
+
icon: "building",
|
|
176
|
+
description: "고객사 정보를 조회하고 관리합니다",
|
|
177
|
+
showHelp: !0,
|
|
178
|
+
onHelp: R,
|
|
179
|
+
"content-scroll": !1
|
|
180
|
+
}, {
|
|
181
|
+
default: r(() => [
|
|
182
|
+
i(o(D), {
|
|
183
|
+
collapsed: y.value,
|
|
184
|
+
"onUpdate:collapsed": e[2] || (e[2] = (a) => y.value = a),
|
|
185
|
+
filterValues: n.value,
|
|
186
|
+
"onUpdate:filterValues": e[3] || (e[3] = (a) => n.value = a),
|
|
187
|
+
filterDisplay: V,
|
|
188
|
+
collapsible: !0,
|
|
189
|
+
title: "고객사 목록"
|
|
190
|
+
}, {
|
|
191
|
+
actions: r(() => [
|
|
192
|
+
i(o(c), {
|
|
193
|
+
size: "xs",
|
|
194
|
+
variant: "outline",
|
|
195
|
+
onClick: b
|
|
196
|
+
}, {
|
|
197
|
+
default: r(() => [...e[9] || (e[9] = [
|
|
198
|
+
p("초기화", -1)
|
|
199
|
+
])]),
|
|
200
|
+
_: 1
|
|
201
|
+
}),
|
|
202
|
+
i(o(c), {
|
|
203
|
+
size: "xs",
|
|
204
|
+
styletype: "primary",
|
|
205
|
+
onClick: P
|
|
276
206
|
}, {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
207
|
+
default: r(() => [...e[10] || (e[10] = [
|
|
208
|
+
p("조회", -1)
|
|
209
|
+
])]),
|
|
210
|
+
_: 1
|
|
211
|
+
}),
|
|
212
|
+
i(o(c), {
|
|
213
|
+
size: "xs",
|
|
214
|
+
styletype: "primary",
|
|
215
|
+
onClick: Y
|
|
216
|
+
}, {
|
|
217
|
+
default: r(() => [...e[11] || (e[11] = [
|
|
218
|
+
p("신규", -1)
|
|
219
|
+
])]),
|
|
220
|
+
_: 1
|
|
221
|
+
})
|
|
222
|
+
]),
|
|
223
|
+
filters: r(() => [
|
|
224
|
+
m("div", F, [
|
|
225
|
+
i(o(d), {
|
|
226
|
+
type: "combo",
|
|
227
|
+
label: "활성여부",
|
|
228
|
+
modelValue: n.value.isActive,
|
|
229
|
+
"onUpdate:modelValue": e[0] || (e[0] = (a) => n.value.isActive = a),
|
|
230
|
+
options: A,
|
|
231
|
+
orientation: "horizontal",
|
|
232
|
+
labelWidth: "30%"
|
|
233
|
+
}, null, 8, ["modelValue"]),
|
|
234
|
+
i(o(d), {
|
|
235
|
+
type: "input",
|
|
236
|
+
label: "검색어",
|
|
237
|
+
modelValue: n.value.keyword,
|
|
238
|
+
"onUpdate:modelValue": e[1] || (e[1] = (a) => n.value.keyword = a),
|
|
239
|
+
orientation: "horizontal",
|
|
240
|
+
labelWidth: "30%"
|
|
241
|
+
}, null, 8, ["modelValue"])
|
|
242
|
+
])
|
|
243
|
+
]),
|
|
244
|
+
_: 1
|
|
245
|
+
}, 8, ["collapsed", "filterValues"]),
|
|
246
|
+
i(o(G), {
|
|
247
|
+
direction: "horizontal",
|
|
248
|
+
"default-size": 60,
|
|
249
|
+
"min-size": 30,
|
|
250
|
+
"second-min-size": 20,
|
|
251
|
+
"second-max-size": 60,
|
|
252
|
+
class: "flex-1"
|
|
253
|
+
}, {
|
|
254
|
+
left: r(() => [
|
|
255
|
+
m("div", H, [
|
|
256
|
+
i(o(S), {
|
|
257
|
+
ref_key: "gridRef",
|
|
258
|
+
ref: g,
|
|
259
|
+
columnDefs: x.value,
|
|
260
|
+
rowData: w.value,
|
|
261
|
+
"action-buttons": N,
|
|
262
|
+
enableGrouping: !0,
|
|
263
|
+
enablePivot: !0,
|
|
264
|
+
enableColumnsToolPanel: !0,
|
|
265
|
+
rowGroupPanelShow: "always",
|
|
266
|
+
pivotPanelShow: "always",
|
|
267
|
+
groupDefaultExpanded: 1,
|
|
268
|
+
compactFooter: !0,
|
|
269
|
+
onRowClicked: z
|
|
270
|
+
}, null, 8, ["columnDefs", "rowData"])
|
|
271
|
+
])
|
|
272
|
+
]),
|
|
273
|
+
right: r(() => [
|
|
274
|
+
m("div", O, [
|
|
275
|
+
!l.value.code && !u.value ? (f(), v(o(_), {
|
|
276
|
+
key: 0,
|
|
277
|
+
variant: "simple",
|
|
278
|
+
icon: "mousePointerClick",
|
|
279
|
+
title: "항목을 선택하거나 신규 버튼을 클릭하세요",
|
|
280
|
+
class: "h-full"
|
|
281
|
+
})) : (f(), v(o(J), {
|
|
282
|
+
key: 1,
|
|
283
|
+
class: "h-full",
|
|
284
|
+
title: u.value ? "신규 등록" : "상세 정보",
|
|
285
|
+
variant: "elevated"
|
|
286
|
+
}, {
|
|
287
|
+
actions: r(() => [
|
|
288
|
+
i(o(c), {
|
|
289
|
+
size: "xs",
|
|
280
290
|
styletype: "primary",
|
|
281
|
-
|
|
282
|
-
onClick: N
|
|
291
|
+
onClick: B
|
|
283
292
|
}, {
|
|
284
293
|
default: r(() => [...e[12] || (e[12] = [
|
|
285
|
-
|
|
294
|
+
p("저장", -1)
|
|
286
295
|
])]),
|
|
287
296
|
_: 1
|
|
288
297
|
}),
|
|
289
|
-
|
|
298
|
+
u.value ? h("", !0) : (f(), v(o(c), {
|
|
290
299
|
key: 0,
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
onClick:
|
|
300
|
+
size: "xs",
|
|
301
|
+
variant: "destructive",
|
|
302
|
+
onClick: U
|
|
294
303
|
}, {
|
|
295
304
|
default: r(() => [...e[13] || (e[13] = [
|
|
296
|
-
|
|
305
|
+
p("삭제", -1)
|
|
306
|
+
])]),
|
|
307
|
+
_: 1
|
|
308
|
+
})),
|
|
309
|
+
i(o(c), {
|
|
310
|
+
size: "xs",
|
|
311
|
+
variant: "outline",
|
|
312
|
+
onClick: b
|
|
313
|
+
}, {
|
|
314
|
+
default: r(() => [...e[14] || (e[14] = [
|
|
315
|
+
p("취소", -1)
|
|
297
316
|
])]),
|
|
298
317
|
_: 1
|
|
299
|
-
})
|
|
300
|
-
])
|
|
301
|
-
]),
|
|
302
|
-
default: r(() => [
|
|
303
|
-
u("div", F, [
|
|
304
|
-
i(a(d), {
|
|
305
|
-
type: "input",
|
|
306
|
-
label: "코드",
|
|
307
|
-
modelValue: l.value.code,
|
|
308
|
-
"onUpdate:modelValue": e[4] || (e[4] = (t) => l.value.code = t),
|
|
309
|
-
readonly: !m.value,
|
|
310
|
-
placeholder: "고객사 코드"
|
|
311
|
-
}, null, 8, ["modelValue", "readonly"]),
|
|
312
|
-
i(a(d), {
|
|
313
|
-
type: "input",
|
|
314
|
-
label: "이름",
|
|
315
|
-
modelValue: l.value.name,
|
|
316
|
-
"onUpdate:modelValue": e[5] || (e[5] = (t) => l.value.name = t),
|
|
317
|
-
placeholder: "고객사 이름"
|
|
318
|
-
}, null, 8, ["modelValue"])
|
|
318
|
+
})
|
|
319
319
|
]),
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
320
|
+
default: r(() => [
|
|
321
|
+
m("div", T, [
|
|
322
|
+
i(o(d), {
|
|
323
|
+
type: "input",
|
|
324
|
+
label: "코드",
|
|
325
|
+
modelValue: l.value.code,
|
|
326
|
+
"onUpdate:modelValue": e[4] || (e[4] = (a) => l.value.code = a),
|
|
327
|
+
readonly: !u.value,
|
|
328
|
+
placeholder: "고객사 코드"
|
|
329
|
+
}, null, 8, ["modelValue", "readonly"]),
|
|
330
|
+
i(o(d), {
|
|
331
|
+
type: "input",
|
|
332
|
+
label: "이름",
|
|
333
|
+
modelValue: l.value.name,
|
|
334
|
+
"onUpdate:modelValue": e[5] || (e[5] = (a) => l.value.name = a),
|
|
335
|
+
placeholder: "고객사 이름"
|
|
336
|
+
}, null, 8, ["modelValue"])
|
|
337
|
+
]),
|
|
338
|
+
m("div", W, [
|
|
339
|
+
i(o(d), {
|
|
340
|
+
type: "combo",
|
|
341
|
+
label: "분류",
|
|
342
|
+
modelValue: l.value.category,
|
|
343
|
+
"onUpdate:modelValue": e[6] || (e[6] = (a) => l.value.category = a),
|
|
344
|
+
options: C
|
|
345
|
+
}, null, 8, ["modelValue"]),
|
|
346
|
+
i(o(d), {
|
|
347
|
+
type: "checkbox",
|
|
348
|
+
label: "활성여부",
|
|
349
|
+
modelValue: l.value.isActive,
|
|
350
|
+
"onUpdate:modelValue": e[7] || (e[7] = (a) => l.value.isActive = a),
|
|
351
|
+
inlineLabel: "활성"
|
|
352
|
+
}, null, 8, ["modelValue"])
|
|
353
|
+
]),
|
|
354
|
+
m("div", L, [
|
|
355
|
+
i(o(d), {
|
|
356
|
+
type: "textarea",
|
|
357
|
+
label: "비고",
|
|
358
|
+
modelValue: l.value.remark,
|
|
359
|
+
"onUpdate:modelValue": e[8] || (e[8] = (a) => l.value.remark = a),
|
|
360
|
+
placeholder: "비고"
|
|
361
|
+
}, null, 8, ["modelValue"])
|
|
362
|
+
])
|
|
335
363
|
]),
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
]),
|
|
346
|
-
_: 1
|
|
347
|
-
}, 8, ["title"])
|
|
348
|
-
])
|
|
349
|
-
]),
|
|
350
|
-
_: 1
|
|
351
|
-
})
|
|
352
|
-
]));
|
|
364
|
+
_: 1
|
|
365
|
+
}, 8, ["title"]))
|
|
366
|
+
])
|
|
367
|
+
]),
|
|
368
|
+
_: 1
|
|
369
|
+
})
|
|
370
|
+
]),
|
|
371
|
+
_: 1
|
|
372
|
+
}));
|
|
353
373
|
}
|
|
354
374
|
});
|
|
355
375
|
export {
|
|
356
|
-
|
|
376
|
+
Be as default
|
|
357
377
|
};
|
|
358
378
|
//# sourceMappingURL=ExampleCrudPage.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExampleCrudPage.vue.js","sources":["../../../../src/components/examples/ExampleCrudPage.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col h-full gap-2 bg-background text-foreground\">\n <!-- ==================== 타이틀바 ==================== -->\n <JTitlebar \n icon=\"building\" \n title=\"고객사 관리\" \n description=\"고객사 정보를 조회하고 관리합니다\"\n :showHelp=\"true\" \n @help=\"onHelp\" \n />\n\n <!-- ==================== 필터바 ==================== -->\n <JFilterBar\n v-model:collapsed=\"filterCollapsed\"\n v-model:filterValues=\"filterValues\"\n :filterDisplay=\"filterDisplay\"\n :collapsible=\"true\"\n title=\"고객사 목록\"\n >\n <!-- 액션 버튼 -->\n <template #actions>\n <JButton size=\"sm\" variant=\"outline\" @click=\"onReset\">초기화</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onSearch\">조회</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onNew\">신규</JButton>\n </template>\n\n <!-- 필터 필드 - 다중 열 배치 -->\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"filterValues.isActive\"\n :options=\"activeOptions\"\n orientation=\"horizontal\"\n labelWidth=\"30%\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"filterValues.keyword\"\n orientation=\"horizontal\"\n labelWidth=\"30%\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- ==================== 그리드 + 상세 영역 (Resizable) ==================== -->\n <JSplitter\n direction=\"horizontal\"\n :default-size=\"60\"\n :min-size=\"30\"\n :second-min-size=\"20\"\n :second-max-size=\"60\"\n :gap=\"2\"\n class=\"flex-1\"\n >\n <!-- 좌측: 그리드 -->\n <template #left>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"gridRef\"\n :columnDefs=\"columnDefs\"\n :rowData=\"rowData\"\n :action-buttons=\"actionButtons\"\n :enableGrouping=\"true\"\n :enablePivot=\"true\"\n :enableColumnsToolPanel=\"true\"\n rowGroupPanelShow=\"always\"\n pivotPanelShow=\"always\"\n :groupDefaultExpanded=\"1\"\n :compactFooter=\"true\"\n @row-clicked=\"onRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div class=\"h-full overflow-y-auto border-l bg-muted/30\">\n <JCard class=\"h-full\" :title=\"isNew ? '신규 등록' : '상세 정보'\">\n\n <!-- 2열 그리드: 코드, 이름 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2\">\n <JFormField\n type=\"input\"\n label=\"코드\"\n v-model=\"detail.code\"\n :readonly=\"!isNew\"\n placeholder=\"고객사 코드\"\n />\n <JFormField\n type=\"input\"\n label=\"이름\"\n v-model=\"detail.name\"\n placeholder=\"고객사 이름\"\n />\n </div>\n\n <!-- 2열 그리드: 분류, 활성여부 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2\">\n <JFormField\n type=\"combo\"\n label=\"분류\"\n v-model=\"detail.category\"\n :options=\"categoryOptions\"\n />\n <JFormField\n type=\"checkbox\"\n label=\"활성여부\"\n v-model=\"detail.isActive\"\n inlineLabel=\"활성\"\n />\n </div>\n <div class=\"grid grid-cols-1 gap-2 mt-2\">\n <!-- 전체 너비: 비고 -->\n <JFormField type=\"textarea\" label=\"비고\" v-model=\"detail.remark\" placeholder=\"비고\" />\n\n </div>\n\n \n <!-- 액션 버튼 -->\n <template #footer>\n <div class=\"flex justify-end gap-2\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onSave\">저장</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onDelete\" v-if=\"!isNew\">삭제</JButton>\n </div>\n </template>\n </JCard>\n </div>\n </template>\n </JSplitter>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { JTitlebar, JCard } from '@/components/molecules'\nimport { JFilterBar } from '@/components/organisms'\nimport { JGrid, JButton, JSplitter, type ActionButton } from '@/components/atoms'\nimport { JFormField } from '@/components/molecules'\n\n// ==================== 필터 상태 ====================\nconst filterCollapsed = ref(false)\n\n// 필터 값 (v-model:filterValues)\nconst filterValues = ref({\n isActive: '',\n keyword: '',\n})\n\n// 필터 표시 설정 (배지에 표시될 라벨 및 값 변환 함수)\nconst filterDisplay = {\n isActive: {\n label: '활성여부',\n displayValue: (val: unknown) => {\n if (val === 'Y') return 'Y:활성'\n if (val === 'N') return 'N:비활성'\n return ''\n },\n },\n keyword: {\n label: '검색어',\n },\n}\n\n// ==================== 옵션 데이터 ====================\nconst activeOptions = [\n { value: 'Y', label: 'Y:활성' },\n { value: 'N', label: 'N:비활성' },\n]\n\nconst categoryOptions = [\n { value: 'A', label: 'A등급' },\n { value: 'B', label: 'B등급' },\n { value: 'C', label: 'C등급' },\n]\n\n// ==================== 그리드 설정 ====================\nconst gridRef = ref()\n\n// Mock 데이터 - 실제 백엔드 응답 구조\nconst rowData = ref([\n { code: 'C001', name: '제이솔루션', category: 'A', isActive: 'Y', remark: '주력 고객사' },\n { code: 'C002', name: 'ABC물류', category: 'B', isActive: 'Y', remark: '' },\n { code: 'C003', name: 'XYZ유통', category: 'A', isActive: 'N', remark: '비활성' },\n { code: 'C004', name: '대한물류', category: 'B', isActive: 'Y', remark: '' },\n { code: 'C005', name: '글로벌이커머스', category: 'A', isActive: 'Y', remark: '신규 고객사' },\n])\n\nconst columnDefs = ref([\n { \n field: 'code', \n headerName: '코드', \n width: 120,\n enableValue: true, // 집계 가능 (count)\n },\n { \n field: 'name', \n headerName: '이름', \n width: 200,\n enableValue: true, // 집계 가능 (count)\n },\n { \n field: 'category', \n headerName: '분류', \n width: 100,\n enableRowGroup: true, // Row Group으로 사용 가능\n enablePivot: true, // Pivot Column으로 사용 가능\n },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n enableRowGroup: true, // Row Group으로 사용 가능\n enablePivot: true, // Pivot Column으로 사용 가능\n },\n { \n field: 'remark', \n headerName: '비고', \n flex: 1,\n enableValue: true, // 집계 가능 (count)\n },\n])\n\n// 행별 액션 버튼\nconst actionButtons: ActionButton[] = [\n {\n icon: 'pencil',\n label: '수정',\n tooltip: '편집',\n onClick: (rowData: any) => {\n isNew.value = false\n detail.value = {\n code: rowData.code,\n name: rowData.name,\n category: rowData.category,\n isActive: rowData.isActive,\n remark: rowData.remark,\n }\n },\n },\n {\n icon: 'trash2',\n label: '삭제',\n tooltip: '삭제',\n styletype: 'danger',\n onClick: (rowData: any) => {\n if (confirm(`${rowData.name}을(를) 삭제하시겠습니까?`)) {\n console.log('삭제:', rowData.code)\n alert(`삭제되었습니다: ${rowData.name}`)\n }\n },\n },\n]\n\n// ==================== 상세 영역 상태 ====================\nconst isNew = ref(false)\nconst detail = ref({\n code: '',\n name: '',\n category: '',\n isActive: 'Y',\n remark: '',\n})\n\n// ==================== 이벤트 핸들러 ====================\n\n/**\n * 그리드 행 클릭 핸들러\n */\nfunction onRowClicked(event: any) {\n isNew.value = false\n const rowData = event.data\n\n // 선택된 행 데이터를 상세 영역에 바인딩\n detail.value = {\n code: rowData.code,\n name: rowData.name,\n category: rowData.category,\n isActive: rowData.isActive,\n remark: rowData.remark,\n }\n}\n\n/**\n * 신규 버튼 클릭\n */\nfunction onNew() {\n isNew.value = true\n // 상세 영역 초기화\n detail.value = {\n code: '',\n name: '',\n category: '',\n isActive: 'Y',\n remark: '',\n }\n}\n\n/**\n * 저장 버튼 클릭\n */\nfunction onSave() {\n console.log('저장:', detail.value)\n // TODO: 실제 구현 시 API 호출로 대체\n // if (isNew.value) {\n // await api.createCustomer(detail.value)\n // } else {\n // await api.updateCustomer(detail.value.code, detail.value)\n // }\n // 성공 시 그리드 데이터 갱신\n alert(`저장되었습니다: ${detail.value.name}`)\n}\n\n/**\n * 삭제 버튼 클릭\n */\nfunction onDelete() {\n if (confirm(`${detail.value.name}을(를) 삭제하시겠습니까?`)) {\n console.log('삭제:', detail.value.code)\n // TODO: 실제 구현 시 API 호출로 대체\n // await api.deleteCustomer(detail.value.code)\n // 성공 시 그리드에서 해당 행 제거\n alert(`삭제되었습니다: ${detail.value.name}`)\n }\n}\n\n/**\n * 초기화 버튼 클릭\n */\nfunction onReset() {\n filterValues.value = {\n isActive: '',\n keyword: '',\n }\n console.log('필터 초기화')\n}\n\n/**\n * 조회 버튼 클릭\n */\nfunction onSearch() {\n console.log('조회 조건:', filterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n // const result = await api.searchCustomers(filterValues.value)\n // rowData.value = result.data\n}\n\n/**\n * 도움말 아이콘 클릭\n */\nfunction onHelp() {\n alert('고객사 관리 페이지 도움말')\n}\n\ndefineExpose({ gridRef })\n</script>\n"],"names":["filterCollapsed","ref","filterValues","filterDisplay","val","activeOptions","categoryOptions","gridRef","rowData","columnDefs","params","actionButtons","isNew","detail","onRowClicked","event","onNew","onSave","onDelete","onReset","onSearch","onHelp","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","JTitlebar","JFilterBar","$event","JButton","_cache","_createElementVNode","_hoisted_2","JFormField","JSplitter","_hoisted_3","JGrid","_hoisted_4","JCard","_hoisted_8","_createBlock","_hoisted_5","_hoisted_6","_hoisted_7"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExampleCrudPage.vue.js","sources":["../../../../src/components/examples/ExampleCrudPage.vue"],"sourcesContent":["<template>\n <JPageContainer title=\"고객사 관리\" icon=\"building\" description=\"고객사 정보를 조회하고 관리합니다\" :showHelp=\"true\" @help=\"onHelp\" :content-scroll=\"false\">\n\n <!-- ==================== 필터바 ==================== -->\n <JFilterBar\n v-model:collapsed=\"filterCollapsed\"\n v-model:filterValues=\"filterValues\"\n :filterDisplay=\"filterDisplay\"\n :collapsible=\"true\"\n title=\"고객사 목록\"\n >\n <!-- 액션 버튼 -->\n <template #actions>\n <JButton size=\"xs\" variant=\"outline\" @click=\"onReset\">초기화</JButton>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onSearch\">조회</JButton>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onNew\">신규</JButton>\n </template>\n\n <!-- 필터 필드 - 다중 열 배치 -->\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"filterValues.isActive\"\n :options=\"activeOptions\"\n orientation=\"horizontal\"\n labelWidth=\"30%\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"filterValues.keyword\"\n orientation=\"horizontal\"\n labelWidth=\"30%\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- ==================== 그리드 + 상세 영역 (Resizable) ==================== -->\n <JSplitter\n direction=\"horizontal\"\n :default-size=\"60\"\n :min-size=\"30\"\n :second-min-size=\"20\"\n :second-max-size=\"60\"\n class=\"flex-1\"\n >\n <!-- 좌측: 그리드 -->\n <template #left>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"gridRef\"\n :columnDefs=\"columnDefs\"\n :rowData=\"rowData\"\n :action-buttons=\"actionButtons\"\n :enableGrouping=\"true\"\n :enablePivot=\"true\"\n :enableColumnsToolPanel=\"true\"\n rowGroupPanelShow=\"always\"\n pivotPanelShow=\"always\"\n :groupDefaultExpanded=\"1\"\n :compactFooter=\"true\"\n @row-clicked=\"onRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div class=\"h-full overflow-y-auto bg-muted/30\">\n <!-- 선택된 항목이 없을 때: EmptyState -->\n <JEmptyState\n v-if=\"!detail.code && !isNew\"\n variant=\"simple\"\n icon=\"mousePointerClick\"\n title=\"항목을 선택하거나 신규 버튼을 클릭하세요\"\n class=\"h-full\"\n />\n \n <!-- 선택된 항목이 있거나 신규일 때: 상세 폼 -->\n <JCard \n v-else\n class=\"h-full\" \n :title=\"isNew ? '신규 등록' : '상세 정보'\"\n variant=\"elevated\"\n >\n <!-- actions 슬롯 (header 우측 버튼) -->\n <template #actions>\n <JButton size=\"xs\" styletype=\"primary\" @click=\"onSave\">저장</JButton>\n <JButton size=\"xs\" variant=\"destructive\" v-if=\"!isNew\" @click=\"onDelete\">삭제</JButton>\n <JButton size=\"xs\" variant=\"outline\" @click=\"onReset\">취소</JButton>\n </template>\n\n <!-- 2열 그리드: 코드, 이름 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\n <JFormField\n type=\"input\"\n label=\"코드\"\n v-model=\"detail.code\"\n :readonly=\"!isNew\"\n placeholder=\"고객사 코드\"\n />\n <JFormField\n type=\"input\"\n label=\"이름\"\n v-model=\"detail.name\"\n placeholder=\"고객사 이름\"\n />\n </div>\n\n <!-- 2열 그리드: 분류, 활성여부 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2\">\n <JFormField\n type=\"combo\"\n label=\"분류\"\n v-model=\"detail.category\"\n :options=\"categoryOptions\"\n />\n <JFormField\n type=\"checkbox\"\n label=\"활성여부\"\n v-model=\"detail.isActive\"\n inlineLabel=\"활성\"\n />\n </div>\n <div class=\"grid grid-cols-1 gap-2 mt-2\">\n <!-- 전체 너비: 비고 -->\n <JFormField type=\"textarea\" label=\"비고\" v-model=\"detail.remark\" placeholder=\"비고\" />\n\n </div>\n\n </JCard>\n </div>\n </template>\n </JSplitter>\n </JPageContainer> \n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { JTitlebar, JCard, JEmptyState } from '@/components/molecules'\nimport { JFilterBar } from '@/components/organisms'\nimport { JGrid, JButton, JSplitter, type ActionButton } from '@/components/atoms'\nimport { JFormField } from '@/components/molecules'\nimport JPageContainer from '../organisms/JPageContainer.vue'\n\n// ==================== 필터 상태 ====================\nconst filterCollapsed = ref(false)\n\n// 필터 값 (v-model:filterValues)\nconst filterValues = ref({\n isActive: '',\n keyword: '',\n})\n\n// 필터 표시 설정 (배지에 표시될 라벨 및 값 변환 함수)\nconst filterDisplay = {\n isActive: {\n label: '활성여부',\n displayValue: (val: unknown) => {\n if (val === 'Y') return 'Y:활성'\n if (val === 'N') return 'N:비활성'\n return ''\n },\n },\n keyword: {\n label: '검색어',\n },\n}\n\n// ==================== 옵션 데이터 ====================\nconst activeOptions = [\n { value: 'Y', label: 'Y:활성' },\n { value: 'N', label: 'N:비활성' },\n]\n\nconst categoryOptions = [\n { value: 'A', label: 'A등급' },\n { value: 'B', label: 'B등급' },\n { value: 'C', label: 'C등급' },\n]\n\n// ==================== 그리드 설정 ====================\nconst gridRef = ref()\n\n// Mock 데이터 - 실제 백엔드 응답 구조\nconst rowData = ref([\n { code: 'C001', name: '제이솔루션', category: 'A', isActive: 'Y', remark: '주력 고객사' },\n { code: 'C002', name: 'ABC물류', category: 'B', isActive: 'Y', remark: '' },\n { code: 'C003', name: 'XYZ유통', category: 'A', isActive: 'N', remark: '비활성' },\n { code: 'C004', name: '대한물류', category: 'B', isActive: 'Y', remark: '' },\n { code: 'C005', name: '글로벌이커머스', category: 'A', isActive: 'Y', remark: '신규 고객사' },\n])\n\nconst columnDefs = ref([\n { \n field: 'code', \n headerName: '코드', \n width: 120,\n enableValue: true, // 집계 가능 (count)\n },\n { \n field: 'name', \n headerName: '이름', \n width: 200,\n enableValue: true, // 집계 가능 (count)\n },\n { \n field: 'category', \n headerName: '분류', \n width: 100,\n enableRowGroup: true, // Row Group으로 사용 가능\n enablePivot: true, // Pivot Column으로 사용 가능\n },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n enableRowGroup: true, // Row Group으로 사용 가능\n enablePivot: true, // Pivot Column으로 사용 가능\n },\n { \n field: 'remark', \n headerName: '비고', \n flex: 1,\n enableValue: true, // 집계 가능 (count)\n },\n])\n\n// 행별 액션 버튼\nconst actionButtons: ActionButton[] = [\n {\n icon: 'pencil',\n label: '수정',\n tooltip: '편집',\n onClick: (rowData: any) => {\n isNew.value = false\n detail.value = {\n code: rowData.code,\n name: rowData.name,\n category: rowData.category,\n isActive: rowData.isActive,\n remark: rowData.remark,\n }\n },\n },\n {\n icon: 'trash2',\n label: '삭제',\n tooltip: '삭제',\n styletype: 'danger',\n onClick: (rowData: any) => {\n if (confirm(`${rowData.name}을(를) 삭제하시겠습니까?`)) {\n console.log('삭제:', rowData.code)\n alert(`삭제되었습니다: ${rowData.name}`)\n }\n },\n },\n]\n\n// ==================== 상세 영역 상태 ====================\nconst isNew = ref(false)\nconst detail = ref({\n code: '',\n name: '',\n category: '',\n isActive: 'Y',\n remark: '',\n})\n\n// ==================== 이벤트 핸들러 ====================\n\n/**\n * 그리드 행 클릭 핸들러\n */\nfunction onRowClicked(event: any) {\n isNew.value = false\n const rowData = event.data\n\n // 선택된 행 데이터를 상세 영역에 바인딩\n detail.value = {\n code: rowData.code,\n name: rowData.name,\n category: rowData.category,\n isActive: rowData.isActive,\n remark: rowData.remark,\n }\n}\n\n/**\n * 신규 버튼 클릭\n */\nfunction onNew() {\n isNew.value = true\n // 상세 영역 초기화\n detail.value = {\n code: '',\n name: '',\n category: '',\n isActive: 'Y',\n remark: '',\n }\n}\n\n/**\n * 저장 버튼 클릭\n */\nfunction onSave() {\n console.log('저장:', detail.value)\n // TODO: 실제 구현 시 API 호출로 대체\n // if (isNew.value) {\n // await api.createCustomer(detail.value)\n // } else {\n // await api.updateCustomer(detail.value.code, detail.value)\n // }\n // 성공 시 그리드 데이터 갱신\n alert(`저장되었습니다: ${detail.value.name}`)\n}\n\n/**\n * 삭제 버튼 클릭\n */\nfunction onDelete() {\n if (confirm(`${detail.value.name}을(를) 삭제하시겠습니까?`)) {\n console.log('삭제:', detail.value.code)\n // TODO: 실제 구현 시 API 호출로 대체\n // await api.deleteCustomer(detail.value.code)\n // 성공 시 그리드에서 해당 행 제거\n alert(`삭제되었습니다: ${detail.value.name}`)\n }\n}\n\n/**\n * 초기화 버튼 클릭\n */\nfunction onReset() {\n filterValues.value = {\n isActive: '',\n keyword: '',\n }\n console.log('필터 초기화')\n}\n\n/**\n * 조회 버튼 클릭\n */\nfunction onSearch() {\n console.log('조회 조건:', filterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n // const result = await api.searchCustomers(filterValues.value)\n // rowData.value = result.data\n}\n\n/**\n * 도움말 아이콘 클릭\n */\nfunction onHelp() {\n alert('고객사 관리 페이지 도움말')\n}\n\ndefineExpose({ gridRef })\n</script>\n"],"names":["filterCollapsed","ref","filterValues","filterDisplay","val","activeOptions","categoryOptions","gridRef","rowData","columnDefs","params","actionButtons","isNew","detail","onRowClicked","event","onNew","onSave","onDelete","onReset","onSearch","onHelp","__expose","_createBlock","JPageContainer","_createVNode","_unref","JFilterBar","$event","JButton","_cache","_createElementVNode","_hoisted_1","JFormField","JSplitter","_hoisted_2","JGrid","_hoisted_3","JEmptyState","JCard","_hoisted_4","_hoisted_5","_hoisted_6"],"mappings":"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"}
|