@gooddata/sdk-ui-ext 11.47.0-alpha.1 → 11.47.0-alpha.3

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 (131) hide show
  1. package/NOTICE +5 -5
  2. package/esm/index.d.ts +1 -1
  3. package/esm/index.d.ts.map +1 -1
  4. package/esm/internal/components/configurationControls/colors/ColorsSection.d.ts +2 -1
  5. package/esm/internal/components/configurationControls/colors/ColorsSection.d.ts.map +1 -1
  6. package/esm/internal/components/configurationControls/colors/ColorsSection.js +37 -17
  7. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItem.d.ts +2 -1
  8. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItem.d.ts.map +1 -1
  9. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItem.js +2 -2
  10. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItemsList.d.ts +4 -1
  11. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItemsList.d.ts.map +1 -1
  12. package/esm/internal/components/configurationControls/colors/coloredItemsList/ColoredItemsList.js +5 -1
  13. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleColoredItem.d.ts +16 -0
  14. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleColoredItem.d.ts.map +1 -0
  15. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleColoredItem.js +22 -0
  16. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleDialog.d.ts +21 -0
  17. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleDialog.d.ts.map +1 -0
  18. package/esm/internal/components/configurationControls/colors/coloredItemsList/LineStyleDialog.js +64 -0
  19. package/esm/internal/components/configurationPanels/LineChartBasedConfigurationPanel.d.ts +1 -0
  20. package/esm/internal/components/configurationPanels/LineChartBasedConfigurationPanel.d.ts.map +1 -1
  21. package/esm/internal/components/configurationPanels/LineChartBasedConfigurationPanel.js +10 -0
  22. package/esm/internal/constants/featureFlags.d.ts +2 -0
  23. package/esm/internal/constants/featureFlags.d.ts.map +1 -1
  24. package/esm/internal/constants/featureFlags.js +5 -0
  25. package/esm/internal/constants/supportedProperties.d.ts.map +1 -1
  26. package/esm/internal/constants/supportedProperties.js +3 -0
  27. package/esm/internal/interfaces/Colors.d.ts +3 -0
  28. package/esm/internal/interfaces/Colors.d.ts.map +1 -1
  29. package/esm/internal/interfaces/Colors.js +1 -0
  30. package/esm/internal/translations/de-DE.localization-bundle.d.ts +18 -0
  31. package/esm/internal/translations/de-DE.localization-bundle.d.ts.map +1 -1
  32. package/esm/internal/translations/de-DE.localization-bundle.js +18 -0
  33. package/esm/internal/translations/en-AU.localization-bundle.d.ts +18 -0
  34. package/esm/internal/translations/en-AU.localization-bundle.d.ts.map +1 -1
  35. package/esm/internal/translations/en-AU.localization-bundle.js +18 -0
  36. package/esm/internal/translations/en-GB.localization-bundle.d.ts +18 -0
  37. package/esm/internal/translations/en-GB.localization-bundle.d.ts.map +1 -1
  38. package/esm/internal/translations/en-GB.localization-bundle.js +18 -0
  39. package/esm/internal/translations/en-US.localization-bundle.d.ts +48 -0
  40. package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
  41. package/esm/internal/translations/en-US.localization-bundle.js +48 -0
  42. package/esm/internal/translations/es-419.localization-bundle.d.ts +18 -0
  43. package/esm/internal/translations/es-419.localization-bundle.d.ts.map +1 -1
  44. package/esm/internal/translations/es-419.localization-bundle.js +18 -0
  45. package/esm/internal/translations/es-ES.localization-bundle.d.ts +18 -0
  46. package/esm/internal/translations/es-ES.localization-bundle.d.ts.map +1 -1
  47. package/esm/internal/translations/es-ES.localization-bundle.js +18 -0
  48. package/esm/internal/translations/fi-FI.localization-bundle.d.ts +18 -0
  49. package/esm/internal/translations/fi-FI.localization-bundle.d.ts.map +1 -1
  50. package/esm/internal/translations/fi-FI.localization-bundle.js +18 -0
  51. package/esm/internal/translations/fr-CA.localization-bundle.d.ts +18 -0
  52. package/esm/internal/translations/fr-CA.localization-bundle.d.ts.map +1 -1
  53. package/esm/internal/translations/fr-CA.localization-bundle.js +18 -0
  54. package/esm/internal/translations/fr-FR.localization-bundle.d.ts +18 -0
  55. package/esm/internal/translations/fr-FR.localization-bundle.d.ts.map +1 -1
  56. package/esm/internal/translations/fr-FR.localization-bundle.js +18 -0
  57. package/esm/internal/translations/id-ID.localization-bundle.d.ts +18 -0
  58. package/esm/internal/translations/id-ID.localization-bundle.d.ts.map +1 -1
  59. package/esm/internal/translations/id-ID.localization-bundle.js +18 -0
  60. package/esm/internal/translations/it-IT.localization-bundle.d.ts +18 -0
  61. package/esm/internal/translations/it-IT.localization-bundle.d.ts.map +1 -1
  62. package/esm/internal/translations/it-IT.localization-bundle.js +18 -0
  63. package/esm/internal/translations/ja-JP.localization-bundle.d.ts +18 -0
  64. package/esm/internal/translations/ja-JP.localization-bundle.d.ts.map +1 -1
  65. package/esm/internal/translations/ja-JP.localization-bundle.js +18 -0
  66. package/esm/internal/translations/ko-KR.localization-bundle.d.ts +18 -0
  67. package/esm/internal/translations/ko-KR.localization-bundle.d.ts.map +1 -1
  68. package/esm/internal/translations/ko-KR.localization-bundle.js +18 -0
  69. package/esm/internal/translations/nl-NL.localization-bundle.d.ts +18 -0
  70. package/esm/internal/translations/nl-NL.localization-bundle.d.ts.map +1 -1
  71. package/esm/internal/translations/nl-NL.localization-bundle.js +18 -0
  72. package/esm/internal/translations/pl-PL.localization-bundle.d.ts +18 -0
  73. package/esm/internal/translations/pl-PL.localization-bundle.d.ts.map +1 -1
  74. package/esm/internal/translations/pl-PL.localization-bundle.js +18 -0
  75. package/esm/internal/translations/pt-BR.localization-bundle.d.ts +18 -0
  76. package/esm/internal/translations/pt-BR.localization-bundle.d.ts.map +1 -1
  77. package/esm/internal/translations/pt-BR.localization-bundle.js +18 -0
  78. package/esm/internal/translations/pt-PT.localization-bundle.d.ts +18 -0
  79. package/esm/internal/translations/pt-PT.localization-bundle.d.ts.map +1 -1
  80. package/esm/internal/translations/pt-PT.localization-bundle.js +18 -0
  81. package/esm/internal/translations/ru-RU.localization-bundle.d.ts +18 -0
  82. package/esm/internal/translations/ru-RU.localization-bundle.d.ts.map +1 -1
  83. package/esm/internal/translations/ru-RU.localization-bundle.js +18 -0
  84. package/esm/internal/translations/sl-SI.localization-bundle.d.ts +18 -0
  85. package/esm/internal/translations/sl-SI.localization-bundle.d.ts.map +1 -1
  86. package/esm/internal/translations/sl-SI.localization-bundle.js +18 -0
  87. package/esm/internal/translations/th-TH.localization-bundle.d.ts +18 -0
  88. package/esm/internal/translations/th-TH.localization-bundle.d.ts.map +1 -1
  89. package/esm/internal/translations/th-TH.localization-bundle.js +18 -0
  90. package/esm/internal/translations/tr-TR.localization-bundle.d.ts +18 -0
  91. package/esm/internal/translations/tr-TR.localization-bundle.d.ts.map +1 -1
  92. package/esm/internal/translations/tr-TR.localization-bundle.js +18 -0
  93. package/esm/internal/translations/uk-UA.localization-bundle.d.ts +18 -0
  94. package/esm/internal/translations/uk-UA.localization-bundle.d.ts.map +1 -1
  95. package/esm/internal/translations/uk-UA.localization-bundle.js +18 -0
  96. package/esm/internal/translations/vi-VN.localization-bundle.d.ts +18 -0
  97. package/esm/internal/translations/vi-VN.localization-bundle.d.ts.map +1 -1
  98. package/esm/internal/translations/vi-VN.localization-bundle.js +18 -0
  99. package/esm/internal/translations/zh-HK.localization-bundle.d.ts +18 -0
  100. package/esm/internal/translations/zh-HK.localization-bundle.d.ts.map +1 -1
  101. package/esm/internal/translations/zh-HK.localization-bundle.js +18 -0
  102. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts +18 -0
  103. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts.map +1 -1
  104. package/esm/internal/translations/zh-Hans.localization-bundle.js +18 -0
  105. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts +18 -0
  106. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts.map +1 -1
  107. package/esm/internal/translations/zh-Hant.localization-bundle.js +18 -0
  108. package/esm/internal/utils/colors.d.ts +3 -1
  109. package/esm/internal/utils/colors.d.ts.map +1 -1
  110. package/esm/internal/utils/colors.js +68 -32
  111. package/esm/locales.d.ts +36 -0
  112. package/esm/locales.d.ts.map +1 -1
  113. package/esm/locales.js +12 -0
  114. package/esm/sdk-ui-ext.d.ts +19 -5
  115. package/esm/share/ObjectShareDialog.d.ts.map +1 -1
  116. package/esm/share/ObjectShareDialog.js +2 -2
  117. package/esm/share/objectShareController.helpers.d.ts +20 -6
  118. package/esm/share/objectShareController.helpers.d.ts.map +1 -1
  119. package/esm/share/objectShareController.helpers.js +40 -9
  120. package/esm/share/objectShareController.types.d.ts +15 -4
  121. package/esm/share/objectShareController.types.d.ts.map +1 -1
  122. package/esm/share/useAccessList.d.ts +0 -1
  123. package/esm/share/useAccessList.d.ts.map +1 -1
  124. package/esm/share/useAccessList.js +74 -83
  125. package/esm/share/useObjectShareController.d.ts +3 -1
  126. package/esm/share/useObjectShareController.d.ts.map +1 -1
  127. package/esm/share/useObjectShareController.js +12 -19
  128. package/package.json +21 -21
  129. package/styles/internal/css/config_panel.css +82 -0
  130. package/styles/internal/css/config_panel.css.map +1 -1
  131. package/styles/internal/scss/config_panel.scss +94 -0
@@ -6,7 +6,7 @@ import { useToastMessage } from "@gooddata/sdk-ui-kit";
6
6
  import { isPermissionsNotAvailable } from "./accessErrors.js";
7
7
  import { deriveGeneralAccess, deriveWorkspacePermissionLevel } from "./accessSummary.js";
8
8
  import { objectShareMessages } from "./messages.js";
9
- import { assigneeMatchesQuery, granteeId, granteeNameUnresolved, granteesFromAccessList, } from "./objectShareController.helpers.js";
9
+ import { assigneeIdentityFacts, assigneeMatchesQuery, granteeId, granteesFromAccessList, userDisplayPair, userIdentityFacts, } from "./objectShareController.helpers.js";
10
10
  /**
11
11
  * Owns the backend access list. It is fetched once (per target) then seeded into
12
12
  * local state, which is authoritative while the dialog/summary is mounted:
@@ -35,37 +35,25 @@ export function useAccessList(target, onSaved, dialogOpen) {
35
35
  // `targetKey` — a target switch makes the old state stale until the re-seed.
36
36
  const [seededTarget, setSeededTarget] = useState(undefined);
37
37
  const [loadError, setLoadError] = useState(undefined);
38
- // Display names learned from the picker; used to give a fetched row a human
39
- // name when its grant carried only a raw id.
40
- const [knownNames, setKnownNames] = useState({});
41
- // Original ObjRef per grantee id, learned from the picker (the access-list id
42
- // is a serialized `kind:identifier`, which loses Uri-vs-Id). Reused for writes.
43
- const [knownRefs, setKnownRefs] = useState({});
44
- // Memoized current-user-ref fetch — the profile doesn't change while mounted,
38
+ // Assignee identities from the listing (picker + on-open resolve), keyed by
39
+ // grantee id: de-collapsed facts + the original ObjRef (the serialized id
40
+ // loses Uri-vs-Id). The signed-in user is absent from the listing; their
41
+ // facts derive from the profile instead.
42
+ const [knownAssignees, setKnownAssignees] = useState({});
43
+ // Memoized current-user fetch — the profile doesn't change while mounted,
45
44
  // so resolve it at most once and share the promise across callers.
46
- const currentUserRefCache = useRef(undefined);
45
+ const currentUserCache = useRef(undefined);
47
46
  const targetKey = target ? objRefToString(target.ref) : undefined;
48
- // Learn each assignee's real name + ref into the caches, keyed by the same
49
- // grantee id the rows use. Written from both the picker (loadOptions) and the
50
- // eager resolve below, so a granted row can show a human name even when its
51
- // access-list grant carried only a raw id. Must not depend on the caches it
52
- // writes, or it would re-trigger loadOptions' fetch.
47
+ // Written from both the picker (loadOptions) and the on-open resolve. Must not
48
+ // depend on the cache it writes, or it would re-trigger loadOptions' fetch.
53
49
  const cacheAssignees = useCallback((assignees) => {
54
- const withIds = assignees.map((a) => ({
55
- assignee: a,
56
- id: granteeId(a.type === "user" ? "user" : "group", a.ref),
57
- }));
58
- setKnownNames((prev) => {
59
- const next = { ...prev };
60
- for (const { assignee, id } of withIds) {
61
- next[id] = assignee.name;
62
- }
63
- return next;
64
- });
65
- setKnownRefs((prev) => {
50
+ setKnownAssignees((prev) => {
66
51
  const next = { ...prev };
67
- for (const { assignee, id } of withIds) {
68
- next[id] = assignee.ref;
52
+ for (const assignee of assignees) {
53
+ next[granteeId(assignee.type === "user" ? "user" : "group", assignee.ref)] = {
54
+ facts: assigneeIdentityFacts(assignee),
55
+ ref: assignee.ref,
56
+ };
69
57
  }
70
58
  return next;
71
59
  });
@@ -107,35 +95,62 @@ export function useAccessList(target, onSaved, dialogOpen) {
107
95
  setSeededTarget(undefined);
108
96
  }
109
97
  }, [fetchStatus, fetchedList, fetchError, targetKey]);
110
- // The current target's rows, with a human name backfilled from the picker
111
- // cache where the grant returned only a raw id. Empty until the current
112
- // target's list is seeded, so a stale previous target's rows never show
113
- // through the switch window. Derivation, not state — re-applies as the cache grows.
114
- const namedGrantees = useMemo(() => hasList
115
- ? grantees.map((g) => {
116
- const known = knownNames[g.id];
117
- return known && granteeNameUnresolved(g) ? { ...g, name: known } : g;
118
- })
119
- : [], [hasList, grantees, knownNames]);
120
- // Eagerly resolve display names when a fetched grant carried only a raw id.
121
- // The permissions endpoint returns grants without user/group names, so after a
122
- // page reload a row would show the raw id until the picker is opened. Fetch the
123
- // available assignees (the same source the picker uses) to fill the name cache,
124
- // but only when something is actually unresolved a backend that does return
125
- // names skips the extra request entirely. Keyed on the serialized targetKey, not
126
- // the target object, so an inline-ref consumer re-rendering mid-fetch doesn't
127
- // cancel it. Once the cache lands, `needsNameResolve` flips false and the promise
128
- // is withdrawn, so it never refetches an id the listing can't name just stays.
129
- const needsNameResolve = hasList && grantees.some((g) => granteeNameUnresolved(g) && !knownNames[g.id]);
98
+ const getCurrentUser = useCallback(() => {
99
+ if (!currentUserCache.current) {
100
+ currentUserCache.current = backend
101
+ .currentUser()
102
+ .getUser()
103
+ .catch((error) => {
104
+ // Don't cache a rejected promise, or a transient profile-read
105
+ // failure would make every later transfer fail immediately.
106
+ currentUserCache.current = undefined;
107
+ throw error;
108
+ });
109
+ }
110
+ return currentUserCache.current;
111
+ }, [backend]);
112
+ // Resolve the current user only while the dialog is openkeeps the summary-only
113
+ // path free of a profile request (the transfer gate and self-row facts it feeds
114
+ // aren't shown there).
115
+ const { result: currentUser } = useCancelablePromise({
116
+ promise: dialogOpen && targetKey ? () => getCurrentUser() : undefined,
117
+ onError: () => { },
118
+ },
119
+ // Key on target presence, not identity — the resolved user is
120
+ // target-independent, so a target switch must not reset it.
121
+ [getCurrentUser, targetKey !== undefined, dialogOpen]);
122
+ const selfId = currentUser ? granteeId("user", idRef(currentUser.login)) : undefined;
123
+ // Rows with identity facts backfilled from the assignee cache — or, for the
124
+ // signed-in user's own row (absent from the listing by design), from the
125
+ // profile. Empty until the current target's list is seeded; a derivation, so
126
+ // it re-applies as the caches grow.
127
+ const namedGrantees = useMemo(() => {
128
+ if (!hasList) {
129
+ return [];
130
+ }
131
+ // De-collapsed like every listing fact — on tiger the user id is often the email.
132
+ const selfFacts = currentUser
133
+ ? userIdentityFacts(idRef(currentUser.login), currentUser.fullName, currentUser.email)
134
+ : undefined;
135
+ return grantees.map((g) => {
136
+ const known = knownAssignees[g.id]?.facts ?? (g.id === selfId ? selfFacts : undefined);
137
+ return known ? { ...g, name: g.name ?? known.name, email: g.email ?? known.email } : g;
138
+ });
139
+ }, [hasList, grantees, knownAssignees, currentUser, selfId]);
140
+ // Resolve identity facts on dialog open — grants often carry only raw ids
141
+ // (the post-reload state). Unconditional: no missing-facts gate to keep in
142
+ // sync with the cache, and summary-only consumers never fetch. Keyed on the
143
+ // serialized targetKey so an inline-ref consumer re-rendering mid-fetch
144
+ // doesn't cancel it.
130
145
  useCancelablePromise({
131
- promise: target && needsNameResolve
146
+ promise: target && dialogOpen
132
147
  ? () => backend.workspace(workspace).objectPermissions().getAvailableAssignees(target)
133
148
  : undefined,
134
149
  onSuccess: cacheAssignees,
135
150
  // Best-effort backfill: on error the raw id stays (pre-fix behavior, no
136
151
  // regression) and the picker can still resolve it on demand. No toast.
137
152
  onError: () => { },
138
- }, [backend, workspace, targetKey, needsNameResolve]);
153
+ }, [backend, workspace, targetKey, dialogOpen]);
139
154
  // Stable sorted key of the currently-granted ids — drives the picker's
140
155
  // "exclude already-granted" filter. Keyed on ids only (not names), so the
141
156
  // picker's own name-cache writes can't change loadOptions' identity and
@@ -227,8 +242,8 @@ export function useAccessList(target, onSaved, dialogOpen) {
227
242
  .map(({ assignee, id }) => ({
228
243
  id,
229
244
  kind: "user",
230
- name: assignee.name,
231
- email: assignee.type === "user" ? assignee.email : undefined,
245
+ // Same fallback pairs as the grantee rows.
246
+ ...userDisplayPair(assigneeIdentityFacts(assignee), objRefToString(assignee.ref)),
232
247
  })),
233
248
  groups: selectable
234
249
  .filter(({ assignee }) => assignee.type !== "user")
@@ -237,36 +252,13 @@ export function useAccessList(target, onSaved, dialogOpen) {
237
252
  }, [backend, workspace, target, excludedIdsKey, cacheAssignees]);
238
253
  // Reuse the picker's original ref (preserves UriRef vs IdentifierRef);
239
254
  // fall back to the serialized id only if it wasn't cached.
240
- const refForId = useCallback((id) => knownRefs[id] ?? { identifier: id.split(":", 2)[1] }, [knownRefs]);
241
- const getCurrentUserRef = useCallback(async () => {
242
- if (!currentUserRefCache.current) {
243
- currentUserRefCache.current = backend
244
- .currentUser()
245
- .getUser()
246
- // Not `user.ref`: the profile resolves it as a uriRef while access-list
247
- // grantee refs are idRefs keyed by user id (= profile login), and
248
- // areObjRefsEqual never matches mixed shapes — self-row matching and
249
- // the self grant write need the permission API's id space.
250
- .then((user) => idRef(user.login))
251
- .catch((error) => {
252
- // Don't cache a rejected promise, or a transient profile-read
253
- // failure would make every later transfer fail immediately.
254
- currentUserRefCache.current = undefined;
255
- throw error;
256
- });
257
- }
258
- return currentUserRefCache.current;
259
- }, [backend]);
260
- // Resolve the current user only while the dialog is open — keeps the summary-only
261
- // path free of a profile request (the transfer gate it feeds isn't shown there).
262
- const { result: currentUserRef } = useCancelablePromise({
263
- promise: dialogOpen && targetKey ? () => getCurrentUserRef() : undefined,
264
- onError: () => { },
265
- },
266
- // Key on target presence, not identity — the resolved user is
267
- // target-independent, so a target switch must not reset it.
268
- [getCurrentUserRef, targetKey !== undefined, dialogOpen]);
269
- const selfId = currentUserRef ? granteeId("user", currentUserRef) : undefined;
255
+ const refForId = useCallback((id) => knownAssignees[id]?.ref ?? { identifier: id.split(":", 2)[1] }, [knownAssignees]);
256
+ const getCurrentUserRef = useCallback(
257
+ // Not `user.ref`: the profile resolves it as a uriRef while access-list
258
+ // grantee refs are idRefs keyed by user id (= profile login), and
259
+ // areObjRefsEqual never matches mixed shapes — self-row matching and
260
+ // the self grant write need the permission API's id space.
261
+ () => getCurrentUser().then((user) => idRef(user.login)), [getCurrentUser]);
270
262
  const canTransferOwnership = selfId !== undefined && namedGrantees.some((g) => g.id === selfId && g.level === "EDIT");
271
263
  return {
272
264
  targetKey,
@@ -286,6 +278,5 @@ export function useAccessList(target, onSaved, dialogOpen) {
286
278
  setGrantees,
287
279
  setGeneralAccess,
288
280
  setWorkspaceLevel,
289
- setKnownNames,
290
281
  };
291
282
  }
@@ -19,7 +19,9 @@ import { type IObjectShareController, type IUseObjectShareOptions } from "./obje
19
19
  * plain props and it owns its controller. Call this (exported as `useObjectShare`)
20
20
  * only to share a single access-list fetch between the dialog and an inline summary
21
21
  * row: call it once, read `state.summary` for the row, and pass the controller into
22
- * the dialog.
22
+ * the dialog. Grantee rows carry identity facts only (`name`/`email` are undefined
23
+ * when unknown); the display fallback order is not exposed, so {@link ObjectShareDialog}
24
+ * is the only sanctioned row renderer.
23
25
  *
24
26
  * @internal
25
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useObjectShareController.d.ts","sourceRoot":"","sources":["../../src/share/useObjectShareController.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAkB1E,OAAO,EACH,KAAK,sBAAsB,EAI3B,KAAK,sBAAsB,EAE9B,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAizBxB"}
1
+ {"version":3,"file":"useObjectShareController.d.ts","sourceRoot":"","sources":["../../src/share/useObjectShareController.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAkB1E,OAAO,EACH,KAAK,sBAAsB,EAI3B,KAAK,sBAAsB,EAE9B,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAuyBxB"}
@@ -25,7 +25,9 @@ import { useLabelScope } from "./useLabelScope.js";
25
25
  * plain props and it owns its controller. Call this (exported as `useObjectShare`)
26
26
  * only to share a single access-list fetch between the dialog and an inline summary
27
27
  * row: call it once, read `state.summary` for the row, and pass the controller into
28
- * the dialog.
28
+ * the dialog. Grantee rows carry identity facts only (`name`/`email` are undefined
29
+ * when unknown); the display fallback order is not exposed, so {@link ObjectShareDialog}
30
+ * is the only sanctioned row renderer.
29
31
  *
30
32
  * @internal
31
33
  */
@@ -47,7 +49,7 @@ export function useObjectShareController(target, options) {
47
49
  const [workspaceLevelSaving, setWorkspaceLevelSaving] = useState(false);
48
50
  // The backend access list, seeded into local state (rows, general access,
49
51
  // summary, the commit/picker primitives) lives in its own hook.
50
- const { targetKey, hasList, grantees, generalAccess, workspaceLevel, summary, status, loadError, accessUnavailable, commit, loadOptions, refForId, getCurrentUserRef, canTransferOwnership, setGrantees, setGeneralAccess, setWorkspaceLevel, setKnownNames, } = useAccessList(target, onSaved, isOpen);
52
+ const { targetKey, hasList, grantees, generalAccess, workspaceLevel, summary, status, loadError, accessUnavailable, commit, loadOptions, refForId, getCurrentUserRef, canTransferOwnership, setGrantees, setGeneralAccess, setWorkspaceLevel, } = useAccessList(target, onSaved, isOpen);
51
53
  // Always-current target key, read inside async mutation finalizers that captured
52
54
  // an older one. A write started for object A resolves after the user navigated to
53
55
  // object B; because local state is authoritative (no refetch), applying A's
@@ -129,14 +131,14 @@ export function useObjectShareController(target, options) {
129
131
  return;
130
132
  }
131
133
  const startedFor = targetKey;
132
- // Insert the picked grantees as pending rows, carrying the picker's display
133
- // name so the new row never renders a raw id.
134
+ // Insert the picked grantees as pending rows. Identity facts are not copied
135
+ // from the picker option (its name/email are display fallbacks, not facts) —
136
+ // rows render from the facts cache the picker fetch already populated.
134
137
  const addedIds = pendingGrantees.map((g) => g.id);
135
138
  const addedRows = pendingGrantees.map((g) => ({
136
139
  id: g.id,
137
140
  kind: g.kind,
138
141
  granteeRef: refForId(g.id),
139
- name: g.name,
140
142
  level: g.permissionLevel,
141
143
  pending: "saving",
142
144
  }));
@@ -147,13 +149,6 @@ export function useObjectShareController(target, options) {
147
149
  const allLabelIds = effectiveLabels.map((l) => l.id);
148
150
  const allLabelIdSet = new Set(allLabelIds);
149
151
  setGrantees((prev) => [...prev.filter((g) => !addedIds.includes(g.id)), ...addedRows]);
150
- setKnownNames((prev) => {
151
- const next = { ...prev };
152
- for (const g of pendingGrantees) {
153
- next[g.id] = g.name;
154
- }
155
- return next;
156
- });
157
152
  setSelectedLabelIdsByGrantee((prev) => {
158
153
  const next = { ...prev };
159
154
  for (const id of addedIds) {
@@ -214,7 +209,6 @@ export function useObjectShareController(target, options) {
214
209
  refForId,
215
210
  toast,
216
211
  setGrantees,
217
- setKnownNames,
218
212
  setSelectedLabelIdsByGrantee,
219
213
  ]);
220
214
  const changePermissionLevel = useCallback(async (granteeId, level) => {
@@ -457,14 +451,14 @@ export function useObjectShareController(target, options) {
457
451
  // EDIT — then there's nothing to transfer (the dialog offers to remove the
458
452
  // current user's own access instead).
459
453
  const transferTargetIsOwner = useMemo(() => transferTarget ? grantees.some((g) => g.id === transferTarget.id && g.level === "EDIT") : false, [transferTarget, grantees]);
460
- // Insert a brand-new grantee row with its label scope and display name the
461
- // shared seed for a freshly-granted principal (used when a transfer promotes a
462
- // user who wasn't already a grantee; the same row shape the add flow creates).
454
+ // Insert a brand-new grantee row with its label scope the shared seed for a
455
+ // freshly-granted principal (used when a transfer promotes a user who wasn't
456
+ // already a grantee; the same row shape the add flow creates). Identity
457
+ // renders from the facts cache.
463
458
  const seedNewGranteeRow = useCallback((row, labelIds) => {
464
459
  setGrantees((prev) => [...prev, row]);
465
- setKnownNames((prev) => ({ ...prev, [row.id]: row.name }));
466
460
  setSelectedLabelIdsByGrantee((prev) => ({ ...prev, [row.id]: labelIds }));
467
- }, [setGrantees, setKnownNames, setSelectedLabelIdsByGrantee]);
461
+ }, [setGrantees, setSelectedLabelIdsByGrantee]);
468
462
  const confirmTransferOwnership = useCallback(async () => {
469
463
  if (!transferTarget || transferSaving) {
470
464
  return;
@@ -563,7 +557,6 @@ export function useObjectShareController(target, options) {
563
557
  id: transferTarget.id,
564
558
  kind: "user",
565
559
  granteeRef: ownerRef,
566
- name: transferTarget.name,
567
560
  level: "EDIT",
568
561
  effectivePermission: nextEffective,
569
562
  }, allLabelIds);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-ext",
3
- "version": "11.47.0-alpha.1",
3
+ "version": "11.47.0-alpha.3",
4
4
  "description": "GoodData.UI SDK - Extensions",
5
5
  "license": "LicenseRef-LICENSE",
6
6
  "author": "GoodData Corporation",
@@ -63,20 +63,20 @@
63
63
  "ts-invariant": "0.10.3",
64
64
  "tslib": "2.8.1",
65
65
  "uuid": "11.1.1",
66
- "@gooddata/sdk-backend-base": "11.47.0-alpha.1",
67
- "@gooddata/sdk-embedding": "11.47.0-alpha.1",
68
- "@gooddata/sdk-backend-spi": "11.47.0-alpha.1",
69
- "@gooddata/sdk-model": "11.47.0-alpha.1",
70
- "@gooddata/sdk-ui": "11.47.0-alpha.1",
71
- "@gooddata/sdk-ui-charts": "11.47.0-alpha.1",
72
- "@gooddata/sdk-ui-filters": "11.47.0-alpha.1",
73
- "@gooddata/sdk-ui-geo": "11.47.0-alpha.1",
74
- "@gooddata/sdk-ui-pivot": "11.47.0-alpha.1",
75
- "@gooddata/sdk-ui-semantic-search": "11.47.0-alpha.1",
76
- "@gooddata/sdk-ui-kit": "11.47.0-alpha.1",
77
- "@gooddata/sdk-ui-theme-provider": "11.47.0-alpha.1",
78
- "@gooddata/sdk-ui-vis-commons": "11.47.0-alpha.1",
79
- "@gooddata/util": "11.47.0-alpha.1"
66
+ "@gooddata/sdk-backend-base": "11.47.0-alpha.3",
67
+ "@gooddata/sdk-backend-spi": "11.47.0-alpha.3",
68
+ "@gooddata/sdk-embedding": "11.47.0-alpha.3",
69
+ "@gooddata/sdk-model": "11.47.0-alpha.3",
70
+ "@gooddata/sdk-ui": "11.47.0-alpha.3",
71
+ "@gooddata/sdk-ui-filters": "11.47.0-alpha.3",
72
+ "@gooddata/sdk-ui-charts": "11.47.0-alpha.3",
73
+ "@gooddata/sdk-ui-geo": "11.47.0-alpha.3",
74
+ "@gooddata/sdk-ui-kit": "11.47.0-alpha.3",
75
+ "@gooddata/sdk-ui-pivot": "11.47.0-alpha.3",
76
+ "@gooddata/sdk-ui-semantic-search": "11.47.0-alpha.3",
77
+ "@gooddata/sdk-ui-theme-provider": "11.47.0-alpha.3",
78
+ "@gooddata/sdk-ui-vis-commons": "11.47.0-alpha.3",
79
+ "@gooddata/util": "11.47.0-alpha.3"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@microsoft/api-documenter": "^7.17.0",
@@ -124,12 +124,12 @@
124
124
  "typescript": "5.9.3",
125
125
  "vitest": "4.1.8",
126
126
  "vitest-dom": "0.1.1",
127
- "@gooddata/eslint-config": "11.47.0-alpha.1",
128
- "@gooddata/i18n-toolkit": "11.47.0-alpha.1",
129
- "@gooddata/oxlint-config": "11.47.0-alpha.1",
130
- "@gooddata/sdk-backend-mockingbird": "11.47.0-alpha.1",
131
- "@gooddata/reference-workspace": "11.47.0-alpha.1",
132
- "@gooddata/stylelint-config": "11.47.0-alpha.1"
127
+ "@gooddata/eslint-config": "11.47.0-alpha.3",
128
+ "@gooddata/i18n-toolkit": "11.47.0-alpha.3",
129
+ "@gooddata/oxlint-config": "11.47.0-alpha.3",
130
+ "@gooddata/reference-workspace": "11.47.0-alpha.3",
131
+ "@gooddata/sdk-backend-mockingbird": "11.47.0-alpha.3",
132
+ "@gooddata/stylelint-config": "11.47.0-alpha.3"
133
133
  },
134
134
  "peerDependencies": {
135
135
  "react": "^18.0.0 || ^19.0.0",
@@ -573,4 +573,86 @@
573
573
  padding-left: 20px;
574
574
  }
575
575
 
576
+ .gd-line-style-item-trigger {
577
+ display: block;
578
+ width: 100%;
579
+ padding: 0;
580
+ margin: 0;
581
+ border: none;
582
+ background: transparent;
583
+ text-align: left;
584
+ cursor: pointer;
585
+ }
586
+ .gd-line-style-item-trigger:disabled {
587
+ cursor: not-allowed;
588
+ }
589
+
590
+ .gd-line-style-toolbar {
591
+ display: inline-flex;
592
+ align-items: center;
593
+ gap: 8px;
594
+ padding: 6px 8px;
595
+ background: var(--gd-palette-complementary-0, #fff);
596
+ border: 1px solid var(--gd-palette-complementary-3, #dde4eb);
597
+ border-radius: 3px;
598
+ box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1);
599
+ }
600
+ .gd-line-style-toolbar.is-disabled {
601
+ pointer-events: none;
602
+ opacity: 0.5;
603
+ }
604
+ .gd-line-style-toolbar__divider {
605
+ width: 1px;
606
+ height: 28px;
607
+ background: var(--gd-palette-complementary-3, #dde4eb);
608
+ flex-shrink: 0;
609
+ }
610
+ .gd-line-style-toolbar__btn {
611
+ display: flex;
612
+ align-items: center;
613
+ gap: 4px;
614
+ height: 28px;
615
+ padding: 0 4px;
616
+ cursor: pointer;
617
+ color: var(--gd-palette-complementary-8, #464e56);
618
+ border-radius: 2px;
619
+ border: none;
620
+ background: transparent;
621
+ font: inherit;
622
+ }
623
+ .gd-line-style-toolbar__btn:focus-visible {
624
+ outline: 2px solid #14b2e2;
625
+ outline-offset: 1px;
626
+ }
627
+ .gd-line-style-toolbar__btn:hover {
628
+ background: var(--gd-palette-complementary-2, #ebeff4);
629
+ }
630
+ .gd-line-style-toolbar__btn.is-open {
631
+ background: var(--gd-palette-complementary-2, #ebeff4);
632
+ color: #14b2e2;
633
+ }
634
+ .gd-line-style-toolbar__btn.is-disabled, .gd-line-style-toolbar__btn:disabled {
635
+ opacity: 0.5;
636
+ cursor: not-allowed;
637
+ pointer-events: none;
638
+ }
639
+ .gd-line-style-toolbar__btn .gd-icon-navigatedown {
640
+ font-size: 10px;
641
+ color: var(--gd-palette-complementary-7, #6d7680);
642
+ }
643
+ .gd-line-style-toolbar__color-swatch {
644
+ width: 20px;
645
+ height: 20px;
646
+ border-radius: 2px;
647
+ flex-shrink: 0;
648
+ overflow: hidden;
649
+ }
650
+ .gd-line-style-toolbar__weight-text {
651
+ font-size: 14px;
652
+ color: var(--gd-palette-complementary-7, #6d7680);
653
+ white-space: nowrap;
654
+ min-width: 28px;
655
+ text-align: center;
656
+ }
657
+
576
658
  /*# sourceMappingURL=config_panel.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../node_modules/@gooddata/sdk-ui-kit/styles/scss/colorPicker.scss","../../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../scss/config_panel.scss"],"names":[],"mappings":"AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAGJ;EAGI;;;AAKZ;EACI;EACA,OC3BY;ED4BZ;EACA;;AAEA;AAAA;EAEI;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AEhHR;EACI,QAHmB;;;AAOnB;EACI,OD2BQ;EC1BR,YDsGgB;;ACjGhB;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EACI;;;AAKZ;EACI;EACA,OAjCqB;EAkCrB,QAlCqB;EAmCrB;EACA;EACA,aArCqB;EAsCrB;;AAEA;EACI;EACA;EACA,OD1BS;EC2BT;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI,OAlEqB;EAmErB,QAnEqB;EAoErB,QAnEmB;EAoEnB;EACA;EACA;EACA;;AAEA;EAII,cD7DS;EC8DT;;;AAIR;EACI;;;AASJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA,KA1Ge;EA2Gf;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;;AAIA;EACI;EACA;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA,OD5HgB;;;AC+HpB;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;;AAEA;EACI,kBD3HgB;EC4HhB;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,MDxPQ;;AC2PhB;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI,ODvPmB;;;AC0PvB;EACI;;;AAGJ;EACI;EACA;;;AAIA;EACI;;;AAKJ;AAAA;EAEI;;AAIA;AAAA;EAEI;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;AAKJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,ODvOQ;;AC0OZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AASJ;EACI,ODnWe;ECoWf;EACA;;AAGJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,kBDnSgB;ECoShB;;AAEA;EACI,ODhYW;ECiYX;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,ODzZQ;EC0ZR;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OD3ae;EC4af;;AAEA;EACI;EACA;;AAIR;EACI;EACA,ODtbe;ECubf;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,YD/WY;;ACiXZ;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA,ODjeY;;;AC0ehB;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,YD5fS;;AC8fT;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA,ODxgBQ;ECygBR;EACA;;AAIA;EACI;EACA;EACA;EACA","file":"config_panel.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../../node_modules/@gooddata/sdk-ui-kit/styles/scss/colorPicker.scss","../../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../scss/config_panel.scss"],"names":[],"mappings":"AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAGJ;EAGI;;;AAKZ;EACI;EACA,OC3BY;ED4BZ;EACA;;AAEA;AAAA;EAEI;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AEhHR;EACI,QAHmB;;;AAOnB;EACI,OD2BQ;EC1BR,YDsGgB;;ACjGhB;EACI;;AAIR;EACI;EACA;EACA;;AAEA;EACI;;;AAKZ;EACI;EACA,OAjCqB;EAkCrB,QAlCqB;EAmCrB;EACA;EACA,aArCqB;EAsCrB;;AAEA;EACI;EACA;EACA,OD1BS;EC2BT;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI,OAlEqB;EAmErB,QAnEqB;EAoErB,QAnEmB;EAoEnB;EACA;EACA;EACA;;AAEA;EAII,cD7DS;EC8DT;;;AAIR;EACI;;;AASJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA,KA1Ge;EA2Gf;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;;AAIA;EACI;EACA;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA,OD5HgB;;;AC+HpB;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;;AAEA;EACI,kBD3HgB;EC4HhB;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,MDxPQ;;AC2PhB;EACI;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI,ODvPmB;;;AC0PvB;EACI;;;AAGJ;EACI;EACA;;;AAIA;EACI;;;AAKJ;AAAA;EAEI;;AAIA;AAAA;EAEI;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;AAKJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,ODvOQ;;AC0OZ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AASJ;EACI,ODnWe;ECoWf;EACA;;AAGJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,kBDnSgB;ECoShB;;AAEA;EACI,ODhYW;ECiYX;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,ODzZQ;EC0ZR;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OD3ae;EC4af;;AAEA;EACI;EACA;;AAIR;EACI;EACA,ODtbe;ECubf;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,YD/WY;;ACiXZ;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA,ODjeY;;;AC0ehB;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,YD5fS;;AC8fT;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA,ODxgBQ;ECygBR;EACA;;AAIA;EACI;EACA;EACA;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA,YDxjBa;ECyjBb;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA,YD/iBU;ECgjBV;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA,ODnkBQ;ECokBR;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI,YD7fY;;ACggBhB;EACI,YDjgBY;ECkgBZ,OD/mBS;;ACknBb;EAEI;EACA;EACA;;AAGJ;EACI;EACA,ODpmBI;;ACwmBZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA,ODlnBQ;ECmnBR;EACA;EACA","file":"config_panel.css"}
@@ -568,3 +568,97 @@ $color-picker-spacing: 5px;
568
568
  }
569
569
  }
570
570
  }
571
+
572
+ .gd-line-style-item-trigger {
573
+ display: block;
574
+ width: 100%;
575
+ padding: 0;
576
+ margin: 0;
577
+ border: none;
578
+ background: transparent;
579
+ text-align: left;
580
+ cursor: pointer;
581
+
582
+ &:disabled {
583
+ cursor: not-allowed;
584
+ }
585
+ }
586
+
587
+ .gd-line-style-toolbar {
588
+ display: inline-flex;
589
+ align-items: center;
590
+ gap: 8px;
591
+ padding: 6px 8px;
592
+ background: kit-variables.$gd-color-white;
593
+ border: 1px solid kit-variables.$gd-border-color;
594
+ border-radius: 3px;
595
+ box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1);
596
+
597
+ &.is-disabled {
598
+ pointer-events: none;
599
+ opacity: 0.5;
600
+ }
601
+
602
+ &__divider {
603
+ width: 1px;
604
+ height: 28px;
605
+ background: kit-variables.$gd-border-color;
606
+ flex-shrink: 0;
607
+ }
608
+
609
+ &__btn {
610
+ display: flex;
611
+ align-items: center;
612
+ gap: 4px;
613
+ height: 28px;
614
+ padding: 0 4px;
615
+ cursor: pointer;
616
+ color: kit-variables.$gd-color-text;
617
+ border-radius: 2px;
618
+ border: none;
619
+ background: transparent;
620
+ font: inherit;
621
+
622
+ &:focus-visible {
623
+ outline: 2px solid kit-variables.$gd-color-highlight;
624
+ outline-offset: 1px;
625
+ }
626
+
627
+ &:hover {
628
+ background: kit-variables.$is-focused-background;
629
+ }
630
+
631
+ &.is-open {
632
+ background: kit-variables.$is-focused-background;
633
+ color: kit-variables.$gd-color-highlight;
634
+ }
635
+
636
+ &.is-disabled,
637
+ &:disabled {
638
+ opacity: 0.5;
639
+ cursor: not-allowed;
640
+ pointer-events: none;
641
+ }
642
+
643
+ .gd-icon-navigatedown {
644
+ font-size: 10px;
645
+ color: kit-variables.$gd-color-label;
646
+ }
647
+ }
648
+
649
+ &__color-swatch {
650
+ width: 20px;
651
+ height: 20px;
652
+ border-radius: 2px;
653
+ flex-shrink: 0;
654
+ overflow: hidden;
655
+ }
656
+
657
+ &__weight-text {
658
+ font-size: 14px;
659
+ color: kit-variables.$gd-color-label;
660
+ white-space: nowrap;
661
+ min-width: 28px;
662
+ text-align: center;
663
+ }
664
+ }