@rytass/bpm-core-react 0.13.3 → 0.13.5

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 (148) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +1 -0
  3. package/dist/chunks/{FormBuilderView-D4xIuPYB.js → FormBuilderView-BYLN6W-P.js} +2 -2
  4. package/dist/chunks/{FormBuilderView-D4xIuPYB.js.map → FormBuilderView-BYLN6W-P.js.map} +1 -1
  5. package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs → FormBuilderView-VmdPVbg7.cjs} +2 -2
  6. package/dist/chunks/{FormBuilderView-CLFlfDGe.cjs.map → FormBuilderView-VmdPVbg7.cjs.map} +1 -1
  7. package/dist/chunks/FormRendererView-Bs8lTb4k.cjs +2 -0
  8. package/dist/chunks/{FormRendererView-BxGT16z0.cjs.map → FormRendererView-Bs8lTb4k.cjs.map} +1 -1
  9. package/dist/chunks/{FormRendererView-DUceSOXe.js → FormRendererView-UPowZZgw.js} +3 -3
  10. package/dist/chunks/{FormRendererView-DUceSOXe.js.map → FormRendererView-UPowZZgw.js.map} +1 -1
  11. package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js → approval-instance-list-page-CPXMP3PL.js} +2 -2
  12. package/dist/chunks/{approval-instance-list-page-BjX2kaoF.js.map → approval-instance-list-page-CPXMP3PL.js.map} +1 -1
  13. package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs → approval-instance-list-page-ax0pm8bt.cjs} +2 -2
  14. package/dist/chunks/{approval-instance-list-page-CWiQvnfE.cjs.map → approval-instance-list-page-ax0pm8bt.cjs.map} +1 -1
  15. package/dist/chunks/{compose-Bb-REfoB.js → compose-6P64PO1i.js} +5 -5
  16. package/dist/chunks/{compose-Bb-REfoB.js.map → compose-6P64PO1i.js.map} +1 -1
  17. package/dist/chunks/{compose-DzRYZcqe.cjs → compose-BnSRL4ml.cjs} +2 -2
  18. package/dist/chunks/{compose-DzRYZcqe.cjs.map → compose-BnSRL4ml.cjs.map} +1 -1
  19. package/dist/chunks/{dashboard-page-DJ9vOPga.js → dashboard-page-CeCLV1tp.js} +2 -2
  20. package/dist/chunks/{dashboard-page-DJ9vOPga.js.map → dashboard-page-CeCLV1tp.js.map} +1 -1
  21. package/dist/chunks/{dashboard-page-CH87L5nx.cjs → dashboard-page-DooFJsxM.cjs} +2 -2
  22. package/dist/chunks/{dashboard-page-CH87L5nx.cjs.map → dashboard-page-DooFJsxM.cjs.map} +1 -1
  23. package/dist/chunks/{delegations-vpLtus9g.cjs → delegations-8LsxcQM4.cjs} +2 -2
  24. package/dist/chunks/{delegations-vpLtus9g.cjs.map → delegations-8LsxcQM4.cjs.map} +1 -1
  25. package/dist/chunks/{delegations-0MbJ7CWj.js → delegations-B8gLSt0i.js} +4 -5
  26. package/dist/chunks/{delegations-0MbJ7CWj.js.map → delegations-B8gLSt0i.js.map} +1 -1
  27. package/dist/chunks/{delegations-DyMGIDpp.js → delegations-DRupxJ4_.js} +4 -5
  28. package/dist/chunks/{delegations-DyMGIDpp.js.map → delegations-DRupxJ4_.js.map} +1 -1
  29. package/dist/chunks/{delegations-Bc9psOZ3.cjs → delegations-DlYwMiAW.cjs} +2 -2
  30. package/dist/chunks/{delegations-Bc9psOZ3.cjs.map → delegations-DlYwMiAW.cjs.map} +1 -1
  31. package/dist/chunks/{designer-C6oIO9Kq.js → designer-C3s2kSna.js} +1342 -841
  32. package/dist/chunks/designer-C3s2kSna.js.map +1 -0
  33. package/dist/chunks/designer-_g58R6rQ.cjs +65 -0
  34. package/dist/chunks/designer-_g58R6rQ.cjs.map +1 -0
  35. package/dist/chunks/detail-Db-UOELp.cjs +2 -0
  36. package/dist/chunks/detail-Db-UOELp.cjs.map +1 -0
  37. package/dist/chunks/detail-pYEIk-jW.js +2325 -0
  38. package/dist/chunks/detail-pYEIk-jW.js.map +1 -0
  39. package/dist/chunks/{login-9bCXyjbX.cjs → login-AtVxZBsC.cjs} +2 -2
  40. package/dist/chunks/{login-9bCXyjbX.cjs.map → login-AtVxZBsC.cjs.map} +1 -1
  41. package/dist/chunks/{login-BKxpLibd.js → login-C6qlTC6F.js} +2 -2
  42. package/dist/chunks/{login-BKxpLibd.js.map → login-C6qlTC6F.js.map} +1 -1
  43. package/dist/chunks/{orgs-Cr_7zsAD.js → orgs-BpqVu5ka.js} +2 -2
  44. package/dist/chunks/{orgs-Cr_7zsAD.js.map → orgs-BpqVu5ka.js.map} +1 -1
  45. package/dist/chunks/orgs-D0-5BaHT.cjs +2 -0
  46. package/dist/chunks/{orgs-Bz8hBMoQ.cjs.map → orgs-D0-5BaHT.cjs.map} +1 -1
  47. package/dist/chunks/providers-DHtDZFNA.cjs +2 -0
  48. package/dist/chunks/{providers-BsEn3ikK.cjs.map → providers-DHtDZFNA.cjs.map} +1 -1
  49. package/dist/chunks/{providers-DjLh4oLY.js → providers-J5eyByQj.js} +7 -7
  50. package/dist/chunks/{providers-DjLh4oLY.js.map → providers-J5eyByQj.js.map} +1 -1
  51. package/dist/chunks/{routes-config-fDVHmvXi.cjs → routes-config-C1j_vFKo.cjs} +2 -2
  52. package/dist/chunks/routes-config-C1j_vFKo.cjs.map +1 -0
  53. package/dist/chunks/{routes-config-RBYQtUd0.js → routes-config-yZbESPlw.js} +3 -2
  54. package/dist/chunks/routes-config-yZbESPlw.js.map +1 -0
  55. package/dist/chunks/use-bpm-member-D57LKe_u.js +20 -0
  56. package/dist/chunks/use-bpm-member-D57LKe_u.js.map +1 -0
  57. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs +2 -0
  58. package/dist/chunks/use-bpm-member-DpNAQtNC.cjs.map +1 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.js +19 -24
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/routes-config.d.ts +2 -0
  64. package/dist/lib/use-bpm-member.d.ts +6 -0
  65. package/dist/next/index.cjs +1 -1
  66. package/dist/next/index.js +2 -2
  67. package/dist/pages/admin/delegations/index.cjs +1 -1
  68. package/dist/pages/admin/delegations/index.js +1 -1
  69. package/dist/pages/admin/orgs/index.cjs +1 -1
  70. package/dist/pages/admin/orgs/index.js +1 -1
  71. package/dist/pages/admin/webhook-endpoints/index.cjs +2 -0
  72. package/dist/pages/admin/webhook-endpoints/index.cjs.map +1 -0
  73. package/dist/pages/admin/webhook-endpoints/index.d.ts +4 -0
  74. package/dist/pages/admin/webhook-endpoints/index.js +14 -0
  75. package/dist/pages/admin/webhook-endpoints/index.js.map +1 -0
  76. package/dist/pages/delegations/index.cjs +1 -1
  77. package/dist/pages/delegations/index.js +1 -1
  78. package/dist/pages/instances/detail/index.cjs +1 -1
  79. package/dist/pages/instances/detail/index.js +1 -1
  80. package/dist/pages/login/index.cjs +1 -1
  81. package/dist/pages/login/index.js +1 -1
  82. package/dist/pages/templates/compose/index.cjs +1 -1
  83. package/dist/pages/templates/compose/index.js +1 -1
  84. package/dist/pages/templates/designer/index.cjs +1 -1
  85. package/dist/pages/templates/designer/index.js +1 -1
  86. package/dist/style.css +1 -1
  87. package/dist/views/admin/delegations/index.cjs +1 -1
  88. package/dist/views/admin/delegations/index.js +1 -1
  89. package/dist/views/admin/index.cjs +1 -1
  90. package/dist/views/admin/index.d.ts +1 -0
  91. package/dist/views/admin/index.js +4 -3
  92. package/dist/views/admin/orgs/index.cjs +1 -1
  93. package/dist/views/admin/orgs/index.js +1 -1
  94. package/dist/views/admin/webhook-endpoints/AdminWebhookEndpointsView.d.ts +8 -0
  95. package/dist/views/admin/webhook-endpoints/index.cjs +2 -0
  96. package/dist/views/admin/webhook-endpoints/index.cjs.map +1 -0
  97. package/dist/views/admin/webhook-endpoints/index.d.ts +1 -0
  98. package/dist/views/admin/webhook-endpoints/index.js +729 -0
  99. package/dist/views/admin/webhook-endpoints/index.js.map +1 -0
  100. package/dist/views/cc/index.cjs +1 -1
  101. package/dist/views/cc/index.js +1 -1
  102. package/dist/views/dashboard/index.cjs +1 -1
  103. package/dist/views/dashboard/index.js +1 -1
  104. package/dist/views/delegations/index.cjs +1 -1
  105. package/dist/views/delegations/index.js +1 -1
  106. package/dist/views/forms/builder/index.cjs +1 -1
  107. package/dist/views/forms/builder/index.js +1 -1
  108. package/dist/views/forms/renderer/index.cjs +1 -1
  109. package/dist/views/forms/renderer/index.js +1 -1
  110. package/dist/views/inbox/index.cjs +1 -1
  111. package/dist/views/inbox/index.js +1 -1
  112. package/dist/views/instances/detail/InstanceDetailView.d.ts +6 -1
  113. package/dist/views/instances/detail/index.cjs +1 -1
  114. package/dist/views/instances/detail/index.d.ts +1 -0
  115. package/dist/views/instances/detail/index.js +2 -2
  116. package/dist/views/instances/detail/sections/InstanceWebhookDeliveriesSection.d.ts +20 -0
  117. package/dist/views/instances/detail/sections/shared.d.ts +37 -4
  118. package/dist/views/instances/new/index.cjs +1 -1
  119. package/dist/views/instances/new/index.js +2 -2
  120. package/dist/views/login/index.cjs +1 -1
  121. package/dist/views/login/index.js +1 -1
  122. package/dist/views/search/index.cjs +1 -1
  123. package/dist/views/search/index.js +1 -1
  124. package/dist/views/sent/index.cjs +1 -1
  125. package/dist/views/sent/index.js +1 -1
  126. package/dist/views/templates/compose/index.cjs +1 -1
  127. package/dist/views/templates/compose/index.js +1 -1
  128. package/dist/views/templates/designer/NotifyWebhookTargetsEditor.d.ts +20 -0
  129. package/dist/views/templates/designer/index.cjs +1 -1
  130. package/dist/views/templates/designer/index.js +1 -1
  131. package/dist/views/templates/designer/notify-webhook-designer.d.ts +74 -0
  132. package/dist/views/templates/index.cjs +1 -1
  133. package/dist/views/templates/index.js +1 -1
  134. package/dist/views/templates/versions/index.cjs +1 -1
  135. package/dist/views/templates/versions/index.js +1 -1
  136. package/package.json +13 -3
  137. package/dist/chunks/FormRendererView-BxGT16z0.cjs +0 -2
  138. package/dist/chunks/designer-C6oIO9Kq.js.map +0 -1
  139. package/dist/chunks/designer-gFUdImeZ.cjs +0 -65
  140. package/dist/chunks/designer-gFUdImeZ.cjs.map +0 -1
  141. package/dist/chunks/detail-BgKgMvYx.js +0 -2044
  142. package/dist/chunks/detail-BgKgMvYx.js.map +0 -1
  143. package/dist/chunks/detail-Dnz5aaI-.cjs +0 -2
  144. package/dist/chunks/detail-Dnz5aaI-.cjs.map +0 -1
  145. package/dist/chunks/orgs-Bz8hBMoQ.cjs +0 -2
  146. package/dist/chunks/providers-BsEn3ikK.cjs +0 -2
  147. package/dist/chunks/routes-config-RBYQtUd0.js.map +0 -1
  148. package/dist/chunks/routes-config-fDVHmvXi.cjs.map +0 -1
@@ -0,0 +1,729 @@
1
+ "use client";
2
+ import { t as e } from "../../../chunks/format-date-time-CB-LxzqT.js";
3
+ import { t } from "../../../chunks/bpm-form-field-Cao0rMol.js";
4
+ import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
5
+ import { Badge as o, Button as s, Input as c, Modal as l, PageHeader as u, Section as d, SectionGroup as f, Select as p, Table as m, Textarea as h, Toggle as g, Typography as _ } from "@mezzanine-ui/react";
6
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
7
+ import x from "@mezzanine-ui/react/ContentHeader";
8
+ import { PlusIcon as S, TrashIcon as C } from "@mezzanine-ui/icons";
9
+ import { createWorkflowWebhookEndpoint as w, listWorkflowWebhookEndpointAudits as T, listWorkflowWebhookManagedEndpoints as ee, readWorkflowWebhookEndpointManagement as E, rotateWorkflowWebhookEndpointSecret as te, setWorkflowWebhookEndpointActive as ne, testWorkflowWebhookEndpoint as re, updateWorkflowWebhookEndpoint as ie } from "@rytass/bpm-core-client/template";
10
+ //#region src/views/admin/webhook-endpoints/AdminWebhookEndpointsView.tsx
11
+ var D = {
12
+ display: "grid",
13
+ gap: "var(--mzn-spacing-gap-base)"
14
+ }, O = {
15
+ alignItems: "center",
16
+ display: "grid",
17
+ gap: "var(--mzn-spacing-gap-base)",
18
+ gridTemplateColumns: "minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) auto auto"
19
+ }, k = {
20
+ alignItems: "center",
21
+ display: "grid",
22
+ gap: "var(--mzn-spacing-gap-base)",
23
+ gridTemplateColumns: "minmax(0, 1fr) minmax(0, 2fr) auto"
24
+ }, A = [
25
+ {
26
+ id: "POST",
27
+ name: "POST"
28
+ },
29
+ {
30
+ id: "PUT",
31
+ name: "PUT"
32
+ },
33
+ {
34
+ id: "PATCH",
35
+ name: "PATCH"
36
+ }
37
+ ], j = [
38
+ {
39
+ id: "string",
40
+ name: "文字"
41
+ },
42
+ {
43
+ id: "number",
44
+ name: "數字"
45
+ },
46
+ {
47
+ id: "boolean",
48
+ name: "是/否"
49
+ },
50
+ {
51
+ id: "stringArray",
52
+ name: "文字清單"
53
+ },
54
+ {
55
+ id: "json",
56
+ name: "JSON"
57
+ }
58
+ ], M = {
59
+ CREATED: "建立",
60
+ DISABLED: "停用",
61
+ ENABLED: "啟用",
62
+ SECRET_ROTATED: "輪替金鑰",
63
+ TEST_SENT: "測試送出",
64
+ UPDATED: "更新"
65
+ }, ae = {
66
+ deprecated: !1,
67
+ description: "",
68
+ endpointId: null,
69
+ headers: [],
70
+ key: "",
71
+ label: "",
72
+ method: "POST",
73
+ mode: "create",
74
+ originalUrl: "",
75
+ parameters: [],
76
+ replaceHeaders: !0,
77
+ signingSecret: "",
78
+ timeoutMs: "",
79
+ url: "",
80
+ version: "1"
81
+ };
82
+ function N() {
83
+ let [p, h] = a(null), [C, O] = a([]), [k, A] = a(!0), [j, M] = a(null), [N, L] = a(null), [z, B] = a(null), [V, H] = a(!1), [U, W] = a(null), [G, K] = a(""), [q, J] = a(!1), [Y, X] = a(null), Z = n(async () => {
84
+ A(!0);
85
+ try {
86
+ let e = await E();
87
+ h(e), O(e.enabled ? await ee() : []), M(null);
88
+ } catch (e) {
89
+ M(R(e));
90
+ } finally {
91
+ A(!1);
92
+ }
93
+ }, []);
94
+ r(() => {
95
+ Z();
96
+ }, [Z]);
97
+ let Q = n(async (e) => {
98
+ M(null), L(null);
99
+ try {
100
+ return L(await e()), await Z(), !0;
101
+ } catch (e) {
102
+ return M(R(e)), !1;
103
+ }
104
+ }, [Z]), ce = i(() => C.map((e) => ({
105
+ endpoint: e,
106
+ key: e.id
107
+ })), [C]), le = i(() => [
108
+ {
109
+ key: "label",
110
+ render: ({ endpoint: e }) => /* @__PURE__ */ b("div", {
111
+ style: D,
112
+ children: [/* @__PURE__ */ y(_, {
113
+ component: "span",
114
+ variant: "body",
115
+ children: e.label
116
+ }), /* @__PURE__ */ b(_, {
117
+ color: "text-neutral",
118
+ component: "span",
119
+ variant: "caption",
120
+ children: [
121
+ e.key,
122
+ "@",
123
+ e.version,
124
+ " · 參數",
125
+ " ",
126
+ e.parameters.length,
127
+ " 個"
128
+ ]
129
+ })]
130
+ }),
131
+ title: "端點",
132
+ width: 240
133
+ },
134
+ {
135
+ key: "url",
136
+ render: ({ endpoint: e }) => /* @__PURE__ */ b(_, {
137
+ component: "span",
138
+ variant: "body",
139
+ children: [
140
+ e.method,
141
+ " ",
142
+ e.url
143
+ ]
144
+ }),
145
+ title: "URL",
146
+ width: 320
147
+ },
148
+ {
149
+ key: "status",
150
+ render: ({ endpoint: e }) => e.active ? e.deprecated ? /* @__PURE__ */ y(o, {
151
+ size: "sub",
152
+ text: "不建議使用",
153
+ variant: "dot-warning"
154
+ }) : /* @__PURE__ */ y(o, {
155
+ size: "sub",
156
+ text: "啟用中",
157
+ variant: "dot-success"
158
+ }) : /* @__PURE__ */ y(o, {
159
+ size: "sub",
160
+ text: "已停用",
161
+ variant: "dot-inactive"
162
+ }),
163
+ title: "狀態",
164
+ width: 120
165
+ },
166
+ {
167
+ key: "credentials",
168
+ render: ({ endpoint: e }) => /* @__PURE__ */ b("div", {
169
+ style: D,
170
+ children: [/* @__PURE__ */ y(_, {
171
+ component: "span",
172
+ variant: "body",
173
+ children: e.hasSigningSecret ? "已設定簽章金鑰" : "未簽章"
174
+ }), /* @__PURE__ */ y(_, {
175
+ color: "text-neutral",
176
+ component: "span",
177
+ variant: "caption",
178
+ children: e.headerNames.length ? `Header:${e.headerNames.join("、")}` : "沒有自訂 header"
179
+ })]
180
+ }),
181
+ title: "憑證",
182
+ width: 200
183
+ },
184
+ {
185
+ key: "updatedAt",
186
+ render: ({ endpoint: t }) => /* @__PURE__ */ y(_, {
187
+ component: "span",
188
+ variant: "body",
189
+ children: e(t.updatedAt)
190
+ }),
191
+ title: "更新時間",
192
+ width: 180
193
+ }
194
+ ], []), ue = i(() => ({
195
+ render: ({ endpoint: e }) => [
196
+ {
197
+ name: "編輯",
198
+ onClick: () => B(P(e, "edit"))
199
+ },
200
+ {
201
+ name: "建立新版本",
202
+ onClick: () => B(P(e, "version"))
203
+ },
204
+ {
205
+ name: "測試送出",
206
+ onClick: () => {
207
+ Q(async () => F(e, await re(e.id)));
208
+ }
209
+ },
210
+ {
211
+ name: "輪替金鑰",
212
+ onClick: () => {
213
+ K(""), J(!1), W(e);
214
+ }
215
+ },
216
+ {
217
+ name: e.active ? "停用" : "啟用",
218
+ onClick: () => {
219
+ Q(async () => (await ne(e.id, !e.active), `已${e.active ? "停用" : "啟用"}「${e.label}」。`));
220
+ }
221
+ },
222
+ {
223
+ name: "異動紀錄",
224
+ onClick: () => {
225
+ T(e.id).then((t) => X({
226
+ endpoint: e,
227
+ records: t
228
+ })).catch((e) => M(R(e)));
229
+ }
230
+ }
231
+ ],
232
+ variant: "base-secondary",
233
+ width: 180
234
+ }), [Q]);
235
+ async function de() {
236
+ if (!z) return;
237
+ H(!0);
238
+ let e = await Q(async () => {
239
+ let e = z.parameters.map((e) => ({
240
+ description: e.description.trim() || null,
241
+ key: e.key.trim(),
242
+ label: e.label.trim(),
243
+ required: e.required,
244
+ type: e.type
245
+ })), t = z.headers.filter((e) => e.name.trim()).map((e) => ({
246
+ name: e.name.trim(),
247
+ value: e.value
248
+ })), n = z.timeoutMs.trim() ? Number(z.timeoutMs) : null;
249
+ return z.mode === "edit" && z.endpointId ? (await ie({
250
+ deprecated: z.deprecated,
251
+ description: z.description,
252
+ headers: z.replaceHeaders || I(z) ? t : null,
253
+ id: z.endpointId,
254
+ label: z.label,
255
+ method: z.method,
256
+ parameters: e,
257
+ timeoutMs: n,
258
+ url: z.url
259
+ }), `已更新「${z.label}」。`) : (await w({
260
+ deprecated: z.deprecated,
261
+ description: z.description,
262
+ headers: t,
263
+ key: z.key,
264
+ label: z.label,
265
+ method: z.method,
266
+ parameters: e,
267
+ signingSecret: z.signingSecret || null,
268
+ timeoutMs: n,
269
+ url: z.url,
270
+ version: Number(z.version)
271
+ }), `已建立「${z.label}」v${z.version},設計器現在可以選用。`);
272
+ });
273
+ H(!1), e && B(null);
274
+ }
275
+ async function fe() {
276
+ if (!U) return;
277
+ let e = U;
278
+ await Q(async () => (await te(e.id, q ? null : G), q ? `已移除「${e.label}」的簽章金鑰,之後的請求不再簽章。` : `已輪替「${e.label}」的簽章金鑰,接收端需改用新金鑰驗簽。`)) && (W(null), K(""));
279
+ }
280
+ let $ = !!p?.enabled;
281
+ return /* @__PURE__ */ b(v, { children: [
282
+ /* @__PURE__ */ y(u, { children: /* @__PURE__ */ y(x, {
283
+ description: "維護知會節點可呼叫的外部系統端點。Header 值與簽章金鑰加密保存,儲存後不會再顯示。",
284
+ title: "Webhook 端點",
285
+ children: /* @__PURE__ */ y(s, {
286
+ disabled: !$,
287
+ icon: S,
288
+ iconType: "leading",
289
+ onClick: () => B(ae),
290
+ variant: "base-primary",
291
+ children: "新增端點"
292
+ })
293
+ }) }),
294
+ /* @__PURE__ */ y(f, { children: /* @__PURE__ */ y(d, { children: /* @__PURE__ */ b("div", {
295
+ style: D,
296
+ children: [
297
+ j ? /* @__PURE__ */ y(_, {
298
+ color: "text-error",
299
+ variant: "body",
300
+ children: j
301
+ }) : null,
302
+ N ? /* @__PURE__ */ y(_, {
303
+ color: "text-success",
304
+ variant: "body",
305
+ children: N
306
+ }) : null,
307
+ p && !$ ? /* @__PURE__ */ y(_, {
308
+ color: "text-warning",
309
+ variant: "body",
310
+ children: "此伺服器未啟用後台維護的 Webhook 端點:需要設定 workflowWebhookTargetSources 含 DATABASE、URL 白名單與加密金鑰。程式註冊的端點不受影響。"
311
+ }) : null,
312
+ $ ? /* @__PURE__ */ b(_, {
313
+ color: "text-neutral",
314
+ variant: "caption",
315
+ children: ["允許的 URL:", p?.allowedUrlPatterns.join("、")]
316
+ }) : null,
317
+ /* @__PURE__ */ y(m, {
318
+ actions: ue,
319
+ columns: le,
320
+ dataSource: ce,
321
+ fullWidth: !0,
322
+ loading: k
323
+ })
324
+ ]
325
+ }) }) }),
326
+ z ? /* @__PURE__ */ y(se, {
327
+ draft: z,
328
+ onCancel: () => B(null),
329
+ onChange: B,
330
+ onConfirm: () => void de(),
331
+ saving: V
332
+ }) : null,
333
+ /* @__PURE__ */ y(l, {
334
+ cancelText: "取消",
335
+ confirmButtonProps: { disabled: !q && !G },
336
+ confirmText: q ? "移除金鑰" : "輪替金鑰",
337
+ modalType: "standard",
338
+ onCancel: () => W(null),
339
+ onClose: () => W(null),
340
+ onConfirm: () => void fe(),
341
+ open: !!U,
342
+ showModalFooter: !0,
343
+ showModalHeader: !0,
344
+ supportingText: "新金鑰會加密保存,不會再顯示;請同時更新接收端的驗簽金鑰。",
345
+ title: `輪替簽章金鑰:${U?.label ?? ""}`,
346
+ children: /* @__PURE__ */ b("div", {
347
+ style: D,
348
+ children: [/* @__PURE__ */ y(t, {
349
+ label: "移除金鑰",
350
+ name: "removeSigningSecret",
351
+ children: /* @__PURE__ */ y(g, {
352
+ checked: q,
353
+ onChange: (e) => J(e.target.checked)
354
+ })
355
+ }), q ? null : /* @__PURE__ */ y(t, {
356
+ label: "新金鑰",
357
+ name: "nextSigningSecret",
358
+ required: !0,
359
+ children: /* @__PURE__ */ y(c, {
360
+ onChange: (e) => K(e.target.value),
361
+ value: G,
362
+ inputProps: { autoComplete: "new-password" },
363
+ variant: "password"
364
+ })
365
+ })]
366
+ })
367
+ }),
368
+ /* @__PURE__ */ y(l, {
369
+ confirmText: "關閉",
370
+ modalType: "standard",
371
+ onClose: () => X(null),
372
+ onConfirm: () => X(null),
373
+ open: !!Y,
374
+ showModalFooter: !0,
375
+ showModalHeader: !0,
376
+ size: "wide",
377
+ supportingText: "只記錄誰在何時變更了哪些欄位,不記錄任何值。",
378
+ title: `異動紀錄:${Y?.endpoint.label ?? ""}`,
379
+ children: /* @__PURE__ */ y(m, {
380
+ columns: oe,
381
+ dataSource: (Y?.records ?? []).map((e) => ({
382
+ audit: e,
383
+ key: e.id
384
+ })),
385
+ fullWidth: !0
386
+ })
387
+ })
388
+ ] });
389
+ }
390
+ var oe = [
391
+ {
392
+ key: "createdAt",
393
+ render: ({ audit: t }) => /* @__PURE__ */ y(_, {
394
+ component: "span",
395
+ variant: "body",
396
+ children: e(t.createdAt)
397
+ }),
398
+ title: "時間",
399
+ width: 180
400
+ },
401
+ {
402
+ key: "action",
403
+ render: ({ audit: e }) => /* @__PURE__ */ y(_, {
404
+ component: "span",
405
+ variant: "body",
406
+ children: M[e.action]
407
+ }),
408
+ title: "動作",
409
+ width: 120
410
+ },
411
+ {
412
+ key: "changedFields",
413
+ render: ({ audit: e }) => /* @__PURE__ */ y(_, {
414
+ component: "span",
415
+ variant: "body",
416
+ children: e.changedFields.join("、") || "—"
417
+ }),
418
+ title: "欄位",
419
+ width: 280
420
+ },
421
+ {
422
+ key: "actor",
423
+ render: ({ audit: e }) => /* @__PURE__ */ y(_, {
424
+ component: "span",
425
+ variant: "body",
426
+ children: e.actorMemberId ?? "系統"
427
+ }),
428
+ title: "操作者",
429
+ width: 160
430
+ }
431
+ ];
432
+ function se({ draft: e, onCancel: n, onChange: r, onConfirm: i, saving: a }) {
433
+ let o = e.mode === "edit", u = I(e), d = e.replaceHeaders || u, f = (t) => r({
434
+ ...e,
435
+ ...t
436
+ }), m = (t, n) => f({ parameters: e.parameters.map((e, r) => r === t ? {
437
+ ...e,
438
+ ...n
439
+ } : e) }), v = (t, n) => f({ headers: e.headers.map((e, r) => r === t ? {
440
+ ...e,
441
+ ...n
442
+ } : e) }), x = (e) => (t) => f({ [e]: t.target.value });
443
+ return /* @__PURE__ */ y(l, {
444
+ cancelText: "取消",
445
+ confirmText: o ? "儲存" : "建立",
446
+ loading: a,
447
+ modalType: "standard",
448
+ onCancel: n,
449
+ onClose: n,
450
+ onConfirm: i,
451
+ open: !0,
452
+ showModalFooter: !0,
453
+ showModalHeader: !0,
454
+ size: "wide",
455
+ supportingText: o ? "參數的鍵、型別與必填是這個版本的契約,無法修改;需要變更請建立新版本。" : e.mode === "version" ? "新版本可調整參數;既有模板仍使用舊版本,直到設計者改選。" : "URL 需符合伺服器設定的白名單。",
456
+ title: o ? `編輯端點:${e.label}` : e.mode === "version" ? `建立新版本:${e.key}` : "新增 Webhook 端點",
457
+ children: /* @__PURE__ */ b("div", {
458
+ style: D,
459
+ children: [
460
+ /* @__PURE__ */ y(t, {
461
+ label: "Key",
462
+ name: "endpointKey",
463
+ required: !0,
464
+ children: /* @__PURE__ */ y(c, {
465
+ ...e.mode === "create" ? {} : { readonly: !0 },
466
+ onChange: x("key"),
467
+ placeholder: "例如 crm.lead-created",
468
+ value: e.key,
469
+ inputProps: { autoComplete: "off" },
470
+ variant: "base"
471
+ })
472
+ }),
473
+ /* @__PURE__ */ y(t, {
474
+ label: "版本",
475
+ name: "endpointVersion",
476
+ required: !0,
477
+ children: /* @__PURE__ */ y(c, {
478
+ ...o ? { readonly: !0 } : {},
479
+ inputProps: {
480
+ autoComplete: "off",
481
+ inputMode: "numeric"
482
+ },
483
+ onChange: x("version"),
484
+ value: e.version,
485
+ variant: "base"
486
+ })
487
+ }),
488
+ /* @__PURE__ */ y(t, {
489
+ label: "名稱",
490
+ name: "endpointLabel",
491
+ required: !0,
492
+ children: /* @__PURE__ */ y(c, {
493
+ onChange: x("label"),
494
+ placeholder: "例如 CRM 建立名單",
495
+ value: e.label,
496
+ inputProps: { autoComplete: "off" },
497
+ variant: "base"
498
+ })
499
+ }),
500
+ /* @__PURE__ */ y(t, {
501
+ label: "說明",
502
+ name: "endpointDescription",
503
+ children: /* @__PURE__ */ y(h, {
504
+ onChange: x("description"),
505
+ rows: 2,
506
+ value: e.description
507
+ })
508
+ }),
509
+ /* @__PURE__ */ y(t, {
510
+ label: "URL",
511
+ name: "endpointUrl",
512
+ required: !0,
513
+ children: /* @__PURE__ */ y(c, {
514
+ onChange: x("url"),
515
+ placeholder: "https://",
516
+ value: e.url,
517
+ inputProps: { autoComplete: "off" },
518
+ variant: "base"
519
+ })
520
+ }),
521
+ /* @__PURE__ */ y(t, {
522
+ label: "Method",
523
+ name: "endpointMethod",
524
+ required: !0,
525
+ children: /* @__PURE__ */ y(p, {
526
+ clearable: !1,
527
+ onChange: (e) => f({ method: e?.id ?? "POST" }),
528
+ options: [...A],
529
+ value: A.find((t) => t.id === e.method) ?? null
530
+ })
531
+ }),
532
+ /* @__PURE__ */ y(t, {
533
+ hintText: "留空使用預設 10 秒,上限 30000 毫秒。",
534
+ label: "逾時(毫秒)",
535
+ name: "endpointTimeout",
536
+ children: /* @__PURE__ */ y(c, {
537
+ inputProps: {
538
+ autoComplete: "off",
539
+ inputMode: "numeric"
540
+ },
541
+ onChange: x("timeoutMs"),
542
+ value: e.timeoutMs,
543
+ variant: "base"
544
+ })
545
+ }),
546
+ /* @__PURE__ */ y(t, {
547
+ label: "不建議使用",
548
+ name: "endpointDeprecated",
549
+ children: /* @__PURE__ */ y(g, {
550
+ checked: e.deprecated,
551
+ onChange: (e) => f({ deprecated: e.target.checked })
552
+ })
553
+ }),
554
+ o ? null : /* @__PURE__ */ y(t, {
555
+ hintText: "選填;設定後 BPM 以 HMAC-SHA256 簽章,儲存後不會再顯示。",
556
+ label: "簽章金鑰",
557
+ name: "endpointSigningSecret",
558
+ children: /* @__PURE__ */ y(c, {
559
+ onChange: x("signingSecret"),
560
+ placeholder: "選填,儲存後不再顯示",
561
+ value: e.signingSecret,
562
+ inputProps: { autoComplete: "new-password" },
563
+ variant: "password"
564
+ })
565
+ }),
566
+ /* @__PURE__ */ y(_, {
567
+ variant: "label-primary-highlight",
568
+ children: "Headers"
569
+ }),
570
+ o ? /* @__PURE__ */ y(t, {
571
+ hintText: u ? "URL 已改到其他主機,必須重新輸入 header(留空代表不帶任何 header)。" : "現有 header 的值不會顯示;開啟後以下列內容取代全部 header。",
572
+ label: "取代 headers",
573
+ name: "endpointReplaceHeaders",
574
+ children: /* @__PURE__ */ y(g, {
575
+ checked: d,
576
+ disabled: u,
577
+ onChange: (e) => f({ replaceHeaders: e.target.checked })
578
+ })
579
+ }) : null,
580
+ d ? e.headers.map((t, n) => /* @__PURE__ */ b("div", {
581
+ style: k,
582
+ children: [
583
+ /* @__PURE__ */ y(c, {
584
+ onChange: (e) => v(n, { name: e.target.value }),
585
+ placeholder: "名稱,例如 Authorization",
586
+ inputProps: { autoComplete: "off" },
587
+ value: t.name,
588
+ variant: "base"
589
+ }),
590
+ /* @__PURE__ */ y(c, {
591
+ onChange: (e) => v(n, { value: e.target.value }),
592
+ placeholder: "值",
593
+ value: t.value,
594
+ inputProps: { autoComplete: "new-password" },
595
+ variant: "password"
596
+ }),
597
+ /* @__PURE__ */ y(s, {
598
+ icon: C,
599
+ iconType: "icon-only",
600
+ onClick: () => f({ headers: e.headers.filter((e, t) => t !== n) }),
601
+ variant: "destructive-text-link",
602
+ children: "移除 header"
603
+ })
604
+ ]
605
+ }, n)) : null,
606
+ d ? /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
607
+ icon: S,
608
+ iconType: "leading",
609
+ onClick: () => f({ headers: [...e.headers, {
610
+ name: "",
611
+ value: ""
612
+ }] }),
613
+ variant: "base-dashed",
614
+ children: "新增 header"
615
+ }) }) : null,
616
+ /* @__PURE__ */ y(_, {
617
+ variant: "label-primary-highlight",
618
+ children: "參數"
619
+ }),
620
+ e.parameters.map((t, n) => /* @__PURE__ */ b("div", {
621
+ style: O,
622
+ children: [
623
+ /* @__PURE__ */ y(c, {
624
+ ...o ? { readonly: !0 } : {},
625
+ onChange: (e) => m(n, { key: e.target.value }),
626
+ placeholder: "參數鍵",
627
+ inputProps: { autoComplete: "off" },
628
+ value: t.key,
629
+ variant: "base"
630
+ }),
631
+ /* @__PURE__ */ y(c, {
632
+ onChange: (e) => m(n, { label: e.target.value }),
633
+ placeholder: "顯示名稱",
634
+ inputProps: { autoComplete: "off" },
635
+ value: t.label,
636
+ variant: "base"
637
+ }),
638
+ /* @__PURE__ */ y(p, {
639
+ clearable: !1,
640
+ disabled: o,
641
+ onChange: (e) => m(n, { type: L(e?.id ?? null) }),
642
+ options: [...j],
643
+ value: j.find((e) => e.id === t.type) ?? null
644
+ }),
645
+ /* @__PURE__ */ y(g, {
646
+ checked: t.required,
647
+ disabled: o,
648
+ label: "必填",
649
+ onChange: (e) => m(n, { required: e.target.checked })
650
+ }),
651
+ /* @__PURE__ */ y(s, {
652
+ disabled: o,
653
+ icon: C,
654
+ iconType: "icon-only",
655
+ onClick: () => f({ parameters: e.parameters.filter((e, t) => t !== n) }),
656
+ variant: "destructive-text-link",
657
+ children: "移除參數"
658
+ })
659
+ ]
660
+ }, n)),
661
+ o ? null : /* @__PURE__ */ y("div", { children: /* @__PURE__ */ y(s, {
662
+ icon: S,
663
+ iconType: "leading",
664
+ onClick: () => f({ parameters: [...e.parameters, {
665
+ description: "",
666
+ key: "",
667
+ label: "",
668
+ required: !1,
669
+ type: "string"
670
+ }] }),
671
+ variant: "base-dashed",
672
+ children: "新增參數"
673
+ }) })
674
+ ]
675
+ })
676
+ });
677
+ }
678
+ function P(e, t) {
679
+ return {
680
+ deprecated: e.deprecated,
681
+ description: e.description ?? "",
682
+ endpointId: t === "edit" ? e.id : null,
683
+ headers: [],
684
+ key: e.key,
685
+ label: e.label,
686
+ method: e.method,
687
+ mode: t,
688
+ originalUrl: e.url,
689
+ parameters: e.parameters.map((e) => ({
690
+ description: e.description ?? "",
691
+ key: e.key,
692
+ label: e.label,
693
+ required: e.required,
694
+ type: e.type
695
+ })),
696
+ replaceHeaders: t === "version",
697
+ signingSecret: "",
698
+ timeoutMs: e.timeoutMs ? String(e.timeoutMs) : "",
699
+ url: e.url,
700
+ version: String(t === "version" ? e.version + 1 : e.version)
701
+ };
702
+ }
703
+ function F(e, t) {
704
+ if (t.ok) return `測試送出成功:「${e.label}」回應 HTTP ${t.status ?? ""}。`;
705
+ throw Error(`測試送出失敗:「${e.label}」${t.status ? `回應 HTTP ${t.status}` : ""}(${t.errorCode ?? "未知錯誤"})${t.errorDetail ? `:${t.errorDetail}` : ""}`);
706
+ }
707
+ function I(e) {
708
+ if (e.mode !== "edit") return !1;
709
+ let t = (e) => {
710
+ try {
711
+ return new URL(e.trim()).origin;
712
+ } catch {
713
+ return e.trim();
714
+ }
715
+ };
716
+ return t(e.url) !== t(e.originalUrl);
717
+ }
718
+ function L(e) {
719
+ return j.some((t) => t.id === e) ? e : "string";
720
+ }
721
+ function R(e) {
722
+ if (!(e instanceof Error)) return "發生未知錯誤";
723
+ let t = e.message;
724
+ return t.includes("WORKFLOW_WEBHOOK_URL_NOT_ALLOWED") ? "URL 不在伺服器允許的白名單內。" : t.includes("WORKFLOW_WEBHOOK_ENDPOINT_KEY_CONFLICT") ? "這個 Key 已由程式註冊的端點使用,請換一個。" : t.includes("WORKFLOW_WEBHOOK_ENDPOINT_CONTRACT_CHANGED") ? "參數契約不能修改,請改用「建立新版本」。" : t.includes("WORKFLOW_WEBHOOK_TEST_RATE_LIMITED") ? "測試送出太頻繁,請稍後再試(每 10 秒一次、10 分鐘最多 5 次)。" : t;
725
+ }
726
+ //#endregion
727
+ export { N as AdminWebhookEndpointsView };
728
+
729
+ //# sourceMappingURL=index.js.map