@gooddata/sdk-ui-dashboard 11.40.0-alpha.5 → 11.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/NOTICE +664 -360
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/model/react/useWidgetExecConfig.d.ts +9 -0
  5. package/esm/model/react/useWidgetExecConfig.js +21 -0
  6. package/esm/presentation/automations/shared/automationFilters/components/AutomationMeasureValueFilter.js +3 -2
  7. package/esm/presentation/componentDefinition/renderModeAware.js +1 -4
  8. package/esm/presentation/filterBar/dateFilter/DefaultDashboardDateFilter.js +5 -1
  9. package/esm/presentation/filterBar/measureValueFilter/DefaultDashboardMeasureValueFilter.js +11 -5
  10. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.d.ts +3 -0
  11. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.js +5 -1
  12. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +2 -0
  13. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +2 -0
  14. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +2 -0
  15. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +2 -0
  16. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +2 -0
  17. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +2 -0
  18. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +8 -0
  19. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +8 -0
  20. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +2 -0
  21. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +2 -0
  22. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +2 -0
  23. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +2 -0
  24. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +2 -0
  25. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +2 -0
  26. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +2 -0
  27. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +2 -0
  28. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +2 -0
  29. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +2 -0
  30. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +2 -0
  31. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +2 -0
  32. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +2 -0
  33. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +2 -0
  34. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +2 -0
  35. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +2 -0
  36. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +2 -0
  37. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +2 -0
  38. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +2 -0
  39. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +2 -0
  40. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +2 -0
  41. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +2 -0
  42. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +2 -0
  43. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +2 -0
  44. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +2 -0
  45. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +2 -0
  46. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +2 -0
  47. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +2 -0
  48. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +2 -0
  49. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +2 -0
  50. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +2 -0
  51. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +2 -0
  52. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +2 -0
  53. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +2 -0
  54. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +2 -0
  55. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +2 -0
  56. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +2 -0
  57. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +2 -0
  58. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +2 -0
  59. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +2 -0
  60. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +2 -0
  61. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +2 -0
  62. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +2 -0
  63. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +2 -0
  64. package/esm/presentation/widget/common/configuration/FilterConfiguration.js +6 -3
  65. package/esm/presentation/widget/common/configuration/MeasureValueFilterConfigurationItem.d.ts +2 -1
  66. package/esm/presentation/widget/common/configuration/MeasureValueFilterConfigurationItem.js +5 -5
  67. package/esm/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.js +3 -9
  68. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -3
  69. package/package.json +24 -24
  70. package/styles/css/main.css +29 -2
  71. package/styles/css/main.css.map +1 -1
@@ -436,6 +436,8 @@ export declare const ru_RU: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const ru_RU = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "Эту визуализацию нельзя фильтровать по дате. Снимите флажок.",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Фильтр неприменим к этой визуализации.",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "Этот фильтр нельзя применить, потому что в визуализации используется фильтр значений Top/bottom. Чтобы применить этот фильтр, удалите фильтр значений Top/bottom.",
441
+ "configurationPanel.mvfMissingMeasure": "Показатель, используемый в этом фильтре, больше не существует в рабочей области.",
442
+ "filters.mvf.missingMetric.tooltip": "Показатель, используемый в этом фильтре, больше не существует в рабочей области.",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "Этот КПЭ нельзя фильтровать по дате. Снимите флажок.",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" больше нельзя применять к визуализации. Выберите другое измерение или отредактируйте визуализацию.",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" больше нельзя применять к КПЭ. Выберите другое измерение или отредактируйте анализ.",
@@ -436,6 +436,8 @@ export declare const sl_SI: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const sl_SI = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "Vizualizacije ni mogoče filtrirati po datumu. Odznačite potrditveno polje.",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Filter ni uporaben za to vizualizacijo.",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "Tega filtra ni mogoče uporabiti, ker vizualizacija uporablja filter Najvišje/najnižje vrednosti. Odstranite filter Najvišje/najnižje vrednosti, da uporabite ta filter.",
441
+ "configurationPanel.mvfMissingMeasure": "Metrika, uporabljena v tem filtru, ne obstaja več v delovnem prostoru.",
442
+ "filters.mvf.missingMetric.tooltip": "Metrika, uporabljena v tem filtru, ne obstaja več v delovnem prostoru.",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI-ja ni mogoče filtrirati po datumu. Odznačite potrditveno polje.",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" se ne more več uporabljati pri vizualizaciji. Izberite drugo dimenzijo ali uredite vizualizacijo.",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" se ne more več uporabljati pri KPI-ju. Izberite drugo dimenzijo ali uredite KPI.",
@@ -436,6 +436,8 @@ export declare const th_TH: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const th_TH = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "การแสดงภาพข้อมูลไม่สามารถถูกกรองตามวันที่ได้ ยกเลิกการเลือกช่องทำเครื่องหมาย",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "ตัวกรองไม่สามารถใช้ได้กับการแสดงภาพข้อมูลนี้",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "ไม่สามารถใช้ตัวกรองนี้ได้ เนื่องจากการแสดงภาพข้อมูลใช้ตัวกรองค่าบนสุด/ล่างสุด นำตัวกรองค่าบนสุด/ล่างสุดออกเพื่อใช้ตัวกรองนี้",
441
+ "configurationPanel.mvfMissingMeasure": "เมตริกที่ใช้ในตัวกรองนี้ไม่มีอยู่ในพื้นที่ทำงานอีกต่อไป",
442
+ "filters.mvf.missingMetric.tooltip": "เมตริกที่ใช้ในตัวกรองนี้ไม่มีอยู่ในพื้นที่ทำงานอีกต่อไป",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI ไม่สามารถถูกกรองตามวันที่ได้ ยกเลิกการเลือกช่องทำเครื่องหมาย",
442
444
  "configurationPanel.unrelatedVizDateInfo": "ไม่สามารถนำ \"{dateDataSet}\" ไปใช้กับการแสดงภาพข้อมูลได้อีกต่อไป เลือกมิติอื่นหรือแก้ไขการแสดงภาพข้อมูล",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "ไม่สามารถนำ \"{dateDataSet}\" ไปใช้กับ kpi ได้อีกต่อไป เลือกมิติอื่นหรือแก้ไข kpi",
@@ -436,6 +436,8 @@ export declare const tr_TR: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const tr_TR = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "Görselleştirme Tarihe göre filtrelenemez. Onay kutusunun işaretini kaldırın.",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Filtre bu görselleştirme için uygulanamaz.",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "Bu filtre, görselleştirme bir En üst/En alt değerler filtresi kullandığı için uygulanamaz. Bu filtreyi uygulamak için En üst/En alt değerler filtresini kaldırın.",
441
+ "configurationPanel.mvfMissingMeasure": "Bu filtrede kullanılan metrik artık çalışma alanında mevcut değil.",
442
+ "filters.mvf.missingMetric.tooltip": "Bu filtrede kullanılan metrik artık çalışma alanında mevcut değil.",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI, Tarihe göre filtrelenemez. Onay kutusunun işaretini kaldırın.",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" artık görselleştirmeye uygulanamaz. Farklı bir boyut seçin veya görselleştirmeyi düzenleyin.",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" artık KPI'ya uygulanamaz. Farklı bir boyut seçin veya KPI'yı düzenleyin.",
@@ -436,6 +436,8 @@ export declare const uk_UA: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const uk_UA = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "Візуалізацію не можна фільтрувати за датою. Зніміть прапорець.",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Фільтр не можна застосувати до цієї візуалізації.",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "Цей фільтр не можна застосувати, оскільки візуалізація використовує фільтр верхніх/нижніх значень. Видаліть фільтр верхніх/нижніх значень, щоб застосувати цей фільтр.",
441
+ "configurationPanel.mvfMissingMeasure": "Метрика, яка використовується в цьому фільтрі, більше не існує в робочій області.",
442
+ "filters.mvf.missingMetric.tooltip": "Метрика, яка використовується в цьому фільтрі, більше не існує в робочій області.",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI не можна фільтрувати за датою. Зніміть прапорець.",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" більше не можна застосувати до візуалізації. Виберіть інший вимір або відредагуйте візуалізацію.",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" більше не можна застосувати до KPI. Виберіть інший вимір або відредагуйте KPI.",
@@ -436,6 +436,8 @@ export declare const vi_VN: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const vi_VN = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "Trực quan hóa không thể được lọc theo Ngày. Bỏ chọn hộp kiểm.",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Bộ lọc không áp dụng được cho trực quan hóa này.",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "Không thể áp dụng bộ lọc này vì trực quan hóa sử dụng bộ lọc giá trị Trên cùng/dưới cùng. Hãy xóa bộ lọc giá trị Trên cùng/dưới cùng để áp dụng bộ lọc này.",
441
+ "configurationPanel.mvfMissingMeasure": "Thước đo được dùng trong bộ lọc này không còn tồn tại trong không gian làm việc.",
442
+ "filters.mvf.missingMetric.tooltip": "Thước đo được dùng trong bộ lọc này không còn tồn tại trong không gian làm việc.",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI không thể được lọc theo Ngày. Bỏ chọn hộp kiểm.",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" không còn có thể áp dụng cho trực quan hóa. Chọn một chiều khác hoặc chỉnh sửa trực quan hóa.",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" không thể áp dụng cho KPI nữa. Hãy chọn một chiều dữ liệu khác hoặc chỉnh sửa KPI.",
@@ -436,6 +436,8 @@ export declare const zh_HK: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const zh_HK = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "無法按日期篩選可視化效果。 取消選中該複選框。",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "篩選器不適用於此可視化。",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "無法套用此篩選器,因為此可視化使用了熱門/冷門值篩選器。請移除熱門/冷門值篩選器以套用此篩選器。",
441
+ "configurationPanel.mvfMissingMeasure": "此篩選器中使用的指標已不再存在於工作區中。",
442
+ "filters.mvf.missingMetric.tooltip": "此篩選器中使用的指標已不再存在於工作區中。",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI唔可以按日期篩選。 取消選中該複選框。",
442
444
  "configurationPanel.unrelatedVizDateInfo": "“{dateDataSet}”無法再應用於可視化效果。 選擇其他維度或編輯可視化效果。",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "“{dateDataSet}”唔可以再應用於KPI。 選擇其他維度或編輯KPI。",
@@ -436,6 +436,8 @@ export declare const zh_Hans: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const zh_Hans = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "可视化无法按日期筛选。请取消选中该复选框。",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "筛选器不适用于此可视化。",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "无法应用此筛选器,因为该可视化使用了 Top/bottom values 筛选器。请移除 Top/bottom values 筛选器以应用此筛选器。",
441
+ "configurationPanel.mvfMissingMeasure": "此筛选器中使用的指标在工作区中已不存在。",
442
+ "filters.mvf.missingMetric.tooltip": "此筛选器中使用的指标在工作区中已不存在。",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "KPI 无法按日期筛选。请取消选中该复选框。",
442
444
  "configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\"无法再应用于该可视化。请选择其他范围或编辑该可视化。",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\"无法再应用于该 KPI。请选择其他范围或编辑该 KPI。",
@@ -436,6 +436,8 @@ export declare const zh_Hant: {
436
436
  "configurationPanel.vizCantBeFilteredByDate": string;
437
437
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": string;
438
438
  "configurationPanel.mvfBlockedByRankingFilter": string;
439
+ "configurationPanel.mvfMissingMeasure": string;
440
+ "filters.mvf.missingMetric.tooltip": string;
439
441
  "configurationPanel.kpiCantBeFilteredByDate": string;
440
442
  "configurationPanel.unrelatedVizDateInfo": string;
441
443
  "configurationPanel.unrelatedKpiDateInfo": string;
@@ -438,6 +438,8 @@ export const zh_Hant = {
438
438
  "configurationPanel.vizCantBeFilteredByDate": "可視化無法按日期過濾。取消選取該複選框。",
439
439
  "configurationPanel.vizCantBeFilteredByMeasureValueFilter": "篩選不適用於此視覺化。",
440
440
  "configurationPanel.mvfBlockedByRankingFilter": "無法套用此篩選,因為該視覺化使用了前/後值篩選。請移除前/後值篩選以套用此篩選。",
441
+ "configurationPanel.mvfMissingMeasure": "此篩選器中使用的指標已不存在於工作區中。",
442
+ "filters.mvf.missingMetric.tooltip": "此篩選器中使用的指標已不存在於工作區中。",
441
443
  "configurationPanel.kpiCantBeFilteredByDate": "kpi 無法按日期過濾。取消選取該複選框。",
442
444
  "configurationPanel.unrelatedVizDateInfo": "」{dateDataSet} \" 無法再套用於視覺化。選擇不同的維度或編輯視覺化。",
443
445
  "configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" 無法再套用於 kpi。選擇其他維度或編輯 kpi。",
@@ -6,7 +6,7 @@ import { dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLo
6
6
  import { useAttributeFilterDisplayFormFromMap } from "../../../../_staging/sharedHooks/useAttributeFilterDisplayFormFromMap.js";
7
7
  import { useAttributes } from "../../../../_staging/sharedHooks/useAttributes.js";
8
8
  import { useDashboardSelector } from "../../../../model/react/DashboardStoreProvider.js";
9
- import { selectAllCatalogAttributesMap, selectAllCatalogDateDatasetsMap, selectAllCatalogMeasuresMap, } from "../../../../model/store/catalog/catalogSelectors.js";
9
+ import { selectAllCatalogAttributesMap, selectAllCatalogDateDatasetsMap, selectAllCatalogMeasuresMap, selectCatalogIsLoaded, } from "../../../../model/store/catalog/catalogSelectors.js";
10
10
  import { selectInsightByRef } from "../../../../model/store/insights/insightsSelectors.js";
11
11
  import { selectAttributeFilterConfigsDisplayAsLabelMap } from "../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
12
12
  import { selectFilterContextFilters } from "../../../../model/store/tabs/filterContext/filterContextSelectors.js";
@@ -21,6 +21,7 @@ export function FilterConfiguration({ widget }) {
21
21
  const attrMap = useDashboardSelector(selectAllCatalogAttributesMap);
22
22
  const ddsMap = useDashboardSelector(selectAllCatalogDateDatasetsMap);
23
23
  const measureMap = useDashboardSelector(selectAllCatalogMeasuresMap);
24
+ const isCatalogLoaded = useDashboardSelector(selectCatalogIsLoaded);
24
25
  const displayAsLabelMap = useDashboardSelector(selectAttributeFilterConfigsDisplayAsLabelMap);
25
26
  const draggableFilters = useMemo(() => {
26
27
  return allFilters.filter((f) => isDashboardAttributeFilterItem(f) ||
@@ -71,8 +72,10 @@ export function FilterConfiguration({ widget }) {
71
72
  }
72
73
  else if (isDashboardMeasureValueFilter(filter)) {
73
74
  const { measure, localIdentifier, title } = filter.dashboardMeasureValueFilter;
74
- const measureTitle = title ?? measureMap.get(measure)?.measure.title ?? "";
75
- return (_jsx(MeasureValueFilterConfigurationItem, { measureRef: measure, title: measureTitle, widget: widget, isCompatible: isCompatible(measure), isBlockedByRankingFilter: isBlockedByRankingFilter }, localIdentifier));
75
+ const catalogMeasure = measureMap.get(measure);
76
+ const isMissingMeasure = isCatalogLoaded && !catalogMeasure;
77
+ const measureTitle = title ?? catalogMeasure?.measure.title ?? objRefToString(measure);
78
+ return (_jsx(MeasureValueFilterConfigurationItem, { measureRef: measure, title: measureTitle, widget: widget, isCompatible: isCompatible(measure), isBlockedByRankingFilter: isBlockedByRankingFilter, isMissingMeasure: isMissingMeasure }, localIdentifier));
76
79
  }
77
80
  else {
78
81
  console.warn("Unsupported filter type in FilterConfiguration.", filter);
@@ -5,6 +5,7 @@ interface IMeasureValueFilterConfigurationItemProps {
5
5
  title: string;
6
6
  isCompatible: boolean;
7
7
  isBlockedByRankingFilter: boolean;
8
+ isMissingMeasure?: boolean;
8
9
  }
9
- export declare function MeasureValueFilterConfigurationItem({ widget, measureRef, title, isCompatible, isBlockedByRankingFilter }: IMeasureValueFilterConfigurationItemProps): import("react/jsx-runtime").JSX.Element;
10
+ export declare function MeasureValueFilterConfigurationItem({ widget, measureRef, title, isCompatible, isBlockedByRankingFilter, isMissingMeasure }: IMeasureValueFilterConfigurationItemProps): import("react/jsx-runtime").JSX.Element;
10
11
  export {};
@@ -8,7 +8,7 @@ import { UiTooltip } from "@gooddata/sdk-ui-kit";
8
8
  import { simplifyText } from "@gooddata/util";
9
9
  import { FilterConfigurationItemLabel } from "./FilterConfigurationItemLabel.js";
10
10
  import { useMeasureValueFilterConfigurationHandling } from "./useMeasureValueFilterConfigurationHandling.js";
11
- export function MeasureValueFilterConfigurationItem({ widget, measureRef, title, isCompatible, isBlockedByRankingFilter, }) {
11
+ export function MeasureValueFilterConfigurationItem({ widget, measureRef, title, isCompatible, isBlockedByRankingFilter, isMissingMeasure = false, }) {
12
12
  const [isApplied, setIsApplied] = useState(() => !widget.ignoreDashboardFilters.some((reference) => {
13
13
  if (!isDashboardMeasureValueFilterReference(reference)) {
14
14
  return false;
@@ -18,10 +18,11 @@ export function MeasureValueFilterConfigurationItem({ widget, measureRef, title,
18
18
  const { handleIgnoreChanged, status } = useMeasureValueFilterConfigurationHandling(widget, measureRef, setIsApplied);
19
19
  const isLoading = status === "loading";
20
20
  const isIncompatible = !isCompatible;
21
- const isDisabled = isIncompatible || isBlockedByRankingFilter;
21
+ const isDisabled = isIncompatible || isBlockedByRankingFilter || isMissingMeasure;
22
22
  const isChecked = !isDisabled && isApplied;
23
23
  const classNames = cx(`s-${simplifyText(title)}`, "input-checkbox-label", "filter-by-item", "attribute-filter-by-item", "measure-value-filter-by-item", {
24
24
  "filter-by-item-incompatible": isIncompatible || isBlockedByRankingFilter,
25
+ "filter-by-item-missing-measure": isMissingMeasure,
25
26
  disabled: isDisabled,
26
27
  });
27
28
  const uniqueKey = objRefToString(measureRef);
@@ -29,8 +30,7 @@ export function MeasureValueFilterConfigurationItem({ widget, measureRef, title,
29
30
  if (!isDisabled) {
30
31
  return _jsx("div", { children: checkbox });
31
32
  }
32
- // isIncompatible takes precedence over isBlockedByRankingFilter the catalog
33
- // incompatibility message is more specific.
34
- const tooltipContent = isIncompatible ? (_jsx(FormattedMessage, { id: "configurationPanel.vizCantBeFilteredByMeasureValueFilter" })) : (_jsx(FormattedMessage, { id: "configurationPanel.mvfBlockedByRankingFilter" }));
33
+ // Priority: missing measure > incompatible > blocked by ranking filter
34
+ const tooltipContent = isMissingMeasure ? (_jsx(FormattedMessage, { id: "configurationPanel.mvfMissingMeasure" })) : isIncompatible ? (_jsx(FormattedMessage, { id: "configurationPanel.vizCantBeFilteredByMeasureValueFilter" })) : (_jsx(FormattedMessage, { id: "configurationPanel.mvfBlockedByRankingFilter" }));
35
35
  return (_jsx("div", { children: _jsx(UiTooltip, { arrowPlacement: "top-start", triggerBy: ["hover", "focus"], optimalPlacement: true, anchor: checkbox, content: tooltipContent }) }));
36
36
  }
@@ -5,19 +5,18 @@ import { createSelector } from "@reduxjs/toolkit";
5
5
  import cx from "classnames";
6
6
  import stringify from "json-stable-stringify";
7
7
  import { FormattedMessage } from "react-intl";
8
- import { insightProperties, insightSetFilters, objRefToString, widgetRef, } from "@gooddata/sdk-model";
8
+ import { insightProperties, insightSetFilters, objRefToString, widgetRef } from "@gooddata/sdk-model";
9
9
  import { useBackendStrict, useWorkspaceStrict, } from "@gooddata/sdk-ui";
10
10
  import { IconInsight } from "@gooddata/sdk-ui-kit";
11
11
  import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
12
12
  import { useDashboardAsyncRender } from "../../../../../model/react/useDashboardAsyncRender.js";
13
+ import { useWidgetExecConfig } from "../../../../../model/react/useWidgetExecConfig.js";
13
14
  import { useWidgetExecutionsHandler } from "../../../../../model/react/useWidgetExecutionsHandler.js";
14
15
  import { useWidgetFilters } from "../../../../../model/react/useWidgetFilters.js";
15
16
  import { selectAgGridToken, selectColorPalette, selectEnableExecutionCancelling, selectEnableSnapshotExportAccessibility, selectIsExport, selectLocale, selectMapboxToken, selectMaxZoomLevel, selectSeparators, selectSettings, } from "../../../../../model/store/config/configSelectors.js";
16
17
  import { selectCrossFilteringSelectedPointsByWidgetRef, selectDrillableItems, } from "../../../../../model/store/drill/drillSelectors.js";
17
18
  import { selectPermissions } from "../../../../../model/store/permissions/permissionsSelectors.js";
18
19
  import { selectIsInEditMode, selectIsInExportMode, } from "../../../../../model/store/renderMode/renderModeSelectors.js";
19
- import { selectEffectiveParameterValuesForWidget } from "../../../../../model/store/tabs/parameters/parametersSelectors.js";
20
- import { selectExecutionTimestamp } from "../../../../../model/store/ui/uiSelectors.js";
21
20
  import { useDashboardComponentsContext } from "../../../../dashboardContexts/DashboardComponentsContext.js";
22
21
  import { useMinimalSizeValidation } from "../../../../export/hooks/useMinimalSizeValidation.js";
23
22
  import { useVisualizationExportData } from "../../../../export/useExportData.js";
@@ -182,12 +181,7 @@ export function DashboardInsight({ insight, widget, clientHeight, clientWidth, b
182
181
  // if filter status is success and visualization is loading, render both loading and insight
183
182
  const loading = filtersStatus === "running" || isVisualizationLoading;
184
183
  const exportDataVis = useVisualizationExportData(exportData, isVisualizationInitializing || isVisualizationLoading, !!effectiveError);
185
- const executionTimestamp = useDashboardSelector(selectExecutionTimestamp);
186
- const parameterValues = useDashboardSelector(selectEffectiveParameterValuesForWidget(ref));
187
- const execConfig = useMemo(() => ({
188
- timestamp: executionTimestamp,
189
- ...(parameterValues.length > 0 ? { parameterValues } : {}),
190
- }), [executionTimestamp, parameterValues]);
184
+ const execConfig = useWidgetExecConfig(ref);
191
185
  const { setContent, isTooSmall, fontSize } = useMinimalSizeValidation(minimalWidth, minimalHeight, loading);
192
186
  const isExportSlidesMode = useDashboardSelector(selectIsInExportMode);
193
187
  const shouldLoadingBeHidden = isExportSlidesMode && !loading;
@@ -5,13 +5,13 @@ import { createSelector } from "@reduxjs/toolkit";
5
5
  import { insightSetFilters } from "@gooddata/sdk-model";
6
6
  import { useBackendStrict, useWorkspaceStrict, } from "@gooddata/sdk-ui";
7
7
  import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
8
+ import { useWidgetExecConfig } from "../../../../../model/react/useWidgetExecConfig.js";
8
9
  import { useWidgetFilters } from "../../../../../model/react/useWidgetFilters.js";
9
10
  import { selectCatalogAttributes } from "../../../../../model/store/catalog/catalogSelectors.js";
10
11
  import { selectAgGridToken, selectColorPalette, selectIsExport, selectLocale, selectMapboxToken, selectSeparators, selectSettings, } from "../../../../../model/store/config/configSelectors.js";
11
12
  import { selectDrillableItems } from "../../../../../model/store/drill/drillSelectors.js";
12
13
  import { selectPermissions } from "../../../../../model/store/permissions/permissionsSelectors.js";
13
14
  import { selectPreloadedAttributesWithReferences } from "../../../../../model/store/tabs/filterContext/filterContextSelectors.js";
14
- import { selectExecutionTimestamp } from "../../../../../model/store/ui/uiSelectors.js";
15
15
  import { IntlWrapper } from "../../../../localization/IntlWrapper.js";
16
16
  import { getGeoDefaultDisplayFormRefs } from "../../geoDefaultDisplayFormRefs.js";
17
17
  import { InsightBody } from "../../InsightBody.js";
@@ -107,8 +107,7 @@ export function DrillDialogInsight({ insight, widget, backend, workspace, drillS
107
107
  useEffect(() => {
108
108
  onWidgetFiltersReady?.(filtersForInsight);
109
109
  }, [filtersForInsight, onWidgetFiltersReady]);
110
- const executionTimestamp = useDashboardSelector(selectExecutionTimestamp);
111
- const execConfig = useMemo(() => ({ timestamp: executionTimestamp }), [executionTimestamp]);
110
+ const execConfig = useWidgetExecConfig(widget.ref);
112
111
  return (_jsx("div", { style: insightStyle, children: _jsx("div", { style: insightPositionStyle, children: _jsxs(IntlWrapper, { locale: locale, children: [filtersStatus === "running" || isVisualizationLoading ? _jsx(LoadingComponent, {}) : null, effectiveError ? (_jsx(CustomError, { error: effectiveError,
113
112
  // drill dialog does not measure its size but is always large enough to fit the full content
114
113
  forceFullContent: true })) : null, filtersStatus === "success" ? (_jsx("div", { ref: visualizationContainerRef, className: "insight-view-visualization", style: insightWrapperStyle, children: _jsx(InsightBody, { widget: widget, insight: finalInsight, layerTables: layerTables && layerTables.length > 1 ? layerTables : undefined, backend: effectiveBackend, workspace: effectiveWorkspace, drillableItems: drillableItems, onDrill: onDrill, config: chartConfig, onLoadingChanged: handleLoadingChanged, locale: locale, settings: settings, permissions: permissions, colorPalette: colorPalette, onError: handleError, onExportReady: onExportReady, pushData: handlePushData, ErrorComponent: ErrorComponent, LoadingComponent: LoadingComponent, execConfig: execConfig, drillStep: drillStep }) })) : null] }) }) }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-dashboard",
3
- "version": "11.40.0-alpha.5",
3
+ "version": "11.40.0",
4
4
  "description": "GoodData SDK - Dashboard Component",
5
5
  "license": "LicenseRef-LICENSE",
6
6
  "author": "GoodData Corporation",
@@ -60,19 +60,19 @@
60
60
  "ts-invariant": "0.10.3",
61
61
  "tslib": "2.8.1",
62
62
  "uuid": "11.1.0",
63
- "@gooddata/sdk-backend-base": "11.40.0-alpha.5",
64
- "@gooddata/sdk-backend-spi": "11.40.0-alpha.5",
65
- "@gooddata/sdk-ui": "11.40.0-alpha.5",
66
- "@gooddata/sdk-model": "11.40.0-alpha.5",
67
- "@gooddata/sdk-ui-charts": "11.40.0-alpha.5",
68
- "@gooddata/sdk-ui-ext": "11.40.0-alpha.5",
69
- "@gooddata/sdk-ui-filters": "11.40.0-alpha.5",
70
- "@gooddata/sdk-ui-geo": "11.40.0-alpha.5",
71
- "@gooddata/sdk-ui-kit": "11.40.0-alpha.5",
72
- "@gooddata/sdk-ui-pivot": "11.40.0-alpha.5",
73
- "@gooddata/sdk-ui-theme-provider": "11.40.0-alpha.5",
74
- "@gooddata/sdk-ui-vis-commons": "11.40.0-alpha.5",
75
- "@gooddata/util": "11.40.0-alpha.5"
63
+ "@gooddata/sdk-backend-base": "11.40.0",
64
+ "@gooddata/sdk-backend-spi": "11.40.0",
65
+ "@gooddata/sdk-ui": "11.40.0",
66
+ "@gooddata/sdk-model": "11.40.0",
67
+ "@gooddata/sdk-ui-charts": "11.40.0",
68
+ "@gooddata/sdk-ui-ext": "11.40.0",
69
+ "@gooddata/sdk-ui-filters": "11.40.0",
70
+ "@gooddata/sdk-ui-geo": "11.40.0",
71
+ "@gooddata/sdk-ui-kit": "11.40.0",
72
+ "@gooddata/sdk-ui-pivot": "11.40.0",
73
+ "@gooddata/sdk-ui-theme-provider": "11.40.0",
74
+ "@gooddata/util": "11.40.0",
75
+ "@gooddata/sdk-ui-vis-commons": "11.40.0"
76
76
  },
77
77
  "devDependencies": {
78
78
  "@microsoft/api-documenter": "^7.17.0",
@@ -91,7 +91,7 @@
91
91
  "@typescript-eslint/eslint-plugin": "8.58.0",
92
92
  "@typescript-eslint/parser": "8.58.0",
93
93
  "@typescript/native-preview": "7.0.0-dev.20260202.1",
94
- "@vitest/eslint-plugin": "1.6.6",
94
+ "@vitest/eslint-plugin": "1.6.19",
95
95
  "dependency-cruiser": "17.3.10",
96
96
  "eslint": "^9.39.2",
97
97
  "eslint-import-resolver-typescript": "4.4.4",
@@ -104,7 +104,7 @@
104
104
  "eslint-plugin-react": "7.37.5",
105
105
  "eslint-plugin-react-hooks": "5.2.0",
106
106
  "eslint-plugin-sonarjs": "3.0.6",
107
- "happy-dom": "18.0.1",
107
+ "happy-dom": "20.9.0",
108
108
  "npm-run-all": "^4.1.5",
109
109
  "oxfmt": "0.52.0",
110
110
  "oxlint": "1.51.0",
@@ -118,12 +118,12 @@
118
118
  "typescript": "5.9.3",
119
119
  "vitest": "4.1.8",
120
120
  "vitest-dom": "0.1.1",
121
- "@gooddata/eslint-config": "11.40.0-alpha.5",
122
- "@gooddata/i18n-toolkit": "11.40.0-alpha.5",
123
- "@gooddata/oxlint-config": "11.40.0-alpha.5",
124
- "@gooddata/reference-workspace": "11.40.0-alpha.5",
125
- "@gooddata/sdk-backend-mockingbird": "11.40.0-alpha.5",
126
- "@gooddata/stylelint-config": "11.40.0-alpha.5"
121
+ "@gooddata/eslint-config": "11.40.0",
122
+ "@gooddata/i18n-toolkit": "11.40.0",
123
+ "@gooddata/oxlint-config": "11.40.0",
124
+ "@gooddata/reference-workspace": "11.40.0",
125
+ "@gooddata/sdk-backend-mockingbird": "11.40.0",
126
+ "@gooddata/stylelint-config": "11.40.0"
127
127
  },
128
128
  "peerDependencies": {
129
129
  "react": "^18.0.0 || ^19.0.0",
@@ -142,8 +142,8 @@
142
142
  "dep-cruiser": "depcruise --validate .dependency-cruiser.js --output-type err-long src/",
143
143
  "format-check": "oxfmt --check .",
144
144
  "format-write": "oxfmt .",
145
- "lint": "oxlint . --type-aware --quiet && eslint .",
146
- "lint-fix": "oxlint . --type-aware --quiet --fix && eslint . --fix",
145
+ "lint": "oxlint . --quiet && eslint .",
146
+ "lint-fix": "oxlint . --quiet --fix && eslint . --fix",
147
147
  "scss": "sass --load-path=node_modules styles/scss:styles/css",
148
148
  "stylelint": "stylelint '**/*.scss'",
149
149
  "stylelint-fix": "stylelint '**/*.scss' --fix",
@@ -6565,6 +6565,7 @@ input[type=search]::-webkit-search-cancel-button {
6565
6565
  .gd-ui-kit-control-button--isError {
6566
6566
  font-size: 12px;
6567
6567
  color: var(--gd-palette-error-base, #e54d42);
6568
+ background: var(--gd-palette-error-base-t85, rgba(229, 77, 66, 0.15));
6568
6569
  }
6569
6570
 
6570
6571
  .gd-ui-kit-control-button--disabled {
@@ -6649,12 +6650,21 @@ input[type=search]::-webkit-search-cancel-button {
6649
6650
  display: inline-block;
6650
6651
  flex: 0 1 auto;
6651
6652
  min-width: 0;
6652
- max-width: 120px;
6653
+ max-width: 100%;
6653
6654
  overflow: hidden;
6654
6655
  text-overflow: ellipsis;
6655
6656
  vertical-align: bottom;
6656
6657
  }
6657
6658
 
6659
+ .gd-ui-kit-control-button__subtitle .gd-bubble-trigger,
6660
+ .gd-ui-kit-control-button__subtitle .shortened {
6661
+ display: inline-flex;
6662
+ }
6663
+
6664
+ .gd-ui-kit-control-button__subtitle .shortened {
6665
+ max-width: 100%;
6666
+ }
6667
+
6658
6668
  .gd-attribute-filter-dropdown-button__next,
6659
6669
  .gd-mvf-dashboard-filter-button__next {
6660
6670
  position: relative;
@@ -18804,6 +18814,7 @@ a.gd-button-link:hover .gd-button-text, a.gd-button-link-dimmed:hover .gd-button
18804
18814
  .gd-ui-kit-control-button--isError {
18805
18815
  font-size: 12px;
18806
18816
  color: var(--gd-palette-error-base, #e54d42);
18817
+ background: var(--gd-palette-error-base-t85, rgba(229, 77, 66, 0.15));
18807
18818
  }
18808
18819
 
18809
18820
  .gd-ui-kit-control-button--disabled {
@@ -18888,12 +18899,21 @@ a.gd-button-link:hover .gd-button-text, a.gd-button-link-dimmed:hover .gd-button
18888
18899
  display: inline-block;
18889
18900
  flex: 0 1 auto;
18890
18901
  min-width: 0;
18891
- max-width: 120px;
18902
+ max-width: 100%;
18892
18903
  overflow: hidden;
18893
18904
  text-overflow: ellipsis;
18894
18905
  vertical-align: bottom;
18895
18906
  }
18896
18907
 
18908
+ .gd-ui-kit-control-button__subtitle .gd-bubble-trigger,
18909
+ .gd-ui-kit-control-button__subtitle .shortened {
18910
+ display: inline-flex;
18911
+ }
18912
+
18913
+ .gd-ui-kit-control-button__subtitle .shortened {
18914
+ max-width: 100%;
18915
+ }
18916
+
18897
18917
  .gd-attribute-filter-dropdown-button__next,
18898
18918
  .gd-mvf-dashboard-filter-button__next {
18899
18919
  position: relative;
@@ -23101,6 +23121,10 @@ a.gd-button-link:hover .gd-button-text, a.gd-button-link-dimmed:hover .gd-button
23101
23121
  font-size: 12px;
23102
23122
  }
23103
23123
 
23124
+ .gd-mvf-dropdown-body .gd-mvf-dropdown-section .gd-mvf-treat-null-values-as-zero .input-label-text {
23125
+ white-space: nowrap;
23126
+ }
23127
+
23104
23128
  .gd-mvf-dropdown-body .gd-mvf-dropdown-section .gd-mvf-treat-null-values-as-zero .inlineBubbleHelp {
23105
23129
  margin: 0 0 2px 5px;
23106
23130
  font-size: 12px;
@@ -23204,6 +23228,9 @@ a.gd-button-link:hover .gd-button-text, a.gd-button-link-dimmed:hover .gd-button
23204
23228
 
23205
23229
  .gd-mvf-operator-dropdown-body {
23206
23230
  width: 230px;
23231
+ }
23232
+
23233
+ .gd-mvf-operator-dropdown-body .gd-ui-kit-listbox {
23207
23234
  padding: 5px 0;
23208
23235
  }
23209
23236