@gooddata/sdk-ui-ext 11.47.0-alpha.4 → 11.47.0-alpha.5

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 (98) hide show
  1. package/esm/internal/components/BaseVisualization.d.ts +4 -0
  2. package/esm/internal/components/BaseVisualization.d.ts.map +1 -1
  3. package/esm/internal/components/BaseVisualization.js +1 -0
  4. package/esm/internal/components/pluggableVisualizations/baseChart/PluggableBaseChart.d.ts.map +1 -1
  5. package/esm/internal/components/pluggableVisualizations/baseChart/PluggableBaseChart.js +2 -2
  6. package/esm/internal/interfaces/Visualization.d.ts +4 -0
  7. package/esm/internal/interfaces/Visualization.d.ts.map +1 -1
  8. package/esm/internal/translations/de-DE.localization-bundle.d.ts +2 -0
  9. package/esm/internal/translations/de-DE.localization-bundle.d.ts.map +1 -1
  10. package/esm/internal/translations/de-DE.localization-bundle.js +2 -0
  11. package/esm/internal/translations/en-AU.localization-bundle.d.ts +2 -0
  12. package/esm/internal/translations/en-AU.localization-bundle.d.ts.map +1 -1
  13. package/esm/internal/translations/en-AU.localization-bundle.js +2 -0
  14. package/esm/internal/translations/en-GB.localization-bundle.d.ts +2 -0
  15. package/esm/internal/translations/en-GB.localization-bundle.d.ts.map +1 -1
  16. package/esm/internal/translations/en-GB.localization-bundle.js +2 -0
  17. package/esm/internal/translations/es-419.localization-bundle.d.ts +2 -0
  18. package/esm/internal/translations/es-419.localization-bundle.d.ts.map +1 -1
  19. package/esm/internal/translations/es-419.localization-bundle.js +2 -0
  20. package/esm/internal/translations/es-ES.localization-bundle.d.ts +2 -0
  21. package/esm/internal/translations/es-ES.localization-bundle.d.ts.map +1 -1
  22. package/esm/internal/translations/es-ES.localization-bundle.js +2 -0
  23. package/esm/internal/translations/fi-FI.localization-bundle.d.ts +2 -0
  24. package/esm/internal/translations/fi-FI.localization-bundle.d.ts.map +1 -1
  25. package/esm/internal/translations/fi-FI.localization-bundle.js +2 -0
  26. package/esm/internal/translations/fr-CA.localization-bundle.d.ts +2 -0
  27. package/esm/internal/translations/fr-CA.localization-bundle.d.ts.map +1 -1
  28. package/esm/internal/translations/fr-CA.localization-bundle.js +2 -0
  29. package/esm/internal/translations/fr-FR.localization-bundle.d.ts +2 -0
  30. package/esm/internal/translations/fr-FR.localization-bundle.d.ts.map +1 -1
  31. package/esm/internal/translations/fr-FR.localization-bundle.js +2 -0
  32. package/esm/internal/translations/id-ID.localization-bundle.d.ts +2 -0
  33. package/esm/internal/translations/id-ID.localization-bundle.d.ts.map +1 -1
  34. package/esm/internal/translations/id-ID.localization-bundle.js +2 -0
  35. package/esm/internal/translations/it-IT.localization-bundle.d.ts +2 -0
  36. package/esm/internal/translations/it-IT.localization-bundle.d.ts.map +1 -1
  37. package/esm/internal/translations/it-IT.localization-bundle.js +2 -0
  38. package/esm/internal/translations/ja-JP.localization-bundle.d.ts +2 -0
  39. package/esm/internal/translations/ja-JP.localization-bundle.d.ts.map +1 -1
  40. package/esm/internal/translations/ja-JP.localization-bundle.js +2 -0
  41. package/esm/internal/translations/ko-KR.localization-bundle.d.ts +2 -0
  42. package/esm/internal/translations/ko-KR.localization-bundle.d.ts.map +1 -1
  43. package/esm/internal/translations/ko-KR.localization-bundle.js +2 -0
  44. package/esm/internal/translations/nl-NL.localization-bundle.d.ts +2 -0
  45. package/esm/internal/translations/nl-NL.localization-bundle.d.ts.map +1 -1
  46. package/esm/internal/translations/nl-NL.localization-bundle.js +2 -0
  47. package/esm/internal/translations/pl-PL.localization-bundle.d.ts +2 -0
  48. package/esm/internal/translations/pl-PL.localization-bundle.d.ts.map +1 -1
  49. package/esm/internal/translations/pl-PL.localization-bundle.js +2 -0
  50. package/esm/internal/translations/pt-BR.localization-bundle.d.ts +2 -0
  51. package/esm/internal/translations/pt-BR.localization-bundle.d.ts.map +1 -1
  52. package/esm/internal/translations/pt-BR.localization-bundle.js +2 -0
  53. package/esm/internal/translations/pt-PT.localization-bundle.d.ts +2 -0
  54. package/esm/internal/translations/pt-PT.localization-bundle.d.ts.map +1 -1
  55. package/esm/internal/translations/pt-PT.localization-bundle.js +2 -0
  56. package/esm/internal/translations/ru-RU.localization-bundle.d.ts +2 -0
  57. package/esm/internal/translations/ru-RU.localization-bundle.d.ts.map +1 -1
  58. package/esm/internal/translations/ru-RU.localization-bundle.js +2 -0
  59. package/esm/internal/translations/sl-SI.localization-bundle.d.ts +2 -0
  60. package/esm/internal/translations/sl-SI.localization-bundle.d.ts.map +1 -1
  61. package/esm/internal/translations/sl-SI.localization-bundle.js +2 -0
  62. package/esm/internal/translations/th-TH.localization-bundle.d.ts +2 -0
  63. package/esm/internal/translations/th-TH.localization-bundle.d.ts.map +1 -1
  64. package/esm/internal/translations/th-TH.localization-bundle.js +2 -0
  65. package/esm/internal/translations/tr-TR.localization-bundle.d.ts +2 -0
  66. package/esm/internal/translations/tr-TR.localization-bundle.d.ts.map +1 -1
  67. package/esm/internal/translations/tr-TR.localization-bundle.js +2 -0
  68. package/esm/internal/translations/uk-UA.localization-bundle.d.ts +2 -0
  69. package/esm/internal/translations/uk-UA.localization-bundle.d.ts.map +1 -1
  70. package/esm/internal/translations/uk-UA.localization-bundle.js +2 -0
  71. package/esm/internal/translations/vi-VN.localization-bundle.d.ts +2 -0
  72. package/esm/internal/translations/vi-VN.localization-bundle.d.ts.map +1 -1
  73. package/esm/internal/translations/vi-VN.localization-bundle.js +2 -0
  74. package/esm/internal/translations/zh-HK.localization-bundle.d.ts +2 -0
  75. package/esm/internal/translations/zh-HK.localization-bundle.d.ts.map +1 -1
  76. package/esm/internal/translations/zh-HK.localization-bundle.js +2 -0
  77. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts +2 -0
  78. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts.map +1 -1
  79. package/esm/internal/translations/zh-Hans.localization-bundle.js +2 -0
  80. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts +2 -0
  81. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts.map +1 -1
  82. package/esm/internal/translations/zh-Hant.localization-bundle.js +2 -0
  83. package/esm/internal/utils/translations.d.ts.map +1 -1
  84. package/esm/internal/utils/translations.js +12 -4
  85. package/esm/sdk-ui-ext.d.ts +14 -0
  86. package/esm/share/ObjectShareDialog.d.ts.map +1 -1
  87. package/esm/share/ObjectShareDialog.js +7 -2
  88. package/esm/share/accessSummary.d.ts +31 -9
  89. package/esm/share/accessSummary.d.ts.map +1 -1
  90. package/esm/share/accessSummary.js +45 -14
  91. package/esm/share/objectShareController.types.d.ts +14 -0
  92. package/esm/share/objectShareController.types.d.ts.map +1 -1
  93. package/esm/share/useAccessList.d.ts +13 -1
  94. package/esm/share/useAccessList.d.ts.map +1 -1
  95. package/esm/share/useAccessList.js +8 -4
  96. package/esm/share/useObjectShareController.d.ts.map +1 -1
  97. package/esm/share/useObjectShareController.js +38 -11
  98. package/package.json +21 -21
@@ -1,26 +1,57 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  /**
3
- * Find the `allWorkspaceUsers` rule grant if one exists. Its presence with
4
- * non-empty `permissions` is the single signal that distinguishes WORKSPACE
5
- * from RESTRICTED general access.
3
+ * All `allWorkspaceUsers` rule grants. With workspace hierarchy the backend
4
+ * returns one entry per granting workspace this workspace's own grant carries
5
+ * direct `permissions` while a parent's carries `inheritedPermissions`, in
6
+ * unspecified order. Callers must aggregate across entries, never inspect just
7
+ * the first.
6
8
  */
7
- export function findAllWorkspaceUsersGrant(grants) {
8
- return grants.find((g) => g.type === "allWorkspaceUsers");
9
+ export function findAllWorkspaceUsersGrants(grants) {
10
+ return grants.filter((g) => g.type === "allWorkspaceUsers");
9
11
  }
12
+ /**
13
+ * Whether THIS workspace grants access to all workspace users — some rule entry
14
+ * with non-empty direct `permissions`. Inherited (parent-workspace) rule access
15
+ * is deliberately excluded: this value backs the mutable direct state; displays
16
+ * compose it with {@link deriveInheritedWorkspaceLevel}.
17
+ */
10
18
  export function deriveGeneralAccess(grants) {
11
- const rule = findAllWorkspaceUsersGrant(grants);
12
- return rule && rule.permissions.length > 0 ? "WORKSPACE" : "RESTRICTED";
19
+ return findAllWorkspaceUsersGrants(grants).some((rule) => rule.permissions.length > 0)
20
+ ? "WORKSPACE"
21
+ : "RESTRICTED";
13
22
  }
14
23
  /**
15
- * Workspace-wide permission level when the rule grant exists. Defaults to
16
- * VIEW; promoted to SHARE only when the rule explicitly permits SHARE. EDIT
17
- * is intentionally not surfaced — the UI caps at VIEW/SHARE.
24
+ * Workspace-wide permission level of this workspace's own rule grant. Defaults
25
+ * to VIEW; promoted to SHARE only when some rule entry directly permits SHARE.
26
+ * EDIT is intentionally not surfaced — the UI caps at VIEW/SHARE.
18
27
  */
19
28
  export function deriveWorkspacePermissionLevel(grants) {
20
- const rule = findAllWorkspaceUsersGrant(grants);
21
- return rule?.permissions.includes("SHARE") ? "SHARE" : "VIEW";
29
+ return findAllWorkspaceUsersGrants(grants).some((rule) => rule.permissions.includes("SHARE"))
30
+ ? "SHARE"
31
+ : "VIEW";
32
+ }
33
+ /**
34
+ * Strongest workspace-wide level inherited from parent workspaces, or undefined
35
+ * when none is inherited. Inherited rule access grants every user of this
36
+ * workspace access too (workspace membership cascades down the hierarchy), yet
37
+ * cannot be revoked from here — consumers must surface it as workspace access
38
+ * and disable the Restricted option.
39
+ */
40
+ export function deriveInheritedWorkspaceLevel(grants) {
41
+ const inherited = findAllWorkspaceUsersGrants(grants).flatMap((rule) => rule.inheritedPermissions);
42
+ if (inherited.includes("SHARE")) {
43
+ return "SHARE";
44
+ }
45
+ return inherited.length > 0 ? "VIEW" : undefined;
22
46
  }
23
47
  /**
24
- * Count of named grantees (users + user groups). The `allWorkspaceUsers` rule
25
- * grant is excluded.
48
+ * The effective (displayed) workspace access: the direct state composed with
49
+ * inherited rule access. Inherited access makes general access WORKSPACE even
50
+ * when this workspace holds no rule of its own, and the level is the strongest
51
+ * of the two.
26
52
  */
53
+ export function composeEffectiveWorkspaceAccess(direct, directLevel, inheritedLevel) {
54
+ const generalAccess = direct === "WORKSPACE" || inheritedLevel ? "WORKSPACE" : "RESTRICTED";
55
+ const workspaceLevel = inheritedLevel === "SHARE" || (direct === "WORKSPACE" && directLevel === "SHARE") ? "SHARE" : "VIEW";
56
+ return { generalAccess, workspaceLevel };
57
+ }
@@ -80,6 +80,20 @@ export interface IObjectShareControllerState {
80
80
  * never offered for the workspace rule.
81
81
  */
82
82
  workspaceLevel: "VIEW" | "SHARE";
83
+ /**
84
+ * Whether workspace-wide access is (at least partly) inherited from a parent
85
+ * workspace. Inherited rule access grants every user of this workspace access
86
+ * too, yet cannot be revoked from here — consumers disable the Restricted
87
+ * option and explain why. `generalAccess` and `workspaceLevel` are effective
88
+ * values that already account for it.
89
+ */
90
+ workspaceAccessInherited: boolean;
91
+ /**
92
+ * Whether the workspace-rule level dropdown must be read-only: this workspace
93
+ * holds no rule of its own to re-grade (access is inherited-only), or an
94
+ * inherited SHARE pins the effective level regardless of the direct grant.
95
+ */
96
+ workspaceLevelLocked: boolean;
83
97
  /**
84
98
  * Whether a workspace-level re-grade is in flight. Consumers disable the
85
99
  * workspace permission dropdown while true so rapid toggles can't issue
@@ -1 +1 @@
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,EACR,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;;;;GAQG;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,mBAAoB,SAAQ,qBAAqB;IAC9D,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,0BAA0B,CAAC;IAClC;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,mBAAmB,CAAC;IACrD,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC5D,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;;OAMG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAE1C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,aAAa,EAAE,kBAAkB,CAAC;IAClC;;;;;OAKG;IACH,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEpD,mEAAiE;IACjE,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAC1C,qEAAqE;IACrE,eAAe,EAAE,gBAAgB,EAAE,CAAC;IAEpC;;;;OAIG;IACH,cAAc,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClD;;;;OAIG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iEAAiE;IACjE,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,oBAAoB,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,sFAAsF;IACtF,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACvD;;;;;;OAMG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3F,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,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,gEAAgE;IAChE,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,mFAAmF;IACnF,sBAAsB,EAAE,MAAM,IAAI,CAAC;IACnC;;;OAGG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC1D,6DAA6D;IAC7D,yBAAyB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,2BAA2B,CAAC;IACnC,OAAO,EAAE,6BAA6B,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"objectShareController.types.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.types.ts"],"names":[],"mappings":"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"}
@@ -15,10 +15,22 @@ export interface IAccessList {
15
15
  hasList: boolean;
16
16
  /** Local grantee rows — seeded from the fetch, then authoritative; mutations write through. */
17
17
  grantees: IObjectShareGrantee[];
18
- /** Workspace vs restricted general access — local state; mutations write through. */
18
+ /**
19
+ * Workspace vs restricted general access granted by THIS workspace's own rule —
20
+ * local state; mutations write through. Excludes inherited (parent-workspace)
21
+ * rule access, which is exposed separately as `inheritedWorkspaceLevel`.
22
+ */
19
23
  generalAccess: GeneralAccessValue;
20
24
  /** Workspace-rule permission level (VIEW/SHARE) — local state; mutations write through. */
21
25
  workspaceLevel: "VIEW" | "SHARE";
26
+ /**
27
+ * Strongest workspace-wide level inherited from parent workspaces, or undefined
28
+ * when none. Seeded from the fetch and never mutated: inherited access cannot
29
+ * be changed from this workspace, so no write-through applies. Effective
30
+ * (displayed) general access is WORKSPACE whenever this is set, regardless of
31
+ * the direct `generalAccess` state.
32
+ */
33
+ inheritedWorkspaceLevel: "VIEW" | "SHARE" | undefined;
22
34
  /** Inline access summary, or undefined before the first load. */
23
35
  summary: IObjectAccessSummary | undefined;
24
36
  /** Top-level load status surfaced as the controller status. */
@@ -1 +1 @@
1
- {"version":3,"file":"useAccessList.d.ts","sourceRoot":"","sources":["../../src/share/useAccessList.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAEH,KAAK,sBAAsB,EAE3B,KAAK,MAAM,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAmB,MAAM,sBAAsB,CAAC;AAa7G,OAAO,KAAK,EAER,2BAA2B,EAC3B,mBAAmB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,wFAAwF;IACxF,OAAO,EAAE,OAAO,CAAC;IACjB,iGAA+F;IAC/F,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,uFAAqF;IACrF,aAAa,EAAE,kBAAkB,CAAC;IAClC,6FAA2F;IAC3F,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,iEAAiE;IACjE,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,+DAA+D;IAC/D,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9C,iDAAiD;IACjD,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B,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;;;;OAIG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3F;;;;;;;OAOG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC;;;;;;;;OAQG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,2FAA2F;IAC3F,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAEjC,qGAAqG;IACrG,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACzE,8EAA8E;IAC9E,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC3E;;;;OAIG;IACH,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,EACjC,UAAU,EAAE,OAAO,GACpB,WAAW,CAkTb"}
1
+ {"version":3,"file":"useAccessList.d.ts","sourceRoot":"","sources":["../../src/share/useAccessList.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAEH,KAAK,sBAAsB,EAE3B,KAAK,MAAM,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAmB,MAAM,sBAAsB,CAAC;AAkB7G,OAAO,KAAK,EAER,2BAA2B,EAC3B,mBAAmB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,wFAAwF;IACxF,OAAO,EAAE,OAAO,CAAC;IACjB,iGAA+F;IAC/F,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;OAIG;IACH,aAAa,EAAE,kBAAkB,CAAC;IAClC,6FAA2F;IAC3F,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,uBAAuB,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACtD,iEAAiE;IACjE,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,+DAA+D;IAC/D,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC9C,iDAAiD;IACjD,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B,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;;;;OAIG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3F;;;;;;;OAOG;IACH,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC;;;;;;;;OAQG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B,2FAA2F;IAC3F,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAEjC,qGAAqG;IACrG,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACzE,8EAA8E;IAC9E,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC3E;;;;OAIG;IACH,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,EACjC,UAAU,EAAE,OAAO,GACpB,WAAW,CAwTb"}
@@ -4,7 +4,7 @@ import { idRef, objRefToString, } from "@gooddata/sdk-model";
4
4
  import { useBackendStrict, useCancelablePromise, useWorkspaceStrict } from "@gooddata/sdk-ui";
5
5
  import { useToastMessage } from "@gooddata/sdk-ui-kit";
6
6
  import { isPermissionsNotAvailable } from "./accessErrors.js";
7
- import { deriveGeneralAccess, deriveWorkspacePermissionLevel } from "./accessSummary.js";
7
+ import { composeEffectiveWorkspaceAccess, deriveGeneralAccess, deriveInheritedWorkspaceLevel, deriveWorkspacePermissionLevel, } from "./accessSummary.js";
8
8
  import { objectShareMessages } from "./messages.js";
9
9
  import { assigneeIdentityFacts, assigneeMatchesQuery, granteeId, granteesFromAccessList, userDisplayPair, userIdentityFacts, } from "./objectShareController.helpers.js";
10
10
  /**
@@ -30,6 +30,7 @@ export function useAccessList(target, onSaved, dialogOpen) {
30
30
  const [grantees, setGrantees] = useState([]);
31
31
  const [generalAccess, setGeneralAccess] = useState("RESTRICTED");
32
32
  const [workspaceLevel, setWorkspaceLevel] = useState("VIEW");
33
+ const [inheritedWorkspaceLevel, setInheritedWorkspaceLevel] = useState(undefined);
33
34
  // The target the local state was seeded for; undefined until the first seed.
34
35
  // Reading state as belonging to the current target hinges on this matching
35
36
  // `targetKey` — a target switch makes the old state stale until the re-seed.
@@ -82,6 +83,7 @@ export function useAccessList(target, onSaved, dialogOpen) {
82
83
  setGrantees(granteesFromAccessList(fetchedList));
83
84
  setGeneralAccess(deriveGeneralAccess(fetchedList.grants));
84
85
  setWorkspaceLevel(deriveWorkspacePermissionLevel(fetchedList.grants));
86
+ setInheritedWorkspaceLevel(deriveInheritedWorkspaceLevel(fetchedList.grants));
85
87
  setSeededTarget(targetKey);
86
88
  setLoadError(undefined);
87
89
  }
@@ -164,12 +166,13 @@ export function useAccessList(target, onSaved, dialogOpen) {
164
166
  if (!hasList) {
165
167
  return undefined;
166
168
  }
169
+ // The summary shows effective access: an inherited rule counts as
170
+ // workspace access even when this workspace holds no rule of its own.
167
171
  return {
168
- generalAccess,
169
- workspaceLevel: generalAccess === "WORKSPACE" ? workspaceLevel : "VIEW",
172
+ ...composeEffectiveWorkspaceAccess(generalAccess, workspaceLevel, inheritedWorkspaceLevel),
170
173
  granteeCount: namedGrantees.filter((g) => g.pending !== "removing").length,
171
174
  };
172
- }, [hasList, generalAccess, workspaceLevel, namedGrantees]);
175
+ }, [hasList, generalAccess, workspaceLevel, inheritedWorkspaceLevel, namedGrantees]);
173
176
  // "success" only once the *current* target's list has been seeded. After a
174
177
  // target switch the previous seed is stale (seededTarget !== targetKey), so
175
178
  // gating on hasList keeps the status at "loading" until the new list lands —
@@ -266,6 +269,7 @@ export function useAccessList(target, onSaved, dialogOpen) {
266
269
  grantees: namedGrantees,
267
270
  generalAccess,
268
271
  workspaceLevel,
272
+ inheritedWorkspaceLevel,
269
273
  summary,
270
274
  status,
271
275
  loadError,
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAuyBxB"}
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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,wBAAwB,GAAG,SAAS,EAC5C,OAAO,CAAC,EAAE,sBAAsB,GACjC,sBAAsB,CAo0BxB"}
@@ -2,6 +2,7 @@
2
2
  import { useCallback, useMemo, useRef, useState } from "react";
3
3
  import { areObjRefsEqual } from "@gooddata/sdk-model";
4
4
  import { useToastMessage, } from "@gooddata/sdk-ui-kit";
5
+ import { composeEffectiveWorkspaceAccess } from "./accessSummary.js";
5
6
  import { objectShareMessages } from "./messages.js";
6
7
  import { EMPTY_IDS, NO_LABELS, effectivePermissionAbove, granularGranteeFor, toGranularGrantee, } from "./objectShareController.helpers.js";
7
8
  import { useAccessList } from "./useAccessList.js";
@@ -49,7 +50,7 @@ export function useObjectShareController(target, options) {
49
50
  const [workspaceLevelSaving, setWorkspaceLevelSaving] = useState(false);
50
51
  // The backend access list, seeded into local state (rows, general access,
51
52
  // summary, the commit/picker primitives) lives in its own hook.
52
- const { targetKey, hasList, grantees, generalAccess, workspaceLevel, summary, status, loadError, accessUnavailable, commit, loadOptions, refForId, getCurrentUserRef, canTransferOwnership, setGrantees, setGeneralAccess, setWorkspaceLevel, } = useAccessList(target, onSaved, isOpen);
53
+ const { targetKey, hasList, grantees, generalAccess, workspaceLevel, inheritedWorkspaceLevel, summary, status, loadError, accessUnavailable, commit, loadOptions, refForId, getCurrentUserRef, canTransferOwnership, setGrantees, setGeneralAccess, setWorkspaceLevel, } = useAccessList(target, onSaved, isOpen);
53
54
  // Always-current target key, read inside async mutation finalizers that captured
54
55
  // an older one. A write started for object A resolves after the user navigated to
55
56
  // object B; because local state is authoritative (no refetch), applying A's
@@ -336,10 +337,19 @@ export function useObjectShareController(target, options) {
336
337
  setSelectedLabelIdsByGrantee,
337
338
  ]);
338
339
  const requestGeneralAccessChange = useCallback((next) => {
339
- if (next !== generalAccess) {
340
+ // Inherited rule access can't be revoked from this workspace, so a
341
+ // Restricted request can never be honored — refuse it (the radio row
342
+ // is also disabled). Compare against the effective value the radio
343
+ // shows: with inherited access it is WORKSPACE even when this
344
+ // workspace holds no rule of its own.
345
+ if (inheritedWorkspaceLevel && next === "RESTRICTED") {
346
+ return;
347
+ }
348
+ const effective = inheritedWorkspaceLevel ? "WORKSPACE" : generalAccess;
349
+ if (next !== effective) {
340
350
  setPendingGeneralAccess(next);
341
351
  }
342
- }, [generalAccess]);
352
+ }, [generalAccess, inheritedWorkspaceLevel]);
343
353
  const confirmGeneralAccessChange = useCallback(async () => {
344
354
  const next = pendingGeneralAccess;
345
355
  if (!next || next === generalAccess) {
@@ -410,9 +420,14 @@ export function useObjectShareController(target, options) {
410
420
  ]);
411
421
  const changeWorkspaceLevel = useCallback(async (level) => {
412
422
  // Only re-grade an already-granted workspace rule; ignore no-ops, calls made
413
- // while access is restricted (no rule to re-grade), and re-entry while a
423
+ // while this workspace grants no rule of its own (inherited-only access has
424
+ // nothing to re-grade), calls while an inherited SHARE pins the effective
425
+ // level (a direct downgrade couldn't change it), and re-entry while a
414
426
  // previous re-grade is still in flight (would overlap writes).
415
- if (generalAccess !== "WORKSPACE" || level === workspaceLevel || workspaceLevelSaving) {
427
+ if (generalAccess !== "WORKSPACE" ||
428
+ inheritedWorkspaceLevel === "SHARE" ||
429
+ level === workspaceLevel ||
430
+ workspaceLevelSaving) {
416
431
  return;
417
432
  }
418
433
  const startedFor = targetKey;
@@ -433,7 +448,15 @@ export function useObjectShareController(target, options) {
433
448
  setWorkspaceLevel(previousLevel);
434
449
  }
435
450
  setWorkspaceLevelSaving(false);
436
- }, [generalAccess, workspaceLevel, workspaceLevelSaving, targetKey, commit, setWorkspaceLevel]);
451
+ }, [
452
+ generalAccess,
453
+ inheritedWorkspaceLevel,
454
+ workspaceLevel,
455
+ workspaceLevelSaving,
456
+ targetKey,
457
+ commit,
458
+ setWorkspaceLevel,
459
+ ]);
437
460
  const openTransferOwnership = useCallback(() => {
438
461
  setSubview("transferOwnership");
439
462
  setTransferTargetState(undefined);
@@ -643,11 +666,14 @@ export function useObjectShareController(target, options) {
643
666
  accessUnavailable,
644
667
  summary,
645
668
  grantees,
646
- generalAccess,
647
- // The workspace rule isn't granted while restricted, so its level is
648
- // meaningless then pin to VIEW so the (hidden) dropdown never shows a
649
- // stale SHARE left over from a prior workspace grant.
650
- workspaceLevel: generalAccess === "WORKSPACE" ? workspaceLevel : "VIEW",
669
+ // Effective access: the direct state composed with inherited rule
670
+ // access. Also pins the level to VIEW while restricted, so the (hidden)
671
+ // dropdown never shows a stale SHARE left over from a prior grant.
672
+ ...composeEffectiveWorkspaceAccess(generalAccess, workspaceLevel, inheritedWorkspaceLevel),
673
+ workspaceAccessInherited: inheritedWorkspaceLevel !== undefined,
674
+ // No direct rule to re-grade (inherited-only access), or an inherited
675
+ // SHARE pins the effective level — either way the dropdown is read-only.
676
+ workspaceLevelLocked: generalAccess !== "WORKSPACE" || inheritedWorkspaceLevel === "SHARE",
651
677
  workspaceLevelSaving,
652
678
  labels: effectiveLabels,
653
679
  labelsResolved,
@@ -668,6 +694,7 @@ export function useObjectShareController(target, options) {
668
694
  grantees,
669
695
  generalAccess,
670
696
  workspaceLevel,
697
+ inheritedWorkspaceLevel,
671
698
  workspaceLevelSaving,
672
699
  effectiveLabels,
673
700
  labelsResolved,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-ext",
3
- "version": "11.47.0-alpha.4",
3
+ "version": "11.47.0-alpha.5",
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.4",
67
- "@gooddata/sdk-model": "11.47.0-alpha.4",
68
- "@gooddata/sdk-backend-spi": "11.47.0-alpha.4",
69
- "@gooddata/sdk-ui": "11.47.0-alpha.4",
70
- "@gooddata/sdk-embedding": "11.47.0-alpha.4",
71
- "@gooddata/sdk-ui-charts": "11.47.0-alpha.4",
72
- "@gooddata/sdk-ui-filters": "11.47.0-alpha.4",
73
- "@gooddata/sdk-ui-geo": "11.47.0-alpha.4",
74
- "@gooddata/sdk-ui-kit": "11.47.0-alpha.4",
75
- "@gooddata/sdk-ui-semantic-search": "11.47.0-alpha.4",
76
- "@gooddata/sdk-ui-theme-provider": "11.47.0-alpha.4",
77
- "@gooddata/sdk-ui-vis-commons": "11.47.0-alpha.4",
78
- "@gooddata/util": "11.47.0-alpha.4",
79
- "@gooddata/sdk-ui-pivot": "11.47.0-alpha.4"
66
+ "@gooddata/sdk-backend-spi": "11.47.0-alpha.5",
67
+ "@gooddata/sdk-embedding": "11.47.0-alpha.5",
68
+ "@gooddata/sdk-model": "11.47.0-alpha.5",
69
+ "@gooddata/sdk-backend-base": "11.47.0-alpha.5",
70
+ "@gooddata/sdk-ui": "11.47.0-alpha.5",
71
+ "@gooddata/sdk-ui-charts": "11.47.0-alpha.5",
72
+ "@gooddata/sdk-ui-filters": "11.47.0-alpha.5",
73
+ "@gooddata/sdk-ui-geo": "11.47.0-alpha.5",
74
+ "@gooddata/sdk-ui-kit": "11.47.0-alpha.5",
75
+ "@gooddata/sdk-ui-pivot": "11.47.0-alpha.5",
76
+ "@gooddata/sdk-ui-semantic-search": "11.47.0-alpha.5",
77
+ "@gooddata/sdk-ui-theme-provider": "11.47.0-alpha.5",
78
+ "@gooddata/sdk-ui-vis-commons": "11.47.0-alpha.5",
79
+ "@gooddata/util": "11.47.0-alpha.5"
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.4",
128
- "@gooddata/i18n-toolkit": "11.47.0-alpha.4",
129
- "@gooddata/oxlint-config": "11.47.0-alpha.4",
130
- "@gooddata/reference-workspace": "11.47.0-alpha.4",
131
- "@gooddata/sdk-backend-mockingbird": "11.47.0-alpha.4",
132
- "@gooddata/stylelint-config": "11.47.0-alpha.4"
127
+ "@gooddata/eslint-config": "11.47.0-alpha.5",
128
+ "@gooddata/i18n-toolkit": "11.47.0-alpha.5",
129
+ "@gooddata/oxlint-config": "11.47.0-alpha.5",
130
+ "@gooddata/reference-workspace": "11.47.0-alpha.5",
131
+ "@gooddata/sdk-backend-mockingbird": "11.47.0-alpha.5",
132
+ "@gooddata/stylelint-config": "11.47.0-alpha.5"
133
133
  },
134
134
  "peerDependencies": {
135
135
  "react": "^18.0.0 || ^19.0.0",