@j-solution/components 1.6.1 → 1.7.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.
Files changed (187) hide show
  1. package/README.md +8 -6
  2. package/assets/jwms-portal-frontend-CwxPfHfa.css +1 -0
  3. package/assets/styles/j-components.css +1 -1
  4. package/assets/styles/themes.css +107 -0
  5. package/components/atoms/JAvatar.vue.cjs +1 -1
  6. package/components/atoms/JAvatar.vue.cjs.map +1 -1
  7. package/components/atoms/JAvatar.vue.js +10 -7
  8. package/components/atoms/JAvatar.vue.js.map +1 -1
  9. package/components/atoms/JBadge.vue.cjs +1 -1
  10. package/components/atoms/JBadge.vue.cjs.map +1 -1
  11. package/components/atoms/JBadge.vue.js +7 -6
  12. package/components/atoms/JBadge.vue.js.map +1 -1
  13. package/components/atoms/JButton.vue.cjs +1 -1
  14. package/components/atoms/JButton.vue.cjs.map +1 -1
  15. package/components/atoms/JButton.vue.js +5 -5
  16. package/components/atoms/JButton.vue.js.map +1 -1
  17. package/components/atoms/JDatepicker.vue.cjs +1 -1
  18. package/components/atoms/JDatepicker.vue.cjs.map +1 -1
  19. package/components/atoms/JDatepicker.vue.js +10 -10
  20. package/components/atoms/JDatepicker.vue.js.map +1 -1
  21. package/components/atoms/JEditor.vue.cjs +1 -1
  22. package/components/atoms/JEditor.vue.js +1 -1
  23. package/components/atoms/JEditor.vue2.cjs +1 -1
  24. package/components/atoms/JEditor.vue2.cjs.map +1 -1
  25. package/components/atoms/JEditor.vue2.js +31 -17
  26. package/components/atoms/JEditor.vue2.js.map +1 -1
  27. package/components/atoms/JGrid.vue.cjs +1 -1
  28. package/components/atoms/JGrid.vue.js +2 -2
  29. package/components/atoms/JGrid.vue2.cjs +1 -1
  30. package/components/atoms/JGrid.vue2.cjs.map +1 -1
  31. package/components/atoms/JGrid.vue2.js +45 -33
  32. package/components/atoms/JGrid.vue2.js.map +1 -1
  33. package/components/atoms/JIcon.vue.cjs +1 -1
  34. package/components/atoms/JIcon.vue.cjs.map +1 -1
  35. package/components/atoms/JIcon.vue.js +14 -13
  36. package/components/atoms/JIcon.vue.js.map +1 -1
  37. package/components/atoms/JKbd.vue.cjs +1 -1
  38. package/components/atoms/JKbd.vue.cjs.map +1 -1
  39. package/components/atoms/JKbd.vue.js +13 -10
  40. package/components/atoms/JKbd.vue.js.map +1 -1
  41. package/components/atoms/JLabel.vue.cjs +1 -1
  42. package/components/atoms/JLabel.vue.cjs.map +1 -1
  43. package/components/atoms/JLabel.vue.js +4 -4
  44. package/components/atoms/JLabel.vue.js.map +1 -1
  45. package/components/atoms/JLink.vue.cjs +1 -1
  46. package/components/atoms/JLink.vue.cjs.map +1 -1
  47. package/components/atoms/JLink.vue.js +5 -5
  48. package/components/atoms/JLink.vue.js.map +1 -1
  49. package/components/atoms/JPreview.vue.cjs +1 -1
  50. package/components/atoms/JPreview.vue.js +2 -2
  51. package/components/atoms/JPreview.vue2.cjs +1 -1
  52. package/components/atoms/JPreview.vue2.cjs.map +1 -1
  53. package/components/atoms/JPreview.vue2.js +33 -20
  54. package/components/atoms/JPreview.vue2.js.map +1 -1
  55. package/components/atoms/JProgress.vue.cjs +1 -1
  56. package/components/atoms/JProgress.vue.cjs.map +1 -1
  57. package/components/atoms/JProgress.vue.js +15 -9
  58. package/components/atoms/JProgress.vue.js.map +1 -1
  59. package/components/atoms/JRadio.vue.cjs +1 -1
  60. package/components/atoms/JRadio.vue.cjs.map +1 -1
  61. package/components/atoms/JRadio.vue.js +1 -1
  62. package/components/atoms/JRadio.vue.js.map +1 -1
  63. package/components/atoms/JSearchCombo.vue.cjs +1 -1
  64. package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
  65. package/components/atoms/JSearchCombo.vue.js +38 -37
  66. package/components/atoms/JSearchCombo.vue.js.map +1 -1
  67. package/components/atoms/JSpinner.vue.cjs +1 -1
  68. package/components/atoms/JSpinner.vue.cjs.map +1 -1
  69. package/components/atoms/JSpinner.vue.js +8 -7
  70. package/components/atoms/JSpinner.vue.js.map +1 -1
  71. package/components/atoms/JSplitter.vue.cjs +1 -1
  72. package/components/atoms/JSplitter.vue.cjs.map +1 -1
  73. package/components/atoms/JSplitter.vue.js +32 -27
  74. package/components/atoms/JSplitter.vue.js.map +1 -1
  75. package/components/atoms/JTooltip.vue.cjs +1 -1
  76. package/components/atoms/JTooltip.vue.cjs.map +1 -1
  77. package/components/atoms/JTooltip.vue.js +18 -15
  78. package/components/atoms/JTooltip.vue.js.map +1 -1
  79. package/components/examples/ExampleCrudPage.vue.cjs +1 -1
  80. package/components/examples/ExampleCrudPage.vue.cjs.map +1 -1
  81. package/components/examples/ExampleCrudPage.vue.js +162 -108
  82. package/components/examples/ExampleCrudPage.vue.js.map +1 -1
  83. package/components/examples/ExampleTabMappingPage.vue.cjs +1 -1
  84. package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -1
  85. package/components/examples/ExampleTabMappingPage.vue.js +162 -119
  86. package/components/examples/ExampleTabMappingPage.vue.js.map +1 -1
  87. package/components/molecules/JBreadcrumb.vue.cjs +1 -1
  88. package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
  89. package/components/molecules/JBreadcrumb.vue.js +3 -3
  90. package/components/molecules/JBreadcrumb.vue.js.map +1 -1
  91. package/components/molecules/JFormField.vue.cjs +1 -1
  92. package/components/molecules/JFormField.vue.cjs.map +1 -1
  93. package/components/molecules/JFormField.vue.js +26 -24
  94. package/components/molecules/JFormField.vue.js.map +1 -1
  95. package/components/molecules/JTabs.vue.cjs +1 -1
  96. package/components/molecules/JTabs.vue.js +1 -1
  97. package/components/molecules/JTabs.vue2.cjs +1 -1
  98. package/components/molecules/JTabs.vue2.cjs.map +1 -1
  99. package/components/molecules/JTabs.vue2.js +7 -7
  100. package/components/molecules/JTabs.vue2.js.map +1 -1
  101. package/components/molecules/JTitlebar.vue.cjs +1 -1
  102. package/components/molecules/JTitlebar.vue.cjs.map +1 -1
  103. package/components/molecules/JTitlebar.vue.js +35 -36
  104. package/components/molecules/JTitlebar.vue.js.map +1 -1
  105. package/components/organisms/JFilterBar.vue.cjs +1 -1
  106. package/components/organisms/JFilterBar.vue.cjs.map +1 -1
  107. package/components/organisms/JFilterBar.vue.js +5 -5
  108. package/components/organisms/JFilterBar.vue.js.map +1 -1
  109. package/components/organisms/JHeader.vue.cjs +1 -1
  110. package/components/organisms/JHeader.vue.cjs.map +1 -1
  111. package/components/organisms/JHeader.vue.js +25 -23
  112. package/components/organisms/JHeader.vue.js.map +1 -1
  113. package/components/organisms/JModal.vue.cjs +1 -1
  114. package/components/organisms/JModal.vue.cjs.map +1 -1
  115. package/components/organisms/JModal.vue.js +30 -27
  116. package/components/organisms/JModal.vue.js.map +1 -1
  117. package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
  118. package/components/organisms/JSidebarAdvanced.vue.js +7 -7
  119. package/components/organisms/JSidebarAdvanced.vue2.cjs +1 -1
  120. package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
  121. package/components/organisms/JSidebarAdvanced.vue2.js +40 -40
  122. package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
  123. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +1 -1
  124. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -1
  125. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +83 -63
  126. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -1
  127. package/components/organisms/JSidebarSimple.vue.cjs +1 -1
  128. package/components/organisms/JSidebarSimple.vue.js +2 -2
  129. package/components/organisms/JSidebarSimple.vue2.cjs +1 -1
  130. package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
  131. package/components/organisms/JSidebarSimple.vue2.js +2 -2
  132. package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
  133. package/components/shadcn/AccordionTrigger.vue.cjs +1 -1
  134. package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
  135. package/components/shadcn/AccordionTrigger.vue.js +3 -3
  136. package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
  137. package/components/shadcn/CardContent.vue.cjs +1 -1
  138. package/components/shadcn/CardContent.vue.cjs.map +1 -1
  139. package/components/shadcn/CardContent.vue.js +1 -1
  140. package/components/shadcn/CardContent.vue.js.map +1 -1
  141. package/components/shadcn/CardDescription.vue.cjs +1 -1
  142. package/components/shadcn/CardDescription.vue.cjs.map +1 -1
  143. package/components/shadcn/CardDescription.vue.js +1 -1
  144. package/components/shadcn/CardDescription.vue.js.map +1 -1
  145. package/components/shadcn/CardFooter.vue.cjs +1 -1
  146. package/components/shadcn/CardFooter.vue.cjs.map +1 -1
  147. package/components/shadcn/CardFooter.vue.js +7 -7
  148. package/components/shadcn/CardFooter.vue.js.map +1 -1
  149. package/components/shadcn/CardHeader.vue.cjs +1 -1
  150. package/components/shadcn/CardHeader.vue.cjs.map +1 -1
  151. package/components/shadcn/CardHeader.vue.js +8 -8
  152. package/components/shadcn/CardHeader.vue.js.map +1 -1
  153. package/components/shadcn/CardTitle.vue.cjs +1 -1
  154. package/components/shadcn/CardTitle.vue.cjs.map +1 -1
  155. package/components/shadcn/CardTitle.vue.js +5 -5
  156. package/components/shadcn/CardTitle.vue.js.map +1 -1
  157. package/components/shadcn/Input.vue.cjs +1 -1
  158. package/components/shadcn/Input.vue.cjs.map +1 -1
  159. package/components/shadcn/Input.vue.js +1 -1
  160. package/components/shadcn/Input.vue.js.map +1 -1
  161. package/components/shadcn/SelectTrigger.vue.cjs +1 -1
  162. package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
  163. package/components/shadcn/SelectTrigger.vue.js +2 -2
  164. package/components/shadcn/SelectTrigger.vue.js.map +1 -1
  165. package/components/shadcn/Switch.vue.cjs +1 -1
  166. package/components/shadcn/Switch.vue.cjs.map +1 -1
  167. package/components/shadcn/Switch.vue.js +2 -2
  168. package/components/shadcn/Switch.vue.js.map +1 -1
  169. package/components/shadcn/TabsList.vue.cjs +1 -1
  170. package/components/shadcn/TabsList.vue.cjs.map +1 -1
  171. package/components/shadcn/TabsList.vue.js +1 -1
  172. package/components/shadcn/TabsList.vue.js.map +1 -1
  173. package/components/shadcn/TabsTrigger.vue.cjs +1 -1
  174. package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
  175. package/components/shadcn/TabsTrigger.vue.js +4 -4
  176. package/components/shadcn/TabsTrigger.vue.js.map +1 -1
  177. package/components/shadcn/Textarea.vue.cjs +1 -1
  178. package/components/shadcn/Textarea.vue.cjs.map +1 -1
  179. package/components/shadcn/Textarea.vue.js +2 -2
  180. package/components/shadcn/Textarea.vue.js.map +1 -1
  181. package/components/shadcn/index.cjs +1 -1
  182. package/components/shadcn/index.cjs.map +1 -1
  183. package/components/shadcn/index.js +8 -7
  184. package/components/shadcn/index.js.map +1 -1
  185. package/package.json +1 -1
  186. package/types/index.d.ts +131 -15
  187. package/assets/jwms-portal-frontend-DntSIcYt.css +0 -1
@@ -1,5 +1,5 @@
1
- import { defineComponent as U, ref as s, createElementBlock as R, openBlock as g, createVNode as i, unref as a, withCtx as r, createElementVNode as d, createTextVNode as c, toDisplayString as h, createBlock as D, createCommentVNode as E } from "vue";
2
- import m from "../molecules/JFormField.vue.js";
1
+ import { defineComponent as B, ref as s, createElementBlock as U, openBlock as g, createVNode as i, unref as a, withCtx as r, createElementVNode as u, createTextVNode as c, createBlock as P, createCommentVNode as R } from "vue";
2
+ import d from "../molecules/JFormField.vue.js";
3
3
  /* empty css */
4
4
  import "../shadcn/index.js";
5
5
  import "@vueuse/core";
@@ -10,6 +10,7 @@ import "lucide-vue-next";
10
10
  /* empty css */
11
11
  /* empty css */
12
12
  /* empty css */
13
+ import G from "../molecules/JCard.vue.js";
13
14
  import p from "../atoms/JButton.vue.js";
14
15
  import "@internationalized/date";
15
16
  import "md-editor-v3";
@@ -20,23 +21,23 @@ import "../shadcn/badge-variants.js";
20
21
  import "../shadcn/avatar-variants.js";
21
22
  import "dompurify";
22
23
  /* empty css */
23
- import S from "../atoms/JGrid.vue.js";
24
- import H from "../atoms/JSplitter.vue.js";
24
+ import D from "../atoms/JGrid.vue.js";
25
+ import E from "../atoms/JSplitter.vue.js";
25
26
  import "vue-sonner";
26
- import O from "../molecules/JTitlebar.vue.js";
27
+ import S from "../molecules/JTitlebar.vue.js";
27
28
  /* empty css */
28
29
  /* empty css */
29
- import j from "../organisms/JFilterBar.vue.js";
30
+ import H from "../organisms/JFilterBar.vue.js";
30
31
  import "vue-router";
31
32
  /* empty css */
32
33
  /* empty css */
33
- const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" }, J = { class: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4" }, L = { class: "h-full overflow-auto bg-background" }, P = { class: "h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card" }, T = { class: "text-lg font-semibold mb-2" }, X = { class: "grid grid-cols-1 md:grid-cols-2 gap-4" }, Z = { class: "grid grid-cols-1 md:grid-cols-2 gap-4" }, q = { class: "flex justify-end gap-2 mt-4" }, Ye = /* @__PURE__ */ U({
34
+ const O = { class: "flex flex-col h-full gap-2 bg-background text-foreground" }, T = { class: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2" }, W = { class: "h-full overflow-auto bg-background" }, j = { class: "h-full overflow-y-auto border-l bg-muted/30" }, F = { class: "grid grid-cols-1 md:grid-cols-2 gap-2 mt-2" }, J = { class: "grid grid-cols-1 md:grid-cols-2 gap-2 mt-2" }, L = { class: "grid grid-cols-1 gap-2 mt-2" }, X = { class: "flex justify-end gap-2" }, Ye = /* @__PURE__ */ B({
34
35
  __name: "ExampleCrudPage",
35
- setup(F, { expose: y }) {
36
+ setup(Z, { expose: y }) {
36
37
  const f = s(!1), n = s({
37
38
  isActive: "",
38
39
  keyword: ""
39
- }), k = {
40
+ }), b = {
40
41
  isActive: {
41
42
  label: "활성여부",
42
43
  displayValue: (o) => o === "Y" ? "Y:활성" : o === "N" ? "N:비활성" : ""
@@ -44,7 +45,7 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
44
45
  keyword: {
45
46
  label: "검색어"
46
47
  }
47
- }, b = [
48
+ }, k = [
48
49
  { value: "Y", label: "Y:활성" },
49
50
  { value: "N", label: "N:비활성" }
50
51
  ], V = [
@@ -58,23 +59,53 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
58
59
  { code: "C004", name: "대한물류", category: "B", isActive: "Y", remark: "" },
59
60
  { code: "C005", name: "글로벌이커머스", category: "A", isActive: "Y", remark: "신규 고객사" }
60
61
  ]), C = s([
61
- { field: "code", headerName: "코드", width: 120 },
62
- { field: "name", headerName: "이름", width: 200 },
63
- { field: "category", headerName: "분류", width: 100 },
62
+ {
63
+ field: "code",
64
+ headerName: "코드",
65
+ width: 120,
66
+ enableValue: !0
67
+ // 집계 가능 (count)
68
+ },
69
+ {
70
+ field: "name",
71
+ headerName: "이름",
72
+ width: 200,
73
+ enableValue: !0
74
+ // 집계 가능 (count)
75
+ },
76
+ {
77
+ field: "category",
78
+ headerName: "분류",
79
+ width: 100,
80
+ enableRowGroup: !0,
81
+ // Row Group으로 사용 가능
82
+ enablePivot: !0
83
+ // Pivot Column으로 사용 가능
84
+ },
64
85
  {
65
86
  field: "isActive",
66
87
  headerName: "활성",
67
88
  width: 100,
68
- cellRenderer: (o) => o.value === "Y" ? "✓" : ""
89
+ cellRenderer: (o) => o.value === "Y" ? "✓" : "",
90
+ enableRowGroup: !0,
91
+ // Row Group으로 사용 가능
92
+ enablePivot: !0
93
+ // Pivot Column으로 사용 가능
69
94
  },
70
- { field: "remark", headerName: "비고", flex: 1 }
71
- ]), x = [
95
+ {
96
+ field: "remark",
97
+ headerName: "비고",
98
+ flex: 1,
99
+ enableValue: !0
100
+ // 집계 가능 (count)
101
+ }
102
+ ]), w = [
72
103
  {
73
104
  icon: "pencil",
74
105
  label: "수정",
75
106
  tooltip: "편집",
76
107
  onClick: (o) => {
77
- u.value = !1, l.value = {
108
+ m.value = !1, l.value = {
78
109
  code: o.code,
79
110
  name: o.name,
80
111
  category: o.category,
@@ -92,15 +123,15 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
92
123
  confirm(`${o.name}을(를) 삭제하시겠습니까?`) && (console.log("삭제:", o.code), alert(`삭제되었습니다: ${o.name}`));
93
124
  }
94
125
  }
95
- ], u = s(!1), l = s({
126
+ ], m = s(!1), l = s({
96
127
  code: "",
97
128
  name: "",
98
129
  category: "",
99
130
  isActive: "Y",
100
131
  remark: ""
101
132
  });
102
- function N(o) {
103
- u.value = !1;
133
+ function _(o) {
134
+ m.value = !1;
104
135
  const e = o.data;
105
136
  l.value = {
106
137
  code: e.code,
@@ -110,8 +141,8 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
110
141
  remark: e.remark
111
142
  };
112
143
  }
113
- function w() {
114
- u.value = !0, l.value = {
144
+ function x() {
145
+ m.value = !0, l.value = {
115
146
  code: "",
116
147
  name: "",
117
148
  category: "",
@@ -119,13 +150,13 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
119
150
  remark: ""
120
151
  };
121
152
  }
122
- function _() {
153
+ function N() {
123
154
  console.log("저장:", l.value), alert(`저장되었습니다: ${l.value.name}`);
124
155
  }
125
- function Y() {
156
+ function z() {
126
157
  confirm(`${l.value.name}을(를) 삭제하시겠습니까?`) && (console.log("삭제:", l.value.code), alert(`삭제되었습니다: ${l.value.name}`));
127
158
  }
128
- function z() {
159
+ function Y() {
129
160
  n.value = {
130
161
  isActive: "",
131
162
  keyword: ""
@@ -134,23 +165,23 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
134
165
  function $() {
135
166
  console.log("조회 조건:", n.value);
136
167
  }
137
- function B() {
168
+ function h() {
138
169
  alert("고객사 관리 페이지 도움말");
139
170
  }
140
- return y({ gridRef: v }), (o, e) => (g(), R("div", G, [
141
- i(a(O), {
171
+ return y({ gridRef: v }), (o, e) => (g(), U("div", O, [
172
+ i(a(S), {
142
173
  icon: "building",
143
174
  title: "고객사 관리",
144
175
  description: "고객사 정보를 조회하고 관리합니다",
145
176
  showHelp: !0,
146
- onHelp: B
177
+ onHelp: h
147
178
  }),
148
- i(a(j), {
179
+ i(a(H), {
149
180
  collapsed: f.value,
150
181
  "onUpdate:collapsed": e[2] || (e[2] = (t) => f.value = t),
151
182
  filterValues: n.value,
152
183
  "onUpdate:filterValues": e[3] || (e[3] = (t) => n.value = t),
153
- filterDisplay: k,
184
+ filterDisplay: b,
154
185
  collapsible: !0,
155
186
  title: "고객사 목록"
156
187
  }, {
@@ -158,7 +189,7 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
158
189
  i(a(p), {
159
190
  size: "sm",
160
191
  variant: "outline",
161
- onClick: z
192
+ onClick: Y
162
193
  }, {
163
194
  default: r(() => [...e[9] || (e[9] = [
164
195
  c("초기화", -1)
@@ -178,7 +209,7 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
178
209
  i(a(p), {
179
210
  size: "sm",
180
211
  styletype: "primary",
181
- onClick: w
212
+ onClick: x
182
213
  }, {
183
214
  default: r(() => [...e[11] || (e[11] = [
184
215
  c("신규", -1)
@@ -187,110 +218,133 @@ const G = { class: "flex flex-col h-full gap-4 bg-background text-foreground" },
187
218
  })
188
219
  ]),
189
220
  filters: r(() => [
190
- d("div", J, [
191
- i(a(m), {
221
+ u("div", T, [
222
+ i(a(d), {
192
223
  type: "combo",
193
224
  label: "활성여부",
194
225
  modelValue: n.value.isActive,
195
226
  "onUpdate:modelValue": e[0] || (e[0] = (t) => n.value.isActive = t),
196
- options: b
227
+ options: k,
228
+ orientation: "horizontal",
229
+ labelWidth: "30%"
197
230
  }, null, 8, ["modelValue"]),
198
- i(a(m), {
231
+ i(a(d), {
199
232
  type: "input",
200
233
  label: "검색어",
201
234
  modelValue: n.value.keyword,
202
- "onUpdate:modelValue": e[1] || (e[1] = (t) => n.value.keyword = t)
235
+ "onUpdate:modelValue": e[1] || (e[1] = (t) => n.value.keyword = t),
236
+ orientation: "horizontal",
237
+ labelWidth: "30%"
203
238
  }, null, 8, ["modelValue"])
204
239
  ])
205
240
  ]),
206
241
  _: 1
207
242
  }, 8, ["collapsed", "filterValues"]),
208
- i(a(H), {
243
+ i(a(E), {
209
244
  direction: "horizontal",
210
245
  "default-size": 60,
211
246
  "min-size": 30,
212
247
  "second-min-size": 20,
213
248
  "second-max-size": 60,
249
+ gap: 2,
214
250
  class: "flex-1"
215
251
  }, {
216
252
  left: r(() => [
217
- d("div", L, [
218
- i(a(S), {
253
+ u("div", W, [
254
+ i(a(D), {
219
255
  ref_key: "gridRef",
220
256
  ref: v,
221
257
  columnDefs: C.value,
222
258
  rowData: A.value,
223
- "action-buttons": x,
224
- onRowClicked: N
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: _
225
268
  }, null, 8, ["columnDefs", "rowData"])
226
269
  ])
227
270
  ]),
228
271
  right: r(() => [
229
- d("div", P, [
230
- d("h3", T, h(u.value ? "신규 등록" : "상세 정보"), 1),
231
- d("div", X, [
232
- i(a(m), {
233
- type: "input",
234
- label: "코드",
235
- modelValue: l.value.code,
236
- "onUpdate:modelValue": e[4] || (e[4] = (t) => l.value.code = t),
237
- readonly: !u.value,
238
- placeholder: "고객사 코드"
239
- }, null, 8, ["modelValue", "readonly"]),
240
- i(a(m), {
241
- type: "input",
242
- label: "이름",
243
- modelValue: l.value.name,
244
- "onUpdate:modelValue": e[5] || (e[5] = (t) => l.value.name = t),
245
- placeholder: "고객사 이름"
246
- }, null, 8, ["modelValue"])
247
- ]),
248
- d("div", Z, [
249
- i(a(m), {
250
- type: "combo",
251
- label: "분류",
252
- modelValue: l.value.category,
253
- "onUpdate:modelValue": e[6] || (e[6] = (t) => l.value.category = t),
254
- options: V
255
- }, null, 8, ["modelValue"]),
256
- i(a(m), {
257
- type: "checkbox",
258
- label: "활성여부",
259
- modelValue: l.value.isActive,
260
- "onUpdate:modelValue": e[7] || (e[7] = (t) => l.value.isActive = t),
261
- inlineLabel: "활성"
262
- }, null, 8, ["modelValue"])
263
- ]),
264
- i(a(m), {
265
- type: "textarea",
266
- label: "비고",
267
- modelValue: l.value.remark,
268
- "onUpdate:modelValue": e[8] || (e[8] = (t) => l.value.remark = t),
269
- placeholder: "비고"
270
- }, null, 8, ["modelValue"]),
271
- d("div", q, [
272
- i(a(p), {
273
- styletype: "primary",
274
- size: "sm",
275
- onClick: _
276
- }, {
277
- default: r(() => [...e[12] || (e[12] = [
278
- c("저장", -1)
279
- ])]),
280
- _: 1
281
- }),
282
- u.value ? E("", !0) : (g(), D(a(p), {
283
- key: 0,
284
- variant: "outline",
285
- size: "sm",
286
- onClick: Y
287
- }, {
288
- default: r(() => [...e[13] || (e[13] = [
289
- c("삭제", -1)
290
- ])]),
291
- _: 1
292
- }))
293
- ])
272
+ u("div", j, [
273
+ i(a(G), {
274
+ class: "h-full",
275
+ title: m.value ? "신규 등록" : "상세 정보"
276
+ }, {
277
+ footer: r(() => [
278
+ u("div", X, [
279
+ i(a(p), {
280
+ styletype: "primary",
281
+ size: "sm",
282
+ onClick: N
283
+ }, {
284
+ default: r(() => [...e[12] || (e[12] = [
285
+ c("저장", -1)
286
+ ])]),
287
+ _: 1
288
+ }),
289
+ m.value ? R("", !0) : (g(), P(a(p), {
290
+ key: 0,
291
+ variant: "outline",
292
+ size: "sm",
293
+ onClick: z
294
+ }, {
295
+ default: r(() => [...e[13] || (e[13] = [
296
+ c("삭제", -1)
297
+ ])]),
298
+ _: 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"])
319
+ ]),
320
+ u("div", J, [
321
+ i(a(d), {
322
+ type: "combo",
323
+ label: "분류",
324
+ modelValue: l.value.category,
325
+ "onUpdate:modelValue": e[6] || (e[6] = (t) => l.value.category = t),
326
+ options: V
327
+ }, null, 8, ["modelValue"]),
328
+ i(a(d), {
329
+ type: "checkbox",
330
+ label: "활성여부",
331
+ modelValue: l.value.isActive,
332
+ "onUpdate:modelValue": e[7] || (e[7] = (t) => l.value.isActive = t),
333
+ inlineLabel: "활성"
334
+ }, null, 8, ["modelValue"])
335
+ ]),
336
+ u("div", L, [
337
+ i(a(d), {
338
+ type: "textarea",
339
+ label: "비고",
340
+ modelValue: l.value.remark,
341
+ "onUpdate:modelValue": e[8] || (e[8] = (t) => l.value.remark = t),
342
+ placeholder: "비고"
343
+ }, null, 8, ["modelValue"])
344
+ ])
345
+ ]),
346
+ _: 1
347
+ }, 8, ["title"])
294
348
  ])
295
349
  ]),
296
350
  _: 1
@@ -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-4 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-4\">\n <JFormField\n type=\"combo\"\n label=\"활성여부\"\n v-model=\"filterValues.isActive\"\n :options=\"activeOptions\"\n />\n <JFormField type=\"input\" label=\"검색어\" v-model=\"filterValues.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=\"gridRef\"\n :columnDefs=\"columnDefs\"\n :rowData=\"rowData\"\n :action-buttons=\"actionButtons\"\n @row-clicked=\"onRowClicked\"\n />\n </div>\n </template>\n\n <!-- 우측: 상세 영역 -->\n <template #right>\n <div class=\"h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card\">\n <h3 class=\"text-lg font-semibold mb-2\">{{ isNew ? '신규 등록' : '상세 정보' }}</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=\"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-4\">\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\n <!-- 전체 너비: 비고 -->\n <JFormField type=\"textarea\" label=\"비고\" v-model=\"detail.remark\" placeholder=\"비고\" />\n\n <!-- 액션 버튼 -->\n <div class=\"flex justify-end gap-2 mt-4\">\n <JButton styletype=\"primary\" size=\"sm\" @click=\"onSave\">저장</JButton>\n <JButton variant=\"outline\" size=\"sm\" @click=\"onDelete\" v-if=\"!isNew\">삭제</JButton>\n </div>\n </div>\n </template>\n </JSplitter>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } 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'\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 { field: 'code', headerName: '코드', width: 120 },\n { field: 'name', headerName: '이름', width: 200 },\n { field: 'category', headerName: '분류', width: 100 },\n {\n field: 'isActive',\n headerName: '활성',\n width: 100,\n cellRenderer: (params: any) => (params.value === 'Y' ? '✓' : ''),\n },\n { field: 'remark', headerName: '비고', flex: 1 },\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","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_createBlock"],"mappings":"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"}
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,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),m=require("../molecules/JFormField.vue.cjs");;/* empty css */require("../shadcn/index.cjs");require("@vueuse/core");require("reka-ui");require("clsx");require("tailwind-merge");require("lucide-vue-next");const L=require("../molecules/JTabs.vue.cjs");;/* empty css */;/* empty css */const i=require("../atoms/JButton.vue.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");;/* empty css */require("../shadcn/avatar-variants.cjs");require("dompurify");;/* empty css */const f=require("../atoms/JGrid.vue.cjs"),_=require("../atoms/JSplitter.vue.cjs");require("vue-sonner");const X=require("../molecules/JTitlebar.vue.cjs");;/* empty css */;/* empty css */const k=require("../organisms/JFilterBar.vue.cjs");require("vue-router");;/* empty css */;/* empty css */const Z={class:"flex flex-col h-full gap-4 bg-background text-foreground"},Q={class:"flex flex-col h-full gap-4 p-4"},W={class:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"},ee={class:"h-full overflow-auto bg-background"},te={class:"h-full flex flex-col gap-4 overflow-y-auto p-4 border-l rounded-lg bg-card"},le={class:"text-lg font-semibold mb-2"},ae={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},re={class:"flex justify-end gap-2 mt-4"},oe={class:"flex flex-col h-full gap-4 p-4"},ie={class:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"},se={class:"h-full overflow-auto bg-background"},ue={class:"h-full flex gap-2 overflow-hidden items-stretch p-2 bg-background"},ne={class:"flex-1 flex flex-col overflow-hidden"},de={class:"flex-1 overflow-auto bg-background"},me={class:"flex flex-col justify-center gap-2 px-2"},ce={class:"flex-1 flex flex-col overflow-hidden"},fe={class:"flex-1 overflow-auto bg-background"},pe=e.defineComponent({__name:"ExampleTabMappingPage",setup(ve,{expose:h}){const p=e.ref("master"),q=[{id:"master",label:"회원사 기본정보"},{id:"mapping-customer",label:"고객사 매핑"}];function D(l){console.log("탭 변경:",l)}const M=[{value:"Y",label:"Y:활성"},{value:"N",label:"N:비활성"}],v=e.ref(!1),s=e.ref({isActive:"",keyword:""}),E={isActive:{label:"활성여부",displayValue:l=>l==="Y"?"Y:활성":l==="N"?"N:비활성":""},keyword:{label:"검색어"}},b=e.ref([{memberId:"M001",memberName:"제이솔루션",isActive:"Y"},{memberId:"M002",memberName:"ABC물류",isActive:"Y"},{memberId:"M003",memberName:"XYZ유통",isActive:"N"}]),I=e.ref([{field:"memberId",headerName:"회원사코드",width:150},{field:"memberName",headerName:"회원사명",flex:1},{field:"isActive",headerName:"활성",width:100,cellRenderer:l=>l.value==="Y"?"✓":""}]),A=[{icon:"pencil",label:"수정",tooltip:"편집",onClick:l=>{n.value=!1,r.value={memberId:l.memberId,memberName:l.memberName,isActive:l.isActive}}},{icon:"trash2",label:"삭제",tooltip:"삭제",styletype:"danger",onClick:l=>{confirm(`${l.memberName}을(를) 삭제하시겠습니까?`)&&(console.log("회원사 삭제:",l.memberId),alert(`삭제되었습니다: ${l.memberName}`))}}],N=e.ref(),n=e.ref(!1),r=e.ref({memberId:"",memberName:"",isActive:"Y"});function R(l){n.value=!1,r.value={memberId:l.data.memberId,memberName:l.data.memberName,isActive:l.data.isActive}}function T(){n.value=!0,r.value={memberId:"",memberName:"",isActive:"Y"}}function z(){console.log("회원사 저장:",r.value),alert(`저장되었습니다: ${r.value.memberName}`)}function U(){confirm(`${r.value.memberName}을(를) 삭제하시겠습니까?`)&&(console.log("회원사 삭제:",r.value.memberId),alert(`삭제되었습니다: ${r.value.memberName}`))}function Y(){s.value={isActive:"",keyword:""}}function B(){console.log("회원사 조회:",s.value)}function F(){alert("회원사 관리 페이지 도움말")}const V=e.ref(!1),d=e.ref({keyword:""}),G={keyword:{label:"검색어"}},g=e.ref(),x=e.ref(),C=e.ref(),S=e.ref([{field:"memberId",headerName:"회원사코드",width:150},{field:"memberName",headerName:"회원사명",flex:1}]),o=e.ref(""),u=e.ref({M001:["C001","C002"],M002:["C003"],M003:[]}),w=[{code:"C001",name:"고객A"},{code:"C002",name:"고객B"},{code:"C003",name:"고객C"},{code:"C004",name:"고객D"},{code:"C005",name:"고객E"}],y=e.ref([{field:"code",headerName:"코드",width:120},{field:"name",headerName:"이름",flex:1}]),J=e.computed(()=>{if(!o.value)return[];const l=u.value[o.value]||[];return w.filter(t=>!l.includes(t.code))}),$=e.computed(()=>{if(!o.value)return[];const l=u.value[o.value]||[];return w.filter(t=>l.includes(t.code))});function j(l){o.value=l.data.memberId,console.log("선택된 회원사:",l.data.memberName)}function H(){if(!o.value){alert("회원사를 먼저 선택해주세요.");return}const l=x.value?.getSelectedRows()||[];if(l.length===0){alert("매핑할 고객사를 선택해주세요.");return}const t=l.map(c=>c.code),a=o.value;u.value[a]||(u.value[a]=[]),u.value[a].push(...t),console.log("매핑:",t)}function O(){if(!o.value){alert("회원사를 먼저 선택해주세요.");return}const l=C.value?.getSelectedRows()||[];if(l.length===0){alert("해제할 고객사를 선택해주세요.");return}const t=l.map(c=>c.code),a=o.value;u.value[a]=(u.value[a]||[]).filter(c=>!t.includes(c)),console.log("해제:",t)}function P(){d.value={keyword:""}}function K(){console.log("매핑 조회:",d.value)}return h({masterGridRef:N,mappingMasterGridRef:g}),(l,t)=>(e.openBlock(),e.createElementBlock("div",Z,[e.createVNode(e.unref(X.default),{icon:"users",title:"회원사 관리",description:"회원사 정보 및 고객사 매핑을 관리합니다",showHelp:!0,onHelp:F}),e.createVNode(e.unref(L.default),{activeTabId:p.value,"onUpdate:activeTabId":t[10]||(t[10]=a=>p.value=a),tabs:q,onTabChange:D},{"content-master":e.withCtx(()=>[e.createElementVNode("div",Q,[e.createVNode(e.unref(k.default),{collapsed:v.value,"onUpdate:collapsed":t[2]||(t[2]=a=>v.value=a),filterValues:s.value,"onUpdate:filterValues":t[3]||(t[3]=a=>s.value=a),filterDisplay:E,collapsible:!0,title:"회원사 목록"},{actions:e.withCtx(()=>[e.createVNode(e.unref(i.default),{size:"sm",variant:"outline",onClick:Y},{default:e.withCtx(()=>[...t[11]||(t[11]=[e.createTextVNode("초기화",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:B},{default:e.withCtx(()=>[...t[12]||(t[12]=[e.createTextVNode("조회",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:T},{default:e.withCtx(()=>[...t[13]||(t[13]=[e.createTextVNode("신규",-1)])]),_:1})]),filters:e.withCtx(()=>[e.createElementVNode("div",W,[e.createVNode(e.unref(m.default),{type:"combo",label:"활성여부",modelValue:s.value.isActive,"onUpdate:modelValue":t[0]||(t[0]=a=>s.value.isActive=a),options:M},null,8,["modelValue"]),e.createVNode(e.unref(m.default),{type:"input",label:"검색어",modelValue:s.value.keyword,"onUpdate:modelValue":t[1]||(t[1]=a=>s.value.keyword=a)},null,8,["modelValue"])])]),_:1},8,["collapsed","filterValues"]),e.createVNode(e.unref(_.default),{direction:"horizontal","default-size":60,"min-size":30,"second-min-size":20,"second-max-size":60,class:"flex-1"},{left:e.withCtx(()=>[e.createElementVNode("div",ee,[e.createVNode(e.unref(f.default),{ref_key:"masterGridRef",ref:N,columnDefs:I.value,rowData:b.value,"action-buttons":A,onRowClicked:R},null,8,["columnDefs","rowData"])])]),right:e.withCtx(()=>[e.createElementVNode("div",te,[e.createElementVNode("h3",le,e.toDisplayString(n.value?"신규 등록":"상세 정보"),1),e.createElementVNode("div",ae,[e.createVNode(e.unref(m.default),{type:"input",label:"회원사코드",modelValue:r.value.memberId,"onUpdate:modelValue":t[4]||(t[4]=a=>r.value.memberId=a),readonly:!n.value,placeholder:"회원사 코드"},null,8,["modelValue","readonly"]),e.createVNode(e.unref(m.default),{type:"input",label:"회원사명",modelValue:r.value.memberName,"onUpdate:modelValue":t[5]||(t[5]=a=>r.value.memberName=a),placeholder:"회원사 이름"},null,8,["modelValue"])]),e.createVNode(e.unref(m.default),{type:"checkbox",label:"활성여부",modelValue:r.value.isActive,"onUpdate:modelValue":t[6]||(t[6]=a=>r.value.isActive=a),inlineLabel:"활성"},null,8,["modelValue"]),e.createElementVNode("div",re,[e.createVNode(e.unref(i.default),{styletype:"primary",size:"sm",onClick:z},{default:e.withCtx(()=>[...t[14]||(t[14]=[e.createTextVNode("저장",-1)])]),_:1}),n.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(i.default),{key:0,variant:"outline",size:"sm",onClick:U},{default:e.withCtx(()=>[...t[15]||(t[15]=[e.createTextVNode("삭제",-1)])]),_:1}))])])]),_:1})])]),"content-mapping-customer":e.withCtx(()=>[e.createElementVNode("div",oe,[e.createVNode(e.unref(k.default),{collapsed:V.value,"onUpdate:collapsed":t[8]||(t[8]=a=>V.value=a),filterValues:d.value,"onUpdate:filterValues":t[9]||(t[9]=a=>d.value=a),filterDisplay:G,collapsible:!0,title:"회원사별 고객사 매핑"},{actions:e.withCtx(()=>[e.createVNode(e.unref(i.default),{size:"sm",variant:"outline",onClick:P},{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode("초기화",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:K},{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createTextVNode("조회",-1)])]),_:1})]),filters:e.withCtx(()=>[e.createElementVNode("div",ie,[e.createVNode(e.unref(m.default),{type:"input",label:"검색어",modelValue:d.value.keyword,"onUpdate:modelValue":t[7]||(t[7]=a=>d.value.keyword=a)},null,8,["modelValue"])])]),_:1},8,["collapsed","filterValues"]),e.createVNode(e.unref(_.default),{direction:"vertical","default-size":30,"min-size":20,"second-min-size":40,class:"flex-1"},{top:e.withCtx(()=>[e.createElementVNode("div",se,[e.createVNode(e.unref(f.default),{ref_key:"mappingMasterGridRef",ref:g,columnDefs:S.value,rowData:b.value,onRowClicked:j},null,8,["columnDefs","rowData"])])]),bottom:e.withCtx(()=>[e.createElementVNode("div",ue,[e.createElementVNode("div",ne,[t[18]||(t[18]=e.createElementVNode("h4",{class:"text-sm font-semibold mb-2 px-2"},"미매핑 고객사",-1)),e.createElementVNode("div",de,[e.createVNode(e.unref(f.default),{ref_key:"unmappedGridRef",ref:x,columnDefs:y.value,rowData:J.value,checkbox:""},null,8,["columnDefs","rowData"])])]),e.createElementVNode("div",me,[e.createVNode(e.unref(i.default),{styletype:"primary",size:"sm",onClick:H},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode("매핑 ▶",-1)])]),_:1}),e.createVNode(e.unref(i.default),{variant:"outline",size:"sm",onClick:O},{default:e.withCtx(()=>[...t[20]||(t[20]=[e.createTextVNode("◀ 해제",-1)])]),_:1})]),e.createElementVNode("div",ce,[t[21]||(t[21]=e.createElementVNode("h4",{class:"text-sm font-semibold mb-2 px-2"},"매핑된 고객사",-1)),e.createElementVNode("div",fe,[e.createVNode(e.unref(f.default),{ref_key:"mappedGridRef",ref:C,columnDefs:y.value,rowData:$.value,checkbox:""},null,8,["columnDefs","rowData"])])])])]),_:1})])]),_:1},8,["activeTabId"])]))}});exports.default=pe;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),m=require("../molecules/JFormField.vue.cjs");;/* empty css */require("../shadcn/index.cjs");require("@vueuse/core");require("reka-ui");require("clsx");require("tailwind-merge");require("lucide-vue-next");const K=require("../molecules/JTabs.vue.cjs");;/* empty css */;/* empty css */const L=require("../molecules/JCard.vue.cjs"),i=require("../atoms/JButton.vue.cjs");require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");;/* empty css */require("../shadcn/avatar-variants.cjs");require("dompurify");;/* empty css */const f=require("../atoms/JGrid.vue.cjs"),y=require("../atoms/JSplitter.vue.cjs");require("vue-sonner");const X=require("../molecules/JTitlebar.vue.cjs");;/* empty css */;/* empty css */const k=require("../organisms/JFilterBar.vue.cjs");require("vue-router");;/* empty css */;/* empty css */const Z={class:"flex flex-col h-full gap-2 bg-background text-foreground"},Q={class:"flex flex-col h-full gap-2 p-2"},ee={class:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2"},te={class:"h-full overflow-auto bg-background"},le={class:"h-full overflow-y-auto border-l bg-muted/30"},ae={class:"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2"},re={class:"grid grid-cols-1 md:grid-cols-2 gap-2 mt-2"},oe={class:"flex justify-end gap-2"},ie={class:"flex flex-col h-full gap-2 p-2"},ue={class:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-2"},ne={class:"h-full overflow-auto bg-background"},se={class:"h-full flex gap-2 overflow-hidden items-stretch p-2 bg-background"},de={class:"flex-1 flex flex-col overflow-hidden"},me={class:"flex-1 overflow-auto bg-background"},ce={class:"flex flex-col justify-center gap-2 px-2"},fe={class:"flex-1 flex flex-col overflow-hidden"},pe={class:"flex-1 overflow-auto bg-background"},ve=e.defineComponent({__name:"ExampleTabMappingPage",setup(be,{expose:h}){const p=e.ref("master"),q=[{id:"master",label:"회원사 기본정보"},{id:"mapping-customer",label:"고객사 매핑"}];function D(l){console.log("탭 변경:",l)}const M=[{value:"Y",label:"Y:활성"},{value:"N",label:"N:비활성"}],v=e.ref(!1),u=e.ref({isActive:"",keyword:""}),E={isActive:{label:"활성여부",displayValue:l=>l==="Y"?"Y:활성":l==="N"?"N:비활성":""},keyword:{label:"검색어"}},b=e.ref([{memberId:"M001",memberName:"제이솔루션",isActive:"Y"},{memberId:"M002",memberName:"ABC물류",isActive:"Y"},{memberId:"M003",memberName:"XYZ유통",isActive:"N"}]),I=e.ref([{field:"memberId",headerName:"회원사코드",width:150,enableValue:!0},{field:"memberName",headerName:"회원사명",flex:1,enableValue:!0},{field:"isActive",headerName:"활성",width:100,cellRenderer:l=>l.value==="Y"?"✓":"",enableRowGroup:!0,enablePivot:!0}]),R=[{icon:"pencil",label:"수정",tooltip:"편집",onClick:l=>{s.value=!1,r.value={memberId:l.memberId,memberName:l.memberName,isActive:l.isActive}}},{icon:"trash2",label:"삭제",tooltip:"삭제",styletype:"danger",onClick:l=>{confirm(`${l.memberName}을(를) 삭제하시겠습니까?`)&&(console.log("회원사 삭제:",l.memberId),alert(`삭제되었습니다: ${l.memberName}`))}}],N=e.ref(),s=e.ref(!1),r=e.ref({memberId:"",memberName:"",isActive:"Y"});function A(l){s.value=!1,r.value={memberId:l.data.memberId,memberName:l.data.memberName,isActive:l.data.isActive}}function T(){s.value=!0,r.value={memberId:"",memberName:"",isActive:"Y"}}function z(){console.log("회원사 저장:",r.value),alert(`저장되었습니다: ${r.value.memberName}`)}function G(){confirm(`${r.value.memberName}을(를) 삭제하시겠습니까?`)&&(console.log("회원사 삭제:",r.value.memberId),alert(`삭제되었습니다: ${r.value.memberName}`))}function U(){u.value={isActive:"",keyword:""}}function F(){console.log("회원사 조회:",u.value)}function S(){alert("회원사 관리 페이지 도움말")}const g=e.ref(!1),d=e.ref({keyword:""}),Y={keyword:{label:"검색어"}},V=e.ref(),x=e.ref(),w=e.ref(),B=e.ref([{field:"memberId",headerName:"회원사코드",width:150},{field:"memberName",headerName:"회원사명",flex:1}]),o=e.ref(""),n=e.ref({M001:["C001","C002"],M002:["C003"],M003:[]}),C=[{code:"C001",name:"고객A"},{code:"C002",name:"고객B"},{code:"C003",name:"고객C"},{code:"C004",name:"고객D"},{code:"C005",name:"고객E"}],_=e.ref([{field:"code",headerName:"코드",width:120},{field:"name",headerName:"이름",flex:1}]),J=e.computed(()=>{if(!o.value)return[];const l=n.value[o.value]||[];return C.filter(t=>!l.includes(t.code))}),P=e.computed(()=>{if(!o.value)return[];const l=n.value[o.value]||[];return C.filter(t=>l.includes(t.code))});function $(l){o.value=l.data.memberId,console.log("선택된 회원사:",l.data.memberName)}function j(){if(!o.value){alert("회원사를 먼저 선택해주세요.");return}const l=x.value?.getSelectedRows()||[];if(l.length===0){alert("매핑할 고객사를 선택해주세요.");return}const t=l.map(c=>c.code),a=o.value;n.value[a]||(n.value[a]=[]),n.value[a].push(...t),console.log("매핑:",t)}function H(){if(!o.value){alert("회원사를 먼저 선택해주세요.");return}const l=w.value?.getSelectedRows()||[];if(l.length===0){alert("해제할 고객사를 선택해주세요.");return}const t=l.map(c=>c.code),a=o.value;n.value[a]=(n.value[a]||[]).filter(c=>!t.includes(c)),console.log("해제:",t)}function O(){d.value={keyword:""}}function W(){console.log("매핑 조회:",d.value)}return h({masterGridRef:N,mappingMasterGridRef:V}),(l,t)=>(e.openBlock(),e.createElementBlock("div",Z,[e.createVNode(e.unref(X.default),{icon:"users",title:"회원사 관리",description:"회원사 정보 및 고객사 매핑을 관리합니다",showHelp:!0,onHelp:S}),e.createVNode(e.unref(K.default),{activeTabId:p.value,"onUpdate:activeTabId":t[10]||(t[10]=a=>p.value=a),tabs:q,onTabChange:D},{"content-master":e.withCtx(()=>[e.createElementVNode("div",Q,[e.createVNode(e.unref(k.default),{collapsed:v.value,"onUpdate:collapsed":t[2]||(t[2]=a=>v.value=a),filterValues:u.value,"onUpdate:filterValues":t[3]||(t[3]=a=>u.value=a),filterDisplay:E,collapsible:!0,title:"회원사 목록"},{actions:e.withCtx(()=>[e.createVNode(e.unref(i.default),{size:"sm",variant:"outline",onClick:U},{default:e.withCtx(()=>[...t[11]||(t[11]=[e.createTextVNode("초기화",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:F},{default:e.withCtx(()=>[...t[12]||(t[12]=[e.createTextVNode("조회",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:T},{default:e.withCtx(()=>[...t[13]||(t[13]=[e.createTextVNode("신규",-1)])]),_:1})]),filters:e.withCtx(()=>[e.createElementVNode("div",ee,[e.createVNode(e.unref(m.default),{type:"combo",label:"활성여부",modelValue:u.value.isActive,"onUpdate:modelValue":t[0]||(t[0]=a=>u.value.isActive=a),options:M,orientation:"horizontal",labelWidth:"30%"},null,8,["modelValue"]),e.createVNode(e.unref(m.default),{type:"input",label:"검색어",modelValue:u.value.keyword,"onUpdate:modelValue":t[1]||(t[1]=a=>u.value.keyword=a),orientation:"horizontal",labelWidth:"30%"},null,8,["modelValue"])])]),_:1},8,["collapsed","filterValues"]),e.createVNode(e.unref(y.default),{direction:"horizontal","default-size":60,"min-size":30,"second-min-size":20,"second-max-size":60,gap:2,class:"flex-1"},{left:e.withCtx(()=>[e.createElementVNode("div",te,[e.createVNode(e.unref(f.default),{ref_key:"masterGridRef",ref:N,columnDefs:I.value,rowData:b.value,"action-buttons":R,enableGrouping:!0,enablePivot:!0,enableColumnsToolPanel:!0,rowGroupPanelShow:"always",pivotPanelShow:"always",groupDefaultExpanded:1,compactFooter:!0,onRowClicked:A},null,8,["columnDefs","rowData"])])]),right:e.withCtx(()=>[e.createElementVNode("div",le,[e.createVNode(e.unref(L.default),{class:"h-full",title:s.value?"신규 등록":"상세 정보"},{footer:e.withCtx(()=>[e.createElementVNode("div",oe,[e.createVNode(e.unref(i.default),{styletype:"primary",size:"sm",onClick:z},{default:e.withCtx(()=>[...t[14]||(t[14]=[e.createTextVNode("저장",-1)])]),_:1}),s.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(i.default),{key:0,variant:"outline",size:"sm",onClick:G},{default:e.withCtx(()=>[...t[15]||(t[15]=[e.createTextVNode("삭제",-1)])]),_:1}))])]),default:e.withCtx(()=>[e.createElementVNode("div",ae,[e.createVNode(e.unref(m.default),{type:"input",label:"회원사코드",modelValue:r.value.memberId,"onUpdate:modelValue":t[4]||(t[4]=a=>r.value.memberId=a),readonly:!s.value,placeholder:"회원사 코드"},null,8,["modelValue","readonly"]),e.createVNode(e.unref(m.default),{type:"input",label:"회원사명",modelValue:r.value.memberName,"onUpdate:modelValue":t[5]||(t[5]=a=>r.value.memberName=a),placeholder:"회원사 이름"},null,8,["modelValue"])]),e.createElementVNode("div",re,[e.createVNode(e.unref(m.default),{type:"checkbox",label:"활성여부",modelValue:r.value.isActive,"onUpdate:modelValue":t[6]||(t[6]=a=>r.value.isActive=a),inlineLabel:"활성"},null,8,["modelValue"])])]),_:1},8,["title"])])]),_:1})])]),"content-mapping-customer":e.withCtx(()=>[e.createElementVNode("div",ie,[e.createVNode(e.unref(k.default),{collapsed:g.value,"onUpdate:collapsed":t[8]||(t[8]=a=>g.value=a),filterValues:d.value,"onUpdate:filterValues":t[9]||(t[9]=a=>d.value=a),filterDisplay:Y,collapsible:!0,title:"회원사별 고객사 매핑"},{actions:e.withCtx(()=>[e.createVNode(e.unref(i.default),{size:"sm",variant:"outline",onClick:O},{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode("초기화",-1)])]),_:1}),e.createVNode(e.unref(i.default),{size:"sm",styletype:"primary",onClick:W},{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createTextVNode("조회",-1)])]),_:1})]),filters:e.withCtx(()=>[e.createElementVNode("div",ue,[e.createVNode(e.unref(m.default),{type:"input",label:"검색어",modelValue:d.value.keyword,"onUpdate:modelValue":t[7]||(t[7]=a=>d.value.keyword=a)},null,8,["modelValue"])])]),_:1},8,["collapsed","filterValues"]),e.createVNode(e.unref(y.default),{direction:"vertical","default-size":30,"min-size":20,"second-min-size":40,gap:2,class:"flex-1"},{top:e.withCtx(()=>[e.createElementVNode("div",ne,[e.createVNode(e.unref(f.default),{ref_key:"mappingMasterGridRef",ref:V,columnDefs:B.value,rowData:b.value,onRowClicked:$},null,8,["columnDefs","rowData"])])]),bottom:e.withCtx(()=>[e.createElementVNode("div",se,[e.createElementVNode("div",de,[t[18]||(t[18]=e.createElementVNode("h4",{class:"text-sm font-semibold mb-2 px-2"},"미매핑 고객사",-1)),e.createElementVNode("div",me,[e.createVNode(e.unref(f.default),{ref_key:"unmappedGridRef",ref:x,columnDefs:_.value,rowData:J.value,pagination:!1,checkbox:""},null,8,["columnDefs","rowData"])])]),e.createElementVNode("div",ce,[e.createVNode(e.unref(i.default),{styletype:"primary",size:"sm",onClick:j},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode("매핑 ▶",-1)])]),_:1}),e.createVNode(e.unref(i.default),{variant:"outline",size:"sm",onClick:H},{default:e.withCtx(()=>[...t[20]||(t[20]=[e.createTextVNode("◀ 해제",-1)])]),_:1})]),e.createElementVNode("div",fe,[t[21]||(t[21]=e.createElementVNode("h4",{class:"text-sm font-semibold mb-2 px-2"},"매핑된 고객사",-1)),e.createElementVNode("div",pe,[e.createVNode(e.unref(f.default),{ref_key:"mappedGridRef",ref:w,columnDefs:_.value,rowData:P.value,pagination:!1,checkbox:""},null,8,["columnDefs","rowData"])])])])]),_:1})])]),_:1},8,["activeTabId"])]))}});exports.default=ve;
2
2
  //# sourceMappingURL=ExampleTabMappingPage.vue.cjs.map