yh-report 2.3.22 → 2.3.23
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/{StatementDesign-772df9ca.mjs → StatementDesign-992929b6.mjs} +253 -250
- package/{StatementDesign-772df9ca.mjs.map → StatementDesign-992929b6.mjs.map} +1 -1
- package/{StatementDetail-7c5de4c8.mjs → StatementDetail-e0406425.mjs} +2 -2
- package/{StatementDetail-7c5de4c8.mjs.map → StatementDetail-e0406425.mjs.map} +1 -1
- package/{StatementList-45ece2f4.mjs → StatementList-d5eabf08.mjs} +87 -68
- package/StatementList-d5eabf08.mjs.map +1 -0
- package/{index-08507a23.mjs → index-0496fae5.mjs} +788 -788
- package/index-0496fae5.mjs.map +1 -0
- package/index.es.js +1 -1
- package/package.json +1 -1
- package/style.css +1 -1
- package/StatementList-45ece2f4.mjs.map +0 -1
- package/index-08507a23.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent as o, ref as a, onActivated as i, onDeactivated as r, onMounted as m, openBlock as s, createElementBlock as c, createVNode as d } from "vue";
|
|
2
2
|
import { useRoute as l } from "vue-router";
|
|
3
|
-
import { n as u } from "./index-
|
|
3
|
+
import { n as u } from "./index-0496fae5.mjs";
|
|
4
4
|
import "element-plus";
|
|
5
5
|
import "@/libs/api.request.js";
|
|
6
6
|
import "lodash-es";
|
|
@@ -25,4 +25,4 @@ const p = { class: "statement-detail-container" }, y = /* @__PURE__ */ o({
|
|
|
25
25
|
export {
|
|
26
26
|
y as default
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=StatementDetail-
|
|
28
|
+
//# sourceMappingURL=StatementDetail-e0406425.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatementDetail-
|
|
1
|
+
{"version":3,"file":"StatementDetail-e0406425.mjs","sources":["../StatementDetail.vue"],"sourcesContent":["<template>\n <section class=\"statement-detail-container\">\n <report-run :id=\"id\"></report-run>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, onMounted, onActivated, onDeactivated} from 'vue';\nimport {useRoute} from 'vue-router';\nimport reportRun from './component/reportRun.vue';\nconst route = useRoute();\nconst id = ref();\n\nonActivated(() => {\n document.querySelector('.main-container')?.classList.add('statement-design-main');\n});\n\nonDeactivated(() => {\n document.querySelector('.main-container')?.classList.remove('statement-design-main');\n});\n\nonMounted(() => {\n id.value = route.params.id;\n});\n</script>\n"],"names":["route","useRoute","id","ref","onActivated","_a","onDeactivated","onMounted"],"mappings":";;;;;;;;;;AASA,UAAMA,IAAQC,KACRC,IAAKC;AAEX,WAAAC,EAAY,MAAM;;AAChB,OAAAC,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,IAAI;AAAA,IAAuB,CACjF,GAEDC,EAAc,MAAM;;AAClB,OAAAD,IAAA,SAAS,cAAc,iBAAiB,MAAxC,QAAAA,EAA2C,UAAU,OAAO;AAAA,IAAuB,CACpF,GAEDE,EAAU,MAAM;AACX,MAAAL,EAAA,QAAQF,EAAM,OAAO;AAAA,IAAA,CACzB;;;;;"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { defineComponent as H, reactive as z, ref as E, onMounted as J, watch as j, openBlock as I, createElementBlock as G, createElementVNode as f, createTextVNode as c, createVNode as n, unref as l, withCtx as a, withKeys as Q } from "vue";
|
|
2
2
|
import { useRouter as W } from "vue-router";
|
|
3
|
-
import { g as X, s as D, d as Z, a as ee } from "./index-
|
|
4
|
-
import { ElButton as
|
|
3
|
+
import { g as X, s as D, d as Z, a as ee } from "./index-0496fae5.mjs";
|
|
4
|
+
import { ElButton as u, ElFormItem as w, ElInput as C, ElTable as te, ElTableColumn as k, ElPagination as oe, ElDialog as ne, ElForm as le, ElMessage as v, ElLoading as ae, ElMessageBox as L } from "element-plus";
|
|
5
5
|
import { l as ie, u as re } from "./editorLock-afc375cb.mjs";
|
|
6
6
|
import "@/libs/api.request.js";
|
|
7
7
|
import "lodash-es";
|
|
8
8
|
import "echarts";
|
|
9
|
-
function se(
|
|
9
|
+
function se(_) {
|
|
10
10
|
if (navigator.clipboard && window.isSecureContext)
|
|
11
|
-
return navigator.clipboard.writeText(
|
|
11
|
+
return navigator.clipboard.writeText(_), Promise.resolve();
|
|
12
12
|
{
|
|
13
|
-
let
|
|
14
|
-
|
|
13
|
+
let m = document.createElement("textarea");
|
|
14
|
+
m.value = _, m.style.position = "absolute", m.style.opacity = "0", m.style.left = "-200%", m.style.top = "-200%", document.body.appendChild(m), m.focus(), m.select();
|
|
15
15
|
let i = document.execCommand("copy");
|
|
16
|
-
return
|
|
16
|
+
return m.remove(), i ? Promise.resolve() : Promise.reject(new Error("copy error"));
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue = { class: "el-button is-text import-excel-button" },
|
|
19
|
+
const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue = { class: "el-button is-text import-excel-button" }, me = { class: "form-context" }, pe = /* @__PURE__ */ f("i", { class: "iconfont icon-antdesign" }, null, -1), fe = /* @__PURE__ */ f("i", { class: "iconfont icon-view" }, null, -1), ge = /* @__PURE__ */ f("i", { class: "iconfont icon-edit-outline" }, null, -1), ye = /* @__PURE__ */ f("i", { class: "iconfont icon-delete" }, null, -1), ke = { class: "dialog-footer" }, Ve = /* @__PURE__ */ H({
|
|
20
20
|
__name: "StatementList",
|
|
21
|
-
setup(
|
|
22
|
-
const
|
|
21
|
+
setup(_) {
|
|
22
|
+
const m = W(), i = z({
|
|
23
23
|
key: "",
|
|
24
24
|
pageSize: 10,
|
|
25
25
|
pageNumber: 1,
|
|
@@ -34,16 +34,25 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
34
34
|
});
|
|
35
35
|
S.value = t.data.list, i.total = t.data.total;
|
|
36
36
|
}
|
|
37
|
-
function
|
|
37
|
+
function x(o, t) {
|
|
38
38
|
let e = "", s = "链接";
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
switch (t) {
|
|
40
|
+
case "admin":
|
|
41
|
+
e = `/admin/statement/detail/${o.id}`, s = "后台链接";
|
|
42
|
+
break;
|
|
43
|
+
case "inner":
|
|
44
|
+
e = `innerStatementdetail/${o.id}`, s = "菜单链接";
|
|
45
|
+
case "outside":
|
|
46
|
+
e = `${window.location.origin}${window.location.pathname}#/statementdetail/${o.id}`, s = "外部链接";
|
|
47
|
+
}
|
|
48
|
+
se(e).then(() => {
|
|
49
|
+
v.success(s + "复制成功");
|
|
41
50
|
}).catch(() => {
|
|
42
|
-
|
|
51
|
+
v.error(s + "复制遇到问题");
|
|
43
52
|
});
|
|
44
53
|
}
|
|
45
|
-
const
|
|
46
|
-
|
|
54
|
+
const h = E([]), T = (o) => {
|
|
55
|
+
h.value = o;
|
|
47
56
|
}, B = async (o) => {
|
|
48
57
|
const t = o.target.files[0];
|
|
49
58
|
if (!t)
|
|
@@ -53,29 +62,29 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
53
62
|
o.target.value = "";
|
|
54
63
|
try {
|
|
55
64
|
if (s.target) {
|
|
56
|
-
const
|
|
57
|
-
if (Array.isArray(
|
|
65
|
+
const p = JSON.parse(s.target.result);
|
|
66
|
+
if (Array.isArray(p) && p.every((d) => typeof d == "object" && "code" in d && "config" in d && "description" in d && "name" in d)) {
|
|
58
67
|
const d = ae.service({
|
|
59
68
|
fullscreen: !0,
|
|
60
|
-
text: `正在导入报表,共 ${
|
|
69
|
+
text: `正在导入报表,共 ${p.length} 个,请稍候...`
|
|
61
70
|
});
|
|
62
|
-
for (let y = 0; y <
|
|
63
|
-
d.setText(`正在保存第 ${y + 1} 个,共 ${
|
|
64
|
-
const V =
|
|
71
|
+
for (let y = 0; y < p.length; y++) {
|
|
72
|
+
d.setText(`正在保存第 ${y + 1} 个,共 ${p.length} 个,请稍候...`);
|
|
73
|
+
const V = p[y];
|
|
65
74
|
await D(V);
|
|
66
75
|
}
|
|
67
76
|
d.close(), g(!0);
|
|
68
77
|
} else
|
|
69
|
-
|
|
78
|
+
v.error("格式错误,请确保导入的文件未被修改过!");
|
|
70
79
|
}
|
|
71
80
|
} catch {
|
|
72
|
-
|
|
81
|
+
v.error("文件解析失败,请检查文件是否为有效的 JSON 格式!");
|
|
73
82
|
}
|
|
74
83
|
}, e.readAsText(t);
|
|
75
84
|
}, R = () => {
|
|
76
|
-
if (
|
|
85
|
+
if (h.value.length > 0) {
|
|
77
86
|
const o = JSON.stringify(
|
|
78
|
-
|
|
87
|
+
h.value.map(({ code: y, config: V, description: Y, name: q }) => ({
|
|
79
88
|
code: y,
|
|
80
89
|
config: V,
|
|
81
90
|
description: Y,
|
|
@@ -83,17 +92,17 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
83
92
|
})),
|
|
84
93
|
null,
|
|
85
94
|
2
|
|
86
|
-
), t = new Blob([o], { type: "application/json" }), e = URL.createObjectURL(t),
|
|
87
|
-
d.href = e, d.download =
|
|
95
|
+
), t = new Blob([o], { type: "application/json" }), e = URL.createObjectURL(t), p = `报表导出-${Z().format("YYYYMMDDHHmm")}.json`, d = document.createElement("a");
|
|
96
|
+
d.href = e, d.download = p, document.body.appendChild(d), d.click(), document.body.removeChild(d), URL.revokeObjectURL(e);
|
|
88
97
|
} else
|
|
89
|
-
|
|
98
|
+
v.warning("请选择要操作的报表!");
|
|
90
99
|
}, N = async (o) => {
|
|
91
|
-
await ie(o.id) === "OK" ?
|
|
100
|
+
await ie(o.id) === "OK" ? m.push(`/admin/statement/design/${o.id}`) : await L.alert("报表正在被其他用户锁定,是否强制解锁?", "提示", {
|
|
92
101
|
confirmButtonText: "解锁",
|
|
93
102
|
cancelButtonText: "取消"
|
|
94
|
-
}) === "confirm" && (await re(o.id) ? N(o) :
|
|
103
|
+
}) === "confirm" && (await re(o.id) ? N(o) : v.error("解锁失败,请稍后再试!"));
|
|
95
104
|
}, F = (o) => {
|
|
96
|
-
|
|
105
|
+
m.push(`/admin/statement/detail/${o.id}`);
|
|
97
106
|
};
|
|
98
107
|
J(() => {
|
|
99
108
|
g(!0);
|
|
@@ -115,10 +124,10 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
115
124
|
}).then(async () => {
|
|
116
125
|
(await ee(o.id)).data && g(!0);
|
|
117
126
|
});
|
|
118
|
-
},
|
|
127
|
+
}, $ = () => {
|
|
119
128
|
b.value = !1, r.id = void 0, r.name = "", r.code = "", r.description = "";
|
|
120
129
|
}, M = async () => {
|
|
121
|
-
await D(r), g(!0),
|
|
130
|
+
await D(r), g(!0), $();
|
|
122
131
|
}, U = (o) => {
|
|
123
132
|
o && (o.preventDefault(), o.stopPropagation()), g(!1);
|
|
124
133
|
}, K = () => {
|
|
@@ -144,7 +153,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
144
153
|
}, null, 32),
|
|
145
154
|
c(" 导入 ")
|
|
146
155
|
]),
|
|
147
|
-
n(l(
|
|
156
|
+
n(l(u), {
|
|
148
157
|
text: "",
|
|
149
158
|
onClick: R
|
|
150
159
|
}, {
|
|
@@ -153,7 +162,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
153
162
|
]),
|
|
154
163
|
_: 1
|
|
155
164
|
}),
|
|
156
|
-
n(l(
|
|
165
|
+
n(l(u), {
|
|
157
166
|
type: "primary",
|
|
158
167
|
onClick: O
|
|
159
168
|
}, {
|
|
@@ -162,10 +171,10 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
162
171
|
]),
|
|
163
172
|
_: 1
|
|
164
173
|
}),
|
|
165
|
-
f("div",
|
|
174
|
+
f("div", me, [
|
|
166
175
|
n(l(w), { label: "报表名称" }, {
|
|
167
176
|
default: a(() => [
|
|
168
|
-
n(l(
|
|
177
|
+
n(l(C), {
|
|
169
178
|
modelValue: i.key,
|
|
170
179
|
"onUpdate:modelValue": t[1] || (t[1] = (e) => i.key = e),
|
|
171
180
|
onKeyup: Q(U, ["enter"]),
|
|
@@ -175,7 +184,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
175
184
|
_: 1
|
|
176
185
|
})
|
|
177
186
|
]),
|
|
178
|
-
n(l(
|
|
187
|
+
n(l(u), {
|
|
179
188
|
type: "primary",
|
|
180
189
|
onClick: t[2] || (t[2] = (e) => U())
|
|
181
190
|
}, {
|
|
@@ -184,7 +193,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
184
193
|
]),
|
|
185
194
|
_: 1
|
|
186
195
|
}),
|
|
187
|
-
n(l(
|
|
196
|
+
n(l(u), {
|
|
188
197
|
onClick: t[3] || (t[3] = (e) => K())
|
|
189
198
|
}, {
|
|
190
199
|
default: a(() => [
|
|
@@ -199,69 +208,79 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
199
208
|
onSelectionChange: T
|
|
200
209
|
}, {
|
|
201
210
|
default: a(() => [
|
|
202
|
-
n(l(
|
|
211
|
+
n(l(k), {
|
|
203
212
|
type: "selection",
|
|
204
213
|
width: "50"
|
|
205
214
|
}),
|
|
206
|
-
n(l(
|
|
215
|
+
n(l(k), {
|
|
207
216
|
label: "#",
|
|
208
217
|
type: "index",
|
|
209
218
|
width: "66",
|
|
210
219
|
left: ""
|
|
211
220
|
}),
|
|
212
|
-
n(l(
|
|
221
|
+
n(l(k), {
|
|
213
222
|
label: "报表代码",
|
|
214
223
|
"min-width": "100",
|
|
215
224
|
prop: "code"
|
|
216
225
|
}),
|
|
217
|
-
n(l(
|
|
226
|
+
n(l(k), {
|
|
218
227
|
label: "报表名称",
|
|
219
228
|
"min-width": "100",
|
|
220
229
|
prop: "name"
|
|
221
230
|
}),
|
|
222
|
-
n(l(
|
|
231
|
+
n(l(k), {
|
|
223
232
|
label: "描述",
|
|
224
233
|
"min-width": "200",
|
|
225
234
|
prop: "description"
|
|
226
235
|
}),
|
|
227
|
-
n(l(
|
|
236
|
+
n(l(k), {
|
|
228
237
|
label: "操作",
|
|
229
|
-
width: "
|
|
238
|
+
width: "440",
|
|
230
239
|
fixed: "right"
|
|
231
240
|
}, {
|
|
232
241
|
default: a((e) => [
|
|
233
|
-
n(l(
|
|
242
|
+
n(l(u), {
|
|
243
|
+
link: "",
|
|
244
|
+
title: "本系统前台菜单地址",
|
|
245
|
+
onClick: (s) => x(e.row, "inner")
|
|
246
|
+
}, {
|
|
247
|
+
default: a(() => [
|
|
248
|
+
c(" 菜单 ")
|
|
249
|
+
]),
|
|
250
|
+
_: 2
|
|
251
|
+
}, 1032, ["onClick"]),
|
|
252
|
+
n(l(u), {
|
|
234
253
|
link: "",
|
|
235
|
-
title: "
|
|
236
|
-
onClick: (s) =>
|
|
254
|
+
title: "后台测试",
|
|
255
|
+
onClick: (s) => x(e.row, "admin")
|
|
237
256
|
}, {
|
|
238
257
|
default: a(() => [
|
|
239
|
-
c("
|
|
258
|
+
c(" 后台 ")
|
|
240
259
|
]),
|
|
241
260
|
_: 2
|
|
242
261
|
}, 1032, ["onClick"]),
|
|
243
|
-
n(l(
|
|
262
|
+
n(l(u), {
|
|
244
263
|
link: "",
|
|
245
264
|
title: "其他系统嵌入地址",
|
|
246
|
-
onClick: (s) =>
|
|
265
|
+
onClick: (s) => x(e.row, "outside")
|
|
247
266
|
}, {
|
|
248
267
|
default: a(() => [
|
|
249
|
-
c("
|
|
268
|
+
c(" 外嵌 ")
|
|
250
269
|
]),
|
|
251
270
|
_: 2
|
|
252
271
|
}, 1032, ["onClick"]),
|
|
253
|
-
n(l(
|
|
272
|
+
n(l(u), {
|
|
254
273
|
type: "primary",
|
|
255
274
|
link: "",
|
|
256
275
|
onClick: (s) => N(e.row)
|
|
257
276
|
}, {
|
|
258
277
|
default: a(() => [
|
|
259
|
-
|
|
278
|
+
pe,
|
|
260
279
|
c(" 设计 ")
|
|
261
280
|
]),
|
|
262
281
|
_: 2
|
|
263
282
|
}, 1032, ["onClick"]),
|
|
264
|
-
n(l(
|
|
283
|
+
n(l(u), {
|
|
265
284
|
type: "primary",
|
|
266
285
|
link: "",
|
|
267
286
|
onClick: (s) => F(e.row)
|
|
@@ -272,7 +291,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
272
291
|
]),
|
|
273
292
|
_: 2
|
|
274
293
|
}, 1032, ["onClick"]),
|
|
275
|
-
n(l(
|
|
294
|
+
n(l(u), {
|
|
276
295
|
type: "primary",
|
|
277
296
|
link: "",
|
|
278
297
|
onClick: (s) => P(e.row)
|
|
@@ -283,7 +302,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
283
302
|
]),
|
|
284
303
|
_: 2
|
|
285
304
|
}, 1032, ["onClick"]),
|
|
286
|
-
n(l(
|
|
305
|
+
n(l(u), {
|
|
287
306
|
type: "danger",
|
|
288
307
|
link: "",
|
|
289
308
|
onClick: (s) => A(e.row)
|
|
@@ -314,18 +333,18 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
314
333
|
n(l(ne), {
|
|
315
334
|
modelValue: b.value,
|
|
316
335
|
"onUpdate:modelValue": t[10] || (t[10] = (e) => b.value = e),
|
|
317
|
-
onClose:
|
|
336
|
+
onClose: $,
|
|
318
337
|
title: r.id ? "编辑报表" : "新建报表"
|
|
319
338
|
}, {
|
|
320
339
|
footer: a(() => [
|
|
321
|
-
f("span",
|
|
322
|
-
n(l(
|
|
340
|
+
f("span", ke, [
|
|
341
|
+
n(l(u), { onClick: $ }, {
|
|
323
342
|
default: a(() => [
|
|
324
343
|
c("取消")
|
|
325
344
|
]),
|
|
326
345
|
_: 1
|
|
327
346
|
}),
|
|
328
|
-
n(l(
|
|
347
|
+
n(l(u), {
|
|
329
348
|
type: "primary",
|
|
330
349
|
onClick: t[9] || (t[9] = (e) => M())
|
|
331
350
|
}, {
|
|
@@ -347,7 +366,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
347
366
|
required: ""
|
|
348
367
|
}, {
|
|
349
368
|
default: a(() => [
|
|
350
|
-
n(l(
|
|
369
|
+
n(l(C), {
|
|
351
370
|
modelValue: r.code,
|
|
352
371
|
"onUpdate:modelValue": t[6] || (t[6] = (e) => r.code = e),
|
|
353
372
|
autocomplete: "off"
|
|
@@ -360,7 +379,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
360
379
|
required: ""
|
|
361
380
|
}, {
|
|
362
381
|
default: a(() => [
|
|
363
|
-
n(l(
|
|
382
|
+
n(l(C), {
|
|
364
383
|
modelValue: r.name,
|
|
365
384
|
"onUpdate:modelValue": t[7] || (t[7] = (e) => r.name = e),
|
|
366
385
|
autocomplete: "off"
|
|
@@ -373,7 +392,7 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
373
392
|
required: ""
|
|
374
393
|
}, {
|
|
375
394
|
default: a(() => [
|
|
376
|
-
n(l(
|
|
395
|
+
n(l(C), {
|
|
377
396
|
modelValue: r.description,
|
|
378
397
|
"onUpdate:modelValue": t[8] || (t[8] = (e) => r.description = e),
|
|
379
398
|
type: "textarea",
|
|
@@ -392,6 +411,6 @@ const de = { class: "statement-list-container" }, ce = { class: "actions" }, ue
|
|
|
392
411
|
}
|
|
393
412
|
});
|
|
394
413
|
export {
|
|
395
|
-
|
|
414
|
+
Ve as default
|
|
396
415
|
};
|
|
397
|
-
//# sourceMappingURL=StatementList-
|
|
416
|
+
//# sourceMappingURL=StatementList-d5eabf08.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatementList-d5eabf08.mjs","sources":["../libs/util.ts","../StatementList.vue"],"sourcesContent":["/**\n * 复制文本\n * @param {string} str 要复制的文本\n * @returns {Promise<void>}\n */\nexport function copyString(str) {\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(str);\n return Promise.resolve();\n } else {\n let textArea = document.createElement('textarea');\n textArea.value = str;\n textArea.style.position = 'absolute';\n textArea.style.opacity = '0';\n textArea.style.left = '-200%';\n textArea.style.top = '-200%';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n let flag = document.execCommand('copy');\n textArea.remove();\n if (flag) {\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('copy error'));\n }\n }\n}\n\nexport function isColorLight(color) {\n let rgb;\n if (color.startsWith('#')) {\n color = color.slice(1).toUpperCase();\n\n if (color.length === 3) {\n color = color\n .split('')\n .map((char) => char + char)\n .join('');\n }\n rgb = color.match(/.{2}/g).map((hex) => parseInt(hex, 16));\n } else if (color.startsWith('rgb(')) {\n const rgbMatch = color.match(/\\d+/g);\n rgb = rgbMatch.map((num) => parseInt(num, 10));\n } else {\n console.error('Invalid color format');\n return false;\n }\n const luminance = (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255;\n return luminance > 0.5;\n}\n\nexport function getEnumOptions<T extends Record<string, any>>(enumObj: T, filters: string[] = []) {\n return Object.keys(enumObj)\n .filter((key) => !filters.includes(enumObj[key as keyof T]))\n .map((key) => ({\n value: enumObj[key as keyof T],\n label: key,\n }));\n}\n","<template>\n <section class=\"statement-list-container\">\n <div class=\"actions\">\n <div class=\"el-button is-text import-excel-button\">\n <input\n class=\"import-excel-input\"\n type=\"file\"\n @change=\"importReport($event)\" />\n 导入\n </div>\n <el-button\n text\n @click=\"exportReport\">\n 导出\n </el-button>\n <el-button\n type=\"primary\"\n @click=\"toAddForm\">\n 新增\n </el-button>\n <div class=\"form-context\">\n <el-form-item label=\"报表名称\">\n <el-input\n v-model=\"listForm.key\"\n @keyup.enter=\"onSearch\"\n placeholder=\"键入关键字搜索报表\"></el-input>\n </el-form-item>\n </div>\n <el-button\n type=\"primary\"\n @click=\"onSearch()\">\n 搜索\n </el-button>\n <el-button @click=\"onReset()\">重置</el-button>\n </div>\n <el-table\n :data=\"data\"\n row-key=\"id\"\n @selection-change=\"selectionChangeHandle\">\n <el-table-column\n type=\"selection\"\n width=\"50\"></el-table-column>\n <el-table-column\n label=\"#\"\n type=\"index\"\n width=\"66\"\n left></el-table-column>\n <el-table-column\n label=\"报表代码\"\n min-width=\"100\"\n prop=\"code\"></el-table-column>\n <el-table-column\n label=\"报表名称\"\n min-width=\"100\"\n prop=\"name\"></el-table-column>\n <el-table-column\n label=\"描述\"\n min-width=\"200\"\n prop=\"description\"></el-table-column>\n <el-table-column\n label=\"操作\"\n width=\"440\"\n fixed=\"right\">\n <template #default=\"scope\">\n <el-button\n link\n title=\"本系统前台菜单地址\"\n @click=\"copyLink(scope.row, 'inner')\">\n 菜单\n </el-button>\n <el-button\n link\n title=\"后台测试\"\n @click=\"copyLink(scope.row, 'admin')\">\n 后台\n </el-button>\n <el-button\n link\n title=\"其他系统嵌入地址\"\n @click=\"copyLink(scope.row, 'outside')\">\n 外嵌\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toDesign(scope.row)\">\n <i class=\"iconfont icon-antdesign\"></i>\n 设计\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toView(scope.row)\">\n <i class=\"iconfont icon-view\"></i>\n 查看\n </el-button>\n <el-button\n type=\"primary\"\n link\n @click=\"toEditor(scope.row)\">\n <i class=\"iconfont icon-edit-outline\"></i>\n 编辑\n </el-button>\n <el-button\n type=\"danger\"\n link\n @click=\"toDelete(scope.row)\">\n <i class=\"iconfont icon-delete\"></i>\n 删除\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n <el-pagination\n background\n style=\"padding-top: 10px; justify-content: flex-end\"\n :page-sizes=\"[10, 20, 50, 100]\"\n v-model:page-size=\"listForm.pageSize\"\n :total=\"listForm.total\"\n v-model:current-page=\"listForm.pageNumber\"\n layout=\"sizes,prev,pager,next,total\"></el-pagination>\n <!-- 新增报表对话框 -->\n <el-dialog\n v-model=\"dialogFormVisible\"\n @close=\"cancelForm\"\n :title=\"form.id ? '编辑报表' : '新建报表'\">\n <el-form\n :model=\"form\"\n label-width=\"120\">\n <el-form-item\n label=\"报表代码\"\n required>\n <el-input\n v-model=\"form.code\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n label=\"报表名称\"\n required>\n <el-input\n v-model=\"form.name\"\n autocomplete=\"off\" />\n </el-form-item>\n <el-form-item\n label=\"描述\"\n required>\n <el-input\n v-model=\"form.description\"\n type=\"textarea\"\n autocomplete=\"off\" />\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"cancelForm\">取消</el-button>\n <el-button\n type=\"primary\"\n @click=\"saveForm()\">\n 保存\n </el-button>\n </span>\n </template>\n </el-dialog>\n </section>\n</template>\n<script setup lang=\"ts\">\nimport {ref, reactive, computed, watch, onMounted} from 'vue';\nimport {useRouter} from 'vue-router';\nimport {Statement} from './types';\nimport {getList, save, del} from './api/form';\nimport {ElMessageBox, ElMessage, ElButton, ElForm, ElFormItem, ElInput, ElTable, ElTableColumn, ElPagination, ElDialog, ElLoading} from 'element-plus';\nimport {copyString} from './libs/util';\nimport dayjs from 'dayjs';\nimport {lockEditor, unlockEditor} from 'yh-report/libs/editorLock';\n\nconst router = useRouter();\n\n// @ts-ignore\nconst listForm = reactive({\n key: '',\n pageSize: 10,\n pageNumber: 1,\n total: 0,\n});\nconst data = ref<Statement[]>([]);\n\n//获取报表列表\nasync function getStatementList(flag = false) {\n if (flag) {\n listForm.pageNumber = 1;\n listForm.total = 0;\n }\n const res = await getList({\n key: listForm.key,\n pageSize: listForm.pageSize,\n pageNumber: listForm.pageNumber,\n });\n data.value = res.data.list;\n listForm.total = res.data.total;\n}\n\nfunction copyLink(row, type) {\n let href = '';\n let hrefName = '链接';\n switch (type) {\n case 'admin':\n href = `/admin/statement/detail/${row.id}`;\n hrefName = '后台链接';\n break;\n case 'inner':\n href = `innerStatementdetail/${row.id}`;\n hrefName = '菜单链接';\n case 'outside':\n href = `${window.location.origin}${window.location.pathname}#/statementdetail/${row.id}`;\n hrefName = '外部链接';\n }\n copyString(href)\n .then(() => {\n ElMessage.success(hrefName + '复制成功');\n })\n .catch(() => {\n ElMessage.error(hrefName + '复制遇到问题');\n });\n}\n\nconst tableSelections = ref([]);\nconst selectionChangeHandle = (selections) => {\n tableSelections.value = selections;\n};\n\nconst importReport = async (e) => {\n const file = e.target.files[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n e.target.value = '';\n try {\n if (event.target) {\n const jsonData = JSON.parse(event.target.result as string);\n if (Array.isArray(jsonData) && jsonData.every((item) => typeof item === 'object' && 'code' in item && 'config' in item && 'description' in item && 'name' in item)) {\n const loading = ElLoading.service({\n fullscreen: true,\n text: `正在导入报表,共 ${jsonData.length} 个,请稍候...`,\n });\n for (let i = 0; i < jsonData.length; i++) {\n loading.setText(`正在保存第 ${i + 1} 个,共 ${jsonData.length} 个,请稍候...`);\n const item = jsonData[i];\n await save(item);\n }\n loading.close();\n getStatementList(true);\n } else {\n ElMessage.error('格式错误,请确保导入的文件未被修改过!');\n }\n }\n } catch (error) {\n ElMessage.error('文件解析失败,请检查文件是否为有效的 JSON 格式!');\n }\n };\n reader.readAsText(file);\n};\n\nconst exportReport = () => {\n if (tableSelections.value.length > 0) {\n const jsonData = JSON.stringify(\n tableSelections.value.map(({code, config, description, name}) => {\n return {\n code,\n config,\n description,\n name,\n };\n }),\n null,\n 2\n );\n const blob = new Blob([jsonData], {type: 'application/json'});\n\n const url = URL.createObjectURL(blob);\n\n const formattedDate = dayjs().format('YYYYMMDDHHmm');\n const fileName = `报表导出-${formattedDate}.json`;\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n URL.revokeObjectURL(url);\n } else {\n ElMessage.warning('请选择要操作的报表!');\n }\n};\n\nconst toDesign = async (row) => {\n let res = await lockEditor(row.id);\n if (res === 'OK') {\n router.push(`/admin/statement/design/${row.id}`);\n } else {\n const toUnlock = await ElMessageBox.alert('报表正在被其他用户锁定,是否强制解锁?', '提示', {\n confirmButtonText: '解锁',\n cancelButtonText: '取消',\n });\n if (toUnlock === 'confirm') {\n let flag = await unlockEditor(row.id);\n if (flag) {\n toDesign(row);\n } else {\n ElMessage.error('解锁失败,请稍后再试!');\n }\n }\n }\n};\n\nconst toView = (row) => {\n router.push(`/admin/statement/detail/${row.id}`);\n};\n\nonMounted(() => {\n getStatementList(true);\n});\n\n//新增报表\nconst dialogFormVisible = ref(false);\n\nconst form = reactive({\n id: undefined,\n name: '',\n code: '',\n description: '',\n});\n\nconst toAddForm = () => {\n dialogFormVisible.value = true;\n};\n\nconst toEditor = (row) => {\n dialogFormVisible.value = true;\n form.id = row.id;\n form.name = row.name;\n form.code = row.code;\n form.description = row.description;\n};\n\nconst toDelete = (row) => {\n ElMessageBox.confirm('当前操作会删除选定的报表,确认继续吗?', '警告', {\n confirmButtonText: '删除',\n cancelButtonText: '取消',\n type: 'warning',\n }).then(async () => {\n let res = await del(row.id);\n if (res.data) {\n getStatementList(true);\n }\n });\n};\n\nconst cancelForm = () => {\n dialogFormVisible.value = false;\n form.id = undefined;\n form.name = '';\n form.code = '';\n form.description = '';\n};\nconst saveForm = async () => {\n await save(form);\n getStatementList(true);\n cancelForm();\n};\n\n//搜索报表\nconst onSearch = (e?) => {\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n getStatementList(false);\n};\n\n//重置\nconst onReset = () => {\n listForm.key = '';\n getStatementList(true);\n};\n\n//分页功能\nwatch(\n () => listForm.pageNumber,\n () => {\n getStatementList();\n }\n);\nwatch(\n () => listForm.pageSize,\n () => {\n getStatementList();\n }\n);\n</script>\n\n<style lang=\"scss\">\n.statement-list-container {\n width: 100%;\n height: 100%;\n padding: 10px 0 0;\n box-sizing: border-box;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n .actions {\n display: flex;\n align-items: center;\n\n .form-context {\n flex: 1;\n margin: 0 10px;\n display: flex;\n }\n\n .el-form-item {\n margin-bottom: 0;\n margin-right: 10px;\n }\n }\n\n .el-table {\n flex: 1;\n }\n\n .el-dialog {\n .el-button--text {\n margin-right: 15px;\n }\n\n .el-form-item {\n width: 100%;\n }\n\n .el-select {\n width: 100%;\n }\n\n .el-input {\n width: 100%;\n }\n\n .dialog-footer button:first-child {\n margin-right: 10px;\n }\n }\n .import-excel-button {\n position: relative;\n .import-excel-input {\n position: absolute;\n left: 0;\n top: 0;\n opacity: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n }\n }\n}\n</style>\n"],"names":["copyString","str","textArea","flag","router","useRouter","listForm","reactive","data","ref","getStatementList","res","getList","copyLink","row","type","href","hrefName","ElMessage","tableSelections","selectionChangeHandle","selections","importReport","e","file","reader","event","jsonData","item","loading","ElLoading","i","save","exportReport","code","config","description","name","blob","url","fileName","dayjs","a","toDesign","lockEditor","ElMessageBox","unlockEditor","toView","onMounted","dialogFormVisible","form","toAddForm","toEditor","toDelete","del","cancelForm","saveForm","onSearch","onReset","watch"],"mappings":"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"}
|