@gooddata/sdk-ui-ext 11.55.0-alpha.3 → 11.55.0-alpha.4

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 (62) hide show
  1. package/NOTICE +8 -8
  2. package/esm/index.d.ts +4 -2
  3. package/esm/index.d.ts.map +1 -1
  4. package/esm/index.js +3 -2
  5. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts.map +1 -1
  6. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.js +8 -5
  7. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts +20 -5
  8. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts.map +1 -1
  9. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.js +143 -33
  10. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts +19 -1
  11. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts.map +1 -1
  12. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.js +146 -46
  13. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts +34 -7
  14. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts.map +1 -1
  15. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.js +38 -7
  16. package/esm/internal/components/configurationPanels/PivotTableConfigurationPanel.d.ts.map +1 -1
  17. package/esm/internal/components/configurationPanels/PivotTableConfigurationPanel.js +9 -4
  18. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.d.ts.map +1 -1
  19. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.js +18 -18
  20. package/esm/internal/components/pluggableVisualizations/pivotTableNext/pivotTableNextConfigFromInsight.d.ts +1 -2
  21. package/esm/internal/components/pluggableVisualizations/pivotTableNext/pivotTableNextConfigFromInsight.d.ts.map +1 -1
  22. package/esm/internal/components/pluggableVisualizations/pivotTableNext/pivotTableNextConfigFromInsight.js +3 -9
  23. package/esm/internal/index.d.ts +1 -0
  24. package/esm/internal/index.d.ts.map +1 -1
  25. package/esm/internal/index.js +1 -0
  26. package/esm/internal/translations/en-US.localization-bundle.d.ts +14 -2
  27. package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
  28. package/esm/internal/translations/en-US.localization-bundle.js +18 -6
  29. package/esm/internal/utils/embeddingInsightViewCodeGenerator/insightViewConfig.d.ts.map +1 -1
  30. package/esm/internal/utils/embeddingInsightViewCodeGenerator/insightViewConfig.js +2 -1
  31. package/esm/internal/utils/propertiesHelper.d.ts +33 -1
  32. package/esm/internal/utils/propertiesHelper.d.ts.map +1 -1
  33. package/esm/internal/utils/propertiesHelper.js +43 -1
  34. package/esm/locales.d.ts +11 -2
  35. package/esm/locales.d.ts.map +1 -1
  36. package/esm/locales.js +5 -2
  37. package/esm/sdk-ui-ext.d.ts +194 -4
  38. package/esm/share/ObjectShareDialog.d.ts +19 -0
  39. package/esm/share/ObjectShareDialog.d.ts.map +1 -1
  40. package/esm/share/ObjectShareDialog.js +8 -1
  41. package/esm/share/objectShareController.helpers.d.ts +8 -52
  42. package/esm/share/objectShareController.helpers.d.ts.map +1 -1
  43. package/esm/share/objectShareController.helpers.js +23 -0
  44. package/esm/share/objectShareController.types.d.ts +76 -3
  45. package/esm/share/objectShareController.types.d.ts.map +1 -1
  46. package/esm/share/useAccessList.d.ts +14 -3
  47. package/esm/share/useAccessList.d.ts.map +1 -1
  48. package/esm/share/useAccessList.js +26 -7
  49. package/esm/share/useApplyObjectPermissions.d.ts +13 -0
  50. package/esm/share/useApplyObjectPermissions.d.ts.map +1 -0
  51. package/esm/share/useApplyObjectPermissions.js +33 -0
  52. package/esm/share/useObjectShareController.d.ts.map +1 -1
  53. package/esm/share/useObjectShareController.js +20 -9
  54. package/esm/share/useObjectShareDialog.d.ts +12 -3
  55. package/esm/share/useObjectShareDialog.d.ts.map +1 -1
  56. package/esm/share/useObjectShareDialog.js +16 -3
  57. package/package.json +22 -23
  58. package/styles/css/main.css +38 -4
  59. package/styles/css/main.css.map +1 -1
  60. package/styles/internal/css/conditional_formatting.css +38 -4
  61. package/styles/internal/css/conditional_formatting.css.map +1 -1
  62. package/styles/internal/scss/conditional_formatting.scss +67 -18
@@ -1,4 +1,6 @@
1
1
  import type { IObjectPermissionsObject } from "@gooddata/sdk-backend-spi";
2
+ import { type GeneralAccessValue } from "@gooddata/sdk-ui-kit";
3
+ import type { IObjectShareDraft } from "./objectShareController.types.js";
2
4
  import type { IObjectAccessSummary, IObjectShareLabel } from "./types.js";
3
5
  /**
4
6
  * Props for {@link ObjectShareDialog}.
@@ -24,6 +26,23 @@ export interface IObjectShareDialogProps {
24
26
  * keep an inline access row in sync without refetching.
25
27
  */
26
28
  onSummaryChange?: (summary: IObjectAccessSummary) => void;
29
+ /**
30
+ * Manage access for an object that does not exist yet. Nothing is written; the result
31
+ * arrives through `onDraftChange`. Requires no `target`, and `labels` is ignored.
32
+ */
33
+ draft?: boolean;
34
+ /**
35
+ * Fires with the final draft as the dialog closes, while `draft`. Required: the session
36
+ * unmounts on close, so a draft nobody keeps is lost.
37
+ */
38
+ onDraftChange?: (draft: IObjectShareDraft) => void;
39
+ /** Draft to carry on from, when reopening. */
40
+ initialDraft?: IObjectShareDraft;
41
+ /**
42
+ * What a draft's general access starts as; an untouched default is never written.
43
+ * Defaults to RESTRICTED; pass WORKSPACE for a type the backend creates visible.
44
+ */
45
+ initialDraftGeneralAccess?: GeneralAccessValue;
27
46
  /**
28
47
  * Labels (display forms) of the shared attribute, enabling the per-grantee
29
48
  * label-scope picker. Omit for objects without labels (e.g. facts).
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectShareDialog.d.ts","sourceRoot":"","sources":["../../src/share/ObjectShareDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAc1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0C1E;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,gDAAgD;IAChD,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7C,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,kDAK/D"}
1
+ {"version":3,"file":"ObjectShareDialog.d.ts","sourceRoot":"","sources":["../../src/share/ObjectShareDialog.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EACH,KAAK,kBAAkB,EAQ1B,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EACR,iBAAiB,EAGpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0C1E;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,gDAAgD;IAChD,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7C,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,8CAA8C;IAC9C,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;IAC/C;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,uBAAuB,kDAa/D"}
@@ -1,6 +1,7 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2026 GoodData Corporation
3
3
  import { useIntl } from "react-intl";
4
+ import { invariant } from "ts-invariant";
4
5
  import { UiAddGranteeDialog, UiConfirmDialog, UiGranteeRowControls, UiObjectShareDialog, UiTag, UiTooltip, } from "@gooddata/sdk-ui-kit";
5
6
  import { objectShareMessages } from "./messages.js";
6
7
  import { granteeDisplayPair } from "./objectShareController.helpers.js";
@@ -40,13 +41,15 @@ function AdminSelfTag() {
40
41
  * @internal
41
42
  */
42
43
  export function ObjectShareDialog(props) {
44
+ invariant(!props.draft || !props.target, "ObjectShareDialog: `draft` cannot be combined with a `target` — a draft is for an object that does not exist yet, and nothing it stages would ever be written to that target.");
45
+ invariant(!props.draft || props.onDraftChange, "ObjectShareDialog: `draft` requires `onDraftChange`, and something above the dialog must keep what it emits and pass it back as `initialDraft` — the session unmounts on close, discarding anything only drafted.");
43
46
  if (!props.isOpen) {
44
47
  return null;
45
48
  }
46
49
  return _jsx(ObjectShareDialogSession, { ...props });
47
50
  }
48
51
  /** The dialog session — mounted only while open, so its state cannot outlive a close. */
49
- function ObjectShareDialogSession({ target, objectTitle, onClose, onSummaryChange, labels, labelsLoading, labelsError, }) {
52
+ function ObjectShareDialogSession({ target, objectTitle, onClose, onSummaryChange, labels, labelsLoading, labelsError, draft, onDraftChange, initialDraft, initialDraftGeneralAccess, }) {
50
53
  const intl = useIntl();
51
54
  const { state, actions, isShareViewOpen, isAddGranteeOpen, isGeneralAccessConfirmOpen, isSelfRestrictConfirmOpen, isMutable, isLoading, workspaceDisabledLevels, grantableDisabledLevels, grantLimitTooltip, rowDisabledLevels, rowDisabledLevelTooltips, isRowRemoveDisabled, isRowControlsLocked, rowRemoveDisabledTooltip, onClose: closeDialog, onRowPermissionChange, onRowRemove, onSelfRestrictCancel, onSelfRestrictConfirm, } = useObjectShareDialog({
52
55
  target,
@@ -55,6 +58,10 @@ function ObjectShareDialogSession({ target, objectTitle, onClose, onSummaryChang
55
58
  labels,
56
59
  labelsLoading,
57
60
  labelsError,
61
+ draft,
62
+ onDraftChange,
63
+ initialDraft,
64
+ initialDraftGeneralAccess,
58
65
  });
59
66
  // Primary label is locked — always selected, can't be unchecked.
60
67
  const labelItems = state.labels.map((l) => ({
@@ -1,6 +1,5 @@
1
1
  import { type IAvailableAccessGrantee, type IGranularAccessGrantee, type IObjectAccessList, type ObjRef } from "@gooddata/sdk-model";
2
- import type { GeneralAccessValue } from "@gooddata/sdk-ui-kit";
3
- import type { IGranteeIdentityFacts, IObjectShareGrantee, ISelfIdentity, ObjectSharePermissionLevel } from "./objectShareController.types.js";
2
+ import type { GranteeEdit, IGranteeIdentityFacts, IObjectShareDraft, IObjectShareGrantee, ISelfIdentity, ObjectSharePermissionLevel } from "./objectShareController.types.js";
4
3
  import type { IObjectShareLabel } from "./types.js";
5
4
  /** Stable row id shared by grantee rows and picker options: `user:<ref>` / `group:<ref>`. */
6
5
  export declare function granteeId(kind: "user" | "group", ref: ObjRef): string;
@@ -117,56 +116,6 @@ export declare function withDirectLevel(grantee: IObjectShareGrantee, direct: Ob
117
116
  */
118
117
  export declare function withoutDirectGrant(grantee: IObjectShareGrantee, inheritedLevel: ObjectSharePermissionLevel): IObjectShareGrantee;
119
118
  export declare function granteesFromAccessList(list: IObjectAccessList | undefined): IObjectShareGrantee[];
120
- /**
121
- * A transient edit overlaid on a fetched grantee row (keyed by grantee id in
122
- * {@link mergeGrantees}). The pending-guard keeps at most one edit in flight per id.
123
- * A pending edit that superseded an already-COMMITTED entry (an added row, an
124
- * earlier level change) carries it as `settled`, because the fetched base no longer
125
- * holds that row's last-settled state: failure restores `settled`, success drops it.
126
- * With no `settled`, failure deletes the entry, reverting to the fetched row.
127
- *
128
- * @internal
129
- */
130
- export type GranteeEdit = {
131
- kind: "level";
132
- level: ObjectSharePermissionLevel;
133
- pending: boolean;
134
- settled?: GranteeEdit;
135
- } | {
136
- kind: "added";
137
- grantee: IObjectShareGrantee;
138
- pending: boolean;
139
- settled?: GranteeEdit;
140
- } | {
141
- kind: "removed";
142
- pending: boolean;
143
- settled?: GranteeEdit;
144
- }
145
- /**
146
- * Pending marker only — the row renders exactly as it stands. For a write that
147
- * locks the row without changing its access (a label-scope edit), so nothing has
148
- * to invent a level: reusing the `level` overlay would record the DISPLAYED level
149
- * as the direct grant, and that level is the effective one.
150
- */
151
- | {
152
- kind: "locked";
153
- pending: boolean;
154
- settled?: GranteeEdit;
155
- };
156
- /**
157
- * Transient edit of the all-workspace-users rule (general access + its level),
158
- * overlaid on the fetched rule state in the hook. Same lifecycle and `settled`
159
- * semantics as {@link GranteeEdit}, one edit in flight at a time.
160
- *
161
- * @internal
162
- */
163
- export interface IRuleEdit {
164
- generalAccess: GeneralAccessValue;
165
- level: ObjectSharePermissionLevel;
166
- pending: boolean;
167
- /** The committed rule edit this pending one superseded; restored on failure. */
168
- settled?: IRuleEdit;
169
- }
170
119
  /**
171
120
  * Pure composition of the fetched base with the transient overlay — the hook's
172
121
  * `grantees` derive from this with no effect and no mirrored state. Marks the
@@ -247,6 +196,13 @@ export declare function buildLabelMutationsForScopes(changes: readonly ILabelSco
247
196
  ref: ObjRef;
248
197
  grantees: IGranularAccessGrantee[];
249
198
  }>;
199
+ /**
200
+ * The permissions to POST for a draft, once its object exists. Idempotent.
201
+ *
202
+ * Only adds survive: nothing is granted yet, so removals drop out. The creator is left to
203
+ * the backend — a draft that named them could also drop them.
204
+ */
205
+ export declare function draftToPermissions(draft: IObjectShareDraft): IGranularAccessGrantee[];
250
206
  /** Stable empty-labels default so the hook's default arg doesn't churn identities. */
251
207
  export declare const NO_LABELS: IObjectShareLabel[];
252
208
  /** Shared empty id-set for "no labels in scope" diffs. */
@@ -1 +1 @@
1
- {"version":3,"file":"objectShareController.helpers.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objectShareController.helpers.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.helpers.ts"],"names":[],"mappings":"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"}
@@ -438,6 +438,29 @@ export function buildLabelMutationsForScopes(changes, labels) {
438
438
  }
439
439
  return Array.from(byLabel.values());
440
440
  }
441
+ /**
442
+ * The permissions to POST for a draft, once its object exists. Idempotent.
443
+ *
444
+ * Only adds survive: nothing is granted yet, so removals drop out. The creator is left to
445
+ * the backend — a draft that named them could also drop them.
446
+ */
447
+ export function draftToPermissions(draft) {
448
+ const permissions = [];
449
+ for (const edit of Object.values(draft.granteeEdits)) {
450
+ // Only `added` can reach here: the other kinds need a fetched row, and there is none.
451
+ if (edit.kind === "added") {
452
+ permissions.push(toGranularGrantee(edit.grantee.kind, edit.grantee.granteeRef, edit.grantee.level));
453
+ }
454
+ }
455
+ const { ruleEdit } = draft;
456
+ if (ruleEdit?.generalAccess === "WORKSPACE") {
457
+ permissions.push(granularGranteeFor({ allWorkspaceUsers: true }, ruleEdit.level));
458
+ }
459
+ else if (ruleEdit?.generalAccess === "RESTRICTED") {
460
+ permissions.push(granularGranteeFor({ allWorkspaceUsers: true }, "none"));
461
+ }
462
+ return permissions;
463
+ }
441
464
  /** Stable empty-labels default so the hook's default arg doesn't churn identities. */
442
465
  export const NO_LABELS = [];
443
466
  /** Shared empty id-set for "no labels in scope" diffs. */
@@ -47,15 +47,15 @@ export interface IObjectShareGrantee extends IGranteeIdentityFacts {
47
47
  */
48
48
  isSelf?: boolean;
49
49
  /**
50
- * EFFECTIVE permission level shown on the row — the stronger of {@link directLevel}
51
- * and {@link inheritedLevel}, so a grantee who only inherits a level is not
50
+ * EFFECTIVE permission level shown on the row — the stronger of {@link IObjectShareGrantee.directLevel}
51
+ * and {@link IObjectShareGrantee.inheritedLevel}, so a grantee who only inherits a level is not
52
52
  * understated as VIEW.
53
53
  */
54
54
  level: ObjectSharePermissionLevel;
55
55
  /**
56
56
  * Permission level granted by THIS workspace, or undefined when the grantee's
57
57
  * access is inherited-only (a group, or a parent workspace in a hierarchy).
58
- * This — not {@link level} — is what a re-grade writes and what decides whether
58
+ * This — not {@link IObjectShareGrantee.level} — is what a re-grade writes and what decides whether
59
59
  * there is a grant here to remove: inherited access cannot be revoked from here.
60
60
  */
61
61
  directLevel?: ObjectSharePermissionLevel;
@@ -245,12 +245,73 @@ export interface IObjectShareControllerActions {
245
245
  */
246
246
  changeWorkspaceLevel: (level: ObjectSharePermissionLevel) => Promise<void>;
247
247
  }
248
+ /**
249
+ * A transient edit overlaid on a fetched grantee row (keyed by grantee id in
250
+ * `mergeGrantees`). The pending-guard keeps at most one edit in flight per id.
251
+ * A pending edit that superseded an already-COMMITTED entry (an added row, an
252
+ * earlier level change) carries it as `settled`, because the fetched base no longer
253
+ * holds that row's last-settled state: failure restores `settled`, success drops it.
254
+ * With no `settled`, failure deletes the entry, reverting to the fetched row.
255
+ *
256
+ * @internal
257
+ */
258
+ export type GranteeEdit = {
259
+ kind: "level";
260
+ level: ObjectSharePermissionLevel;
261
+ pending: boolean;
262
+ settled?: GranteeEdit;
263
+ } | {
264
+ kind: "added";
265
+ grantee: IObjectShareGrantee;
266
+ pending: boolean;
267
+ settled?: GranteeEdit;
268
+ } | {
269
+ kind: "removed";
270
+ pending: boolean;
271
+ settled?: GranteeEdit;
272
+ }
273
+ /**
274
+ * Pending marker only — the row renders exactly as it stands. For a write that
275
+ * locks the row without changing its access (a label-scope edit), so nothing has
276
+ * to invent a level: reusing the `level` overlay would record the DISPLAYED level
277
+ * as the direct grant, and that level is the effective one.
278
+ */
279
+ | {
280
+ kind: "locked";
281
+ pending: boolean;
282
+ settled?: GranteeEdit;
283
+ };
284
+ /**
285
+ * Transient edit of the all-workspace-users rule (general access + its level),
286
+ * overlaid on the fetched rule state in the hook. Same lifecycle and `settled`
287
+ * semantics as {@link GranteeEdit}, one edit in flight at a time.
288
+ *
289
+ * @internal
290
+ */
291
+ export interface IRuleEdit {
292
+ generalAccess: GeneralAccessValue;
293
+ level: ObjectSharePermissionLevel;
294
+ pending: boolean;
295
+ /** The committed rule edit this pending one superseded; restored on failure. */
296
+ settled?: IRuleEdit;
297
+ }
298
+ /**
299
+ * Unsaved access for an object that does not exist yet.
300
+ *
301
+ * @internal
302
+ */
303
+ export interface IObjectShareDraft {
304
+ granteeEdits: Readonly<Record<string, GranteeEdit>>;
305
+ ruleEdit: IRuleEdit | undefined;
306
+ }
248
307
  /**
249
308
  * @internal
250
309
  */
251
310
  export interface IObjectShareController {
252
311
  state: IObjectShareControllerState;
253
312
  actions: IObjectShareControllerActions;
313
+ /** The session's unsaved access. Undefined outside draft mode. */
314
+ draft: IObjectShareDraft | undefined;
254
315
  }
255
316
  /**
256
317
  * Options for {@link useObjectShareController}.
@@ -276,5 +337,17 @@ export interface IUseObjectShareOptions {
276
337
  * the labels aren't passed yet, so an empty list must not read as label-free.
277
338
  */
278
339
  labelsLoading?: boolean;
340
+ /**
341
+ * Manage access for an object that does not exist yet. Nothing is written.
342
+ * Requires no `target`, and `labels` is ignored.
343
+ */
344
+ draft?: boolean;
345
+ /** Draft to carry on from. */
346
+ initialDraft?: IObjectShareDraft;
347
+ /**
348
+ * What a draft's general access starts as; an untouched default is never sent.
349
+ * Defaults to RESTRICTED, understating rather than overstating actual access.
350
+ */
351
+ initialDraftGeneralAccess?: GeneralAccessValue;
279
352
  }
280
353
  //# sourceMappingURL=objectShareController.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"objectShareController.types.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objectShareController.types.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEzG,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IAClC,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,qBAAqB;IACxD,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAC9D,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,KAAK,EAAE,0BAA0B,CAAC;IAClC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,0BAA0B,CAAC;IACzC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAC5C;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5D,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC;;;;;OAKG;IACH,yBAAyB,EAAE,0BAA0B,EAAE,GAAG,SAAS,CAAC;IACpE;;;;OAIG;IACH,uBAAuB,EAAE,0BAA0B,EAAE,GAAG,SAAS,CAAC;IAClE;;;;;;OAMG;IACH,uBAAuB,EAAE,0BAA0B,EAAE,GAAG,SAAS,CAAC;IAClE;;;;;;OAMG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B;;;;;;;;OAQG;IACH,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3D,aAAa,EAAE,kBAAkB,CAAC;IAClC;;;;OAIG;IACH,cAAc,EAAE,0BAA0B,CAAC;IAC3C;;;;;;OAMG;IACH,uBAAuB,EAAE,0BAA0B,GAAG,SAAS,CAAC;IAChE;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;;;OAOG;IACH,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD;;;;;;OAMG;IACH,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,mEAAiE;IACjE,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C,qEAAqE;IACrE,eAAe,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACvD;;;;OAIG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACjE,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,oEAAoE;IACpE,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,oCAAoC;IACpC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;OAGG;IACH,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF,+DAA+D;IAC/D,0BAA0B,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/D,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,4DAA4D;IAC5D,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD;;;;;OAKG;IACH,oBAAoB,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,0BAA0B,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,GAC7F;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE;AAC9D;;;;;GAKG;GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACtB,aAAa,EAAE,kBAAkB,CAAC;IAClC,KAAK,EAAE,0BAA0B,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,gFAAgF;IAChF,OAAO,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACpD,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,2BAA2B,CAAC;IACnC,OAAO,EAAE,6BAA6B,CAAC;IACvC,kEAAkE;IAClE,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;CAClD"}
@@ -2,8 +2,7 @@ import { type IObjectPermissionsObject } from "@gooddata/sdk-backend-spi";
2
2
  import { type IGranularAccessGrantee } from "@gooddata/sdk-model";
3
3
  import { type GoodDataSdkError } from "@gooddata/sdk-ui";
4
4
  import { type GeneralAccessValue, type IUiGranteeAsyncOptions } from "@gooddata/sdk-ui-kit";
5
- import { type IRuleEdit } from "./objectShareController.helpers.js";
6
- import type { IObjectShareControllerState, IObjectShareGrantee, ISelfIdentity, ObjectSharePermissionLevel } from "./objectShareController.types.js";
5
+ import type { IObjectShareControllerState, IObjectShareDraft, IObjectShareGrantee, IRuleEdit, ISelfIdentity, ObjectSharePermissionLevel } from "./objectShareController.types.js";
7
6
  import type { IObjectAccessSummary } from "./types.js";
8
7
  /**
9
8
  * The owned access list for {@link useObjectShareController}.
@@ -104,6 +103,18 @@ export interface IAccessList {
104
103
  settleRuleEdit: () => void;
105
104
  /** Revert the rule edit after a failed write: the superseded committed edit, or the fetch. */
106
105
  failRuleEdit: () => void;
106
+ /** The overlay as a draft. Only meaningful in draft mode. */
107
+ draft: IObjectShareDraft;
108
+ }
109
+ /**
110
+ * Draft-mode inputs. See {@link IUseObjectShareOptions} for what each one means.
111
+ *
112
+ * @internal
113
+ */
114
+ export interface IAccessListDraftOptions {
115
+ draft?: boolean;
116
+ initialDraft?: IObjectShareDraft;
117
+ initialDraftGeneralAccess?: GeneralAccessValue;
107
118
  }
108
119
  /**
109
120
  * Owns the backend access list for ONE dialog session: the hook is mounted while
@@ -122,5 +133,5 @@ export interface IAccessList {
122
133
  *
123
134
  * @internal
124
135
  */
125
- export declare function useAccessList(target: IObjectPermissionsObject | undefined): IAccessList;
136
+ export declare function useAccessList(target: IObjectPermissionsObject | undefined, draftOptions?: IAccessListDraftOptions): IAccessList;
126
137
  //# sourceMappingURL=useAccessList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAccessList.d.ts","sourceRoot":"","sources":["../../src/share/useAccessList.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,wBAAwB,EAAiC,MAAM,2BAA2B,CAAC;AACzG,OAAO,EACH,KAAK,sBAAsB,EAM9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAmB,MAAM,sBAAsB,CAAC;AAU7G,OAAO,EAEH,KAAK,SAAS,EASjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACR,2BAA2B,EAC3B,mBAAmB,EACnB,aAAa,EACb,0BAA0B,EAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC;;;;;;;;;OASG;IACH,kBAAkB,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,EAAE,kBAAkB,CAAC;IAClC,oFAAkF;IAClF,cAAc,EAAE,0BAA0B,CAAC;IAC3C;;;OAGG;IACH,uBAAuB,EAAE,0BAA0B,GAAG,SAAS,CAAC;IAChE,wFAAwF;IACxF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iFAAiF;IACjF,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,qDAAqD;IACrD,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9C,mDAAmD;IACnD,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAExC,mFAAmF;IACnF,MAAM,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,+FAA6F;IAC7F,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEjE;;;;OAIG;IACH,eAAe,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxD;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC3E;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,iEAAiE;IACjE,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtC,oFAAoF;IACpF,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IAC1D,6DAA6D;IAC7D,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,8FAA8F;IAC9F,YAAY,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,GAAG,WAAW,CAsUvF"}
1
+ {"version":3,"file":"useAccessList.d.ts","sourceRoot":"","sources":["../../src/share/useAccessList.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,wBAAwB,EAAiC,MAAM,2BAA2B,CAAC;AACzG,OAAO,EACH,KAAK,sBAAsB,EAM9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAmB,MAAM,sBAAsB,CAAC;AAoB7G,OAAO,KAAK,EAER,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,0BAA0B,EAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,6EAA6E;IAC7E,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC;;;;;;;;;OASG;IACH,kBAAkB,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,EAAE,kBAAkB,CAAC;IAClC,oFAAkF;IAClF,cAAc,EAAE,0BAA0B,CAAC;IAC3C;;;OAGG;IACH,uBAAuB,EAAE,0BAA0B,GAAG,SAAS,CAAC;IAChE,wFAAwF;IACxF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iFAAiF;IACjF,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,qDAAqD;IACrD,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9C,mDAAmD;IACnD,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAExC,mFAAmF;IACnF,MAAM,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/F,+FAA6F;IAC7F,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEjE;;;;OAIG;IACH,eAAe,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxD;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC3E;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gFAAgF;IAChF,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,iEAAiE;IACjE,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtC,oFAAoF;IACpF,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IAC1D,6DAA6D;IAC7D,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,8FAA8F;IAC9F,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,6DAA6D;IAC7D,KAAK,EAAE,iBAAiB,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;CAClD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,YAAY,GAAE,uBAA4B,GAC3C,WAAW,CAiWb"}
@@ -24,13 +24,16 @@ import { assigneeIdentityFacts, assigneeMatchesQuery, granteeId, granteesFromAcc
24
24
  *
25
25
  * @internal
26
26
  */
27
- export function useAccessList(target) {
27
+ export function useAccessList(target, draftOptions = {}) {
28
+ const { draft = false, initialDraft, initialDraftGeneralAccess = "RESTRICTED" } = draftOptions;
28
29
  const backend = useBackendStrict();
29
30
  const workspace = useWorkspaceStrict();
30
31
  const toast = useToastMessage();
31
32
  // The only local state: the transient edit overlay. Everything else is derived.
32
- const [granteeEdits, setGranteeEdits] = useState({});
33
- const [ruleEdit, setRuleEditState] = useState(undefined);
33
+ // Seeded in draft mode only, so reopening carries on. A live session derives from the
34
+ // fetched list; overlaying a draft on it would show rows the object does not have.
35
+ const [granteeEdits, setGranteeEdits] = useState(() => draft ? (initialDraft?.granteeEdits ?? {}) : {});
36
+ const [ruleEdit, setRuleEditState] = useState(() => draft ? initialDraft?.ruleEdit : undefined);
34
37
  // Serialized so an inline idRef(...) — a new object each render — doesn't refetch forever.
35
38
  const fetchKey = target ? `${workspace}:${target.kind}:${serializeObjRef(target.ref)}` : undefined;
36
39
  const { result: fetchedList, status: fetchStatus, error: fetchError, } = useCancelablePromise({
@@ -75,7 +78,10 @@ export function useAccessList(target) {
75
78
  }
76
79
  : undefined, [currentUser]);
77
80
  const grantees = useMemo(() => mergeGrantees(base, granteeEdits, selfId, selfIdentity), [base, granteeEdits, selfId, selfIdentity]);
78
- const generalAccess = ruleEdit?.generalAccess ?? deriveGeneralAccess(fetchedList?.grants ?? []);
81
+ // A draft has no list to derive from, so the consumer says where it starts. Untouched
82
+ // leaves `ruleEdit` undefined, so nothing is sent.
83
+ const generalAccess = ruleEdit?.generalAccess ??
84
+ (draft ? initialDraftGeneralAccess : deriveGeneralAccess(fetchedList?.grants ?? []));
79
85
  const workspaceLevel = ruleEdit?.level ?? deriveWorkspacePermissionLevel(fetchedList?.grants ?? []);
80
86
  const workspaceLevelSaving = ruleEdit?.pending ?? false;
81
87
  const workspaceInheritedLevel = useMemo(() => deriveInheritedWorkspaceLevel(fetchedList?.grants ?? []), [fetchedList]);
@@ -94,6 +100,11 @@ export function useAccessList(target) {
94
100
  }, [hasList, generalAccess, workspaceLevel, workspaceInheritedLevel, granteeCount]);
95
101
  // "success" waits for `hasList` so consumers never see success with nothing to show.
96
102
  const deriveStatus = () => {
103
+ if (draft) {
104
+ // Nothing to fetch: a non-existent object holds no grants. Waits only for the
105
+ // profile, and a failed one still settles — `loading` would never end.
106
+ return currentUserStatus === "loading" || currentUserStatus === "pending" ? "loading" : "success";
107
+ }
97
108
  if (!target) {
98
109
  return "idle";
99
110
  }
@@ -107,6 +118,10 @@ export function useAccessList(target) {
107
118
  const loadError = useMemo(() => (fetchStatus === "error" ? convertError(fetchError) : undefined), [fetchStatus, fetchError]);
108
119
  // The caller owns the optimistic overlay write and its rollback; there is no refetch.
109
120
  const commit = useCallback(async (mutate, successMessage) => {
121
+ if (draft) {
122
+ // No write, by design. Success so the caller settles its overlay entry.
123
+ return true;
124
+ }
110
125
  if (!target) {
111
126
  return false;
112
127
  }
@@ -125,7 +140,7 @@ export function useAccessList(target) {
125
140
  : objectShareMessages.toastError);
126
141
  return false;
127
142
  }
128
- }, [backend, workspace, target, toast]);
143
+ }, [backend, workspace, target, toast, draft]);
129
144
  // Ids the picker excludes as already-granted — INCLUDING rows whose removal is
130
145
  // still in flight: offering those would let a re-add overlap the pending revoke
131
146
  // on one id, and the settle/fail finalizers act on the id's current overlay
@@ -134,7 +149,8 @@ export function useAccessList(target) {
134
149
  const excludedIds = useMemo(() => new Set(grantees.map((g) => g.id)), [grantees]);
135
150
  // Each option carries its backend `ref` so the add flow grants against the exact ref.
136
151
  const loadOptions = useCallback(async (search) => {
137
- if (!target) {
152
+ // Candidates are the workspace's, so a draft needs no target to list them.
153
+ if (!target && !draft) {
138
154
  return { groups: [], users: [] };
139
155
  }
140
156
  const assignees = await backend
@@ -164,7 +180,7 @@ export function useAccessList(target) {
164
180
  }
165
181
  }
166
182
  return { users, groups };
167
- }, [backend, workspace, target, excludedIds]);
183
+ }, [backend, workspace, target, excludedIds, draft]);
168
184
  const applyGranteeAdd = useCallback((grantee) => {
169
185
  setGranteeEdits((prev) => {
170
186
  const current = prev[grantee.id];
@@ -255,7 +271,10 @@ export function useAccessList(target) {
255
271
  const failRuleEdit = useCallback(() => {
256
272
  setRuleEditState((current) => current?.settled);
257
273
  }, []);
274
+ // Memoized so the identity changes only when the edits do.
275
+ const draftValue = useMemo(() => ({ granteeEdits, ruleEdit }), [granteeEdits, ruleEdit]);
258
276
  return {
277
+ draft: draftValue,
259
278
  hasList,
260
279
  grantees,
261
280
  seededWithoutSelfGrant,
@@ -0,0 +1,13 @@
1
+ import type { IObjectPermissionsObject } from "@gooddata/sdk-backend-spi";
2
+ import type { IObjectShareDraft } from "./objectShareController.types.js";
3
+ /**
4
+ * Writes a draft's access to an object that now exists.
5
+ *
6
+ * @remarks
7
+ * One request, so it all lands or none does. True when it landed or asked for nothing,
8
+ * false when it failed — nothing is shown to the user.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare function useApplyObjectPermissions(): (target: IObjectPermissionsObject, draft: IObjectShareDraft) => Promise<boolean>;
13
+ //# sourceMappingURL=useApplyObjectPermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApplyObjectPermissions.d.ts","sourceRoot":"","sources":["../../src/share/useApplyObjectPermissions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAI1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,CACzC,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,iBAAiB,KACvB,OAAO,CAAC,OAAO,CAAC,CAsBpB"}
@@ -0,0 +1,33 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useCallback } from "react";
3
+ import { useBackendStrict, useWorkspaceStrict } from "@gooddata/sdk-ui";
4
+ import { draftToPermissions } from "./objectShareController.helpers.js";
5
+ /**
6
+ * Writes a draft's access to an object that now exists.
7
+ *
8
+ * @remarks
9
+ * One request, so it all lands or none does. True when it landed or asked for nothing,
10
+ * false when it failed — nothing is shown to the user.
11
+ *
12
+ * @internal
13
+ */
14
+ export function useApplyObjectPermissions() {
15
+ const backend = useBackendStrict();
16
+ const workspace = useWorkspaceStrict();
17
+ return useCallback(async (target, draft) => {
18
+ const permissions = draftToPermissions(draft);
19
+ if (permissions.length === 0) {
20
+ return true;
21
+ }
22
+ try {
23
+ await backend
24
+ .workspace(workspace)
25
+ .objectPermissions()
26
+ .manageObjectPermissions(target, permissions);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }, [backend, workspace]);
33
+ }
@@ -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;AAmB1E,OAAO,EACH,KAAK,sBAAsB,EAI3B,KAAK,sBAAsB,EAE9B,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAoyBxB"}
1
+ {"version":3,"file":"useObjectShareController.d.ts","sourceRoot":"","sources":["../../src/share/useObjectShareController.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAmB1E,OAAO,EACH,KAAK,sBAAsB,EAI3B,KAAK,sBAAsB,EAE9B,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAg0BxB"}
@@ -29,13 +29,13 @@ import { useLabelScope } from "./useLabelScope.js";
29
29
  * @internal
30
30
  */
31
31
  export function useObjectShareController(target, options) {
32
- const { labels = NO_LABELS, labelsError = false, labelsLoading = false } = options ?? {};
32
+ const { labels = NO_LABELS, labelsError = false, labelsLoading = false, draft = false, initialDraft, initialDraftGeneralAccess, } = options ?? {};
33
33
  const toast = useToastMessage();
34
34
  // UI-local buffers — never backend data.
35
35
  const [subview, setSubview] = useState("main");
36
36
  const [pendingGrantees, setPendingGrantees] = useState([]);
37
37
  const [pendingGeneralAccess, setPendingGeneralAccess] = useState(undefined);
38
- const { hasList, grantees, seededWithoutSelfGrant, seededRuleShareCapable, selfIdentity, isWorkspaceManager, selfIdentityResolved, generalAccess, workspaceLevel, workspaceInheritedLevel, workspaceLevelSaving, summary, status, loadError, commit, loadOptions, applyGranteeAdd, applyGranteeLevel, applyGranteeLock, applyGranteeRemove, settleGranteeEdit, failGranteeEdit, applyRuleEdit, settleRuleEdit, failRuleEdit, } = useAccessList(target);
38
+ const { hasList, grantees, seededWithoutSelfGrant, seededRuleShareCapable, selfIdentity, isWorkspaceManager, selfIdentityResolved, generalAccess, workspaceLevel, workspaceInheritedLevel, workspaceLevelSaving, summary, status, loadError, commit, loadOptions, applyGranteeAdd, applyGranteeLevel, applyGranteeLock, applyGranteeRemove, settleGranteeEdit, failGranteeEdit, applyRuleEdit, settleRuleEdit, failRuleEdit, draft: draftValue, } = useAccessList(target, { draft, initialDraft, initialDraftGeneralAccess });
39
39
  // Grantee ids the label-scope probe resolves against — a removing row is excluded
40
40
  // so its scope is dropped, not re-seeded.
41
41
  const committedGranteeIds = useMemo(() => {
@@ -48,7 +48,13 @@ export function useObjectShareController(target, options) {
48
48
  return ids;
49
49
  }, [grantees]);
50
50
  // Per-label scope resolution + the single label-write path live in their own hook.
51
- const { effectiveLabels, labelsResolved, labelsInitializing, selectedLabelIdsByGrantee, setSelectedLabelIdsByGrantee, inheritedLabelIdsByGrantee, directLabelIdsByGrantee, recordDirectLabelWrites, forgetGranteeLabels, reconcileLabelScope, reconcileLabelScopes, regradeLabelScope, } = useLabelScope(target, labels, hasList, committedGranteeIds, labelsError, labelsLoading);
51
+ // Label grants are written as they change, which a draft cannot allow. Reporting none
52
+ // switches that path off; labels never resolve without a target and would lock the UI.
53
+ const draftLabels = draft ? NO_LABELS : labels;
54
+ // The flags go with the labels: either left true would disable every control forever.
55
+ const draftLabelsError = draft ? false : labelsError;
56
+ const draftLabelsLoading = draft ? false : labelsLoading;
57
+ const { effectiveLabels, labelsResolved, labelsInitializing, selectedLabelIdsByGrantee, setSelectedLabelIdsByGrantee, inheritedLabelIdsByGrantee, directLabelIdsByGrantee, recordDirectLabelWrites, forgetGranteeLabels, reconcileLabelScope, reconcileLabelScopes, regradeLabelScope, } = useLabelScope(target, draftLabels, hasList, committedGranteeIds, draftLabelsError, draftLabelsLoading);
52
58
  // The labels THIS workspace granted — the only ones a write may touch. Read straight
53
59
  // from the tracked direct set rather than subtracting "inherited" from the scope: the
54
60
  // subtraction relied on the probe still describing our own grants, and after a revoke it
@@ -627,11 +633,13 @@ export function useObjectShareController(target, options) {
627
633
  // adding a grantee hides it and removing the last one brings it back.
628
634
  // A share-capable rule also passes the gate, judged from the SEED. A group
629
635
  // grant is another way in this cannot see: the heuristic's accepted blind spot.
630
- const adminSelfRow = status === "success" &&
631
- seededWithoutSelfGrant &&
632
- grantees.length === 0 &&
633
- !seededRuleShareCapable &&
634
- selfIdentity
636
+ //
637
+ // A draft has no list to infer from, so it asks the workspace permission instead.
638
+ // `=== true` so an unread permission is not reported as Admin.
639
+ const explainsAccessWithoutAGrant = draft
640
+ ? isWorkspaceManager === true
641
+ : status === "success" && seededWithoutSelfGrant && !seededRuleShareCapable;
642
+ const adminSelfRow = explainsAccessWithoutAGrant && grantees.length === 0 && selfIdentity
635
643
  ? userDisplayPair(selfIdentity, selfIdentity.id)
636
644
  : undefined;
637
645
  return {
@@ -668,6 +676,7 @@ export function useObjectShareController(target, options) {
668
676
  selfIdentity,
669
677
  selfIdentityResolved,
670
678
  isWorkspaceManager,
679
+ draft,
671
680
  seededWithoutSelfGrant,
672
681
  seededRuleShareCapable,
673
682
  grantees,
@@ -684,5 +693,7 @@ export function useObjectShareController(target, options) {
684
693
  pendingGeneralAccess,
685
694
  pendingGrantees,
686
695
  ]);
687
- return useMemo(() => ({ state, actions }), [state, actions]);
696
+ // Undefined outside draft mode, so an empty draft is not mistaken for a real one.
697
+ const reportedDraft = draft ? draftValue : undefined;
698
+ return useMemo(() => ({ state, actions, draft: reportedDraft }), [state, actions, reportedDraft]);
688
699
  }