@gooddata/sdk-ui-pluggable-host 11.41.0-alpha.4 → 11.41.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.
- package/esm/components/FullScreenLoader.d.ts +1 -0
- package/esm/components/FullScreenLoader.d.ts.map +1 -0
- package/esm/components/HostUiContainer.d.ts +1 -0
- package/esm/components/HostUiContainer.d.ts.map +1 -0
- package/esm/components/HostUiContainer.js +16 -2
- package/esm/components/Root.d.ts +1 -0
- package/esm/components/Root.d.ts.map +1 -0
- package/esm/components/lib/translations.d.ts +1 -0
- package/esm/components/lib/translations.d.ts.map +1 -0
- package/esm/components/useRedirectNavigation.d.ts +1 -0
- package/esm/components/useRedirectNavigation.d.ts.map +1 -0
- package/esm/components/useRedirectTarget.d.ts +1 -0
- package/esm/components/useRedirectTarget.d.ts.map +1 -0
- package/esm/debug.d.ts +1 -0
- package/esm/debug.d.ts.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/lib/chunkReloadGuard.d.ts +1 -0
- package/esm/lib/chunkReloadGuard.d.ts.map +1 -0
- package/esm/lib/hostNotifications.d.ts +1 -0
- package/esm/lib/hostNotifications.d.ts.map +1 -0
- package/esm/lib/isProduction.d.ts +1 -0
- package/esm/lib/isProduction.d.ts.map +1 -0
- package/esm/loader/appSecurityValidation.d.ts +57 -0
- package/esm/loader/appSecurityValidation.d.ts.map +1 -0
- package/esm/loader/appSecurityValidation.js +102 -0
- package/esm/loader/lastVisitedApp.d.ts +1 -0
- package/esm/loader/lastVisitedApp.d.ts.map +1 -0
- package/esm/loader/localLoader.d.ts +1 -0
- package/esm/loader/localLoader.d.ts.map +1 -0
- package/esm/loader/pluggableApplicationsLoader.d.ts +1 -0
- package/esm/loader/pluggableApplicationsLoader.d.ts.map +1 -0
- package/esm/loader/redirectLogic.d.ts +1 -0
- package/esm/loader/redirectLogic.d.ts.map +1 -0
- package/esm/loader/remoteLoader.d.ts +1 -0
- package/esm/loader/remoteLoader.d.ts.map +1 -0
- package/esm/loader/remoteUrlSecurity.d.ts +1 -0
- package/esm/loader/remoteUrlSecurity.d.ts.map +1 -0
- package/esm/loader/routing.d.ts +1 -0
- package/esm/loader/routing.d.ts.map +1 -0
- package/esm/platformContext/backend.d.ts +1 -0
- package/esm/platformContext/backend.d.ts.map +1 -0
- package/esm/platformContext/bootstrap.d.ts +1 -0
- package/esm/platformContext/bootstrap.d.ts.map +1 -0
- package/esm/platformContext/loadPlatformContext.d.ts +1 -0
- package/esm/platformContext/loadPlatformContext.d.ts.map +1 -0
- package/esm/platformContext/tigerNotAuthenticatedHandler.d.ts +1 -0
- package/esm/platformContext/tigerNotAuthenticatedHandler.d.ts.map +1 -0
- package/esm/platformContext/types.d.ts +1 -0
- package/esm/platformContext/types.d.ts.map +1 -0
- package/esm/platformContext/useLoadPlatformContext.d.ts +1 -0
- package/esm/platformContext/useLoadPlatformContext.d.ts.map +1 -0
- package/esm/platformContext/useWorkspaceColorPalette.d.ts +1 -0
- package/esm/platformContext/useWorkspaceColorPalette.d.ts.map +1 -0
- package/esm/platformContext/useWorkspacePermissions.d.ts +1 -0
- package/esm/platformContext/useWorkspacePermissions.d.ts.map +1 -0
- package/esm/platformContext/useWorkspaceSettings.d.ts +1 -0
- package/esm/platformContext/useWorkspaceSettings.d.ts.map +1 -0
- package/esm/platformContext/useWorkspaceTheme.d.ts +1 -0
- package/esm/platformContext/useWorkspaceTheme.d.ts.map +1 -0
- package/esm/platformContext/waitForInjectedApiToken.d.ts +1 -0
- package/esm/platformContext/waitForInjectedApiToken.d.ts.map +1 -0
- package/esm/registry/pluggableApplicationsRegistry.d.ts +1 -0
- package/esm/registry/pluggableApplicationsRegistry.d.ts.map +1 -0
- package/esm/translations/de-DE.json +4 -1
- package/esm/translations/en-AU.json +4 -1
- package/esm/translations/en-GB.json +4 -1
- package/esm/translations/en-US.json +52 -0
- package/esm/translations/es-419.json +4 -1
- package/esm/translations/es-ES.json +4 -1
- package/esm/translations/fi-FI.json +4 -1
- package/esm/translations/fr-CA.json +4 -1
- package/esm/translations/fr-FR.json +4 -1
- package/esm/translations/id-ID.json +4 -1
- package/esm/translations/it-IT.json +4 -1
- package/esm/translations/ja-JP.json +4 -1
- package/esm/translations/ko-KR.json +4 -1
- package/esm/translations/nl-NL.json +4 -1
- package/esm/translations/pl-PL.json +4 -1
- package/esm/translations/pt-BR.json +4 -1
- package/esm/translations/pt-PT.json +4 -1
- package/esm/translations/ru-RU.json +4 -1
- package/esm/translations/sl-SI.json +4 -1
- package/esm/translations/th-TH.json +4 -1
- package/esm/translations/tr-TR.json +4 -1
- package/esm/translations/uk-UA.json +4 -1
- package/esm/translations/vi-VN.json +4 -1
- package/esm/translations/zh-HK.json +4 -1
- package/esm/translations/zh-Hans.json +4 -1
- package/esm/translations/zh-Hant.json +4 -1
- package/esm/types/lifecycle.d.ts +1 -0
- package/esm/types/lifecycle.d.ts.map +1 -0
- package/esm/ui/DefaultHostUi.d.ts +1 -0
- package/esm/ui/DefaultHostUi.d.ts.map +1 -0
- package/esm/ui/DefaultHostUi.js +10 -3
- package/esm/ui/GenAIChat.d.ts +1 -0
- package/esm/ui/GenAIChat.d.ts.map +1 -0
- package/esm/ui/HostChrome.d.ts +7 -1
- package/esm/ui/HostChrome.d.ts.map +1 -0
- package/esm/ui/HostChrome.js +37 -14
- package/esm/ui/HostIntlProvider.d.ts +1 -0
- package/esm/ui/HostIntlProvider.d.ts.map +1 -0
- package/esm/ui/HostNotificationDispatcher.d.ts +1 -0
- package/esm/ui/HostNotificationDispatcher.d.ts.map +1 -0
- package/esm/ui/PluggableApplicationRenderer.d.ts +3 -1
- package/esm/ui/PluggableApplicationRenderer.d.ts.map +1 -0
- package/esm/ui/PluggableApplicationRenderer.js +70 -10
- package/esm/ui/PluggableApplicationRenderer.scss +31 -1
- package/esm/ui/SemanticSearch.d.ts +1 -0
- package/esm/ui/SemanticSearch.d.ts.map +1 -0
- package/esm/ui/WorkspacePicker.d.ts +1 -0
- package/esm/ui/WorkspacePicker.d.ts.map +1 -0
- package/esm/ui/appMenuItems.d.ts +2 -0
- package/esm/ui/appMenuItems.d.ts.map +1 -0
- package/esm/ui/appMenuItems.js +1 -1
- package/esm/ui/chromeHelpers.d.ts +1 -0
- package/esm/ui/chromeHelpers.d.ts.map +1 -0
- package/esm/ui/hostChromeBem.d.ts +1 -0
- package/esm/ui/hostChromeBem.d.ts.map +1 -0
- package/esm/ui/resolveHostUiModule.d.ts +1 -0
- package/esm/ui/resolveHostUiModule.d.ts.map +1 -0
- package/esm/ui/useHostChromeChat.d.ts +1 -0
- package/esm/ui/useHostChromeChat.d.ts.map +1 -0
- package/esm/ui/useHostChromePricing.d.ts +1 -0
- package/esm/ui/useHostChromePricing.d.ts.map +1 -0
- package/esm/ui/useHostChromeSearch.d.ts +1 -0
- package/esm/ui/useHostChromeSearch.d.ts.map +1 -0
- package/esm/ui/useHostChromeWorkspaceFeatures.d.ts +1 -0
- package/esm/ui/useHostChromeWorkspaceFeatures.d.ts.map +1 -0
- package/package.json +17 -17
|
@@ -75,6 +75,22 @@
|
|
|
75
75
|
"text": "Something went wrong",
|
|
76
76
|
"crowdinContext": "Heading displayed when an unexpected error occurs during application redirect resolution."
|
|
77
77
|
},
|
|
78
|
+
"gs.host.error.appNotAllowedForOrganization": {
|
|
79
|
+
"text": "This application is not available for your organization.",
|
|
80
|
+
"crowdinContext": "Error shown when the host refuses to mount a pluggable application because the current organization is not in the application's build-time-baked allowlist of permitted organizations."
|
|
81
|
+
},
|
|
82
|
+
"gs.host.error.appBuildExpired": {
|
|
83
|
+
"text": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
84
|
+
"crowdinContext": "Error shown when the host refuses to mount a pluggable application because its build is older than the freshness window (currently 30 days)."
|
|
85
|
+
},
|
|
86
|
+
"gs.host.error.appSecurityMetadataMissing": {
|
|
87
|
+
"text": "This application is missing required security metadata and cannot be loaded.",
|
|
88
|
+
"crowdinContext": "Error shown when the host refuses to mount a pluggable application loaded from a secured remote origin that does not declare its allowed organizations and build timestamp."
|
|
89
|
+
},
|
|
90
|
+
"gs.host.demoApp.validUntil": {
|
|
91
|
+
"text": "Demo application valid till {date}",
|
|
92
|
+
"crowdinContext": "Text in a small floating badge shown at the bottom-right of the page for a validated demo application loaded from the demo bucket. {date} is the localized date until which the demo build remains valid."
|
|
93
|
+
},
|
|
78
94
|
"gs.host.notification.newDeployment.message": {
|
|
79
95
|
"text": "A new version of GoodData is available.",
|
|
80
96
|
"crowdinContext": "Toast message shown when the host detects that a newer build of the application has been deployed while the user's tab was open. Followed by a reload link."
|
|
@@ -99,6 +115,42 @@
|
|
|
99
115
|
"text": "Managing users and user groups",
|
|
100
116
|
"crowdinContext": "Link to user management documentation in help menu"
|
|
101
117
|
},
|
|
118
|
+
"gs.header.helpMenu.connecting": {
|
|
119
|
+
"text": "Connecting data",
|
|
120
|
+
"crowdinContext": "LDM Modeler help menu link to data connection guide"
|
|
121
|
+
},
|
|
122
|
+
"gs.header.helpMenu.starting": {
|
|
123
|
+
"text": "Starting with LDM Modeler",
|
|
124
|
+
"crowdinContext": "LDM Modeler help menu link to getting started guide"
|
|
125
|
+
},
|
|
126
|
+
"gs.header.helpMenu.modeling": {
|
|
127
|
+
"text": "Modeling data in depth",
|
|
128
|
+
"crowdinContext": "LDM Modeler help menu link to data modeling guide"
|
|
129
|
+
},
|
|
130
|
+
"gs.header.helpMenu.understanding": {
|
|
131
|
+
"text": "Understanding the Logical Data Model",
|
|
132
|
+
"crowdinContext": "LDM Modeler help menu link to LDM concept guide"
|
|
133
|
+
},
|
|
134
|
+
"gs.header.helpMenu.learning": {
|
|
135
|
+
"text": "Learning the principles of data modeling",
|
|
136
|
+
"crowdinContext": "LDM Modeler help menu link to data modeling principles"
|
|
137
|
+
},
|
|
138
|
+
"gs.header.helpMenu.firstSteps": {
|
|
139
|
+
"text": "First steps in Analytical Designer",
|
|
140
|
+
"crowdinContext": "Analytical Designer help menu link to getting started guide"
|
|
141
|
+
},
|
|
142
|
+
"gs.header.helpMenu.visualizing": {
|
|
143
|
+
"text": "Visualizing your data",
|
|
144
|
+
"crowdinContext": "Analytical Designer help menu link to data visualization guide"
|
|
145
|
+
},
|
|
146
|
+
"gs.header.helpMenu.sorting": {
|
|
147
|
+
"text": "Sorting and filtering your results",
|
|
148
|
+
"crowdinContext": "Analytical Designer help menu link to sorting and filtering guide"
|
|
149
|
+
},
|
|
150
|
+
"gs.header.helpMenu.embedding": {
|
|
151
|
+
"text": "Embedding Analytical Designer into your app",
|
|
152
|
+
"crowdinContext": "Analytical Designer help menu link to embedding integration guide"
|
|
153
|
+
},
|
|
102
154
|
"messages.genAi.visualisation.saved.success": {
|
|
103
155
|
"text": "Great! We saved your visualization.",
|
|
104
156
|
"crowdinContext": "Success message when generative AI visualization is saved"
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "El enlace de visualización se ha copiado en el portapapeles.",
|
|
31
31
|
"messages.showMore": "Mostrar más",
|
|
32
32
|
"messages.showLess": "Mostrar menos",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Crear una nueva visualización basada en: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Crear una nueva visualización basada en: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "El enlace de visualización se ha copiado en el portapapeles.",
|
|
31
31
|
"messages.showMore": "Mostrar más",
|
|
32
32
|
"messages.showLess": "Mostrar menos",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Construir una nueva visualización basada en{question}: "
|
|
33
|
+
"gen-ai.ask-assistant.search": "Construir una nueva visualización basada en{question}: ",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Visualisointilinkki on kopioitu leikepöydällesi.",
|
|
31
31
|
"messages.showMore": "Näytä lisää",
|
|
32
32
|
"messages.showLess": "Näytä vähemmän",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Luo uusi visualisointi, joka perustuu{question}: "
|
|
33
|
+
"gen-ai.ask-assistant.search": "Luo uusi visualisointi, joka perustuu{question}: ",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Le lien de visualisation a été copié dans votre presse-papiers.",
|
|
31
31
|
"messages.showMore": "Montrer plus",
|
|
32
32
|
"messages.showLess": "Montrer moins",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Construire une nouvelle visualisation basée sur: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Construire une nouvelle visualisation basée sur: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Le lien de la visualisation a été copié dans votre presse-papiers.",
|
|
31
31
|
"messages.showMore": "Montrer plus",
|
|
32
32
|
"messages.showLess": "Montrer moins",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Construire une nouvelle visualisation bas\u0000e9e sur\u0000a0: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Construire une nouvelle visualisation bas\u0000e9e sur\u0000a0: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Tautan visualisasi telah disalin ke clipboard Anda.",
|
|
31
31
|
"messages.showMore": "Tampilkan lebih banyak",
|
|
32
32
|
"messages.showLess": "Tampilkan lebih sedikit",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Bangun visualisasi baru berdasarkan: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Bangun visualisasi baru berdasarkan: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Il link di visualizzazione è stato copiato negli appunti.",
|
|
31
31
|
"messages.showMore": "Mostra di più",
|
|
32
32
|
"messages.showLess": "Mostra di meno",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Costruire nuove visualizzazioni basate su: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Costruire nuove visualizzazioni basate su: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "視覚化リンクがクリップボードにコピーされました。",
|
|
31
31
|
"messages.showMore": "もっと表示",
|
|
32
32
|
"messages.showLess": "表示を減らす",
|
|
33
|
-
"gen-ai.ask-assistant.search": "新しいビジュアライゼーションを構築する:{question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "新しいビジュアライゼーションを構築する:{question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "시각화 링크가 클립보드에 복사되었습니다.",
|
|
31
31
|
"messages.showMore": "더 보기",
|
|
32
32
|
"messages.showLess": "간단히 보기",
|
|
33
|
-
"gen-ai.ask-assistant.search": "새 시각화 생성 기준: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "새 시각화 생성 기준: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "De visualisatielink is gekopieerd naar je klembord.",
|
|
31
31
|
"messages.showMore": "Meer tonen",
|
|
32
32
|
"messages.showLess": "Minder tonen",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Bouw nieuwe visualisatie gebaseerd op: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Bouw nieuwe visualisatie gebaseerd op: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Link do Wizualizacji został skopiowany do schowka.",
|
|
31
31
|
"messages.showMore": "Pokaż więcej",
|
|
32
32
|
"messages.showLess": "Pokaż mniej",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Utwórz nową wizualizację na podstawie: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Utwórz nową wizualizację na podstawie: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "O link de visualização foi copiado para a área de transferência.",
|
|
31
31
|
"messages.showMore": "Exibir mais",
|
|
32
32
|
"messages.showLess": "Exibir menos",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Crie uma nova visualização com base em: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Crie uma nova visualização com base em: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "O link de visualização foi copiado para a área de transferência.",
|
|
31
31
|
"messages.showMore": "Mostrar mais",
|
|
32
32
|
"messages.showLess": "Mostrar menos",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Crie uma nova visualização com base em: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Crie uma nova visualização com base em: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Ссылка на визуализацию скопирована в буфер обмена.",
|
|
31
31
|
"messages.showMore": "Раскрыть",
|
|
32
32
|
"messages.showLess": "Скрыть",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Создайте новую визуализацию на основе: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Создайте новую визуализацию на основе: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Povezava vizualizacije je bila kopirana v vašo odlagališče.",
|
|
31
31
|
"messages.showMore": "Prikaži več",
|
|
32
32
|
"messages.showLess": "Prikaži manj",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Ustvarite novo vizualizacijo na osnovi: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Ustvarite novo vizualizacijo na osnovi: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "คัดลอกลิงก์การแสดงภาพข้อมูลไปยังคลิปบอร์ดของคุณแล้ว",
|
|
31
31
|
"messages.showMore": "แสดงเพิ่มเติม",
|
|
32
32
|
"messages.showLess": "แสดงน้อยลง",
|
|
33
|
-
"gen-ai.ask-assistant.search": "สร้างการแสดงภาพข้อมูลใหม่โดยอิงตาม: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "สร้างการแสดงภาพข้อมูลใหม่โดยอิงตาม: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Görselleştirme bağlantısı panonuza kopyalandı.",
|
|
31
31
|
"messages.showMore": "Daha fazla göster",
|
|
32
32
|
"messages.showLess": "Daha az göster",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Yeni görselleştirme oluştur: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Yeni görselleştirme oluştur: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Посилання на візуалізацію скопійовано до буфера обміну.",
|
|
31
31
|
"messages.showMore": "Показати більше",
|
|
32
32
|
"messages.showLess": "Показати менше",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Створити нову візуалізацію на основі: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Створити нову візуалізацію на основі: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "Liên kết trực quan hóa đã được sao chép vào bảng nhớ tạm của bạn.",
|
|
31
31
|
"messages.showMore": "Hiện thêm",
|
|
32
32
|
"messages.showLess": "Hiện ít",
|
|
33
|
-
"gen-ai.ask-assistant.search": "Tạo trực quan hóa mới dựa trên: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "Tạo trực quan hóa mới dựa trên: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "可視化連結已複製到剪貼板。",
|
|
31
31
|
"messages.showMore": "顯示更多",
|
|
32
32
|
"messages.showLess": "顯示簡要信息",
|
|
33
|
-
"gen-ai.ask-assistant.search": "根據以下條件構建新嘅可視化: {question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "根據以下條件構建新嘅可視化: {question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "可视化链接已复制到您的剪贴板。",
|
|
31
31
|
"messages.showMore": "显示更多",
|
|
32
32
|
"messages.showLess": "显示更少",
|
|
33
|
-
"gen-ai.ask-assistant.search": "根据以下内容构建新的可视化:{question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "根据以下内容构建新的可视化:{question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
|
@@ -30,5 +30,8 @@
|
|
|
30
30
|
"messages.genAi.visualisation.link.copied": "視覺化連結已複製到您的剪貼簿。",
|
|
31
31
|
"messages.showMore": "展示更多",
|
|
32
32
|
"messages.showLess": "顯示較少",
|
|
33
|
-
"gen-ai.ask-assistant.search": "根據以下內容建立新的視覺化:{question}"
|
|
33
|
+
"gen-ai.ask-assistant.search": "根據以下內容建立新的視覺化:{question}",
|
|
34
|
+
"gs.host.error.appNotAllowedForOrganization": "This application is not available for your organization.",
|
|
35
|
+
"gs.host.error.appBuildExpired": "This application is out of date and must be rebuilt by its author before it can run again.",
|
|
36
|
+
"gs.host.error.appSecurityMetadataMissing": "This application is missing required security metadata and cannot be loaded."
|
|
34
37
|
}
|
package/esm/types/lifecycle.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/types/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAEnC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAG/C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAGxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,+BAA+B,CAAC;CACjF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultHostUi.d.ts","sourceRoot":"","sources":["../../src/ui/DefaultHostUi.tsx"],"names":[],"mappings":"AAQA,OAAO,EAEH,KAAK,aAAa,EAKrB,MAAM,2CAA2C,CAAC;AAInD,OAAO,sBAAsB,CAAC;AAgK9B;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAEjC,CAAC"}
|
package/esm/ui/DefaultHostUi.js
CHANGED
|
@@ -12,17 +12,18 @@ function HostUiBridge({ initialCtx, initialApps, initialPathname, navigate, repl
|
|
|
12
12
|
const [pathname, setPathname] = useState(initialPathname);
|
|
13
13
|
const [headerOptions, setHeaderOptions] = useState(undefined);
|
|
14
14
|
const [notification, setNotification] = useState(null);
|
|
15
|
+
const [pageTitle, setPageTitle] = useState(undefined);
|
|
15
16
|
const appContainerRef = useRef(null);
|
|
16
17
|
// Layout effect runs in the same synchronous commit as flushSync.
|
|
17
18
|
useLayoutEffect(() => {
|
|
18
|
-
onReady(setCtx, setApps, setPathname, setHeaderOptions, setNotification);
|
|
19
|
+
onReady(setCtx, setApps, setPathname, setHeaderOptions, setNotification, setPageTitle);
|
|
19
20
|
if (appContainerRef.current) {
|
|
20
21
|
onAppContainerReady(appContainerRef.current);
|
|
21
22
|
}
|
|
22
23
|
// Only call once on mount
|
|
23
24
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
25
|
}, []);
|
|
25
|
-
return (_jsx(HostChrome, { ctx: ctx, resolvedApplications: apps, pathname: pathname, onNavigate: navigate, onReplace: replace, headerOptions: headerOptions, notification: notification, children: _jsx("div", { ref: appContainerRef, className: e("app-container") }) }));
|
|
26
|
+
return (_jsx(HostChrome, { ctx: ctx, resolvedApplications: apps, pathname: pathname, onNavigate: navigate, onReplace: replace, headerOptions: headerOptions, notification: notification, appPageTitle: pageTitle, children: _jsx("div", { ref: appContainerRef, className: e("app-container") }) }));
|
|
26
27
|
}
|
|
27
28
|
// ---------------------------------------------------------------------------
|
|
28
29
|
// Imperative mount function conforming to IHostUiModule
|
|
@@ -36,17 +37,19 @@ function mountDefaultHostUi(options) {
|
|
|
36
37
|
let updatePathnameFn = null;
|
|
37
38
|
let updateHeaderFn = null;
|
|
38
39
|
let updateNotificationFn = null;
|
|
40
|
+
let updateDocumentTitleFn = null;
|
|
39
41
|
// Use flushSync so that the DOM is ready synchronously after mount() returns,
|
|
40
42
|
// making getAppContainer() safe to call immediately.
|
|
41
43
|
flushSync(() => {
|
|
42
44
|
reactRoot?.render(_jsx(HostUiBridge, { initialCtx: ctx, initialApps: resolvedApplications, initialPathname: pathname, navigate: navigate, replace: replace, onAppContainerReady: (el) => {
|
|
43
45
|
appContainer = el;
|
|
44
|
-
}, onReady: (setCtx, setApps, setPathname, setHeaderOptions, setNotification) => {
|
|
46
|
+
}, onReady: (setCtx, setApps, setPathname, setHeaderOptions, setNotification, setPageTitle) => {
|
|
45
47
|
updateCtxFn = setCtx;
|
|
46
48
|
updateAppsFn = setApps;
|
|
47
49
|
updatePathnameFn = setPathname;
|
|
48
50
|
updateHeaderFn = setHeaderOptions;
|
|
49
51
|
updateNotificationFn = setNotification;
|
|
52
|
+
updateDocumentTitleFn = setPageTitle;
|
|
50
53
|
} }));
|
|
51
54
|
});
|
|
52
55
|
return {
|
|
@@ -60,6 +63,7 @@ function mountDefaultHostUi(options) {
|
|
|
60
63
|
updatePathnameFn = null;
|
|
61
64
|
updateHeaderFn = null;
|
|
62
65
|
updateNotificationFn = null;
|
|
66
|
+
updateDocumentTitleFn = null;
|
|
63
67
|
root.unmount();
|
|
64
68
|
}
|
|
65
69
|
},
|
|
@@ -75,6 +79,9 @@ function mountDefaultHostUi(options) {
|
|
|
75
79
|
updateHeader(header) {
|
|
76
80
|
updateHeaderFn?.(header);
|
|
77
81
|
},
|
|
82
|
+
updateDocumentTitle(pageTitle) {
|
|
83
|
+
updateDocumentTitleFn?.(pageTitle);
|
|
84
|
+
},
|
|
78
85
|
getAppContainer() {
|
|
79
86
|
if (!appContainer) {
|
|
80
87
|
throw new Error("Host UI app container is not available. " +
|
package/esm/ui/GenAIChat.d.ts
CHANGED
|
@@ -41,3 +41,4 @@ export interface IGenAIChatProps {
|
|
|
41
41
|
onEvent?: (event: GenAIChatEvent) => void;
|
|
42
42
|
}
|
|
43
43
|
export declare function GenAIChat({ workspaceId, open, onOpen, onClose, askedQuestion, canManageProject, canAnalyzeProject, canFullControl, settings, onEvent }: IGenAIChatProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
//# sourceMappingURL=GenAIChat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenAIChat.d.ts","sourceRoot":"","sources":["../../src/ui/GenAIChat.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGxE,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EAEnB,KAAK,oBAAoB,EAY5B,MAAM,yBAAyB,CAAC;AAWjC;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAI7E,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAgB,SAAS,CAAC,EACtB,WAAW,EACX,IAAI,EACJ,MAAM,EACN,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,OAAO,EACV,EAAE,eAAe,2CAyHjB"}
|
package/esm/ui/HostChrome.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export interface IHostChromeProps {
|
|
|
14
14
|
onReplace: (url: string) => void;
|
|
15
15
|
headerOptions?: IAppHeaderOptions;
|
|
16
16
|
notification?: IHostUiNotification | null;
|
|
17
|
+
/**
|
|
18
|
+
* Page-title segment set by the active pluggable application via a document-title-changed
|
|
19
|
+
* event. When omitted, the active application's manifest title is used instead.
|
|
20
|
+
*/
|
|
21
|
+
appPageTitle?: string;
|
|
17
22
|
children?: ReactNode;
|
|
18
23
|
}
|
|
19
|
-
export declare function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, onReplace: _onReplace, headerOptions, notification, children }: IHostChromeProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, onReplace: _onReplace, headerOptions, notification, appPageTitle, children }: IHostChromeProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=HostChrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HostChrome.d.ts","sourceRoot":"","sources":["../../src/ui/HostChrome.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuC,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAElG,OAAO,EAGH,KAAK,gCAAgC,EACxC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACxB,MAAM,2CAA2C,CAAC;AAgCnD,OAAO,mBAAmB,CAAC;AAK3B,OAAO,0CAA0C,CAAC;AAClD,OAAO,6CAA6C,CAAC;AACrD,OAAO,sDAAsD,CAAC;AAC9D,OAAO,0DAA0D,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,gBAAgB,CAAC;IACtB,oBAAoB,EAAE,gCAAgC,EAAE,CAAC;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,YAAY,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,EACvB,GAAG,EACH,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,SAAS,EAAE,UAAU,EACrB,aAAa,EACb,YAAmB,EACnB,YAAY,EACZ,QAAQ,EACX,EAAE,gBAAgB,2CAwNlB"}
|
package/esm/ui/HostChrome.js
CHANGED
|
@@ -4,13 +4,13 @@ import { useCallback, useMemo } from "react";
|
|
|
4
4
|
import { isExternalPluggableApplicationRegistryItem, } from "@gooddata/sdk-model";
|
|
5
5
|
import { BackendProvider, resolveLocale } from "@gooddata/sdk-ui";
|
|
6
6
|
import { AppHeaderNotifications } from "@gooddata/sdk-ui-application-header";
|
|
7
|
-
import { AppHeader, ToastsCenterContextProvider, generateHeaderStaticHelpMenuItems, } from "@gooddata/sdk-ui-kit";
|
|
7
|
+
import { AppHeader, DocumentHeader, ToastsCenterContextProvider, generateHeaderAccountMenuItems, generateHeaderStaticHelpMenuItems, } from "@gooddata/sdk-ui-kit";
|
|
8
8
|
import { defaultHeaderTheme } from "@gooddata/sdk-ui-theme-provider";
|
|
9
9
|
import defaultLogoUrl from "../assets/logo-white.svg";
|
|
10
10
|
import { getAppLifecycleCallbacks, preloadPluggableApplication, } from "../loader/pluggableApplicationsLoader.js";
|
|
11
|
-
import { getApplicationHref } from "../loader/routing.js";
|
|
11
|
+
import { getActiveInternalApplication, getApplicationHref } from "../loader/routing.js";
|
|
12
12
|
import { getBackend } from "../platformContext/backend.js";
|
|
13
|
-
import { buildAppMenu } from "./appMenuItems.js";
|
|
13
|
+
import { buildAppMenu, getLocalizedTitle } from "./appMenuItems.js";
|
|
14
14
|
import { getUserDisplayName, swapWorkspaceInPath } from "./chromeHelpers.js";
|
|
15
15
|
import { b, e } from "./hostChromeBem.js";
|
|
16
16
|
import { HostIntlProvider } from "./HostIntlProvider.js";
|
|
@@ -30,7 +30,7 @@ import "@gooddata/sdk-ui-gen-ai/styles/css/main.css";
|
|
|
30
30
|
import "@gooddata/sdk-ui-semantic-search/styles/css/main.css";
|
|
31
31
|
import "@gooddata/sdk-ui-semantic-search/styles/css/internal.css";
|
|
32
32
|
const LOGOUT_MENU_ITEM_KEY = "gs.header.logout";
|
|
33
|
-
export function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, onReplace: _onReplace, headerOptions, notification = null, children, }) {
|
|
33
|
+
export function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, onReplace: _onReplace, headerOptions, notification = null, appPageTitle, children, }) {
|
|
34
34
|
const locale = resolveLocale(ctx.preferredLocale);
|
|
35
35
|
const userName = getUserDisplayName(ctx.user);
|
|
36
36
|
const features = useHostChromeWorkspaceFeatures(resolvedApplications, ctx, pathname);
|
|
@@ -44,21 +44,23 @@ export function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, on
|
|
|
44
44
|
telemetry: shellTelemetry,
|
|
45
45
|
});
|
|
46
46
|
const { menuItemsGroups, messages: appMessages } = useMemo(() => buildAppMenu(resolvedApplications, ctx, pathname, ctx.preferredLocale), [resolvedApplications, ctx, pathname]);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
},
|
|
55
|
-
], []);
|
|
47
|
+
// The default help menu links exclusively to GoodData resources (documentation, university,
|
|
48
|
+
// community, Slack). When white-labeling is enabled (the "Hide links to GoodData documentation"
|
|
49
|
+
// setting) those must not leak into the branded header, so the host renders no default help
|
|
50
|
+
// menu. Apps may still supply their own help items via headerOptions.
|
|
51
|
+
const helpMenuItems = useMemo(() => headerOptions?.helpMenuItems ??
|
|
52
|
+
(ctx.whiteLabeling?.enabled ? [] : generateHeaderStaticHelpMenuItems()), [headerOptions, ctx.whiteLabeling?.enabled]);
|
|
53
|
+
const accountMenuItems = useMemo(() => generateHeaderAccountMenuItems(ctx.workspacePermissions ?? {}, features.workspaceId, ctx.settings), [ctx.workspacePermissions, features.workspaceId, ctx.settings]);
|
|
56
54
|
const handleMenuItemClick = useCallback((item, e) => {
|
|
57
55
|
e?.preventDefault();
|
|
58
56
|
if (item.onClick) {
|
|
59
57
|
item.onClick(e ?? null);
|
|
60
58
|
return;
|
|
61
59
|
}
|
|
60
|
+
if (item.key === LOGOUT_MENU_ITEM_KEY) {
|
|
61
|
+
void getBackend().deauthenticate();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
62
64
|
if (item.href) {
|
|
63
65
|
if (item.target === "_blank") {
|
|
64
66
|
window.open(item.href, "_blank", "noopener,noreferrer");
|
|
@@ -103,11 +105,32 @@ export function HostChrome({ ctx, resolvedApplications, pathname, onNavigate, on
|
|
|
103
105
|
const logoTitle = ctx.whiteLabeling?.enabled
|
|
104
106
|
? ctx.user.organizationName || defaultLogoTitle
|
|
105
107
|
: defaultLogoTitle;
|
|
108
|
+
// White-label icons are applied whenever their URLs are set, independent of the `enabled`
|
|
109
|
+
// flag (matching the standalone apps and the Appearance behavior). The favicon falls back to
|
|
110
|
+
// the default served at /favicon.ico so a previously applied custom favicon is reset once its
|
|
111
|
+
// URL is cleared, instead of leaving the stale icon in place.
|
|
112
|
+
const faviconUrl = ctx.whiteLabeling?.faviconUrl || "/favicon.ico";
|
|
113
|
+
// The host owns the browser tab title as "{page} - {brand}". The page segment defaults to the
|
|
114
|
+
// active application's manifest title, but an embedded app can override it dynamically by emitting
|
|
115
|
+
// a document-title-changed event (surfaced here as `appPageTitle`). When white-labeling
|
|
116
|
+
// is enabled the brand is the organization name — preferring the user profile's name, then the
|
|
117
|
+
// resolved organization descriptor title (the profile field is optional) — and is omitted (so
|
|
118
|
+
// DocumentHeader drops the " - " separator) only when neither is set. The GoodData product name
|
|
119
|
+
// is used solely when white-labeling is disabled, so a branded org never falls back to it.
|
|
120
|
+
const activeApplication = getActiveInternalApplication(resolvedApplications, ctx, pathname);
|
|
121
|
+
// An app may report an empty page segment (e.g. no insight open); treat it the same as `undefined`
|
|
122
|
+
// (omitted) so the tab falls back to the active application's manifest title rather than going blank.
|
|
123
|
+
const documentPageTitle = appPageTitle ||
|
|
124
|
+
(activeApplication ? getLocalizedTitle(activeApplication, ctx.preferredLocale) : undefined);
|
|
125
|
+
const documentBrandTitle = ctx.whiteLabeling?.enabled
|
|
126
|
+
? ctx.user.organizationName || ctx.organization?.title || ""
|
|
127
|
+
: defaultLogoTitle;
|
|
106
128
|
const headerColor = ctx.theme?.header?.backgroundColor ?? defaultHeaderTheme.backgroundColor;
|
|
107
129
|
const headerTextColor = ctx.theme?.header?.color ?? defaultHeaderTheme.color;
|
|
108
130
|
const activeColor = ctx.theme?.header?.activeColor ?? defaultHeaderTheme.activeColor;
|
|
109
131
|
const isEmbedded = ctx.embeddingMode === "iframe";
|
|
110
|
-
return (_jsx(HostIntlProvider, { locale: locale, additionalMessages: appMessages, children: _jsx(BackendProvider, { backend: getBackend(), children: _jsx(ToastsCenterContextProvider, { children: _jsxs("div", { className: b(), children: [
|
|
132
|
+
return (_jsx(HostIntlProvider, { locale: locale, additionalMessages: appMessages, children: _jsx(BackendProvider, { backend: getBackend(), children: _jsx(ToastsCenterContextProvider, { children: _jsxs("div", { className: b(), children: [
|
|
133
|
+
_jsx(DocumentHeader, { pageTitle: documentPageTitle, brandTitle: documentBrandTitle, faviconUrl: faviconUrl, appleTouchIconUrl: ctx.whiteLabeling?.appleTouchIconUrl }), isEmbedded ? null : (_jsx("div", { className: e("header"), onMouseOver: handleHeaderMouseOver, children: _jsx(AppHeader, { logoUrl: ctx.whiteLabeling?.logoUrl || defaultLogoUrl, logoHref: "/organization" // switch the host scope to organization, the first org app will be chosen
|
|
111
134
|
, logoTitle: logoTitle, headerColor: headerColor, headerTextColor: headerTextColor, activeColor: activeColor, userName: userName, organizationName: ctx.organization?.title, isAccessibilityCompliant: true, workspacePicker: workspacePicker, menuItemsGroups: menuItemsGroups, helpMenuItems: helpMenuItems, accountMenuItems: accountMenuItems, onMenuItemClick: handleMenuItemClick, showUpsellButton: pricing.isTrial, onUpsellButtonClick: pricing.onUpsellButtonClick, expiredDate: pricing.isTrial ? pricing.expiredDate : undefined, search: search.element, showChatItem: chat.showChatItem, onChatItemClick: chat.open, notificationsPanel: ctx.userSettings.enableInPlatformNotifications
|
|
112
135
|
? ({ isMobile, closeNotificationsOverlay }) => (_jsx(AppHeaderNotifications, { locale: locale, isMobile: isMobile, closeNotificationsOverlay: closeNotificationsOverlay, useAsOfDateParam: ctx.userSettings.enableExecutionTimestamp ?? false, enableExportToDocumentStorage: ctx.userSettings.enableExportToDocumentStorage ??
|
|
113
136
|
false }))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HostIntlProvider.d.ts","sourceRoot":"","sources":["../../src/ui/HostIntlProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAIhD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,UAAU,sBAAsB;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CAehG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HostNotificationDispatcher.d.ts","sourceRoot":"","sources":["../../src/ui/HostNotificationDispatcher.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAGrF,UAAU,gCAAgC;IACtC,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,YAAY,EAAE,EAAE,gCAAgC,QAwC5F"}
|
|
@@ -6,5 +6,7 @@ export interface IPluggableApplicationRendererProps {
|
|
|
6
6
|
ctx: IPlatformContext;
|
|
7
7
|
pathname: string;
|
|
8
8
|
onHeaderChange?: (appId: string, header: IAppHeaderOptions) => void;
|
|
9
|
+
onDocumentTitleChange?: (appId: string, pageTitle: string | undefined) => void;
|
|
9
10
|
}
|
|
10
|
-
export declare function PluggableApplicationRenderer({ app, ctx, pathname, onHeaderChange }: IPluggableApplicationRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function PluggableApplicationRenderer({ app, ctx, pathname, onHeaderChange, onDocumentTitleChange }: IPluggableApplicationRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=PluggableApplicationRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluggableApplicationRenderer.d.ts","sourceRoot":"","sources":["../../src/ui/PluggableApplicationRenderer.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAMxB,MAAM,2CAA2C,CAAC;AAcnD,OAAO,qCAAqC,CAAC;AAkB7C,MAAM,WAAW,kCAAkC;IAC/C,GAAG,EAAE,gCAAgC,CAAC;IACtC,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpE,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAClF;AAED,wBAAgB,4BAA4B,CAAC,EACzC,GAAG,EACH,GAAG,EACH,QAAQ,EACR,cAAc,EACd,qBAAqB,EACxB,EAAE,kCAAkC,2CAsMpC"}
|