@box/metadata-editor 0.48.0 → 0.49.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/esm/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form/metadata-instance-form.js +54 -51
- package/esm/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form-footer/metadata-instance-form-footer.js +18 -15
- package/esm/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form-header/metadata-instance-form-header.js +31 -23
- package/esm/lib/test-utils/index.js +36 -26
- package/esm/lib/test-utils/sample-data.js +110 -64
- package/esm/lib/test-utils/test-utils.js +28 -11
- package/esm/lib/utils/autofill-context.js +62 -0
- package/package.json +3 -2
- package/types/lib/components/metadata-instance-editor/subcomponents/metadata-instance-form-header/metadata-instance-form-header.d.ts +1 -1
- package/types/lib/test-utils/sample-data.d.ts +10 -2
- package/types/lib/test-utils/test-utils.d.ts +3 -0
- package/types/lib/types.d.ts +2 -0
- package/types/lib/utils/autofill-context.d.ts +14 -0
@@ -1,75 +1,78 @@
|
|
1
1
|
import "../../../../../../styles/metadata-instance-form.css";
|
2
|
-
import { useState as g, useMemo as S } from "react";
|
3
|
-
import { Formik as D } from "formik";
|
4
2
|
import { Card as E } from "@box/blueprint-web";
|
5
|
-
import {
|
6
|
-
import {
|
7
|
-
import {
|
8
|
-
import {
|
9
|
-
import {
|
10
|
-
import {
|
11
|
-
import {
|
12
|
-
import {
|
13
|
-
import {
|
14
|
-
import {
|
15
|
-
|
16
|
-
|
17
|
-
|
3
|
+
import { Formik as b } from "formik";
|
4
|
+
import { useState as O, useMemo as y } from "react";
|
5
|
+
import { TEMPLATE_CUSTOM_PROPERTIES as A } from "../../../../constants.js";
|
6
|
+
import { useAutofill as N } from "../../../../utils/autofill-context.js";
|
7
|
+
import { TemplateInstance as T } from "../../../metadata-editor-fields/metadata-editor-fields.js";
|
8
|
+
import { MetadataEmptyState as v } from "../../../metadata-empty-state/metadata-empty-state.js";
|
9
|
+
import { UnsavedChangesModal as L } from "../../../unsaved-changes-modal/unsaved-changes-modal.js";
|
10
|
+
import { CustomInstance as _ } from "../custom-instance/custom-instance.js";
|
11
|
+
import { DeleteConfirmationModal as x } from "../delete-confirmation-modal/delete-confirmation-modal.js";
|
12
|
+
import { MetadataInstanceFormFooter as P } from "../metadata-instance-form-footer/metadata-instance-form-footer.js";
|
13
|
+
import { MetadataInstanceFormHeader as U } from "../metadata-instance-form-header/metadata-instance-form-header.js";
|
14
|
+
import { createJSONPatch as j } from "./utils.js";
|
15
|
+
import { jsx as t, jsxs as l, Fragment as R } from "react/jsx-runtime";
|
16
|
+
const k = "_metadataInstanceForm_1hu4u_1", B = {
|
17
|
+
metadataInstanceForm: k
|
18
|
+
}, te = (d) => {
|
18
19
|
const {
|
19
20
|
isAiSuggestionsFeatureEnabled: o,
|
20
|
-
isLoading:
|
21
|
-
isUnsavedChangesModalOpen:
|
22
|
-
onCancel:
|
23
|
-
onDelete:
|
24
|
-
onSubmit:
|
21
|
+
isLoading: c,
|
22
|
+
isUnsavedChangesModalOpen: p = !1,
|
23
|
+
onCancel: f,
|
24
|
+
onDelete: u,
|
25
|
+
onSubmit: g,
|
25
26
|
selectedTemplateInstance: e,
|
26
27
|
setIsUnsavedChangesModalOpen: s
|
27
|
-
} = d, [C,
|
28
|
-
|
29
|
-
},
|
30
|
-
a
|
31
|
-
}, h = () => {
|
32
|
-
|
33
|
-
},
|
28
|
+
} = d, [C, m] = O(!1), {
|
29
|
+
isFetchingSuggestions: F
|
30
|
+
} = N(), n = c || F, i = e.templateKey === A, r = (a) => {
|
31
|
+
g(e.id, j(a, e)), s(!1);
|
32
|
+
}, h = (a) => {
|
33
|
+
a ? s(!0) : f();
|
34
|
+
}, M = () => {
|
35
|
+
m(!0);
|
36
|
+
}, I = {
|
34
37
|
metadata: {
|
35
38
|
...e
|
36
39
|
}
|
37
|
-
},
|
38
|
-
const a = e.
|
39
|
-
return
|
40
|
+
}, S = y(() => {
|
41
|
+
const a = e.fields.length === 0;
|
42
|
+
return i ? /* @__PURE__ */ t(_, {
|
40
43
|
isLoading: n
|
41
|
-
}) :
|
44
|
+
}) : a ? /* @__PURE__ */ t(v, {
|
42
45
|
isBoxAiSuggestionsFeatureEnabled: o,
|
43
46
|
level: "instance"
|
44
|
-
}) : /* @__PURE__ */ t(
|
47
|
+
}) : /* @__PURE__ */ t(T, {
|
45
48
|
disableForm: n
|
46
49
|
});
|
47
|
-
}, [
|
48
|
-
return /* @__PURE__ */ t(
|
49
|
-
initialValues:
|
50
|
-
onSubmit:
|
50
|
+
}, [i, e.fields.length, n, o]);
|
51
|
+
return /* @__PURE__ */ t(b, {
|
52
|
+
initialValues: I,
|
53
|
+
onSubmit: r,
|
51
54
|
children: ({
|
52
55
|
values: a,
|
53
|
-
dirty:
|
54
|
-
}) => /* @__PURE__ */ l(
|
56
|
+
dirty: D
|
57
|
+
}) => /* @__PURE__ */ l(R, {
|
55
58
|
children: [/* @__PURE__ */ l(E, {
|
56
|
-
className:
|
57
|
-
children: [/* @__PURE__ */ t(
|
58
|
-
isAiSuggestionsFeatureEnabled: o,
|
59
|
+
className: B.metadataInstanceForm,
|
60
|
+
children: [/* @__PURE__ */ t(U, {
|
61
|
+
isAiSuggestionsFeatureEnabled: o && !i,
|
59
62
|
isLoading: n,
|
60
63
|
templateName: e.displayName
|
61
|
-
}),
|
64
|
+
}), S, /* @__PURE__ */ t(P, {
|
62
65
|
isLoading: n,
|
63
|
-
onCancel: () =>
|
64
|
-
onDelete:
|
66
|
+
onCancel: () => h(D),
|
67
|
+
onDelete: M
|
65
68
|
})]
|
66
|
-
}), /* @__PURE__ */ t(
|
69
|
+
}), /* @__PURE__ */ t(L, {
|
67
70
|
onDismiss: () => s(!1),
|
68
|
-
onSaveAndContinue: () =>
|
69
|
-
open:
|
70
|
-
}), /* @__PURE__ */ t(
|
71
|
-
onConfirm: () =>
|
72
|
-
onDismiss: () =>
|
71
|
+
onSaveAndContinue: () => r(a),
|
72
|
+
open: p
|
73
|
+
}), /* @__PURE__ */ t(x, {
|
74
|
+
onConfirm: () => u(e.id),
|
75
|
+
onDismiss: () => m(!1),
|
73
76
|
open: C,
|
74
77
|
templateName: e.displayName
|
75
78
|
})]
|
@@ -77,5 +80,5 @@ const U = "_metadataInstanceForm_1hu4u_1", j = {
|
|
77
80
|
});
|
78
81
|
};
|
79
82
|
export {
|
80
|
-
|
83
|
+
te as MetadataInstanceForm
|
81
84
|
};
|
@@ -1,32 +1,35 @@
|
|
1
1
|
import "../../../../../../styles/metadata-instance-form-footer.css";
|
2
|
-
import { TextButton as
|
3
|
-
import { useFormikContext as
|
2
|
+
import { TextButton as b, Button as r } from "@box/blueprint-web";
|
3
|
+
import { useFormikContext as g } from "formik";
|
4
4
|
import { useIntl as F } from "react-intl";
|
5
|
+
import { useAutofill as f } from "../../../../utils/autofill-context.js";
|
5
6
|
import o from "./messages.js";
|
6
7
|
import { jsx as e, jsxs as i } from "react/jsx-runtime";
|
7
|
-
const
|
8
|
-
metadataInstanceFormFooter:
|
9
|
-
buttonsContainer:
|
10
|
-
buttons:
|
11
|
-
},
|
8
|
+
const _ = "_metadataInstanceFormFooter_17478_1", p = "_buttonsContainer_17478_8", C = "_buttons_17478_8", s = {
|
9
|
+
metadataInstanceFormFooter: _,
|
10
|
+
buttonsContainer: p,
|
11
|
+
buttons: C
|
12
|
+
}, A = ({
|
12
13
|
isLoading: m,
|
13
14
|
onCancel: c,
|
14
15
|
onDelete: l
|
15
16
|
}) => {
|
16
17
|
const t = F(), {
|
17
|
-
isSubmitting:
|
18
|
+
isSubmitting: a,
|
18
19
|
submitForm: d
|
19
|
-
} =
|
20
|
+
} = g(), {
|
21
|
+
isFetchingSuggestions: u
|
22
|
+
} = f(), n = m || a || u;
|
20
23
|
return /* @__PURE__ */ e("div", {
|
21
|
-
className:
|
24
|
+
className: s.metadataInstanceFormFooter,
|
22
25
|
children: /* @__PURE__ */ i("div", {
|
23
|
-
className:
|
24
|
-
children: [/* @__PURE__ */ e(
|
26
|
+
className: s.buttonsContainer,
|
27
|
+
children: [/* @__PURE__ */ e(b, {
|
25
28
|
disabled: n,
|
26
29
|
onClick: l,
|
27
30
|
children: t.formatMessage(o.deleteButton)
|
28
31
|
}), /* @__PURE__ */ i("div", {
|
29
|
-
className:
|
32
|
+
className: s.buttons,
|
30
33
|
children: [/* @__PURE__ */ e(r, {
|
31
34
|
disabled: n,
|
32
35
|
onClick: c,
|
@@ -35,7 +38,7 @@ const g = "_metadataInstanceFormFooter_17478_1", f = "_buttonsContainer_17478_8"
|
|
35
38
|
children: t.formatMessage(o.cancelButton)
|
36
39
|
}), /* @__PURE__ */ e(r, {
|
37
40
|
disabled: n,
|
38
|
-
loading:
|
41
|
+
loading: a,
|
39
42
|
loadingAriaLabel: t.formatMessage(o.loadingAriaLabel),
|
40
43
|
onClick: d,
|
41
44
|
size: "large",
|
@@ -46,5 +49,5 @@ const g = "_metadataInstanceFormFooter_17478_1", f = "_buttonsContainer_17478_8"
|
|
46
49
|
});
|
47
50
|
};
|
48
51
|
export {
|
49
|
-
|
52
|
+
A as MetadataInstanceFormFooter
|
50
53
|
};
|
@@ -1,40 +1,48 @@
|
|
1
1
|
import "../../../../../../styles/metadata-instance-form-header.css";
|
2
|
-
import { Text as
|
3
|
-
import { BoxAiLogo as
|
4
|
-
import { useFormikContext as
|
5
|
-
import { useIntl as
|
2
|
+
import { Text as h, Button as x } from "@box/blueprint-web";
|
3
|
+
import { BoxAiLogo as A } from "@box/blueprint-web-assets/icons/Logo";
|
4
|
+
import { useFormikContext as _, getIn as s } from "formik";
|
5
|
+
import { useIntl as y } from "react-intl";
|
6
|
+
import { useAutofill as B } from "../../../../utils/autofill-context.js";
|
6
7
|
import e from "./messages.js";
|
7
|
-
import { jsxs as
|
8
|
-
const
|
9
|
-
metadataInstanceFormHeader:
|
10
|
-
title:
|
11
|
-
},
|
8
|
+
import { jsxs as H, jsx as o } from "react/jsx-runtime";
|
9
|
+
const M = "_metadataInstanceFormHeader_1b2cc_1", v = "_title_1b2cc_8", i = {
|
10
|
+
metadataInstanceFormHeader: M,
|
11
|
+
title: v
|
12
|
+
}, w = ({
|
12
13
|
isAiSuggestionsFeatureEnabled: n,
|
13
14
|
isLoading: r,
|
14
|
-
|
15
|
-
templateName: i
|
15
|
+
templateName: m
|
16
16
|
}) => {
|
17
17
|
const {
|
18
|
-
isSubmitting:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
isSubmitting: l,
|
19
|
+
values: a,
|
20
|
+
setFieldValue: c
|
21
|
+
} = _(), {
|
22
|
+
getAiSuggestions: d,
|
23
|
+
isFetchingSuggestions: u
|
24
|
+
} = B(), t = y(), g = async () => {
|
25
|
+
const F = s(a, "metadata.fields"), I = s(a, "metadata.templateKey"), b = await d(I, F);
|
26
|
+
c("metadata.fields", b);
|
27
|
+
}, f = m ?? t.formatMessage(e.customInstanceTitle), p = l || u;
|
28
|
+
return /* @__PURE__ */ H("div", {
|
29
|
+
className: i.metadataInstanceFormHeader,
|
30
|
+
children: [/* @__PURE__ */ o(h, {
|
23
31
|
as: "h1",
|
24
|
-
className:
|
32
|
+
className: i.title,
|
25
33
|
variant: "titleMedium",
|
26
|
-
children:
|
27
|
-
}), n && /* @__PURE__ */
|
28
|
-
disabled:
|
29
|
-
icon:
|
34
|
+
children: f
|
35
|
+
}), n && /* @__PURE__ */ o(x, {
|
36
|
+
disabled: p,
|
37
|
+
icon: A,
|
30
38
|
loading: r,
|
31
39
|
loadingAriaLabel: t.formatMessage(e.loadingButtonAriaLabel),
|
32
|
-
onClick:
|
40
|
+
onClick: g,
|
33
41
|
variant: "secondary",
|
34
42
|
children: t.formatMessage(e.autofillButton)
|
35
43
|
})]
|
36
44
|
});
|
37
45
|
};
|
38
46
|
export {
|
39
|
-
|
47
|
+
w as MetadataInstanceFormHeader
|
40
48
|
};
|
@@ -1,31 +1,41 @@
|
|
1
1
|
import { FormikWrapper as l } from "./formik-wrapper.js";
|
2
|
-
import { allFieldsTemplate as
|
3
|
-
import { blur as
|
2
|
+
import { allFieldsSuggestions as a, allFieldsTemplate as n, allFieldsTemplateInstance as i, allFieldsWithAiSuggestions as m, customTemplate as p, customTemplateInstance as o, customTemplateInstanceWithAllFieldsEmpty as d, customTemplateInstanceWithoutEmptyValues as c, dateField as u, emptyCustomTemplateInstance as F, emptyTemplateInstance as T, enumField as r, fields as g, firstTemplateInstance as I, firstTemplateInstanceFieldsWithSuggestions as f, firstTemplateSuggestions as h, floatField as S, multiSelectField as W, noFieldsTemplate as y, noValueField as x, nonHiddenFieldsTemplate as A, secondTemplateInstance as E, secondTemplateInstanceFieldsWithSuggestions as V, secondTemplateSuggestions as b, stringField as k, templateInstanceWithAllFieldsEmpty as B, templateInstanceWithoutEmptyValues as C, templateInstancesList as D, templateOptions as H, templates as L } from "./sample-data.js";
|
3
|
+
import { blur as j, checkIfFormFieldsAreDisabled as q, fetchSuggestions as v, updateText as w, updateTextAndBlur as z } from "./test-utils.js";
|
4
4
|
export {
|
5
5
|
l as FormikWrapper,
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
o as
|
14
|
-
|
15
|
-
c as
|
16
|
-
|
17
|
-
|
18
|
-
T as
|
19
|
-
|
6
|
+
a as allFieldsSuggestions,
|
7
|
+
n as allFieldsTemplate,
|
8
|
+
i as allFieldsTemplateInstance,
|
9
|
+
m as allFieldsWithAiSuggestions,
|
10
|
+
j as blur,
|
11
|
+
q as checkIfFormFieldsAreDisabled,
|
12
|
+
p as customTemplate,
|
13
|
+
o as customTemplateInstance,
|
14
|
+
d as customTemplateInstanceWithAllFieldsEmpty,
|
15
|
+
c as customTemplateInstanceWithoutEmptyValues,
|
16
|
+
u as dateField,
|
17
|
+
F as emptyCustomTemplateInstance,
|
18
|
+
T as emptyTemplateInstance,
|
19
|
+
r as enumField,
|
20
|
+
v as fetchSuggestions,
|
21
|
+
g as fields,
|
22
|
+
I as firstTemplateInstance,
|
23
|
+
f as firstTemplateInstanceFieldsWithSuggestions,
|
24
|
+
h as firstTemplateSuggestions,
|
25
|
+
S as floatField,
|
26
|
+
W as multiSelectField,
|
20
27
|
y as noFieldsTemplate,
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
x as noValueField,
|
29
|
+
A as nonHiddenFieldsTemplate,
|
30
|
+
E as secondTemplateInstance,
|
31
|
+
V as secondTemplateInstanceFieldsWithSuggestions,
|
32
|
+
b as secondTemplateSuggestions,
|
33
|
+
k as stringField,
|
34
|
+
B as templateInstanceWithAllFieldsEmpty,
|
35
|
+
C as templateInstanceWithoutEmptyValues,
|
36
|
+
D as templateInstancesList,
|
37
|
+
H as templateOptions,
|
38
|
+
L as templates,
|
39
|
+
w as updateText,
|
40
|
+
z as updateTextAndBlur
|
31
41
|
};
|
@@ -1,17 +1,17 @@
|
|
1
|
-
import { mapTemplateOptionsFromTemplates as
|
2
|
-
const
|
1
|
+
import { mapTemplateOptionsFromTemplates as h } from "../mappers.js";
|
2
|
+
const n = {
|
3
3
|
id: "1",
|
4
4
|
type: "string",
|
5
5
|
key: "signature",
|
6
6
|
hidden: !1,
|
7
7
|
displayName: "Signature"
|
8
|
-
},
|
8
|
+
}, d = {
|
9
9
|
id: "2",
|
10
10
|
type: "date",
|
11
11
|
key: "effectiveDate",
|
12
12
|
hidden: !1,
|
13
13
|
displayName: "Effective Date"
|
14
|
-
},
|
14
|
+
}, l = {
|
15
15
|
id: "3",
|
16
16
|
type: "enum",
|
17
17
|
key: "country",
|
@@ -24,13 +24,13 @@ const a = {
|
|
24
24
|
id: "2",
|
25
25
|
key: "UK"
|
26
26
|
}]
|
27
|
-
},
|
27
|
+
}, p = {
|
28
28
|
id: "4",
|
29
29
|
type: "float",
|
30
30
|
key: "caseNumber",
|
31
31
|
hidden: !1,
|
32
32
|
displayName: "Number of Cases"
|
33
|
-
},
|
33
|
+
}, m = {
|
34
34
|
id: "5",
|
35
35
|
type: "multiSelect",
|
36
36
|
key: "orgs",
|
@@ -46,35 +46,35 @@ const a = {
|
|
46
46
|
id: "Engineering",
|
47
47
|
key: "Engineering"
|
48
48
|
}]
|
49
|
-
},
|
49
|
+
}, k = {
|
50
50
|
id: "6",
|
51
51
|
type: "string",
|
52
52
|
key: "hidden",
|
53
53
|
displayName: "Hidden",
|
54
54
|
hidden: !0
|
55
|
-
},
|
55
|
+
}, F = {
|
56
56
|
id: "7",
|
57
57
|
type: "string",
|
58
58
|
key: "noValue",
|
59
59
|
hidden: !1,
|
60
60
|
displayName: "No value"
|
61
|
-
},
|
61
|
+
}, o = {
|
62
62
|
id: "1",
|
63
63
|
displayName: "All metadata fields",
|
64
64
|
scope: "enterprise_1",
|
65
65
|
templateKey: "allFields",
|
66
66
|
type: "metadata_template",
|
67
67
|
hidden: !1,
|
68
|
-
fields: [
|
69
|
-
},
|
68
|
+
fields: [n, l, p, d, m, k, F]
|
69
|
+
}, H = {
|
70
70
|
hidden: !1,
|
71
71
|
id: "2",
|
72
72
|
displayName: "Non hidden metadata fields",
|
73
73
|
scope: "enterprise_1",
|
74
74
|
templateKey: "nonHiddenFields",
|
75
75
|
type: "metadata_template",
|
76
|
-
fields: [
|
77
|
-
},
|
76
|
+
fields: [n, l, p, d, m]
|
77
|
+
}, N = {
|
78
78
|
id: "3",
|
79
79
|
displayName: "No metadata fields",
|
80
80
|
scope: "enterprise_3",
|
@@ -82,7 +82,7 @@ const a = {
|
|
82
82
|
type: "metadata_template",
|
83
83
|
fields: [],
|
84
84
|
hidden: !1
|
85
|
-
},
|
85
|
+
}, _ = {
|
86
86
|
id: "4",
|
87
87
|
displayName: "Hidden template",
|
88
88
|
scope: "enterprise_3",
|
@@ -90,21 +90,21 @@ const a = {
|
|
90
90
|
type: "metadata_template",
|
91
91
|
fields: [],
|
92
92
|
hidden: !0
|
93
|
-
},
|
93
|
+
}, I = [o, N, _], O = {
|
94
94
|
id: "5",
|
95
95
|
scope: "enterprise_3",
|
96
96
|
templateKey: "properties",
|
97
97
|
type: "metadata_template",
|
98
98
|
fields: [],
|
99
99
|
hidden: !1
|
100
|
-
},
|
100
|
+
}, U = h(I), J = [n, l, p, d, m], y = {
|
101
101
|
id: "1",
|
102
102
|
type: "string",
|
103
103
|
key: "signature",
|
104
104
|
hidden: !1,
|
105
105
|
displayName: "Signature",
|
106
106
|
value: "Jan Kowalski"
|
107
|
-
},
|
107
|
+
}, c = {
|
108
108
|
id: "2",
|
109
109
|
type: "enum",
|
110
110
|
key: "country",
|
@@ -118,21 +118,21 @@ const a = {
|
|
118
118
|
key: "UK"
|
119
119
|
}],
|
120
120
|
value: "US"
|
121
|
-
},
|
121
|
+
}, r = {
|
122
122
|
id: "3",
|
123
123
|
type: "float",
|
124
124
|
key: "caseNumber",
|
125
125
|
hidden: !1,
|
126
126
|
displayName: "Number of Cases",
|
127
127
|
value: "25"
|
128
|
-
},
|
128
|
+
}, u = {
|
129
129
|
id: "4",
|
130
130
|
type: "date",
|
131
131
|
key: "effectiveDate",
|
132
132
|
hidden: !1,
|
133
133
|
displayName: "Effective Date",
|
134
134
|
value: "2024-02-08T00:00:00.000Z"
|
135
|
-
},
|
135
|
+
}, f = {
|
136
136
|
id: "5",
|
137
137
|
type: "multiSelect",
|
138
138
|
key: "orgs",
|
@@ -149,27 +149,27 @@ const a = {
|
|
149
149
|
key: "Engineering"
|
150
150
|
}],
|
151
151
|
value: ["Sales", "Marketing"]
|
152
|
-
},
|
152
|
+
}, g = {
|
153
153
|
id: "6",
|
154
154
|
type: "string",
|
155
155
|
key: "hidden",
|
156
156
|
displayName: "Hidden",
|
157
157
|
hidden: !0,
|
158
158
|
value: "should be hidden"
|
159
|
-
},
|
159
|
+
}, a = {
|
160
160
|
id: "7",
|
161
161
|
type: "string",
|
162
162
|
key: "noValue",
|
163
163
|
hidden: !1,
|
164
164
|
displayName: "No value",
|
165
165
|
value: null
|
166
|
-
},
|
167
|
-
...
|
166
|
+
}, T = {
|
167
|
+
...a,
|
168
168
|
key: "noValue1"
|
169
|
-
},
|
170
|
-
...
|
169
|
+
}, E = {
|
170
|
+
...a,
|
171
171
|
key: "noValue2"
|
172
|
-
},
|
172
|
+
}, S = {
|
173
173
|
canEdit: !0,
|
174
174
|
id: "1",
|
175
175
|
displayName: "All metadata fields",
|
@@ -177,8 +177,8 @@ const a = {
|
|
177
177
|
templateKey: "allFields",
|
178
178
|
type: "metadata_template",
|
179
179
|
hidden: !1,
|
180
|
-
fields: [
|
181
|
-
},
|
180
|
+
fields: [y, c, r, u, f, g, a]
|
181
|
+
}, K = {
|
182
182
|
canEdit: !0,
|
183
183
|
id: "2",
|
184
184
|
displayName: "Without Empty Values",
|
@@ -186,7 +186,7 @@ const a = {
|
|
186
186
|
templateKey: "withoutEmptyFields",
|
187
187
|
type: "metadata_template",
|
188
188
|
hidden: !1,
|
189
|
-
fields: [
|
189
|
+
fields: [y, c, r, u, f, g]
|
190
190
|
}, v = {
|
191
191
|
canEdit: !0,
|
192
192
|
id: "3",
|
@@ -196,7 +196,7 @@ const a = {
|
|
196
196
|
type: "metadata_template",
|
197
197
|
hidden: !1,
|
198
198
|
fields: []
|
199
|
-
},
|
199
|
+
}, V = {
|
200
200
|
canEdit: !0,
|
201
201
|
id: "4",
|
202
202
|
displayName: "All Fields Empty Template",
|
@@ -204,41 +204,41 @@ const a = {
|
|
204
204
|
templateKey: "emptyFields",
|
205
205
|
type: "metadata_template",
|
206
206
|
hidden: !1,
|
207
|
-
fields: [
|
208
|
-
},
|
207
|
+
fields: [a, T, E]
|
208
|
+
}, i = {
|
209
209
|
id: "1",
|
210
210
|
type: "string",
|
211
211
|
key: "signature",
|
212
212
|
hidden: !1,
|
213
213
|
value: "Jan Kowalski"
|
214
|
-
},
|
214
|
+
}, s = {
|
215
215
|
id: "2",
|
216
216
|
type: "string",
|
217
217
|
key: "version number",
|
218
218
|
hidden: !1,
|
219
219
|
value: "2.1"
|
220
|
-
},
|
220
|
+
}, t = {
|
221
221
|
id: "3",
|
222
222
|
type: "string",
|
223
223
|
key: "empty field",
|
224
224
|
hidden: !1
|
225
|
-
},
|
225
|
+
}, A = {
|
226
226
|
canEdit: !0,
|
227
227
|
id: "5",
|
228
228
|
scope: "enterprise_1",
|
229
229
|
templateKey: "properties",
|
230
230
|
type: "metadata_template",
|
231
|
-
fields: [
|
231
|
+
fields: [i, s, t],
|
232
232
|
hidden: !1
|
233
|
-
},
|
233
|
+
}, b = {
|
234
234
|
canEdit: !0,
|
235
235
|
id: "6",
|
236
236
|
scope: "enterprise_1",
|
237
237
|
templateKey: "properties",
|
238
238
|
type: "metadata_template",
|
239
|
-
fields: [
|
239
|
+
fields: [i, s],
|
240
240
|
hidden: !1
|
241
|
-
},
|
241
|
+
}, C = {
|
242
242
|
canEdit: !0,
|
243
243
|
id: "7",
|
244
244
|
scope: "enterprise_1",
|
@@ -246,36 +246,82 @@ const a = {
|
|
246
246
|
type: "metadata_template",
|
247
247
|
fields: [],
|
248
248
|
hidden: !1
|
249
|
-
},
|
249
|
+
}, W = {
|
250
250
|
canEdit: !0,
|
251
251
|
id: "8",
|
252
252
|
scope: "enterprise_1",
|
253
253
|
templateKey: "properties",
|
254
254
|
type: "metadata_template",
|
255
|
-
fields: [
|
255
|
+
fields: [t, t, t],
|
256
256
|
hidden: !1
|
257
|
-
},
|
257
|
+
}, w = [S, K, V, v, A, b, C, W], M = o.fields.map((e) => ({
|
258
|
+
...e,
|
259
|
+
aiSuggestion: "mock suggestion"
|
260
|
+
})), B = {
|
261
|
+
[o.templateKey]: {
|
262
|
+
...Object.fromEntries(M.map((e) => [e.key, e.aiSuggestion]))
|
263
|
+
}
|
264
|
+
}, z = {
|
265
|
+
id: "1",
|
266
|
+
canEdit: !0,
|
267
|
+
displayName: "Metadata Template A",
|
268
|
+
scope: "enterprise_1",
|
269
|
+
templateKey: "templateA",
|
270
|
+
type: "metadata_template",
|
271
|
+
hidden: !1,
|
272
|
+
fields: [i]
|
273
|
+
}, j = {
|
274
|
+
templateA: {
|
275
|
+
signature: "John Doe"
|
276
|
+
}
|
277
|
+
}, x = [{
|
278
|
+
...i,
|
279
|
+
aiSuggestion: "John Doe"
|
280
|
+
}], L = {
|
281
|
+
id: "1",
|
282
|
+
displayName: "Metadata Template B",
|
283
|
+
scope: "enterprise_1",
|
284
|
+
templateKey: "templateB",
|
285
|
+
type: "metadata_template",
|
286
|
+
hidden: !1,
|
287
|
+
fields: [s]
|
288
|
+
}, Z = {
|
289
|
+
templateB: {
|
290
|
+
"version number": "3.0"
|
291
|
+
}
|
292
|
+
}, q = [{
|
293
|
+
...s,
|
294
|
+
aiSuggestion: "3.0"
|
295
|
+
}];
|
258
296
|
export {
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
b as
|
297
|
+
B as allFieldsSuggestions,
|
298
|
+
o as allFieldsTemplate,
|
299
|
+
S as allFieldsTemplateInstance,
|
300
|
+
M as allFieldsWithAiSuggestions,
|
301
|
+
O as customTemplate,
|
302
|
+
A as customTemplateInstance,
|
303
|
+
W as customTemplateInstanceWithAllFieldsEmpty,
|
304
|
+
b as customTemplateInstanceWithoutEmptyValues,
|
305
|
+
d as dateField,
|
306
|
+
C as emptyCustomTemplateInstance,
|
267
307
|
v as emptyTemplateInstance,
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
308
|
+
l as enumField,
|
309
|
+
J as fields,
|
310
|
+
z as firstTemplateInstance,
|
311
|
+
x as firstTemplateInstanceFieldsWithSuggestions,
|
312
|
+
j as firstTemplateSuggestions,
|
313
|
+
p as floatField,
|
314
|
+
m as multiSelectField,
|
315
|
+
N as noFieldsTemplate,
|
316
|
+
F as noValueField,
|
317
|
+
H as nonHiddenFieldsTemplate,
|
318
|
+
L as secondTemplateInstance,
|
319
|
+
q as secondTemplateInstanceFieldsWithSuggestions,
|
320
|
+
Z as secondTemplateSuggestions,
|
321
|
+
n as stringField,
|
322
|
+
V as templateInstanceWithAllFieldsEmpty,
|
323
|
+
K as templateInstanceWithoutEmptyValues,
|
324
|
+
w as templateInstancesList,
|
325
|
+
U as templateOptions,
|
326
|
+
I as templates
|
281
327
|
};
|
@@ -1,13 +1,30 @@
|
|
1
|
-
import { userEvent as
|
2
|
-
const
|
3
|
-
await
|
4
|
-
},
|
5
|
-
await
|
6
|
-
},
|
7
|
-
await
|
8
|
-
}
|
1
|
+
import { userEvent as s, within as d, expect as l } from "@storybook/test";
|
2
|
+
const r = async (e, t) => {
|
3
|
+
await s.click(e), await s.clear(e), await s.type(e, t);
|
4
|
+
}, y = async () => {
|
5
|
+
await s.click(document.body);
|
6
|
+
}, u = async (e, t) => {
|
7
|
+
await r(e, t), await y();
|
8
|
+
}, g = async (e, t) => {
|
9
|
+
const a = d(e);
|
10
|
+
t.filter((i) => !i.hidden).forEach((i) => {
|
11
|
+
const c = a.queryByTestId(`${i.displayName}-field`);
|
12
|
+
if (i.type === "date") {
|
13
|
+
const o = d(c).getByRole("group");
|
14
|
+
l(o).toHaveAttribute("aria-disabled");
|
15
|
+
} else
|
16
|
+
[...c.getElementsByTagName("input")].filter((n) => n.type !== "hidden").forEach((n) => {
|
17
|
+
l(n).toBeDisabled();
|
18
|
+
});
|
19
|
+
});
|
20
|
+
}, m = async (e, t) => t.map((a) => ({
|
21
|
+
...a,
|
22
|
+
aiSuggestion: `${a.key} suggestion`
|
23
|
+
}));
|
9
24
|
export {
|
10
|
-
|
11
|
-
|
12
|
-
|
25
|
+
y as blur,
|
26
|
+
g as checkIfFormFieldsAreDisabled,
|
27
|
+
m as fetchSuggestions,
|
28
|
+
r as updateText,
|
29
|
+
u as updateTextAndBlur
|
13
30
|
};
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { createContext as w, useState as g, useCallback as C, useMemo as A, useContext as v } from "react";
|
2
|
+
import { TEMPLATE_CUSTOM_PROPERTIES as x } from "../constants.js";
|
3
|
+
import "formik";
|
4
|
+
import { jsx as E } from "react/jsx-runtime";
|
5
|
+
import "../test-utils/sample-data.js";
|
6
|
+
import { fetchSuggestions as P } from "../test-utils/test-utils.js";
|
7
|
+
const m = /* @__PURE__ */ w(null), O = ({
|
8
|
+
children: e,
|
9
|
+
isAiSuggestionsFeatureEnabled: n
|
10
|
+
}) => {
|
11
|
+
const [t, h] = g({}), [i, u] = g(!1), a = C(async (r, l, p = !1) => {
|
12
|
+
let s = [];
|
13
|
+
if (!n)
|
14
|
+
throw new Error("AI Suggestions feature not available.");
|
15
|
+
if (r === x)
|
16
|
+
throw new Error("Can't fetch suggestions for Custom Metadata instance");
|
17
|
+
if (!t[r] || p) {
|
18
|
+
u(!0);
|
19
|
+
try {
|
20
|
+
s = await P(r, l), h({
|
21
|
+
...t,
|
22
|
+
[r]: {
|
23
|
+
...Object.fromEntries(s.map((o) => [o.key, o.aiSuggestion]))
|
24
|
+
}
|
25
|
+
});
|
26
|
+
} catch {
|
27
|
+
} finally {
|
28
|
+
u(!1);
|
29
|
+
}
|
30
|
+
} else
|
31
|
+
s = l.map((o) => {
|
32
|
+
var f;
|
33
|
+
const c = (f = t == null ? void 0 : t.templateKey) == null ? void 0 : f[o.key];
|
34
|
+
return {
|
35
|
+
...o,
|
36
|
+
...c ? {
|
37
|
+
aiSuggestion: c
|
38
|
+
} : null
|
39
|
+
};
|
40
|
+
});
|
41
|
+
return s;
|
42
|
+
}, [t]), S = A(() => ({
|
43
|
+
getAiSuggestions: a,
|
44
|
+
isAiSuggestionsFeatureEnabled: n,
|
45
|
+
isFetchingSuggestions: i,
|
46
|
+
suggestions: t
|
47
|
+
}), [a, n, i, t]);
|
48
|
+
return /* @__PURE__ */ E(m.Provider, {
|
49
|
+
value: S,
|
50
|
+
children: e
|
51
|
+
});
|
52
|
+
}, b = () => {
|
53
|
+
const e = v(m);
|
54
|
+
if (!e)
|
55
|
+
throw new Error("useAutofill should be wrapped inside AutofillProvider");
|
56
|
+
return e;
|
57
|
+
};
|
58
|
+
export {
|
59
|
+
m as AutofillContext,
|
60
|
+
O as AutofillContextProvider,
|
61
|
+
b as useAutofill
|
62
|
+
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@box/metadata-editor",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.49.0",
|
4
4
|
"peerDependencies": {
|
5
5
|
"@ariakit/react": "0.4.5",
|
6
6
|
"@box/blueprint-web": "^7.20.0",
|
@@ -16,6 +16,7 @@
|
|
16
16
|
"@box/blueprint-web": "^7.24.1",
|
17
17
|
"@box/blueprint-web-assets": "^4.21.5",
|
18
18
|
"@box/storybook-utils": "^0.6.1",
|
19
|
+
"@testing-library/react": "^15.0.6",
|
19
20
|
"react": "^18.3.0",
|
20
21
|
"react-dom": "^18.3.0",
|
21
22
|
"react-intl": "6.4.2"
|
@@ -51,5 +52,5 @@
|
|
51
52
|
"**/*.css"
|
52
53
|
],
|
53
54
|
"license": "SEE LICENSE IN LICENSE",
|
54
|
-
"gitHead": "
|
55
|
+
"gitHead": "0382194d1e9c1a1c900b1e95d631fad1461993fc"
|
55
56
|
}
|
@@ -1,2 +1,2 @@
|
|
1
1
|
import { type MetadataInstanceFormHeaderProps } from './types';
|
2
|
-
export declare const MetadataInstanceFormHeader: ({ isAiSuggestionsFeatureEnabled, isLoading,
|
2
|
+
export declare const MetadataInstanceFormHeader: ({ isAiSuggestionsFeatureEnabled, isLoading, templateName, }: MetadataInstanceFormHeaderProps) => import("react/jsx-runtime").JSX.Element;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { type MetadataTemplate, type MetadataTemplateField, type MetadataTemplateInstance, type MetadataTemplateOption } from '../types';
|
1
|
+
import { type MetadataTemplate, type MetadataTemplateField, type MetadataTemplateInstance, type MetadataTemplateOption, type AutofillSuggestions } from '../types';
|
2
2
|
declare const stringField: MetadataTemplateField;
|
3
3
|
declare const dateField: MetadataTemplateField;
|
4
4
|
declare const enumField: MetadataTemplateField;
|
@@ -21,4 +21,12 @@ declare const customTemplateInstanceWithoutEmptyValues: MetadataTemplateInstance
|
|
21
21
|
declare const emptyCustomTemplateInstance: MetadataTemplateInstance;
|
22
22
|
declare const customTemplateInstanceWithAllFieldsEmpty: MetadataTemplateInstance;
|
23
23
|
declare const templateInstancesList: MetadataTemplateInstance[];
|
24
|
-
|
24
|
+
declare const allFieldsWithAiSuggestions: MetadataTemplateField[];
|
25
|
+
declare const allFieldsSuggestions: AutofillSuggestions;
|
26
|
+
declare const firstTemplateInstance: MetadataTemplateInstance;
|
27
|
+
declare const firstTemplateSuggestions: AutofillSuggestions;
|
28
|
+
declare const firstTemplateInstanceFieldsWithSuggestions: MetadataTemplateField[];
|
29
|
+
declare const secondTemplateInstance: MetadataTemplate;
|
30
|
+
declare const secondTemplateSuggestions: AutofillSuggestions;
|
31
|
+
declare const secondTemplateInstanceFieldsWithSuggestions: MetadataTemplateField[];
|
32
|
+
export { allFieldsTemplate, allFieldsTemplateInstance, customTemplate, customTemplateInstance, customTemplateInstanceWithAllFieldsEmpty, customTemplateInstanceWithoutEmptyValues, dateField, emptyCustomTemplateInstance, emptyTemplateInstance, enumField, fields, floatField, multiSelectField, noFieldsTemplate, nonHiddenFieldsTemplate, noValueField, stringField, templateInstancesList, templateInstanceWithAllFieldsEmpty, templateInstanceWithoutEmptyValues, templateOptions, templates, allFieldsWithAiSuggestions, allFieldsSuggestions, firstTemplateInstance, firstTemplateInstanceFieldsWithSuggestions, secondTemplateInstance, firstTemplateSuggestions, secondTemplateSuggestions, secondTemplateInstanceFieldsWithSuggestions, };
|
@@ -1,3 +1,6 @@
|
|
1
|
+
import { type MetadataTemplateField } from '../types';
|
1
2
|
export declare const updateText: (el: any, text: any) => Promise<void>;
|
2
3
|
export declare const blur: () => Promise<void>;
|
3
4
|
export declare const updateTextAndBlur: (el: any, text: any) => Promise<void>;
|
5
|
+
export declare const checkIfFormFieldsAreDisabled: (canvasElement: HTMLElement, fields: MetadataTemplateField[]) => Promise<void>;
|
6
|
+
export declare const fetchSuggestions: (templateKey: string, fields: MetadataTemplateField[]) => Promise<MetadataTemplateField[]>;
|
package/types/lib/types.d.ts
CHANGED
@@ -62,3 +62,5 @@ export type MetadataTemplateInstance = {
|
|
62
62
|
templateKey: string;
|
63
63
|
type: string;
|
64
64
|
};
|
65
|
+
export type TemplateSuggestion = Record<MetadataTemplateField['key'], MetadataTemplateField['aiSuggestion']>;
|
66
|
+
export type AutofillSuggestions = Record<MetadataTemplateInstance['templateKey'], TemplateSuggestion>;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { type AutofillSuggestions, type MetadataTemplateField, type MetadataTemplateInstance } from '../types';
|
3
|
+
export interface AutofillContextType {
|
4
|
+
getAiSuggestions: (templateKey: MetadataTemplateInstance['templateKey'], fields: MetadataTemplateField[]) => Promise<MetadataTemplateField[]>;
|
5
|
+
isFetchingSuggestions: boolean;
|
6
|
+
isAiSuggestionsFeatureEnabled: boolean;
|
7
|
+
suggestions: AutofillSuggestions;
|
8
|
+
}
|
9
|
+
export declare const AutofillContext: React.Context<AutofillContextType>;
|
10
|
+
export declare const AutofillContextProvider: ({ children, isAiSuggestionsFeatureEnabled, }: {
|
11
|
+
children: React.ReactNode;
|
12
|
+
isAiSuggestionsFeatureEnabled: boolean;
|
13
|
+
}) => React.ReactElement;
|
14
|
+
export declare const useAutofill: () => AutofillContextType;
|