@kong-ui-public/entities-plugins 9.258.5 → 9.259.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.
- package/dist/entities-plugins.es.js +6139 -6084
- package/dist/entities-plugins.umd.js +74 -74
- package/dist/freeform/index.js +955 -954
- package/dist/freeform/style.css +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components/free-form/plugins/acl/ACLModeCard.vue.d.ts.map +1 -1
- package/dist/types/components/free-form/shared/ArrayField.vue.d.ts +4 -0
- package/dist/types/components/free-form/shared/ArrayField.vue.d.ts.map +1 -1
- package/package.json +6 -6
package/dist/freeform/index.js
CHANGED
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { toValue as
|
|
2
|
-
import { marked as
|
|
3
|
-
import
|
|
4
|
-
import { get as tt, uniqueId as at, isEqual as fe, omit as
|
|
5
|
-
import { createInjectionState as
|
|
1
|
+
import { toValue as V, computed as w, ref as se, watch as ae, onBeforeUnmount as _t, reactive as Xe, toRef as j, useSlots as we, provide as Ie, inject as Ae, toRaw as Qe, onUnmounted as wt, defineComponent as N, useAttrs as ye, openBlock as _, createBlock as L, unref as o, mergeProps as H, createSlots as Y, renderList as re, withCtx as K, renderSlot as O, normalizeProps as Fe, guardReactiveProps as Ze, createPropsRestProxy as le, resolveComponent as U, withDirectives as X, createElementBlock as E, createVNode as $, createElementVNode as B, resolveDynamicComponent as oe, createCommentVNode as z, Fragment as te, vShow as Q, useCssVars as At, useTemplateRef as et, normalizeClass as Ce, createTextVNode as pe, toDisplayString as de, withModifiers as Te, nextTick as Me, Transition as kt, useId as St, useModel as Re, onBeforeMount as Ct, mergeModels as $e, withKeys as Ne } from "vue";
|
|
2
|
+
import { marked as Tt } from "marked";
|
|
3
|
+
import It from "dompurify";
|
|
4
|
+
import { get as tt, uniqueId as at, isEqual as fe, omit as Pt, cloneDeep as ze, isFunction as He, set as Lt, upperFirst as qt } from "lodash-es";
|
|
5
|
+
import { createInjectionState as xt } from "@vueuse/core";
|
|
6
6
|
import { AUTOFILL_SLOT as nt } from "@kong-ui-public/forms";
|
|
7
7
|
import { createI18n as it, i18nTComponent as ot } from "@kong-ui-public/i18n";
|
|
8
|
-
import { KTextArea as
|
|
9
|
-
import { AddIcon as
|
|
10
|
-
import { KUI_ICON_SIZE_30 as
|
|
11
|
-
function
|
|
8
|
+
import { KTextArea as Kt, KInput as Mt, KCheckbox as Rt, KCard as Ee, KLabel as $t, KMultiselect as Et, KSelect as jt, KInputSwitch as Vt } from "@kong/kongponents";
|
|
9
|
+
import { AddIcon as je, CloseIcon as rt, TrashIcon as Ot, ChevronRightIcon as Dt } from "@kong/icons";
|
|
10
|
+
import { KUI_ICON_SIZE_30 as Ft } from "@kong/design-tokens";
|
|
11
|
+
function Ut(e) {
|
|
12
12
|
return e.map((r) => ({ value: r, label: `${r}` }));
|
|
13
13
|
}
|
|
14
14
|
const Ue = "*", Be = "#", ce = "$", Pe = ".";
|
|
15
15
|
function R(...e) {
|
|
16
16
|
return e.join(Pe);
|
|
17
17
|
}
|
|
18
|
-
function
|
|
18
|
+
function Ve(...e) {
|
|
19
19
|
return R(ce, ...e);
|
|
20
20
|
}
|
|
21
21
|
function We(e) {
|
|
22
22
|
return e.startsWith(R(ce, ""));
|
|
23
23
|
}
|
|
24
|
-
function
|
|
24
|
+
function ee(e) {
|
|
25
25
|
return e.split(Pe).filter((r) => r !== "");
|
|
26
26
|
}
|
|
27
27
|
function me(e) {
|
|
28
|
-
const r =
|
|
28
|
+
const r = ee(e);
|
|
29
29
|
return r[r.length - 1];
|
|
30
30
|
}
|
|
31
31
|
function st(e, r, t, a = "") {
|
|
32
32
|
if (e == null || typeof e != "object") return;
|
|
33
|
-
const s = Array.isArray(e) ? e.map((n,
|
|
33
|
+
const s = Array.isArray(e) ? e.map((n, u) => String(u)) : Object.keys(e);
|
|
34
34
|
for (const n of s) {
|
|
35
|
-
const
|
|
36
|
-
r(
|
|
35
|
+
const u = a ? R(a, n) : n;
|
|
36
|
+
r(u) ? e[n] = t(u) : st(e[n], r, t, u);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
function
|
|
40
|
-
const r =
|
|
39
|
+
function Bt(e) {
|
|
40
|
+
const r = V(e);
|
|
41
41
|
return r ? r.type === "set" && r.elements.type === "string" && !r.elements.one_of : !1;
|
|
42
42
|
}
|
|
43
43
|
function lt(e, r) {
|
|
44
44
|
return [...e].sort((t, a) => {
|
|
45
|
-
const s = Object.keys(t)[0], n = Object.keys(a)[0],
|
|
46
|
-
return
|
|
45
|
+
const s = Object.keys(t)[0], n = Object.keys(a)[0], u = r.indexOf(s), d = r.indexOf(n);
|
|
46
|
+
return u === -1 && d === -1 ? 0 : u === -1 ? 1 : d === -1 ? -1 : u - d;
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
function ut(e, r) {
|
|
50
50
|
const t = /* @__PURE__ */ new Map();
|
|
51
51
|
e.forEach((i) => {
|
|
52
|
-
const
|
|
53
|
-
t.set(
|
|
52
|
+
const m = Object.keys(i)[0];
|
|
53
|
+
t.set(m, i);
|
|
54
54
|
});
|
|
55
55
|
const a = /* @__PURE__ */ new Map();
|
|
56
|
-
r.forEach((i,
|
|
56
|
+
r.forEach((i, m) => {
|
|
57
57
|
i.forEach((h, l) => {
|
|
58
|
-
a.has(h) || a.set(h, []), a.get(h).push({ bundleIndex:
|
|
58
|
+
a.has(h) || a.set(h, []), a.get(h).push({ bundleIndex: m, position: l });
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
-
const s = /* @__PURE__ */ new Set(), n = [],
|
|
62
|
-
const
|
|
63
|
-
if (!
|
|
64
|
-
for (const { bundleIndex: h, position: l } of
|
|
65
|
-
const
|
|
66
|
-
for (let
|
|
67
|
-
const
|
|
68
|
-
if (t.has(
|
|
61
|
+
const s = /* @__PURE__ */ new Set(), n = [], u = /* @__PURE__ */ new Set(), d = (i) => {
|
|
62
|
+
const m = a.get(i);
|
|
63
|
+
if (!m) return !0;
|
|
64
|
+
for (const { bundleIndex: h, position: l } of m) {
|
|
65
|
+
const c = r[h];
|
|
66
|
+
for (let p = 0; p < l; p++) {
|
|
67
|
+
const b = c[p];
|
|
68
|
+
if (t.has(b) && !s.has(b))
|
|
69
69
|
return !1;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
return !0;
|
|
73
73
|
}, f = (i) => {
|
|
74
74
|
if (s.has(i)) return;
|
|
75
|
-
const
|
|
76
|
-
if (!
|
|
77
|
-
n.push(
|
|
75
|
+
const m = t.get(i);
|
|
76
|
+
if (!m) return;
|
|
77
|
+
n.push(m), s.add(i), u.delete(i);
|
|
78
78
|
const h = a.get(i);
|
|
79
79
|
if (h)
|
|
80
|
-
for (const { bundleIndex:
|
|
81
|
-
const
|
|
82
|
-
for (let
|
|
83
|
-
const
|
|
84
|
-
if (!s.has(
|
|
85
|
-
const
|
|
86
|
-
|
|
80
|
+
for (const { bundleIndex: c, position: p } of h) {
|
|
81
|
+
const b = r[c];
|
|
82
|
+
for (let A = p + 1; A < b.length; A++) {
|
|
83
|
+
const q = b[A];
|
|
84
|
+
if (!s.has(q)) {
|
|
85
|
+
const P = t.get(q);
|
|
86
|
+
P && (n.push(P), s.add(q), u.delete(q));
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
const l = Array.from(
|
|
91
|
-
for (const
|
|
92
|
-
d(
|
|
90
|
+
const l = Array.from(u);
|
|
91
|
+
for (const c of l)
|
|
92
|
+
d(c) && f(c);
|
|
93
93
|
};
|
|
94
94
|
for (const i of e) {
|
|
95
|
-
const
|
|
96
|
-
s.has(
|
|
95
|
+
const m = Object.keys(i)[0];
|
|
96
|
+
s.has(m) || (d(m) ? f(m) : u.add(m));
|
|
97
97
|
}
|
|
98
98
|
return n;
|
|
99
99
|
}
|
|
100
|
-
function
|
|
101
|
-
const r =
|
|
100
|
+
function Nt(e) {
|
|
101
|
+
const r = ee(e);
|
|
102
102
|
let t = { parent: null };
|
|
103
103
|
for (r.pop(); r.length; ) {
|
|
104
104
|
const a = r.shift();
|
|
@@ -107,145 +107,145 @@ function Bt(e) {
|
|
|
107
107
|
return t;
|
|
108
108
|
}
|
|
109
109
|
function ct(e) {
|
|
110
|
-
return
|
|
110
|
+
return w(() => Nt(V(e)));
|
|
111
111
|
}
|
|
112
|
-
const Ge = /* @__PURE__ */ Symbol("free-form-field-path"), Oe = /* @__PURE__ */ Symbol("free-form-field-renderer-slots"), Je = /* @__PURE__ */ Symbol("free-form-field-reset-label-path-setting"), ke = "free-form-field-renderers-slot",
|
|
112
|
+
const Ge = /* @__PURE__ */ Symbol("free-form-field-path"), Oe = /* @__PURE__ */ Symbol("free-form-field-renderer-slots"), Je = /* @__PURE__ */ Symbol("free-form-field-reset-label-path-setting"), ke = "free-form-field-renderers-slot", zt = {
|
|
113
113
|
tooltipAttributes: {
|
|
114
114
|
maxWidth: "300px",
|
|
115
115
|
placement: "top"
|
|
116
116
|
}
|
|
117
117
|
};
|
|
118
|
-
function
|
|
118
|
+
function Ht(e, r = "") {
|
|
119
119
|
const t = {}, a = e;
|
|
120
|
-
return Array.isArray(a.fields) ? Object.assign(t,
|
|
120
|
+
return Array.isArray(a.fields) ? Object.assign(t, Le(a, r)) : e.type === "array" && e.elements ? Object.assign(t, qe(e, r)) : e.type === "map" && e.values && Object.assign(t, xe(e, r)), t;
|
|
121
121
|
}
|
|
122
|
-
function
|
|
122
|
+
function Le(e, r = "") {
|
|
123
123
|
const t = {};
|
|
124
124
|
if (Array.isArray(e.fields))
|
|
125
125
|
for (const a of e.fields) {
|
|
126
|
-
const s = Object.keys(a)[0], n = a[s],
|
|
127
|
-
if (t[
|
|
128
|
-
const d =
|
|
126
|
+
const s = Object.keys(a)[0], n = a[s], u = r ? R(r, s) : s;
|
|
127
|
+
if (t[u] = n, n.type === "record" && Array.isArray(n.fields)) {
|
|
128
|
+
const d = Le(n, u);
|
|
129
129
|
Object.assign(t, d);
|
|
130
130
|
} else if (n.type === "array" && n.elements) {
|
|
131
|
-
const d =
|
|
131
|
+
const d = qe(n, u);
|
|
132
132
|
Object.assign(t, d);
|
|
133
133
|
} else if (n.type === "map" && n.values) {
|
|
134
|
-
const d =
|
|
134
|
+
const d = xe(n, u);
|
|
135
135
|
Object.assign(t, d);
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
return t;
|
|
139
139
|
}
|
|
140
|
-
function
|
|
140
|
+
function qe(e, r = "") {
|
|
141
141
|
const t = {};
|
|
142
142
|
if (e.elements) {
|
|
143
143
|
let a = e.elements;
|
|
144
144
|
const s = R(r, Ue);
|
|
145
145
|
if (e.encrypted && a.type === "string" && (a = { ...a, encrypted: !0 }), t[s] = a, a.type === "record" && Array.isArray(a.fields)) {
|
|
146
|
-
const n =
|
|
146
|
+
const n = Le(a, s);
|
|
147
147
|
Object.assign(t, n);
|
|
148
148
|
} else if (a.type === "array" && a.elements) {
|
|
149
|
-
const n =
|
|
149
|
+
const n = qe(a, s);
|
|
150
150
|
Object.assign(t, n);
|
|
151
151
|
} else if (a.type === "map" && a.values) {
|
|
152
|
-
const n =
|
|
152
|
+
const n = xe(a, s);
|
|
153
153
|
Object.assign(t, n);
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
return t;
|
|
157
157
|
}
|
|
158
|
-
function
|
|
158
|
+
function xe(e, r = "") {
|
|
159
159
|
const t = {}, a = R(r, Be);
|
|
160
160
|
if (t[a] = e.values, e.values.type === "record" && Array.isArray(e.values.fields)) {
|
|
161
|
-
const s =
|
|
161
|
+
const s = Le(e.values, a);
|
|
162
162
|
Object.assign(t, s);
|
|
163
163
|
} else if ((e.values.type === "array" || e.values.type === "set") && e.values.elements) {
|
|
164
|
-
const s =
|
|
164
|
+
const s = qe(e.values, a);
|
|
165
165
|
Object.assign(t, s);
|
|
166
166
|
} else if (e.values.type === "map" && e.values.values) {
|
|
167
|
-
const s =
|
|
167
|
+
const s = xe(e.values, a);
|
|
168
168
|
Object.assign(t, s);
|
|
169
169
|
}
|
|
170
170
|
return t;
|
|
171
171
|
}
|
|
172
172
|
function he(e, r) {
|
|
173
|
-
const t =
|
|
173
|
+
const t = ee(e), a = [];
|
|
174
174
|
for (let s = 0; s < t.length; s++) {
|
|
175
|
-
const n = t[s],
|
|
175
|
+
const n = t[s], u = a.length > 0 ? R(...a) : "", d = u ? r[u] : void 0;
|
|
176
176
|
d?.type === "map" ? a.push(Be) : d?.type === "array" ? a.push(Ue) : a.push(n);
|
|
177
177
|
}
|
|
178
178
|
return R(...a);
|
|
179
179
|
}
|
|
180
|
-
function
|
|
181
|
-
const r =
|
|
180
|
+
function Wt(e) {
|
|
181
|
+
const r = V(e), t = w(() => r ? Ht(r) : {});
|
|
182
182
|
function a(l) {
|
|
183
183
|
if (l) {
|
|
184
|
-
let
|
|
185
|
-
return
|
|
184
|
+
let c = he(l, t.value || {});
|
|
185
|
+
return c.startsWith(`${ce}${Pe}`) && (c = c.slice(2)), t.value?.[c];
|
|
186
186
|
}
|
|
187
187
|
return r;
|
|
188
188
|
}
|
|
189
|
-
function s(l,
|
|
190
|
-
const
|
|
191
|
-
if (!
|
|
189
|
+
function s(l, c = !1) {
|
|
190
|
+
const p = a(l);
|
|
191
|
+
if (!p)
|
|
192
192
|
return null;
|
|
193
|
-
if (
|
|
194
|
-
return
|
|
195
|
-
if (!
|
|
196
|
-
return
|
|
193
|
+
if (p.default !== void 0)
|
|
194
|
+
return p.default;
|
|
195
|
+
if (!p.auto)
|
|
196
|
+
return c || p.required ? p.type === "record" ? n(p, l) : p.type === "array" ? [] : p.type === "map" ? {} : null : null;
|
|
197
197
|
}
|
|
198
|
-
function n(l,
|
|
199
|
-
const
|
|
198
|
+
function n(l, c) {
|
|
199
|
+
const p = {};
|
|
200
200
|
if (Array.isArray(l.fields))
|
|
201
|
-
for (const
|
|
202
|
-
const
|
|
203
|
-
|
|
201
|
+
for (const b of l.fields) {
|
|
202
|
+
const A = Object.keys(b)[0], q = c ? `${c}.${A}` : A, P = s(q, !1);
|
|
203
|
+
P !== void 0 && (p[A] = P);
|
|
204
204
|
}
|
|
205
|
-
return
|
|
205
|
+
return p;
|
|
206
206
|
}
|
|
207
|
-
function
|
|
207
|
+
function u(l) {
|
|
208
208
|
return l ? s(l, !0) : n(a(), "");
|
|
209
209
|
}
|
|
210
210
|
function d(l) {
|
|
211
|
-
const
|
|
211
|
+
const c = a(l), p = c?.description ? It.sanitize(Tt.parse(c.description, { async: !1 })) : void 0;
|
|
212
212
|
return {
|
|
213
|
-
...
|
|
213
|
+
...zt,
|
|
214
214
|
"data-testid": `ff-label-${l}`,
|
|
215
|
-
info:
|
|
215
|
+
info: p
|
|
216
216
|
};
|
|
217
217
|
}
|
|
218
218
|
function f(l) {
|
|
219
|
-
const
|
|
220
|
-
return
|
|
219
|
+
const c = a(l);
|
|
220
|
+
return Ut(c?.one_of || c.elements?.one_of || []);
|
|
221
221
|
}
|
|
222
222
|
function i(l) {
|
|
223
|
-
const
|
|
224
|
-
let
|
|
225
|
-
if (
|
|
226
|
-
|
|
223
|
+
const c = a(l), p = c?.default;
|
|
224
|
+
let b = null;
|
|
225
|
+
if (c?.type === "foreign" && p?.id)
|
|
226
|
+
b = p.id;
|
|
227
227
|
else {
|
|
228
|
-
if (
|
|
228
|
+
if (p == null || typeof p == "object" || p === "")
|
|
229
229
|
return null;
|
|
230
|
-
if (Array.isArray(
|
|
231
|
-
if (
|
|
230
|
+
if (Array.isArray(p)) {
|
|
231
|
+
if (p.length === 0)
|
|
232
232
|
return null;
|
|
233
|
-
|
|
233
|
+
b = p.join(", ");
|
|
234
234
|
} else
|
|
235
|
-
|
|
235
|
+
b = p.toString();
|
|
236
236
|
}
|
|
237
|
-
return `Default: ${
|
|
237
|
+
return `Default: ${b}`;
|
|
238
238
|
}
|
|
239
|
-
function
|
|
239
|
+
function m() {
|
|
240
240
|
return t.value;
|
|
241
241
|
}
|
|
242
242
|
function h(l) {
|
|
243
|
-
return a(l)?.required ?
|
|
243
|
+
return a(l)?.required ? u(l) : null;
|
|
244
244
|
}
|
|
245
245
|
return {
|
|
246
|
-
getSchemaMap:
|
|
246
|
+
getSchemaMap: m,
|
|
247
247
|
getSchema: a,
|
|
248
|
-
getDefault:
|
|
248
|
+
getDefault: u,
|
|
249
249
|
getSelectItems: f,
|
|
250
250
|
getLabelAttributes: d,
|
|
251
251
|
getPlaceholder: i,
|
|
@@ -256,233 +256,233 @@ const De = /* @__PURE__ */ Symbol("ff-render-rule-exact-match");
|
|
|
256
256
|
function jn(e) {
|
|
257
257
|
return { [De]: e };
|
|
258
258
|
}
|
|
259
|
-
function
|
|
259
|
+
function Gt(e, r) {
|
|
260
260
|
return typeof r == "object" && r !== null && De in r ? fe(e, r[De]) : Array.isArray(r) ? r.some((a) => fe(e, a)) : fe(e, r);
|
|
261
261
|
}
|
|
262
|
-
function
|
|
262
|
+
function Jt(e, r) {
|
|
263
263
|
const t = se({}), a = se({});
|
|
264
|
-
function s(g,
|
|
265
|
-
a.value[g] = { ...a.value[g], [
|
|
264
|
+
function s(g, k, v) {
|
|
265
|
+
a.value[g] = { ...a.value[g], [k]: v ? [...v] : [] };
|
|
266
266
|
}
|
|
267
|
-
function n(g,
|
|
267
|
+
function n(g, k) {
|
|
268
268
|
const v = a.value[g];
|
|
269
|
-
if (!v || !(
|
|
270
|
-
const
|
|
271
|
-
delete
|
|
269
|
+
if (!v || !(k in v)) return;
|
|
270
|
+
const S = { ...v };
|
|
271
|
+
delete S[k], Object.keys(S).length ? a.value[g] = S : delete a.value[g];
|
|
272
272
|
}
|
|
273
|
-
function
|
|
274
|
-
const v = g.map((T) =>
|
|
275
|
-
if (!v.every((T) => T ===
|
|
276
|
-
const T = g.map((
|
|
273
|
+
function u(g, k) {
|
|
274
|
+
const v = g.map((T) => ee(T).length), S = v[0];
|
|
275
|
+
if (!v.every((T) => T === S)) {
|
|
276
|
+
const T = g.map((M, I) => ` - '${M}' is at level ${v[I]}`).join(`
|
|
277
277
|
`);
|
|
278
278
|
throw new Error(
|
|
279
|
-
`${
|
|
279
|
+
`${k}: Fields must be at the same level. Found mixed levels:
|
|
280
280
|
${T}`
|
|
281
281
|
);
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
function d(g) {
|
|
285
|
-
for (const [
|
|
285
|
+
for (const [k, v] of Object.entries(g)) {
|
|
286
286
|
if (!v.bundles) continue;
|
|
287
287
|
for (const T of v.bundles)
|
|
288
288
|
if (new Set(T).size !== T.length) {
|
|
289
|
-
const
|
|
289
|
+
const I = T.filter((x, C) => T.indexOf(x) !== C);
|
|
290
290
|
throw new Error(
|
|
291
|
-
`Self-cycle detected in bundle: field '${
|
|
291
|
+
`Self-cycle detected in bundle: field '${I[0]}' appears multiple times in [${T.join(", ")}]`
|
|
292
292
|
);
|
|
293
293
|
}
|
|
294
|
-
const
|
|
294
|
+
const S = /* @__PURE__ */ new Map();
|
|
295
295
|
for (const T of v.bundles)
|
|
296
|
-
for (let
|
|
297
|
-
const
|
|
298
|
-
|
|
296
|
+
for (let M = 1; M < T.length; M++) {
|
|
297
|
+
const I = T[M], x = T[M - 1];
|
|
298
|
+
S.has(I) || S.set(I, /* @__PURE__ */ new Set()), S.get(I).add(x);
|
|
299
299
|
}
|
|
300
|
-
for (const T of
|
|
301
|
-
let
|
|
302
|
-
if (
|
|
303
|
-
const
|
|
300
|
+
for (const T of S.keys()) {
|
|
301
|
+
let M = function(C) {
|
|
302
|
+
if (x.includes(C)) {
|
|
303
|
+
const D = [...x, C].join(" -> ");
|
|
304
304
|
throw new Error(
|
|
305
|
-
`Circular bundle detected in path '${
|
|
306
|
-
${
|
|
305
|
+
`Circular bundle detected in path '${k}':
|
|
306
|
+
${D}`
|
|
307
307
|
);
|
|
308
308
|
}
|
|
309
|
-
if (
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
if (
|
|
313
|
-
for (const
|
|
314
|
-
|
|
315
|
-
|
|
309
|
+
if (I.has(C)) return;
|
|
310
|
+
I.add(C), x.push(C);
|
|
311
|
+
const y = S.get(C);
|
|
312
|
+
if (y)
|
|
313
|
+
for (const D of y)
|
|
314
|
+
M(D);
|
|
315
|
+
x.pop();
|
|
316
316
|
};
|
|
317
|
-
const
|
|
318
|
-
|
|
317
|
+
const I = /* @__PURE__ */ new Set(), x = [];
|
|
318
|
+
M(T);
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
321
|
}
|
|
322
322
|
function f(g) {
|
|
323
|
-
for (const [
|
|
323
|
+
for (const [k, v] of Object.entries(g))
|
|
324
324
|
if (v.dependencies)
|
|
325
|
-
for (const
|
|
326
|
-
let T = function(
|
|
327
|
-
if (
|
|
328
|
-
const
|
|
325
|
+
for (const S of Object.keys(v.dependencies)) {
|
|
326
|
+
let T = function(x) {
|
|
327
|
+
if (I.includes(x)) {
|
|
328
|
+
const y = [...I, x].join(" -> ");
|
|
329
329
|
throw new Error(
|
|
330
|
-
`Circular dependency detected in path '${
|
|
331
|
-
${
|
|
330
|
+
`Circular dependency detected in path '${k}':
|
|
331
|
+
${y}`
|
|
332
332
|
);
|
|
333
333
|
}
|
|
334
|
-
if (
|
|
335
|
-
|
|
336
|
-
const
|
|
337
|
-
if (
|
|
338
|
-
const [
|
|
339
|
-
v.dependencies[
|
|
334
|
+
if (M.has(x)) return;
|
|
335
|
+
M.add(x), I.push(x);
|
|
336
|
+
const C = v.dependencies[x];
|
|
337
|
+
if (C) {
|
|
338
|
+
const [y] = C;
|
|
339
|
+
v.dependencies[y] && T(y);
|
|
340
340
|
}
|
|
341
|
-
|
|
341
|
+
I.pop();
|
|
342
342
|
};
|
|
343
|
-
const
|
|
344
|
-
T(
|
|
343
|
+
const M = /* @__PURE__ */ new Set(), I = [];
|
|
344
|
+
T(S);
|
|
345
345
|
}
|
|
346
346
|
}
|
|
347
|
-
function i(g,
|
|
348
|
-
const v = g.map((T) =>
|
|
349
|
-
return
|
|
347
|
+
function i(g, k) {
|
|
348
|
+
const v = g.map((T) => k ? R(k, T) : T), S = ee(v[0]);
|
|
349
|
+
return S.pop(), R(...S);
|
|
350
350
|
}
|
|
351
|
-
function
|
|
352
|
-
if (!
|
|
353
|
-
const v = `${
|
|
351
|
+
function m(g, k) {
|
|
352
|
+
if (!k) return g;
|
|
353
|
+
const v = `${k}${Pe}`;
|
|
354
354
|
return g.startsWith(v) ? g.slice(v.length) : g;
|
|
355
355
|
}
|
|
356
356
|
function h(g) {
|
|
357
|
-
const
|
|
358
|
-
return
|
|
357
|
+
const k = ee(g);
|
|
358
|
+
return k.pop(), R(...k);
|
|
359
359
|
}
|
|
360
360
|
function l() {
|
|
361
361
|
const g = {};
|
|
362
|
-
for (const [
|
|
363
|
-
const
|
|
362
|
+
for (const [k, v] of Object.entries(t.value)) {
|
|
363
|
+
const S = k === ce ? "" : k;
|
|
364
364
|
if (v.bundles)
|
|
365
365
|
for (const T of v.bundles) {
|
|
366
366
|
if (T.length < 2)
|
|
367
367
|
throw new Error(
|
|
368
368
|
`Bundle must contain at least 2 fields. Found ${T.length} field(s) in bundle: [${T.join(", ")}]`
|
|
369
369
|
);
|
|
370
|
-
const
|
|
371
|
-
|
|
372
|
-
const
|
|
373
|
-
g[
|
|
374
|
-
const
|
|
375
|
-
g[
|
|
370
|
+
const M = T.map((C) => S ? R(S, C) : C);
|
|
371
|
+
u(M, `Bundle [${T.join(", ")}]`);
|
|
372
|
+
const I = i(T, S) || ce;
|
|
373
|
+
g[I] || (g[I] = {}), g[I].bundles || (g[I].bundles = []);
|
|
374
|
+
const x = M.map((C) => m(C, I));
|
|
375
|
+
g[I].bundles.push(x);
|
|
376
376
|
}
|
|
377
377
|
if (v.dependencies)
|
|
378
|
-
for (const [T, [
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
[
|
|
382
|
-
`Dependency '${T}' -> '${
|
|
378
|
+
for (const [T, [M, I]] of Object.entries(v.dependencies)) {
|
|
379
|
+
const x = S ? R(S, T) : T, C = S ? R(S, M) : M;
|
|
380
|
+
u(
|
|
381
|
+
[x, C],
|
|
382
|
+
`Dependency '${T}' -> '${M}'`
|
|
383
383
|
);
|
|
384
|
-
const
|
|
385
|
-
g[
|
|
386
|
-
const
|
|
387
|
-
g[
|
|
384
|
+
const y = h(x) || ce;
|
|
385
|
+
g[y] || (g[y] = {}), g[y].dependencies || (g[y].dependencies = {});
|
|
386
|
+
const D = m(x, y), W = m(C, y);
|
|
387
|
+
g[y].dependencies[D] = [W, I];
|
|
388
388
|
}
|
|
389
389
|
}
|
|
390
390
|
return d(g), f(g), g;
|
|
391
391
|
}
|
|
392
|
-
const
|
|
392
|
+
const c = w(() => {
|
|
393
393
|
try {
|
|
394
394
|
return l();
|
|
395
395
|
} catch (g) {
|
|
396
396
|
return console.error("Invalid render rules:", g instanceof Error ? g.message : String(g)), {};
|
|
397
397
|
}
|
|
398
398
|
});
|
|
399
|
-
function
|
|
399
|
+
function p(g) {
|
|
400
400
|
if (!g)
|
|
401
|
-
return
|
|
402
|
-
const
|
|
403
|
-
return
|
|
401
|
+
return c.value;
|
|
402
|
+
const k = he(g, e());
|
|
403
|
+
return c.value[k];
|
|
404
404
|
}
|
|
405
|
-
function
|
|
406
|
-
let
|
|
407
|
-
return
|
|
408
|
-
if (
|
|
409
|
-
const v =
|
|
405
|
+
function b(g) {
|
|
406
|
+
let k = !1;
|
|
407
|
+
return w(() => {
|
|
408
|
+
if (k) return;
|
|
409
|
+
const v = V(g);
|
|
410
410
|
try {
|
|
411
|
-
return
|
|
412
|
-
} catch (
|
|
413
|
-
|
|
411
|
+
return p(v);
|
|
412
|
+
} catch (S) {
|
|
413
|
+
k = !0, console.error(`Failed to get render rules for path: \`${v}\`,`, S instanceof Error ? S.message : "");
|
|
414
414
|
return;
|
|
415
415
|
}
|
|
416
416
|
});
|
|
417
417
|
}
|
|
418
|
-
const
|
|
419
|
-
() => Object.values(
|
|
418
|
+
const A = w(
|
|
419
|
+
() => Object.values(c.value).some(
|
|
420
420
|
(g) => g.dependencies && Object.keys(g.dependencies).length > 0
|
|
421
421
|
)
|
|
422
422
|
);
|
|
423
|
-
function
|
|
423
|
+
function q(g) {
|
|
424
424
|
const {
|
|
425
|
-
fieldPath:
|
|
425
|
+
fieldPath: k,
|
|
426
426
|
rules: v,
|
|
427
|
-
omittedFields:
|
|
427
|
+
omittedFields: S
|
|
428
428
|
} = g, T = at("omit-");
|
|
429
|
-
|
|
430
|
-
() =>
|
|
431
|
-
() =>
|
|
432
|
-
() =>
|
|
433
|
-
], ([
|
|
434
|
-
|
|
429
|
+
ae([
|
|
430
|
+
() => V(v),
|
|
431
|
+
() => V(k),
|
|
432
|
+
() => V(S)
|
|
433
|
+
], ([I, x, C], [, y]) => {
|
|
434
|
+
I ? t.value[x] = I : delete t.value[x], s(x, T, C), y && y !== x && (delete t.value[y], n(y, T));
|
|
435
435
|
}, { immediate: !0, deep: !0 });
|
|
436
|
-
const
|
|
437
|
-
return
|
|
438
|
-
const
|
|
439
|
-
delete t.value[
|
|
440
|
-
}),
|
|
436
|
+
const M = b(k);
|
|
437
|
+
return _t(() => {
|
|
438
|
+
const I = V(k);
|
|
439
|
+
delete t.value[I], n(I, T);
|
|
440
|
+
}), M;
|
|
441
441
|
}
|
|
442
|
-
function
|
|
443
|
-
const
|
|
444
|
-
if (!
|
|
445
|
-
const v =
|
|
442
|
+
function P(g) {
|
|
443
|
+
const k = ee(g);
|
|
444
|
+
if (!k.length) return !1;
|
|
445
|
+
const v = k[k.length - 1], S = R(...k.slice(0, -1)), T = a.value[S];
|
|
446
446
|
if (T) {
|
|
447
|
-
const
|
|
448
|
-
if (
|
|
447
|
+
const W = Object.values(T);
|
|
448
|
+
if (W.length && W.every((J) => J.includes(v))) return !1;
|
|
449
449
|
}
|
|
450
|
-
const
|
|
451
|
-
if (!
|
|
452
|
-
const [
|
|
453
|
-
return !
|
|
450
|
+
const M = S === "" ? ce : he(S, e()), I = c.value[M]?.dependencies?.[v];
|
|
451
|
+
if (!I) return !1;
|
|
452
|
+
const [x, C] = I, y = S ? R(S, x) : x, D = tt(r(), ee(y));
|
|
453
|
+
return !Gt(D, C);
|
|
454
454
|
}
|
|
455
455
|
return {
|
|
456
|
-
useCurrentRules:
|
|
457
|
-
createComputedRules:
|
|
458
|
-
hasDependencies:
|
|
459
|
-
isFieldHidden:
|
|
456
|
+
useCurrentRules: q,
|
|
457
|
+
createComputedRules: b,
|
|
458
|
+
hasDependencies: A,
|
|
459
|
+
isFieldHidden: P
|
|
460
460
|
};
|
|
461
461
|
}
|
|
462
|
-
let
|
|
463
|
-
function
|
|
464
|
-
return `kid:${++
|
|
462
|
+
let Yt = 0;
|
|
463
|
+
function Xt() {
|
|
464
|
+
return `kid:${++Yt}`;
|
|
465
465
|
}
|
|
466
|
-
function
|
|
466
|
+
function Qt(e) {
|
|
467
467
|
const r = Xe(/* @__PURE__ */ new Map());
|
|
468
468
|
function t(i = "") {
|
|
469
|
-
const
|
|
470
|
-
return r.set(
|
|
469
|
+
const m = Xt();
|
|
470
|
+
return r.set(m, i), m;
|
|
471
471
|
}
|
|
472
472
|
function a(i) {
|
|
473
473
|
return r.get(i);
|
|
474
474
|
}
|
|
475
|
-
function s(i,
|
|
476
|
-
r.has(i) && r.set(i,
|
|
475
|
+
function s(i, m) {
|
|
476
|
+
r.has(i) && r.set(i, m);
|
|
477
477
|
}
|
|
478
478
|
function n(i) {
|
|
479
479
|
r.delete(i);
|
|
480
480
|
}
|
|
481
|
-
function
|
|
482
|
-
return
|
|
481
|
+
function u(i) {
|
|
482
|
+
return Zt(i, e, t);
|
|
483
483
|
}
|
|
484
484
|
function d(i) {
|
|
485
|
-
return
|
|
485
|
+
return ea(i, e, a);
|
|
486
486
|
}
|
|
487
487
|
function f() {
|
|
488
488
|
r.clear();
|
|
@@ -492,25 +492,25 @@ function Xt(e) {
|
|
|
492
492
|
getKey: a,
|
|
493
493
|
updateKey: s,
|
|
494
494
|
deleteKey: n,
|
|
495
|
-
serialize:
|
|
495
|
+
serialize: u,
|
|
496
496
|
deserialize: d,
|
|
497
497
|
clear: f
|
|
498
498
|
};
|
|
499
499
|
}
|
|
500
|
-
function
|
|
500
|
+
function Zt(e, r, t) {
|
|
501
501
|
const a = (s, n) => {
|
|
502
502
|
if (s == null || typeof s != "object")
|
|
503
503
|
return s;
|
|
504
504
|
if (Array.isArray(s))
|
|
505
505
|
return s.map((f, i) => {
|
|
506
|
-
const
|
|
507
|
-
return a(f,
|
|
506
|
+
const m = n ? R(n, `${i}`) : `${i}`;
|
|
507
|
+
return a(f, m);
|
|
508
508
|
});
|
|
509
509
|
if ((n ? r(n) : r())?.type === "map") {
|
|
510
510
|
const f = s, i = {};
|
|
511
|
-
return Object.keys(f).forEach((
|
|
512
|
-
const h = t(
|
|
513
|
-
i[h] = a(l,
|
|
511
|
+
return Object.keys(f).forEach((m) => {
|
|
512
|
+
const h = t(m), l = f[m], c = n ? R(n, m) : m;
|
|
513
|
+
i[h] = a(l, c);
|
|
514
514
|
}), i;
|
|
515
515
|
}
|
|
516
516
|
const d = {};
|
|
@@ -521,25 +521,25 @@ function Qt(e, r, t) {
|
|
|
521
521
|
};
|
|
522
522
|
return a(e);
|
|
523
523
|
}
|
|
524
|
-
function
|
|
524
|
+
function ea(e, r, t) {
|
|
525
525
|
const a = (s, n) => {
|
|
526
526
|
if (s == null || typeof s != "object")
|
|
527
527
|
return s;
|
|
528
528
|
if (Array.isArray(s))
|
|
529
529
|
return s.map((f, i) => {
|
|
530
|
-
const
|
|
531
|
-
return a(f,
|
|
530
|
+
const m = n ? R(n, `${i}`) : `${i}`;
|
|
531
|
+
return a(f, m);
|
|
532
532
|
});
|
|
533
533
|
if ((n ? r(n) : r())?.type === "map") {
|
|
534
534
|
const f = s, i = {};
|
|
535
|
-
return Object.keys(f).forEach((
|
|
536
|
-
const h =
|
|
537
|
-
if (
|
|
535
|
+
return Object.keys(f).forEach((m) => {
|
|
536
|
+
const h = m, l = f[h], c = t(h);
|
|
537
|
+
if (c == null) {
|
|
538
538
|
console.error(`[FreeForm] Missing name for key ID: ${String(h)}`);
|
|
539
539
|
return;
|
|
540
540
|
}
|
|
541
|
-
const
|
|
542
|
-
i[
|
|
541
|
+
const p = c || Be, b = n ? R(n, p) : p;
|
|
542
|
+
i[c] = a(l, b);
|
|
543
543
|
}), i;
|
|
544
544
|
}
|
|
545
545
|
const d = {};
|
|
@@ -550,67 +550,67 @@ function Zt(e, r, t) {
|
|
|
550
550
|
};
|
|
551
551
|
return a(e);
|
|
552
552
|
}
|
|
553
|
-
function
|
|
553
|
+
function ta(e) {
|
|
554
554
|
return /^kid:\d+$/.test(e);
|
|
555
555
|
}
|
|
556
|
-
const [
|
|
556
|
+
const [aa, na] = xt(
|
|
557
557
|
function(r) {
|
|
558
558
|
const {
|
|
559
559
|
schema: t,
|
|
560
560
|
propsData: a,
|
|
561
561
|
onChange: s,
|
|
562
562
|
propsRenderRules: n,
|
|
563
|
-
propsConfig:
|
|
563
|
+
propsConfig: u
|
|
564
564
|
} = r, {
|
|
565
565
|
getDefault: d,
|
|
566
566
|
getEmptyOrDefault: f,
|
|
567
567
|
...i
|
|
568
|
-
} =
|
|
569
|
-
Ie(Oe,
|
|
568
|
+
} = Wt(t), m = Qt(i.getSchema), h = /* @__PURE__ */ new Map(), l = Xe({}), c = j(() => u ?? {}), p = we();
|
|
569
|
+
Ie(Oe, Pt(p, "default", ke));
|
|
570
570
|
const {
|
|
571
|
-
useCurrentRules:
|
|
572
|
-
createComputedRules:
|
|
573
|
-
hasDependencies:
|
|
574
|
-
isFieldHidden:
|
|
575
|
-
} =
|
|
571
|
+
useCurrentRules: b,
|
|
572
|
+
createComputedRules: A,
|
|
573
|
+
hasDependencies: q,
|
|
574
|
+
isFieldHidden: P
|
|
575
|
+
} = Jt(i.getSchemaMap, () => l), g = b({
|
|
576
576
|
fieldPath: ce,
|
|
577
577
|
rules: n
|
|
578
578
|
});
|
|
579
|
-
function
|
|
580
|
-
Object.keys(l).forEach((
|
|
581
|
-
delete l[
|
|
582
|
-
}),
|
|
579
|
+
function k(y) {
|
|
580
|
+
Object.keys(l).forEach((D) => {
|
|
581
|
+
delete l[D];
|
|
582
|
+
}), m.clear(), Object.assign(l, m.serialize(y));
|
|
583
583
|
}
|
|
584
|
-
function v(
|
|
585
|
-
let
|
|
586
|
-
!
|
|
584
|
+
function v(y) {
|
|
585
|
+
let D;
|
|
586
|
+
!y || !S(V(y)) ? D = d() : D = ze(V(y)), He(c.value.prepareFormData) ? k(c.value.prepareFormData(D)) : k(D);
|
|
587
587
|
}
|
|
588
|
-
function
|
|
589
|
-
return He(
|
|
588
|
+
function S(y) {
|
|
589
|
+
return He(c.value.hasValue) ? c.value.hasValue(y) : !!y;
|
|
590
590
|
}
|
|
591
591
|
function T() {
|
|
592
|
-
const
|
|
593
|
-
return
|
|
594
|
-
|
|
595
|
-
|
|
592
|
+
const y = ze(V(l));
|
|
593
|
+
return q.value && st(
|
|
594
|
+
y,
|
|
595
|
+
P,
|
|
596
596
|
f
|
|
597
|
-
),
|
|
597
|
+
), m.deserialize(y);
|
|
598
598
|
}
|
|
599
|
-
|
|
599
|
+
ae(l, () => {
|
|
600
600
|
s?.(T());
|
|
601
601
|
}, { deep: !0 });
|
|
602
|
-
let
|
|
603
|
-
|
|
604
|
-
|
|
602
|
+
let M = !1;
|
|
603
|
+
ae(() => a?.value, (y) => {
|
|
604
|
+
M && fe(T(), V(y)) || (v(y), M = !0);
|
|
605
605
|
}, { deep: !0, immediate: !0 });
|
|
606
|
-
function
|
|
607
|
-
return
|
|
606
|
+
function I(y) {
|
|
607
|
+
return y != null && typeof y == "object" && !Array.isArray(y) ? m.serialize(y) : y;
|
|
608
608
|
}
|
|
609
|
-
function
|
|
610
|
-
return
|
|
609
|
+
function x(y) {
|
|
610
|
+
return I(d(y));
|
|
611
611
|
}
|
|
612
|
-
function
|
|
613
|
-
return
|
|
612
|
+
function C(y) {
|
|
613
|
+
return I(f(y));
|
|
614
614
|
}
|
|
615
615
|
return {
|
|
616
616
|
/**
|
|
@@ -618,70 +618,70 @@ const [ta, aa] = Lt(
|
|
|
618
618
|
*/
|
|
619
619
|
formData: l,
|
|
620
620
|
schema: t,
|
|
621
|
-
config:
|
|
621
|
+
config: c,
|
|
622
622
|
fieldRendererRegistry: h,
|
|
623
|
-
setValue:
|
|
624
|
-
useCurrentRenderRules:
|
|
623
|
+
setValue: k,
|
|
624
|
+
useCurrentRenderRules: b,
|
|
625
625
|
rootRenderRules: g,
|
|
626
|
-
createComputedRenderRules:
|
|
626
|
+
createComputedRenderRules: A,
|
|
627
627
|
...i,
|
|
628
628
|
getValue: T,
|
|
629
|
-
isFieldHidden:
|
|
630
|
-
keyIdMap:
|
|
631
|
-
getDefault:
|
|
632
|
-
getEmptyOrDefault:
|
|
629
|
+
isFieldHidden: P,
|
|
630
|
+
keyIdMap: m,
|
|
631
|
+
getDefault: x,
|
|
632
|
+
getEmptyOrDefault: C
|
|
633
633
|
};
|
|
634
634
|
}
|
|
635
635
|
);
|
|
636
|
-
function
|
|
637
|
-
const e =
|
|
636
|
+
function ne() {
|
|
637
|
+
const e = na();
|
|
638
638
|
if (!e)
|
|
639
639
|
throw new Error("useFormShared() called without provider.");
|
|
640
640
|
return e;
|
|
641
641
|
}
|
|
642
642
|
const dt = (e) => {
|
|
643
|
-
const r = Ae(Ge,
|
|
644
|
-
const a =
|
|
643
|
+
const r = Ae(Ge, w(() => "")), t = w(() => {
|
|
644
|
+
const a = V(e);
|
|
645
645
|
let s = a;
|
|
646
|
-
return !We(a) && r.value && (s = R(r.value, a)), We(a) && (s = s.slice(
|
|
646
|
+
return !We(a) && r.value && (s = R(r.value, a)), We(a) && (s = s.slice(Ve("").length)), s;
|
|
647
647
|
});
|
|
648
648
|
return Ie(Ge, t), t;
|
|
649
|
-
},
|
|
650
|
-
const { getSchema: r, getSchemaMap: t, fieldRendererRegistry: a } =
|
|
651
|
-
const i =
|
|
652
|
-
const
|
|
653
|
-
return { ...l, [
|
|
649
|
+
}, ia = (e) => {
|
|
650
|
+
const { getSchema: r, getSchemaMap: t, fieldRendererRegistry: a } = ne(), { default: s, ...n } = we(), u = Ae(Oe), d = [ke, "item", "label", "tooltip"], f = w(() => {
|
|
651
|
+
const i = V(u), m = t(), h = Object.keys(n).filter((l) => !d.includes(l)).reduce((l, c) => {
|
|
652
|
+
const p = he(R(V(e), c), m);
|
|
653
|
+
return { ...l, [p]: n[c] };
|
|
654
654
|
}, {});
|
|
655
655
|
return i ? { ...i, ...h } : h;
|
|
656
656
|
});
|
|
657
|
-
return Ie(Oe, f),
|
|
657
|
+
return Ie(Oe, f), w(() => {
|
|
658
658
|
if (s) return;
|
|
659
|
-
const i =
|
|
660
|
-
if (
|
|
659
|
+
const i = V(e), m = f.value[he(i, t())];
|
|
660
|
+
if (m) return m;
|
|
661
661
|
const h = t();
|
|
662
|
-
for (const [l,
|
|
663
|
-
const
|
|
664
|
-
if (l({ path: i, genericPath:
|
|
665
|
-
return
|
|
662
|
+
for (const [l, c] of a) {
|
|
663
|
+
const p = he(i, h);
|
|
664
|
+
if (l({ path: i, genericPath: p, schema: r(i) }))
|
|
665
|
+
return c;
|
|
666
666
|
}
|
|
667
667
|
});
|
|
668
668
|
}, _e = "__FREEFORM_SCHEMA_MAP__";
|
|
669
|
-
function
|
|
670
|
-
const { formData: r } =
|
|
669
|
+
function oa(e) {
|
|
670
|
+
const { formData: r } = ne(), t = dt(e);
|
|
671
671
|
return {
|
|
672
|
-
value:
|
|
673
|
-
get: () => tt(r,
|
|
674
|
-
set: (s) =>
|
|
672
|
+
value: w({
|
|
673
|
+
get: () => tt(r, ee(t.value)),
|
|
674
|
+
set: (s) => Lt(r, ee(t.value), s)
|
|
675
675
|
})
|
|
676
676
|
};
|
|
677
677
|
}
|
|
678
|
-
function
|
|
679
|
-
const { getSchema: r, isFieldHidden: t, getEmptyOrDefault: a } =
|
|
678
|
+
function Z(e) {
|
|
679
|
+
const { getSchema: r, isFieldHidden: t, getEmptyOrDefault: a } = ne(), s = dt(e), n = ia(s), { value: u } = oa(e), d = w(() => r(s.value)), f = w(() => t(s.value)), i = w(() => a(s.value));
|
|
680
680
|
return d.value ? {
|
|
681
681
|
schema: d,
|
|
682
682
|
path: s,
|
|
683
683
|
renderer: n,
|
|
684
|
-
value:
|
|
684
|
+
value: u,
|
|
685
685
|
ancestors: ct(s),
|
|
686
686
|
/**
|
|
687
687
|
* Hide the field but keep its state.
|
|
@@ -693,36 +693,36 @@ function Q(e) {
|
|
|
693
693
|
error: new Error(`path '${s.value}' is not found in schema.`)
|
|
694
694
|
};
|
|
695
695
|
}
|
|
696
|
-
function
|
|
696
|
+
function ra(e, r) {
|
|
697
697
|
const t = /* @__PURE__ */ new WeakMap(), a = /* @__PURE__ */ new Map();
|
|
698
698
|
function s() {
|
|
699
699
|
return at(`${e}-`);
|
|
700
700
|
}
|
|
701
|
-
function n(
|
|
702
|
-
if (
|
|
701
|
+
function n(u, d) {
|
|
702
|
+
if (u == null || typeof u != "object")
|
|
703
703
|
return `${e}-${d}`;
|
|
704
|
-
if (t.has(
|
|
705
|
-
return t.get(
|
|
704
|
+
if (t.has(u))
|
|
705
|
+
return t.get(u);
|
|
706
706
|
const f = a.has(d) ? a.get(d) : s();
|
|
707
|
-
return a.set(d, f), t.set(
|
|
707
|
+
return a.set(d, f), t.set(u, f), f;
|
|
708
708
|
}
|
|
709
|
-
return
|
|
710
|
-
const d =
|
|
711
|
-
d.forEach((i,
|
|
712
|
-
f.add(
|
|
709
|
+
return ae(r, (u) => {
|
|
710
|
+
const d = V(u), f = /* @__PURE__ */ new Set();
|
|
711
|
+
d.forEach((i, m) => {
|
|
712
|
+
f.add(m);
|
|
713
713
|
}), Array.from(a.keys()).forEach((i) => {
|
|
714
714
|
f.has(i) || a.delete(i);
|
|
715
715
|
});
|
|
716
716
|
}, { immediate: !0, deep: !0 }), { getKey: n };
|
|
717
717
|
}
|
|
718
718
|
function Vn(e, r) {
|
|
719
|
-
|
|
719
|
+
ae(e, (t) => {
|
|
720
720
|
window[_e] || (window[_e] = {}), window[_e][r] = Qe(t);
|
|
721
|
-
}, { immediate: !0, deep: !0 }),
|
|
721
|
+
}, { immediate: !0, deep: !0 }), wt(() => {
|
|
722
722
|
window[_e] && delete window[_e][r];
|
|
723
723
|
});
|
|
724
724
|
}
|
|
725
|
-
const
|
|
725
|
+
const sa = {
|
|
726
726
|
ip: "IP",
|
|
727
727
|
ssl: "SSL",
|
|
728
728
|
ttl: "TTL",
|
|
@@ -765,127 +765,127 @@ const ra = {
|
|
|
765
765
|
uris: "URIs"
|
|
766
766
|
};
|
|
767
767
|
function pt(e) {
|
|
768
|
-
return
|
|
768
|
+
return sa[e.toLocaleLowerCase()] ?? e;
|
|
769
769
|
}
|
|
770
770
|
function mt(e) {
|
|
771
771
|
return e.split("_").map(pt).join(" ");
|
|
772
772
|
}
|
|
773
|
-
function
|
|
773
|
+
function la(e, r) {
|
|
774
774
|
const t = Ae(Je, {
|
|
775
775
|
parentPath: null,
|
|
776
776
|
isolate: !1
|
|
777
|
-
}), { parentPath: a, isolate: s } =
|
|
777
|
+
}), { parentPath: a, isolate: s } = V(t), n = se(a ? R(a, e) : e), u = se({
|
|
778
778
|
parentPath: n.value,
|
|
779
779
|
isolate: s
|
|
780
780
|
});
|
|
781
|
-
return
|
|
782
|
-
const { parentPath: i, isolate:
|
|
781
|
+
return ae([j(r), j(t)], ([d, f]) => {
|
|
782
|
+
const { parentPath: i, isolate: m } = f, h = i ? R(i, e) : e;
|
|
783
783
|
d ? {
|
|
784
784
|
isolate: () => {
|
|
785
|
-
n.value = e,
|
|
785
|
+
n.value = e, u.value.isolate = !0, u.value.parentPath = null;
|
|
786
786
|
},
|
|
787
787
|
"isolate-children": () => {
|
|
788
|
-
|
|
788
|
+
u.value.isolate = !0, u.value.parentPath = null;
|
|
789
789
|
},
|
|
790
790
|
reset: () => {
|
|
791
|
-
n.value = e,
|
|
791
|
+
n.value = e, u.value.isolate = !1, u.value.parentPath = null;
|
|
792
792
|
},
|
|
793
793
|
"reset-children": () => {
|
|
794
|
-
|
|
794
|
+
u.value.isolate = !1, u.value.parentPath = null;
|
|
795
795
|
},
|
|
796
796
|
inherit: () => {
|
|
797
|
-
n.value = h,
|
|
797
|
+
n.value = h, u.value.isolate = !1, u.value.parentPath = h;
|
|
798
798
|
}
|
|
799
|
-
}[d]?.() :
|
|
800
|
-
}, { deep: !0, immediate: !0 }), Ie(Je,
|
|
799
|
+
}[d]?.() : m && (n.value = e, u.value.isolate = !0, u.value.parentPath = null);
|
|
800
|
+
}, { deep: !0, immediate: !0 }), Ie(Je, u), n;
|
|
801
801
|
}
|
|
802
802
|
function ft(e) {
|
|
803
|
-
return
|
|
803
|
+
return ee(e).map((t) => t.split("_").map(pt).join(" ")).map(qt).join(" › ");
|
|
804
804
|
}
|
|
805
|
-
function
|
|
806
|
-
const t =
|
|
807
|
-
return
|
|
808
|
-
const f =
|
|
809
|
-
if (
|
|
805
|
+
function ua(e, r) {
|
|
806
|
+
const t = V(e), a = me(t), { config: s, getSchema: n } = ne(), u = la(a, r), d = ct(e);
|
|
807
|
+
return w(() => {
|
|
808
|
+
const f = u.value ?? a, i = d.value.parent?.path ? n(d.value.parent.path) : null, m = i?.type === "array", h = i?.type === "map";
|
|
809
|
+
if (m || h)
|
|
810
810
|
return "";
|
|
811
811
|
const l = ft(f);
|
|
812
812
|
return s.value.transformLabel ? s.value.transformLabel(l, t) : l;
|
|
813
813
|
});
|
|
814
814
|
}
|
|
815
|
-
function
|
|
816
|
-
const { getLabelAttributes: t, getPlaceholder: a, getSchema: s } =
|
|
817
|
-
return
|
|
818
|
-
...
|
|
819
|
-
placeholder:
|
|
820
|
-
labelAttributes:
|
|
821
|
-
label:
|
|
822
|
-
required:
|
|
815
|
+
function ie(e, r) {
|
|
816
|
+
const { getLabelAttributes: t, getPlaceholder: a, getSchema: s } = ne(), n = V(e), u = V(r), d = ua(e, j(() => V(r).resetLabelPath));
|
|
817
|
+
return w(() => ({
|
|
818
|
+
...u,
|
|
819
|
+
placeholder: u.placeholder ?? a(n) ?? void 0,
|
|
820
|
+
labelAttributes: u.labelAttributes ?? t(n),
|
|
821
|
+
label: u.label ?? d.value,
|
|
822
|
+
required: u.required ?? s(n)?.required
|
|
823
823
|
}));
|
|
824
824
|
}
|
|
825
|
-
function
|
|
826
|
-
const { value: t, ...a } =
|
|
825
|
+
function ca(e, r) {
|
|
826
|
+
const { value: t, ...a } = Z(e), { getEmptyOrDefault: s, keyIdMap: n } = ne(), u = w(() => {
|
|
827
827
|
if (a.path)
|
|
828
828
|
return a.schema.value.values;
|
|
829
|
-
}), d =
|
|
830
|
-
const
|
|
831
|
-
return [
|
|
829
|
+
}), d = w(() => t ? Object.keys(t.value || {}).map((p) => {
|
|
830
|
+
const b = p, A = n.getKey(b) ?? "";
|
|
831
|
+
return [b, A];
|
|
832
832
|
}) : []);
|
|
833
|
-
function f(
|
|
834
|
-
t && (n.updateKey(
|
|
833
|
+
function f(c, p) {
|
|
834
|
+
t && (n.updateKey(c, p), t.value = { ...t.value });
|
|
835
835
|
}
|
|
836
836
|
function i() {
|
|
837
837
|
if (!t) return;
|
|
838
|
-
const
|
|
838
|
+
const c = n.createKey(), p = s(R(a.path.value, c));
|
|
839
839
|
return t.value = {
|
|
840
840
|
...t.value,
|
|
841
|
-
[
|
|
842
|
-
},
|
|
841
|
+
[c]: p
|
|
842
|
+
}, c;
|
|
843
843
|
}
|
|
844
|
-
function
|
|
845
|
-
if (n.deleteKey(
|
|
846
|
-
const { [
|
|
847
|
-
Object.keys(
|
|
844
|
+
function m(c) {
|
|
845
|
+
if (n.deleteKey(c), !t) return;
|
|
846
|
+
const { [c]: p, ...b } = t.value || {};
|
|
847
|
+
Object.keys(b).length === 0 ? a.schema?.value?.required ? t.value = {} : t.value = null : t.value = b;
|
|
848
848
|
}
|
|
849
|
-
function h(
|
|
850
|
-
return n.getKey(
|
|
849
|
+
function h(c) {
|
|
850
|
+
return n.getKey(c);
|
|
851
851
|
}
|
|
852
|
-
const l =
|
|
852
|
+
const l = w(() => {
|
|
853
853
|
if (!a.path) return "";
|
|
854
|
-
const
|
|
855
|
-
let
|
|
856
|
-
return
|
|
854
|
+
const c = me(a.path.value);
|
|
855
|
+
let p = c;
|
|
856
|
+
return ta(c) && (p = n.getKey(c) ?? ""), mt(p);
|
|
857
857
|
});
|
|
858
|
-
if (r &&
|
|
859
|
-
let
|
|
858
|
+
if (r && u.value?.type === "string") {
|
|
859
|
+
let c = function() {
|
|
860
860
|
if (!t || !t.value) return null;
|
|
861
|
-
const
|
|
862
|
-
for (const [
|
|
863
|
-
const
|
|
864
|
-
|
|
861
|
+
const b = {};
|
|
862
|
+
for (const [A, q] of Object.entries(t.value)) {
|
|
863
|
+
const P = n.getKey(A);
|
|
864
|
+
P && (b[P] = q);
|
|
865
865
|
}
|
|
866
|
-
return
|
|
867
|
-
},
|
|
868
|
-
|
|
869
|
-
const
|
|
870
|
-
fe(
|
|
866
|
+
return b;
|
|
867
|
+
}, p = null;
|
|
868
|
+
ae(() => t?.value, (b) => {
|
|
869
|
+
const A = c();
|
|
870
|
+
fe(p, A) || (p = A, r?.(A));
|
|
871
871
|
}, { deep: !0 });
|
|
872
872
|
}
|
|
873
873
|
return {
|
|
874
874
|
keys: d,
|
|
875
875
|
updateKey: f,
|
|
876
876
|
addKey: i,
|
|
877
|
-
removeKey:
|
|
877
|
+
removeKey: m,
|
|
878
878
|
field: a,
|
|
879
879
|
fieldDisplayName: l,
|
|
880
880
|
getKeyName: h
|
|
881
881
|
};
|
|
882
882
|
}
|
|
883
|
-
const
|
|
884
|
-
actions:
|
|
885
|
-
plugins:
|
|
883
|
+
const da = { add_entity: "Add {entity}", remove_entity: "Remove {entity}" }, pa = { form: { field_rules: { at_least_one_of: "At least one of the following values is required: {parameters}.", mutually_required: "These values must be used together: {parameters}.", mutually_exclusive: "Only one of these values can be used: {parameters}." } }, "free-form": { tag_helper: "Use comma to separate values. eg: value1, value2", foreign_placeholder: "Enter a UUID of {entity}", vault_picker: { component_error: "The vault secret picker is not available" } } }, ma = {
|
|
884
|
+
actions: da,
|
|
885
|
+
plugins: pa
|
|
886
886
|
};
|
|
887
887
|
function ve() {
|
|
888
|
-
const e = it("en-us",
|
|
888
|
+
const e = it("en-us", ma);
|
|
889
889
|
return {
|
|
890
890
|
i18n: e,
|
|
891
891
|
i18nT: ot(e)
|
|
@@ -899,31 +899,31 @@ const be = /* @__PURE__ */ N({
|
|
|
899
899
|
},
|
|
900
900
|
emits: ["update:modelValue"],
|
|
901
901
|
setup(e, { emit: r }) {
|
|
902
|
-
const t = e, a = ye(), s = r, n =
|
|
903
|
-
|
|
902
|
+
const t = e, a = ye(), s = r, n = w(() => t.multiline ? Kt : Mt), u = w(() => a.characterLimit ?? (t.multiline ? !1 : void 0)), d = se(t.modelValue);
|
|
903
|
+
ae(() => t.modelValue, (h) => {
|
|
904
904
|
d.value = h;
|
|
905
905
|
});
|
|
906
|
-
const { config: f } =
|
|
906
|
+
const { config: f } = ne(), i = (h) => {
|
|
907
907
|
h !== d.value && (d.value = h, f.value.updateOnChange || s("update:modelValue", h));
|
|
908
|
-
},
|
|
908
|
+
}, m = () => {
|
|
909
909
|
f.value.updateOnChange && s("update:modelValue", d.value);
|
|
910
910
|
};
|
|
911
|
-
return (h, l) => (
|
|
912
|
-
"character-limit":
|
|
911
|
+
return (h, l) => (_(), L(o(n), H(h.$attrs, {
|
|
912
|
+
"character-limit": u.value,
|
|
913
913
|
"model-value": e.modelValue,
|
|
914
914
|
resizable: e.multiline ? !0 : void 0,
|
|
915
|
-
onChange:
|
|
915
|
+
onChange: m,
|
|
916
916
|
"onUpdate:modelValue": i
|
|
917
|
-
}),
|
|
918
|
-
re(we(), (
|
|
919
|
-
name:
|
|
920
|
-
fn:
|
|
921
|
-
O(h.$slots,
|
|
917
|
+
}), Y({ _: 2 }, [
|
|
918
|
+
re(we(), (c, p) => ({
|
|
919
|
+
name: p,
|
|
920
|
+
fn: K((b) => [
|
|
921
|
+
O(h.$slots, p, Fe(Ze(b)))
|
|
922
922
|
])
|
|
923
923
|
}))
|
|
924
924
|
]), 1040, ["character-limit", "model-value", "resizable"]));
|
|
925
925
|
}
|
|
926
|
-
}),
|
|
926
|
+
}), fa = ["innerHTML"], ha = /* @__PURE__ */ N({
|
|
927
927
|
inheritAttrs: !1,
|
|
928
928
|
__name: "StringField",
|
|
929
929
|
props: {
|
|
@@ -949,89 +949,89 @@ const be = /* @__PURE__ */ N({
|
|
|
949
949
|
},
|
|
950
950
|
emits: ["update:modelValue"],
|
|
951
951
|
setup(e, { emit: r }) {
|
|
952
|
-
const t = ye(), { i18n: a } = ve(), s = le(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), n = r, { value:
|
|
953
|
-
function
|
|
954
|
-
|
|
952
|
+
const t = ye(), { i18n: a } = ve(), s = le(e, ["autofocus", "showVaultSecretPicker", "showPasswordMaskToggle", "name"]), n = r, { value: u, hide: d, ...f } = Z(j(() => e.name)), i = ie(f.path, j({ ...s, ...t }));
|
|
953
|
+
function m(A) {
|
|
954
|
+
u.value = A === "" ? null : A, n("update:modelValue", u.value);
|
|
955
955
|
}
|
|
956
|
-
const h =
|
|
957
|
-
return (
|
|
958
|
-
const
|
|
959
|
-
return f.error ? (
|
|
956
|
+
const h = w(() => e.showPasswordMaskToggle !== void 0 ? e.showPasswordMaskToggle : s.type === "password" ? !0 : !!(f.schema?.value).encrypted), l = Ae(nt, void 0), c = w(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!f.schema.value?.referenceable), p = w(() => ({ referenceable: c.value })), b = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
957
|
+
return (A, q) => {
|
|
958
|
+
const P = U("KAlert");
|
|
959
|
+
return f.error ? (_(), L(P, {
|
|
960
960
|
key: 0,
|
|
961
961
|
appearance: "danger",
|
|
962
962
|
message: f.error.message
|
|
963
|
-
}, null, 8, ["message"])) :
|
|
964
|
-
$(be,
|
|
963
|
+
}, null, 8, ["message"])) : X((_(), E("div", Fe(H({ key: 1 }, A.$attrs)), [
|
|
964
|
+
$(be, H({
|
|
965
965
|
...o(i),
|
|
966
966
|
showPasswordMaskToggle: h.value,
|
|
967
967
|
type: h.value ? "password" : "text"
|
|
968
968
|
}, {
|
|
969
969
|
id: e.inputId,
|
|
970
970
|
class: "ff-string-field",
|
|
971
|
-
"data-1p-ignore":
|
|
971
|
+
"data-1p-ignore": b.value,
|
|
972
972
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
973
973
|
"data-testid": `ff-${f.path.value}`,
|
|
974
974
|
error: e.error,
|
|
975
975
|
"error-message": e.errorMessage,
|
|
976
976
|
help: e.multiline && e.error ? e.errorMessage : e.help,
|
|
977
|
-
"model-value": o(
|
|
977
|
+
"model-value": o(u) ?? "",
|
|
978
978
|
multiline: e.multiline,
|
|
979
979
|
placeholder: e.placeholder ?? o(i).placeholder,
|
|
980
|
-
"onUpdate:modelValue":
|
|
981
|
-
}),
|
|
980
|
+
"onUpdate:modelValue": m
|
|
981
|
+
}), Y({ _: 2 }, [
|
|
982
982
|
o(i).labelAttributes?.info ? {
|
|
983
983
|
name: "label-tooltip",
|
|
984
|
-
fn:
|
|
985
|
-
O(
|
|
984
|
+
fn: K(() => [
|
|
985
|
+
O(A.$slots, "tooltip", {}, () => [
|
|
986
986
|
B("div", {
|
|
987
987
|
innerHTML: o(i).labelAttributes.info
|
|
988
|
-
}, null, 8,
|
|
988
|
+
}, null, 8, fa)
|
|
989
989
|
], !0)
|
|
990
990
|
]),
|
|
991
991
|
key: "0"
|
|
992
992
|
} : void 0,
|
|
993
|
-
!(e.multiline && e.error) &&
|
|
993
|
+
!(e.multiline && e.error) && A.$slots.help ? {
|
|
994
994
|
name: "help",
|
|
995
|
-
fn:
|
|
996
|
-
O(
|
|
995
|
+
fn: K(() => [
|
|
996
|
+
O(A.$slots, "help", {}, void 0, !0)
|
|
997
997
|
]),
|
|
998
998
|
key: "1"
|
|
999
999
|
} : void 0,
|
|
1000
1000
|
!e.multiline && e.inlineVaultPicker ? {
|
|
1001
1001
|
name: "after",
|
|
1002
|
-
fn:
|
|
1003
|
-
o(l) &&
|
|
1002
|
+
fn: K(() => [
|
|
1003
|
+
o(l) && c.value ? (_(), L(oe(o(l)), {
|
|
1004
1004
|
key: 0,
|
|
1005
|
-
schema:
|
|
1006
|
-
update:
|
|
1007
|
-
value: o(
|
|
1008
|
-
}, null, 8, ["schema", "value"])) :
|
|
1009
|
-
|
|
1005
|
+
schema: p.value,
|
|
1006
|
+
update: m,
|
|
1007
|
+
value: o(u) ?? ""
|
|
1008
|
+
}, null, 8, ["schema", "value"])) : z("", !0),
|
|
1009
|
+
c.value && !o(l) ? (_(), L(P, {
|
|
1010
1010
|
key: 1,
|
|
1011
1011
|
appearance: "warning",
|
|
1012
1012
|
"data-testid": `ff-vault-secret-picker-warning-${f.path.value}`,
|
|
1013
1013
|
message: o(a).t("plugins.free-form.vault_picker.component_error")
|
|
1014
|
-
}, null, 8, ["data-testid", "message"])) :
|
|
1014
|
+
}, null, 8, ["data-testid", "message"])) : z("", !0)
|
|
1015
1015
|
]),
|
|
1016
1016
|
key: "2"
|
|
1017
1017
|
} : void 0
|
|
1018
1018
|
]), 1040, ["id", "data-1p-ignore", "data-autofocus", "data-testid", "error", "error-message", "help", "model-value", "multiline", "placeholder"]),
|
|
1019
|
-
e.inlineVaultPicker ?
|
|
1020
|
-
o(l) &&
|
|
1019
|
+
e.inlineVaultPicker ? z("", !0) : (_(), E(te, { key: 0 }, [
|
|
1020
|
+
o(l) && c.value ? (_(), L(oe(o(l)), {
|
|
1021
1021
|
key: 0,
|
|
1022
|
-
schema:
|
|
1023
|
-
update:
|
|
1024
|
-
value: o(
|
|
1025
|
-
}, null, 8, ["schema", "value"])) :
|
|
1026
|
-
|
|
1022
|
+
schema: p.value,
|
|
1023
|
+
update: m,
|
|
1024
|
+
value: o(u) ?? ""
|
|
1025
|
+
}, null, 8, ["schema", "value"])) : z("", !0),
|
|
1026
|
+
c.value && !o(l) ? (_(), L(P, {
|
|
1027
1027
|
key: 1,
|
|
1028
1028
|
appearance: "warning",
|
|
1029
1029
|
"data-testid": `ff-vault-secret-picker-warning-${f.path.value}`,
|
|
1030
1030
|
message: o(a).t("plugins.free-form.vault_picker.component_error")
|
|
1031
|
-
}, null, 8, ["data-testid", "message"])) :
|
|
1031
|
+
}, null, 8, ["data-testid", "message"])) : z("", !0)
|
|
1032
1032
|
], 64))
|
|
1033
1033
|
], 16)), [
|
|
1034
|
-
[
|
|
1034
|
+
[Q, !o(d)]
|
|
1035
1035
|
]);
|
|
1036
1036
|
};
|
|
1037
1037
|
}
|
|
@@ -1040,7 +1040,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1040
1040
|
for (const [a, s] of r)
|
|
1041
1041
|
t[a] = s;
|
|
1042
1042
|
return t;
|
|
1043
|
-
}, ht = /* @__PURE__ */ G(
|
|
1043
|
+
}, ht = /* @__PURE__ */ G(ha, [["__scopeId", "data-v-ab4f4a8a"]]), ga = ["innerHTML"], ya = /* @__PURE__ */ N({
|
|
1044
1044
|
inheritAttrs: !1,
|
|
1045
1045
|
__name: "BooleanField",
|
|
1046
1046
|
props: {
|
|
@@ -1051,39 +1051,39 @@ const be = /* @__PURE__ */ N({
|
|
|
1051
1051
|
},
|
|
1052
1052
|
emits: ["update:modelValue"],
|
|
1053
1053
|
setup(e, { emit: r }) {
|
|
1054
|
-
const t = le(e, ["autofocus", "name"]), { value: a, hide: s, emptyOrDefaultValue: n, ...
|
|
1055
|
-
a.value =
|
|
1056
|
-
}, i =
|
|
1057
|
-
return (
|
|
1058
|
-
const l =
|
|
1059
|
-
return
|
|
1054
|
+
const t = le(e, ["autofocus", "name"]), { value: a, hide: s, emptyOrDefaultValue: n, ...u } = Z(j(() => e.name)), d = r, f = (m) => {
|
|
1055
|
+
a.value = m, d("update:modelValue", m);
|
|
1056
|
+
}, i = ie(u.path, t);
|
|
1057
|
+
return (m, h) => {
|
|
1058
|
+
const l = U("KAlert");
|
|
1059
|
+
return u.error ? (_(), L(l, {
|
|
1060
1060
|
key: 0,
|
|
1061
1061
|
appearance: "danger",
|
|
1062
|
-
message:
|
|
1063
|
-
}, null, 8, ["message"])) :
|
|
1062
|
+
message: u.error.message
|
|
1063
|
+
}, null, 8, ["message"])) : X((_(), L(o(Rt), H({ key: 1 }, { ...o(i), ...m.$attrs }, {
|
|
1064
1064
|
class: "ff-boolean-field",
|
|
1065
1065
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1066
|
-
"data-testid": `ff-${
|
|
1066
|
+
"data-testid": `ff-${u.path.value}`,
|
|
1067
1067
|
"model-value": !!(o(a) == null ? o(n) : o(a)),
|
|
1068
1068
|
"onUpdate:modelValue": f
|
|
1069
|
-
}),
|
|
1069
|
+
}), Y({ _: 2 }, [
|
|
1070
1070
|
o(i).labelAttributes?.info ? {
|
|
1071
1071
|
name: "tooltip",
|
|
1072
|
-
fn:
|
|
1073
|
-
O(
|
|
1072
|
+
fn: K(() => [
|
|
1073
|
+
O(m.$slots, "tooltip", {}, () => [
|
|
1074
1074
|
B("div", {
|
|
1075
1075
|
innerHTML: o(i).labelAttributes.info
|
|
1076
|
-
}, null, 8,
|
|
1076
|
+
}, null, 8, ga)
|
|
1077
1077
|
], !0)
|
|
1078
1078
|
]),
|
|
1079
1079
|
key: "0"
|
|
1080
1080
|
} : void 0
|
|
1081
1081
|
]), 1040, ["data-autofocus", "data-testid", "model-value"])), [
|
|
1082
|
-
[
|
|
1082
|
+
[Q, !o(s)]
|
|
1083
1083
|
]);
|
|
1084
1084
|
};
|
|
1085
1085
|
}
|
|
1086
|
-
}),
|
|
1086
|
+
}), va = /* @__PURE__ */ G(ya, [["__scopeId", "data-v-a1c08c7f"]]), ba = ["data-testid"], _a = ["innerHTML"], wa = /* @__PURE__ */ N({
|
|
1087
1087
|
inheritAttrs: !1,
|
|
1088
1088
|
__name: "StringArrayField",
|
|
1089
1089
|
props: {
|
|
@@ -1094,58 +1094,58 @@ const be = /* @__PURE__ */ N({
|
|
|
1094
1094
|
},
|
|
1095
1095
|
emits: ["update:modelValue"],
|
|
1096
1096
|
setup(e, { emit: r }) {
|
|
1097
|
-
const t = ye(), a = le(e, ["autofocus", "name"]), s = r, { value: n, hide:
|
|
1098
|
-
function h(
|
|
1099
|
-
return
|
|
1097
|
+
const t = ye(), a = le(e, ["autofocus", "name"]), s = r, { value: n, hide: u, ...d } = Z(j(() => e.name)), f = ie(d.path, j({ ...a, ...t })), i = w(() => d.schema?.value?.len_min && d.schema.value.len_min > 0), m = se("");
|
|
1098
|
+
function h(b) {
|
|
1099
|
+
return b.map((A) => A.trim()).filter(Boolean).join(", ");
|
|
1100
1100
|
}
|
|
1101
|
-
function l(
|
|
1102
|
-
return
|
|
1101
|
+
function l(b) {
|
|
1102
|
+
return b.trim().split(",").map((A) => A.trim()).filter(Boolean);
|
|
1103
1103
|
}
|
|
1104
|
-
function
|
|
1105
|
-
|
|
1106
|
-
const
|
|
1107
|
-
n.value =
|
|
1104
|
+
function c(b) {
|
|
1105
|
+
m.value = b;
|
|
1106
|
+
const A = l(b), q = !A.length && i.value ? null : A;
|
|
1107
|
+
n.value = q, s("update:modelValue", q);
|
|
1108
1108
|
}
|
|
1109
|
-
const
|
|
1110
|
-
return
|
|
1111
|
-
const
|
|
1112
|
-
h(l(
|
|
1113
|
-
}, { immediate: !0 }), (
|
|
1114
|
-
const
|
|
1115
|
-
return d.error ? (
|
|
1109
|
+
const p = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1110
|
+
return ae(n, (b) => {
|
|
1111
|
+
const A = b ? h(b) : "";
|
|
1112
|
+
h(l(m.value)) !== A && (m.value = A);
|
|
1113
|
+
}, { immediate: !0 }), (b, A) => {
|
|
1114
|
+
const q = U("KAlert");
|
|
1115
|
+
return d.error ? (_(), L(q, {
|
|
1116
1116
|
key: 0,
|
|
1117
1117
|
appearance: "danger",
|
|
1118
1118
|
message: d.error.message
|
|
1119
|
-
}, null, 8, ["message"])) :
|
|
1119
|
+
}, null, 8, ["message"])) : X((_(), E("div", {
|
|
1120
1120
|
key: 1,
|
|
1121
1121
|
"data-testid": `ff-tag-${d.path.value}`
|
|
1122
1122
|
}, [
|
|
1123
|
-
$(be,
|
|
1123
|
+
$(be, H(o(f), {
|
|
1124
1124
|
class: "ff-tag-field",
|
|
1125
|
-
"data-1p-ignore":
|
|
1125
|
+
"data-1p-ignore": p.value,
|
|
1126
1126
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1127
1127
|
"data-testid": `ff-${d.path.value}`,
|
|
1128
|
-
"model-value":
|
|
1129
|
-
"onUpdate:modelValue":
|
|
1130
|
-
}),
|
|
1128
|
+
"model-value": m.value ?? "",
|
|
1129
|
+
"onUpdate:modelValue": c
|
|
1130
|
+
}), Y({ _: 2 }, [
|
|
1131
1131
|
o(f).labelAttributes?.info ? {
|
|
1132
1132
|
name: "label-tooltip",
|
|
1133
|
-
fn:
|
|
1134
|
-
O(
|
|
1133
|
+
fn: K(() => [
|
|
1134
|
+
O(b.$slots, "tooltip", {}, () => [
|
|
1135
1135
|
B("div", {
|
|
1136
1136
|
innerHTML: o(f).labelAttributes.info
|
|
1137
|
-
}, null, 8,
|
|
1137
|
+
}, null, 8, _a)
|
|
1138
1138
|
], !0)
|
|
1139
1139
|
]),
|
|
1140
1140
|
key: "0"
|
|
1141
1141
|
} : void 0
|
|
1142
1142
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1143
|
-
], 8,
|
|
1144
|
-
[
|
|
1143
|
+
], 8, ba)), [
|
|
1144
|
+
[Q, !o(u)]
|
|
1145
1145
|
]);
|
|
1146
1146
|
};
|
|
1147
1147
|
}
|
|
1148
|
-
}), gt = /* @__PURE__ */ G(
|
|
1148
|
+
}), gt = /* @__PURE__ */ G(wa, [["__scopeId", "data-v-3aa09162"]]), Aa = ["data-appearance", "data-testid"], ka = ["data-testid"], Sa = ["innerHTML"], Ca = ["data-testid"], Ta = { class: "ff-array-field-item-content" }, Ia = ["data-index", "data-testid"], Ke = 'input:not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled), [contenteditable="true"], [tabindex]:not([tabindex="-1"]):not(:disabled)', Pa = /* @__PURE__ */ N({
|
|
1149
1149
|
__name: "ArrayField",
|
|
1150
1150
|
props: {
|
|
1151
1151
|
name: {},
|
|
@@ -1153,6 +1153,7 @@ const be = /* @__PURE__ */ N({
|
|
|
1153
1153
|
label: {},
|
|
1154
1154
|
labelAttributes: {},
|
|
1155
1155
|
itemLabel: { type: [String, Function] },
|
|
1156
|
+
addItemLabel: {},
|
|
1156
1157
|
appearance: {},
|
|
1157
1158
|
stickyTabs: { type: [Boolean, String, Number] },
|
|
1158
1159
|
hideLabel: { type: Boolean },
|
|
@@ -1160,151 +1161,151 @@ const be = /* @__PURE__ */ N({
|
|
|
1160
1161
|
},
|
|
1161
1162
|
emits: ["add", "remove"],
|
|
1162
1163
|
setup(e, { emit: r }) {
|
|
1163
|
-
|
|
1164
|
-
|
|
1164
|
+
At((C) => ({
|
|
1165
|
+
v1371d426: x.value
|
|
1165
1166
|
}));
|
|
1166
|
-
const t = e, a = r, { i18n: { t: s } } = ve(), { getDefault: n, getSchema:
|
|
1167
|
+
const t = e, a = r, { i18n: { t: s } } = ve(), { getDefault: n, getSchema: u } = ne(), { value: d, hide: f, ...i } = Z(j(t, "name")), m = ie(i.path, j({ ...t, ...ye() })), h = w(() => {
|
|
1167
1168
|
if (!i.path) throw new Error("Field path is required for sub-schema retrieval");
|
|
1168
|
-
const
|
|
1169
|
-
if (!
|
|
1170
|
-
return
|
|
1171
|
-
}), l =
|
|
1169
|
+
const C = u(i.path.value);
|
|
1170
|
+
if (!C) throw new Error(`Schema not found for path: ${i.path.value}`);
|
|
1171
|
+
return C.elements;
|
|
1172
|
+
}), l = w(() => {
|
|
1172
1173
|
if (!i.path) return "";
|
|
1173
|
-
const
|
|
1174
|
-
return mt(
|
|
1175
|
-
}),
|
|
1176
|
-
function
|
|
1177
|
-
return typeof t.itemLabel == "function" ? t.itemLabel(
|
|
1174
|
+
const C = me(i.path.value);
|
|
1175
|
+
return mt(C);
|
|
1176
|
+
}), c = w(() => t.addItemLabel ?? s("actions.add_entity", { entity: l.value })), p = w(() => t.items ?? V(d) ?? []), { getKey: b } = ra("ff-array-field", p), A = w(() => t.appearance ? t.appearance : h.value.type === "record" || h.value.type === "map" ? "card" : "default"), q = w(() => A.value === "card" ? Ee : "div");
|
|
1177
|
+
function P(C, y) {
|
|
1178
|
+
return typeof t.itemLabel == "function" ? t.itemLabel(C, y) : t.itemLabel || m.value.label || `Item #${y}`;
|
|
1178
1179
|
}
|
|
1179
|
-
const
|
|
1180
|
-
hash: `#${
|
|
1180
|
+
const g = w(() => p.value.map((C, y) => ({
|
|
1181
|
+
hash: `#${b(C, y)}`,
|
|
1181
1182
|
title: ""
|
|
1182
|
-
}))),
|
|
1183
|
-
const
|
|
1184
|
-
Array.isArray(d.value) || (d.value = []), d.value.push(
|
|
1185
|
-
},
|
|
1186
|
-
Array.isArray(d.value) && (d.value.splice(
|
|
1187
|
-
},
|
|
1188
|
-
function
|
|
1189
|
-
if (!
|
|
1183
|
+
}))), k = se(g.value[0]?.hash), v = async () => {
|
|
1184
|
+
const C = n(R(i.path.value, Ue));
|
|
1185
|
+
Array.isArray(d.value) || (d.value = []), d.value.push(C), a("add"), t.appearance === "tabs" && (await Me(), k.value = g.value[g.value.length - 1]?.hash), await Me(), M(p.value.length + 1);
|
|
1186
|
+
}, S = async (C) => {
|
|
1187
|
+
Array.isArray(d.value) && (d.value.splice(C, 1), d.value.length === 0 && !m.value.required && (d.value = null)), a("remove", C), t.appearance === "tabs" && (k.value = g.value[Math.max(0, C - 1)]?.hash);
|
|
1188
|
+
}, T = et("root");
|
|
1189
|
+
function M(C) {
|
|
1190
|
+
if (!T.value)
|
|
1190
1191
|
return;
|
|
1191
|
-
const
|
|
1192
|
-
if (!
|
|
1192
|
+
const y = Math.max(0, Math.min(C, p.value.length - 1)), D = T.value.querySelector(`[data-index="${y}"]`);
|
|
1193
|
+
if (!D)
|
|
1193
1194
|
return;
|
|
1194
|
-
|
|
1195
|
+
I(D)?.focus();
|
|
1195
1196
|
}
|
|
1196
|
-
function
|
|
1197
|
-
const
|
|
1198
|
-
return
|
|
1197
|
+
function I(C) {
|
|
1198
|
+
const y = C.querySelector('[data-autofocus="true"]');
|
|
1199
|
+
return y ? y.matches(Ke) ? y : y.querySelector(Ke) : C.querySelector(Ke);
|
|
1199
1200
|
}
|
|
1200
|
-
const
|
|
1201
|
-
const { appearance:
|
|
1202
|
-
return
|
|
1201
|
+
const x = w(() => {
|
|
1202
|
+
const { appearance: C, stickyTabs: y } = t;
|
|
1203
|
+
return C !== "tabs" || y == null || y === !1 ? null : typeof y == "number" ? `${t.stickyTabs}px` : typeof y == "string" ? y : "0";
|
|
1203
1204
|
});
|
|
1204
|
-
return (
|
|
1205
|
-
const
|
|
1206
|
-
return i.error ? (
|
|
1205
|
+
return (C, y) => {
|
|
1206
|
+
const D = U("KAlert"), W = U("KLabel"), J = U("KButton"), yt = U("KTooltip"), vt = U("KTabs");
|
|
1207
|
+
return i.error ? (_(), L(D, {
|
|
1207
1208
|
key: 0,
|
|
1208
1209
|
appearance: "danger",
|
|
1209
1210
|
message: i.error.message
|
|
1210
|
-
}, null, 8, ["message"])) :
|
|
1211
|
+
}, null, 8, ["message"])) : X((_(), E("div", {
|
|
1211
1212
|
key: 1,
|
|
1212
1213
|
ref_key: "root",
|
|
1213
|
-
ref:
|
|
1214
|
+
ref: T,
|
|
1214
1215
|
class: Ce(["ff-array-field", {
|
|
1215
|
-
[`ff-array-field-${
|
|
1216
|
+
[`ff-array-field-${A.value ?? "default"}`]: !0,
|
|
1216
1217
|
"ff-array-field-sticky-tabs": e.stickyTabs
|
|
1217
1218
|
}]),
|
|
1218
|
-
"data-appearance":
|
|
1219
|
+
"data-appearance": A.value,
|
|
1219
1220
|
"data-testid": `ff-array-${i.path.value}`
|
|
1220
1221
|
}, [
|
|
1221
|
-
o(
|
|
1222
|
+
o(m).label && !e.hideLabel ? (_(), E("header", {
|
|
1222
1223
|
key: 0,
|
|
1223
1224
|
class: "ff-array-field-header",
|
|
1224
1225
|
"data-testid": `ff-array-header-${i.path.value}`
|
|
1225
1226
|
}, [
|
|
1226
|
-
$(
|
|
1227
|
+
$(W, H({ class: "ff-array-field-label" }, o(m), {
|
|
1227
1228
|
"data-testid": `ff-label-${i.path.value}`,
|
|
1228
|
-
"tooltip-attributes": o(
|
|
1229
|
-
}),
|
|
1230
|
-
default:
|
|
1231
|
-
O(
|
|
1232
|
-
label: o(
|
|
1229
|
+
"tooltip-attributes": o(m).labelAttributes.tooltipAttributes
|
|
1230
|
+
}), Y({
|
|
1231
|
+
default: K(() => [
|
|
1232
|
+
O(C.$slots, "label", {
|
|
1233
|
+
label: o(m).label
|
|
1233
1234
|
}, () => [
|
|
1234
|
-
pe(de(o(
|
|
1235
|
+
pe(de(o(m).label), 1)
|
|
1235
1236
|
], !0)
|
|
1236
1237
|
]),
|
|
1237
1238
|
_: 2
|
|
1238
1239
|
}, [
|
|
1239
|
-
o(
|
|
1240
|
+
o(m).labelAttributes?.info ? {
|
|
1240
1241
|
name: "tooltip",
|
|
1241
|
-
fn:
|
|
1242
|
-
O(
|
|
1242
|
+
fn: K(() => [
|
|
1243
|
+
O(C.$slots, "tooltip", {}, () => [
|
|
1243
1244
|
B("div", {
|
|
1244
|
-
innerHTML: o(
|
|
1245
|
-
}, null, 8,
|
|
1245
|
+
innerHTML: o(m).labelAttributes.info
|
|
1246
|
+
}, null, 8, Sa)
|
|
1246
1247
|
], !0)
|
|
1247
1248
|
]),
|
|
1248
1249
|
key: "0"
|
|
1249
1250
|
} : void 0
|
|
1250
1251
|
]), 1040, ["data-testid", "tooltip-attributes"]),
|
|
1251
|
-
e.appearance === "tabs" ? (
|
|
1252
|
+
e.appearance === "tabs" ? (_(), L(J, {
|
|
1252
1253
|
key: 0,
|
|
1253
1254
|
appearance: "tertiary",
|
|
1254
|
-
"aria-label":
|
|
1255
|
+
"aria-label": c.value,
|
|
1255
1256
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1256
1257
|
icon: "",
|
|
1257
|
-
onClick:
|
|
1258
|
+
onClick: v
|
|
1258
1259
|
}, {
|
|
1259
|
-
default:
|
|
1260
|
-
$(o(
|
|
1260
|
+
default: K(() => [
|
|
1261
|
+
$(o(je))
|
|
1261
1262
|
]),
|
|
1262
1263
|
_: 1
|
|
1263
|
-
}, 8, ["aria-label", "data-testid"])) :
|
|
1264
|
-
], 8,
|
|
1265
|
-
|
|
1264
|
+
}, 8, ["aria-label", "data-testid"])) : z("", !0)
|
|
1265
|
+
], 8, ka)) : z("", !0),
|
|
1266
|
+
A.value !== "tabs" ? (_(), E(te, { key: 1 }, [
|
|
1266
1267
|
B("div", {
|
|
1267
1268
|
class: "ff-array-field-container",
|
|
1268
1269
|
"data-testid": `ff-array-basic-container-${i.path.value}`
|
|
1269
1270
|
}, [
|
|
1270
|
-
(
|
|
1271
|
-
key: o(
|
|
1272
|
-
class: Ce(["ff-array-field-item", { "ff-array-field-item-card":
|
|
1273
|
-
"data-index":
|
|
1274
|
-
"data-testid": `ff-array-item-${i.path.value}.${
|
|
1271
|
+
(_(!0), E(te, null, re(p.value, (ue, F) => (_(), L(o(q), {
|
|
1272
|
+
key: o(b)(ue, F),
|
|
1273
|
+
class: Ce(["ff-array-field-item", { "ff-array-field-item-card": A.value === "card" }]),
|
|
1274
|
+
"data-index": F,
|
|
1275
|
+
"data-testid": `ff-array-item-${i.path.value}.${F}`
|
|
1275
1276
|
}, {
|
|
1276
|
-
default:
|
|
1277
|
-
B("div",
|
|
1278
|
-
|
|
1277
|
+
default: K(() => [
|
|
1278
|
+
B("div", Ta, [
|
|
1279
|
+
C.$slots.item ? O(C.$slots, "item", {
|
|
1279
1280
|
key: 0,
|
|
1280
1281
|
autofocus: !0,
|
|
1281
|
-
fieldName: String(
|
|
1282
|
-
index:
|
|
1283
|
-
}, void 0, !0) : h.value.type === "array" && h.value.elements.type === "string" ? (
|
|
1282
|
+
fieldName: String(F),
|
|
1283
|
+
index: F
|
|
1284
|
+
}, void 0, !0) : h.value.type === "array" && h.value.elements.type === "string" ? (_(), L(gt, {
|
|
1284
1285
|
key: 1,
|
|
1285
1286
|
autofocus: "",
|
|
1286
1287
|
help: o(s)("plugins.free-form.tag_helper"),
|
|
1287
|
-
name: String(
|
|
1288
|
-
}, null, 8, ["help", "name"])) : (
|
|
1288
|
+
name: String(F)
|
|
1289
|
+
}, null, 8, ["help", "name"])) : (_(), L(ge, {
|
|
1289
1290
|
key: 2,
|
|
1290
1291
|
autofocus: "",
|
|
1291
|
-
name: String(
|
|
1292
|
+
name: String(F)
|
|
1292
1293
|
}, null, 8, ["name"]))
|
|
1293
1294
|
]),
|
|
1294
|
-
$(
|
|
1295
|
+
$(yt, {
|
|
1295
1296
|
class: "ff-array-field-item-remove-tooltip",
|
|
1296
1297
|
text: o(s)("actions.remove_entity", { entity: l.value })
|
|
1297
1298
|
}, {
|
|
1298
|
-
default:
|
|
1299
|
-
$(
|
|
1299
|
+
default: K(() => [
|
|
1300
|
+
$(J, {
|
|
1300
1301
|
appearance: "tertiary",
|
|
1301
1302
|
"aria-label": o(s)("actions.remove_entity", { entity: l.value }),
|
|
1302
1303
|
class: "ff-array-field-item-remove",
|
|
1303
|
-
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${
|
|
1304
|
+
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${F}`,
|
|
1304
1305
|
icon: "",
|
|
1305
|
-
onClick: Te((
|
|
1306
|
+
onClick: Te((bt) => S(F), ["stop"])
|
|
1306
1307
|
}, {
|
|
1307
|
-
default:
|
|
1308
|
+
default: K(() => [
|
|
1308
1309
|
$(o(rt))
|
|
1309
1310
|
]),
|
|
1310
1311
|
_: 1
|
|
@@ -1315,66 +1316,66 @@ const be = /* @__PURE__ */ N({
|
|
|
1315
1316
|
]),
|
|
1316
1317
|
_: 2
|
|
1317
1318
|
}, 1032, ["class", "data-index", "data-testid"]))), 128))
|
|
1318
|
-
], 8,
|
|
1319
|
-
$(
|
|
1319
|
+
], 8, Ca),
|
|
1320
|
+
$(J, {
|
|
1320
1321
|
appearance: "tertiary",
|
|
1321
|
-
"aria-label":
|
|
1322
|
+
"aria-label": c.value,
|
|
1322
1323
|
class: "ff-array-field-add-item-btn",
|
|
1323
1324
|
"data-testid": `ff-add-item-btn-${i.path.value}`,
|
|
1324
|
-
onClick:
|
|
1325
|
+
onClick: v
|
|
1325
1326
|
}, {
|
|
1326
|
-
default:
|
|
1327
|
-
$(o(
|
|
1328
|
-
pe(" " + de(
|
|
1327
|
+
default: K(() => [
|
|
1328
|
+
$(o(je)),
|
|
1329
|
+
pe(" " + de(c.value), 1)
|
|
1329
1330
|
]),
|
|
1330
1331
|
_: 1
|
|
1331
1332
|
}, 8, ["aria-label", "data-testid"])
|
|
1332
|
-
], 64)) :
|
|
1333
|
+
], 64)) : p.value.length ? (_(), L(o(Ee), {
|
|
1333
1334
|
key: 2,
|
|
1334
1335
|
"data-testid": `ff-array-tab-container-${i.path.value}`
|
|
1335
1336
|
}, {
|
|
1336
|
-
default:
|
|
1337
|
-
$(
|
|
1338
|
-
modelValue:
|
|
1339
|
-
"onUpdate:modelValue":
|
|
1337
|
+
default: K(() => [
|
|
1338
|
+
$(vt, {
|
|
1339
|
+
modelValue: k.value,
|
|
1340
|
+
"onUpdate:modelValue": y[0] || (y[0] = (ue) => k.value = ue),
|
|
1340
1341
|
"data-testid": `ff-array-tabs-${i.path.value}`,
|
|
1341
|
-
tabs:
|
|
1342
|
-
},
|
|
1343
|
-
re(
|
|
1344
|
-
name: o(
|
|
1345
|
-
fn:
|
|
1342
|
+
tabs: g.value
|
|
1343
|
+
}, Y({ _: 2 }, [
|
|
1344
|
+
re(p.value, (ue, F) => ({
|
|
1345
|
+
name: o(b)(ue, F),
|
|
1346
|
+
fn: K(() => [
|
|
1346
1347
|
B("div", {
|
|
1347
1348
|
class: "ff-array-field-item",
|
|
1348
|
-
"data-index":
|
|
1349
|
-
"data-testid": `ff-array-item-${i.path.value}.${
|
|
1349
|
+
"data-index": F,
|
|
1350
|
+
"data-testid": `ff-array-item-${i.path.value}.${F}`
|
|
1350
1351
|
}, [
|
|
1351
|
-
|
|
1352
|
+
C.$slots.item ? O(C.$slots, "item", {
|
|
1352
1353
|
key: 0,
|
|
1353
1354
|
autofocus: !0,
|
|
1354
|
-
fieldName: String(
|
|
1355
|
-
index:
|
|
1356
|
-
}, void 0, !0) : (
|
|
1355
|
+
fieldName: String(F),
|
|
1356
|
+
index: F
|
|
1357
|
+
}, void 0, !0) : (_(), L(ge, {
|
|
1357
1358
|
key: 1,
|
|
1358
1359
|
autofocus: "",
|
|
1359
|
-
name: String(
|
|
1360
|
+
name: String(F)
|
|
1360
1361
|
}, null, 8, ["name"]))
|
|
1361
|
-
], 8,
|
|
1362
|
+
], 8, Ia)
|
|
1362
1363
|
])
|
|
1363
1364
|
})),
|
|
1364
|
-
re(
|
|
1365
|
-
name: `${o(
|
|
1366
|
-
fn:
|
|
1367
|
-
pe(de(
|
|
1368
|
-
$(
|
|
1365
|
+
re(p.value, (ue, F) => ({
|
|
1366
|
+
name: `${o(b)(ue, F)}-anchor`,
|
|
1367
|
+
fn: K(() => [
|
|
1368
|
+
pe(de(P(ue, F)) + " ", 1),
|
|
1369
|
+
$(J, {
|
|
1369
1370
|
appearance: "tertiary",
|
|
1370
1371
|
"aria-label": o(s)("actions.remove_entity", { entity: l.value }),
|
|
1371
1372
|
class: "ff-array-field-item-remove",
|
|
1372
|
-
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${
|
|
1373
|
+
"data-testid": `ff-array-remove-item-btn-${i.path.value}.${F}`,
|
|
1373
1374
|
icon: "",
|
|
1374
|
-
onClick: Te((
|
|
1375
|
+
onClick: Te((bt) => S(F), ["stop"])
|
|
1375
1376
|
}, {
|
|
1376
|
-
default:
|
|
1377
|
-
$(o(
|
|
1377
|
+
default: K(() => [
|
|
1378
|
+
$(o(Ot))
|
|
1378
1379
|
]),
|
|
1379
1380
|
_: 1
|
|
1380
1381
|
}, 8, ["aria-label", "data-testid", "onClick"])
|
|
@@ -1383,13 +1384,13 @@ const be = /* @__PURE__ */ N({
|
|
|
1383
1384
|
]), 1032, ["modelValue", "data-testid", "tabs"])
|
|
1384
1385
|
]),
|
|
1385
1386
|
_: 3
|
|
1386
|
-
}, 8, ["data-testid"])) :
|
|
1387
|
-
], 10,
|
|
1388
|
-
[
|
|
1387
|
+
}, 8, ["data-testid"])) : z("", !0)
|
|
1388
|
+
], 10, Aa)), [
|
|
1389
|
+
[Q, !o(f)]
|
|
1389
1390
|
]);
|
|
1390
1391
|
};
|
|
1391
1392
|
}
|
|
1392
|
-
}),
|
|
1393
|
+
}), La = /* @__PURE__ */ G(Pa, [["__scopeId", "data-v-cbe43a0d"]]), qa = /* @__PURE__ */ N({
|
|
1393
1394
|
__name: "SlideTransition",
|
|
1394
1395
|
setup(e) {
|
|
1395
1396
|
const r = [
|
|
@@ -1402,29 +1403,29 @@ const be = /* @__PURE__ */ N({
|
|
|
1402
1403
|
"border-bottom-width"
|
|
1403
1404
|
], t = Object.fromEntries(r.map((l) => [l, ""])), a = Object.fromEntries(r.map((l) => [l, "0"]));
|
|
1404
1405
|
function s(l) {
|
|
1405
|
-
const
|
|
1406
|
+
const c = getComputedStyle(l);
|
|
1406
1407
|
return Object.fromEntries(
|
|
1407
|
-
r.map((
|
|
1408
|
+
r.map((p) => [p, c.getPropertyValue(p)])
|
|
1408
1409
|
);
|
|
1409
1410
|
}
|
|
1410
1411
|
function n(l) {
|
|
1411
1412
|
["overflow", "transition", ...r].forEach(
|
|
1412
|
-
(
|
|
1413
|
+
(c) => l.style.removeProperty(c)
|
|
1413
1414
|
);
|
|
1414
1415
|
}
|
|
1415
|
-
function
|
|
1416
|
+
function u(l) {
|
|
1416
1417
|
Object.assign(l.style, {
|
|
1417
1418
|
overflow: "hidden",
|
|
1418
1419
|
transition: "none"
|
|
1419
1420
|
});
|
|
1420
1421
|
}
|
|
1421
1422
|
function d(l) {
|
|
1422
|
-
const
|
|
1423
|
-
Object.assign(
|
|
1424
|
-
const
|
|
1425
|
-
Object.assign(
|
|
1426
|
-
Object.assign(
|
|
1427
|
-
...
|
|
1423
|
+
const c = l;
|
|
1424
|
+
Object.assign(c.style, t);
|
|
1425
|
+
const p = s(c);
|
|
1426
|
+
Object.assign(c.style, a), requestAnimationFrame(() => {
|
|
1427
|
+
Object.assign(c.style, {
|
|
1428
|
+
...p,
|
|
1428
1429
|
transition: ""
|
|
1429
1430
|
});
|
|
1430
1431
|
});
|
|
@@ -1433,55 +1434,55 @@ const be = /* @__PURE__ */ N({
|
|
|
1433
1434
|
n(l);
|
|
1434
1435
|
}
|
|
1435
1436
|
function i(l) {
|
|
1436
|
-
const
|
|
1437
|
-
Object.assign(
|
|
1438
|
-
...s(
|
|
1437
|
+
const c = l;
|
|
1438
|
+
Object.assign(c.style, {
|
|
1439
|
+
...s(c),
|
|
1439
1440
|
overflow: "hidden"
|
|
1440
1441
|
});
|
|
1441
1442
|
}
|
|
1442
|
-
function
|
|
1443
|
+
function m(l) {
|
|
1443
1444
|
Object.assign(l.style, a);
|
|
1444
1445
|
}
|
|
1445
1446
|
function h(l) {
|
|
1446
1447
|
n(l);
|
|
1447
1448
|
}
|
|
1448
|
-
return (l,
|
|
1449
|
+
return (l, c) => (_(), L(kt, {
|
|
1449
1450
|
"enter-active-class": "ff-slide-active",
|
|
1450
1451
|
"leave-active-class": "ff-slide-active",
|
|
1451
1452
|
onAfterEnter: f,
|
|
1452
1453
|
onAfterLeave: h,
|
|
1453
|
-
onBeforeEnter:
|
|
1454
|
+
onBeforeEnter: u,
|
|
1454
1455
|
onBeforeLeave: i,
|
|
1455
1456
|
onEnter: d,
|
|
1456
|
-
onLeave:
|
|
1457
|
+
onLeave: m
|
|
1457
1458
|
}, {
|
|
1458
|
-
default:
|
|
1459
|
+
default: K(() => [
|
|
1459
1460
|
O(l.$slots, "default", {}, void 0, !0)
|
|
1460
1461
|
]),
|
|
1461
1462
|
_: 3
|
|
1462
1463
|
}));
|
|
1463
1464
|
}
|
|
1464
|
-
}),
|
|
1465
|
+
}), xa = /* @__PURE__ */ G(qa, [["__scopeId", "data-v-4969409d"]]), Ka = { class: "ff-entity-checks-list" }, Ma = /* @__PURE__ */ N({
|
|
1465
1466
|
__name: "EntityChecksAlert",
|
|
1466
1467
|
props: {
|
|
1467
1468
|
entityChecks: {},
|
|
1468
1469
|
visibleFields: {}
|
|
1469
1470
|
},
|
|
1470
1471
|
setup(e) {
|
|
1471
|
-
const { i18n: { t: r } } = ve(), t =
|
|
1472
|
+
const { i18n: { t: r } } = ve(), t = w(() => {
|
|
1472
1473
|
if (!Array.isArray(e.entityChecks) || e.entityChecks.length === 0)
|
|
1473
1474
|
return null;
|
|
1474
|
-
const n = [],
|
|
1475
|
+
const n = [], u = [
|
|
1475
1476
|
{ key: "at_least_one_of", i18nKey: "plugins.form.field_rules.at_least_one_of" },
|
|
1476
1477
|
{ key: "mutually_required", i18nKey: "plugins.form.field_rules.mutually_required" },
|
|
1477
1478
|
{ key: "mutually_exclusive", i18nKey: "plugins.form.field_rules.mutually_exclusive" }
|
|
1478
1479
|
];
|
|
1479
1480
|
for (const d of e.entityChecks)
|
|
1480
|
-
for (const { key: f, i18nKey: i } of
|
|
1481
|
+
for (const { key: f, i18nKey: i } of u)
|
|
1481
1482
|
if (f in d) {
|
|
1482
|
-
const
|
|
1483
|
-
if (Array.isArray(
|
|
1484
|
-
const h = s(
|
|
1483
|
+
const m = d[f];
|
|
1484
|
+
if (Array.isArray(m) && m.length > 0) {
|
|
1485
|
+
const h = s(m);
|
|
1485
1486
|
h.length > 0 && n.push(r(i, {
|
|
1486
1487
|
parameters: a(h)
|
|
1487
1488
|
}));
|
|
@@ -1494,30 +1495,30 @@ const be = /* @__PURE__ */ N({
|
|
|
1494
1495
|
return n.map(ft).join(", ");
|
|
1495
1496
|
}
|
|
1496
1497
|
function s(n) {
|
|
1497
|
-
return Array.isArray(e.visibleFields) ? n.filter((
|
|
1498
|
+
return Array.isArray(e.visibleFields) ? n.filter((u) => e.visibleFields.includes(u.split(".")[0])) : n;
|
|
1498
1499
|
}
|
|
1499
|
-
return (n,
|
|
1500
|
-
const d =
|
|
1501
|
-
return t.value ? (
|
|
1500
|
+
return (n, u) => {
|
|
1501
|
+
const d = U("KAlert");
|
|
1502
|
+
return t.value ? (_(), L(d, {
|
|
1502
1503
|
key: 0,
|
|
1503
1504
|
"data-testid": "ff-entity-checks-alert"
|
|
1504
1505
|
}, {
|
|
1505
|
-
default:
|
|
1506
|
-
B("ul",
|
|
1507
|
-
(
|
|
1506
|
+
default: K(() => [
|
|
1507
|
+
B("ul", Ka, [
|
|
1508
|
+
(_(!0), E(te, null, re(t.value, (f) => (_(), E("li", {
|
|
1508
1509
|
key: f,
|
|
1509
1510
|
"data-testid": "ff-entity-check-item"
|
|
1510
1511
|
}, de(f), 1))), 128))
|
|
1511
1512
|
])
|
|
1512
1513
|
]),
|
|
1513
1514
|
_: 1
|
|
1514
|
-
})) :
|
|
1515
|
+
})) : z("", !0);
|
|
1515
1516
|
};
|
|
1516
1517
|
}
|
|
1517
|
-
}), Ye = /* @__PURE__ */ G(
|
|
1518
|
+
}), Ye = /* @__PURE__ */ G(Ma, [["__scopeId", "data-v-374c59bc"]]), Ra = ["data-testid"], $a = ["data-testid"], Ea = ["data-testid"], ja = { class: "ff-object-field-header-toggle" }, Va = ["aria-controls", "aria-expanded", "aria-label", "data-testid", "disabled"], Oa = ["innerHTML"], Da = ["data-testid"], Fa = {
|
|
1518
1519
|
key: 0,
|
|
1519
1520
|
class: "indent-guide"
|
|
1520
|
-
},
|
|
1521
|
+
}, Ua = /* @__PURE__ */ N({
|
|
1521
1522
|
inheritAttrs: !1,
|
|
1522
1523
|
__name: "ObjectField",
|
|
1523
1524
|
props: /* @__PURE__ */ $e({
|
|
@@ -1543,53 +1544,53 @@ const be = /* @__PURE__ */ N({
|
|
|
1543
1544
|
}),
|
|
1544
1545
|
emits: ["update:added", "update:expanded"],
|
|
1545
1546
|
setup(e) {
|
|
1546
|
-
const r =
|
|
1547
|
-
getSchema:
|
|
1547
|
+
const r = St(), t = le(e, ["defaultAdded", "collapsible", "omit", "required", "asChild", "resetLabelPath", "fieldsOrder"]), { value: a, hide: s, ...n } = Z(j(t, "name")), {
|
|
1548
|
+
getSchema: u,
|
|
1548
1549
|
getDefault: d,
|
|
1549
1550
|
useCurrentRenderRules: f
|
|
1550
|
-
} =
|
|
1551
|
+
} = ne(), i = f({
|
|
1551
1552
|
fieldPath: n.path,
|
|
1552
|
-
rules:
|
|
1553
|
-
omittedFields:
|
|
1554
|
-
}),
|
|
1553
|
+
rules: j(t, "renderRules"),
|
|
1554
|
+
omittedFields: j(() => e.omit)
|
|
1555
|
+
}), m = Re(e, "added"), h = Re(e, "expanded"), l = w(() => {
|
|
1555
1556
|
if (n.ancestors?.value) {
|
|
1556
1557
|
const v = n.ancestors.value.parent;
|
|
1557
1558
|
if (v?.path)
|
|
1558
|
-
return
|
|
1559
|
+
return u(v.path)?.type === "array";
|
|
1559
1560
|
}
|
|
1560
1561
|
return !1;
|
|
1561
|
-
}),
|
|
1562
|
+
}), c = w(() => {
|
|
1562
1563
|
if (n.ancestors?.value) {
|
|
1563
1564
|
const v = n.ancestors.value.parent;
|
|
1564
1565
|
if (v?.path)
|
|
1565
|
-
return
|
|
1566
|
+
return u(v.path)?.type === "map";
|
|
1566
1567
|
}
|
|
1567
1568
|
return !1;
|
|
1568
|
-
}),
|
|
1569
|
+
}), p = ie(n.path, { required: e.required, ...t, resetLabelPath: e.resetLabelPath }), b = w(() => p.value.required ? !0 : m.value ?? e.defaultAdded), A = w(() => e.asChild !== void 0 ? e.asChild : l.value), q = w(() => {
|
|
1569
1570
|
let v = n.schema.value.fields;
|
|
1570
|
-
return e.omit && (v = v.filter((
|
|
1571
|
-
}),
|
|
1571
|
+
return e.omit && (v = v.filter((S) => !e.omit.includes(Object.keys(S)[0]))), e.fieldsOrder ? lt(v, e.fieldsOrder) : (i.value?.bundles && (v = ut([...v], i.value.bundles)), v);
|
|
1572
|
+
}), P = w(() => q.value.map((v) => Object.keys(v)[0]));
|
|
1572
1573
|
function g() {
|
|
1573
1574
|
h.value = !h.value;
|
|
1574
1575
|
}
|
|
1575
|
-
function
|
|
1576
|
-
|
|
1576
|
+
function k() {
|
|
1577
|
+
m.value ? a.value = d(n.path.value) : a.value = null;
|
|
1577
1578
|
}
|
|
1578
|
-
return
|
|
1579
|
+
return ae(b, (v) => {
|
|
1579
1580
|
e.collapsible && (h.value = v);
|
|
1580
|
-
}),
|
|
1581
|
+
}), Ct(() => {
|
|
1581
1582
|
if (n.error || !a) return;
|
|
1582
1583
|
const v = a.value != null;
|
|
1583
|
-
|
|
1584
|
-
}), (v,
|
|
1585
|
-
const T =
|
|
1586
|
-
return
|
|
1587
|
-
(
|
|
1588
|
-
n.error ? (
|
|
1584
|
+
m.value = v, (p.value.required || v) && (h.value = !0);
|
|
1585
|
+
}), (v, S) => {
|
|
1586
|
+
const T = U("KAlert"), M = U("KInputSwitch");
|
|
1587
|
+
return _(), E(te, null, [
|
|
1588
|
+
(_(), L(oe(v.$slots[o(ke)]))),
|
|
1589
|
+
n.error ? (_(), L(T, {
|
|
1589
1590
|
key: 0,
|
|
1590
1591
|
appearance: "danger",
|
|
1591
1592
|
message: n.error.message
|
|
1592
|
-
}, null, 8, ["message"])) :
|
|
1593
|
+
}, null, 8, ["message"])) : A.value ? X((_(), E("div", H({
|
|
1593
1594
|
key: 1,
|
|
1594
1595
|
class: "ff-object-field ff-object-field-as-child"
|
|
1595
1596
|
}, v.$attrs, {
|
|
@@ -1598,16 +1599,16 @@ const be = /* @__PURE__ */ N({
|
|
|
1598
1599
|
O(v.$slots, "default", {}, () => [
|
|
1599
1600
|
$(Ye, {
|
|
1600
1601
|
"entity-checks": n.schema.value?.entity_checks,
|
|
1601
|
-
"visible-fields":
|
|
1602
|
+
"visible-fields": P.value
|
|
1602
1603
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1603
|
-
(
|
|
1604
|
-
key: Object.keys(
|
|
1605
|
-
name: Object.keys(
|
|
1604
|
+
(_(!0), E(te, null, re(q.value, (I) => (_(), L(ge, {
|
|
1605
|
+
key: Object.keys(I)[0],
|
|
1606
|
+
name: Object.keys(I)[0]
|
|
1606
1607
|
}, null, 8, ["name"]))), 128))
|
|
1607
1608
|
], !0)
|
|
1608
|
-
], 16,
|
|
1609
|
-
[
|
|
1610
|
-
]) :
|
|
1609
|
+
], 16, Ra)), [
|
|
1610
|
+
[Q, !o(s)]
|
|
1611
|
+
]) : X((_(), E("div", H({
|
|
1611
1612
|
key: 2,
|
|
1612
1613
|
class: ["ff-object-field", { "ff-object-field-collapsed": !h.value }],
|
|
1613
1614
|
"data-testid": `ff-object-${n.path.value}`
|
|
@@ -1620,61 +1621,61 @@ const be = /* @__PURE__ */ N({
|
|
|
1620
1621
|
B("button", {
|
|
1621
1622
|
"aria-controls": o(r),
|
|
1622
1623
|
"aria-expanded": h.value,
|
|
1623
|
-
"aria-label": o(
|
|
1624
|
+
"aria-label": o(p).label,
|
|
1624
1625
|
class: "ff-object-field-toggle-btn",
|
|
1625
1626
|
"data-testid": `ff-object-toggle-btn-${n.path.value}`,
|
|
1626
|
-
disabled: !
|
|
1627
|
+
disabled: !m.value,
|
|
1627
1628
|
type: "button",
|
|
1628
1629
|
onClick: Te(g, ["prevent", "stop"])
|
|
1629
1630
|
}, [
|
|
1630
|
-
$(o(
|
|
1631
|
+
$(o(Dt), {
|
|
1631
1632
|
class: Ce(["ff-object-field-toggle-btn-trigger-icon", { "collapse-expanded": h.value }]),
|
|
1632
1633
|
"data-testid": `ff-object-toggle-trigger-icon-${n.path.value}`,
|
|
1633
1634
|
decorative: "",
|
|
1634
|
-
size: `var(--kui-icon-size-30, ${o(
|
|
1635
|
+
size: `var(--kui-icon-size-30, ${o(Ft)})`
|
|
1635
1636
|
}, null, 8, ["class", "data-testid", "size"])
|
|
1636
1637
|
], 8, Va),
|
|
1637
|
-
|
|
1638
|
+
c.value ? z("", !0) : (_(), L(o($t), H({
|
|
1638
1639
|
key: 0,
|
|
1639
1640
|
class: "ff-object-field-label",
|
|
1640
1641
|
"data-testid": `ff-label-${n.path.value}`
|
|
1641
1642
|
}, {
|
|
1642
|
-
...o(
|
|
1643
|
+
...o(p),
|
|
1643
1644
|
required: !1
|
|
1644
1645
|
}, {
|
|
1645
|
-
"tooltip-attributes": o(
|
|
1646
|
-
}),
|
|
1647
|
-
default:
|
|
1648
|
-
pe(de(o(
|
|
1646
|
+
"tooltip-attributes": o(p).labelAttributes.tooltipAttributes
|
|
1647
|
+
}), Y({
|
|
1648
|
+
default: K(() => [
|
|
1649
|
+
pe(de(o(p).label) + " ", 1)
|
|
1649
1650
|
]),
|
|
1650
1651
|
_: 2
|
|
1651
1652
|
}, [
|
|
1652
|
-
o(
|
|
1653
|
+
o(p).labelAttributes?.info ? {
|
|
1653
1654
|
name: "tooltip",
|
|
1654
|
-
fn:
|
|
1655
|
+
fn: K(() => [
|
|
1655
1656
|
O(v.$slots, "tooltip", {}, () => [
|
|
1656
1657
|
B("div", {
|
|
1657
|
-
innerHTML: o(
|
|
1658
|
-
}, null, 8,
|
|
1658
|
+
innerHTML: o(p).labelAttributes.info
|
|
1659
|
+
}, null, 8, Oa)
|
|
1659
1660
|
], !0)
|
|
1660
1661
|
]),
|
|
1661
1662
|
key: "0"
|
|
1662
1663
|
} : void 0
|
|
1663
1664
|
]), 1040, ["data-testid", "tooltip-attributes"]))
|
|
1664
1665
|
]),
|
|
1665
|
-
o(
|
|
1666
|
+
o(p).required ? z("", !0) : (_(), L(M, {
|
|
1666
1667
|
key: 0,
|
|
1667
|
-
modelValue:
|
|
1668
|
+
modelValue: m.value,
|
|
1668
1669
|
"onUpdate:modelValue": [
|
|
1669
|
-
|
|
1670
|
-
|
|
1670
|
+
S[0] || (S[0] = (I) => m.value = I),
|
|
1671
|
+
k
|
|
1671
1672
|
],
|
|
1672
1673
|
"data-testid": `ff-object-switch-${n.path.value}`
|
|
1673
1674
|
}, null, 8, ["modelValue", "data-testid"]))
|
|
1674
|
-
], 8,
|
|
1675
|
-
$(
|
|
1676
|
-
default:
|
|
1677
|
-
h.value ? (
|
|
1675
|
+
], 8, Ea),
|
|
1676
|
+
$(xa, null, {
|
|
1677
|
+
default: K(() => [
|
|
1678
|
+
h.value ? (_(), E("div", {
|
|
1678
1679
|
key: 0,
|
|
1679
1680
|
class: "ff-object-field-content",
|
|
1680
1681
|
"data-testid": `ff-object-content-${n.path.value}`
|
|
@@ -1682,28 +1683,28 @@ const be = /* @__PURE__ */ N({
|
|
|
1682
1683
|
O(v.$slots, "default", {}, () => [
|
|
1683
1684
|
$(Ye, {
|
|
1684
1685
|
"entity-checks": n.schema.value?.entity_checks,
|
|
1685
|
-
"visible-fields":
|
|
1686
|
+
"visible-fields": P.value
|
|
1686
1687
|
}, null, 8, ["entity-checks", "visible-fields"]),
|
|
1687
|
-
(
|
|
1688
|
-
key: Object.keys(
|
|
1689
|
-
name: Object.keys(
|
|
1688
|
+
(_(!0), E(te, null, re(q.value, (I) => (_(), L(ge, {
|
|
1689
|
+
key: Object.keys(I)[0],
|
|
1690
|
+
name: Object.keys(I)[0]
|
|
1690
1691
|
}, null, 8, ["name"]))), 128))
|
|
1691
1692
|
], !0)
|
|
1692
|
-
], 8,
|
|
1693
|
+
], 8, Da)) : z("", !0)
|
|
1693
1694
|
]),
|
|
1694
1695
|
_: 3
|
|
1695
1696
|
}),
|
|
1696
|
-
h.value ? (
|
|
1697
|
-
], 16,
|
|
1698
|
-
[
|
|
1697
|
+
h.value ? (_(), E("div", Fa)) : z("", !0)
|
|
1698
|
+
], 16, $a)), [
|
|
1699
|
+
[Q, !o(s)]
|
|
1699
1700
|
])
|
|
1700
1701
|
], 64);
|
|
1701
1702
|
};
|
|
1702
1703
|
}
|
|
1703
|
-
}),
|
|
1704
|
+
}), Ba = /* @__PURE__ */ G(Ua, [["__scopeId", "data-v-66b4c328"]]), Na = {
|
|
1704
1705
|
key: 1,
|
|
1705
1706
|
class: "ff-number-field-wrapper"
|
|
1706
|
-
},
|
|
1707
|
+
}, za = ["innerHTML"], Ha = /* @__PURE__ */ N({
|
|
1707
1708
|
__name: "NumberField",
|
|
1708
1709
|
props: {
|
|
1709
1710
|
showVaultSecretPicker: { type: Boolean, default: () => {
|
|
@@ -1725,82 +1726,82 @@ const be = /* @__PURE__ */ N({
|
|
|
1725
1726
|
},
|
|
1726
1727
|
emits: ["update:modelValue"],
|
|
1727
1728
|
setup(e, { emit: r }) {
|
|
1728
|
-
const t = le(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: a, hide: s, ...n } =
|
|
1729
|
-
const
|
|
1730
|
-
if (typeof
|
|
1731
|
-
return { min:
|
|
1732
|
-
const [g,
|
|
1729
|
+
const t = le(e, ["autofocus", "showVaultSecretPicker", "name"]), { value: a, hide: s, ...n } = Z(j(() => e.name)), u = ie(n.path, t), { i18n: d } = ve(), f = w(() => {
|
|
1730
|
+
const P = n.schema?.value;
|
|
1731
|
+
if (typeof P.gt == "number")
|
|
1732
|
+
return { min: P.type === "integer" ? P.gt + 1 : P.gt };
|
|
1733
|
+
const [g, k] = P.between ?? [];
|
|
1733
1734
|
return {
|
|
1734
1735
|
min: t.min ?? g,
|
|
1735
|
-
max: t.max ??
|
|
1736
|
+
max: t.max ?? k
|
|
1736
1737
|
};
|
|
1737
|
-
}), i = r,
|
|
1738
|
-
const
|
|
1739
|
-
if (
|
|
1740
|
-
if (
|
|
1741
|
-
const g = typeof
|
|
1738
|
+
}), i = r, m = a.value, h = w(() => {
|
|
1739
|
+
const P = a?.value;
|
|
1740
|
+
if (P == null || P === "") return "";
|
|
1741
|
+
if (A.value) return `${P}`;
|
|
1742
|
+
const g = typeof P == "number" ? P : Number(P);
|
|
1742
1743
|
return Number.isFinite(g) ? `${g}` : "";
|
|
1743
1744
|
});
|
|
1744
|
-
function l(
|
|
1745
|
-
const g =
|
|
1746
|
-
|
|
1745
|
+
function l(P) {
|
|
1746
|
+
const g = c(P);
|
|
1747
|
+
m !== void 0 && P === "" && g !== m ? (a.value = null, i("update:modelValue", null)) : (a.value = g, i("update:modelValue", g));
|
|
1747
1748
|
}
|
|
1748
|
-
function
|
|
1749
|
-
if (
|
|
1750
|
-
const g =
|
|
1749
|
+
function c(P) {
|
|
1750
|
+
if (P === "") return null;
|
|
1751
|
+
const g = P.trim();
|
|
1751
1752
|
if (g === "") return null;
|
|
1752
|
-
const
|
|
1753
|
-
return Number.isFinite(
|
|
1753
|
+
const k = Number(g);
|
|
1754
|
+
return Number.isFinite(k) ? k : A.value ? P : null;
|
|
1754
1755
|
}
|
|
1755
|
-
const
|
|
1756
|
-
return (
|
|
1757
|
-
const
|
|
1758
|
-
return n.error ? (
|
|
1756
|
+
const p = Ae(nt, void 0), b = w(() => ({ referenceable: A.value })), A = w(() => e.showVaultSecretPicker !== void 0 ? e.showVaultSecretPicker : !!n.schema.value?.referenceable), q = w(() => A.value ? "text" : "number");
|
|
1757
|
+
return (P, g) => {
|
|
1758
|
+
const k = U("KAlert");
|
|
1759
|
+
return n.error ? (_(), L(k, {
|
|
1759
1760
|
key: 0,
|
|
1760
1761
|
appearance: "danger",
|
|
1761
1762
|
message: n.error.message
|
|
1762
|
-
}, null, 8, ["message"])) :
|
|
1763
|
-
$(be,
|
|
1764
|
-
...o(
|
|
1763
|
+
}, null, 8, ["message"])) : X((_(), E("div", Na, [
|
|
1764
|
+
$(be, H({ class: "ff-number-field" }, {
|
|
1765
|
+
...o(u),
|
|
1765
1766
|
min: f.value.min,
|
|
1766
1767
|
max: f.value.max
|
|
1767
1768
|
}, {
|
|
1768
1769
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1769
1770
|
"data-testid": `ff-${n.path.value}`,
|
|
1770
1771
|
"model-value": h.value,
|
|
1771
|
-
type:
|
|
1772
|
+
type: q.value,
|
|
1772
1773
|
"onUpdate:modelValue": l
|
|
1773
|
-
}),
|
|
1774
|
-
o(
|
|
1774
|
+
}), Y({ _: 2 }, [
|
|
1775
|
+
o(u).labelAttributes?.info ? {
|
|
1775
1776
|
name: "label-tooltip",
|
|
1776
|
-
fn:
|
|
1777
|
-
O(
|
|
1777
|
+
fn: K(() => [
|
|
1778
|
+
O(P.$slots, "tooltip", {}, () => [
|
|
1778
1779
|
B("div", {
|
|
1779
|
-
innerHTML: o(
|
|
1780
|
-
}, null, 8,
|
|
1780
|
+
innerHTML: o(u).labelAttributes.info
|
|
1781
|
+
}, null, 8, za)
|
|
1781
1782
|
], !0)
|
|
1782
1783
|
]),
|
|
1783
1784
|
key: "0"
|
|
1784
1785
|
} : void 0
|
|
1785
1786
|
]), 1040, ["data-autofocus", "data-testid", "model-value", "type"]),
|
|
1786
|
-
o(
|
|
1787
|
+
o(p) && A.value ? (_(), L(oe(o(p)), {
|
|
1787
1788
|
key: 0,
|
|
1788
|
-
schema:
|
|
1789
|
+
schema: b.value,
|
|
1789
1790
|
update: l,
|
|
1790
1791
|
value: o(a) ?? ""
|
|
1791
|
-
}, null, 8, ["schema", "value"])) :
|
|
1792
|
-
|
|
1792
|
+
}, null, 8, ["schema", "value"])) : z("", !0),
|
|
1793
|
+
A.value && !o(p) ? (_(), L(k, {
|
|
1793
1794
|
key: 1,
|
|
1794
1795
|
appearance: "warning",
|
|
1795
1796
|
"data-testid": `ff-vault-secret-picker-warning-${n.path.value}`,
|
|
1796
1797
|
message: o(d).t("plugins.free-form.vault_picker.component_error")
|
|
1797
|
-
}, null, 8, ["data-testid", "message"])) :
|
|
1798
|
+
}, null, 8, ["data-testid", "message"])) : z("", !0)
|
|
1798
1799
|
], 512)), [
|
|
1799
|
-
[
|
|
1800
|
+
[Q, !o(s)]
|
|
1800
1801
|
]);
|
|
1801
1802
|
};
|
|
1802
1803
|
}
|
|
1803
|
-
}),
|
|
1804
|
+
}), Wa = /* @__PURE__ */ G(Ha, [["__scopeId", "data-v-f303431f"]]), Ga = ["innerHTML"], Ja = /* @__PURE__ */ N({
|
|
1804
1805
|
__name: "EnumField",
|
|
1805
1806
|
props: /* @__PURE__ */ $e({
|
|
1806
1807
|
labelAttributes: {},
|
|
@@ -1839,30 +1840,30 @@ const be = /* @__PURE__ */ N({
|
|
|
1839
1840
|
}),
|
|
1840
1841
|
emits: /* @__PURE__ */ $e(["update"], ["update:modelValue"]),
|
|
1841
1842
|
setup(e, { emit: r }) {
|
|
1842
|
-
const t = r, a = le(e, ["name", "items", "multiple", "autofocus"]), { getSelectItems: s } =
|
|
1843
|
-
|
|
1844
|
-
), f =
|
|
1845
|
-
function i(
|
|
1846
|
-
return l.value && Array.isArray(
|
|
1843
|
+
const t = r, a = le(e, ["name", "items", "multiple", "autofocus"]), { getSelectItems: s } = ne(), { value: n, hide: u, ...d } = Z(
|
|
1844
|
+
j(() => e.name)
|
|
1845
|
+
), f = ie(d.path, a);
|
|
1846
|
+
function i(p) {
|
|
1847
|
+
return l.value && Array.isArray(p) && p.length === 0 && !f.value.required ? null : p;
|
|
1847
1848
|
}
|
|
1848
|
-
const
|
|
1849
|
+
const m = Re(e, "modelValue", {
|
|
1849
1850
|
// If multiple and value is null/undefined, return empty array for v-model
|
|
1850
1851
|
get: () => l.value && n?.value == null ? [] : n.value,
|
|
1851
|
-
set: (
|
|
1852
|
-
n.value = i(
|
|
1852
|
+
set: (p) => {
|
|
1853
|
+
n.value = i(p);
|
|
1853
1854
|
}
|
|
1854
|
-
}), h =
|
|
1855
|
-
return (
|
|
1856
|
-
const
|
|
1857
|
-
return d.error ? (
|
|
1855
|
+
}), h = w(() => e.items ? e.items : d.path ? s(d.path.value) : []), l = w(() => e.multiple !== void 0 ? e.multiple : d.schema.value?.type === "set"), c = w(() => l.value ? Et : jt);
|
|
1856
|
+
return (p, b) => {
|
|
1857
|
+
const A = U("KAlert");
|
|
1858
|
+
return d.error ? (_(), L(A, {
|
|
1858
1859
|
key: 0,
|
|
1859
1860
|
appearance: "danger",
|
|
1860
1861
|
message: d.error.message
|
|
1861
|
-
}, null, 8, ["message"])) :
|
|
1862
|
-
modelValue:
|
|
1862
|
+
}, null, 8, ["message"])) : X((_(), L(o(c), H({ key: 1 }, { ...a, ...o(f) }, {
|
|
1863
|
+
modelValue: m.value,
|
|
1863
1864
|
"onUpdate:modelValue": [
|
|
1864
|
-
|
|
1865
|
-
|
|
1865
|
+
b[0] || (b[0] = (q) => m.value = q),
|
|
1866
|
+
b[1] || (b[1] = (q) => t("update", i(q)))
|
|
1866
1867
|
],
|
|
1867
1868
|
class: "ff-enum-field",
|
|
1868
1869
|
clearable: !o(f).required,
|
|
@@ -1870,38 +1871,38 @@ const be = /* @__PURE__ */ N({
|
|
|
1870
1871
|
"data-testid": `ff-${d.path.value}`,
|
|
1871
1872
|
items: h.value,
|
|
1872
1873
|
"kpop-attributes": { "data-testid": `ff-enum-${d.path.value}-items` }
|
|
1873
|
-
}),
|
|
1874
|
-
"tooltip" in
|
|
1874
|
+
}), Y({ _: 2 }, [
|
|
1875
|
+
"tooltip" in p.$slots || o(f).labelAttributes?.info ? {
|
|
1875
1876
|
name: "label-tooltip",
|
|
1876
|
-
fn:
|
|
1877
|
-
O(
|
|
1877
|
+
fn: K(() => [
|
|
1878
|
+
O(p.$slots, "tooltip", {}, () => [
|
|
1878
1879
|
B("div", {
|
|
1879
1880
|
innerHTML: o(f).labelAttributes.info
|
|
1880
|
-
}, null, 8,
|
|
1881
|
+
}, null, 8, Ga)
|
|
1881
1882
|
], !0)
|
|
1882
1883
|
]),
|
|
1883
1884
|
key: "0"
|
|
1884
1885
|
} : void 0,
|
|
1885
|
-
|
|
1886
|
+
p.$slots["item-label"] ? {
|
|
1886
1887
|
name: "item-template",
|
|
1887
|
-
fn:
|
|
1888
|
-
O(
|
|
1888
|
+
fn: K(({ item: q }) => [
|
|
1889
|
+
O(p.$slots, "item-label", Fe(Ze(q)), void 0, !0)
|
|
1889
1890
|
]),
|
|
1890
1891
|
key: "1"
|
|
1891
1892
|
} : void 0,
|
|
1892
|
-
|
|
1893
|
+
p.$slots["dropdown-footer-text"] ? {
|
|
1893
1894
|
name: "dropdown-footer-text",
|
|
1894
|
-
fn:
|
|
1895
|
-
O(
|
|
1895
|
+
fn: K(() => [
|
|
1896
|
+
O(p.$slots, "dropdown-footer-text", {}, void 0, !0)
|
|
1896
1897
|
]),
|
|
1897
1898
|
key: "2"
|
|
1898
1899
|
} : void 0
|
|
1899
1900
|
]), 1040, ["modelValue", "clearable", "data-autofocus", "data-testid", "items", "kpop-attributes"])), [
|
|
1900
|
-
[
|
|
1901
|
+
[Q, !o(u)]
|
|
1901
1902
|
]);
|
|
1902
1903
|
};
|
|
1903
1904
|
}
|
|
1904
|
-
}), Se = /* @__PURE__ */ G(
|
|
1905
|
+
}), Se = /* @__PURE__ */ G(Ja, [["__scopeId", "data-v-a8b95670"]]), Ya = ["data-testid"], Xa = ["innerHTML"], Qa = /* @__PURE__ */ N({
|
|
1905
1906
|
inheritAttrs: !1,
|
|
1906
1907
|
__name: "JsonField",
|
|
1907
1908
|
props: {
|
|
@@ -1911,66 +1912,66 @@ const be = /* @__PURE__ */ N({
|
|
|
1911
1912
|
},
|
|
1912
1913
|
emits: ["update:modelValue"],
|
|
1913
1914
|
setup(e, { emit: r }) {
|
|
1914
|
-
const t = ye(), a = le(e, ["autofocus", "name"]), s = r, { value: n, hide:
|
|
1915
|
-
function
|
|
1915
|
+
const t = ye(), a = le(e, ["autofocus", "name"]), s = r, { value: n, hide: u, ...d } = Z(j(() => e.name)), f = ie(d.path, j({ ...a, ...t })), i = se("");
|
|
1916
|
+
function m(l) {
|
|
1916
1917
|
i.value = l;
|
|
1917
|
-
let
|
|
1918
|
+
let c = l || null;
|
|
1918
1919
|
try {
|
|
1919
|
-
const
|
|
1920
|
-
|
|
1920
|
+
const p = JSON.parse(l);
|
|
1921
|
+
p && typeof p == "object" && (c = p);
|
|
1921
1922
|
} catch {
|
|
1922
1923
|
}
|
|
1923
|
-
n.value =
|
|
1924
|
+
n.value = c, s("update:modelValue", c);
|
|
1924
1925
|
}
|
|
1925
|
-
const h =
|
|
1926
|
-
return
|
|
1926
|
+
const h = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
1927
|
+
return ae(n, (l) => {
|
|
1927
1928
|
if (l && typeof l == "object") {
|
|
1928
1929
|
try {
|
|
1929
|
-
const
|
|
1930
|
-
fe(
|
|
1930
|
+
const c = JSON.parse(i.value);
|
|
1931
|
+
fe(c, l) || (i.value = JSON.stringify(l, null, 2));
|
|
1931
1932
|
} catch {
|
|
1932
1933
|
i.value = JSON.stringify(l, null, 2);
|
|
1933
1934
|
}
|
|
1934
1935
|
return;
|
|
1935
1936
|
}
|
|
1936
1937
|
i.value = l || "";
|
|
1937
|
-
}, { immediate: !0 }), (l,
|
|
1938
|
-
const
|
|
1939
|
-
return d.error ? (
|
|
1938
|
+
}, { immediate: !0 }), (l, c) => {
|
|
1939
|
+
const p = U("KAlert");
|
|
1940
|
+
return d.error ? (_(), L(p, {
|
|
1940
1941
|
key: 0,
|
|
1941
1942
|
appearance: "danger",
|
|
1942
1943
|
message: d.error.message
|
|
1943
|
-
}, null, 8, ["message"])) :
|
|
1944
|
+
}, null, 8, ["message"])) : X((_(), E("div", {
|
|
1944
1945
|
key: 1,
|
|
1945
1946
|
"data-testid": `ff-json-${d.path.value}`
|
|
1946
1947
|
}, [
|
|
1947
|
-
$(be,
|
|
1948
|
+
$(be, H(o(f), {
|
|
1948
1949
|
class: "ff-json-field",
|
|
1949
1950
|
"data-1p-ignore": h.value,
|
|
1950
1951
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
1951
1952
|
"data-testid": `ff-${d.path.value}`,
|
|
1952
1953
|
"model-value": i.value ?? "",
|
|
1953
1954
|
multiline: "",
|
|
1954
|
-
"onUpdate:modelValue":
|
|
1955
|
-
}),
|
|
1955
|
+
"onUpdate:modelValue": m
|
|
1956
|
+
}), Y({ _: 2 }, [
|
|
1956
1957
|
o(f).labelAttributes?.info ? {
|
|
1957
1958
|
name: "label-tooltip",
|
|
1958
|
-
fn:
|
|
1959
|
+
fn: K(() => [
|
|
1959
1960
|
O(l.$slots, "tooltip", {}, () => [
|
|
1960
1961
|
B("div", {
|
|
1961
1962
|
innerHTML: o(f).labelAttributes.info
|
|
1962
|
-
}, null, 8,
|
|
1963
|
+
}, null, 8, Xa)
|
|
1963
1964
|
], !0)
|
|
1964
1965
|
]),
|
|
1965
1966
|
key: "0"
|
|
1966
1967
|
} : void 0
|
|
1967
1968
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "model-value"])
|
|
1968
|
-
], 8,
|
|
1969
|
-
[
|
|
1969
|
+
], 8, Ya)), [
|
|
1970
|
+
[Q, !o(u)]
|
|
1970
1971
|
]);
|
|
1971
1972
|
};
|
|
1972
1973
|
}
|
|
1973
|
-
}),
|
|
1974
|
+
}), Za = /* @__PURE__ */ G(Qa, [["__scopeId", "data-v-6f302da9"]]), en = ["innerHTML"], tn = /* @__PURE__ */ N({
|
|
1974
1975
|
inheritAttrs: !1,
|
|
1975
1976
|
__name: "ForeignField",
|
|
1976
1977
|
props: {
|
|
@@ -1989,17 +1990,17 @@ const be = /* @__PURE__ */ N({
|
|
|
1989
1990
|
},
|
|
1990
1991
|
emits: ["update:modelValue"],
|
|
1991
1992
|
setup(e, { emit: r }) {
|
|
1992
|
-
const t = ye(), { i18n: { t: a } } = ve(), s = le(e, ["autofocus", "name"]), n = r, { value:
|
|
1993
|
+
const t = ye(), { i18n: { t: a } } = ve(), s = le(e, ["autofocus", "name"]), n = r, { value: u, hide: d, ...f } = Z(j(() => e.name));
|
|
1993
1994
|
if (f.error)
|
|
1994
1995
|
throw new Error(f.error.message);
|
|
1995
|
-
const i =
|
|
1996
|
-
function
|
|
1997
|
-
|
|
1996
|
+
const i = ie(f.path, j({ ...s, ...t })), m = u.value ? u.value.id : null, h = w(() => i.value.placeholder ? i.value.placeholder : a("plugins.free-form.foreign_placeholder", { entity: f.schema.value?.reference ?? "entity" })), l = se(m ?? "");
|
|
1997
|
+
function c(b) {
|
|
1998
|
+
m !== void 0 && b === "" && b !== m ? (u.value = null, n("update:modelValue", null)) : (u.value = { id: b.trim() }, n("update:modelValue", u.value));
|
|
1998
1999
|
}
|
|
1999
|
-
const
|
|
2000
|
-
return (
|
|
2000
|
+
const p = w(() => t["data-1p-ignore"] !== void 0 ? t["data-1p-ignore"] : me(e.name) === "name");
|
|
2001
|
+
return (b, A) => X((_(), L(be, H(o(i), {
|
|
2001
2002
|
class: "ff-foreign-field",
|
|
2002
|
-
"data-1p-ignore":
|
|
2003
|
+
"data-1p-ignore": p.value,
|
|
2003
2004
|
"data-autofocus": e.autofocus ? "true" : void 0,
|
|
2004
2005
|
"data-testid": `ff-${f.path.value}`,
|
|
2005
2006
|
error: e.error,
|
|
@@ -2007,24 +2008,24 @@ const be = /* @__PURE__ */ N({
|
|
|
2007
2008
|
help: e.help,
|
|
2008
2009
|
"model-value": l.value,
|
|
2009
2010
|
placeholder: h.value,
|
|
2010
|
-
"onUpdate:modelValue":
|
|
2011
|
-
}),
|
|
2011
|
+
"onUpdate:modelValue": c
|
|
2012
|
+
}), Y({ _: 2 }, [
|
|
2012
2013
|
o(i).labelAttributes?.info ? {
|
|
2013
2014
|
name: "label-tooltip",
|
|
2014
|
-
fn:
|
|
2015
|
-
O(
|
|
2015
|
+
fn: K(() => [
|
|
2016
|
+
O(b.$slots, "tooltip", {}, () => [
|
|
2016
2017
|
B("div", {
|
|
2017
2018
|
innerHTML: o(i).labelAttributes.info
|
|
2018
|
-
}, null, 8,
|
|
2019
|
+
}, null, 8, en)
|
|
2019
2020
|
], !0)
|
|
2020
2021
|
]),
|
|
2021
2022
|
key: "0"
|
|
2022
2023
|
} : void 0
|
|
2023
2024
|
]), 1040, ["data-1p-ignore", "data-autofocus", "data-testid", "error", "error-message", "help", "model-value", "placeholder"])), [
|
|
2024
|
-
[
|
|
2025
|
+
[Q, !o(d)]
|
|
2025
2026
|
]);
|
|
2026
2027
|
}
|
|
2027
|
-
}),
|
|
2028
|
+
}), an = /* @__PURE__ */ G(tn, [["__scopeId", "data-v-8c298e9f"]]), nn = ["data-testid"], on = ["data-testid"], rn = ["innerHTML"], sn = { class: "ff-map-field-item-content" }, ln = { class: "ff-map-field-fields" }, un = /* @__PURE__ */ N({
|
|
2028
2029
|
__name: "MapField",
|
|
2029
2030
|
props: {
|
|
2030
2031
|
keyPlaceholder: {},
|
|
@@ -2038,112 +2039,112 @@ const be = /* @__PURE__ */ N({
|
|
|
2038
2039
|
setup(e, { emit: r }) {
|
|
2039
2040
|
const { i18n: t } = ve(), a = e, s = r, {
|
|
2040
2041
|
keys: n,
|
|
2041
|
-
updateKey:
|
|
2042
|
+
updateKey: u,
|
|
2042
2043
|
addKey: d,
|
|
2043
2044
|
removeKey: f,
|
|
2044
2045
|
field: i,
|
|
2045
|
-
fieldDisplayName:
|
|
2046
|
-
} =
|
|
2047
|
-
function
|
|
2048
|
-
a.appearance?.string?.multiline || (
|
|
2046
|
+
fieldDisplayName: m
|
|
2047
|
+
} = ca(j(a, "name"), v), h = ie(i.path, a), l = ["string", "number", "boolean", "integer", "foreign"], c = w(() => a.oneLine ? !0 : i.schema?.value?.type === "map" && l.includes(i.schema.value.values.type) && !a.appearance?.string?.multiline), p = w(() => i.schema?.value?.type === "map" ? i.schema.value.values : void 0), b = w(() => p.value?.type === "string" && !p.value?.one_of), A = w(() => c.value ? "div" : Ee), q = et("root");
|
|
2048
|
+
function P(S, T) {
|
|
2049
|
+
a.appearance?.string?.multiline || (S.preventDefault(), T === n.value.length - 1 && d(), g(T + 1));
|
|
2049
2050
|
}
|
|
2050
|
-
async function g(
|
|
2051
|
-
|
|
2051
|
+
async function g(S) {
|
|
2052
|
+
q.value && (await Me(), q.value.querySelector(`[data-key-input="${S}"]`)?.focus());
|
|
2052
2053
|
}
|
|
2053
|
-
function
|
|
2054
|
+
function k() {
|
|
2054
2055
|
d();
|
|
2055
|
-
const
|
|
2056
|
-
g(
|
|
2056
|
+
const S = n.value.findIndex(([T, M]) => !M);
|
|
2057
|
+
g(S === -1 ? n.value.length - 1 : S);
|
|
2057
2058
|
}
|
|
2058
|
-
function v(
|
|
2059
|
-
s("legacyValueChange",
|
|
2059
|
+
function v(S) {
|
|
2060
|
+
s("legacyValueChange", S);
|
|
2060
2061
|
}
|
|
2061
|
-
return (
|
|
2062
|
-
const
|
|
2063
|
-
return o(i).error ? (
|
|
2062
|
+
return (S, T) => {
|
|
2063
|
+
const M = U("KAlert"), I = U("KLabel"), x = U("KButton"), C = U("KTooltip");
|
|
2064
|
+
return o(i).error ? (_(), L(M, {
|
|
2064
2065
|
key: 0,
|
|
2065
2066
|
appearance: "danger",
|
|
2066
2067
|
message: o(i).error.message
|
|
2067
|
-
}, null, 8, ["message"])) :
|
|
2068
|
+
}, null, 8, ["message"])) : X((_(), E("div", {
|
|
2068
2069
|
key: 1,
|
|
2069
2070
|
ref_key: "root",
|
|
2070
|
-
ref:
|
|
2071
|
+
ref: q,
|
|
2071
2072
|
class: "ff-map-field",
|
|
2072
2073
|
"data-testid": `ff-map-${o(i).path.value}`
|
|
2073
2074
|
}, [
|
|
2074
|
-
o(h).label ? (
|
|
2075
|
+
o(h).label ? (_(), E("header", {
|
|
2075
2076
|
key: 0,
|
|
2076
2077
|
class: "ff-map-field-header",
|
|
2077
2078
|
"data-testid": `ff-map-header-${o(i).path.value}`
|
|
2078
2079
|
}, [
|
|
2079
|
-
$(
|
|
2080
|
+
$(I, H({ class: "ff-map-field-label" }, o(h).labelAttributes, {
|
|
2080
2081
|
"data-testid": `ff-label-${o(i).path.value}`,
|
|
2081
2082
|
required: o(h).required,
|
|
2082
2083
|
"tooltip-attributes": o(h).labelAttributes.tooltipAttributes
|
|
2083
|
-
}),
|
|
2084
|
-
default:
|
|
2084
|
+
}), Y({
|
|
2085
|
+
default: K(() => [
|
|
2085
2086
|
pe(de(o(h).label) + " ", 1)
|
|
2086
2087
|
]),
|
|
2087
2088
|
_: 2
|
|
2088
2089
|
}, [
|
|
2089
2090
|
o(h).labelAttributes?.info ? {
|
|
2090
2091
|
name: "tooltip",
|
|
2091
|
-
fn:
|
|
2092
|
-
O(
|
|
2092
|
+
fn: K(() => [
|
|
2093
|
+
O(S.$slots, "tooltip", {}, () => [
|
|
2093
2094
|
B("div", {
|
|
2094
2095
|
innerHTML: o(h).labelAttributes.info
|
|
2095
|
-
}, null, 8,
|
|
2096
|
+
}, null, 8, rn)
|
|
2096
2097
|
], !0)
|
|
2097
2098
|
]),
|
|
2098
2099
|
key: "0"
|
|
2099
2100
|
} : void 0
|
|
2100
2101
|
]), 1040, ["data-testid", "required", "tooltip-attributes"])
|
|
2101
|
-
], 8,
|
|
2102
|
-
(
|
|
2103
|
-
key:
|
|
2102
|
+
], 8, on)) : z("", !0),
|
|
2103
|
+
(_(!0), E(te, null, re(o(n), ([y, D], W) => (_(), L(oe(A.value), {
|
|
2104
|
+
key: y,
|
|
2104
2105
|
class: Ce(["ff-map-field-item", {
|
|
2105
|
-
"ff-map-field-item-simple":
|
|
2106
|
-
"ff-map-field-item-complex": !
|
|
2106
|
+
"ff-map-field-item-simple": c.value,
|
|
2107
|
+
"ff-map-field-item-complex": !c.value
|
|
2107
2108
|
}]),
|
|
2108
|
-
"data-testid": `ff-map-container-${o(i).path.value}.${
|
|
2109
|
+
"data-testid": `ff-map-container-${o(i).path.value}.${W}`
|
|
2109
2110
|
}, {
|
|
2110
|
-
default:
|
|
2111
|
-
B("div",
|
|
2112
|
-
B("div",
|
|
2111
|
+
default: K(() => [
|
|
2112
|
+
B("div", sn, [
|
|
2113
|
+
B("div", ln, [
|
|
2113
2114
|
$(be, {
|
|
2114
2115
|
class: "ff-map-field-fields-key",
|
|
2115
|
-
"data-key-input":
|
|
2116
|
-
"data-testid": `ff-map-key-${o(i).path.value}.${
|
|
2117
|
-
"model-value":
|
|
2116
|
+
"data-key-input": W,
|
|
2117
|
+
"data-testid": `ff-map-key-${o(i).path.value}.${W}`,
|
|
2118
|
+
"model-value": D,
|
|
2118
2119
|
placeholder: e.keyPlaceholder || "Key",
|
|
2119
|
-
onKeydown: Ne(Te((
|
|
2120
|
-
"onUpdate:modelValue": (
|
|
2120
|
+
onKeydown: Ne(Te((J) => g(W), ["prevent"]), ["enter"]),
|
|
2121
|
+
"onUpdate:modelValue": (J) => o(u)(y, J)
|
|
2121
2122
|
}, null, 8, ["data-key-input", "data-testid", "model-value", "placeholder", "onKeydown", "onUpdate:modelValue"]),
|
|
2122
|
-
O(
|
|
2123
|
-
|
|
2123
|
+
O(S.$slots, "default", { keyId: y }, () => [
|
|
2124
|
+
b.value ? (_(), L(ht, {
|
|
2124
2125
|
key: 0,
|
|
2125
2126
|
"inline-vault-picker": "",
|
|
2126
2127
|
multiline: e.appearance?.string?.multiline,
|
|
2127
|
-
name:
|
|
2128
|
-
onKeydown: Ne((
|
|
2129
|
-
}, null, 8, ["multiline", "name", "onKeydown"])) : (
|
|
2128
|
+
name: y,
|
|
2129
|
+
onKeydown: Ne((J) => P(J, W), ["enter"])
|
|
2130
|
+
}, null, 8, ["multiline", "name", "onKeydown"])) : (_(), L(ge, {
|
|
2130
2131
|
key: 1,
|
|
2131
|
-
name:
|
|
2132
|
+
name: y
|
|
2132
2133
|
}, null, 8, ["name"]))
|
|
2133
2134
|
], !0)
|
|
2134
2135
|
]),
|
|
2135
|
-
$(
|
|
2136
|
-
text: o(t).t("actions.remove_entity", { entity: o(
|
|
2136
|
+
$(C, {
|
|
2137
|
+
text: o(t).t("actions.remove_entity", { entity: o(m) })
|
|
2137
2138
|
}, {
|
|
2138
|
-
default:
|
|
2139
|
-
$(
|
|
2139
|
+
default: K(() => [
|
|
2140
|
+
$(x, {
|
|
2140
2141
|
appearance: "tertiary",
|
|
2141
|
-
"aria-label": o(t).t("actions.remove_entity", { entity: o(
|
|
2142
|
-
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${
|
|
2142
|
+
"aria-label": o(t).t("actions.remove_entity", { entity: o(m) }),
|
|
2143
|
+
"data-testid": `ff-map-remove-btn-${o(i).path.value}.${W}`,
|
|
2143
2144
|
icon: "",
|
|
2144
|
-
onClick: (
|
|
2145
|
+
onClick: (J) => o(f)(y)
|
|
2145
2146
|
}, {
|
|
2146
|
-
default:
|
|
2147
|
+
default: K(() => [
|
|
2147
2148
|
$(o(rt))
|
|
2148
2149
|
]),
|
|
2149
2150
|
_: 1
|
|
@@ -2155,25 +2156,25 @@ const be = /* @__PURE__ */ N({
|
|
|
2155
2156
|
]),
|
|
2156
2157
|
_: 2
|
|
2157
2158
|
}, 1032, ["class", "data-testid"]))), 128)),
|
|
2158
|
-
$(
|
|
2159
|
+
$(x, {
|
|
2159
2160
|
appearance: "tertiary",
|
|
2160
|
-
"aria-label": o(t).t("actions.add_entity", { entity: o(
|
|
2161
|
+
"aria-label": o(t).t("actions.add_entity", { entity: o(m) }),
|
|
2161
2162
|
class: "ff-map-field-add-entry-btn",
|
|
2162
2163
|
"data-testid": `ff-map-add-btn-${o(i).path.value}`,
|
|
2163
|
-
onClick:
|
|
2164
|
+
onClick: k
|
|
2164
2165
|
}, {
|
|
2165
|
-
default:
|
|
2166
|
-
$(o(
|
|
2167
|
-
pe(" " + de(o(t).t("actions.add_entity", { entity: o(
|
|
2166
|
+
default: K(() => [
|
|
2167
|
+
$(o(je)),
|
|
2168
|
+
pe(" " + de(o(t).t("actions.add_entity", { entity: o(m) })), 1)
|
|
2168
2169
|
]),
|
|
2169
2170
|
_: 1
|
|
2170
2171
|
}, 8, ["aria-label", "data-testid"])
|
|
2171
|
-
], 8,
|
|
2172
|
-
[
|
|
2172
|
+
], 8, nn)), [
|
|
2173
|
+
[Q, !o(i).hide.value]
|
|
2173
2174
|
]);
|
|
2174
2175
|
};
|
|
2175
2176
|
}
|
|
2176
|
-
}),
|
|
2177
|
+
}), cn = /* @__PURE__ */ G(un, [["__scopeId", "data-v-1431df84"]]), ge = /* @__PURE__ */ N({
|
|
2177
2178
|
name: "AutoField",
|
|
2178
2179
|
__name: "Field",
|
|
2179
2180
|
props: {
|
|
@@ -2183,50 +2184,50 @@ const be = /* @__PURE__ */ N({
|
|
|
2183
2184
|
},
|
|
2184
2185
|
emits: ["globalAction"],
|
|
2185
2186
|
setup(e) {
|
|
2186
|
-
const r = e, t =
|
|
2187
|
+
const r = e, t = Z(j(r, "name")), a = w(() => {
|
|
2187
2188
|
switch (t.schema?.value?.type) {
|
|
2188
2189
|
case "string":
|
|
2189
2190
|
return "one_of" in t.schema.value ? Se : ht;
|
|
2190
2191
|
case "boolean":
|
|
2191
|
-
return "one_of" in t.schema.value ? Se :
|
|
2192
|
+
return "one_of" in t.schema.value ? Se : va;
|
|
2192
2193
|
case "number":
|
|
2193
2194
|
case "integer":
|
|
2194
|
-
return "one_of" in t.schema.value ? Se :
|
|
2195
|
+
return "one_of" in t.schema.value ? Se : Wa;
|
|
2195
2196
|
case "array":
|
|
2196
|
-
return
|
|
2197
|
+
return La;
|
|
2197
2198
|
case "set":
|
|
2198
|
-
return
|
|
2199
|
+
return Bt(t.schema) ? gt : Se;
|
|
2199
2200
|
case "record":
|
|
2200
|
-
return
|
|
2201
|
+
return Ba;
|
|
2201
2202
|
case "map":
|
|
2202
|
-
return
|
|
2203
|
+
return cn;
|
|
2203
2204
|
case "json":
|
|
2204
|
-
return
|
|
2205
|
+
return Za;
|
|
2205
2206
|
case "foreign":
|
|
2206
|
-
return
|
|
2207
|
+
return an;
|
|
2207
2208
|
default:
|
|
2208
2209
|
return;
|
|
2209
2210
|
}
|
|
2210
2211
|
});
|
|
2211
2212
|
return (s, n) => {
|
|
2212
|
-
const
|
|
2213
|
-
return
|
|
2214
|
-
(
|
|
2215
|
-
o(t).error ? (
|
|
2213
|
+
const u = U("KAlert");
|
|
2214
|
+
return _(), E(te, null, [
|
|
2215
|
+
(_(), L(oe(s.$slots[o(ke)]))),
|
|
2216
|
+
o(t).error ? (_(), L(u, {
|
|
2216
2217
|
key: 0,
|
|
2217
2218
|
appearance: "danger",
|
|
2218
2219
|
message: o(t).error.message
|
|
2219
|
-
}, null, 8, ["message"])) : o(t).renderer.value ? (
|
|
2220
|
+
}, null, 8, ["message"])) : o(t).renderer.value ? (_(), L(oe(o(t).renderer.value), {
|
|
2220
2221
|
key: 1,
|
|
2221
2222
|
autofocus: r.autofocus,
|
|
2222
|
-
name:
|
|
2223
|
+
name: Ve(o(t).path.value),
|
|
2223
2224
|
onGlobalAction: n[0] || (n[0] = (d, f) => s.$emit("globalAction", d, f))
|
|
2224
|
-
}, null, 40, ["autofocus", "name"])) : (
|
|
2225
|
-
a.value ? (
|
|
2225
|
+
}, null, 40, ["autofocus", "name"])) : (_(), E(te, { key: 2 }, [
|
|
2226
|
+
a.value ? (_(), L(oe(a.value), {
|
|
2226
2227
|
key: 0,
|
|
2227
2228
|
autofocus: r.autofocus,
|
|
2228
|
-
name:
|
|
2229
|
-
}, null, 8, ["autofocus", "name"])) : (
|
|
2229
|
+
name: Ve(o(t).path.value)
|
|
2230
|
+
}, null, 8, ["autofocus", "name"])) : (_(), L(u, {
|
|
2230
2231
|
key: 1,
|
|
2231
2232
|
appearance: "warning",
|
|
2232
2233
|
message: `${o(t).path.value} ${o(t).schema.value.type} (no renderer yet)`
|
|
@@ -2236,7 +2237,7 @@ const be = /* @__PURE__ */ N({
|
|
|
2236
2237
|
], 64);
|
|
2237
2238
|
};
|
|
2238
2239
|
}
|
|
2239
|
-
}),
|
|
2240
|
+
}), On = /* @__PURE__ */ N({
|
|
2240
2241
|
name: "SchemaForm",
|
|
2241
2242
|
__name: "Form",
|
|
2242
2243
|
props: {
|
|
@@ -2249,71 +2250,71 @@ const be = /* @__PURE__ */ N({
|
|
|
2249
2250
|
},
|
|
2250
2251
|
emits: ["change", "globalAction"],
|
|
2251
2252
|
setup(e, { expose: r, emit: t }) {
|
|
2252
|
-
const a = t, s = we(), { getSchema: n, formData:
|
|
2253
|
+
const a = t, s = we(), { getSchema: n, formData: u, setValue: d, getValue: f, rootRenderRules: i } = aa({
|
|
2253
2254
|
schema: e.schema,
|
|
2254
|
-
propsData:
|
|
2255
|
+
propsData: w(() => e.data),
|
|
2255
2256
|
propsConfig: e.config,
|
|
2256
|
-
propsRenderRules:
|
|
2257
|
+
propsRenderRules: j(() => e.renderRules),
|
|
2257
2258
|
onChange: (h) => a("change", h)
|
|
2258
|
-
}),
|
|
2259
|
+
}), m = w(() => {
|
|
2259
2260
|
const { fields: h } = n();
|
|
2260
2261
|
let l = [...h];
|
|
2261
2262
|
return e.fieldsOrder ? lt(l, e.fieldsOrder) : (i.value?.bundles && (l = ut([...l], i.value.bundles)), l);
|
|
2262
2263
|
});
|
|
2263
2264
|
return r({
|
|
2264
2265
|
getValue: f,
|
|
2265
|
-
getRawValue: () => Qe(
|
|
2266
|
+
getRawValue: () => Qe(u),
|
|
2266
2267
|
setValue: d
|
|
2267
|
-
}), (h, l) => (
|
|
2268
|
-
default:
|
|
2269
|
-
(
|
|
2268
|
+
}), (h, l) => (_(), L(oe(e.tag), null, {
|
|
2269
|
+
default: K(() => [
|
|
2270
|
+
(_(), L(oe(o(s)[o(ke)]))),
|
|
2270
2271
|
O(h.$slots, "default", {}, () => [
|
|
2271
|
-
(
|
|
2272
|
-
key: Object.keys(
|
|
2273
|
-
name: Object.keys(
|
|
2274
|
-
onGlobalAction: l[0] || (l[0] = (
|
|
2272
|
+
(_(!0), E(te, null, re(m.value, (c) => (_(), L(ge, {
|
|
2273
|
+
key: Object.keys(c)[0],
|
|
2274
|
+
name: Object.keys(c)[0],
|
|
2275
|
+
onGlobalAction: l[0] || (l[0] = (p, b) => a("globalAction", p, b))
|
|
2275
2276
|
}, null, 8, ["name"]))), 128))
|
|
2276
2277
|
])
|
|
2277
2278
|
]),
|
|
2278
2279
|
_: 3
|
|
2279
2280
|
}));
|
|
2280
2281
|
}
|
|
2281
|
-
}),
|
|
2282
|
+
}), Dn = /* @__PURE__ */ N({
|
|
2282
2283
|
__name: "FieldRenderer",
|
|
2283
2284
|
props: {
|
|
2284
2285
|
match: { type: Function },
|
|
2285
2286
|
priority: {}
|
|
2286
2287
|
},
|
|
2287
2288
|
setup(e) {
|
|
2288
|
-
const r = e, { default: t } = we(), { fieldRendererRegistry: a } =
|
|
2289
|
+
const r = e, { default: t } = we(), { fieldRendererRegistry: a } = ne();
|
|
2289
2290
|
return t && a.set(r.match, t), (s, n) => null;
|
|
2290
2291
|
}
|
|
2291
|
-
}), cn = { cancel: "Cancel", view_configuration: "View configuration", create: "New plugin", create_custom: "Create", configure: "Configure", copy_id: "Copy ID", copy_json: "Copy JSON", edit: "Edit", enable: "Enable", enabled: "Enabled", disable: "Disable", delete: "Delete", disabled: "Disabled", confirm_delete: "Yes, delete", view: "View details", configure_dynamic_ordering: "Configure dynamic ordering", go_to_plugins: "Go to plugins", save: "Save", add_entity: "Add {entity}", remove_entity: "Remove {entity}", loading_spinner: "Loading..." }, dn = { title: "Configuration", message: "Export configurations for core Kong Gateway objects, like services, routes, and plugins, to either YAML, JSON, or Terraform. This allows for straightforward importing into APIOps tools like decK with YAML, Insomnia and cURL with JSON, or Terraform products with Terraform.", yaml: "YAML", terraform: "Terraform", json: "JSON", deck: "decK" }, pn = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, mn = { general: "Plugins could not be retrieved", delete: "The plugin could not be deleted at this time.", copy: "Failed to copy to clipboard", load_results: "Error loading available plugins", load_schema: "Error loading plugin schema" }, fn = { placeholder: { konnect: "Filter by name", exact: "Filter by exact instance name or ID", kongManager: "Filter by exact instance name or ID", select: "Filter plugins", search_plugins: "Search plugins", search: "Search", tags_filter: "Type part of a tag and press Enter", scope_filter: "Select scopes" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, hn = { new: "New" }, gn = /* @__PURE__ */ JSON.parse(`{"title":"Plugins","list":{"toolbar_actions":{"new_plugin":"New plugin"},"table_headers":{"applied_to":"Applied to","applied_to_badges":{"consumer":"Consumer","global":"Global","route":"Route","service":"Service","consumer_group":"Consumer group"},"id":"ID","plugin":"Plugin","name":"Name","instance_name":"Instance name","scope":"Scope","status":"Status","ordering":"Ordering","ordering_badge":{"dynamic":"Dynamic","static":"Static"},"enabled":"Enabled","tags":"Tags","updated_at":"Last modified"},"empty_state":{"title":"Configure a new plugin","description":"Plugins are used to extend Kong functionality."},"empty_state_v2":{"title":"Configure your first plugin","description":"Plugins extend gateways functionalities, offering features like authentication, rate limiting, and request transformations to enhance security and performance.","create_cta":"New plugin","group":"Plugins created in gateways within this group will automatically appear here.","learn_more":"Learn more"}},"meta":{"basic-auth":{"name":"Basic Authentication","credential_name":"Basic Auth Credential","description":"Add Basic Authentication to your services"},"hmac-auth":{"name":"HMAC Authentication","credential_name":"HMAC Credential","description":"Add HMAC Authentication to your services"},"jwt-signer":{"name":"JWT Signer","description":"Verify and (re-)sign one or two tokens in a request"},"jwt":{"name":"JWT","credential_name":"JWT Credential","description":"Verify and authenticate JSON Web Tokens"},"key-auth":{"name":"Key Authentication","credential_name":"Key Auth Credential","description":"Add key authentication to your services"},"key-auth-enc":{"name":"Key Authentication Encrypted","credential_name":"Key Auth Encrypted","description":"Add key authentication to your services with an encrypted token"},"ldap-auth-advanced":{"name":"LDAP Authentication Advanced","description":"Integrate Kong with a LDAP server"},"ldap-auth":{"name":"LDAP Authentication","description":"Integrate Kong with a LDAP server"},"oauth2-introspection":{"name":"OAuth 2.0 Introspection","description":"Integrate Kong with a third-party OAuth 2.0 Authorization Server"},"oauth2":{"name":"OAuth 2.0 Authentication","credential_name":"OAuth 2.0 Application","description":"Add OAuth 2.0 authentication to your services"},"openid-connect":{"name":"OpenID Connect","description":"Integrate Kong with a third-party OpenID Connect 1.0 provider"},"mtls-auth":{"name":"Mutual TLS Authentication","description":"Secure routes and services with client certificate and mutual TLS authentication"},"vault-auth":{"name":"Vault Authentication","description":"Secure routes and services with an access token and secret token, stored securely via Vault"},"bot-detection":{"name":"Bot Detection","description":"Detect and clock bots or custom clients"},"cors":{"name":"CORS","description":"Allow developers to make requests from the browser"},"ip-restriction":{"name":"IP Restriction","description":"Whitelist or blacklist IPs that can make requests"},"opa":{"name":"OPA","description":"Authorize requests against Open Policy Agent"},"kubernetes-sidecar-injector":{"name":"Kubernetes Sidecar Injector","description":"This plugin will inject Kong dataplane nodes and form a service mesh on top of Kubernetes"},"request-validator":{"name":"Request Validator","description":"Validate requests before they reach their upstream service."},"acl":{"name":"ACL","credential_name":"Access Control Group","description":"Control which consumers can access services"},"canary":{"name":"Canary Release","description":"Methodically roll out software changes to a subset of users"},"forward-proxy":{"name":"Forward Proxy","description":"Allow Kong to connect to intermediary transparent HTTP proxies"},"proxy-cache":{"name":"Proxy Caching","description":"Cache and serve commonly requested responses in Kong"},"proxy-cache-advanced":{"name":"Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"graphql-proxy-cache-advanced":{"name":"GraphQL Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"rate-limiting-advanced":{"name":"Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"rate-limiting":{"name":"Rate Limiting","description":"Rate-limit how many HTTP requests a developer can make"},"graphql-rate-limiting-advanced":{"name":"GraphQL Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"mocking":{"name":"Mocking","description":"Provide mock endpoints to test your APIs in development against your services"},"request-size-limiting":{"name":"Request Size Limiting","description":"Block requests with bodies greater than a specific size"},"request-termination":{"name":"Request Termination","description":"Terminate all requests with a specific response"},"response-ratelimiting":{"name":"Response Rate Limiting","description":"Rate-Limiting based on a custom response header value"},"route-by-header":{"name":"Route by Header","description":"Route requests based on request headers"},"ai-proxy":{"name":"AI Proxy","description":"Directly call a configured LLM, with mediated security and tuning parameters, and using standardised Kong request and response formats."},"ai-prompt-decorator":{"name":"AI Prompt Decorator","description":"Prepend and append chat prompts to AI Proxy plugin LLM requests."},"ai-prompt-template":{"name":"AI Prompt Template","description":"Define a set of templates, containing string variable placeholders, that can be consumed by users when used with the AI Proxy plugin."},"ai-prompt-guard":{"name":"AI Prompt Guard","description":"Define a set of valid, and a set of invalid, regular expression patterns when calling LLM models with the AI Proxy plugin."},"ai-request-transformer":{"name":"AI Request Transformer","description":"Use an LLM to transform API request from a user, before sending to the upstream service."},"ai-response-transformer":{"name":"AI Response Transformer","description":"Use an LLM to transform API responses from the upstream service, before returning to the user."},"ai-rate-limiting-advanced":{"name":"AI Rate Limiting Advanced","description":"Provides rate limiting for the providers used by any AI plugins."},"ai-azure-content-safety":{"name":"AI Azure Content Safety","description":"Allows checking and auditing of AI-Proxy plugin messages, using Azure Cognitive Services, before proxying to upstream large-language model."},"aws-lambda":{"name":"AWS Lambda","description":"Invoke and manage AWS Lambda functions from Kong"},"azure-functions":{"name":"Azure Functions","description":"Invoke Azure functions"},"openwhisk":{"name":"OpenWhisk","description":"Invoke and manage OpenWhisk actions from Kong"},"pre-function":{"name":"Kong Functions (Pre-Plugins)","description":"Add and manage custom lua functions to run before other plugins"},"post-function":{"name":"Kong Functions (Post-Plugins)","description":"Add and manage custom lua functions to run after other plugins"},"datadog":{"name":"Datadog","description":"Visualize metrics on Datadog"},"prometheus":{"name":"Prometheus","description":"Export performance metrics to Prometheus"},"zipkin":{"name":"Zipkin","description":"Propagate zipkin spans and report spans to a zipkin server"},"collector":{"name":"Collector","description":"Automate spec-driven development & anomaly detection (Early Access)"},"response-transformer-advanced":{"name":"Response Transformer Advanced","description":"Transform the response sent by the upstream server on the fly on Kong, before returning the response to the client."},"correlation-id":{"name":"Correlation ID","description":"Correlate requests and responses using a unique ID"},"request-transformer-advanced":{"name":"Request Transformer Advanced","description":"Use powerful regular expressions, variables and templates to transform API requests"},"request-transformer":{"name":"Request Transformer","description":"Modify the request before hitting the upstream server"},"response-transformer":{"name":"Response Transformer","description":"Modify the upstream response before returning it to the client"},"route-transformer-advanced":{"name":"Route Transformer Advanced","description":"Transforms the routing on the fly in Kong, changing the upstream server/port/path to hit"},"kafka-upstream":{"name":"Kafka Upstream","description":"Transform requests into Kafka messages in a topic"},"degraphql":{"name":"DeGraphQL","description":"Transform a GraphQL upstream into a REST API"},"exit-transformer":{"name":"Exit Transformer","description":"Customize Kong exit responses sent downstream"},"jq":{"name":"jq","description":"Transform JSON objects included in API requests or responses using jq programs"},"file-log":{"name":"File Log","description":"Append request and response data to a log file on disk"},"http-log":{"name":"HTTP Log","description":"Send request and response logs to an HTTP server"},"loggly":{"name":"Loggly","description":"Send request and response logs to Loggly"},"statsd-advanced":{"name":"StatsD Advanced","description":"Send traffic and Kong performance metrics to StatsD"},"statsd":{"name":"StatsD","description":"Send request and response logs to StatsD"},"syslog":{"name":"Syslog","description":"Send request and response logs to Syslog"},"tcp-log":{"name":"TCP Log","description":"Send request and response logs to a TCP server"},"udp-log":{"name":"UDP Log","description":"Send request and response logs to a UDP server"},"kafka-log":{"name":"Kafka Log","description":"Publish request and response logs to a Kafka topic"},"session":{"name":"Session","description":"Sessions for Kong authentication"},"upstream-tls":{"name":"Upstream TLS","description":"Enable TLS on upstream traffic by providing Kong with a list of trusted certificates."},"application-registration":{"name":"Portal Application Registration","description":"Allow portal developers to register applications against services"},"konnect-application-auth":{"name":"Konnect Application Auth","description":"Allow Konnect portal developers to register applications against services"},"acme":{"name":"ACME","description":"Let's Encrypt and ACMEv2 integration with Kong"},"grpc-gateway":{"name":"gRPC Gateway","description":"Access gRPC services through HTTP REST"},"grpc-web":{"name":"gRPC Web","description":"Allow browser clients to call gRPC services"},"upstream-timeout":{"name":"Upstream Timeout","description":"Configure read, send and connect timeouts to an upstream"},"opentelemetry":{"name":"OpenTelemetry","description":"Propagate distributed tracing spans and report low-level spans to a OTLP-compatible server"},"websocket-validator":{"name":"WebSocket Validator","description":"Validate individual WebSocket messages against to a user-specified schema before proxying them"},"websocket-size-limit":{"name":"WebSocket Size Limit","description":"Allows operators to specify a maximum size for incoming WebSocket messages"},"tls-metadata-headers":{"name":"TLS Metadata Headers","description":"Detects client certificates in requests, retrieves the TLS metadata, and proxies this metadata via HTTP headers"},"tls-handshake-modifier":{"name":"TLS Handshake Modifier","description":"Requests the client certificate and if it exists, makes it available to other plugins acting on the request"},"oas-validation":{"name":"OAS Validation","description":"Validate HTTP requests and responses based on an API specification."},"jwe-decrypt":{"name":"Kong JWE Decrypt","description":"The Kong JWE Decrypt plugin makes it possible to decrypt an inbound token(JWE) in a request."},"xml-threat-protection":{"name":"XML Threat Protection","description":"Reduce the risk of XML attacks by checking the structure of XML payloads."},"saml":{"name":"SAML","description":"Security Assertion Markup Language (SAML) is an open standard for exchanging authentication and authorization data between an identity provider and a service provider."},"app-dynamics":{"name":"AppDynamics","description":"This plugin integrates Kong with the AppDynamics APM platform so that proxy requests handled by Kong can be identified and analyzed in AppDynamics."},"json-threat-protection":{"name":"JSON Threat Protection","description":"Apply size checks on JSON payload and minimize risk of content-level attacks"},"standard-webhooks":{"name":"Standard Webhooks","description":"Validate incoming webhooks adhere to the Standard Webhooks specification, to which Kong is a contributor"},"ai-proxy-advanced":{"name":"AI Proxy Advanced","description":"Route across different LLMs and models using advanced load balancing algorithms, including semantic routing."},"ai-semantic-cache":{"name":"AI Semantic Cache","description":"Semantically cache AI requests to any LLM to reduce latency, improve end-user experiences and optimize GenAI costs."},"ai-semantic-prompt-guard":{"name":"AI Semantic Prompt Guard","description":"Semantically and intelligently create allow and deny lists of topics that can be requested across every LLM."},"header-cert-auth":{"name":"Header Certificate Authentication","description":"Authenticate clients with MTLS certificate passed in header by a WAF or load balancer"},"upstream-oauth":{"name":"Upstream OAuth","description":"Configure Kong to obtain a OAuth2 token to consume an upstream API"},"confluent":{"name":"Confluent","description":"Streamlines integration with Confluent Cloud and transforms requests into messages published to a Confluent topic."},"service-protection":{"name":"Service Protection","description":"Prevent abuse and protect services with absolute limits on the number of requests reaching the service."},"injection-protection":{"name":"Injection Protection","description":"Protect against injection attacks by rejecting requests that match common injections patterns."},"redirect":{"name":"Redirect","description":"Redirect incoming requests to a new URL"},"kafka-consume":{"name":"Kafka Consume","description":"Consume messages from Kafka topics over HTTP protocols."},"confluent-consume":{"name":"Confluent Consume","description":"Consume messages from Confluent Kafka topics over HTTP protocols"},"request-callout":{"name":"Request Callout","description":"Callout to third party APIs as part of request processing."},"ai-sanitizer":{"name":"AI Sanitizer","description":"Sanitize personal or sensitive information from prompts before sending to LLM."},"ai-rag-injector":{"name":"AI RAG Injector","description":"Attach contextual knowledge from vector databases with flexible template to LLM prompts."},"datakit":{"name":"Datakit","description":"Datakit is a workflow engine for working with external APIs."},"ai-prompt-compressor":{"name":"AI Prompt Compressor","description":"The AI Prompt Compressor reduces costs associated with LLMs by compressing prompts."},"solace-upstream":{"name":"Solace Upstream","description":"Transform requests into Solace messages in a Solace queue or topic."},"ai-aws-guardrails":{"name":"AI AWS GuardRails","description":"The AI AWS GuardRails enables enforcement of introspection with the AWS GuardRails service for all requests processed by the AI Proxy plugin."},"ace":{"name":"Konnect Access Control Enforcement","description":"Enable Developer Self-Service for Konnect Dev Portals."},"solace-consume":{"name":"Solace Consume","description":"Consume messages from Solace and make them available through HTTP endpoints."},"solace-log":{"name":"Solace Log","description":"Publish request and response logs to a Solace topic."},"ai-llm-as-judge":{"name":"AI LLM Judge","description":"Evaluate LLM responses with an external LLM service and use accuracy scores to drive dynamic load balancing for \`llm/v1/chat\` requests."},"ai-mcp-proxy":{"name":"AI MCP Proxy","description":"Convert APIs into MCP tools, proxy MCP servers, expose multiple MCP tools, and observe MCP traffic in real time."},"ai-gcp-model-armor":{"name":"AI GCP Model Armor","description":"Audit and validate AI Proxy messages with Google Cloud Model Armor before forwarding them to an upstream LLM."},"ai-mcp-oauth2":{"name":"AI MCP OAuth2","description":"Secure MCP server access with OAuth2 authentication."},"ai-semantic-response-guard":{"name":"AI Semantic Response Guard","description":"Permit or block prompts based on semantic similarity to known LLM responses, preventing misuse of \`llm/v1/chat\` or \`llm/v1/completions\` requests."},"ai-lakera-guard":{"name":"AI Lakera Guard","description":"Audit and enforce safety policies on LLM requests and responses using the AI AWS Lakera plugin before they reach upstream LLMs."},"ai-a2a-proxy":{"name":"AI A2A Proxy","description":"Securely proxy A2A agents, with real-time RPC tracing and monitoring."},"ai-custom-guardrail":{"name":"AI Custom Guardrail","description":"Integrate with any 3rd-party Guardrail service, with customizable enforcement modes — choose whether violations block, log, or allow traffic to proceed."},"metering-and-billing":{"name":"Metering & Billing","description":"Meter API requests and AI token usage for usage-based billing. Supports flexible customer identification, custom pricing dimensions, and fine-grained traffic filtering. Integrates natively with Konnect Metering & Billing."},"governance":{"name":"Governance","description":"Enforce feature-level access control and credit-balance gating for API consumers. Integrates with Konnect Metering & Billing to allow or deny requests based on customer entitlements."}},"fields":{"service":"Service ID","route":"Route ID","consumer":"Consumer ID","consumer_group":"Consumer group ID"},"select":{"custom_badge_text":"This plugin is data plane node specific","cloned_from_badge":"Cloned from {link}","installed_custom_badge":"Installed custom","streamed_custom_badge":"Streamed custom","unavailable_tooltip":"This plugin is not available","already_exists":"This plugin is already applied to this resource","misc_plugins":"Other plugins","show_all":"Show all","view_more":"View more","view_less":"View less","filter":{"title":"Filter plugins","featured":"Featured","type":"Type","clear":"Clear"},"list":{"table_headers":{"name":"Plugin","description":"Description"}},"tabs":{"kong":{"title":"Kong plugins","description":"Kong plugins are bundled by default with Kong Gateway and are available across all control planes.","empty_title":"No plugins","empty_description":"No plugins are available."},"custom":{"title":"Custom plugins","description":"Custom plugins will be available in this control plane only.","disabled_tooltip":"Custom plugins are not available with this gateway. Create a hybrid or dedicated cloud gateway to leverage custom plugins.","fetch_error":"Unable to load some custom plugins. Bundled plugins are still available.","license_required":"Plugin cloning requires a license to be used.","empty_title":"No custom plugins","empty_description":"No custom plugins have been added to this control plane.","create":{"name":"Custom plugin","description":"Upload schema file to create custom plugin"}}},"highlighted_plugins":{"title":"Highlighted plugins"}},"form":{"button_deck_customize":"Customize before copying to CLI","disable_data_retrieving":"You do not have permission to select {scope}","disable_source_scope_change":"Changing the {scope} is not allowed when configuring a plugin under it","no_selection":"No selection...","fields":{"enabled":{"label":"Enabled","on_text":"This plugin is enabled","off_text":"This plugin is disabled"},"plugin_status":{"label":"Plugin status","text_on":"Enabled","text_off":"Disabled"},"instance_name":{"label":"Name","placeholder":"Enter a unique name","help":"A custom name for this plugin instance to help with identifying from the list view."},"condition":{"label":"Execution condition","placeholder":"Enter an expression","tooltip":"An expression used for conditional control over plugin execution. If the expression evaluates to true during the request flow, the plugin is executed; otherwise, it is skipped.","help":{"learn":"Learn more","about":"{link} about plugin conditions."}},"protocols":{"label":"Protocols","placeholder":"Select valid protocols for the plugin","placeholderWithDefaultValues":"Select valid protocols for the plugin. Default protocols: {protocols}","help":"A list of the request protocols that will trigger this plugin. The default value, as well as the possible values allowed on this field, may change depending on the plugin type."},"tags":{"label":"Tags","help":"An optional set of strings for grouping and filtering, separated by commas.","placeholder":"Tag1, Tag2, Tag3"}},"scoping":{"label":"Scoped","placeholder":"Search by name or UUID","disable_global_radio":"The plugin is set to 'scoped' by default. To apply a plugin globally, please navigate to the global plugin list page.","global":{"label":"Global","help":"All services, routes, and consumers"},"gateway_service":{"label":"Select a gateway service","help":"The gateway service to which this plugin configuration will apply","placeholder":"Select a gateway service","plural":"Gateway services"},"route":{"label":"Select a route","help":"The route that this plugin configuration will target","placeholder":"Select a route","plural":"Routes"},"consumer":{"label":"Select a consumer","help":"The consumer that this plugin configuration will target","placeholder":"Select a consumer","plural":"Consumers"},"consumer_group":{"label":"Select a consumer group","help":"The consumer group that this plugin configuration will target","placeholder":"Select a consumer group","plural":"Consumer groups"}},"grouping":{"plugin_configuration":{"title":"Plugin configuration","description":"Configuration parameters for this plugin. View advanced parameters for extended configuration.","empty":"This plugin does not have required parameters."},"advanced_parameters":{"view":"Show additional settings","hide":"Hide additional settings"}},"field_rules":{"at_least_one_of":"At least one of the following values is required: {parameters}.","only_one_of":"Exactly one of these parameters is required: {parameters}","mutually_required":"These values must be used together: {parameters}.","mutually_exclusive":"Only one of these values can be used: {parameters}.","only_one_of_mutually_required":"Exactly one of the following parameter combinations is required (all parameters within a chosen combination are required):"},"sections":{"plugin_scope":{"title":"Plugin scope","description":"Choose whether this plugin applies to all traffic (global) or is scoped to a specific service, route, or consumer."},"general_info":{"title":"General information","description":"Add details to help identify and manage your plugin."},"plugin_config":{"title":"Plugin configuration","description":"Set the plugin's behavior by defining its configuration settings."},"plugin_general_info":{"description":"Add a name or tags to help you identify and manage this plugin later."},"code_mode":{"title":"Code editor","description":"Configure this plugin by using YAML configuration."}}},"free-form":{"editor_mode":{"visual":"Visual editor","code":"Code editor"},"code-lens":{"entity":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","certificate":"Certificate"},"field":{"name":"{entity} \\"{value}\\"","username":"Username \\"{value}\\"","custom_id":"Custom ID \\"{value}\\"","subject":"Subject \\"{value}\\"","expires_after":"Expires after \\"{value}\\""},"action":{"view_entity":"View {title}","copy_certificate":"Copy certificate","copy_uuid":"Copy UUID","retry_fetch":"Retry fetch (Hover for details)"},"unknown_error":"Unknown error"},"acl":{"mode":{"allow":"Use allow list","deny":"Use deny list","allow_when":"Use allow expression list","deny_when":"Use deny expression list"}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"openid-connect":{"tabs":{"common":{"title":"Common Configuration Settings","description":"Parameters for enabling the OpenID Connect plugin. Set these parameters before adding authorization, authentication, or other advanced configuration details."},"authorization":{"title":"Authorization Configuration Settings","description":"Parameters for setting up claims-based authorization."},"advanced":{"title":"Advanced Configuration Settings","description":"Advanced parameters for manually configuring the OpenID Connect plugin."}},"auth_methods":{"label":"Authentication methods","placeholder":"Select authentication methods","hint":"Configure which OAuth and OpenID Connect features are supported.","km_label":"Auth methods","methods":{"authorization_code":"Authorization code flow","bearer":"Bearer access token","client_credentials":"Client credentials grant","password":"Passwords grant","introspection":"Introspection","userinfo":"UserInfo","kong_oauth2":"Kong OAuth","refresh_token":"Refresh token"},"session":{"label":"Session management","switch_label":"Enable Session Management","use_label":"Use sessions","use_description":"Issue a session cookie after successful authentication. Subsequent requests use the session instead of re-authenticating with the identity provider.","no_use_label":"Do not use sessions","no_use_description":"Authenticate each request using the configured authentication flow."}},"principals":{"header":"Who should manage authentication and credentials?","description":"Use External auth server to continue using your existing OAuth provider and authentication workflows. Use Kong Identity to adopt a newer principal-based model that centralizes and simplifies identity and authentication management.","learn_more":"Learn more.","kong_identity_label":"Kong Identity","kong_identity_description":"Use Kong Identity to authenticate OpenID Connect tokens. If all data plane nodes are running version 3.15 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","external_label":"External auth server","external_description":"Connect to your existing identity provider to manage authentication outside of Kong.","guide":{"title":"Add principals","description":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products.","description_external":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products. Requires data plane nodes to be running version 3.15 or later.","create":"Create principal","learn_more":"Learn more"},"auth_server":{"label":"Authorization Server","info":"The Kong Identity auth server that will act as the OpenID Connect provider for this plugin.","placeholder":"Select an Authorization Server","create":"Create authorization server","create_hint":"You'll need to return here after creating an authorization server. Your progress won't be saved.","no_access_help":"You don't have access to browse authorization servers. Enter the issuer URL of your Kong Identity authorization server directly.","issuer_placeholder":"e.g., https://your-auth-server.identity.konghq.com"},"client":{"label":"Client","id_label":"Client id","secret_label":"Client secret","placeholder":"Select a client","id_placeholder":"e.g., kong-gateway-client","secret_placeholder":"e.g., your-client-secret","create":"Create client","create_hint":"You'll need to return here after creating a client. Your progress won't be saved.","add":"Add client","remove":"Remove client"},"leave_prompt":{"title":"Leave this page?","message":"Your unsaved changes will be lost if you continue.","action":"Leave page"},"dp_version_alert":"We detected that one or more data plane nodes are running a version earlier than 3.15. If principal lookup is enabled, requests handled by those data plane nodes will fail."},"lookup":{"collapse_label":"Show additional settings","toggle_label":"Use principal lookup","toggle_info":"Look up the authenticated principal in Kong Identity after token validation. Enable this when the validated token doesn't contain all of the identity data required for authorization or activity logging.","method":{"label":"Principal lookup method","placeholder":"Select a lookup method","help":"Principal lookup queries Kong Identity for the principal that matches the identity in a verified access token. This enables principal-aware policies and integrations. Requires all data plane nodes to be running version 3.15 or later.","kong_identity_label":"Kong Identity client","kong_identity_description":"Match principals using a token claim, defaulting to the subject (sub) claim.","custom_identity_label":"Custom claim","custom_identity_description":"Match principals using a custom JWT claim."},"custom_identity_name":{"label":"Custom identity name","help":"Enter the custom identity name used to look up the principal. Kong matches the value from the token claim to a principal with the same custom identity name and value.","placeholder":"e.g., Customer_ID"},"token_claim":{"label":"Token claim","placeholder":"e.g., user.employee_id","help":"Defaults to the subject (sub) claim, but you can specify a different token claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id).","help_custom":"The token claim whose value is matched against the Custom identity name. Defaults to the subject (sub) claim, but you can specify a different claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id)."},"error_on_miss":{"label":"If principal lookup fails","reject_label":"Reject the request","reject_description":"Treat the request as unauthenticated if Kong Identity cannot resolve the principal.","continue_label":"Continue without a principal","continue_description":"Allow the request to continue without resolving a principal."},"match_consumer":{"label":"Use linked consumers","description":"Use the consumer linked to the authenticated principal so existing consumer-based plugins and policies continue to work.","link":"Learn how to link a consumer."},"match_consumer_groups":{"label":"Use linked consumer groups","description":"Use consumer groups linked to the authenticated principal so existing consumer group policies and plugins continue to work. Consumer groups can be linked through principal metadata.","link":"Learn how to link a consumer group."}},"advanced_fields":{"client_jwk_link_label":"Client JWK","verify_signature_description":"JSON Web Keys are automatically fetched from the issuer's well-known endpoint. Enter a JWKS URI below to override this."}},"request-callout":{"entity_name":"Request callout","by_lua_placeholder":"Enter Lua script here..."},"jwt-signer":{"keyset_url_required":"Provide a valid HTTP/HTTPS URL to ensure signing works correctly when \\"{signingField}\\" is enabled and \\"{headerField}\\" is set."},"metering-and-billing":{"sections":{"plugin_config":{"title":"Plugin configuration","description":"Configure the Metering & Billing plugin."},"metering":{"title":"What to meter"},"subject":{"title":"Who to bill (subject)","description":"Define how billing subjects are identified."},"ingestion":{"title":"Connection","description":"Configure how metered data is delivered to the billing service."},"queue":{"title":"Queue","description":"Configure internal event queue settings."}},"fields":{"meter_api_requests":{"label":"Meter API requests","description":"Emit a usage event for each API Gateway request."},"meter_ai_token_usage":{"label":"Meter AI token usage","description":"Emit events for LLM input and output tokens on AI Gateway requests. Each request produces separate input/output events so they can be priced independently."},"ingest_endpoint":{"description":"The URL of the metering data ingest endpoint.","help":"For Konnect Metering & Billing, use the regional endpoint from your Metering & Billing settings. For self-hosted OpenMeter, use your ingest URL."},"api_token":{"description":"Bearer token for authenticating requests to the ingest endpoint."},"look_up_value_in":{"label":"Look up subject in","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"e.g. x-customer-id, x-api-key, x-tenant"},"queue":{"max_coalescing_delay":{"label":"Max coalescing delay (s)"},"initial_retry_delay":{"label":"Initial retry delay (s)"},"max_retry_delay":{"label":"Max retry delay (s)"},"max_retry_time":{"label":"Max retry time (s)"}},"attributes":{"title":"Event attributes","description":"Attach custom dimensions to metered events.","look_up_value_in":{"placeholder":"e.g., x-priority-id"},"event_property_name":{"placeholder":"e.g., priority"}},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"}}},"governance":{"unavailable_kong_manager":"The Governance plugin can't be configured in Kong Manager yet.","sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Governance plugin subject, feature, and connection settings."},"governance":{"title":"Governance settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to govern (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the governance query endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to govern (Look up subject in)","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"Name of the header or query parameter that carries the customer identifier."},"feature_key":{"label":"Feature to govern access","help":"Feature that will control access to the scope where the plugin is applied.","create_feature":"+ Create new feature","unavailable":"You don't have access to metering features. Enable Metering & Billing in your Konnect organization to configure the feature to govern.","load_error":"Could not load features from the governance service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing Query Governance Access. For self-hosted OpenMeter, use the Query Governance Access endpoint of your self-hosted instance."},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"},"sync_rate":{"label":"Sync rate (s)"},"refresh_interval":{"label":"Refresh interval (s)"},"max_stale_seconds":{"label":"Max stale seconds"},"l1_ttl":{"label":"L1 TTL (s)"},"l2_ttl":{"label":"L2 TTL (s)"},"credit_balance_required":{"label":"Credit balance lookup","yes_label":"Yes","yes_description":"A credit balance above zero is required for access to this feature.","no_label":"No","no_description":"Customers can access this feature regardless of their credit balance."},"fail_policy":{"label":"Plugin failure mode","allow_label":"Allow access","allow_description":"In the case of plugin failure, allow access to feature.","deny_label":"Deny access","deny_description":"In the case of plugin failure, deny access to feature."},"deny_unknown_customers":{"label":"Unknown customer access","allow_label":"Allow access","allow_description":"The gateway will allow access for unknown customers.","deny_label":"Deny access","deny_description":"The gateway will deny access for unknown customers."},"response":{"label":"Response mapping","columns":{"code":"Response code","status":"Status code","message":"Message"},"defaults":{"NO_CREDIT_AVAILABLE":"Customer has no credit available.","USAGE_LIMIT_REACHED":"Customer has reached usage limit for feature.","FEATURE_UNAVAILABLE":"Feature is not available for the customer.","FEATURE_NOT_FOUND":"Feature not found.","CUSTOMER_NOT_FOUND":"Customer is not found by subject."}}}},"datakit":{"plugin_config":{"title":"Flow editor"},"advanced_configuration":{"title":"Advanced configuration","show_label":"Show advanced configuration","hide_label":"Hide advanced configuration"},"description_code":"Configure this plugin by using YAML configuration. If you are copy/pasting in examples from the documentation - paste from below the <code>config</code> block.","description_flow":"Build flows visually with a drag-and-drop editor for Datakit. Visualize node connections, inputs, and outputs as you design.","description_example":"Start with a use case:","detected_config_format":"Detected {format} configuration. Do you want to convert it to Datakit configuration?","detected_config_format_title":"Convert configuration","detected_config_format_confirm":"Convert","examples":{"authenticateThirdPartyWithDynamicUrl":"Authenticate Kong to a third-party service resolved at runtime","authenticateThirdParty":"Authenticate Kong to a third-party service","authenticateWithVaultSecret":"Authenticate to a third-party service using Vault secrets","clearHeaders":"Clear request headers","combineTwoApisIntoOneResponse":"Combine multiple API responses","conditionallyStoreCachedItems":"Conditionally fetch or store cache data","convertJsonIntoXml":"Transform JSON into XML","convertJsonToXmlAndBack":"Transform JSON into XML and back","convertXmlIntoJson":"Transform XML into JSON","manipulateRequestHeaders":"Manipulate request headers"},"flow_editor":{"mode":"Flow editor","name":"Datakit flow editor","cta":"Go to flow editor","disabled_tooltip":"The flow editor is unavailable due to critical configuration errors or features not supported in the flow editor:<br/><code>{reason}</code>","expand_panel":"Expand panel","collapse_panel":"Collapse panel","return_to_config":"Return to plugin configuration","canvas_panel":{"request":"Request","response":"Response","node_count_plural":"{count} nodes","node_count_singular":"1 node"},"panel_segments":{"nodes":"Nodes","resources":{"title":"Resources","vault":{"title":"Vault secrets","add_button":"Add vault resource","name_exists_error":"Vault name already exists","name_required_error":"Vault name is required","edit":"Edit","delete":"Delete"},"cache":{"title":"Cache configuration","add_button":"Add cache configuration","strategy_options":{"memory":"Memory","redis":"Redis"},"select_redis_configuration":"Select a shared Redis configuration","inline_config":"Inline config","inline_config_preview":"You are using a dedicated Redis configuration, This is a preview of your current setup, please edit it in code editor"}}},"vault_secret_picker":{"title":"Add secret to Datakit","proceed_button_text":"Add secret","secret_name":{"label":"Secret name","placeholder":"Enter a name","help":"A unique identifier for this secret in your Datakit configuration"}},"node_panel":{"title":"Node types","description":"Drag a node onto the canvas to add it to your data flow.","groups":{"external_interaction":"External interaction","control_flow":"Control flow","data_transformation":"Data transformation","data_value":"Data value","authentication":"Authentication"}},"examples":"Examples","debug":{"label":"Debug","description":"Enables detailed error messages in client responses, making debugging easier. <a href=\\"https://developer.konghq.com/plugins/datakit/#debugging\\" target=\\"_blank\\">See the docs</a> for details."},"actions":{"zoom_in":"Zoom in","zoom_out":"Zoom out","fit_view":"Zoom to fit","auto_layout":"Auto layout","undo":"Undo","redo":"Redo","duplicate":"Duplicate","remove_from_branch":"Remove from branch","delete":"Delete","view_docs":"View docs","done":"Done"},"node_types":{"call":{"summary":"Call a third-party API","description":"Send an HTTP request and retrieve the response."},"jq":{"summary":"Transform data and cast variables with jq","description":"The <code>jq</code> node executes a jq script for processing JSON. See the official <a href=\\"https://jqlang.org\\" target=\\"_blank\\">jq docs</a> for more details."},"exit":{"summary":"Return directly to the client","description":"Trigger an early exit that produces a direct response, rather than forwarding a proxied response."},"property":{"summary":"Get and set Kong Gateway-specific data","description":"Get and set Kong Gateway host and request properties."},"static":{"summary":"Configure static input values ahead of time","description":"Emits static values to be used as inputs for other nodes. The <code>static</code> node can help you with hardcoding some known value for an input."},"branch":{"summary":"Execute nodes based on matching input conditions","description":"Execute different nodes based on matching input conditions, such as a cache hit or miss."},"cache":{"summary":"Store and fetch cached data","description":"Store data into cache and fetch cached data from cache."},"xml_to_json":{"summary":"Transform XML to JSON","description":"Transform XML to JSON."},"json_to_xml":{"summary":"Transform JSON to XML","description":"Transform JSON to XML."},"jwt_decode":{"summary":"Decode JWT headers and claims","description":"Parse a JWT without verifying its signature."},"jwt_sign":{"summary":"Create and sign JWTs","description":"Generate a signed JWT from configured claims and a signing key."},"jwt_verify":{"summary":"Verify JWT signature and claims","description":"Verify a JWT signature and validate claims such as exp, nbf, iss, and aud."},"request":{"name":"request","description":"Reads incoming client request properties. You cannot specify request node input."},"response":{"name":"response","description":"Updates properties of the outgoing client response."},"service_request":{"name":"service request","description":"Updates properties of the request sent to the service being proxied to."},"service_response":{"name":"service response","description":"Reads response properties from the service being proxied to."},"vault":{"name":"Vault","description":"Vault is a tool for securely accessing secrets."}},"node_properties":{"name":"Name","configuration":"Configuration","input":{"label":"Inputs configuration","placeholder":"Select a source","add_button":"Add an input","or":"or","input":"Input","fields":"Fields","source":"Source","tooltip":"Fields are part of the node input. A source can connect to either the fields or the input, but not both."},"input_name":{"label":"Input name","placeholder":"Enter an input name"},"jq":{"label":"jq script","help":"Refer to {link} for full documentation."},"output_value":{"label":"Output value","value_name":"Value name","value":"Value","add_button":"Add a value"},"property":{"get":"get","set":"set"},"branch":{"placeholder":"Select nodes"},"jwt":{"static_claims":{"label":"Static claims","help":"Enter a JSON object. It will be stored as the node's static claims map.","errors":{"invalid_json_object":"Static claims must be a valid JSON object"}}},"errors":{"invalid_identifier_format":"{fieldName} must start with a letter or underscore and contain only letters, numbers, underscores, or hyphens","invalid_url_format":"Not a valid URL format","not_empty":"{fieldName} is required","not_float":"{fieldName} must be a float","not_integer":"{fieldName} must be an integer","not_number":"{fieldName} must be a number","not_unique":"{fieldName} must be unique","number_range":"{fieldName} must be between {min} and {max}","string_len_range":"{fieldName} must be between {minLength} and {maxLength} characters","reserved_node_name":"\\"{nodeName}\\" is a reserved node name","attributes_required":"Provide at least one of attributes_block_name or attributes_name_prefix"}},"error":{"invalid_connection":"Invalid connection","branch_cycle":"Cannot create a circular branch relationship"},"confirm":{"title":"Connection conflict","message":{"confirm":"Are you sure you want to make this change?","switch":"You can connect an output source to either all inputs of a node or to individual inputs.","override":"Each input can connect to only one output, but one output can connect to many inputs.","branch_replace":"This node already belongs to another branch. Move it to the new branch?"},"proceed":"Yes, update"},"leave_confirm":"Leave current page? Changes you made may not be saved."},"code_editor":{"mode":"Code editor"}},"vault_picker":{"component_error":"The vault secret picker is not available"},"tag_helper":"Use comma to separate values. eg: value1, value2","foreign_placeholder":"Enter a UUID of {entity}"}}`), yn = { title: "Redis configuration", managed_ui: { title: "Redis", shared_configuration: { label: "Use shared configuration", description: "Select an existing shared Redis configuration or create a new one. Any updates to this configuration will automatically apply to all associated plugins.", badge: "Recommended" }, dedicated_configuration: { label: "Use locally-scoped configuration", description: "Create and use a Redis configuration specifically for this plugin." }, selector: { placeholder: "Filter Redis configurations...", create_new: "New Redis" } }, shared_configuration: { label: "Shared configuration", description: "Select an existing shared Redis configuration or create a new one. Changes to this configuration automatically apply to all associated plugins.", title: "Shared Redis configuration", error: "Fetching shared Redis configurations failed." }, dedicated_configuration: { label: "Dedicated configuration", description: "Create a Redis configuration that is used only by this plugin. Changes won’t affect other plugins." }, config_card: { common_fields: { created_at_label: "Created at", updated_at_label: "Last updated at", type_label: "Redis type" } } }, vn = { plugin: "plugin" }, bn = { key_auth_identity_realms: { cp_label: "Current control plane", cp_group_label: "Control plane", realm_group_label: "Realms (can only select one)" }, kong_identity: { title: "Who should manage authentication and credentials?", description_with_realms: "Use Consumers or centrally managed consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", description_without_realms: "Use Consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", learn_more: "Learn more.", incompatible_data_plane_alert: "We detected that one or more data plane nodes are running a version earlier than 3.15. Requests handled by those data plane nodes will use consumers instead of Kong Identity principals.", kong_identity_label: "Kong Identity", kong_identity_description_key_auth: "Use Kong Identity to authenticate API keys and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", kong_identity_description_basic_auth: "Use Kong Identity to authenticate Basic Auth credentials and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", consumers_label: "Consumers", consumers_description_key_auth: "Use consumer-managed API keys. Consumers provide their API key in a request header, query parameter, or request body to authenticate requests.", consumers_description_basic_auth: "Use consumer-managed Basic Auth credentials. Consumers authenticate requests using a username and password.", centrally_managed_label: "Centrally managed consumers", centrally_managed_description: "Authenticate centrally managed consumers in Konnect using identity realms. Identity realms are scoped to the control plane by default.", identity_realms_required: "To use centrally managed consumers, you must select at least one Centrally managed consumer realm.", error_on_miss_label: "If principal lookup fails", error_on_miss_reject_label: "Reject the request", error_on_miss_reject_description: "Treat the request as unauthenticated if Kong Identity cannot resolve the principal.", error_on_miss_continue_label: "Continue without a principal", error_on_miss_continue_description: "Allow the request to continue without resolving a principal.", configure_title: "Configure Kong Identity", configure_description: "Kong Identity uses principals to represent authenticated services or applications. Create your first principal in Kong Identity to start using principal-based authentication. On data plane nodes running versions earlier than 3.15, authentication continues using consumers.", create_principal: "Create principal", configure_learn_more: "Learn more", leave_prompt_title: "Leave this page?", leave_prompt_message: "Your unsaved changes will be lost if you continue.", leave_prompt_action: "Leave page" } }, _n = { window_type: { label: "Rate limit window type", help: "Sets the time window type to either <code>sliding</code> (default) or <code>fixed</code>.<br><ul><li>Sliding windows apply the rate limiting logic while taking into account previous hit rates (from the window that immediately precedes the current) using a dynamic weight.</li><li>Fixed windows consist of buckets that are statically assigned to a definitive time range, each request is mapped to only one fixed window based on its timestamp and will affect only that window's counters.</li></ul>", options: { fixed: "Fixed", sliding: "Sliding" } }, request_limits: { title: "Request limits", subtitle: "Set one or more limits on the number of API requests allowed within a defined timeframe.", label: "Limit", label_index: "Limit {index}", request_number: "Request number", time_interval: "Time interval", interval_determiner: "Every", seconds: "Seconds" }, error_message: { label: "Error message", code_placeholder: "Code message", message_placeholder: "Error message", help: "Set a custom error code and message to be returned when the rate limit is exceeded." }, start_with_a_use_case: "Start with a use case:", use_cases: { fixed: { hourly_500: { label: "500 requests every hour", description: "A fixed limit of 500 requests per hour resetting sharply on the hour, ensuring no user can exceed this limit." }, half_hourly_200: { label: "200 requests every 30 minutes", description: "Users are allowed 200 requests per 30 minutes, resetting exactly on the 30 minute mark with no carryover of unused limits." }, daily_500: { label: "500 requests every day", description: "A strict limit of 5000 requests per day resetting promptly at midnight, preventing any burst traffic or inconsistent user experiences." } }, sliding: { hourly_100: { label: "100 requests every hour", description: "Maximum of 100 requests every rolling hour, continuously adjusting the count over the course of the hour. No hard limit or known reset." }, half_hourly_300: { label: "300 requests every 30 minutes", description: "Each user can make up to 300 requests in any rolling 30 minute period, with older requests dropping off as new requests are made." }, hourly_500: { label: "500 requests every hour", description: `Each user is allowed 500 requests per hour.
|
|
2292
|
+
}), dn = { cancel: "Cancel", view_configuration: "View configuration", create: "New plugin", create_custom: "Create", configure: "Configure", copy_id: "Copy ID", copy_json: "Copy JSON", edit: "Edit", enable: "Enable", enabled: "Enabled", disable: "Disable", delete: "Delete", disabled: "Disabled", confirm_delete: "Yes, delete", view: "View details", configure_dynamic_ordering: "Configure dynamic ordering", go_to_plugins: "Go to plugins", save: "Save", add_entity: "Add {entity}", remove_entity: "Remove {entity}", loading_spinner: "Loading..." }, pn = { title: "Configuration", message: "Export configurations for core Kong Gateway objects, like services, routes, and plugins, to either YAML, JSON, or Terraform. This allows for straightforward importing into APIOps tools like decK with YAML, Insomnia and cURL with JSON, or Terraform products with Terraform.", yaml: "YAML", terraform: "Terraform", json: "JSON", deck: "decK" }, mn = { success: "Copied {val} to clipboard", success_brief: "Successfully copied to clipboard", tooltip: "Copy {label}", success_tooltip: "Copied!" }, fn = { general: "Plugins could not be retrieved", delete: "The plugin could not be deleted at this time.", copy: "Failed to copy to clipboard", load_results: "Error loading available plugins", load_schema: "Error loading plugin schema" }, hn = { placeholder: { konnect: "Filter by name", exact: "Filter by exact instance name or ID", kongManager: "Filter by exact instance name or ID", select: "Filter plugins", search_plugins: "Search plugins", search: "Search", tags_filter: "Type part of a tag and press Enter", scope_filter: "Select scopes" }, filter: { field: { enabled: "Enabled" }, tags_invalid: "Tags can't contain commas, slashes, or leading/trailing spaces" }, no_results: 'No results found for "{filter}"' }, gn = { new: "New" }, yn = /* @__PURE__ */ JSON.parse(`{"title":"Plugins","list":{"toolbar_actions":{"new_plugin":"New plugin"},"table_headers":{"applied_to":"Applied to","applied_to_badges":{"consumer":"Consumer","global":"Global","route":"Route","service":"Service","consumer_group":"Consumer group"},"id":"ID","plugin":"Plugin","name":"Name","instance_name":"Instance name","scope":"Scope","status":"Status","ordering":"Ordering","ordering_badge":{"dynamic":"Dynamic","static":"Static"},"enabled":"Enabled","tags":"Tags","updated_at":"Last modified"},"empty_state":{"title":"Configure a new plugin","description":"Plugins are used to extend Kong functionality."},"empty_state_v2":{"title":"Configure your first plugin","description":"Plugins extend gateways functionalities, offering features like authentication, rate limiting, and request transformations to enhance security and performance.","create_cta":"New plugin","group":"Plugins created in gateways within this group will automatically appear here.","learn_more":"Learn more"}},"meta":{"basic-auth":{"name":"Basic Authentication","credential_name":"Basic Auth Credential","description":"Add Basic Authentication to your services"},"hmac-auth":{"name":"HMAC Authentication","credential_name":"HMAC Credential","description":"Add HMAC Authentication to your services"},"jwt-signer":{"name":"JWT Signer","description":"Verify and (re-)sign one or two tokens in a request"},"jwt":{"name":"JWT","credential_name":"JWT Credential","description":"Verify and authenticate JSON Web Tokens"},"key-auth":{"name":"Key Authentication","credential_name":"Key Auth Credential","description":"Add key authentication to your services"},"key-auth-enc":{"name":"Key Authentication Encrypted","credential_name":"Key Auth Encrypted","description":"Add key authentication to your services with an encrypted token"},"ldap-auth-advanced":{"name":"LDAP Authentication Advanced","description":"Integrate Kong with a LDAP server"},"ldap-auth":{"name":"LDAP Authentication","description":"Integrate Kong with a LDAP server"},"oauth2-introspection":{"name":"OAuth 2.0 Introspection","description":"Integrate Kong with a third-party OAuth 2.0 Authorization Server"},"oauth2":{"name":"OAuth 2.0 Authentication","credential_name":"OAuth 2.0 Application","description":"Add OAuth 2.0 authentication to your services"},"openid-connect":{"name":"OpenID Connect","description":"Integrate Kong with a third-party OpenID Connect 1.0 provider"},"mtls-auth":{"name":"Mutual TLS Authentication","description":"Secure routes and services with client certificate and mutual TLS authentication"},"vault-auth":{"name":"Vault Authentication","description":"Secure routes and services with an access token and secret token, stored securely via Vault"},"bot-detection":{"name":"Bot Detection","description":"Detect and clock bots or custom clients"},"cors":{"name":"CORS","description":"Allow developers to make requests from the browser"},"ip-restriction":{"name":"IP Restriction","description":"Whitelist or blacklist IPs that can make requests"},"opa":{"name":"OPA","description":"Authorize requests against Open Policy Agent"},"kubernetes-sidecar-injector":{"name":"Kubernetes Sidecar Injector","description":"This plugin will inject Kong dataplane nodes and form a service mesh on top of Kubernetes"},"request-validator":{"name":"Request Validator","description":"Validate requests before they reach their upstream service."},"acl":{"name":"ACL","credential_name":"Access Control Group","description":"Control which consumers can access services"},"canary":{"name":"Canary Release","description":"Methodically roll out software changes to a subset of users"},"forward-proxy":{"name":"Forward Proxy","description":"Allow Kong to connect to intermediary transparent HTTP proxies"},"proxy-cache":{"name":"Proxy Caching","description":"Cache and serve commonly requested responses in Kong"},"proxy-cache-advanced":{"name":"Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"graphql-proxy-cache-advanced":{"name":"GraphQL Proxy Caching Advanced","description":"Cache and serve commonly requested responses in Kong"},"rate-limiting-advanced":{"name":"Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"rate-limiting":{"name":"Rate Limiting","description":"Rate-limit how many HTTP requests a developer can make"},"graphql-rate-limiting-advanced":{"name":"GraphQL Rate Limiting Advanced","description":"Rate-limit how many HTTP requests a developer can make"},"mocking":{"name":"Mocking","description":"Provide mock endpoints to test your APIs in development against your services"},"request-size-limiting":{"name":"Request Size Limiting","description":"Block requests with bodies greater than a specific size"},"request-termination":{"name":"Request Termination","description":"Terminate all requests with a specific response"},"response-ratelimiting":{"name":"Response Rate Limiting","description":"Rate-Limiting based on a custom response header value"},"route-by-header":{"name":"Route by Header","description":"Route requests based on request headers"},"ai-proxy":{"name":"AI Proxy","description":"Directly call a configured LLM, with mediated security and tuning parameters, and using standardised Kong request and response formats."},"ai-prompt-decorator":{"name":"AI Prompt Decorator","description":"Prepend and append chat prompts to AI Proxy plugin LLM requests."},"ai-prompt-template":{"name":"AI Prompt Template","description":"Define a set of templates, containing string variable placeholders, that can be consumed by users when used with the AI Proxy plugin."},"ai-prompt-guard":{"name":"AI Prompt Guard","description":"Define a set of valid, and a set of invalid, regular expression patterns when calling LLM models with the AI Proxy plugin."},"ai-request-transformer":{"name":"AI Request Transformer","description":"Use an LLM to transform API request from a user, before sending to the upstream service."},"ai-response-transformer":{"name":"AI Response Transformer","description":"Use an LLM to transform API responses from the upstream service, before returning to the user."},"ai-rate-limiting-advanced":{"name":"AI Rate Limiting Advanced","description":"Provides rate limiting for the providers used by any AI plugins."},"ai-azure-content-safety":{"name":"AI Azure Content Safety","description":"Allows checking and auditing of AI-Proxy plugin messages, using Azure Cognitive Services, before proxying to upstream large-language model."},"aws-lambda":{"name":"AWS Lambda","description":"Invoke and manage AWS Lambda functions from Kong"},"azure-functions":{"name":"Azure Functions","description":"Invoke Azure functions"},"openwhisk":{"name":"OpenWhisk","description":"Invoke and manage OpenWhisk actions from Kong"},"pre-function":{"name":"Kong Functions (Pre-Plugins)","description":"Add and manage custom lua functions to run before other plugins"},"post-function":{"name":"Kong Functions (Post-Plugins)","description":"Add and manage custom lua functions to run after other plugins"},"datadog":{"name":"Datadog","description":"Visualize metrics on Datadog"},"prometheus":{"name":"Prometheus","description":"Export performance metrics to Prometheus"},"zipkin":{"name":"Zipkin","description":"Propagate zipkin spans and report spans to a zipkin server"},"collector":{"name":"Collector","description":"Automate spec-driven development & anomaly detection (Early Access)"},"response-transformer-advanced":{"name":"Response Transformer Advanced","description":"Transform the response sent by the upstream server on the fly on Kong, before returning the response to the client."},"correlation-id":{"name":"Correlation ID","description":"Correlate requests and responses using a unique ID"},"request-transformer-advanced":{"name":"Request Transformer Advanced","description":"Use powerful regular expressions, variables and templates to transform API requests"},"request-transformer":{"name":"Request Transformer","description":"Modify the request before hitting the upstream server"},"response-transformer":{"name":"Response Transformer","description":"Modify the upstream response before returning it to the client"},"route-transformer-advanced":{"name":"Route Transformer Advanced","description":"Transforms the routing on the fly in Kong, changing the upstream server/port/path to hit"},"kafka-upstream":{"name":"Kafka Upstream","description":"Transform requests into Kafka messages in a topic"},"degraphql":{"name":"DeGraphQL","description":"Transform a GraphQL upstream into a REST API"},"exit-transformer":{"name":"Exit Transformer","description":"Customize Kong exit responses sent downstream"},"jq":{"name":"jq","description":"Transform JSON objects included in API requests or responses using jq programs"},"file-log":{"name":"File Log","description":"Append request and response data to a log file on disk"},"http-log":{"name":"HTTP Log","description":"Send request and response logs to an HTTP server"},"loggly":{"name":"Loggly","description":"Send request and response logs to Loggly"},"statsd-advanced":{"name":"StatsD Advanced","description":"Send traffic and Kong performance metrics to StatsD"},"statsd":{"name":"StatsD","description":"Send request and response logs to StatsD"},"syslog":{"name":"Syslog","description":"Send request and response logs to Syslog"},"tcp-log":{"name":"TCP Log","description":"Send request and response logs to a TCP server"},"udp-log":{"name":"UDP Log","description":"Send request and response logs to a UDP server"},"kafka-log":{"name":"Kafka Log","description":"Publish request and response logs to a Kafka topic"},"session":{"name":"Session","description":"Sessions for Kong authentication"},"upstream-tls":{"name":"Upstream TLS","description":"Enable TLS on upstream traffic by providing Kong with a list of trusted certificates."},"application-registration":{"name":"Portal Application Registration","description":"Allow portal developers to register applications against services"},"konnect-application-auth":{"name":"Konnect Application Auth","description":"Allow Konnect portal developers to register applications against services"},"acme":{"name":"ACME","description":"Let's Encrypt and ACMEv2 integration with Kong"},"grpc-gateway":{"name":"gRPC Gateway","description":"Access gRPC services through HTTP REST"},"grpc-web":{"name":"gRPC Web","description":"Allow browser clients to call gRPC services"},"upstream-timeout":{"name":"Upstream Timeout","description":"Configure read, send and connect timeouts to an upstream"},"opentelemetry":{"name":"OpenTelemetry","description":"Propagate distributed tracing spans and report low-level spans to a OTLP-compatible server"},"websocket-validator":{"name":"WebSocket Validator","description":"Validate individual WebSocket messages against to a user-specified schema before proxying them"},"websocket-size-limit":{"name":"WebSocket Size Limit","description":"Allows operators to specify a maximum size for incoming WebSocket messages"},"tls-metadata-headers":{"name":"TLS Metadata Headers","description":"Detects client certificates in requests, retrieves the TLS metadata, and proxies this metadata via HTTP headers"},"tls-handshake-modifier":{"name":"TLS Handshake Modifier","description":"Requests the client certificate and if it exists, makes it available to other plugins acting on the request"},"oas-validation":{"name":"OAS Validation","description":"Validate HTTP requests and responses based on an API specification."},"jwe-decrypt":{"name":"Kong JWE Decrypt","description":"The Kong JWE Decrypt plugin makes it possible to decrypt an inbound token(JWE) in a request."},"xml-threat-protection":{"name":"XML Threat Protection","description":"Reduce the risk of XML attacks by checking the structure of XML payloads."},"saml":{"name":"SAML","description":"Security Assertion Markup Language (SAML) is an open standard for exchanging authentication and authorization data between an identity provider and a service provider."},"app-dynamics":{"name":"AppDynamics","description":"This plugin integrates Kong with the AppDynamics APM platform so that proxy requests handled by Kong can be identified and analyzed in AppDynamics."},"json-threat-protection":{"name":"JSON Threat Protection","description":"Apply size checks on JSON payload and minimize risk of content-level attacks"},"standard-webhooks":{"name":"Standard Webhooks","description":"Validate incoming webhooks adhere to the Standard Webhooks specification, to which Kong is a contributor"},"ai-proxy-advanced":{"name":"AI Proxy Advanced","description":"Route across different LLMs and models using advanced load balancing algorithms, including semantic routing."},"ai-semantic-cache":{"name":"AI Semantic Cache","description":"Semantically cache AI requests to any LLM to reduce latency, improve end-user experiences and optimize GenAI costs."},"ai-semantic-prompt-guard":{"name":"AI Semantic Prompt Guard","description":"Semantically and intelligently create allow and deny lists of topics that can be requested across every LLM."},"header-cert-auth":{"name":"Header Certificate Authentication","description":"Authenticate clients with MTLS certificate passed in header by a WAF or load balancer"},"upstream-oauth":{"name":"Upstream OAuth","description":"Configure Kong to obtain a OAuth2 token to consume an upstream API"},"confluent":{"name":"Confluent","description":"Streamlines integration with Confluent Cloud and transforms requests into messages published to a Confluent topic."},"service-protection":{"name":"Service Protection","description":"Prevent abuse and protect services with absolute limits on the number of requests reaching the service."},"injection-protection":{"name":"Injection Protection","description":"Protect against injection attacks by rejecting requests that match common injections patterns."},"redirect":{"name":"Redirect","description":"Redirect incoming requests to a new URL"},"kafka-consume":{"name":"Kafka Consume","description":"Consume messages from Kafka topics over HTTP protocols."},"confluent-consume":{"name":"Confluent Consume","description":"Consume messages from Confluent Kafka topics over HTTP protocols"},"request-callout":{"name":"Request Callout","description":"Callout to third party APIs as part of request processing."},"ai-sanitizer":{"name":"AI Sanitizer","description":"Sanitize personal or sensitive information from prompts before sending to LLM."},"ai-rag-injector":{"name":"AI RAG Injector","description":"Attach contextual knowledge from vector databases with flexible template to LLM prompts."},"datakit":{"name":"Datakit","description":"Datakit is a workflow engine for working with external APIs."},"ai-prompt-compressor":{"name":"AI Prompt Compressor","description":"The AI Prompt Compressor reduces costs associated with LLMs by compressing prompts."},"solace-upstream":{"name":"Solace Upstream","description":"Transform requests into Solace messages in a Solace queue or topic."},"ai-aws-guardrails":{"name":"AI AWS GuardRails","description":"The AI AWS GuardRails enables enforcement of introspection with the AWS GuardRails service for all requests processed by the AI Proxy plugin."},"ace":{"name":"Konnect Access Control Enforcement","description":"Enable Developer Self-Service for Konnect Dev Portals."},"solace-consume":{"name":"Solace Consume","description":"Consume messages from Solace and make them available through HTTP endpoints."},"solace-log":{"name":"Solace Log","description":"Publish request and response logs to a Solace topic."},"ai-llm-as-judge":{"name":"AI LLM Judge","description":"Evaluate LLM responses with an external LLM service and use accuracy scores to drive dynamic load balancing for \`llm/v1/chat\` requests."},"ai-mcp-proxy":{"name":"AI MCP Proxy","description":"Convert APIs into MCP tools, proxy MCP servers, expose multiple MCP tools, and observe MCP traffic in real time."},"ai-gcp-model-armor":{"name":"AI GCP Model Armor","description":"Audit and validate AI Proxy messages with Google Cloud Model Armor before forwarding them to an upstream LLM."},"ai-mcp-oauth2":{"name":"AI MCP OAuth2","description":"Secure MCP server access with OAuth2 authentication."},"ai-semantic-response-guard":{"name":"AI Semantic Response Guard","description":"Permit or block prompts based on semantic similarity to known LLM responses, preventing misuse of \`llm/v1/chat\` or \`llm/v1/completions\` requests."},"ai-lakera-guard":{"name":"AI Lakera Guard","description":"Audit and enforce safety policies on LLM requests and responses using the AI AWS Lakera plugin before they reach upstream LLMs."},"ai-a2a-proxy":{"name":"AI A2A Proxy","description":"Securely proxy A2A agents, with real-time RPC tracing and monitoring."},"ai-custom-guardrail":{"name":"AI Custom Guardrail","description":"Integrate with any 3rd-party Guardrail service, with customizable enforcement modes — choose whether violations block, log, or allow traffic to proceed."},"metering-and-billing":{"name":"Metering & Billing","description":"Meter API requests and AI token usage for usage-based billing. Supports flexible customer identification, custom pricing dimensions, and fine-grained traffic filtering. Integrates natively with Konnect Metering & Billing."},"governance":{"name":"Governance","description":"Enforce feature-level access control and credit-balance gating for API consumers. Integrates with Konnect Metering & Billing to allow or deny requests based on customer entitlements."}},"fields":{"service":"Service ID","route":"Route ID","consumer":"Consumer ID","consumer_group":"Consumer group ID"},"select":{"custom_badge_text":"This plugin is data plane node specific","cloned_from_badge":"Cloned from {link}","installed_custom_badge":"Installed custom","streamed_custom_badge":"Streamed custom","unavailable_tooltip":"This plugin is not available","already_exists":"This plugin is already applied to this resource","misc_plugins":"Other plugins","show_all":"Show all","view_more":"View more","view_less":"View less","filter":{"title":"Filter plugins","featured":"Featured","type":"Type","clear":"Clear"},"list":{"table_headers":{"name":"Plugin","description":"Description"}},"tabs":{"kong":{"title":"Kong plugins","description":"Kong plugins are bundled by default with Kong Gateway and are available across all control planes.","empty_title":"No plugins","empty_description":"No plugins are available."},"custom":{"title":"Custom plugins","description":"Custom plugins will be available in this control plane only.","disabled_tooltip":"Custom plugins are not available with this gateway. Create a hybrid or dedicated cloud gateway to leverage custom plugins.","fetch_error":"Unable to load some custom plugins. Bundled plugins are still available.","license_required":"Plugin cloning requires a license to be used.","empty_title":"No custom plugins","empty_description":"No custom plugins have been added to this control plane.","create":{"name":"Custom plugin","description":"Upload schema file to create custom plugin"}}},"highlighted_plugins":{"title":"Highlighted plugins"}},"form":{"button_deck_customize":"Customize before copying to CLI","disable_data_retrieving":"You do not have permission to select {scope}","disable_source_scope_change":"Changing the {scope} is not allowed when configuring a plugin under it","no_selection":"No selection...","fields":{"enabled":{"label":"Enabled","on_text":"This plugin is enabled","off_text":"This plugin is disabled"},"plugin_status":{"label":"Plugin status","text_on":"Enabled","text_off":"Disabled"},"instance_name":{"label":"Name","placeholder":"Enter a unique name","help":"A custom name for this plugin instance to help with identifying from the list view."},"condition":{"label":"Execution condition","placeholder":"Enter an expression","tooltip":"An expression used for conditional control over plugin execution. If the expression evaluates to true during the request flow, the plugin is executed; otherwise, it is skipped.","help":{"learn":"Learn more","about":"{link} about plugin conditions."}},"protocols":{"label":"Protocols","placeholder":"Select valid protocols for the plugin","placeholderWithDefaultValues":"Select valid protocols for the plugin. Default protocols: {protocols}","help":"A list of the request protocols that will trigger this plugin. The default value, as well as the possible values allowed on this field, may change depending on the plugin type."},"tags":{"label":"Tags","help":"An optional set of strings for grouping and filtering, separated by commas.","placeholder":"Tag1, Tag2, Tag3"}},"scoping":{"label":"Scoped","placeholder":"Search by name or UUID","disable_global_radio":"The plugin is set to 'scoped' by default. To apply a plugin globally, please navigate to the global plugin list page.","global":{"label":"Global","help":"All services, routes, and consumers"},"gateway_service":{"label":"Select a gateway service","help":"The gateway service to which this plugin configuration will apply","placeholder":"Select a gateway service","plural":"Gateway services"},"route":{"label":"Select a route","help":"The route that this plugin configuration will target","placeholder":"Select a route","plural":"Routes"},"consumer":{"label":"Select a consumer","help":"The consumer that this plugin configuration will target","placeholder":"Select a consumer","plural":"Consumers"},"consumer_group":{"label":"Select a consumer group","help":"The consumer group that this plugin configuration will target","placeholder":"Select a consumer group","plural":"Consumer groups"}},"grouping":{"plugin_configuration":{"title":"Plugin configuration","description":"Configuration parameters for this plugin. View advanced parameters for extended configuration.","empty":"This plugin does not have required parameters."},"advanced_parameters":{"view":"Show additional settings","hide":"Hide additional settings"}},"field_rules":{"at_least_one_of":"At least one of the following values is required: {parameters}.","only_one_of":"Exactly one of these parameters is required: {parameters}","mutually_required":"These values must be used together: {parameters}.","mutually_exclusive":"Only one of these values can be used: {parameters}.","only_one_of_mutually_required":"Exactly one of the following parameter combinations is required (all parameters within a chosen combination are required):"},"sections":{"plugin_scope":{"title":"Plugin scope","description":"Choose whether this plugin applies to all traffic (global) or is scoped to a specific service, route, or consumer."},"general_info":{"title":"General information","description":"Add details to help identify and manage your plugin."},"plugin_config":{"title":"Plugin configuration","description":"Set the plugin's behavior by defining its configuration settings."},"plugin_general_info":{"description":"Add a name or tags to help you identify and manage this plugin later."},"code_mode":{"title":"Code editor","description":"Configure this plugin by using YAML configuration."}}},"free-form":{"editor_mode":{"visual":"Visual editor","code":"Code editor"},"code-lens":{"entity":{"service":"Service","route":"Route","consumer":"Consumer","consumer_group":"Consumer group","certificate":"Certificate"},"field":{"name":"{entity} \\"{value}\\"","username":"Username \\"{value}\\"","custom_id":"Custom ID \\"{value}\\"","subject":"Subject \\"{value}\\"","expires_after":"Expires after \\"{value}\\""},"action":{"view_entity":"View {title}","copy_certificate":"Copy certificate","copy_uuid":"Copy UUID","retry_fetch":"Retry fetch (Hover for details)"},"unknown_error":"Unknown error"},"acl":{"mode":{"title":{"label":"Access policy","description":"Select how requests are authorized. Choose one access policy: allow or deny by ACL group, or define a CEL expression. Only one policy type can be configured at a time."},"allow":{"label":"Allow list","description":"Allow requests from the specified ACL groups."},"deny":{"label":"Deny list","description":"Deny requests from the specified ACL groups."},"allow_when":{"label":"Allow expression","description":"Allow requests when the CEL expression evaluates to true."},"deny_when":{"label":"Deny expression","description":"Deny requests when the CEL expression evaluates to true."}},"field":{"allow":{"label":"Allowed list","placeholder":"Enter group names","add":"Add allow"},"deny":{"label":"Denied list","placeholder":"Enter group names","add":"Add deny"},"allow_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}},"deny_when":{"label":"Kong plug-in conditional expression","description":"A Kong plug-in conditional expression is a CEL expression that determines whether the plugin runs for a request. If the expression evaluates to true, the plugin executes. If it evaluates to false, the plugin is skipped.","placeholder":"eg: 'consumer.username == \\"alice\\"'","add":"Add expression","help":{"learn":"Learn more","text":"Define a Kong plug-in conditional expression to evaluate each request. The expression must return a boolean value (true or false). {link}"}}}},"ai-mcp-proxy":{"default_acl_item_label":"Default ACL #{index}","tool_item_label":"Tool #{index}"},"openid-connect":{"tabs":{"common":{"title":"Common Configuration Settings","description":"Parameters for enabling the OpenID Connect plugin. Set these parameters before adding authorization, authentication, or other advanced configuration details."},"authorization":{"title":"Authorization Configuration Settings","description":"Parameters for setting up claims-based authorization."},"advanced":{"title":"Advanced Configuration Settings","description":"Advanced parameters for manually configuring the OpenID Connect plugin."}},"auth_methods":{"label":"Authentication methods","placeholder":"Select authentication methods","hint":"Configure which OAuth and OpenID Connect features are supported.","km_label":"Auth methods","methods":{"authorization_code":"Authorization code flow","bearer":"Bearer access token","client_credentials":"Client credentials grant","password":"Passwords grant","introspection":"Introspection","userinfo":"UserInfo","kong_oauth2":"Kong OAuth","refresh_token":"Refresh token"},"session":{"label":"Session management","switch_label":"Enable Session Management","use_label":"Use sessions","use_description":"Issue a session cookie after successful authentication. Subsequent requests use the session instead of re-authenticating with the identity provider.","no_use_label":"Do not use sessions","no_use_description":"Authenticate each request using the configured authentication flow."}},"principals":{"header":"Who should manage authentication and credentials?","description":"Use External auth server to continue using your existing OAuth provider and authentication workflows. Use Kong Identity to adopt a newer principal-based model that centralizes and simplifies identity and authentication management.","learn_more":"Learn more.","kong_identity_label":"Kong Identity","kong_identity_description":"Use Kong Identity to authenticate OpenID Connect tokens. If all data plane nodes are running version 3.15 or later, you can also map requests to Kong Identity principals for advanced policies and integrations.","external_label":"External auth server","external_description":"Connect to your existing identity provider to manage authentication outside of Kong.","guide":{"title":"Add principals","description":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products.","description_external":"Get more value from OAuth 2.0 integration by creating principals in Kong Identity. Associate principals with this authorization server and its clients to enable principal-based authentication across Kong products. Requires data plane nodes to be running version 3.15 or later.","create":"Create principal","learn_more":"Learn more"},"auth_server":{"label":"Authorization Server","info":"The Kong Identity auth server that will act as the OpenID Connect provider for this plugin.","placeholder":"Select an Authorization Server","create":"Create authorization server","create_hint":"You'll need to return here after creating an authorization server. Your progress won't be saved.","no_access_help":"You don't have access to browse authorization servers. Enter the issuer URL of your Kong Identity authorization server directly.","issuer_placeholder":"e.g., https://your-auth-server.identity.konghq.com"},"client":{"label":"Client","id_label":"Client id","secret_label":"Client secret","placeholder":"Select a client","id_placeholder":"e.g., kong-gateway-client","secret_placeholder":"e.g., your-client-secret","create":"Create client","create_hint":"You'll need to return here after creating a client. Your progress won't be saved.","add":"Add client","remove":"Remove client"},"leave_prompt":{"title":"Leave this page?","message":"Your unsaved changes will be lost if you continue.","action":"Leave page"},"dp_version_alert":"We detected that one or more data plane nodes are running a version earlier than 3.15. If principal lookup is enabled, requests handled by those data plane nodes will fail."},"lookup":{"collapse_label":"Show additional settings","toggle_label":"Use principal lookup","toggle_info":"Look up the authenticated principal in Kong Identity after token validation. Enable this when the validated token doesn't contain all of the identity data required for authorization or activity logging.","method":{"label":"Principal lookup method","placeholder":"Select a lookup method","help":"Principal lookup queries Kong Identity for the principal that matches the identity in a verified access token. This enables principal-aware policies and integrations. Requires all data plane nodes to be running version 3.15 or later.","kong_identity_label":"Kong Identity client","kong_identity_description":"Match principals using a token claim, defaulting to the subject (sub) claim.","custom_identity_label":"Custom claim","custom_identity_description":"Match principals using a custom JWT claim."},"custom_identity_name":{"label":"Custom identity name","help":"Enter the custom identity name used to look up the principal. Kong matches the value from the token claim to a principal with the same custom identity name and value.","placeholder":"e.g., Customer_ID"},"token_claim":{"label":"Token claim","placeholder":"e.g., user.employee_id","help":"Defaults to the subject (sub) claim, but you can specify a different token claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id).","help_custom":"The token claim whose value is matched against the Custom identity name. Defaults to the subject (sub) claim, but you can specify a different claim if needed. Use dot notation for nested claims (for example, workload.id); escape literal periods with \\\\ (for example, workload\\\\.id)."},"error_on_miss":{"label":"If principal lookup fails","reject_label":"Reject the request","reject_description":"Treat the request as unauthenticated if Kong Identity cannot resolve the principal.","continue_label":"Continue without a principal","continue_description":"Allow the request to continue without resolving a principal."},"match_consumer":{"label":"Use linked consumers","description":"Use the consumer linked to the authenticated principal so existing consumer-based plugins and policies continue to work.","link":"Learn how to link a consumer."},"match_consumer_groups":{"label":"Use linked consumer groups","description":"Use consumer groups linked to the authenticated principal so existing consumer group policies and plugins continue to work. Consumer groups can be linked through principal metadata.","link":"Learn how to link a consumer group."}},"advanced_fields":{"client_jwk_link_label":"Client JWK","verify_signature_description":"JSON Web Keys are automatically fetched from the issuer's well-known endpoint. Enter a JWKS URI below to override this."}},"request-callout":{"entity_name":"Request callout","by_lua_placeholder":"Enter Lua script here..."},"jwt-signer":{"keyset_url_required":"Provide a valid HTTP/HTTPS URL to ensure signing works correctly when \\"{signingField}\\" is enabled and \\"{headerField}\\" is set."},"metering-and-billing":{"sections":{"plugin_config":{"title":"Plugin configuration","description":"Configure the Metering & Billing plugin."},"metering":{"title":"What to meter"},"subject":{"title":"Who to bill (subject)","description":"Define how billing subjects are identified."},"ingestion":{"title":"Connection","description":"Configure how metered data is delivered to the billing service."},"queue":{"title":"Queue","description":"Configure internal event queue settings."}},"fields":{"meter_api_requests":{"label":"Meter API requests","description":"Emit a usage event for each API Gateway request."},"meter_ai_token_usage":{"label":"Meter AI token usage","description":"Emit events for LLM input and output tokens on AI Gateway requests. Each request produces separate input/output events so they can be priced independently."},"ingest_endpoint":{"description":"The URL of the metering data ingest endpoint.","help":"For Konnect Metering & Billing, use the regional endpoint from your Metering & Billing settings. For self-hosted OpenMeter, use your ingest URL."},"api_token":{"description":"Bearer token for authenticating requests to the ingest endpoint."},"look_up_value_in":{"label":"Look up subject in","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"e.g. x-customer-id, x-api-key, x-tenant"},"queue":{"max_coalescing_delay":{"label":"Max coalescing delay (s)"},"initial_retry_delay":{"label":"Initial retry delay (s)"},"max_retry_delay":{"label":"Max retry delay (s)"},"max_retry_time":{"label":"Max retry time (s)"}},"attributes":{"title":"Event attributes","description":"Attach custom dimensions to metered events.","look_up_value_in":{"placeholder":"e.g., x-priority-id"},"event_property_name":{"placeholder":"e.g., priority"}},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"}}},"governance":{"unavailable_kong_manager":"The Governance plugin can't be configured in Kong Manager yet.","sections":{"configuration":{"title":"Plugin configuration","description":"Configure the Governance plugin subject, feature, and connection settings."},"governance":{"title":"Governance settings","description":"Configure access control behavior and response codes."},"subject":{"title":"Whose access to govern (subject)"},"feature":{"title":"Feature"},"connection":{"title":"Connection","description":"Configure how the plugin connects to the governance query endpoint."},"redis":{"title":"Redis"},"cache_sync":{"title":"Cache and sync"}},"fields":{"look_up_value_in":{"label":"Whose access to govern (Look up subject in)","help":"Where to find the customer identifier in the request."},"subject_field":{"label":"Subject field name","placeholder":"e.g., x-customer-id","help":"Name of the header or query parameter that carries the customer identifier."},"feature_key":{"label":"Feature to govern access","help":"Feature that will control access to the scope where the plugin is applied.","create_feature":"+ Create new feature","unavailable":"You don't have access to metering features. Enable Metering & Billing in your Konnect organization to configure the feature to govern.","load_error":"Could not load features from the governance service."},"governance_endpoint":{"help":"For Konnect Metering & Billing, use the regional endpoint for Metering & Billing Query Governance Access. For self-hosted OpenMeter, use the Query Governance Access endpoint of your self-hosted instance."},"ssl_verify":{"label":"Verify TLS certificate","description":"Disable only for local development with self-signed certificates."},"timeout":{"label":"Request timeout (ms)"},"keepalive":{"label":"Connection keep-alive (ms)"},"sync_rate":{"label":"Sync rate (s)"},"refresh_interval":{"label":"Refresh interval (s)"},"max_stale_seconds":{"label":"Max stale seconds"},"l1_ttl":{"label":"L1 TTL (s)"},"l2_ttl":{"label":"L2 TTL (s)"},"credit_balance_required":{"label":"Credit balance lookup","yes_label":"Yes","yes_description":"A credit balance above zero is required for access to this feature.","no_label":"No","no_description":"Customers can access this feature regardless of their credit balance."},"fail_policy":{"label":"Plugin failure mode","allow_label":"Allow access","allow_description":"In the case of plugin failure, allow access to feature.","deny_label":"Deny access","deny_description":"In the case of plugin failure, deny access to feature."},"deny_unknown_customers":{"label":"Unknown customer access","allow_label":"Allow access","allow_description":"The gateway will allow access for unknown customers.","deny_label":"Deny access","deny_description":"The gateway will deny access for unknown customers."},"response":{"label":"Response mapping","columns":{"code":"Response code","status":"Status code","message":"Message"},"defaults":{"NO_CREDIT_AVAILABLE":"Customer has no credit available.","USAGE_LIMIT_REACHED":"Customer has reached usage limit for feature.","FEATURE_UNAVAILABLE":"Feature is not available for the customer.","FEATURE_NOT_FOUND":"Feature not found.","CUSTOMER_NOT_FOUND":"Customer is not found by subject."}}}},"datakit":{"plugin_config":{"title":"Flow editor"},"advanced_configuration":{"title":"Advanced configuration","show_label":"Show advanced configuration","hide_label":"Hide advanced configuration"},"description_code":"Configure this plugin by using YAML configuration. If you are copy/pasting in examples from the documentation - paste from below the <code>config</code> block.","description_flow":"Build flows visually with a drag-and-drop editor for Datakit. Visualize node connections, inputs, and outputs as you design.","description_example":"Start with a use case:","detected_config_format":"Detected {format} configuration. Do you want to convert it to Datakit configuration?","detected_config_format_title":"Convert configuration","detected_config_format_confirm":"Convert","examples":{"authenticateThirdPartyWithDynamicUrl":"Authenticate Kong to a third-party service resolved at runtime","authenticateThirdParty":"Authenticate Kong to a third-party service","authenticateWithVaultSecret":"Authenticate to a third-party service using Vault secrets","clearHeaders":"Clear request headers","combineTwoApisIntoOneResponse":"Combine multiple API responses","conditionallyStoreCachedItems":"Conditionally fetch or store cache data","convertJsonIntoXml":"Transform JSON into XML","convertJsonToXmlAndBack":"Transform JSON into XML and back","convertXmlIntoJson":"Transform XML into JSON","manipulateRequestHeaders":"Manipulate request headers"},"flow_editor":{"mode":"Flow editor","name":"Datakit flow editor","cta":"Go to flow editor","disabled_tooltip":"The flow editor is unavailable due to critical configuration errors or features not supported in the flow editor:<br/><code>{reason}</code>","expand_panel":"Expand panel","collapse_panel":"Collapse panel","return_to_config":"Return to plugin configuration","canvas_panel":{"request":"Request","response":"Response","node_count_plural":"{count} nodes","node_count_singular":"1 node"},"panel_segments":{"nodes":"Nodes","resources":{"title":"Resources","vault":{"title":"Vault secrets","add_button":"Add vault resource","name_exists_error":"Vault name already exists","name_required_error":"Vault name is required","edit":"Edit","delete":"Delete"},"cache":{"title":"Cache configuration","add_button":"Add cache configuration","strategy_options":{"memory":"Memory","redis":"Redis"},"select_redis_configuration":"Select a shared Redis configuration","inline_config":"Inline config","inline_config_preview":"You are using a dedicated Redis configuration, This is a preview of your current setup, please edit it in code editor"}}},"vault_secret_picker":{"title":"Add secret to Datakit","proceed_button_text":"Add secret","secret_name":{"label":"Secret name","placeholder":"Enter a name","help":"A unique identifier for this secret in your Datakit configuration"}},"node_panel":{"title":"Node types","description":"Drag a node onto the canvas to add it to your data flow.","groups":{"external_interaction":"External interaction","control_flow":"Control flow","data_transformation":"Data transformation","data_value":"Data value","authentication":"Authentication"}},"examples":"Examples","debug":{"label":"Debug","description":"Enables detailed error messages in client responses, making debugging easier. <a href=\\"https://developer.konghq.com/plugins/datakit/#debugging\\" target=\\"_blank\\">See the docs</a> for details."},"actions":{"zoom_in":"Zoom in","zoom_out":"Zoom out","fit_view":"Zoom to fit","auto_layout":"Auto layout","undo":"Undo","redo":"Redo","duplicate":"Duplicate","remove_from_branch":"Remove from branch","delete":"Delete","view_docs":"View docs","done":"Done"},"node_types":{"call":{"summary":"Call a third-party API","description":"Send an HTTP request and retrieve the response."},"jq":{"summary":"Transform data and cast variables with jq","description":"The <code>jq</code> node executes a jq script for processing JSON. See the official <a href=\\"https://jqlang.org\\" target=\\"_blank\\">jq docs</a> for more details."},"exit":{"summary":"Return directly to the client","description":"Trigger an early exit that produces a direct response, rather than forwarding a proxied response."},"property":{"summary":"Get and set Kong Gateway-specific data","description":"Get and set Kong Gateway host and request properties."},"static":{"summary":"Configure static input values ahead of time","description":"Emits static values to be used as inputs for other nodes. The <code>static</code> node can help you with hardcoding some known value for an input."},"branch":{"summary":"Execute nodes based on matching input conditions","description":"Execute different nodes based on matching input conditions, such as a cache hit or miss."},"cache":{"summary":"Store and fetch cached data","description":"Store data into cache and fetch cached data from cache."},"xml_to_json":{"summary":"Transform XML to JSON","description":"Transform XML to JSON."},"json_to_xml":{"summary":"Transform JSON to XML","description":"Transform JSON to XML."},"jwt_decode":{"summary":"Decode JWT headers and claims","description":"Parse a JWT without verifying its signature."},"jwt_sign":{"summary":"Create and sign JWTs","description":"Generate a signed JWT from configured claims and a signing key."},"jwt_verify":{"summary":"Verify JWT signature and claims","description":"Verify a JWT signature and validate claims such as exp, nbf, iss, and aud."},"request":{"name":"request","description":"Reads incoming client request properties. You cannot specify request node input."},"response":{"name":"response","description":"Updates properties of the outgoing client response."},"service_request":{"name":"service request","description":"Updates properties of the request sent to the service being proxied to."},"service_response":{"name":"service response","description":"Reads response properties from the service being proxied to."},"vault":{"name":"Vault","description":"Vault is a tool for securely accessing secrets."}},"node_properties":{"name":"Name","configuration":"Configuration","input":{"label":"Inputs configuration","placeholder":"Select a source","add_button":"Add an input","or":"or","input":"Input","fields":"Fields","source":"Source","tooltip":"Fields are part of the node input. A source can connect to either the fields or the input, but not both."},"input_name":{"label":"Input name","placeholder":"Enter an input name"},"jq":{"label":"jq script","help":"Refer to {link} for full documentation."},"output_value":{"label":"Output value","value_name":"Value name","value":"Value","add_button":"Add a value"},"property":{"get":"get","set":"set"},"branch":{"placeholder":"Select nodes"},"jwt":{"static_claims":{"label":"Static claims","help":"Enter a JSON object. It will be stored as the node's static claims map.","errors":{"invalid_json_object":"Static claims must be a valid JSON object"}}},"errors":{"invalid_identifier_format":"{fieldName} must start with a letter or underscore and contain only letters, numbers, underscores, or hyphens","invalid_url_format":"Not a valid URL format","not_empty":"{fieldName} is required","not_float":"{fieldName} must be a float","not_integer":"{fieldName} must be an integer","not_number":"{fieldName} must be a number","not_unique":"{fieldName} must be unique","number_range":"{fieldName} must be between {min} and {max}","string_len_range":"{fieldName} must be between {minLength} and {maxLength} characters","reserved_node_name":"\\"{nodeName}\\" is a reserved node name","attributes_required":"Provide at least one of attributes_block_name or attributes_name_prefix"}},"error":{"invalid_connection":"Invalid connection","branch_cycle":"Cannot create a circular branch relationship"},"confirm":{"title":"Connection conflict","message":{"confirm":"Are you sure you want to make this change?","switch":"You can connect an output source to either all inputs of a node or to individual inputs.","override":"Each input can connect to only one output, but one output can connect to many inputs.","branch_replace":"This node already belongs to another branch. Move it to the new branch?"},"proceed":"Yes, update"},"leave_confirm":"Leave current page? Changes you made may not be saved."},"code_editor":{"mode":"Code editor"}},"vault_picker":{"component_error":"The vault secret picker is not available"},"tag_helper":"Use comma to separate values. eg: value1, value2","foreign_placeholder":"Enter a UUID of {entity}"}}`), vn = { title: "Redis configuration", managed_ui: { title: "Redis", shared_configuration: { label: "Use shared configuration", description: "Select an existing shared Redis configuration or create a new one. Any updates to this configuration will automatically apply to all associated plugins.", badge: "Recommended" }, dedicated_configuration: { label: "Use locally-scoped configuration", description: "Create and use a Redis configuration specifically for this plugin." }, selector: { placeholder: "Filter Redis configurations...", create_new: "New Redis" } }, shared_configuration: { label: "Shared configuration", description: "Select an existing shared Redis configuration or create a new one. Changes to this configuration automatically apply to all associated plugins.", title: "Shared Redis configuration", error: "Fetching shared Redis configurations failed." }, dedicated_configuration: { label: "Dedicated configuration", description: "Create a Redis configuration that is used only by this plugin. Changes won’t affect other plugins." }, config_card: { common_fields: { created_at_label: "Created at", updated_at_label: "Last updated at", type_label: "Redis type" } } }, bn = { plugin: "plugin" }, _n = { key_auth_identity_realms: { cp_label: "Current control plane", cp_group_label: "Control plane", realm_group_label: "Realms (can only select one)" }, kong_identity: { title: "Who should manage authentication and credentials?", description_with_realms: "Use Consumers or centrally managed consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", description_without_realms: "Use Consumers for Consumer-based authentication. Use Kong Identity for principal-based authentication and advanced integrations.", learn_more: "Learn more.", incompatible_data_plane_alert: "We detected that one or more data plane nodes are running a version earlier than 3.15. Requests handled by those data plane nodes will use consumers instead of Kong Identity principals.", kong_identity_label: "Kong Identity", kong_identity_description_key_auth: "Use Kong Identity to authenticate API keys and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", kong_identity_description_basic_auth: "Use Kong Identity to authenticate Basic Auth credentials and map requests to Kong Identity principals for advanced integrations. Data plane nodes running versions earlier than 3.15 continue using consumers.", consumers_label: "Consumers", consumers_description_key_auth: "Use consumer-managed API keys. Consumers provide their API key in a request header, query parameter, or request body to authenticate requests.", consumers_description_basic_auth: "Use consumer-managed Basic Auth credentials. Consumers authenticate requests using a username and password.", centrally_managed_label: "Centrally managed consumers", centrally_managed_description: "Authenticate centrally managed consumers in Konnect using identity realms. Identity realms are scoped to the control plane by default.", identity_realms_required: "To use centrally managed consumers, you must select at least one Centrally managed consumer realm.", error_on_miss_label: "If principal lookup fails", error_on_miss_reject_label: "Reject the request", error_on_miss_reject_description: "Treat the request as unauthenticated if Kong Identity cannot resolve the principal.", error_on_miss_continue_label: "Continue without a principal", error_on_miss_continue_description: "Allow the request to continue without resolving a principal.", configure_title: "Configure Kong Identity", configure_description: "Kong Identity uses principals to represent authenticated services or applications. Create your first principal in Kong Identity to start using principal-based authentication. On data plane nodes running versions earlier than 3.15, authentication continues using consumers.", create_principal: "Create principal", configure_learn_more: "Learn more", leave_prompt_title: "Leave this page?", leave_prompt_message: "Your unsaved changes will be lost if you continue.", leave_prompt_action: "Leave page" } }, wn = { window_type: { label: "Rate limit window type", help: "Sets the time window type to either <code>sliding</code> (default) or <code>fixed</code>.<br><ul><li>Sliding windows apply the rate limiting logic while taking into account previous hit rates (from the window that immediately precedes the current) using a dynamic weight.</li><li>Fixed windows consist of buckets that are statically assigned to a definitive time range, each request is mapped to only one fixed window based on its timestamp and will affect only that window's counters.</li></ul>", options: { fixed: "Fixed", sliding: "Sliding" } }, request_limits: { title: "Request limits", subtitle: "Set one or more limits on the number of API requests allowed within a defined timeframe.", label: "Limit", label_index: "Limit {index}", request_number: "Request number", time_interval: "Time interval", interval_determiner: "Every", seconds: "Seconds" }, error_message: { label: "Error message", code_placeholder: "Code message", message_placeholder: "Error message", help: "Set a custom error code and message to be returned when the rate limit is exceeded." }, start_with_a_use_case: "Start with a use case:", use_cases: { fixed: { hourly_500: { label: "500 requests every hour", description: "A fixed limit of 500 requests per hour resetting sharply on the hour, ensuring no user can exceed this limit." }, half_hourly_200: { label: "200 requests every 30 minutes", description: "Users are allowed 200 requests per 30 minutes, resetting exactly on the 30 minute mark with no carryover of unused limits." }, daily_500: { label: "500 requests every day", description: "A strict limit of 5000 requests per day resetting promptly at midnight, preventing any burst traffic or inconsistent user experiences." } }, sliding: { hourly_100: { label: "100 requests every hour", description: "Maximum of 100 requests every rolling hour, continuously adjusting the count over the course of the hour. No hard limit or known reset." }, half_hourly_300: { label: "300 requests every 30 minutes", description: "Each user can make up to 300 requests in any rolling 30 minute period, with older requests dropping off as new requests are made." }, hourly_500: { label: "500 requests every hour", description: `Each user is allowed 500 requests per hour.
|
|
2292
2293
|
If the limit is exceeded and the user receives a 429 error, each additional request within the sliding window (hour)
|
|
2293
|
-
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } } },
|
|
2294
|
-
actions:
|
|
2295
|
-
view_configuration:
|
|
2294
|
+
will extend the wait time by about 12 minutes, continuously adjusting as new requests are made.` } } } }, An = { step1: { title: "Custom plugin type", types: { installed: { label: "Installed custom plugin", description: "Install and manage plugins with full control over deployment and runtime. Requires restarting data planes." }, streamed: { label: "Streamed custom plugin", description: "Deploy and update plugins on running data planes without requiring gateway access." }, cloned: { label: "Cloned plugin", description: "Duplicate an existing plugin to run multiple instances within a single request." } }, compare_trigger: "Compare deployment options", compare_table: { columns: { installed: "Installed custom plugin", streamed: "Streamed custom plugin", cloned: "Cloned plugin" }, rows: { main_use_case: { header: "Main use case", installed: "Extend Kong functionality with custom plugins and control who can modify and roll out changes.", streamed: "Extend Kong functionality with plugins without requiring sysadmin access to data plane instances.", cloned: "Modify an existing plugin to run multiple instances with different names or priorities." }, file_supplied: { header: "File supplied", installed: { handler: "handler.lua", schema: "schema.lua", additional: "Any additional files or libraries needed" }, streamed: { handler: "handler.lua", schema: "schema.lua" } }, how_installed: { header: "How it's installed", installed: "Install directly on the data plane", streamed: "Through gateway configuration changes", cloned: "Through gateway configuration changes" }, sandboxing: { header: "Sandboxing", streamed: "Follows the standard sandboxing settings. {link}", streamed_link: "Link to docs", cloned: "Inherit the same sandboxing as the original plugins" }, data_plane_reload: { header: "Data plane reload" } } } }, step2_files: { title: "Custom plugin files", schema_file: { label: "Upload schema file", placeholder: "No file selected", placeholder_edit: "File not changed", button_text: "Select File", help: "Only Lua based schemas are supported by Konnect. Other plugin modules can be in any language as desired. Learn more" }, handler_file: { label: "Upload handler file", placeholder: "No file selected", placeholder_edit: "File not changed", button_text: "Select File", help: "Upload plugin handler to the data plane." }, plugin_modules: { label: "Plugin modules", alert: "Upload all plugin modules to the data plane: schema.lua, handler.lua" } }, step2_clone: { title: "Clone plugin", select_plugin: { label: "Select a plugin", placeholder: "Type to search" } }, step3: { title: "General information", description: "Enter a custom name for this custom plugin", name: { label: "Name", placeholder: "Enter a unique name", help: "The name must be identical to the name of the plugin in the schema file." }, alias_name: { label: "Alias name", placeholder: "Enter a unique name", help: "Format: ^[a-z][a-z0-9-]*[a-z0-9]$. The name must be unique enough to avoid future conflicts with bundled plugins." }, priority: { label: "Priority", tooltip: "Set the execution priority for this cloned plugin", help: { text: "Optional. Use a number to set the absolute execution priority. If priority isn't set, plugins run in alphabetical order. {link} in the docs.", link: "Learn more" } } }, errors: { file_read_error: "Failed to read file content. Please try again.", file_too_large: "File size exceeds the maximum limit of 1 MB.", plugin_not_found: "The selected plugin could not be found. Please refresh the list and try again.", no_supported_types: "No supported custom plugin types are available in this context.", unsupported_plugin_type: "Unsupported plugin type {type}." } }, kn = {
|
|
2295
|
+
actions: dn,
|
|
2296
|
+
view_configuration: pn,
|
|
2296
2297
|
delete: { title: "Delete a plugin", custom_title: "Delete {name}", custom_plugin: "Custom plugin", description: "This action cannot be reversed.", description_custom: "Please ensure this plugin is not in use. This action cannot be reversed.", plugin_schema_in_use_title: "Unable to delete custom plugin", plugin_schema_in_use_message: "This custom plugin is currently in use in this control plane. Please delete any existing instances before removing this schema.", confirmModalText1: "Are you sure you want to delete", confirmModalText2: "Please ensure this plugin is not in use. This delete action cannot be reversed.", confirm_text: "Type {name} to confirm your action", success_message: "Successfully deleted custom plugin {name}" },
|
|
2297
|
-
copy:
|
|
2298
|
-
errors:
|
|
2299
|
-
search:
|
|
2300
|
-
labels:
|
|
2301
|
-
plugins:
|
|
2302
|
-
redis:
|
|
2303
|
-
glossary:
|
|
2304
|
-
custom_field:
|
|
2305
|
-
sp:
|
|
2306
|
-
custom_plugin_form:
|
|
2298
|
+
copy: mn,
|
|
2299
|
+
errors: fn,
|
|
2300
|
+
search: hn,
|
|
2301
|
+
labels: gn,
|
|
2302
|
+
plugins: yn,
|
|
2303
|
+
redis: vn,
|
|
2304
|
+
glossary: bn,
|
|
2305
|
+
custom_field: _n,
|
|
2306
|
+
sp: wn,
|
|
2307
|
+
custom_plugin_form: An
|
|
2307
2308
|
};
|
|
2308
|
-
function
|
|
2309
|
-
const e = it("en-us",
|
|
2309
|
+
function Sn() {
|
|
2310
|
+
const e = it("en-us", kn);
|
|
2310
2311
|
return {
|
|
2311
2312
|
i18n: e,
|
|
2312
2313
|
i18nT: ot(e)
|
|
2313
2314
|
// Translation component <i18n-t>
|
|
2314
2315
|
};
|
|
2315
2316
|
}
|
|
2316
|
-
const
|
|
2317
|
+
const Cn = ["data-testid"], Tn = /* @__PURE__ */ N({
|
|
2317
2318
|
__name: "SwitchField",
|
|
2318
2319
|
props: {
|
|
2319
2320
|
labelAttributes: {},
|
|
@@ -2324,77 +2325,77 @@ const Sn = ["data-testid"], Cn = /* @__PURE__ */ N({
|
|
|
2324
2325
|
},
|
|
2325
2326
|
emits: ["update:modelValue"],
|
|
2326
2327
|
setup(e, { emit: r }) {
|
|
2327
|
-
const { i18n: { t } } =
|
|
2328
|
+
const { i18n: { t } } = Sn(), a = le(e, ["name", "enabledText", "disabledText"]), { value: s, hide: n, emptyOrDefaultValue: u, ...d } = Z(j(() => e.name)), f = r, i = (h) => {
|
|
2328
2329
|
s.value = h, f("update:modelValue", h);
|
|
2329
|
-
},
|
|
2330
|
+
}, m = ie(d.path, a);
|
|
2330
2331
|
return (h, l) => {
|
|
2331
|
-
const
|
|
2332
|
-
return d.error ? (
|
|
2332
|
+
const c = U("KAlert");
|
|
2333
|
+
return d.error ? (_(), L(c, {
|
|
2333
2334
|
key: 0,
|
|
2334
2335
|
appearance: "danger",
|
|
2335
2336
|
message: d.error.message
|
|
2336
|
-
}, null, 8, ["message"])) :
|
|
2337
|
+
}, null, 8, ["message"])) : X((_(), E("div", {
|
|
2337
2338
|
key: 1,
|
|
2338
2339
|
class: "ff-switch-field",
|
|
2339
2340
|
"data-testid": `ff-${d.path.value}`
|
|
2340
2341
|
}, [
|
|
2341
|
-
$(o(Vt),
|
|
2342
|
-
"model-value": !!(o(s) == null ? o(
|
|
2342
|
+
$(o(Vt), H(o(m), {
|
|
2343
|
+
"model-value": !!(o(s) == null ? o(u) : o(s)),
|
|
2343
2344
|
"onUpdate:modelValue": i
|
|
2344
2345
|
}), {
|
|
2345
|
-
label:
|
|
2346
|
+
label: K(() => [
|
|
2346
2347
|
pe(de(o(s) ? e.enabledText || o(t)("actions.enabled") : e.disabledText || o(t)("actions.disabled")), 1)
|
|
2347
2348
|
]),
|
|
2348
2349
|
_: 1
|
|
2349
2350
|
}, 16, ["model-value"])
|
|
2350
|
-
], 8,
|
|
2351
|
-
[
|
|
2351
|
+
], 8, Cn)), [
|
|
2352
|
+
[Q, !o(n)]
|
|
2352
2353
|
]);
|
|
2353
2354
|
};
|
|
2354
2355
|
}
|
|
2355
|
-
}),
|
|
2356
|
+
}), Fn = /* @__PURE__ */ G(Tn, [["__scopeId", "data-v-0b4c3942"]]);
|
|
2356
2357
|
export {
|
|
2357
|
-
|
|
2358
|
-
|
|
2358
|
+
La as ArrayField,
|
|
2359
|
+
va as BooleanField,
|
|
2359
2360
|
Se as EnumField,
|
|
2360
2361
|
Ge as FIELD_PATH_KEY,
|
|
2361
2362
|
ke as FIELD_RENDERERS,
|
|
2362
2363
|
Oe as FIELD_RENDERER_SLOTS,
|
|
2363
2364
|
Je as FIELD_RESET_LABEL_PATH_SETTING,
|
|
2364
2365
|
ge as Field,
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2366
|
+
Dn as FieldRenderer,
|
|
2367
|
+
an as ForeignField,
|
|
2368
|
+
On as Form,
|
|
2369
|
+
Za as JsonField,
|
|
2370
|
+
cn as MapField,
|
|
2371
|
+
Wa as NumberField,
|
|
2372
|
+
Ba as ObjectField,
|
|
2372
2373
|
gt as StringArrayField,
|
|
2373
2374
|
ht as StringField,
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2375
|
+
Fn as SwitchField,
|
|
2376
|
+
Nt as buildAncestor,
|
|
2377
|
+
qe as buildArraySchemaMap,
|
|
2378
|
+
xe as buildMapSchemaMap,
|
|
2379
|
+
Le as buildRecordSchemaMap,
|
|
2380
|
+
Ht as buildSchemaMap,
|
|
2380
2381
|
ft as defaultLabelFormatter,
|
|
2381
2382
|
he as generalizePath,
|
|
2382
|
-
|
|
2383
|
+
aa as provideFormShared,
|
|
2383
2384
|
jn as renderRuleExactMatch,
|
|
2384
2385
|
pt as replaceByDictionary,
|
|
2385
2386
|
mt as replaceByDictionaryInFieldName,
|
|
2386
|
-
|
|
2387
|
+
Z as useField,
|
|
2387
2388
|
ct as useFieldAncestors,
|
|
2388
|
-
|
|
2389
|
-
|
|
2389
|
+
ie as useFieldAttrs,
|
|
2390
|
+
ua as useFieldLabel,
|
|
2390
2391
|
dt as useFieldPath,
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2392
|
+
ia as useFieldRenderer,
|
|
2393
|
+
oa as useFormData,
|
|
2394
|
+
ne as useFormShared,
|
|
2395
|
+
ra as useItemKeys,
|
|
2396
|
+
la as useLabelPath,
|
|
2397
|
+
ca as useMapField,
|
|
2398
|
+
na as useOptionalFormShared,
|
|
2398
2399
|
Vn as useSchemaExposer,
|
|
2399
|
-
|
|
2400
|
+
Wt as useSchemaHelpers
|
|
2400
2401
|
};
|