@j-solution/components 1.5.0 → 1.6.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.
- package/README.md +5 -6
- package/assets/jwms-portal-frontend-DntSIcYt.css +1 -0
- package/assets/styles/j-components.css +1 -1
- package/components/atoms/JGrid.vue.cjs +1 -1
- package/components/atoms/JGrid.vue.js +2 -2
- package/components/atoms/JGrid.vue2.cjs +1 -1
- package/components/atoms/JGrid.vue2.cjs.map +1 -1
- package/components/atoms/JGrid.vue2.js +124 -56
- package/components/atoms/JGrid.vue2.js.map +1 -1
- package/components/atoms/JSplitter.vue.cjs +2 -0
- package/components/atoms/JSplitter.vue.cjs.map +1 -0
- package/components/atoms/JSplitter.vue.js +57 -0
- package/components/atoms/JSplitter.vue.js.map +1 -0
- package/components/atoms/JSplitter.vue2.cjs +2 -0
- package/components/atoms/JSplitter.vue2.cjs.map +1 -0
- package/components/atoms/JSplitter.vue2.js +5 -0
- package/components/atoms/JSplitter.vue2.js.map +1 -0
- package/components/examples/ExampleCrudPage.vue.cjs +2 -0
- package/components/examples/ExampleCrudPage.vue.cjs.map +1 -0
- package/components/examples/ExampleCrudPage.vue.js +304 -0
- package/components/examples/ExampleCrudPage.vue.js.map +1 -0
- package/components/examples/ExampleCrudPage.vue2.cjs +2 -0
- package/components/examples/ExampleCrudPage.vue2.cjs.map +1 -0
- package/components/examples/ExampleCrudPage.vue2.js +5 -0
- package/components/examples/ExampleCrudPage.vue2.js.map +1 -0
- package/components/examples/ExampleTabMappingPage.vue.cjs +2 -0
- package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -0
- package/components/examples/ExampleTabMappingPage.vue.js +479 -0
- package/components/examples/ExampleTabMappingPage.vue.js.map +1 -0
- package/components/examples/ExampleTabMappingPage.vue2.cjs +2 -0
- package/components/examples/ExampleTabMappingPage.vue2.cjs.map +1 -0
- package/components/examples/ExampleTabMappingPage.vue2.js +5 -0
- package/components/examples/ExampleTabMappingPage.vue2.js.map +1 -0
- package/components/molecules/JTitlebar.vue.cjs +1 -1
- package/components/molecules/JTitlebar.vue.cjs.map +1 -1
- package/components/molecules/JTitlebar.vue.js +48 -40
- package/components/molecules/JTitlebar.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue.cjs +1 -1
- package/components/organisms/JFilterBar.vue.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue.js +60 -53
- package/components/organisms/JFilterBar.vue.js.map +1 -1
- package/components/shadcn/resizable/ResizableHandle.vue.cjs +2 -0
- package/components/shadcn/resizable/ResizableHandle.vue.cjs.map +1 -0
- package/components/shadcn/resizable/ResizableHandle.vue.js +40 -0
- package/components/shadcn/resizable/ResizableHandle.vue.js.map +1 -0
- package/components/shadcn/resizable/ResizableHandle.vue2.cjs +2 -0
- package/components/shadcn/resizable/ResizableHandle.vue2.cjs.map +1 -0
- package/components/shadcn/resizable/ResizableHandle.vue2.js +5 -0
- package/components/shadcn/resizable/ResizableHandle.vue2.js.map +1 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs +2 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs.map +1 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue.js +33 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue.js.map +1 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue2.cjs +2 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue2.cjs.map +1 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue2.js +5 -0
- package/components/shadcn/resizable/ResizablePanelGroup.vue2.js.map +1 -0
- package/index.cjs +1 -1
- package/index.js +76 -70
- package/package.json +2 -2
- package/types/index.d.ts +895 -188
- package/assets/jwms-portal-frontend-uK756XTb.css +0 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { defineComponent as oe, ref as r, computed as A, createElementBlock as te, openBlock as R, createVNode as a, unref as t, withCtx as i, createElementVNode as s, createTextVNode as d, toDisplayString as ae, createBlock as ie, createCommentVNode as se } from "vue";
|
|
2
|
+
import b from "../molecules/JFormField.vue.js";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import "../shadcn/index.js";
|
|
5
|
+
import "@vueuse/core";
|
|
6
|
+
import "reka-ui";
|
|
7
|
+
import "clsx";
|
|
8
|
+
import "tailwind-merge";
|
|
9
|
+
import "lucide-vue-next";
|
|
10
|
+
import re from "../molecules/JTabs.vue.js";
|
|
11
|
+
/* empty css */
|
|
12
|
+
/* empty css */
|
|
13
|
+
import u from "../atoms/JButton.vue.js";
|
|
14
|
+
import "@internationalized/date";
|
|
15
|
+
import "md-editor-v3";
|
|
16
|
+
/* empty css */
|
|
17
|
+
/* empty css */
|
|
18
|
+
import "../shadcn/badge-variants.js";
|
|
19
|
+
/* empty css */
|
|
20
|
+
import "../shadcn/avatar-variants.js";
|
|
21
|
+
import "dompurify";
|
|
22
|
+
/* empty css */
|
|
23
|
+
import y from "../atoms/JGrid.vue.js";
|
|
24
|
+
import h from "../atoms/JSplitter.vue.js";
|
|
25
|
+
import "vue-sonner";
|
|
26
|
+
import ne from "../molecules/JTitlebar.vue.js";
|
|
27
|
+
/* empty css */
|
|
28
|
+
/* empty css */
|
|
29
|
+
import z from "../organisms/JFilterBar.vue.js";
|
|
30
|
+
import "vue-router";
|
|
31
|
+
/* empty css */
|
|
32
|
+
/* empty css */
|
|
33
|
+
const me = { class: "flex flex-col h-full gap-4 bg-background text-foreground" }, de = { class: "flex flex-col h-full gap-4 p-4" }, ue = { class: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4" }, pe = { class: "h-full overflow-auto bg-background" }, ce = { class: "h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card" }, fe = { class: "text-lg font-semibold mb-2" }, ve = { class: "grid grid-cols-1 md:grid-cols-2 gap-4" }, be = { class: "flex justify-end gap-2 mt-4" }, ge = { class: "flex flex-col h-full gap-4 p-4" }, ye = { class: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4" }, ke = { class: "h-full overflow-auto bg-background" }, xe = { class: "h-full flex gap-2 overflow-hidden items-stretch p-2 bg-background" }, Ce = { class: "flex-1 flex flex-col overflow-hidden" }, we = { class: "flex-1 overflow-auto bg-background" }, Ne = { class: "flex flex-col justify-center gap-2 px-2" }, Ve = { class: "flex-1 flex flex-col overflow-hidden" }, De = { class: "flex-1 overflow-auto bg-background" }, il = /* @__PURE__ */ oe({
|
|
34
|
+
__name: "ExampleTabMappingPage",
|
|
35
|
+
setup(_e, { expose: U }) {
|
|
36
|
+
const k = r("master"), Y = [
|
|
37
|
+
{ id: "master", label: "회원사 기본정보" },
|
|
38
|
+
{ id: "mapping-customer", label: "고객사 매핑" }
|
|
39
|
+
];
|
|
40
|
+
function $(l) {
|
|
41
|
+
console.log("탭 변경:", l);
|
|
42
|
+
}
|
|
43
|
+
const G = [
|
|
44
|
+
{ value: "Y", label: "Y:활성" },
|
|
45
|
+
{ value: "N", label: "N:비활성" }
|
|
46
|
+
], x = r(!1), p = r({
|
|
47
|
+
isActive: "",
|
|
48
|
+
keyword: ""
|
|
49
|
+
}), T = {
|
|
50
|
+
isActive: {
|
|
51
|
+
label: "활성여부",
|
|
52
|
+
displayValue: (l) => l === "Y" ? "Y:활성" : l === "N" ? "N:비활성" : ""
|
|
53
|
+
},
|
|
54
|
+
keyword: {
|
|
55
|
+
label: "검색어"
|
|
56
|
+
}
|
|
57
|
+
}, C = r([
|
|
58
|
+
{ memberId: "M001", memberName: "제이솔루션", isActive: "Y" },
|
|
59
|
+
{ memberId: "M002", memberName: "ABC물류", isActive: "Y" },
|
|
60
|
+
{ memberId: "M003", memberName: "XYZ유통", isActive: "N" }
|
|
61
|
+
]), B = r([
|
|
62
|
+
{ field: "memberId", headerName: "회원사코드", width: 150 },
|
|
63
|
+
{ field: "memberName", headerName: "회원사명", flex: 1 },
|
|
64
|
+
{
|
|
65
|
+
field: "isActive",
|
|
66
|
+
headerName: "활성",
|
|
67
|
+
width: 100,
|
|
68
|
+
cellRenderer: (l) => l.value === "Y" ? "✓" : ""
|
|
69
|
+
}
|
|
70
|
+
]), F = [
|
|
71
|
+
{
|
|
72
|
+
icon: "pencil",
|
|
73
|
+
label: "수정",
|
|
74
|
+
tooltip: "편집",
|
|
75
|
+
onClick: (l) => {
|
|
76
|
+
f.value = !1, n.value = {
|
|
77
|
+
memberId: l.memberId,
|
|
78
|
+
memberName: l.memberName,
|
|
79
|
+
isActive: l.isActive
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
icon: "trash2",
|
|
85
|
+
label: "삭제",
|
|
86
|
+
tooltip: "삭제",
|
|
87
|
+
styletype: "danger",
|
|
88
|
+
onClick: (l) => {
|
|
89
|
+
confirm(`${l.memberName}을(를) 삭제하시겠습니까?`) && (console.log("회원사 삭제:", l.memberId), alert(`삭제되었습니다: ${l.memberName}`));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
], w = r(), f = r(!1), n = r({
|
|
93
|
+
memberId: "",
|
|
94
|
+
memberName: "",
|
|
95
|
+
isActive: "Y"
|
|
96
|
+
});
|
|
97
|
+
function S(l) {
|
|
98
|
+
f.value = !1, n.value = {
|
|
99
|
+
memberId: l.data.memberId,
|
|
100
|
+
memberName: l.data.memberName,
|
|
101
|
+
isActive: l.data.isActive
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function E() {
|
|
105
|
+
f.value = !0, n.value = {
|
|
106
|
+
memberId: "",
|
|
107
|
+
memberName: "",
|
|
108
|
+
isActive: "Y"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function j() {
|
|
112
|
+
console.log("회원사 저장:", n.value), alert(`저장되었습니다: ${n.value.memberName}`);
|
|
113
|
+
}
|
|
114
|
+
function H() {
|
|
115
|
+
confirm(`${n.value.memberName}을(를) 삭제하시겠습니까?`) && (console.log("회원사 삭제:", n.value.memberId), alert(`삭제되었습니다: ${n.value.memberName}`));
|
|
116
|
+
}
|
|
117
|
+
function J() {
|
|
118
|
+
p.value = {
|
|
119
|
+
isActive: "",
|
|
120
|
+
keyword: ""
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function K() {
|
|
124
|
+
console.log("회원사 조회:", p.value);
|
|
125
|
+
}
|
|
126
|
+
function L() {
|
|
127
|
+
alert("회원사 관리 페이지 도움말");
|
|
128
|
+
}
|
|
129
|
+
const N = r(!1), v = r({
|
|
130
|
+
keyword: ""
|
|
131
|
+
}), O = {
|
|
132
|
+
keyword: {
|
|
133
|
+
label: "검색어"
|
|
134
|
+
}
|
|
135
|
+
}, V = r(), D = r(), _ = r(), P = r([
|
|
136
|
+
{ field: "memberId", headerName: "회원사코드", width: 150 },
|
|
137
|
+
{ field: "memberName", headerName: "회원사명", flex: 1 }
|
|
138
|
+
]), m = r(""), c = r({
|
|
139
|
+
M001: ["C001", "C002"],
|
|
140
|
+
// 제이솔루션에 매핑된 고객사
|
|
141
|
+
M002: ["C003"],
|
|
142
|
+
// ABC물류에 매핑된 고객사
|
|
143
|
+
M003: []
|
|
144
|
+
// XYZ유통에 매핑된 고객사 없음
|
|
145
|
+
}), M = [
|
|
146
|
+
{ code: "C001", name: "고객A" },
|
|
147
|
+
{ code: "C002", name: "고객B" },
|
|
148
|
+
{ code: "C003", name: "고객C" },
|
|
149
|
+
{ code: "C004", name: "고객D" },
|
|
150
|
+
{ code: "C005", name: "고객E" }
|
|
151
|
+
], I = r([
|
|
152
|
+
{ field: "code", headerName: "코드", width: 120 },
|
|
153
|
+
{ field: "name", headerName: "이름", flex: 1 }
|
|
154
|
+
]), X = A(() => {
|
|
155
|
+
if (!m.value) return [];
|
|
156
|
+
const l = c.value[m.value] || [];
|
|
157
|
+
return M.filter((e) => !l.includes(e.code));
|
|
158
|
+
}), Z = A(() => {
|
|
159
|
+
if (!m.value) return [];
|
|
160
|
+
const l = c.value[m.value] || [];
|
|
161
|
+
return M.filter((e) => l.includes(e.code));
|
|
162
|
+
});
|
|
163
|
+
function q(l) {
|
|
164
|
+
m.value = l.data.memberId, console.log("선택된 회원사:", l.data.memberName);
|
|
165
|
+
}
|
|
166
|
+
function Q() {
|
|
167
|
+
if (!m.value) {
|
|
168
|
+
alert("회원사를 먼저 선택해주세요.");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const l = D.value?.getSelectedRows() || [];
|
|
172
|
+
if (l.length === 0) {
|
|
173
|
+
alert("매핑할 고객사를 선택해주세요.");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const e = l.map((g) => g.code), o = m.value;
|
|
177
|
+
c.value[o] || (c.value[o] = []), c.value[o].push(...e), console.log("매핑:", e);
|
|
178
|
+
}
|
|
179
|
+
function W() {
|
|
180
|
+
if (!m.value) {
|
|
181
|
+
alert("회원사를 먼저 선택해주세요.");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const l = _.value?.getSelectedRows() || [];
|
|
185
|
+
if (l.length === 0) {
|
|
186
|
+
alert("해제할 고객사를 선택해주세요.");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const e = l.map((g) => g.code), o = m.value;
|
|
190
|
+
c.value[o] = (c.value[o] || []).filter(
|
|
191
|
+
(g) => !e.includes(g)
|
|
192
|
+
), console.log("해제:", e);
|
|
193
|
+
}
|
|
194
|
+
function ee() {
|
|
195
|
+
v.value = {
|
|
196
|
+
keyword: ""
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function le() {
|
|
200
|
+
console.log("매핑 조회:", v.value);
|
|
201
|
+
}
|
|
202
|
+
return U({ masterGridRef: w, mappingMasterGridRef: V }), (l, e) => (R(), te("div", me, [
|
|
203
|
+
a(t(ne), {
|
|
204
|
+
icon: "users",
|
|
205
|
+
title: "회원사 관리",
|
|
206
|
+
description: "회원사 정보 및 고객사 매핑을 관리합니다",
|
|
207
|
+
showHelp: !0,
|
|
208
|
+
onHelp: L
|
|
209
|
+
}),
|
|
210
|
+
a(t(re), {
|
|
211
|
+
activeTabId: k.value,
|
|
212
|
+
"onUpdate:activeTabId": e[10] || (e[10] = (o) => k.value = o),
|
|
213
|
+
tabs: Y,
|
|
214
|
+
onTabChange: $
|
|
215
|
+
}, {
|
|
216
|
+
"content-master": i(() => [
|
|
217
|
+
s("div", de, [
|
|
218
|
+
a(t(z), {
|
|
219
|
+
collapsed: x.value,
|
|
220
|
+
"onUpdate:collapsed": e[2] || (e[2] = (o) => x.value = o),
|
|
221
|
+
filterValues: p.value,
|
|
222
|
+
"onUpdate:filterValues": e[3] || (e[3] = (o) => p.value = o),
|
|
223
|
+
filterDisplay: T,
|
|
224
|
+
collapsible: !0,
|
|
225
|
+
title: "회원사 목록"
|
|
226
|
+
}, {
|
|
227
|
+
actions: i(() => [
|
|
228
|
+
a(t(u), {
|
|
229
|
+
size: "sm",
|
|
230
|
+
variant: "outline",
|
|
231
|
+
onClick: J
|
|
232
|
+
}, {
|
|
233
|
+
default: i(() => [...e[11] || (e[11] = [
|
|
234
|
+
d("초기화", -1)
|
|
235
|
+
])]),
|
|
236
|
+
_: 1
|
|
237
|
+
}),
|
|
238
|
+
a(t(u), {
|
|
239
|
+
size: "sm",
|
|
240
|
+
styletype: "primary",
|
|
241
|
+
onClick: K
|
|
242
|
+
}, {
|
|
243
|
+
default: i(() => [...e[12] || (e[12] = [
|
|
244
|
+
d("조회", -1)
|
|
245
|
+
])]),
|
|
246
|
+
_: 1
|
|
247
|
+
}),
|
|
248
|
+
a(t(u), {
|
|
249
|
+
size: "sm",
|
|
250
|
+
styletype: "primary",
|
|
251
|
+
onClick: E
|
|
252
|
+
}, {
|
|
253
|
+
default: i(() => [...e[13] || (e[13] = [
|
|
254
|
+
d("신규", -1)
|
|
255
|
+
])]),
|
|
256
|
+
_: 1
|
|
257
|
+
})
|
|
258
|
+
]),
|
|
259
|
+
filters: i(() => [
|
|
260
|
+
s("div", ue, [
|
|
261
|
+
a(t(b), {
|
|
262
|
+
type: "combo",
|
|
263
|
+
label: "활성여부",
|
|
264
|
+
modelValue: p.value.isActive,
|
|
265
|
+
"onUpdate:modelValue": e[0] || (e[0] = (o) => p.value.isActive = o),
|
|
266
|
+
options: G
|
|
267
|
+
}, null, 8, ["modelValue"]),
|
|
268
|
+
a(t(b), {
|
|
269
|
+
type: "input",
|
|
270
|
+
label: "검색어",
|
|
271
|
+
modelValue: p.value.keyword,
|
|
272
|
+
"onUpdate:modelValue": e[1] || (e[1] = (o) => p.value.keyword = o)
|
|
273
|
+
}, null, 8, ["modelValue"])
|
|
274
|
+
])
|
|
275
|
+
]),
|
|
276
|
+
_: 1
|
|
277
|
+
}, 8, ["collapsed", "filterValues"]),
|
|
278
|
+
a(t(h), {
|
|
279
|
+
direction: "horizontal",
|
|
280
|
+
"default-size": 60,
|
|
281
|
+
"min-size": 30,
|
|
282
|
+
"second-min-size": 20,
|
|
283
|
+
"second-max-size": 60,
|
|
284
|
+
class: "flex-1"
|
|
285
|
+
}, {
|
|
286
|
+
left: i(() => [
|
|
287
|
+
s("div", pe, [
|
|
288
|
+
a(t(y), {
|
|
289
|
+
ref_key: "masterGridRef",
|
|
290
|
+
ref: w,
|
|
291
|
+
columnDefs: B.value,
|
|
292
|
+
rowData: C.value,
|
|
293
|
+
"action-buttons": F,
|
|
294
|
+
onRowClicked: S
|
|
295
|
+
}, null, 8, ["columnDefs", "rowData"])
|
|
296
|
+
])
|
|
297
|
+
]),
|
|
298
|
+
right: i(() => [
|
|
299
|
+
s("div", ce, [
|
|
300
|
+
s("h3", fe, ae(f.value ? "신규 등록" : "상세 정보"), 1),
|
|
301
|
+
s("div", ve, [
|
|
302
|
+
a(t(b), {
|
|
303
|
+
type: "input",
|
|
304
|
+
label: "회원사코드",
|
|
305
|
+
modelValue: n.value.memberId,
|
|
306
|
+
"onUpdate:modelValue": e[4] || (e[4] = (o) => n.value.memberId = o),
|
|
307
|
+
readonly: !f.value,
|
|
308
|
+
placeholder: "회원사 코드"
|
|
309
|
+
}, null, 8, ["modelValue", "readonly"]),
|
|
310
|
+
a(t(b), {
|
|
311
|
+
type: "input",
|
|
312
|
+
label: "회원사명",
|
|
313
|
+
modelValue: n.value.memberName,
|
|
314
|
+
"onUpdate:modelValue": e[5] || (e[5] = (o) => n.value.memberName = o),
|
|
315
|
+
placeholder: "회원사 이름"
|
|
316
|
+
}, null, 8, ["modelValue"])
|
|
317
|
+
]),
|
|
318
|
+
a(t(b), {
|
|
319
|
+
type: "checkbox",
|
|
320
|
+
label: "활성여부",
|
|
321
|
+
modelValue: n.value.isActive,
|
|
322
|
+
"onUpdate:modelValue": e[6] || (e[6] = (o) => n.value.isActive = o),
|
|
323
|
+
inlineLabel: "활성"
|
|
324
|
+
}, null, 8, ["modelValue"]),
|
|
325
|
+
s("div", be, [
|
|
326
|
+
a(t(u), {
|
|
327
|
+
styletype: "primary",
|
|
328
|
+
size: "sm",
|
|
329
|
+
onClick: j
|
|
330
|
+
}, {
|
|
331
|
+
default: i(() => [...e[14] || (e[14] = [
|
|
332
|
+
d("저장", -1)
|
|
333
|
+
])]),
|
|
334
|
+
_: 1
|
|
335
|
+
}),
|
|
336
|
+
f.value ? se("", !0) : (R(), ie(t(u), {
|
|
337
|
+
key: 0,
|
|
338
|
+
variant: "outline",
|
|
339
|
+
size: "sm",
|
|
340
|
+
onClick: H
|
|
341
|
+
}, {
|
|
342
|
+
default: i(() => [...e[15] || (e[15] = [
|
|
343
|
+
d("삭제", -1)
|
|
344
|
+
])]),
|
|
345
|
+
_: 1
|
|
346
|
+
}))
|
|
347
|
+
])
|
|
348
|
+
])
|
|
349
|
+
]),
|
|
350
|
+
_: 1
|
|
351
|
+
})
|
|
352
|
+
])
|
|
353
|
+
]),
|
|
354
|
+
"content-mapping-customer": i(() => [
|
|
355
|
+
s("div", ge, [
|
|
356
|
+
a(t(z), {
|
|
357
|
+
collapsed: N.value,
|
|
358
|
+
"onUpdate:collapsed": e[8] || (e[8] = (o) => N.value = o),
|
|
359
|
+
filterValues: v.value,
|
|
360
|
+
"onUpdate:filterValues": e[9] || (e[9] = (o) => v.value = o),
|
|
361
|
+
filterDisplay: O,
|
|
362
|
+
collapsible: !0,
|
|
363
|
+
title: "회원사별 고객사 매핑"
|
|
364
|
+
}, {
|
|
365
|
+
actions: i(() => [
|
|
366
|
+
a(t(u), {
|
|
367
|
+
size: "sm",
|
|
368
|
+
variant: "outline",
|
|
369
|
+
onClick: ee
|
|
370
|
+
}, {
|
|
371
|
+
default: i(() => [...e[16] || (e[16] = [
|
|
372
|
+
d("초기화", -1)
|
|
373
|
+
])]),
|
|
374
|
+
_: 1
|
|
375
|
+
}),
|
|
376
|
+
a(t(u), {
|
|
377
|
+
size: "sm",
|
|
378
|
+
styletype: "primary",
|
|
379
|
+
onClick: le
|
|
380
|
+
}, {
|
|
381
|
+
default: i(() => [...e[17] || (e[17] = [
|
|
382
|
+
d("조회", -1)
|
|
383
|
+
])]),
|
|
384
|
+
_: 1
|
|
385
|
+
})
|
|
386
|
+
]),
|
|
387
|
+
filters: i(() => [
|
|
388
|
+
s("div", ye, [
|
|
389
|
+
a(t(b), {
|
|
390
|
+
type: "input",
|
|
391
|
+
label: "검색어",
|
|
392
|
+
modelValue: v.value.keyword,
|
|
393
|
+
"onUpdate:modelValue": e[7] || (e[7] = (o) => v.value.keyword = o)
|
|
394
|
+
}, null, 8, ["modelValue"])
|
|
395
|
+
])
|
|
396
|
+
]),
|
|
397
|
+
_: 1
|
|
398
|
+
}, 8, ["collapsed", "filterValues"]),
|
|
399
|
+
a(t(h), {
|
|
400
|
+
direction: "vertical",
|
|
401
|
+
"default-size": 30,
|
|
402
|
+
"min-size": 20,
|
|
403
|
+
"second-min-size": 40,
|
|
404
|
+
class: "flex-1"
|
|
405
|
+
}, {
|
|
406
|
+
top: i(() => [
|
|
407
|
+
s("div", ke, [
|
|
408
|
+
a(t(y), {
|
|
409
|
+
ref_key: "mappingMasterGridRef",
|
|
410
|
+
ref: V,
|
|
411
|
+
columnDefs: P.value,
|
|
412
|
+
rowData: C.value,
|
|
413
|
+
onRowClicked: q
|
|
414
|
+
}, null, 8, ["columnDefs", "rowData"])
|
|
415
|
+
])
|
|
416
|
+
]),
|
|
417
|
+
bottom: i(() => [
|
|
418
|
+
s("div", xe, [
|
|
419
|
+
s("div", Ce, [
|
|
420
|
+
e[18] || (e[18] = s("h4", { class: "text-sm font-semibold mb-2 px-2" }, "미매핑 고객사", -1)),
|
|
421
|
+
s("div", we, [
|
|
422
|
+
a(t(y), {
|
|
423
|
+
ref_key: "unmappedGridRef",
|
|
424
|
+
ref: D,
|
|
425
|
+
columnDefs: I.value,
|
|
426
|
+
rowData: X.value,
|
|
427
|
+
checkbox: ""
|
|
428
|
+
}, null, 8, ["columnDefs", "rowData"])
|
|
429
|
+
])
|
|
430
|
+
]),
|
|
431
|
+
s("div", Ne, [
|
|
432
|
+
a(t(u), {
|
|
433
|
+
styletype: "primary",
|
|
434
|
+
size: "sm",
|
|
435
|
+
onClick: Q
|
|
436
|
+
}, {
|
|
437
|
+
default: i(() => [...e[19] || (e[19] = [
|
|
438
|
+
d("매핑 ▶", -1)
|
|
439
|
+
])]),
|
|
440
|
+
_: 1
|
|
441
|
+
}),
|
|
442
|
+
a(t(u), {
|
|
443
|
+
variant: "outline",
|
|
444
|
+
size: "sm",
|
|
445
|
+
onClick: W
|
|
446
|
+
}, {
|
|
447
|
+
default: i(() => [...e[20] || (e[20] = [
|
|
448
|
+
d("◀ 해제", -1)
|
|
449
|
+
])]),
|
|
450
|
+
_: 1
|
|
451
|
+
})
|
|
452
|
+
]),
|
|
453
|
+
s("div", Ve, [
|
|
454
|
+
e[21] || (e[21] = s("h4", { class: "text-sm font-semibold mb-2 px-2" }, "매핑된 고객사", -1)),
|
|
455
|
+
s("div", De, [
|
|
456
|
+
a(t(y), {
|
|
457
|
+
ref_key: "mappedGridRef",
|
|
458
|
+
ref: _,
|
|
459
|
+
columnDefs: I.value,
|
|
460
|
+
rowData: Z.value,
|
|
461
|
+
checkbox: ""
|
|
462
|
+
}, null, 8, ["columnDefs", "rowData"])
|
|
463
|
+
])
|
|
464
|
+
])
|
|
465
|
+
])
|
|
466
|
+
]),
|
|
467
|
+
_: 1
|
|
468
|
+
})
|
|
469
|
+
])
|
|
470
|
+
]),
|
|
471
|
+
_: 1
|
|
472
|
+
}, 8, ["activeTabId"])
|
|
473
|
+
]));
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
export {
|
|
477
|
+
il as default
|
|
478
|
+
};
|
|
479
|
+
//# sourceMappingURL=ExampleTabMappingPage.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExampleTabMappingPage.vue.js","sources":["../../../../src/components/examples/ExampleTabMappingPage.vue"],"sourcesContent":["<template>\n <div class=\"flex flex-col h-full gap-4 bg-background text-foreground\">\n <!-- ==================== 타이틀바 ==================== -->\n <JTitlebar \n icon=\"users\" \n title=\"회원사 관리\" \n description=\"회원사 정보 및 고객사 매핑을 관리합니다\"\n :showHelp=\"true\" \n @help=\"onHelp\" \n />\n\n <!-- ==================== 탭 ==================== -->\n <JTabs v-model:activeTabId=\"activeTabId\" :tabs=\"tabs\" @tab-change=\"handleTabChange\">\n <!-- ==================== Tab 1: 마스터 (회원사 기본정보) ==================== -->\n <template #content-master>\n <div class=\"flex flex-col h-full gap-4 p-4\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"masterFilterCollapsed\"\n v-model:filterValues=\"masterFilterValues\"\n :filterDisplay=\"masterFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사 목록\"\n >\n <template #actions>\n <JButton size=\"sm\" variant=\"outline\" @click=\"onMasterReset\">초기화</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMasterSearch\">조회</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMasterNew\">신규</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"masterFilterValues.isActive\"\n :options=\"activeOptions\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"masterFilterValues.keyword\" />\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=\"masterGridRef\"\n :columnDefs=\"masterColumnDefs\"\n :rowData=\"masterRowData\"\n :action-buttons=\"masterActionButtons\"\n @row-clicked=\"onMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div\n class=\"h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card\"\n >\n <h3 class=\"text-lg font-semibold mb-2\">\n {{ isMasterNew ? '신규 등록' : '상세 정보' }}\n </h3>\n\n <!-- 2열 그리드: 회원사코드, 회원사명 -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <JFormField\n type=\"input\"\n label=\"회원사코드\"\n v-model=\"masterDetail.memberId\"\n :readonly=\"!isMasterNew\"\n placeholder=\"회원사 코드\"\n />\n <JFormField\n type=\"input\"\n label=\"회원사명\"\n v-model=\"masterDetail.memberName\"\n placeholder=\"회원사 이름\"\n />\n </div>\n\n <!-- 활성여부 -->\n <JFormField\n type=\"checkbox\"\n label=\"활성여부\"\n v-model=\"masterDetail.isActive\"\n inlineLabel=\"활성\"\n />\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onMasterSave\">저장</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onMasterDelete\" v-if=\"!isMasterNew\"\n >삭제</JButton\n >\n </div>\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n\n <!-- ==================== Tab 2: 매핑 (고객사 매핑) ==================== -->\n <template #content-mapping-customer>\n <div class=\"flex flex-col h-full gap-4 p-4\">\n <!-- 필터바 -->\n <JFilterBar\n v-model:collapsed=\"mappingFilterCollapsed\"\n v-model:filterValues=\"mappingFilterValues\"\n :filterDisplay=\"mappingFilterDisplay\"\n :collapsible=\"true\"\n title=\"회원사별 고객사 매핑\"\n >\n <template #actions>\n <JButton size=\"sm\" variant=\"outline\" @click=\"onMappingReset\">초기화</JButton>\n <JButton size=\"sm\" styletype=\"primary\" @click=\"onMappingSearch\">조회</JButton>\n </template>\n\n <template #filters>\n <div class=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4\">\n <JFormField type=\"input\" label=\"검색어\" v-model=\"mappingFilterValues.keyword\" />\n </div>\n </template>\n </JFilterBar>\n\n <!-- Vertical Splitter: 상단(마스터 그리드) / 하단(매핑 영역) -->\n <JSplitter\n direction=\"vertical\"\n :default-size=\"30\"\n :min-size=\"20\"\n :second-min-size=\"40\"\n class=\"flex-1\"\n >\n <!-- 상단: 마스터 그리드 -->\n <template #top>\n <div class=\"h-full overflow-auto bg-background\">\n <JGrid\n ref=\"mappingMasterGridRef\"\n :columnDefs=\"mappingMasterColumnDefs\"\n :rowData=\"masterRowData\"\n @row-clicked=\"onMappingMasterRowClicked\"\n />\n </div>\n </template>\n\n <!-- 하단: 매핑 영역 (미매핑 - 버튼 - 매핑) -->\n <template #bottom>\n <div class=\"h-full flex gap-2 overflow-hidden items-stretch p-2 bg-background\">\n <!-- 좌측: 미매핑 그리드 -->\n <div class=\"flex-1 flex flex-col overflow-hidden\">\n <h4 class=\"text-sm font-semibold mb-2 px-2\">미매핑 고객사</h4>\n <div class=\"flex-1 overflow-auto bg-background\">\n <JGrid\n ref=\"unmappedGridRef\"\n :columnDefs=\"customerColumnDefs\"\n :rowData=\"unmappedCustomers\"\n checkbox\n />\n </div>\n </div>\n\n <!-- 중앙: 매핑/해제 버튼 -->\n <div class=\"flex flex-col justify-center gap-2 px-2\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onMap\">매핑 ▶</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onUnmap\">◀ 해제</JButton>\n </div>\n\n <!-- 우측: 매핑 그리드 -->\n <div class=\"flex-1 flex flex-col overflow-hidden\">\n <h4 class=\"text-sm font-semibold mb-2 px-2\">매핑된 고객사</h4>\n <div class=\"flex-1 overflow-auto bg-background\">\n <JGrid\n ref=\"mappedGridRef\"\n :columnDefs=\"customerColumnDefs\"\n :rowData=\"mappedCustomers\"\n checkbox\n />\n </div>\n </div>\n </div>\n </template>\n </JSplitter>\n </div>\n </template>\n </JTabs>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { JTitlebar } from '@/components/molecules'\nimport { JFilterBar } from '@/components/organisms'\nimport { JGrid, JButton, JSplitter, type ActionButton } from '@/components/atoms'\nimport { JFormField } from '@/components/molecules'\nimport { JTabs } from '@/components/molecules'\n\n// ==================== 탭 상태 ====================\nconst activeTabId = ref('master')\n\nconst tabs = [\n { id: 'master', label: '회원사 기본정보' },\n { id: 'mapping-customer', label: '고객사 매핑' },\n]\n\nfunction handleTabChange(tabId: string) {\n console.log('탭 변경:', tabId)\n}\n\n// ==================== 공통 옵션 ====================\nconst activeOptions = [\n { value: 'Y', label: 'Y:활성' },\n { value: 'N', label: 'N:비활성' },\n]\n\n// ==================== Tab 1: 마스터 (회원사) ====================\n\nconst masterFilterCollapsed = ref(false)\nconst masterFilterValues = ref({\n isActive: '',\n keyword: '',\n})\n\nconst masterFilterDisplay = {\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// Mock 데이터 - 회원사 목록\nconst masterRowData = ref([\n { memberId: 'M001', memberName: '제이솔루션', isActive: 'Y' },\n { memberId: 'M002', memberName: 'ABC물류', isActive: 'Y' },\n { memberId: 'M003', memberName: 'XYZ유통', isActive: 'N' },\n])\n\nconst masterColumnDefs = ref([\n { field: 'memberId', headerName: '회원사코드', width: 150 },\n { field: 'memberName', headerName: '회원사명', flex: 1 },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n },\n])\n\n// 마스터 탭 행별 액션 버튼\nconst masterActionButtons: ActionButton[] = [\n {\n icon: 'pencil',\n label: '수정',\n tooltip: '편집',\n onClick: (rowData: any) => {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: rowData.memberId,\n memberName: rowData.memberName,\n isActive: rowData.isActive,\n }\n },\n },\n {\n icon: 'trash2',\n label: '삭제',\n tooltip: '삭제',\n styletype: 'danger',\n onClick: (rowData: any) => {\n if (confirm(`${rowData.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', rowData.memberId)\n alert(`삭제되었습니다: ${rowData.memberName}`)\n }\n },\n },\n]\n\nconst masterGridRef = ref()\nconst isMasterNew = ref(false)\nconst masterDetail = ref({\n memberId: '',\n memberName: '',\n isActive: 'Y',\n})\n\nfunction onMasterRowClicked(event: any) {\n isMasterNew.value = false\n masterDetail.value = {\n memberId: event.data.memberId,\n memberName: event.data.memberName,\n isActive: event.data.isActive,\n }\n}\n\nfunction onMasterNew() {\n isMasterNew.value = true\n masterDetail.value = {\n memberId: '',\n memberName: '',\n isActive: 'Y',\n }\n}\n\nfunction onMasterSave() {\n console.log('회원사 저장:', masterDetail.value)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`저장되었습니다: ${masterDetail.value.memberName}`)\n}\n\nfunction onMasterDelete() {\n if (confirm(`${masterDetail.value.memberName}을(를) 삭제하시겠습니까?`)) {\n console.log('회원사 삭제:', masterDetail.value.memberId)\n // TODO: 실제 구현 시 API 호출로 대체\n alert(`삭제되었습니다: ${masterDetail.value.memberName}`)\n }\n}\n\nfunction onMasterReset() {\n masterFilterValues.value = {\n isActive: '',\n keyword: '',\n }\n}\n\nfunction onMasterSearch() {\n console.log('회원사 조회:', masterFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\nfunction onHelp() {\n alert('회원사 관리 페이지 도움말')\n}\n\n// ==================== Tab 2: 매핑 (고객사) ====================\n\nconst mappingFilterCollapsed = ref(false)\nconst mappingFilterValues = ref({\n keyword: '',\n})\n\nconst mappingFilterDisplay = {\n keyword: {\n label: '검색어',\n },\n}\n\nconst mappingMasterGridRef = ref()\nconst unmappedGridRef = ref()\nconst mappedGridRef = ref()\n\nconst mappingMasterColumnDefs = ref([\n { field: 'memberId', headerName: '회원사코드', width: 150 },\n { field: 'memberName', headerName: '회원사명', flex: 1 },\n])\n\n// Mock 데이터 - 전체 고객사 (매핑 여부 포함)\nconst selectedMemberId = ref<string>('')\n\n// Mock 데이터 - 회원사별 매핑 정보\nconst mappingData = ref<Record<string, string[]>>({\n M001: ['C001', 'C002'], // 제이솔루션에 매핑된 고객사\n M002: ['C003'], // ABC물류에 매핑된 고객사\n M003: [], // XYZ유통에 매핑된 고객사 없음\n})\n\nconst allCustomersData = [\n { code: 'C001', name: '고객A' },\n { code: 'C002', name: '고객B' },\n { code: 'C003', name: '고객C' },\n { code: 'C004', name: '고객D' },\n { code: 'C005', name: '고객E' },\n]\n\nconst customerColumnDefs = ref([\n { field: 'code', headerName: '코드', width: 120 },\n { field: 'name', headerName: '이름', flex: 1 },\n])\n\n// 매핑/미매핑 고객사 계산\nconst unmappedCustomers = computed(() => {\n if (!selectedMemberId.value) return []\n const mappedCodes = mappingData.value[selectedMemberId.value] || []\n return allCustomersData.filter((c) => !mappedCodes.includes(c.code))\n})\n\nconst mappedCustomers = computed(() => {\n if (!selectedMemberId.value) return []\n const mappedCodes = mappingData.value[selectedMemberId.value] || []\n return allCustomersData.filter((c) => mappedCodes.includes(c.code))\n})\n\nfunction onMappingMasterRowClicked(event: any) {\n selectedMemberId.value = event.data.memberId\n console.log('선택된 회원사:', event.data.memberName)\n // TODO: 실제 구현 시 API 호출로 매핑/미매핑 데이터 로드\n}\n\n/**\n * 매핑 버튼 클릭 (좌측 → 우측)\n */\nfunction onMap() {\n if (!selectedMemberId.value) {\n alert('회원사를 먼저 선택해주세요.')\n return\n }\n\n const selectedRows = unmappedGridRef.value?.getSelectedRows() || []\n if (selectedRows.length === 0) {\n alert('매핑할 고객사를 선택해주세요.')\n return\n }\n\n // 선택된 고객사 코드 추출\n const selectedCodes = selectedRows.map((row: any) => row.code)\n\n // 매핑 데이터 업데이트\n const key = selectedMemberId.value\n if (!mappingData.value[key]) {\n mappingData.value[key] = []\n }\n mappingData.value[key]!.push(...selectedCodes)\n\n console.log('매핑:', selectedCodes)\n // TODO: 실제 구현 시 API 호출로 매핑 처리\n // await api.mapCustomers(selectedMemberId.value, selectedCodes)\n}\n\n/**\n * 해제 버튼 클릭 (우측 → 좌측)\n */\nfunction onUnmap() {\n if (!selectedMemberId.value) {\n alert('회원사를 먼저 선택해주세요.')\n return\n }\n\n const selectedRows = mappedGridRef.value?.getSelectedRows() || []\n if (selectedRows.length === 0) {\n alert('해제할 고객사를 선택해주세요.')\n return\n }\n\n // 선택된 고객사 코드 추출\n const selectedCodes = selectedRows.map((row: any) => row.code)\n\n // 매핑 데이터에서 제거\n const unmapKey = selectedMemberId.value\n mappingData.value[unmapKey] = (mappingData.value[unmapKey] || []).filter(\n (code) => !selectedCodes.includes(code)\n )\n\n console.log('해제:', selectedCodes)\n // TODO: 실제 구현 시 API 호출로 매핑 해제 처리\n // await api.unmapCustomers(selectedMemberId.value, selectedCodes)\n}\n\nfunction onMappingReset() {\n mappingFilterValues.value = {\n keyword: '',\n }\n}\n\nfunction onMappingSearch() {\n console.log('매핑 조회:', mappingFilterValues.value)\n // TODO: 실제 구현 시 API 호출로 대체\n}\n\ndefineExpose({ masterGridRef, mappingMasterGridRef })\n</script>\n"],"names":["activeTabId","ref","tabs","handleTabChange","tabId","activeOptions","masterFilterCollapsed","masterFilterValues","masterFilterDisplay","val","masterRowData","masterColumnDefs","params","masterActionButtons","rowData","isMasterNew","masterDetail","masterGridRef","onMasterRowClicked","event","onMasterNew","onMasterSave","onMasterDelete","onMasterReset","onMasterSearch","onHelp","mappingFilterCollapsed","mappingFilterValues","mappingFilterDisplay","mappingMasterGridRef","unmappedGridRef","mappedGridRef","mappingMasterColumnDefs","selectedMemberId","mappingData","allCustomersData","customerColumnDefs","unmappedCustomers","computed","mappedCodes","c","mappedCustomers","onMappingMasterRowClicked","onMap","selectedRows","selectedCodes","row","key","onUnmap","unmapKey","code","onMappingReset","onMappingSearch","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","JTitlebar","JTabs","$event","_createElementVNode","_hoisted_2","JFilterBar","JButton","_cache","_hoisted_3","JFormField","JSplitter","_hoisted_4","JGrid","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_createBlock","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExampleTabMappingPage.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExampleTabMappingPage.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),p=require("../atoms/JButton.vue.cjs");require("../shadcn/index.cjs");require("lucide-vue-next");const n=require("../../lib/utils.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");const o=require("../atoms/JIcon.vue.cjs"),b=require("../atoms/JLabel.vue.cjs"),x=require("../atoms/JPopover.vue.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const C={class:"flex items-center gap-3 flex-1"},y={class:"flex items-center gap-2"},g={class:"p-2"},k={class:"text-sm text-muted-foreground whitespace-normal break-words"},h={key:0,class:"flex items-center gap-2"},v={key:1},_=e.defineComponent({__name:"JTitlebar",props:{styletype:{default:"default"},icon:{},title:{},description:{},showHelp:{type:Boolean},buttons:{default:()=>[]}},emits:["buttonClick","help"],setup(r,{emit:u}){const d=r,i={default:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background",iconClass:"text-primary",titleClass:"text-foreground",infoIconClass:"text-muted-foreground hover:text-primary"},primary:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-400/30 bg-blue-500",iconClass:"text-white",titleClass:"text-white font-semibold",infoIconClass:"text-white/80 hover:text-white"},accent:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-blue-200 bg-blue-50",iconClass:"text-blue-600",titleClass:"text-blue-700 font-semibold",infoIconClass:"text-blue-600/70 hover:text-blue-700"},neutral:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-gray-300 bg-gray-100",iconClass:"text-gray-600",titleClass:"text-gray-700",infoIconClass:"text-gray-500 hover:text-gray-700"},elevated:{class:"flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background shadow-md",iconClass:"text-primary",titleClass:"text-foreground font-semibold",infoIconClass:"text-muted-foreground hover:text-primary"}},l=e.computed(()=>i[d.styletype]??i.default),a=u,m=s=>{s.onClick?.(),a("buttonClick",s)};return(s,c)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(n.cn)(l.value.class))},[e.createElementVNode("div",C,[r.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:r.icon,size:"md",class:e.normalizeClass(l.value.iconClass)},null,8,["name","class"])):e.createCommentVNode("",!0),e.createElementVNode("div",y,[e.createVNode(e.unref(b.default),{text:r.title||"",class:e.normalizeClass(e.unref(n.cn)("text-lg font-semibold",l.value.titleClass))},null,8,["text","class"]),r.description?(e.openBlock(),e.createBlock(e.unref(x.default),{key:0,position:"bottom",align:"center","side-offset":8},{trigger:e.withCtx(()=>[e.createVNode(e.unref(o.default),{name:"info",size:"sm",class:e.normalizeClass(e.unref(n.cn)("cursor-help transition-colors inline-flex",l.value.infoIconClass))},null,8,["class"])]),default:e.withCtx(()=>[e.createElementVNode("div",g,[e.createElementVNode("p",k,e.toDisplayString(r.description),1)])]),_:1})):e.createCommentVNode("",!0),r.showHelp?(e.openBlock(),e.createBlock(e.unref(o.default),{key:1,name:"circleQuestionMark",size:"sm",class:e.normalizeClass(e.unref(n.cn)("cursor-pointer transition-colors inline-flex",l.value.infoIconClass)),onClick:c[0]||(c[0]=t=>a("help"))},null,8,["class"])):e.createCommentVNode("",!0)])]),r.buttons&&r.buttons.length>0?(e.openBlock(),e.createElementBlock("div",h,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.buttons,(t,f)=>(e.openBlock(),e.createBlock(e.unref(p.default),{key:f,variant:t.variant,styletype:t.styletype,disabled:t.disabled,loading:t.loading,class:e.normalizeClass(t.size==="sm"?"h-8":t.size==="lg"?"h-11":"h-9"),onClick:q=>m(t)},{default:e.withCtx(()=>[t.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:t.icon,size:"sm",class:"mr-1.5"},null,8,["name"])):e.createCommentVNode("",!0),t.text?(e.openBlock(),e.createElementBlock("span",v,e.toDisplayString(t.text),1)):e.createCommentVNode("",!0)]),_:2},1032,["variant","styletype","disabled","loading","class","onClick"]))),128))])):e.createCommentVNode("",!0),e.renderSlot(s.$slots,"buttons")],2))}});exports.default=_;
|
|
2
2
|
//# sourceMappingURL=JTitlebar.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JTitlebar.vue.cjs","sources":["../../../../src/components/molecules/JTitlebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\"\nimport { JIcon, JLabel, JPopover, JButton } from '@/components/atoms'\nimport type { ButtonVariants } from '@/components/shadcn'\nimport { cn } from \"@/lib/utils\"\n\nexport type TitlebarButton = {\n /** 버튼 아이콘 */\n icon?: string\n /** 버튼 텍스트 */\n text?: string\n /** 버튼 클릭 핸들러 */\n onClick?: () => void\n /** 버튼 variant */\n variant?: ButtonVariants['variant']\n /** 버튼 스타일 타입 */\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'outline' | 'ghost' | 'link' | 'sm' | 'lg' | 'icon'\n /** 버튼 size */\n size?: 'sm' | 'md' | 'lg'\n /** 버튼 비활성화 */\n disabled?: boolean\n /** 버튼 로딩 상태 */\n loading?: boolean\n}\n\ntype StyleType =\n | 'default' // 기본 스타일: 일반 페이지용 (흰 배경, 얇은 보더)\n | 'primary' // 강조 스타일: 주요 기능용 (밝은 파란 배경, 흰 텍스트)\n | 'accent' // 액센트 스타일: 부드러운 강조용 (연한 파란 배경, 진한 텍스트)\n | 'neutral' // 중립 스타일: 서브 페이지용 (회색 배경, 회색 텍스트)\n | 'elevated' // 강조 스타일: 깊이감 있는 구분 (흰 배경, 그림자, 보더)\n\nconst props = withDefaults(\n defineProps<{\n /** Titlebar 스타일 타입 */\n styletype?: StyleType\n /** 프로그램 아이콘 */\n icon?: string\n /** 프로그램명 */\n title?: string\n /** 프로그램 설명 (Popover에 표시) */\n description?: string\n /** 메인 버튼 목록 */\n buttons?: TitlebarButton[]\n }>(),\n {\n styletype: 'default',\n buttons: () => [],\n }\n)\n\n/**\n * styletype -> class 매핑 (배경, 보더, 그림자 등)\n */\nconst STYLE_PRESETS: Record<StyleType, { \n class: string\n iconClass: string // 아이콘 색상 클래스\n titleClass: string // 제목 텍스트 색상 클래스\n infoIconClass: string // 정보 아이콘 색상 클래스\n}> = {\n default: {\n // 기본: 흰 배경 + 얇은 보더 (가장 일반적)\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background',\n iconClass: 'text-primary',\n titleClass: 'text-foreground',\n infoIconClass: 'text-muted-foreground hover:text-primary',\n },\n primary: {\n // 강조: 밝은 파란 배경 + 흰 텍스트 (명확한 강조)\n // text-white를 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-blue-400/30 bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-white font-semibold',\n infoIconClass: 'text-white/80 hover:text-white',\n },\n accent: {\n // 액센트: 연한 파란 배경 + 진한 파란 텍스트 (부드러운 강조)\n // text-blue-700을 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-blue-200 bg-blue-50',\n iconClass: 'text-blue-600',\n titleClass: 'text-blue-700 font-semibold',\n infoIconClass: 'text-blue-600/70 hover:text-blue-700',\n },\n neutral: {\n // 중립: 회색 배경 + 회색 텍스트 (확실한 구분)\n // text-gray-700을 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-gray-300 bg-gray-100',\n iconClass: 'text-gray-600',\n titleClass: 'text-gray-700',\n infoIconClass: 'text-gray-500 hover:text-gray-700',\n },\n elevated: {\n // 강조: 흰 배경 + 그림자 + 보더 (깊이감 있는 구분)\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background shadow-md',\n iconClass: 'text-primary',\n titleClass: 'text-foreground font-semibold',\n infoIconClass: 'text-muted-foreground hover:text-primary',\n },\n}\n\nconst preset = computed(() => {\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\n})\n\nconst emit = defineEmits<{\n /** 버튼 클릭 이벤트 */\n buttonClick: [button: TitlebarButton]\n}>()\n\nconst handleButtonClick = (button: TitlebarButton) => {\n // 버튼 클릭 핸들러 패턴:\n // 1. button.onClick이 있으면 실행 (인라인 핸들러)\n // 2. 항상 emit('buttonClick', button) 실행 (부모 컴포넌트로 전달)\n // 주의: onClick과 emit이 모두 실행되므로 중복 처리 가능성 있음\n button.onClick?.()\n emit('buttonClick', button)\n}\n</script>\n\n<template>\n <div :class=\"cn(preset.class)\">\n <!-- 왼쪽: 아이콘 + 프로그램명 -->\n <div class=\"flex items-center gap-3 flex-1\">\n <!-- 아이콘 -->\n <JIcon \n v-if=\"icon\" \n :name=\"icon\" \n size=\"md\" \n :class=\"preset.iconClass\"\n />\n \n <!-- 프로그램명 + 정보 아이콘 + Popover -->\n <div class=\"flex items-center gap-2\">\n <!-- 프로그램명 -->\n <JLabel \n :text=\"title || ''\" \n :class=\"cn('text-lg font-semibold', preset.titleClass)\"\n />\n \n <!-- 정보 아이콘 (description이 있을 때만 표시) -->\n <JPopover \n v-if=\"description\" \n position=\"bottom\"\n align=\"center\"\n :side-offset=\"8\"\n >\n <template #trigger>\n <JIcon \n name=\"info\" \n size=\"sm\" \n :class=\"cn('cursor-help transition-colors inline-flex', preset.infoIconClass)\"\n />\n </template>\n <div class=\"p-2\">\n <p class=\"text-sm text-muted-foreground whitespace-normal break-words\">{{ description }}</p>\n </div>\n </JPopover>\n </div>\n </div>\n\n <!-- 오른쪽: 메인 버튼들 -->\n <!-- buttons prop으로 정의된 버튼들 (v-if로 조건부 렌더링) -->\n <div v-if=\"buttons && buttons.length > 0\" class=\"flex items-center gap-2\">\n <JButton\n v-for=\"(button, index) in buttons\"\n :key=\"index\"\n :variant=\"button.variant\"\n :styletype=\"button.styletype\"\n :disabled=\"button.disabled\"\n :loading=\"button.loading\"\n :class=\"button.size === 'sm' ? 'h-8' : button.size === 'lg' ? 'h-11' : 'h-9'\"\n @click=\"handleButtonClick(button)\"\n >\n <JIcon v-if=\"button.icon\" :name=\"button.icon\" size=\"sm\" class=\"mr-1.5\" />\n <span v-if=\"button.text\">{{ button.text }}</span>\n </JButton>\n </div>\n\n <!-- 버튼 슬롯 레이아웃 설명:\n - buttons prop과 buttons slot이 모두 제공되면 함께 표시됨\n - buttons prop: 구조화된 버튼 정의 (JButton 컴포넌트 사용)\n - buttons slot: 완전한 커스텀 버튼 제어 가능\n - 레이아웃: buttons prop이 먼저 렌더링되고, 그 다음 slot이 렌더링됨 -->\n <slot name=\"buttons\" />\n </div>\n</template>\n\n"],"names":["props","__props","STYLE_PRESETS","preset","computed","emit","__emit","handleButtonClick","button","_createElementBlock","_normalizeClass","_unref","cn","_createElementVNode","_hoisted_1","_createBlock","JIcon","_hoisted_2","_createVNode","JLabel","JPopover","_hoisted_3","_hoisted_4","_toDisplayString","_openBlock","_hoisted_5","_Fragment","_renderList","index","JButton","$event","_hoisted_6","_renderSlot","_ctx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"JTitlebar.vue.cjs","sources":["../../../../src/components/molecules/JTitlebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from \"vue\"\nimport { JIcon, JLabel, JPopover, JButton } from '@/components/atoms'\nimport type { ButtonVariants } from '@/components/shadcn'\nimport { cn } from \"@/lib/utils\"\n\nexport type TitlebarButton = {\n /** 버튼 아이콘 */\n icon?: string\n /** 버튼 텍스트 */\n text?: string\n /** 버튼 클릭 핸들러 */\n onClick?: () => void\n /** 버튼 variant */\n variant?: ButtonVariants['variant']\n /** 버튼 스타일 타입 */\n styletype?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'outline' | 'ghost' | 'link' | 'sm' | 'lg' | 'icon'\n /** 버튼 size */\n size?: 'sm' | 'md' | 'lg'\n /** 버튼 비활성화 */\n disabled?: boolean\n /** 버튼 로딩 상태 */\n loading?: boolean\n}\n\ntype StyleType =\n | 'default' // 기본 스타일: 일반 페이지용 (흰 배경, 얇은 보더)\n | 'primary' // 강조 스타일: 주요 기능용 (밝은 파란 배경, 흰 텍스트)\n | 'accent' // 액센트 스타일: 부드러운 강조용 (연한 파란 배경, 진한 텍스트)\n | 'neutral' // 중립 스타일: 서브 페이지용 (회색 배경, 회색 텍스트)\n | 'elevated' // 강조 스타일: 깊이감 있는 구분 (흰 배경, 그림자, 보더)\n\nconst props = withDefaults(\n defineProps<{\n /** Titlebar 스타일 타입 */\n styletype?: StyleType\n /** 프로그램 아이콘 */\n icon?: string\n /** 프로그램명 */\n title?: string\n /** 프로그램 설명 (Popover에 표시) */\n description?: string\n /** 도움말 아이콘(?) 표시 여부 — 클릭 시 help 이벤트 emit */\n showHelp?: boolean\n /** 메인 버튼 목록 */\n buttons?: TitlebarButton[]\n }>(),\n {\n styletype: 'default',\n buttons: () => [],\n }\n)\n\n/**\n * styletype -> class 매핑 (배경, 보더, 그림자 등)\n */\nconst STYLE_PRESETS: Record<StyleType, { \n class: string\n iconClass: string // 아이콘 색상 클래스\n titleClass: string // 제목 텍스트 색상 클래스\n infoIconClass: string // 정보 아이콘 색상 클래스\n}> = {\n default: {\n // 기본: 흰 배경 + 얇은 보더 (가장 일반적)\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background',\n iconClass: 'text-primary',\n titleClass: 'text-foreground',\n infoIconClass: 'text-muted-foreground hover:text-primary',\n },\n primary: {\n // 강조: 밝은 파란 배경 + 흰 텍스트 (명확한 강조)\n // text-white를 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-blue-400/30 bg-blue-500',\n iconClass: 'text-white',\n titleClass: 'text-white font-semibold',\n infoIconClass: 'text-white/80 hover:text-white',\n },\n accent: {\n // 액센트: 연한 파란 배경 + 진한 파란 텍스트 (부드러운 강조)\n // text-blue-700을 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-blue-200 bg-blue-50',\n iconClass: 'text-blue-600',\n titleClass: 'text-blue-700 font-semibold',\n infoIconClass: 'text-blue-600/70 hover:text-blue-700',\n },\n neutral: {\n // 중립: 회색 배경 + 회색 텍스트 (확실한 구분)\n // text-gray-700을 제거하여 버튼이 색상 상속을 받지 않도록 함\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-gray-300 bg-gray-100',\n iconClass: 'text-gray-600',\n titleClass: 'text-gray-700',\n infoIconClass: 'text-gray-500 hover:text-gray-700',\n },\n elevated: {\n // 강조: 흰 배경 + 그림자 + 보더 (깊이감 있는 구분)\n class: 'flex items-center justify-between w-full h-14 px-4 border-b border-border bg-background shadow-md',\n iconClass: 'text-primary',\n titleClass: 'text-foreground font-semibold',\n infoIconClass: 'text-muted-foreground hover:text-primary',\n },\n}\n\nconst preset = computed(() => {\n return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\n})\n\nconst emit = defineEmits<{\n /** 버튼 클릭 이벤트 */\n buttonClick: [button: TitlebarButton]\n /** 도움말 아이콘 클릭 이벤트 */\n help: []\n}>()\n\nconst handleButtonClick = (button: TitlebarButton) => {\n // 버튼 클릭 핸들러 패턴:\n // 1. button.onClick이 있으면 실행 (인라인 핸들러)\n // 2. 항상 emit('buttonClick', button) 실행 (부모 컴포넌트로 전달)\n // 주의: onClick과 emit이 모두 실행되므로 중복 처리 가능성 있음\n button.onClick?.()\n emit('buttonClick', button)\n}\n</script>\n\n<template>\n <div :class=\"cn(preset.class)\">\n <!-- 왼쪽: 아이콘 + 프로그램명 -->\n <div class=\"flex items-center gap-3 flex-1\">\n <!-- 아이콘 -->\n <JIcon \n v-if=\"icon\" \n :name=\"icon\" \n size=\"md\" \n :class=\"preset.iconClass\"\n />\n \n <!-- 프로그램명 + 정보 아이콘 + Popover -->\n <div class=\"flex items-center gap-2\">\n <!-- 프로그램명 -->\n <JLabel \n :text=\"title || ''\" \n :class=\"cn('text-lg font-semibold', preset.titleClass)\"\n />\n \n <!-- 정보 아이콘 (description이 있을 때만 표시) -->\n <JPopover \n v-if=\"description\" \n position=\"bottom\"\n align=\"center\"\n :side-offset=\"8\"\n >\n <template #trigger>\n <JIcon \n name=\"info\" \n size=\"sm\" \n :class=\"cn('cursor-help transition-colors inline-flex', preset.infoIconClass)\"\n />\n </template>\n <div class=\"p-2\">\n <p class=\"text-sm text-muted-foreground whitespace-normal break-words\">{{ description }}</p>\n </div>\n </JPopover>\n\n <!-- 도움말 아이콘 (showHelp일 때 표시, 클릭 시 help 이벤트) -->\n <JIcon\n v-if=\"showHelp\"\n name=\"circleQuestionMark\"\n size=\"sm\"\n :class=\"cn('cursor-pointer transition-colors inline-flex', preset.infoIconClass)\"\n @click=\"emit('help')\"\n />\n </div>\n </div>\n\n <!-- 오른쪽: 메인 버튼들 -->\n <!-- buttons prop으로 정의된 버튼들 (v-if로 조건부 렌더링) -->\n <div v-if=\"buttons && buttons.length > 0\" class=\"flex items-center gap-2\">\n <JButton\n v-for=\"(button, index) in buttons\"\n :key=\"index\"\n :variant=\"button.variant\"\n :styletype=\"button.styletype\"\n :disabled=\"button.disabled\"\n :loading=\"button.loading\"\n :class=\"button.size === 'sm' ? 'h-8' : button.size === 'lg' ? 'h-11' : 'h-9'\"\n @click=\"handleButtonClick(button)\"\n >\n <JIcon v-if=\"button.icon\" :name=\"button.icon\" size=\"sm\" class=\"mr-1.5\" />\n <span v-if=\"button.text\">{{ button.text }}</span>\n </JButton>\n </div>\n\n <!-- 버튼 슬롯 레이아웃 설명:\n - buttons prop과 buttons slot이 모두 제공되면 함께 표시됨\n - buttons prop: 구조화된 버튼 정의 (JButton 컴포넌트 사용)\n - buttons slot: 완전한 커스텀 버튼 제어 가능\n - 레이아웃: buttons prop이 먼저 렌더링되고, 그 다음 slot이 렌더링됨 -->\n <slot name=\"buttons\" />\n </div>\n</template>\n\n"],"names":["props","__props","STYLE_PRESETS","preset","computed","emit","__emit","handleButtonClick","button","_createElementBlock","_normalizeClass","_unref","cn","_createElementVNode","_hoisted_1","_createBlock","JIcon","_hoisted_2","_createVNode","JLabel","JPopover","_hoisted_3","_hoisted_4","_toDisplayString","_openBlock","_hoisted_5","_Fragment","_renderList","index","JButton","$event","_hoisted_6","_renderSlot","_ctx"],"mappings":"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"}
|