@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.
@@ -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 { CustomInstance as y } from "../custom-instance/custom-instance.js";
6
- import { DeleteConfirmationModal as O } from "../delete-confirmation-modal/delete-confirmation-modal.js";
7
- import { MetadataEmptyState as b } from "../../../metadata-empty-state/metadata-empty-state.js";
8
- import { MetadataInstanceFormFooter as N } from "../metadata-instance-form-footer/metadata-instance-form-footer.js";
9
- import { MetadataInstanceFormHeader as T } from "../metadata-instance-form-header/metadata-instance-form-header.js";
10
- import { UnsavedChangesModal as v } from "../../../unsaved-changes-modal/unsaved-changes-modal.js";
11
- import { TemplateInstance as _ } from "../../../metadata-editor-fields/metadata-editor-fields.js";
12
- import { TEMPLATE_CUSTOM_PROPERTIES as x } from "../../../../constants.js";
13
- import { createJSONPatch as A } from "./utils.js";
14
- import { jsx as t, jsxs as l, Fragment as P } from "react/jsx-runtime";
15
- const U = "_metadataInstanceForm_1hu4u_1", j = {
16
- metadataInstanceForm: U
17
- }, X = (d) => {
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: n,
21
- isUnsavedChangesModalOpen: c = !1,
22
- onCancel: p,
23
- onDelete: f,
24
- onSubmit: u,
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, r] = g(!1), i = (a) => {
28
- u(e.id, A(a, e)), s(!1);
29
- }, M = (a) => {
30
- a ? s(!0) : p();
31
- }, h = () => {
32
- r(!0);
33
- }, F = {
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
- }, I = S(() => {
38
- const a = e.templateKey === x, m = e.fields.length === 0;
39
- return a ? /* @__PURE__ */ t(y, {
40
+ }, S = y(() => {
41
+ const a = e.fields.length === 0;
42
+ return i ? /* @__PURE__ */ t(_, {
40
43
  isLoading: n
41
- }) : m ? /* @__PURE__ */ t(b, {
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
- }, [e.templateKey, e.fields.length, n, o]);
48
- return /* @__PURE__ */ t(D, {
49
- initialValues: F,
50
- onSubmit: i,
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: m
54
- }) => /* @__PURE__ */ l(P, {
56
+ dirty: D
57
+ }) => /* @__PURE__ */ l(R, {
55
58
  children: [/* @__PURE__ */ l(E, {
56
- className: j.metadataInstanceForm,
57
- children: [/* @__PURE__ */ t(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
- }), I, /* @__PURE__ */ t(N, {
64
+ }), S, /* @__PURE__ */ t(P, {
62
65
  isLoading: n,
63
- onCancel: () => M(m),
64
- onDelete: h
66
+ onCancel: () => h(D),
67
+ onDelete: M
65
68
  })]
66
- }), /* @__PURE__ */ t(v, {
69
+ }), /* @__PURE__ */ t(L, {
67
70
  onDismiss: () => s(!1),
68
- onSaveAndContinue: () => i(a),
69
- open: c
70
- }), /* @__PURE__ */ t(O, {
71
- onConfirm: () => f(e.id),
72
- onDismiss: () => r(!1),
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
- X as MetadataInstanceForm
83
+ te as MetadataInstanceForm
81
84
  };
@@ -1,32 +1,35 @@
1
1
  import "../../../../../../styles/metadata-instance-form-footer.css";
2
- import { TextButton as u, Button as r } from "@box/blueprint-web";
3
- import { useFormikContext as b } from "formik";
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 g = "_metadataInstanceFormFooter_17478_1", f = "_buttonsContainer_17478_8", _ = "_buttons_17478_8", a = {
8
- metadataInstanceFormFooter: g,
9
- buttonsContainer: f,
10
- buttons: _
11
- }, x = ({
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: s,
18
+ isSubmitting: a,
18
19
  submitForm: d
19
- } = b(), n = m || s;
20
+ } = g(), {
21
+ isFetchingSuggestions: u
22
+ } = f(), n = m || a || u;
20
23
  return /* @__PURE__ */ e("div", {
21
- className: a.metadataInstanceFormFooter,
24
+ className: s.metadataInstanceFormFooter,
22
25
  children: /* @__PURE__ */ i("div", {
23
- className: a.buttonsContainer,
24
- children: [/* @__PURE__ */ e(u, {
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: a.buttons,
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: s,
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
- x as MetadataInstanceFormFooter
52
+ A as MetadataInstanceFormFooter
50
53
  };
@@ -1,40 +1,48 @@
1
1
  import "../../../../../../styles/metadata-instance-form-header.css";
2
- import { Text as l, Button as d } from "@box/blueprint-web";
3
- import { BoxAiLogo as f } from "@box/blueprint-web-assets/icons/Logo";
4
- import { useFormikContext as u } from "formik";
5
- import { useIntl as g } from "react-intl";
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 p, jsx as a } from "react/jsx-runtime";
8
- const I = "_metadataInstanceFormHeader_1b2cc_1", b = "_title_1b2cc_8", o = {
9
- metadataInstanceFormHeader: I,
10
- title: b
11
- }, v = ({
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
- onAutofill: s,
15
- templateName: i
15
+ templateName: m
16
16
  }) => {
17
17
  const {
18
- isSubmitting: m
19
- } = u(), t = g(), c = i ?? t.formatMessage(e.customInstanceTitle);
20
- return /* @__PURE__ */ p("div", {
21
- className: o.metadataInstanceFormHeader,
22
- children: [/* @__PURE__ */ a(l, {
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: o.title,
32
+ className: i.title,
25
33
  variant: "titleMedium",
26
- children: c
27
- }), n && /* @__PURE__ */ a(d, {
28
- disabled: m,
29
- icon: f,
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: s,
40
+ onClick: g,
33
41
  variant: "secondary",
34
42
  children: t.formatMessage(e.autofillButton)
35
43
  })]
36
44
  });
37
45
  };
38
46
  export {
39
- v as MetadataInstanceFormHeader
47
+ w as MetadataInstanceFormHeader
40
48
  };
@@ -1,31 +1,41 @@
1
1
  import { FormikWrapper as l } from "./formik-wrapper.js";
2
- import { allFieldsTemplate as m, allFieldsTemplateInstance as p, customTemplate as s, customTemplateInstance as n, customTemplateInstanceWithAllFieldsEmpty as i, customTemplateInstanceWithoutEmptyValues as d, dateField as o, emptyCustomTemplateInstance as u, emptyTemplateInstance as c, enumField as F, fields as r, floatField as T, multiSelectField as I, noFieldsTemplate as y, noValueField as f, nonHiddenFieldsTemplate as x, stringField as W, templateInstanceWithAllFieldsEmpty as h, templateInstanceWithoutEmptyValues as E, templateInstancesList as A, templateOptions as V, templates as b } from "./sample-data.js";
3
- import { blur as k, updateText as B, updateTextAndBlur as C } from "./test-utils.js";
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
- m as allFieldsTemplate,
7
- p as allFieldsTemplateInstance,
8
- k as blur,
9
- s as customTemplate,
10
- n as customTemplateInstance,
11
- i as customTemplateInstanceWithAllFieldsEmpty,
12
- d as customTemplateInstanceWithoutEmptyValues,
13
- o as dateField,
14
- u as emptyCustomTemplateInstance,
15
- c as emptyTemplateInstance,
16
- F as enumField,
17
- r as fields,
18
- T as floatField,
19
- I as multiSelectField,
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
- f as noValueField,
22
- x as nonHiddenFieldsTemplate,
23
- W as stringField,
24
- h as templateInstanceWithAllFieldsEmpty,
25
- E as templateInstanceWithoutEmptyValues,
26
- A as templateInstancesList,
27
- V as templateOptions,
28
- b as templates,
29
- B as updateText,
30
- C as updateTextAndBlur
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 f } from "../mappers.js";
2
- const a = {
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
- }, i = {
8
+ }, d = {
9
9
  id: "2",
10
10
  type: "date",
11
11
  key: "effectiveDate",
12
12
  hidden: !1,
13
13
  displayName: "Effective Date"
14
- }, d = {
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
- }, s = {
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
- }, n = {
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
- }, h = {
49
+ }, k = {
50
50
  id: "6",
51
51
  type: "string",
52
52
  key: "hidden",
53
53
  displayName: "Hidden",
54
54
  hidden: !0
55
- }, k = {
55
+ }, F = {
56
56
  id: "7",
57
57
  type: "string",
58
58
  key: "noValue",
59
59
  hidden: !1,
60
60
  displayName: "No value"
61
- }, F = {
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: [a, d, s, i, n, h, k]
69
- }, M = {
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: [a, d, s, i, n]
77
- }, g = {
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
- }, N = {
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
- }, _ = [F, g, N], U = {
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
- }, W = f(_), D = [a, d, s, i, n], l = {
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
- }, p = {
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
- }, m = {
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
- }, o = {
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
- }, y = {
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
- }, c = {
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
- }, t = {
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
- }, E = {
167
- ...t,
166
+ }, T = {
167
+ ...a,
168
168
  key: "noValue1"
169
- }, I = {
170
- ...t,
169
+ }, E = {
170
+ ...a,
171
171
  key: "noValue2"
172
- }, K = {
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: [l, p, m, o, y, c, t]
181
- }, T = {
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: [l, p, m, o, y, c]
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
- }, S = {
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: [t, E, I]
208
- }, r = {
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
- }, u = {
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
- }, e = {
220
+ }, t = {
221
221
  id: "3",
222
222
  type: "string",
223
223
  key: "empty field",
224
224
  hidden: !1
225
- }, V = {
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: [r, u, e],
231
+ fields: [i, s, t],
232
232
  hidden: !1
233
- }, C = {
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: [r, u],
239
+ fields: [i, s],
240
240
  hidden: !1
241
- }, b = {
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
- }, A = {
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: [e, e, e],
255
+ fields: [t, t, t],
256
256
  hidden: !1
257
- }, O = [K, T, S, v, V, C, b, A];
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
- F as allFieldsTemplate,
260
- K as allFieldsTemplateInstance,
261
- U as customTemplate,
262
- V as customTemplateInstance,
263
- A as customTemplateInstanceWithAllFieldsEmpty,
264
- C as customTemplateInstanceWithoutEmptyValues,
265
- i as dateField,
266
- b as emptyCustomTemplateInstance,
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
- d as enumField,
269
- D as fields,
270
- s as floatField,
271
- n as multiSelectField,
272
- g as noFieldsTemplate,
273
- k as noValueField,
274
- M as nonHiddenFieldsTemplate,
275
- a as stringField,
276
- S as templateInstanceWithAllFieldsEmpty,
277
- T as templateInstanceWithoutEmptyValues,
278
- O as templateInstancesList,
279
- W as templateOptions,
280
- _ as templates
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 t } from "@storybook/test";
2
- const i = async (a, c) => {
3
- await t.click(a), await t.clear(a), await t.type(a, c);
4
- }, n = async () => {
5
- await t.click(document.body);
6
- }, o = async (a, c) => {
7
- await i(a, c), await n();
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
- n as blur,
11
- i as updateText,
12
- o as updateTextAndBlur
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.48.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": "52a076c5917fab86763a0f6339caed8d0ba4e332"
55
+ "gitHead": "0382194d1e9c1a1c900b1e95d631fad1461993fc"
55
56
  }
@@ -1,2 +1,2 @@
1
1
  import { type MetadataInstanceFormHeaderProps } from './types';
2
- export declare const MetadataInstanceFormHeader: ({ isAiSuggestionsFeatureEnabled, isLoading, onAutofill, templateName, }: MetadataInstanceFormHeaderProps) => import("react/jsx-runtime").JSX.Element;
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
- export { allFieldsTemplate, allFieldsTemplateInstance, customTemplate, customTemplateInstance, customTemplateInstanceWithAllFieldsEmpty, customTemplateInstanceWithoutEmptyValues, dateField, emptyCustomTemplateInstance, emptyTemplateInstance, enumField, fields, floatField, multiSelectField, noFieldsTemplate, nonHiddenFieldsTemplate, noValueField, stringField, templateInstancesList, templateInstanceWithAllFieldsEmpty, templateInstanceWithoutEmptyValues, templateOptions, templates, };
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[]>;
@@ -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;