@gooddata/sdk-ui-ext 11.47.0-alpha.2 → 11.47.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 (133) hide show
  1. package/NOTICE +3 -3
  2. package/esm/index.d.ts +1 -1
  3. package/esm/index.d.ts.map +1 -1
  4. package/esm/internal/components/configurationControls/conditionalFormatting/CfSelect.d.ts +14 -0
  5. package/esm/internal/components/configurationControls/conditionalFormatting/CfSelect.d.ts.map +1 -0
  6. package/esm/internal/components/configurationControls/conditionalFormatting/CfSelect.js +25 -0
  7. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts +18 -0
  8. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts.map +1 -0
  9. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.js +132 -0
  10. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts +4 -1
  11. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts.map +1 -1
  12. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.js +15 -116
  13. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts +5 -3
  14. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts.map +1 -1
  15. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.js +10 -10
  16. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts +25 -0
  17. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts.map +1 -0
  18. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.js +94 -0
  19. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts +66 -7
  20. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts.map +1 -1
  21. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.js +165 -21
  22. package/esm/internal/components/configurationControls/conditionalFormatting/reorderListModel.d.ts +4 -0
  23. package/esm/internal/components/configurationControls/conditionalFormatting/reorderListModel.d.ts.map +1 -0
  24. package/esm/internal/components/configurationControls/conditionalFormatting/reorderListModel.js +16 -0
  25. package/esm/internal/components/configurationPanels/ConfigurationPanelContent.d.ts +0 -1
  26. package/esm/internal/components/configurationPanels/ConfigurationPanelContent.d.ts.map +1 -1
  27. package/esm/internal/components/configurationPanels/PivotTableConfigurationPanel.d.ts +9 -2
  28. package/esm/internal/components/configurationPanels/PivotTableConfigurationPanel.d.ts.map +1 -1
  29. package/esm/internal/components/configurationPanels/PivotTableConfigurationPanel.js +4 -4
  30. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.d.ts +1 -1
  31. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.d.ts.map +1 -1
  32. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.js +8 -7
  33. package/esm/internal/translations/de-DE.localization-bundle.d.ts +12 -0
  34. package/esm/internal/translations/de-DE.localization-bundle.d.ts.map +1 -1
  35. package/esm/internal/translations/de-DE.localization-bundle.js +12 -0
  36. package/esm/internal/translations/en-AU.localization-bundle.d.ts +12 -0
  37. package/esm/internal/translations/en-AU.localization-bundle.d.ts.map +1 -1
  38. package/esm/internal/translations/en-AU.localization-bundle.js +12 -0
  39. package/esm/internal/translations/en-GB.localization-bundle.d.ts +12 -0
  40. package/esm/internal/translations/en-GB.localization-bundle.d.ts.map +1 -1
  41. package/esm/internal/translations/en-GB.localization-bundle.js +12 -0
  42. package/esm/internal/translations/en-US.localization-bundle.d.ts +8 -0
  43. package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
  44. package/esm/internal/translations/en-US.localization-bundle.js +8 -0
  45. package/esm/internal/translations/es-419.localization-bundle.d.ts +12 -0
  46. package/esm/internal/translations/es-419.localization-bundle.d.ts.map +1 -1
  47. package/esm/internal/translations/es-419.localization-bundle.js +12 -0
  48. package/esm/internal/translations/es-ES.localization-bundle.d.ts +12 -0
  49. package/esm/internal/translations/es-ES.localization-bundle.d.ts.map +1 -1
  50. package/esm/internal/translations/es-ES.localization-bundle.js +12 -0
  51. package/esm/internal/translations/fi-FI.localization-bundle.d.ts +12 -0
  52. package/esm/internal/translations/fi-FI.localization-bundle.d.ts.map +1 -1
  53. package/esm/internal/translations/fi-FI.localization-bundle.js +12 -0
  54. package/esm/internal/translations/fr-CA.localization-bundle.d.ts +12 -0
  55. package/esm/internal/translations/fr-CA.localization-bundle.d.ts.map +1 -1
  56. package/esm/internal/translations/fr-CA.localization-bundle.js +12 -0
  57. package/esm/internal/translations/fr-FR.localization-bundle.d.ts +12 -0
  58. package/esm/internal/translations/fr-FR.localization-bundle.d.ts.map +1 -1
  59. package/esm/internal/translations/fr-FR.localization-bundle.js +12 -0
  60. package/esm/internal/translations/id-ID.localization-bundle.d.ts +12 -0
  61. package/esm/internal/translations/id-ID.localization-bundle.d.ts.map +1 -1
  62. package/esm/internal/translations/id-ID.localization-bundle.js +12 -0
  63. package/esm/internal/translations/it-IT.localization-bundle.d.ts +12 -0
  64. package/esm/internal/translations/it-IT.localization-bundle.d.ts.map +1 -1
  65. package/esm/internal/translations/it-IT.localization-bundle.js +12 -0
  66. package/esm/internal/translations/ja-JP.localization-bundle.d.ts +12 -0
  67. package/esm/internal/translations/ja-JP.localization-bundle.d.ts.map +1 -1
  68. package/esm/internal/translations/ja-JP.localization-bundle.js +12 -0
  69. package/esm/internal/translations/ko-KR.localization-bundle.d.ts +12 -0
  70. package/esm/internal/translations/ko-KR.localization-bundle.d.ts.map +1 -1
  71. package/esm/internal/translations/ko-KR.localization-bundle.js +12 -0
  72. package/esm/internal/translations/nl-NL.localization-bundle.d.ts +12 -0
  73. package/esm/internal/translations/nl-NL.localization-bundle.d.ts.map +1 -1
  74. package/esm/internal/translations/nl-NL.localization-bundle.js +12 -0
  75. package/esm/internal/translations/pl-PL.localization-bundle.d.ts +12 -0
  76. package/esm/internal/translations/pl-PL.localization-bundle.d.ts.map +1 -1
  77. package/esm/internal/translations/pl-PL.localization-bundle.js +12 -0
  78. package/esm/internal/translations/pt-BR.localization-bundle.d.ts +12 -0
  79. package/esm/internal/translations/pt-BR.localization-bundle.d.ts.map +1 -1
  80. package/esm/internal/translations/pt-BR.localization-bundle.js +12 -0
  81. package/esm/internal/translations/pt-PT.localization-bundle.d.ts +12 -0
  82. package/esm/internal/translations/pt-PT.localization-bundle.d.ts.map +1 -1
  83. package/esm/internal/translations/pt-PT.localization-bundle.js +12 -0
  84. package/esm/internal/translations/ru-RU.localization-bundle.d.ts +12 -0
  85. package/esm/internal/translations/ru-RU.localization-bundle.d.ts.map +1 -1
  86. package/esm/internal/translations/ru-RU.localization-bundle.js +12 -0
  87. package/esm/internal/translations/sl-SI.localization-bundle.d.ts +12 -0
  88. package/esm/internal/translations/sl-SI.localization-bundle.d.ts.map +1 -1
  89. package/esm/internal/translations/sl-SI.localization-bundle.js +12 -0
  90. package/esm/internal/translations/th-TH.localization-bundle.d.ts +12 -0
  91. package/esm/internal/translations/th-TH.localization-bundle.d.ts.map +1 -1
  92. package/esm/internal/translations/th-TH.localization-bundle.js +12 -0
  93. package/esm/internal/translations/tr-TR.localization-bundle.d.ts +12 -0
  94. package/esm/internal/translations/tr-TR.localization-bundle.d.ts.map +1 -1
  95. package/esm/internal/translations/tr-TR.localization-bundle.js +12 -0
  96. package/esm/internal/translations/uk-UA.localization-bundle.d.ts +12 -0
  97. package/esm/internal/translations/uk-UA.localization-bundle.d.ts.map +1 -1
  98. package/esm/internal/translations/uk-UA.localization-bundle.js +12 -0
  99. package/esm/internal/translations/vi-VN.localization-bundle.d.ts +12 -0
  100. package/esm/internal/translations/vi-VN.localization-bundle.d.ts.map +1 -1
  101. package/esm/internal/translations/vi-VN.localization-bundle.js +12 -0
  102. package/esm/internal/translations/zh-HK.localization-bundle.d.ts +12 -0
  103. package/esm/internal/translations/zh-HK.localization-bundle.d.ts.map +1 -1
  104. package/esm/internal/translations/zh-HK.localization-bundle.js +12 -0
  105. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts +12 -0
  106. package/esm/internal/translations/zh-Hans.localization-bundle.d.ts.map +1 -1
  107. package/esm/internal/translations/zh-Hans.localization-bundle.js +12 -0
  108. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts +12 -0
  109. package/esm/internal/translations/zh-Hant.localization-bundle.d.ts.map +1 -1
  110. package/esm/internal/translations/zh-Hant.localization-bundle.js +12 -0
  111. package/esm/locales.d.ts +6 -0
  112. package/esm/locales.d.ts.map +1 -1
  113. package/esm/locales.js +2 -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/css/main.css +102 -13
  130. package/styles/css/main.css.map +1 -1
  131. package/styles/internal/css/conditional_formatting.css +102 -13
  132. package/styles/internal/css/conditional_formatting.css.map +1 -1
  133. package/styles/internal/scss/conditional_formatting.scss +138 -13
@@ -280,6 +280,18 @@ export declare const zh_Hant: {
280
280
  "properties.colors.reset-colors": string;
281
281
  "properties.colors": string;
282
282
  "properties.colorsAndFills": string;
283
+ "properties.colorsAndStyles": string;
284
+ "properties.colors.reset-colors-and-styles": string;
285
+ "properties.lineStyle.label": string;
286
+ "properties.lineStyle.triggerAriaLabel": string;
287
+ "properties.lineStyle.solid": string;
288
+ "properties.lineStyle.dashed": string;
289
+ "properties.lineStyle.dotted": string;
290
+ "properties.lineWidth.label": string;
291
+ "properties.lineWidth.1px": string;
292
+ "properties.lineWidth.2px": string;
293
+ "properties.lineWidth.3px": string;
294
+ "properties.lineWidth.4px": string;
283
295
  "properties.fill": string;
284
296
  "properties.fill.solid": string;
285
297
  "properties.fill.pattern": string;
@@ -1 +1 @@
1
- {"version":3,"file":"zh-Hant.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/internal/translations/zh-Hant.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAopBnB,CAAC"}
1
+ {"version":3,"file":"zh-Hant.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/internal/translations/zh-Hant.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgqBnB,CAAC"}
@@ -282,6 +282,18 @@ export const zh_Hant = {
282
282
  "properties.colors.reset-colors": "重置顏色",
283
283
  "properties.colors": "顏色",
284
284
  "properties.colorsAndFills": "顏色和填充",
285
+ "properties.colorsAndStyles": "顏色和樣式",
286
+ "properties.colors.reset-colors-and-styles": "重設顏色和樣式",
287
+ "properties.lineStyle.label": "線條樣式",
288
+ "properties.lineStyle.triggerAriaLabel": "編輯 {name} 的顏色和樣式",
289
+ "properties.lineStyle.solid": "實線",
290
+ "properties.lineStyle.dashed": "虛線",
291
+ "properties.lineStyle.dotted": "點線",
292
+ "properties.lineWidth.label": "線條粗細",
293
+ "properties.lineWidth.1px": "1 px",
294
+ "properties.lineWidth.2px": "2 px",
295
+ "properties.lineWidth.3px": "3 px",
296
+ "properties.lineWidth.4px": "4 px",
285
297
  "properties.fill": "填滿",
286
298
  "properties.fill.solid": "實心(預設)",
287
299
  "properties.fill.pattern": "圖案",
package/esm/locales.d.ts CHANGED
@@ -1033,12 +1033,18 @@ export declare const conditionalFormattingMessages: {
1033
1033
  dialogToPlaceholder: {
1034
1034
  id: string;
1035
1035
  };
1036
+ dialogUnitPercent: {
1037
+ id: string;
1038
+ };
1036
1039
  dialogCancel: {
1037
1040
  id: string;
1038
1041
  };
1039
1042
  dialogSave: {
1040
1043
  id: string;
1041
1044
  };
1045
+ dialogErrorRangeOrder: {
1046
+ id: string;
1047
+ };
1042
1048
  };
1043
1049
  export declare const conditionalFormattingOperatorMessages: Record<ConditionalFormattingOperator, MessageDescriptor>;
1044
1050
  //# sourceMappingURL=locales.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAGjF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA2EnD,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAsBtD,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8PnB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH7B,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BxC,CAAC;AAEH,eAAO,MAAM,qCAAqC,EAAE,MAAM,CAAC,6BAA6B,EAAE,iBAAiB,CAmBrG,CAAC"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAGjF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA2EnD,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAsBtD,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8PnB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH7B,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxC,CAAC;AAEH,eAAO,MAAM,qCAAqC,EAAE,MAAM,CAAC,6BAA6B,EAAE,iBAAiB,CAmBrG,CAAC"}
package/esm/locales.js CHANGED
@@ -495,8 +495,10 @@ export const conditionalFormattingMessages = defineMessages({
495
495
  dialogValuePlaceholder: { id: "properties.conditionalFormatting.dialog.value" },
496
496
  dialogFromPlaceholder: { id: "properties.conditionalFormatting.dialog.from" },
497
497
  dialogToPlaceholder: { id: "properties.conditionalFormatting.dialog.to" },
498
+ dialogUnitPercent: { id: "properties.conditionalFormatting.dialog.unitPercent" },
498
499
  dialogCancel: { id: "properties.conditionalFormatting.dialog.cancel" },
499
500
  dialogSave: { id: "properties.conditionalFormatting.dialog.save" },
501
+ dialogErrorRangeOrder: { id: "properties.conditionalFormatting.dialog.error.rangeOrder" },
500
502
  });
501
503
  export const conditionalFormattingOperatorMessages = defineMessages({
502
504
  ALL: { id: "properties.conditionalFormatting.operator.all" },
@@ -669,6 +669,19 @@ export declare interface IGrantedDataSource {
669
669
  accessSource?: DataSourceAccessSource;
670
670
  }
671
671
 
672
+ /**
673
+ * Known identity facts of a grantee: real name/email only, never an id fallback.
674
+ * Undefined fields are unknown and may be backfilled.
675
+ *
676
+ * @internal
677
+ */
678
+ export declare interface IGranteeIdentityFacts {
679
+ /** Real full name (users) / group name, when known. */
680
+ name?: string;
681
+ /** Real email, when known (users only). */
682
+ email?: string;
683
+ }
684
+
672
685
  /**
673
686
  * @internal
674
687
  */
@@ -1644,17 +1657,16 @@ export declare interface IObjectShareDialogProps {
1644
1657
  }
1645
1658
 
1646
1659
  /**
1647
- * Dialog row derived from a backend grant.
1660
+ * Dialog row derived from a backend grant. `name`/`email` are real facts only;
1661
+ * display fallbacks are `granteeDisplayPair`'s concern.
1648
1662
  *
1649
1663
  * @internal
1650
1664
  */
1651
- export declare interface IObjectShareGrantee {
1665
+ export declare interface IObjectShareGrantee extends IGranteeIdentityFacts {
1652
1666
  /** Stable id used as the dialog row's React key. `user:<ref>` / `group:<ref>`. */
1653
1667
  id: string;
1654
1668
  kind: "user" | "group";
1655
1669
  granteeRef: ObjRef;
1656
- name: string;
1657
- email?: string;
1658
1670
  level: ObjectSharePermissionLevel;
1659
1671
  /**
1660
1672
  * Effective permission when it is *higher* than the directly-granted `level`
@@ -2141,7 +2153,9 @@ export declare function useInsightPickerState(author?: string): {
2141
2153
  * plain props and it owns its controller. Call this (exported as `useObjectShare`)
2142
2154
  * only to share a single access-list fetch between the dialog and an inline summary
2143
2155
  * row: call it once, read `state.summary` for the row, and pass the controller into
2144
- * the dialog.
2156
+ * the dialog. Grantee rows carry identity facts only (`name`/`email` are undefined
2157
+ * when unknown); the display fallback order is not exposed, so {@link ObjectShareDialog}
2158
+ * is the only sanctioned row renderer.
2145
2159
  *
2146
2160
  * @internal
2147
2161
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectShareDialog.d.ts","sourceRoot":"","sources":["../../src/share/ObjectShareDialog.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAW1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,gDAAgD;IAChD,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7C,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACb,EAAE,uBAAuB,2CAuPzB"}
1
+ {"version":3,"file":"ObjectShareDialog.d.ts","sourceRoot":"","sources":["../../src/share/ObjectShareDialog.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAY1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACpC,gDAAgD;IAChD,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7C,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACb,EAAE,uBAAuB,2CAsPzB"}
@@ -4,6 +4,7 @@ import { useCallback } from "react";
4
4
  import { useIntl } from "react-intl";
5
5
  import { UiAddGranteeDialog, UiConfirmDialog, UiGranteeRowControls, UiObjectShareDialog, UiRadioRow, UiTransferOwnershipDialog, } from "@gooddata/sdk-ui-kit";
6
6
  import { objectShareMessages } from "./messages.js";
7
+ import { granteeDisplayPair } from "./objectShareController.helpers.js";
7
8
  import { useObjectShareController } from "./useObjectShareController.js";
8
9
  // The workspace row has no labels menu (see workspaceControls below), so its
9
10
  // required onLabelsChange never fires; a stable no-op satisfies the prop type
@@ -94,8 +95,7 @@ export function ObjectShareDialog({ target, objectTitle, isOpen, onClose, onSave
94
95
  return (_jsxs(_Fragment, { children: [_jsx(UiObjectShareDialog, { isOpen: isShareOpen, objectTitle: objectTitle, onClose: handleClose, grantees: state.grantees.map((g) => ({
95
96
  id: g.id,
96
97
  kind: g.kind,
97
- name: g.name,
98
- email: g.email,
98
+ ...granteeDisplayPair(g),
99
99
  isPending: g.pending !== undefined,
100
100
  controls: (_jsx(UiGranteeRowControls, { labels: labelItems, selectedLabelIds: state.selectedLabelIdsByGrantee[g.id] ?? state.labels.map((l) => l.id), permissionLevel: g.level, effectivePermission: g.effectivePermission,
101
101
  // Disable row controls while saving, and until per-label
@@ -1,15 +1,29 @@
1
1
  import { type IAvailableAccessGrantee, type IGranularAccessGrantee, type IObjectAccessList, type ObjRef } from "@gooddata/sdk-model";
2
- import type { IObjectShareGrantee, ObjectSharePermissionLevel } from "./objectShareController.types.js";
2
+ import type { IGranteeIdentityFacts, IObjectShareGrantee, ObjectSharePermissionLevel } from "./objectShareController.types.js";
3
3
  import type { IObjectShareLabel } from "./types.js";
4
4
  /** Stable row id shared by grantee rows and picker options: `user:<ref>` / `group:<ref>`. */
5
5
  export declare function granteeId(kind: "user" | "group", ref: ObjRef): string;
6
6
  /**
7
- * Whether a grantee row carries no human name its name is just the serialized
8
- * ref the backend grant fell back to when the permissions endpoint returned no
9
- * name. The signal both for backfilling a row from the picker/assignee cache and
10
- * for deciding whether to resolve names eagerly at all.
7
+ * Real identity facts recovered from converter output that collapses missing
8
+ * fields (`name ?? email ?? id`; grant emails also `email ?? id` — assignee
9
+ * emails stay raw): a field equal to the raw id is absent, a "name" equal to
10
+ * the email is the email fallback.
11
11
  */
12
- export declare function granteeNameUnresolved(grantee: IObjectShareGrantee): boolean;
12
+ export declare function userIdentityFacts(ref: ObjRef, name: string | undefined, email: string | undefined): IGranteeIdentityFacts;
13
+ /** Real group name recovered from the converter's `name ?? id` collapse: a name equal to the raw id is absent. */
14
+ export declare function groupNameFact(ref: ObjRef, name: string | undefined): string | undefined;
15
+ /** Identity facts for a listing/picker assignee — {@link userIdentityFacts} for users, a name fact for groups. */
16
+ export declare function assigneeIdentityFacts(assignee: IAvailableAccessGrantee): IGranteeIdentityFacts;
17
+ /** Display pair per the spec's fallback order: name + email → name + userID → email + userID → userID. */
18
+ export declare function userDisplayPair(facts: IGranteeIdentityFacts, userId: string): {
19
+ name: string;
20
+ email?: string;
21
+ };
22
+ /** Row display pair — {@link userDisplayPair} for users; groups show name (or raw id), no subline. */
23
+ export declare function granteeDisplayPair(grantee: IObjectShareGrantee): {
24
+ name: string;
25
+ email?: string;
26
+ };
13
27
  /** Case-insensitive match of an assignee against the picker query (name, or email for users). */
14
28
  export declare function assigneeMatchesQuery(assignee: IAvailableAccessGrantee, query: string): boolean;
15
29
  /** The row's directly-granted level — the strongest permission present, defaulting to VIEW. */
@@ -1 +1 @@
1
- {"version":3,"file":"objectShareController.helpers.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,MAAM,EAId,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAE3E;AAED,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM9F;AAKD,iGAA+F;AAC/F,wBAAgB,WAAW,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,0BAA0B,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,0BAA0B,EAClC,oBAAoB,EAAE,SAAS,MAAM,EAAE,GACxC,0BAA0B,GAAG,SAAS,CAGxC;AAYD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,SAAS,GAAG,mBAAmB,EAAE,CA0BjG;AAUD,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,MAAM,GAAG,OAAO,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,0BAA0B,GAAG,MAAM,GAC3C,sBAAsB,CAKxB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GACzB;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,CAAC;AAElC,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,0BAA0B,GAAG,MAAM,0BAO7C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAC/B,SAAS,EAAE,mBAAmB,EAC9B,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,MAAM,EAAE,iBAAiB,EAAE,GAC5B,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAWzD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC5C,UAAU,EAAE,mBAAmB,EAAE,EACjC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,MAAM,EAAE,iBAAiB,EAAE,GAC5B,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAA;CAAE,CAAC,CAcxE;AAED,sFAAsF;AACtF,eAAO,MAAM,SAAS,EAAE,iBAAiB,EAAO,CAAC;AAEjD,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,MAAM,CAAqB,CAAC;AAEhE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAU/E"}
1
+ {"version":3,"file":"objectShareController.helpers.d.ts","sourceRoot":"","sources":["../../src/share/objectShareController.helpers.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,45 @@ export function granteeId(kind, ref) {
5
5
  return `${kind}:${objRefToString(ref)}`;
6
6
  }
7
7
  /**
8
- * Whether a grantee row carries no human name its name is just the serialized
9
- * ref the backend grant fell back to when the permissions endpoint returned no
10
- * name. The signal both for backfilling a row from the picker/assignee cache and
11
- * for deciding whether to resolve names eagerly at all.
8
+ * Real identity facts recovered from converter output that collapses missing
9
+ * fields (`name ?? email ?? id`; grant emails also `email ?? id` — assignee
10
+ * emails stay raw): a field equal to the raw id is absent, a "name" equal to
11
+ * the email is the email fallback.
12
12
  */
13
- export function granteeNameUnresolved(grantee) {
14
- return grantee.name === objRefToString(grantee.granteeRef);
13
+ export function userIdentityFacts(ref, name, email) {
14
+ const id = objRefToString(ref);
15
+ const realEmail = email && email !== id ? email : undefined;
16
+ const realName = name && name !== id && name !== realEmail ? name : undefined;
17
+ return { name: realName, email: realEmail };
18
+ }
19
+ /** Real group name recovered from the converter's `name ?? id` collapse: a name equal to the raw id is absent. */
20
+ export function groupNameFact(ref, name) {
21
+ const id = objRefToString(ref);
22
+ return name && name !== id ? name : undefined;
23
+ }
24
+ /** Identity facts for a listing/picker assignee — {@link userIdentityFacts} for users, a name fact for groups. */
25
+ export function assigneeIdentityFacts(assignee) {
26
+ return assignee.type === "user"
27
+ ? userIdentityFacts(assignee.ref, assignee.name, assignee.email)
28
+ : { name: groupNameFact(assignee.ref, assignee.name) };
29
+ }
30
+ /** Display pair per the spec's fallback order: name + email → name + userID → email + userID → userID. */
31
+ export function userDisplayPair(facts, userId) {
32
+ if (facts.name) {
33
+ return { name: facts.name, email: facts.email ?? userId };
34
+ }
35
+ if (facts.email) {
36
+ return { name: facts.email, email: userId };
37
+ }
38
+ return { name: userId };
39
+ }
40
+ /** Row display pair — {@link userDisplayPair} for users; groups show name (or raw id), no subline. */
41
+ export function granteeDisplayPair(grantee) {
42
+ const id = objRefToString(grantee.granteeRef);
43
+ if (grantee.kind !== "user") {
44
+ return { name: grantee.name ?? id };
45
+ }
46
+ return userDisplayPair(grantee, id);
15
47
  }
16
48
  /** Case-insensitive match of an assignee against the picker query (name, or email for users). */
17
49
  export function assigneeMatchesQuery(assignee, query) {
@@ -57,8 +89,7 @@ export function granteesFromAccessList(list) {
57
89
  id: granteeId("user", g.user.ref),
58
90
  kind: "user",
59
91
  granteeRef: g.user.ref,
60
- name: g.user.fullName ?? g.user.email ?? g.user.login,
61
- email: g.user.email,
92
+ ...userIdentityFacts(g.user.ref, g.user.fullName, g.user.email),
62
93
  ...granteeAccess(g.permissions, g.inheritedPermissions),
63
94
  });
64
95
  }
@@ -67,7 +98,7 @@ export function granteesFromAccessList(list) {
67
98
  id: granteeId("group", g.userGroup.ref),
68
99
  kind: "group",
69
100
  granteeRef: g.userGroup.ref,
70
- name: g.userGroup.name ?? objRefToString(g.userGroup.ref),
101
+ name: groupNameFact(g.userGroup.ref, g.userGroup.name),
71
102
  ...granteeAccess(g.permissions, g.inheritedPermissions),
72
103
  });
73
104
  }
@@ -12,17 +12,28 @@ import type { IObjectAccessSummary, IObjectShareLabel } from "./types.js";
12
12
  */
13
13
  export type ObjectSharePermissionLevel = AccessGranularPermission;
14
14
  /**
15
- * Dialog row derived from a backend grant.
15
+ * Known identity facts of a grantee: real name/email only, never an id fallback.
16
+ * Undefined fields are unknown and may be backfilled.
16
17
  *
17
18
  * @internal
18
19
  */
19
- export interface IObjectShareGrantee {
20
+ export interface IGranteeIdentityFacts {
21
+ /** Real full name (users) / group name, when known. */
22
+ name?: string;
23
+ /** Real email, when known (users only). */
24
+ email?: string;
25
+ }
26
+ /**
27
+ * Dialog row derived from a backend grant. `name`/`email` are real facts only;
28
+ * display fallbacks are `granteeDisplayPair`'s concern.
29
+ *
30
+ * @internal
31
+ */
32
+ export interface IObjectShareGrantee extends IGranteeIdentityFacts {
20
33
  /** Stable id used as the dialog row's React key. `user:<ref>` / `group:<ref>`. */
21
34
  id: string;
22
35
  kind: "user" | "group";
23
36
  granteeRef: ObjRef;
24
- name: string;
25
- email?: string;
26
37
  level: ObjectSharePermissionLevel;
27
38
  /**
28
39
  * Effective permission when it is *higher* than the directly-granted `level`
@@ -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":"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"}
@@ -73,7 +73,6 @@ export interface IAccessList {
73
73
  * showing a stale SHARE inherited from the initial fetch.
74
74
  */
75
75
  setWorkspaceLevel: React.Dispatch<React.SetStateAction<"VIEW" | "SHARE">>;
76
- setKnownNames: React.Dispatch<React.SetStateAction<Record<string, string>>>;
77
76
  }
78
77
  /**
79
78
  * Owns the backend access list. It is fetched once (per target) then seeded into
@@ -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,EAC3B,KAAK,MAAM,EAGd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAmB,MAAM,sBAAsB,CAAC;AAW7G,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACzG,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;IAC1E,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/E;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"}
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"}
@@ -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"}