xyvcard-itsm-flow 0.0.19 → 0.0.21

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 (90) hide show
  1. package/dist/{FileSaver.min-5d27MsC6.mjs → FileSaver.min-X2_RihtX.mjs} +29 -28
  2. package/dist/_commonjsHelpers-BVfed4GL.mjs +28 -0
  3. package/dist/_plugin-vue_export-helper-CHgC5LLL.mjs +9 -0
  4. package/dist/{edit-DIh0NEYf.mjs → edit-AAIDp3Ys.mjs} +1 -1
  5. package/dist/edit-BC3HBHna.mjs +378 -0
  6. package/dist/{edit-DdzFTqhg.mjs → edit-CWx9fJF7.mjs} +1 -1
  7. package/dist/edit-CuL-MqiW.mjs +794 -0
  8. package/dist/{edit-Vw2XQ1u6.mjs → edit-XWSh98dW.mjs} +1 -1
  9. package/dist/edit-zRQs9w8y.mjs +492 -0
  10. package/dist/{edit.vue_vue_type_script_setup_true_lang-BjhcvEHi.mjs → edit.vue_vue_type_script_setup_true_lang-BCVm7-Ex.mjs} +2 -2
  11. package/dist/{edit.vue_vue_type_script_setup_true_lang-m73-ejk7.mjs → edit.vue_vue_type_script_setup_true_lang-BHgx58mh.mjs} +2 -2
  12. package/dist/{edit.vue_vue_type_script_setup_true_lang-prup6BHU.mjs → edit.vue_vue_type_script_setup_true_lang-Rs79eFoT.mjs} +2 -2
  13. package/dist/{el-message-DawVzOVQ.mjs → el-message-BJAl6Gwu.mjs} +1 -1
  14. package/dist/{index-g0KiWDPW.mjs → index--gw38QeR.mjs} +3 -3
  15. package/dist/index-3BgV8fss.mjs +396 -0
  16. package/dist/index-BDh2WCIf.mjs +316 -0
  17. package/dist/{index-CxyHtsq2.mjs → index-BFtKB0qe.mjs} +2 -2
  18. package/dist/{index-DaSMRndr.mjs → index-BLHnAUcn.mjs} +2 -2
  19. package/dist/index-BSRU0wyQ.mjs +479 -0
  20. package/dist/{index-DeerMT0Q.mjs → index-BYbmB9DD.mjs} +31 -29
  21. package/dist/{index-BI1uXq1f.mjs → index-Bom-5z91.mjs} +4 -4
  22. package/dist/index-BtiMpwj2.mjs +457 -0
  23. package/dist/{index-tnTugnqa.mjs → index-C-HQUPPS.mjs} +3 -3
  24. package/dist/{index-DB-P0VX0.mjs → index-C5pj6umx.mjs} +23 -22
  25. package/dist/{index-C7_kMdm5.mjs → index-CDKSx5IH.mjs} +2 -2
  26. package/dist/{index-Dooa5UH_.mjs → index-CLZfBnlo.mjs} +4 -4
  27. package/dist/index-COvZrTZl.mjs +278 -0
  28. package/dist/index-CXAtR6Vv.mjs +366 -0
  29. package/dist/index-CYJvDaI_.mjs +1371 -0
  30. package/dist/{index-PafaMNgK.mjs → index-CvX2It1o.mjs} +64 -30
  31. package/dist/index-D2AIn13F.mjs +339 -0
  32. package/dist/{index-Cgbv4Ijf.mjs → index-D7TvdZ0W.mjs} +180 -160
  33. package/dist/{index-7_pEehBt.mjs → index-DBRvKb1w.mjs} +2 -2
  34. package/dist/{index-CITy8Hqm.mjs → index-DFj2i4Kf.mjs} +4 -4
  35. package/dist/index-DNsy9Enp.mjs +272 -0
  36. package/dist/index-DQOGU1Vs.mjs +402 -0
  37. package/dist/index-D_PiZ_6x.mjs +749 -0
  38. package/dist/index-DesY4um_.mjs +330 -0
  39. package/dist/{index-Cqw8Rz4q.mjs → index-DkPqpjkA.mjs} +26 -24
  40. package/dist/index-Sm592CoC.mjs +273 -0
  41. package/dist/index-cjJjrvPP.mjs +390 -0
  42. package/dist/index-enjFe_Qb.mjs +400 -0
  43. package/dist/index-gWMTJ0gB.mjs +221 -0
  44. package/dist/index-o0oTSdUL.mjs +149 -0
  45. package/dist/index.mjs +1357 -1229
  46. package/dist/{info-8NydJYfB.mjs → info-06y0zz8D.mjs} +1 -1
  47. package/dist/{info-BbMCDfFR.mjs → info-BQh86EaI.mjs} +1 -1
  48. package/dist/{info-l0eP5Tw1.mjs → info-CYY7U06K.mjs} +1 -1
  49. package/dist/info-ClUXgnK1.mjs +4 -0
  50. package/dist/info-DJvahDDF.mjs +4 -0
  51. package/dist/info-nzbmqI2A.mjs +4 -0
  52. package/dist/{info.vue_vue_type_script_setup_true_lang-wuHB-S6l.mjs → info.vue_vue_type_script_setup_true_lang-7L5RJMrf.mjs} +1 -1
  53. package/dist/{info.vue_vue_type_script_setup_true_lang-DMw-pPEW.mjs → info.vue_vue_type_script_setup_true_lang-BHjv3DSd.mjs} +1 -1
  54. package/dist/{info.vue_vue_type_script_setup_true_lang-BnDpoavn.mjs → info.vue_vue_type_script_setup_true_lang-D5eF48hb.mjs} +1 -1
  55. package/dist/info.vue_vue_type_script_setup_true_lang-DxArle2x.mjs +260 -0
  56. package/dist/info.vue_vue_type_script_setup_true_lang-hwan7iwm.mjs +209 -0
  57. package/dist/info.vue_vue_type_script_setup_true_lang-y8F2Xg5z.mjs +374 -0
  58. package/dist/style.css +1 -1
  59. package/dts/api/index.d.ts +5 -1
  60. package/dts/api/itsm-flow-spare-parts/index.d.ts +20 -0
  61. package/dts/api/itsm-flow-spare-parts/types.d.ts +113 -0
  62. package/dts/api/itsm-flow-spare-parts-details/index.d.ts +20 -0
  63. package/dts/api/itsm-flow-spare-parts-details/types.d.ts +77 -0
  64. package/dts/api/itsm-flow-temporary/index.d.ts +21 -0
  65. package/dts/api/itsm-flow-temporary/types.d.ts +115 -0
  66. package/dts/components/ImageUpload/ImageUpload.vue.d.ts +36 -0
  67. package/dts/components/TaskItsmFlowImOrderInterior/index.vue.d.ts +28 -0
  68. package/dts/components/TaskItsmFlowImOrderInteriorEdit/index.vue.d.ts +28 -0
  69. package/dts/components/TaskItsmFlowImOrderInteriorImplement/index.vue.d.ts +28 -0
  70. package/dts/components/TaskItsmFlowImOrderInteriorView/index.vue.d.ts +28 -0
  71. package/dts/components/TaskItsmFlowImSpareParts/index.vue.d.ts +28 -0
  72. package/dts/components/TaskItsmFlowImSparePartsEdit/index.vue.d.ts +28 -0
  73. package/dts/components/TaskItsmFlowImSparePartsUse/index.vue.d.ts +28 -0
  74. package/dts/components/TaskItsmFlowImSpareTemporary/index.vue.d.ts +28 -0
  75. package/dts/components/TaskItsmFlowImSpareTemporaryEdit/index.vue.d.ts +28 -0
  76. package/dts/components/TaskItsmFlowImSpareTemporaryImplement/index.vue.d.ts +28 -0
  77. package/dts/components/TaskItsmFlowImSpareTemporaryView/index.vue.d.ts +28 -0
  78. package/dts/constant.d.ts +8 -0
  79. package/dts/index.d.ts +11 -0
  80. package/dts/lang/itsm-flow/zh-cn.d.ts +81 -0
  81. package/dts/views/item-flow-orders-interior/edit.vue.d.ts +28 -0
  82. package/dts/views/item-flow-orders-interior/index.vue.d.ts +2 -0
  83. package/dts/views/item-flow-orders-interior/info.vue.d.ts +26 -0
  84. package/dts/views/itsm-flow-spare-parts/edit.vue.d.ts +28 -0
  85. package/dts/views/itsm-flow-spare-parts/index.vue.d.ts +2 -0
  86. package/dts/views/itsm-flow-spare-parts/info.vue.d.ts +26 -0
  87. package/dts/views/itsm-flow-temporary/edit.vue.d.ts +28 -0
  88. package/dts/views/itsm-flow-temporary/index.vue.d.ts +2 -0
  89. package/dts/views/itsm-flow-temporary/info.vue.d.ts +26 -0
  90. package/package.json +63 -63
@@ -0,0 +1,396 @@
1
+ import { defineComponent as le, mergeModels as oe, ref as _, useModel as te, reactive as ae, computed as Y, nextTick as ie, resolveComponent as p, createElementBlock as y, openBlock as f, Fragment as h, createVNode as l, withCtx as t, createElementVNode as L, unref as d, renderList as k, createBlock as A, toDisplayString as S, createTextVNode as g, createCommentVNode as se } from "vue";
2
+ import "element-plus";
3
+ import { useI18n as re } from "vue-i18n";
4
+ import { i as q } from "./index-o0oTSdUL.mjs";
5
+ import { U as ne, C as O, D as b, i as de } from "./index-D7TvdZ0W.mjs";
6
+ import { u as ue } from "./index-CvX2It1o.mjs";
7
+ import { useUserStoreHook as me, fileApi as pe } from "jmash-core";
8
+ import { _ as fe } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
9
+ const ce = /* @__PURE__ */ le({
10
+ __name: "index",
11
+ props: /* @__PURE__ */ oe({
12
+ task: {
13
+ type: Object,
14
+ default: () => {
15
+ }
16
+ }
17
+ }, {
18
+ modelValue: {},
19
+ modelModifiers: {}
20
+ }),
21
+ emits: ["update:modelValue"],
22
+ setup(U, { expose: P }) {
23
+ const j = me(), { t: ye } = re(), D = new ne({ userType: O.COMPANY_MANAGER });
24
+ D.useValues(), console.log("userIdList values:", D.values);
25
+ const $ = _(), v = te(U, "modelValue"), N = _([]), m = _({}), C = U, M = _((/* @__PURE__ */ new Date()).toISOString().split("T")[0]);
26
+ let s = ae({
27
+ files: [],
28
+ temporaryId: C.task.businessKey,
29
+ finishDate: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
30
+ });
31
+ const I = _(!1), R = _();
32
+ Y(() => {
33
+ const e = b.fileTypeDict.values.slice(2, 3)[0];
34
+ return e ? e.dictCode : "temporary_file";
35
+ });
36
+ const E = Y(() => {
37
+ const e = b.fileTypeDict.values.slice(3, 4)[0];
38
+ return e ? e.dictCode : "other_file";
39
+ });
40
+ function B() {
41
+ I.value = !0, R.value.clearFileList();
42
+ }
43
+ function z(e) {
44
+ const o = {
45
+ fileName: e.name,
46
+ fileId: e.response.fileId,
47
+ fileSort: E.value,
48
+ fileSrc: ""
49
+ };
50
+ s.files || (s.files = []), s.files.push(o), s.files = [...new Set(s.files)];
51
+ }
52
+ console.log(b.fileTypeDict.values.slice(2, 3)[0], "=>fileTypeDict ");
53
+ function K(e) {
54
+ var o;
55
+ (o = s.files) == null || o.splice(e, 1);
56
+ }
57
+ q.findById({ temporaryId: C.task.businessKey }).then(({ data: e }) => {
58
+ m.value = e, m.value.outOrgId = e.outOrgId, ie(() => {
59
+ Object.assign(m.value, e), G();
60
+ });
61
+ });
62
+ function G() {
63
+ de.findFilesList({ actionId: C.task.businessKey }).then(({ data: e }) => {
64
+ var o, i;
65
+ if (e.results && Array.isArray(e.results)) {
66
+ const u = [], r = [], c = ((o = b.fileTypeDict.values.slice(2, 3)[0]) == null ? void 0 : o.dictCode) || "", T = ((i = b.fileTypeDict.values.slice(3, 4)[0]) == null ? void 0 : i.dictCode) || "";
67
+ e.results.forEach((n) => {
68
+ const w = {
69
+ fileName: n.fileName || "",
70
+ fileId: n.fileId || "",
71
+ fileSort: n.fileSort || n.type || "",
72
+ fileSrc: n.fileSrc || n.filePath || ""
73
+ };
74
+ w.fileSort === c ? u.push(w) : w.fileSort === T && r.push(w);
75
+ }), N.value = u, s.files = r.map((n) => ({
76
+ fileName: n.fileName ?? "",
77
+ fileId: n.fileId ?? "",
78
+ fileSort: n.fileSort ?? "",
79
+ fileSrc: n.fileSrc ?? ""
80
+ // 确保 fileSrc 不为 undefined
81
+ }));
82
+ }
83
+ });
84
+ }
85
+ async function H(e) {
86
+ try {
87
+ const o = pe.fileUrl(e.filePath), u = await (await fetch(o)).blob(), r = window.URL.createObjectURL(u), c = document.createElement("a");
88
+ c.href = r, c.download = e.fileName || "download", document.body.appendChild(c), c.click();
89
+ } catch {
90
+ }
91
+ }
92
+ P({
93
+ changeModel: () => W()
94
+ });
95
+ function W() {
96
+ return v.value && (v.value.selectActions = [
97
+ { key: "true", value: "同意" },
98
+ { key: "false", value: "不同意" }
99
+ ], v.value.varName = "approved", v.value.module = "", v.value.module = O.MODULE_ITSMFLOW), new Promise((e, o) => {
100
+ var i;
101
+ (i = $.value) == null || i.validate((u) => {
102
+ u ? (v.value && (v.value.comment = ""), q.finish(
103
+ s
104
+ ), e(!0)) : o(!1);
105
+ });
106
+ });
107
+ }
108
+ return (e, o) => {
109
+ const i = p("el-col"), u = p("el-input"), r = p("el-form-item"), c = p("el-button"), T = p("el-date-picker"), n = p("jmash-select"), w = p("CircleClose"), J = p("el-icon"), Q = p("el-row"), X = p("el-form"), Z = p("jmash-multi-upload");
110
+ return f(), y(h, null, [
111
+ l(i, { span: 24 }, {
112
+ default: t(() => o[8] || (o[8] = [
113
+ L("div", { class: "title" }, "内部临时工单", -1)
114
+ ])),
115
+ _: 1,
116
+ __: [8]
117
+ }),
118
+ l(X, {
119
+ ref_key: "taskFormRef",
120
+ ref: $,
121
+ model: d(s),
122
+ "label-width": "150px",
123
+ class: "custom-table-form custom-form"
124
+ }, {
125
+ default: t(() => [
126
+ l(Q, null, {
127
+ default: t(() => [
128
+ l(i, { span: 24 }, {
129
+ default: t(() => [
130
+ l(r, {
131
+ label: e.$t("itsmFlowTemporary.title"),
132
+ prop: "title"
133
+ }, {
134
+ default: t(() => [
135
+ l(u, {
136
+ modelValue: m.value.title,
137
+ "onUpdate:modelValue": o[0] || (o[0] = (a) => m.value.title = a),
138
+ placeholder: e.$t("itsmFlowTemporary.titleRequired"),
139
+ "show-word-limit": "",
140
+ clearable: "",
141
+ disabled: !0
142
+ }, null, 8, ["modelValue", "placeholder"])
143
+ ]),
144
+ _: 1
145
+ }, 8, ["label"])
146
+ ]),
147
+ _: 1
148
+ }),
149
+ l(i, { span: 24 }, {
150
+ default: t(() => [
151
+ l(r, {
152
+ label: e.$t("itsmFlowTemporary.content"),
153
+ prop: "content"
154
+ }, {
155
+ default: t(() => [
156
+ l(u, {
157
+ modelValue: m.value.content,
158
+ "onUpdate:modelValue": o[1] || (o[1] = (a) => m.value.content = a),
159
+ placeholder: e.$t("itsmFlowTemporary.contentRequired"),
160
+ "show-word-limit": "",
161
+ clearable: "",
162
+ disabled: !0
163
+ }, null, 8, ["modelValue", "placeholder"])
164
+ ]),
165
+ _: 1
166
+ }, 8, ["label"])
167
+ ]),
168
+ _: 1
169
+ }),
170
+ l(i, { span: 24 }, {
171
+ default: t(() => [
172
+ (f(!0), y(h, null, k(d(b).fileTypeDict.values.slice(2, 3), (a, x) => (f(), A(r, {
173
+ key: a.dictCode,
174
+ label: a.dictName
175
+ }, {
176
+ default: t(() => [
177
+ (f(!0), y(h, null, k(N.value, (F, V) => (f(), y("div", {
178
+ key: V,
179
+ class: "files-list"
180
+ }, [
181
+ L("span", null, S(F.fileName), 1),
182
+ l(c, {
183
+ type: "primary",
184
+ link: "",
185
+ size: "small",
186
+ class: "icon-right",
187
+ onClick: (ee) => H(F)
188
+ }, {
189
+ default: t(() => o[9] || (o[9] = [
190
+ g(" 查看 ")
191
+ ])),
192
+ _: 2,
193
+ __: [9]
194
+ }, 1032, ["onClick"])
195
+ ]))), 128))
196
+ ]),
197
+ _: 2
198
+ }, 1032, ["label"]))), 128))
199
+ ]),
200
+ _: 1
201
+ }),
202
+ l(i, { span: 12 }, {
203
+ default: t(() => [
204
+ l(r, {
205
+ label: e.$t("itsmFlowTemporary.createUser")
206
+ }, {
207
+ default: t(() => [
208
+ l(u, {
209
+ value: d(j).user.realName,
210
+ placeholder: e.$t("itsmFlowTemporary.createUserRequired"),
211
+ "show-word-limit": "",
212
+ clearable: "",
213
+ disabled: !0
214
+ }, null, 8, ["value", "placeholder"])
215
+ ]),
216
+ _: 1
217
+ }, 8, ["label"])
218
+ ]),
219
+ _: 1
220
+ }),
221
+ l(i, { span: 12 }, {
222
+ default: t(() => [
223
+ l(r, {
224
+ label: e.$t("itsmFlowTemporary.createTime"),
225
+ prop: "createTime"
226
+ }, {
227
+ default: t(() => [
228
+ l(T, {
229
+ modelValue: M.value,
230
+ "onUpdate:modelValue": o[2] || (o[2] = (a) => M.value = a),
231
+ type: "date",
232
+ placeholder: e.$t("itsmFlowTemporary.createTimeRequired"),
233
+ format: "YYYY-MM-DD",
234
+ "value-format": "YYYY-MM-DD",
235
+ clearable: !1,
236
+ class: "w-full",
237
+ disabled: !0
238
+ }, null, 8, ["modelValue", "placeholder"])
239
+ ]),
240
+ _: 1
241
+ }, 8, ["label"])
242
+ ]),
243
+ _: 1
244
+ }),
245
+ l(i, { span: 24 }, {
246
+ default: t(() => [
247
+ l(r, {
248
+ label: e.$t("itsmFlowTemporary.userId"),
249
+ prop: "userId"
250
+ }, {
251
+ default: t(() => [
252
+ l(n, {
253
+ modelValue: m.value.userId,
254
+ "onUpdate:modelValue": o[3] || (o[3] = (a) => m.value.userId = a),
255
+ data: d(D).values,
256
+ placeholder: e.$t("itsmFlowTemporary.userIdRequired"),
257
+ "show-word-limit": "",
258
+ clearable: "",
259
+ class: "w-full",
260
+ disabled: !0
261
+ }, null, 8, ["modelValue", "data", "placeholder"])
262
+ ]),
263
+ _: 1
264
+ }, 8, ["label"])
265
+ ]),
266
+ _: 1
267
+ }),
268
+ l(i, { span: 12 }, {
269
+ default: t(() => [
270
+ l(r, {
271
+ label: e.$t("itsmFlowTemporary.handlingPeriod"),
272
+ prop: "handlingPeriod"
273
+ }, {
274
+ default: t(() => [
275
+ l(u, {
276
+ modelValue: m.value.handlingPeriod,
277
+ "onUpdate:modelValue": o[4] || (o[4] = (a) => m.value.handlingPeriod = a),
278
+ placeholder: e.$t("itsmFlowTemporary.handlingPeriodRequired"),
279
+ "show-word-limit": "",
280
+ clearable: "",
281
+ disabled: !0
282
+ }, null, 8, ["modelValue", "placeholder"])
283
+ ]),
284
+ _: 1
285
+ }, 8, ["label"])
286
+ ]),
287
+ _: 1
288
+ }),
289
+ l(i, { span: 12 }, {
290
+ default: t(() => [
291
+ l(r, {
292
+ label: e.$t("itsmFlowTemporary.finishDate"),
293
+ prop: "finishDate"
294
+ }, {
295
+ default: t(() => [
296
+ l(T, {
297
+ modelValue: d(s).finishDate,
298
+ "onUpdate:modelValue": o[5] || (o[5] = (a) => d(s).finishDate = a),
299
+ type: "date",
300
+ placeholder: e.$t("itsmFlowTemporary.finishDateRequired"),
301
+ format: "YYYY-MM-DD",
302
+ disabled: !0
303
+ }, null, 8, ["modelValue", "placeholder"])
304
+ ]),
305
+ _: 1
306
+ }, 8, ["label"])
307
+ ]),
308
+ _: 1
309
+ }),
310
+ l(i, { span: 24 }, {
311
+ default: t(() => [
312
+ l(r, {
313
+ label: e.$t("itsmFlowTemporary.completion"),
314
+ prop: "completion"
315
+ }, {
316
+ default: t(() => [
317
+ l(u, {
318
+ modelValue: d(s).completion,
319
+ "onUpdate:modelValue": o[6] || (o[6] = (a) => d(s).completion = a),
320
+ placeholder: e.$t("itsmFlowTemporary.completionRequired"),
321
+ "show-word-limit": "",
322
+ clearable: ""
323
+ }, null, 8, ["modelValue", "placeholder"])
324
+ ]),
325
+ _: 1
326
+ }, 8, ["label"])
327
+ ]),
328
+ _: 1
329
+ }),
330
+ l(i, { span: 24 }, {
331
+ default: t(() => [
332
+ (f(!0), y(h, null, k(d(b).fileTypeDict.values.slice(3, 4), (a, x) => (f(), y(h, {
333
+ key: a.dictCode
334
+ }, [
335
+ l(r, {
336
+ label: a.dictName
337
+ }, {
338
+ default: t(() => [
339
+ l(c, {
340
+ type: "primary",
341
+ icon: d(ue),
342
+ onClick: B
343
+ }, {
344
+ default: t(() => [
345
+ g(S(e.$t("common.uploadFiles")), 1)
346
+ ]),
347
+ _: 1
348
+ }, 8, ["icon"])
349
+ ]),
350
+ _: 2
351
+ }, 1032, ["label"]),
352
+ d(s).files && d(s).files.length > 0 ? (f(), A(r, { key: 0 }, {
353
+ default: t(() => [
354
+ (f(!0), y(h, null, k(d(s).files, (F, V) => (f(), y("div", {
355
+ key: V,
356
+ class: "files-list"
357
+ }, [
358
+ g(S(F.fileName) + " ", 1),
359
+ l(J, {
360
+ size: "16",
361
+ class: "icon-right",
362
+ onClick: (ee) => K(V)
363
+ }, {
364
+ default: t(() => [
365
+ l(w)
366
+ ]),
367
+ _: 2
368
+ }, 1032, ["onClick"])
369
+ ]))), 128))
370
+ ]),
371
+ _: 2
372
+ }, 1024)) : se("", !0)
373
+ ], 64))), 128))
374
+ ]),
375
+ _: 1
376
+ })
377
+ ]),
378
+ _: 1
379
+ })
380
+ ]),
381
+ _: 1
382
+ }, 8, ["model"]),
383
+ l(Z, {
384
+ ref_key: "uploadRef",
385
+ ref: R,
386
+ modelValue: I.value,
387
+ "onUpdate:modelValue": o[7] || (o[7] = (a) => I.value = a),
388
+ onUploadFileList: z
389
+ }, null, 8, ["modelValue"])
390
+ ], 64);
391
+ };
392
+ }
393
+ }), ke = /* @__PURE__ */ fe(ce, [["__scopeId", "data-v-e356879f"]]);
394
+ export {
395
+ ke as default
396
+ };