@box/unified-share-modal 1.32.1 → 1.34.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.
Files changed (59) hide show
  1. package/dist/esm/lib/components/unified-share-form-modal/collaboration-section/collaboration-role.js +39 -39
  2. package/dist/esm/lib/components/unified-share-form-modal/collaboration-section/collaboration-section.js +107 -102
  3. package/dist/esm/lib/components/unified-share-form-modal/shared-link-section/shared-link-section.js +66 -66
  4. package/dist/esm/lib/unified-share-modal.js +56 -54
  5. package/dist/i18n/bn-IN.js +13 -13
  6. package/dist/i18n/bn-IN.properties +34 -0
  7. package/dist/i18n/da-DK.js +13 -13
  8. package/dist/i18n/da-DK.properties +34 -0
  9. package/dist/i18n/de-DE.js +13 -13
  10. package/dist/i18n/de-DE.properties +34 -0
  11. package/dist/i18n/en-AU.js +6 -6
  12. package/dist/i18n/en-AU.properties +34 -0
  13. package/dist/i18n/en-CA.properties +34 -0
  14. package/dist/i18n/en-GB.js +6 -6
  15. package/dist/i18n/en-GB.properties +34 -0
  16. package/dist/i18n/en-x-pseudo.js +153 -153
  17. package/dist/i18n/en-x-pseudo.properties +170 -136
  18. package/dist/i18n/es-419.js +12 -12
  19. package/dist/i18n/es-419.properties +34 -0
  20. package/dist/i18n/es-ES.js +12 -12
  21. package/dist/i18n/es-ES.properties +34 -0
  22. package/dist/i18n/fi-FI.js +13 -13
  23. package/dist/i18n/fi-FI.properties +34 -0
  24. package/dist/i18n/fr-CA.js +13 -13
  25. package/dist/i18n/fr-CA.properties +34 -0
  26. package/dist/i18n/fr-FR.js +13 -13
  27. package/dist/i18n/fr-FR.properties +34 -0
  28. package/dist/i18n/hi-IN.js +13 -13
  29. package/dist/i18n/hi-IN.properties +34 -0
  30. package/dist/i18n/it-IT.js +13 -13
  31. package/dist/i18n/it-IT.properties +34 -0
  32. package/dist/i18n/ja-JP.js +13 -13
  33. package/dist/i18n/ja-JP.properties +34 -0
  34. package/dist/i18n/ko-KR.js +13 -13
  35. package/dist/i18n/ko-KR.properties +34 -0
  36. package/dist/i18n/nb-NO.js +13 -13
  37. package/dist/i18n/nb-NO.properties +34 -0
  38. package/dist/i18n/nl-NL.js +13 -13
  39. package/dist/i18n/nl-NL.properties +34 -0
  40. package/dist/i18n/pl-PL.js +13 -13
  41. package/dist/i18n/pl-PL.properties +34 -0
  42. package/dist/i18n/pt-BR.js +13 -13
  43. package/dist/i18n/pt-BR.properties +34 -0
  44. package/dist/i18n/ru-RU.js +13 -13
  45. package/dist/i18n/ru-RU.properties +34 -0
  46. package/dist/i18n/sv-SE.js +13 -13
  47. package/dist/i18n/sv-SE.properties +34 -0
  48. package/dist/i18n/tr-TR.js +13 -13
  49. package/dist/i18n/tr-TR.properties +34 -0
  50. package/dist/i18n/zh-CN.js +13 -13
  51. package/dist/i18n/zh-CN.properties +34 -0
  52. package/dist/i18n/zh-TW.js +13 -13
  53. package/dist/i18n/zh-TW.properties +34 -0
  54. package/dist/styles/collaboration-role.css +1 -1
  55. package/dist/styles/collaboration-section.css +1 -1
  56. package/dist/styles/shared-link-section.css +1 -1
  57. package/dist/types/lib/contexts/unified-share-modal-context.d.ts +1 -0
  58. package/dist/types/lib/unified-share-modal.d.ts +2 -1
  59. package/package.json +4 -4
@@ -1,66 +1,66 @@
1
1
  import _ from "clsx";
2
- import y from "lodash/camelCase";
3
- import { useState as L, useMemo as k, useEffect as F } from "react";
4
- import { useIntl as N } from "react-intl";
5
- import { Tooltip as O, Focusable as $, TriggerButton as D, DropdownMenu as r } from "@box/blueprint-web";
6
- import j from "../messages.js";
2
+ import L from "lodash/camelCase";
3
+ import { useState as k, useMemo as w, useEffect as q } from "react";
4
+ import { useIntl as F } from "react-intl";
5
+ import { Tooltip as N, Focusable as O, TriggerButton as D, DropdownMenu as r } from "@box/blueprint-web";
6
+ import $ from "../messages.js";
7
7
  import n from "./messages.js";
8
- import { jsx as e, jsxs as z } from "react/jsx-runtime";
9
- import { isInvitationRoleSupported as A, getDefaultCollaborationRole as P } from "../../../utils/collaborator.js";
10
- import { useUnifiedShareFormContext as U } from "../../../contexts/unified-share-form-context.js";
11
- import { useUnifiedShareModalContext as B } from "../../../contexts/unified-share-modal-context.js";
12
- import '../../../../../styles/collaboration-role.css';const E = "_container_xvspw_1", W = "_overrides_xvspw_5", q = "_focusable_xvspw_10", s = {
13
- container: E,
14
- overrides: W,
15
- focusable: q
8
+ import { jsx as e, jsxs as j } from "react/jsx-runtime";
9
+ import { isInvitationRoleSupported as z, getDefaultCollaborationRole as A } from "../../../utils/collaborator.js";
10
+ import { useUnifiedShareFormContext as P } from "../../../contexts/unified-share-form-context.js";
11
+ import { useUnifiedShareModalContext as U } from "../../../contexts/unified-share-modal-context.js";
12
+ import '../../../../../styles/collaboration-role.css';const B = "_container_1fonq_1", E = "_overrides_1fonq_4", W = "_focusable_1fonq_9", l = {
13
+ container: B,
14
+ overrides: E,
15
+ focusable: W
16
16
  };
17
17
  function te() {
18
18
  const {
19
19
  formatMessage: o
20
- } = N(), [f, M] = L(!1), {
20
+ } = F(), [b, M] = k(!1), {
21
21
  collaborationRole: u,
22
22
  setCollaborationRole: d
23
- } = U(), {
23
+ } = P(), {
24
24
  collaborationRoles: g,
25
25
  isSubmitting: S,
26
- item: w
27
- } = B(), {
28
- permissions: I = {},
26
+ item: I
27
+ } = U(), {
28
+ permissions: T = {},
29
29
  type: m
30
- } = w, l = k(() => g.map((i) => {
30
+ } = I, s = w(() => g.map((i) => {
31
31
  const {
32
32
  description: p,
33
33
  id: t,
34
34
  label: c
35
- } = i, b = A(t), x = y(t);
36
- let h = x;
37
- t === "editor" && m === "folder" && (h += "Folder");
35
+ } = i, f = z(t), h = L(t);
36
+ let x = h;
37
+ t === "editor" && m === "folder" && (x += "Folder");
38
38
  let C = t, R = "";
39
- return b && (C = o(j[`${x}Role`]), R = o(n[`${h}Description`])), {
39
+ return f && (C = o($[`${h}Role`]), R = o(n[`${x}Description`])), {
40
40
  ...i,
41
41
  description: p ?? R,
42
42
  label: c ?? C
43
43
  };
44
44
  }), [g, o, m]);
45
- if (F(() => {
46
- d(P(l));
47
- }, [l, d]), !l.length || !u)
45
+ if (q(() => {
46
+ d(A(s));
47
+ }, [s, d]), !s.length || !u)
48
48
  return null;
49
49
  const {
50
- id: T,
50
+ id: y,
51
51
  label: v
52
52
  } = u;
53
53
  let a;
54
- return I.canInviteCollaborator || (a = o(n.inviteDisabledTooltip)), m === "web_link" && (a = o(n.inviteWebLinkDisabledTooltip)), a ? /* @__PURE__ */ e(O, {
54
+ return T.canInviteCollaborator || (a = o(n.inviteDisabledTooltip)), m === "web_link" && (a = o(n.inviteWebLinkDisabledTooltip)), a ? /* @__PURE__ */ e(N, {
55
55
  align: "start",
56
56
  content: a,
57
57
  "data-testid": "collaboration-role-tooltip",
58
58
  side: "bottom",
59
- children: /* @__PURE__ */ e($, {
60
- className: s.focusable,
59
+ children: /* @__PURE__ */ e(O, {
60
+ className: l.focusable,
61
61
  children: /* @__PURE__ */ e(D, {
62
62
  caretDirection: "down",
63
- className: _(s.container, s.overrides),
63
+ className: _(l.container, l.overrides),
64
64
  disabled: !0,
65
65
  label: o(n.inviteAsRoleLabel, {
66
66
  role: v
@@ -69,13 +69,13 @@ function te() {
69
69
  variant: "tertiary"
70
70
  })
71
71
  })
72
- }) : /* @__PURE__ */ z(r.Root, {
72
+ }) : /* @__PURE__ */ j(r.Root, {
73
73
  onOpenChange: M,
74
- open: f,
74
+ open: b,
75
75
  children: [/* @__PURE__ */ e(r.Trigger, {
76
76
  children: /* @__PURE__ */ e(D, {
77
- caretDirection: f ? "up" : "down",
78
- className: _(s.container, s.overrides),
77
+ caretDirection: b ? "up" : "down",
78
+ className: _(l.container, l.overrides),
79
79
  disabled: S,
80
80
  label: o(n.inviteAsRoleLabel, {
81
81
  role: v
@@ -85,20 +85,20 @@ function te() {
85
85
  })
86
86
  }), /* @__PURE__ */ e(r.Content, {
87
87
  align: "start",
88
- children: l.map((i) => {
88
+ children: s.map((i) => {
89
89
  const {
90
90
  description: p,
91
91
  isDisabled: t,
92
92
  id: c,
93
- label: b
93
+ label: f
94
94
  } = i;
95
95
  return /* @__PURE__ */ e(r.CheckboxItem, {
96
- checked: T === c,
96
+ checked: y === c,
97
97
  disabled: t,
98
98
  onSelect: () => d(i),
99
99
  children: /* @__PURE__ */ e(r.Item.MainContent, {
100
100
  caption: p,
101
- label: b
101
+ label: f
102
102
  })
103
103
  }, c);
104
104
  })
@@ -1,84 +1,86 @@
1
- import { useState as le, useRef as ce, useEffect as R, useCallback as x } from "react";
2
- import { createPortal as de } from "react-dom";
1
+ import { useState as ce, useRef as de, useEffect as N, useCallback as F } from "react";
2
+ import { createPortal as me } from "react-dom";
3
3
  import { useIntl as ue } from "react-intl";
4
- import { useNotification as me, useUniqueId as he, useLabelable as fe, Tooltip as pe, Focusable as be, Text as Ce, Modal as h } from "@box/blueprint-web";
4
+ import { useNotification as he, useUniqueId as fe, useLabelable as pe, Tooltip as be, Focusable as Ce, Text as ve, Modal as h } from "@box/blueprint-web";
5
5
  import { Globe as ge } from "@box/blueprint-web-assets/icons/Medium";
6
- import { UserSelectorContainer as ve } from "@box/user-selector";
7
- import { CollaborationRole as Se } from "./collaboration-role.js";
6
+ import { UserSelectorContainer as Se } from "@box/user-selector";
7
+ import { CollaborationRole as Ae } from "./collaboration-role.js";
8
8
  import { SharedWithAvatars as Le } from "./shared-with-avatars.js";
9
9
  import { ShieldRestrictionNotice as Ue } from "./shield-restriction-notice.js";
10
- import { TextAreaContainer as xe } from "./text-area-container.js";
11
- import { COLLABORATION_MESSAGE_CHARACTER_LIMIT as Fe } from "../../../constants.js";
10
+ import { TextAreaContainer as Fe } from "./text-area-container.js";
11
+ import { COLLABORATION_MESSAGE_CHARACTER_LIMIT as ye } from "../../../constants.js";
12
12
  import o from "./messages.js";
13
- import { jsxs as l, jsx as r, Fragment as ye } from "react/jsx-runtime";
14
- import { useFormValidation as Ae } from "../../../hooks/use-form-validation.js";
15
- import { useCollaborationForm as Ie } from "../../../hooks/use-collaboration-form.js";
13
+ import { jsxs as i, jsx as r, Fragment as Ie } from "react/jsx-runtime";
14
+ import { useFormValidation as _e } from "../../../hooks/use-form-validation.js";
15
+ import { useCollaborationForm as xe } from "../../../hooks/use-collaboration-form.js";
16
16
  import { useUnifiedShareFormContext as Ee } from "../../../contexts/unified-share-form-context.js";
17
17
  import { useUnifiedShareModalContext as Be } from "../../../contexts/unified-share-modal-context.js";
18
- import '../../../../../styles/collaboration-section.css';const Ve = "_container_1ixpu_2", _e = "_label_1ixpu_8", Re = "_securityIndicator_1ixpu_23", F = {
18
+ import '../../../../../styles/collaboration-section.css';const Ve = "_container_wmqot_2", Ne = "_label_wmqot_8", Re = "_securityIndicator_wmqot_23", Te = "_collaborationAccessContainer_wmqot_29", f = {
19
19
  container: Ve,
20
- label: _e,
21
- securityIndicator: Re
20
+ label: Ne,
21
+ securityIndicator: Re,
22
+ collaborationAccessContainer: Te
22
23
  };
23
- function Qe() {
24
+ function Ye() {
24
25
  const {
25
26
  formatMessage: t
26
- } = ue(), [f, y] = le(), {
27
- addNotification: T
28
- } = me(), {
29
- validateShieldRestriction: N
30
- } = Ae(), {
31
- contactValue: O,
32
- container: p,
33
- onModalOpenChange: A,
34
- onShareViewChange: b,
35
- setUserContacts: P,
36
- shareView: i,
37
- userContacts: n
27
+ } = ue(), [p, y] = ce(), {
28
+ addNotification: R
29
+ } = he(), {
30
+ validateShieldRestriction: T
31
+ } = _e(), {
32
+ contactValue: w,
33
+ container: b,
34
+ onModalOpenChange: I,
35
+ onShareViewChange: C,
36
+ setUserContacts: O,
37
+ shareView: n,
38
+ userContacts: a
38
39
  } = Ee(), {
40
+ collaborationAccess: P,
39
41
  collaborationNotices: k,
40
- config: C,
42
+ config: v,
41
43
  contactService: M,
42
- isFetching: w,
44
+ isFetching: q,
43
45
  isSubmitting: D,
44
46
  item: G,
45
47
  sharingService: W
46
48
  } = Be(), {
47
49
  permissions: j = {},
48
- type: q
50
+ type: H
49
51
  } = G, {
50
52
  getContacts: g,
51
- getContactsAvatarUrls: v
53
+ getContactsAvatarUrls: S
52
54
  } = M, {
53
- sendInvitations: H,
54
- sendSharedLink: K
55
+ sendInvitations: K,
56
+ sendSharedLink: $
55
57
  } = W;
56
- let S, L;
57
- i === "invite" && (S = H, L = "invite-collaborators"), i === "email" && (S = K, L = "email-shared-link");
58
+ let A, L;
59
+ n === "invite" && (A = K, L = "invite-collaborators"), n === "email" && (A = $, L = "email-shared-link");
58
60
  const {
59
- errors: $,
60
- handleFormReset: I,
61
- handleFormSubmit: z,
62
- handleSelectedUsersChange: E,
63
- handleUserSelectorBlur: J,
64
- isFormSubmitting: Q,
65
- updateContactValue: X
66
- } = Ie(S, L), a = i === "default" || i === "invite", s = i === "invite" || i === "email", c = D ?? Q, Y = n.some((e) => e.isExternalUser), B = ce(i === "email" ? "email" : "invite");
67
- R(() => {
68
- B.current = i === "email" ? "email" : "invite";
69
- }, [i]), R(() => {
70
- (!n.length || !n.some((e) => e.chipVariant === "error")) && y(null);
71
- }, [n]);
72
- const Z = x((e) => (e.stopPropagation(), !0), []), ee = x((e) => g ? g(e, B.current) : Promise.resolve([]), [g]), te = x((e) => v ? v(e) : Promise.resolve({}), [v]), oe = (e) => {
73
- s || b("invite"), X(e);
74
- }, re = () => {
75
- I(), b("default");
76
- }, ie = async () => {
61
+ errors: z,
62
+ handleFormReset: _,
63
+ handleFormSubmit: J,
64
+ handleSelectedUsersChange: x,
65
+ handleUserSelectorBlur: Q,
66
+ isFormSubmitting: X,
67
+ updateContactValue: Y
68
+ } = xe(A, L), s = n === "default" || n === "invite", l = n === "invite" || n === "email", c = D ?? X, Z = a.some((e) => e.isExternalUser), E = de(n === "email" ? "email" : "invite");
69
+ N(() => {
70
+ E.current = n === "email" ? "email" : "invite";
71
+ }, [n]), N(() => {
72
+ (!a.length || !a.some((e) => e.chipVariant === "error")) && y(null);
73
+ }, [a]);
74
+ const ee = F((e) => (e.stopPropagation(), !0), []), te = F((e) => g ? g(e, E.current) : Promise.resolve([]), [g]), oe = F((e) => S ? S(e) : Promise.resolve({}), [S]), re = (e) => {
75
+ l || C("invite"), Y(e);
76
+ }, ne = () => {
77
+ _(), C("default");
78
+ }, ae = async () => {
77
79
  try {
78
- if (f) {
79
- const e = N(n);
80
+ if (p) {
81
+ const e = T(a);
80
82
  if (e) {
81
- T({
83
+ R({
82
84
  closeButtonAriaLabel: t(o.closeButton),
83
85
  sensitivity: "foreground",
84
86
  styledText: e,
@@ -88,92 +90,95 @@ function Qe() {
88
90
  return;
89
91
  }
90
92
  }
91
- if (await z())
93
+ if (await J())
92
94
  return;
93
- I(), A && A(!1), b("default");
95
+ _(), I && I(!1), C("default");
94
96
  } catch (e) {
95
97
  if (!e.shieldRestriction)
96
98
  return;
97
99
  const {
98
100
  shieldRestriction: U
99
- } = e, _ = [...U.restrictedEmails ?? [], ...U.restrictedGroups ?? []], se = n.map((m) => _.includes(m.email) || _.includes(`${m.id}`) ? {
100
- ...m,
101
+ } = e, V = [...U.restrictedEmails ?? [], ...U.restrictedGroups ?? []], le = a.map((u) => V.includes(u.email) || V.includes(`${u.id}`) ? {
102
+ ...u,
101
103
  chipVariant: "error"
102
- } : m);
103
- y(U), P(se);
104
+ } : u);
105
+ y(U), O(le);
104
106
  }
105
107
  };
106
- let d, u = !1;
107
- a && !j.canInviteCollaborator && (d = t(o.inviteDisabledTooltip), u = !0), a && q === "web_link" && (d = t(o.inviteWebLinkDisabledTooltip), u = !0);
108
- const V = he("user-contacts-"), ne = t(a ? o.invitePeopleLabel : o.emailSharedLinkLabel), ae = fe(ne, V);
109
- return /* @__PURE__ */ l("form", {
110
- className: F.container,
108
+ let d, m = !1;
109
+ s && !j.canInviteCollaborator && (d = t(o.inviteDisabledTooltip), m = !0), s && H === "web_link" && (d = t(o.inviteWebLinkDisabledTooltip), m = !0);
110
+ const B = fe("user-contacts-"), ie = t(s ? o.invitePeopleLabel : o.emailSharedLinkLabel), se = pe(ie, B);
111
+ return /* @__PURE__ */ i("form", {
112
+ className: f.container,
111
113
  onSubmit: (e) => e.preventDefault(),
112
- children: [f && /* @__PURE__ */ r(Ue, {
113
- error: f,
114
+ children: [p && /* @__PURE__ */ r(Ue, {
115
+ error: p,
114
116
  isLoading: c,
115
- onSelectedUsersChange: E
116
- }), k, /* @__PURE__ */ l("div", {
117
- children: [a && C.collaborators && /* @__PURE__ */ r(Le, {}), /* @__PURE__ */ r(ae, {
118
- className: F.label
119
- }), /* @__PURE__ */ r(pe, {
117
+ onSelectedUsersChange: x
118
+ }), k, /* @__PURE__ */ i("div", {
119
+ children: [s && v.collaborators && /* @__PURE__ */ r(Le, {}), /* @__PURE__ */ r(se, {
120
+ className: f.label
121
+ }), /* @__PURE__ */ r(be, {
120
122
  content: d,
121
123
  "data-testid": "user-contacts-tooltip",
122
124
  open: d ? void 0 : !1,
123
125
  side: "bottom",
124
- children: /* @__PURE__ */ r(be, {
125
- focusable: u,
126
- children: /* @__PURE__ */ r(ve, {
126
+ children: /* @__PURE__ */ r(Ce, {
127
+ focusable: m,
128
+ children: /* @__PURE__ */ r(Se, {
127
129
  className: "collaboration-user-selector",
128
130
  clearButtonAriaLabel: t(o.clearButton),
129
131
  clearOnBlur: !1,
130
- disabled: u || c,
132
+ disabled: m || c,
131
133
  displayChipVariant: (e) => e.chipVariant,
132
- error: $["user-contact"],
133
- fetchAvatarUrls: te,
134
- fetchUsers: ee,
135
- hideOnEscape: Z,
136
- idForLabel: V,
137
- inputValue: O,
134
+ error: z["user-contact"],
135
+ fetchAvatarUrls: oe,
136
+ fetchUsers: te,
137
+ hideOnEscape: ee,
138
+ idForLabel: B,
139
+ inputValue: w,
138
140
  label: null,
139
- onBlur: J,
140
- onInputValueChange: oe,
141
- onSelectedUsersChange: E,
142
- placeholder: n.length ? "" : t(o.invitePeoplePlaceholder),
143
- portalElement: p,
144
- selectedUsers: n,
141
+ onBlur: Q,
142
+ onInputValueChange: re,
143
+ onSelectedUsersChange: x,
144
+ placeholder: a.length ? "" : t(o.invitePeoplePlaceholder),
145
+ portalElement: b,
146
+ selectedUsers: a,
145
147
  selectOnEnterOrTab: !0,
146
- variant: s ? "textarea" : "input"
148
+ variant: l ? "textarea" : "input"
147
149
  })
148
150
  })
149
- }), a && C.collaborationRole && /* @__PURE__ */ r(Se, {})]
150
- }), s && C.collaborationMessage && /* @__PURE__ */ r(xe, {
151
- maxCount: Fe
152
- }), s && Y && /* @__PURE__ */ l("div", {
153
- className: F.securityIndicator,
154
- children: [/* @__PURE__ */ r(ge, {}), /* @__PURE__ */ r(Ce, {
151
+ }), s && /* @__PURE__ */ i("div", {
152
+ className: f.collaborationAccessContainer,
153
+ children: [v.collaborationRole && /* @__PURE__ */ r(Ae, {}), P]
154
+ })]
155
+ }), l && v.collaborationMessage && /* @__PURE__ */ r(Fe, {
156
+ maxCount: ye
157
+ }), l && Z && /* @__PURE__ */ i("div", {
158
+ className: f.securityIndicator,
159
+ children: [/* @__PURE__ */ r(ge, {}), /* @__PURE__ */ r(ve, {
155
160
  as: "span",
156
161
  color: "textOnLightSecondary",
157
162
  children: t(o.contentSharedWithExternalCollaborators)
158
163
  })]
159
- }), s && p && /* @__PURE__ */ de(/* @__PURE__ */ l(ye, {
160
- children: [!w && /* @__PURE__ */ l(h.Footer, {
164
+ }), l && b && /* @__PURE__ */ me(/* @__PURE__ */ i(Ie, {
165
+ children: [!q && /* @__PURE__ */ i(h.Footer, {
161
166
  children: [/* @__PURE__ */ r(h.Footer.SecondaryButton, {
162
167
  disabled: c,
163
- onClick: re,
168
+ onClick: ne,
164
169
  children: t(o.cancelButton)
165
170
  }), /* @__PURE__ */ r(h.Footer.PrimaryButton, {
166
171
  loading: c,
167
172
  loadingAriaLabel: t(o.loadingLabel),
168
- onClick: ie,
173
+ onClick: ae,
169
174
  children: t(o.sendButton)
170
175
  })]
171
176
  }), /* @__PURE__ */ r(h.Close, {
172
177
  "aria-label": t(o.closeButton)
173
178
  })]
174
- }), p)]
179
+ }), b)]
175
180
  });
176
181
  }
177
182
  export {
178
- Qe as CollaborationSection
183
+ Ye as CollaborationSection
179
184
  };