@iblai/iblai-js 2.10.0 → 2.10.2

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.
@@ -5669,11 +5669,24 @@ var settingsTabLabels$3 = {
5669
5669
  },
5670
5670
  showAttachment: {
5671
5671
  label: "Show Attachment",
5672
- tooltip: "Show Attachment Options in Chat Interface"
5672
+ tooltip: "Lets people attach files to a conversation. Each surface has its own switch: In-app chat covers conversations hosted in the app, Embed widget covers the widget on your own site."
5673
5673
  },
5674
5674
  showVoiceRecord: {
5675
5675
  label: "Show Voice Record",
5676
- tooltip: "Show Voice Recording Options in Chat Interface"
5676
+ tooltip: "Lets people send a voice recording instead of typing. Each surface has its own switch: In-app chat covers conversations hosted in the app, Embed widget covers the widget on your own site."
5677
+ },
5678
+ showVoiceCall: {
5679
+ label: "Show Voice Call",
5680
+ tooltip: "Lets people start a live voice call with the agent. Each surface has its own switch: In-app chat covers conversations hosted in the app, Embed widget covers the widget on your own site."
5681
+ },
5682
+ embedShowAttachment: {
5683
+ label: "Show Attachment (embed widget)"
5684
+ },
5685
+ embedShowVoiceRecord: {
5686
+ label: "Show Voice Record (embed widget)"
5687
+ },
5688
+ embedShowVoiceCall: {
5689
+ label: "Show Voice Call (embed widget)"
5677
5690
  },
5678
5691
  allowCopies: {
5679
5692
  label: "Allow Copies",
@@ -5681,7 +5694,7 @@ var settingsTabLabels$3 = {
5681
5694
  },
5682
5695
  showReasoning: {
5683
5696
  label: "Verbose Reasoning",
5684
- tooltip: "Show the agent’s reasoning steps while it responds."
5697
+ tooltip: "Show the agent’s reasoning steps while it responds. This setting has one value, so it applies to both in-app chat and the embed widget."
5685
5698
  },
5686
5699
  image: {
5687
5700
  label: "Image",
@@ -5691,19 +5704,19 @@ var settingsTabLabels$3 = {
5691
5704
  },
5692
5705
  enhancedDocRetrieval: {
5693
5706
  label: "Enhanced document retrieval",
5694
- tooltip: "Run multiple search queries per question to pull in more relevant documents."
5707
+ tooltip: "Run multiple search queries per question to pull in more relevant documents. This setting has one value, so it applies to both in-app chat and the embed widget."
5695
5708
  },
5696
5709
  promptCaching: {
5697
5710
  label: "Prompt caching",
5698
- tooltip: "Cache repeated prompt context to lower latency and cost on long conversations."
5711
+ tooltip: "Cache repeated prompt context to lower latency and cost on long conversations. This setting has one value, so it applies to both in-app chat and the embed widget."
5699
5712
  },
5700
5713
  privateMode: {
5701
5714
  label: "Enable private mode",
5702
- tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments."
5715
+ tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments. This setting has one value, so it applies to both in-app chat and the embed widget."
5703
5716
  },
5704
5717
  smartDocRetrieval: {
5705
5718
  label: "Smart document retrieval",
5706
- tooltip: "Use function calling during voice calls to fetch documents only when needed."
5719
+ tooltip: "The agent fetches documents only when it needs them, instead of searching the knowledge base on every turn. This setting has one value, so it applies to both in-app chat and the embed widget."
5707
5720
  }
5708
5721
  },
5709
5722
  actions: {
@@ -5751,8 +5764,19 @@ var settingsTabLabels$3 = {
5751
5764
  },
5752
5765
  sections: {
5753
5766
  chatExperience: "Chat experience",
5754
- voiceCalls: "Voice & calls",
5755
- advanced: "Advanced"
5767
+ advanced: "Advanced",
5768
+ perSurface: "Surface Capabilities",
5769
+ globalSettings: "Global Capabilities"
5770
+ },
5771
+ surfaces: {
5772
+ inAppChat: "In-app chat",
5773
+ embedWidget: "Embed widget"
5774
+ },
5775
+ notes: {
5776
+ perSurface: "Set independently for in-app chat and the embed widget.",
5777
+ globalSettings: "These apply to in-app chat and the embed widget alike.",
5778
+ inAppChat: "Conversations hosted inside the app - the chat your users open here.",
5779
+ embedWidget: "The widget you embed on your own site using the snippet from the Embed tab."
5756
5780
  }
5757
5781
  };
5758
5782
  var skillsProfileAddSkillDialog$3 = {
@@ -6463,6 +6487,9 @@ var tabsSettingsTab$3 = {
6463
6487
  featuredTooltipAriaLabel: "More info about featured",
6464
6488
  showAttachmentTooltipAriaLabel: "More info about show attachment",
6465
6489
  showVoiceRecordTooltipAriaLabel: "More info about show voice record",
6490
+ showVoiceCallTooltipAriaLabel: "More info about show voice call",
6491
+ inAppChatTooltipAriaLabel: "More info about in-app chat",
6492
+ embedWidgetTooltipAriaLabel: "More info about the embed widget",
6466
6493
  allowCopiesTooltipAriaLabel: "More info about allow copies",
6467
6494
  showReasoningTooltipAriaLabel: "More info about verbose reasoning",
6468
6495
  toggleStateEnabled: "enabled",
@@ -12956,11 +12983,24 @@ var settingsTabLabels$2 = {
12956
12983
  },
12957
12984
  showAttachment: {
12958
12985
  label: "Afficher les pièces jointes",
12959
- tooltip: "Afficher les options de pièces jointes dans l'interface de chat"
12986
+ tooltip: "Permet aux personnes de joindre des fichiers à une conversation. Chaque surface a son propre interrupteur : In-app chat couvre les conversations hébergées dans l'application et Embed widget couvre le widget sur votre propre site."
12960
12987
  },
12961
12988
  showVoiceRecord: {
12962
12989
  label: "Afficher l'enregistrement vocal",
12963
- tooltip: "Afficher les options d'enregistrement vocal dans l'interface de chat"
12990
+ tooltip: "Permet aux personnes d'envoyer un enregistrement vocal au lieu d'écrire. Chaque surface a son propre interrupteur : In-app chat couvre les conversations hébergées dans l'application et Embed widget couvre le widget sur votre propre site."
12991
+ },
12992
+ showVoiceCall: {
12993
+ label: "Show Voice Call",
12994
+ tooltip: "Permet aux personnes de démarrer un appel vocal en direct avec l'agent. Chaque surface a son propre interrupteur : In-app chat couvre les conversations hébergées dans l'application et Embed widget couvre le widget sur votre propre site."
12995
+ },
12996
+ embedShowAttachment: {
12997
+ label: "Afficher les pieces jointes (widget integre)"
12998
+ },
12999
+ embedShowVoiceRecord: {
13000
+ label: "Afficher l'enregistrement vocal (widget integre)"
13001
+ },
13002
+ embedShowVoiceCall: {
13003
+ label: "Afficher les appels vocaux (widget integre)"
12964
13004
  },
12965
13005
  allowCopies: {
12966
13006
  label: "Autoriser les copies",
@@ -12968,7 +13008,7 @@ var settingsTabLabels$2 = {
12968
13008
  },
12969
13009
  showReasoning: {
12970
13010
  label: "Raisonnement détaillé",
12971
- tooltip: "Afficher les étapes de raisonnement de l'agent pendant qu'il répond."
13011
+ tooltip: "Afficher les étapes de raisonnement de l'agent pendant qu'il répond. Ce paramètre a une seule valeur ; il s'applique donc à la fois au chat dans l'application et au widget intégré."
12972
13012
  },
12973
13013
  image: {
12974
13014
  label: "Image",
@@ -12978,19 +13018,19 @@ var settingsTabLabels$2 = {
12978
13018
  },
12979
13019
  enhancedDocRetrieval: {
12980
13020
  label: "Enhanced document retrieval",
12981
- tooltip: "Run multiple search queries per question to pull in more relevant documents."
13021
+ tooltip: "Run multiple search queries per question to pull in more relevant documents. This setting has one value, so it applies to both in-app chat and the embed widget."
12982
13022
  },
12983
13023
  promptCaching: {
12984
13024
  label: "Prompt caching",
12985
- tooltip: "Cache repeated prompt context to lower latency and cost on long conversations."
13025
+ tooltip: "Cache repeated prompt context to lower latency and cost on long conversations. This setting has one value, so it applies to both in-app chat and the embed widget."
12986
13026
  },
12987
13027
  privateMode: {
12988
13028
  label: "Enable private mode",
12989
- tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments."
13029
+ tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments. This setting has one value, so it applies to both in-app chat and the embed widget."
12990
13030
  },
12991
13031
  smartDocRetrieval: {
12992
13032
  label: "Smart document retrieval",
12993
- tooltip: "Use function calling during voice calls to fetch documents only when needed."
13033
+ tooltip: "The agent fetches documents only when it needs them, instead of searching the knowledge base on every turn. This setting has one value, so it applies to both in-app chat and the embed widget."
12994
13034
  }
12995
13035
  },
12996
13036
  actions: {
@@ -13038,8 +13078,19 @@ var settingsTabLabels$2 = {
13038
13078
  },
13039
13079
  sections: {
13040
13080
  chatExperience: "Chat experience",
13041
- voiceCalls: "Voice & calls",
13042
- advanced: "Advanced"
13081
+ advanced: "Advanced",
13082
+ perSurface: "Capacites par surface",
13083
+ globalSettings: "Capacites globales"
13084
+ },
13085
+ surfaces: {
13086
+ inAppChat: "In-app chat",
13087
+ embedWidget: "Embed widget"
13088
+ },
13089
+ notes: {
13090
+ perSurface: "A configurer independamment pour le chat dans l'application et le widget integre.",
13091
+ globalSettings: "Ils s'appliquent aussi bien au chat dans l'application qu'au widget integre.",
13092
+ inAppChat: "Les conversations hebergees dans l'application : le chat que vos utilisateurs ouvrent ici.",
13093
+ embedWidget: "Le widget que vous integrez a votre propre site avec l'extrait de l'onglet Integration."
13043
13094
  }
13044
13095
  };
13045
13096
  var skillsProfileAddSkillDialog$2 = {
@@ -13750,6 +13801,9 @@ var tabsSettingsTab$2 = {
13750
13801
  featuredTooltipAriaLabel: "Plus d'informations sur la mise en avant",
13751
13802
  showAttachmentTooltipAriaLabel: "Plus d'informations sur l'affichage des pièces jointes",
13752
13803
  showVoiceRecordTooltipAriaLabel: "Plus d'informations sur l'affichage de l'enregistrement vocal",
13804
+ showVoiceCallTooltipAriaLabel: "More info about show voice call",
13805
+ inAppChatTooltipAriaLabel: "More info about in-app chat",
13806
+ embedWidgetTooltipAriaLabel: "More info about the embed widget",
13753
13807
  allowCopiesTooltipAriaLabel: "Plus d'informations sur l'autorisation des copies",
13754
13808
  showReasoningTooltipAriaLabel: "Plus d'informations sur le raisonnement détaillé",
13755
13809
  toggleStateEnabled: "activé",
@@ -20077,11 +20131,24 @@ var settingsTabLabels$1 = {
20077
20131
  },
20078
20132
  showAttachment: {
20079
20133
  label: "Mostrar archivos adjuntos",
20080
- tooltip: "Mostrar opciones de archivos adjuntos en la interfaz de chat"
20134
+ tooltip: "Permite que las personas adjunten archivos a una conversación. Cada superficie tiene su propio interruptor: In-app chat cubre las conversaciones alojadas en la aplicación y Embed widget cubre el widget en tu propio sitio."
20081
20135
  },
20082
20136
  showVoiceRecord: {
20083
20137
  label: "Mostrar grabación de voz",
20084
- tooltip: "Mostrar opciones de grabación de voz en la interfaz de chat"
20138
+ tooltip: "Permite que las personas envíen una grabación de voz en lugar de escribir. Cada superficie tiene su propio interruptor: In-app chat cubre las conversaciones alojadas en la aplicación y Embed widget cubre el widget en tu propio sitio."
20139
+ },
20140
+ showVoiceCall: {
20141
+ label: "Show Voice Call",
20142
+ tooltip: "Permite que las personas inicien una llamada de voz en vivo con el agente. Cada superficie tiene su propio interruptor: In-app chat cubre las conversaciones alojadas en la aplicación y Embed widget cubre el widget en tu propio sitio."
20143
+ },
20144
+ embedShowAttachment: {
20145
+ label: "Mostrar adjuntos (widget incrustado)"
20146
+ },
20147
+ embedShowVoiceRecord: {
20148
+ label: "Mostrar grabacion de voz (widget incrustado)"
20149
+ },
20150
+ embedShowVoiceCall: {
20151
+ label: "Mostrar llamadas de voz (widget incrustado)"
20085
20152
  },
20086
20153
  allowCopies: {
20087
20154
  label: "Permitir copias",
@@ -20089,7 +20156,7 @@ var settingsTabLabels$1 = {
20089
20156
  },
20090
20157
  showReasoning: {
20091
20158
  label: "Razonamiento detallado",
20092
- tooltip: "Mostrar los pasos de razonamiento del agente mientras responde."
20159
+ tooltip: "Mostrar los pasos de razonamiento del agente mientras responde. Esta configuración tiene un solo valor, por lo que se aplica tanto al chat en la aplicación como al widget insertado."
20093
20160
  },
20094
20161
  image: {
20095
20162
  label: "Imagen",
@@ -20099,19 +20166,19 @@ var settingsTabLabels$1 = {
20099
20166
  },
20100
20167
  enhancedDocRetrieval: {
20101
20168
  label: "Enhanced document retrieval",
20102
- tooltip: "Run multiple search queries per question to pull in more relevant documents."
20169
+ tooltip: "Run multiple search queries per question to pull in more relevant documents. This setting has one value, so it applies to both in-app chat and the embed widget."
20103
20170
  },
20104
20171
  promptCaching: {
20105
20172
  label: "Prompt caching",
20106
- tooltip: "Cache repeated prompt context to lower latency and cost on long conversations."
20173
+ tooltip: "Cache repeated prompt context to lower latency and cost on long conversations. This setting has one value, so it applies to both in-app chat and the embed widget."
20107
20174
  },
20108
20175
  privateMode: {
20109
20176
  label: "Enable private mode",
20110
- tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments."
20177
+ tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments. This setting has one value, so it applies to both in-app chat and the embed widget."
20111
20178
  },
20112
20179
  smartDocRetrieval: {
20113
20180
  label: "Smart document retrieval",
20114
- tooltip: "Use function calling during voice calls to fetch documents only when needed."
20181
+ tooltip: "The agent fetches documents only when it needs them, instead of searching the knowledge base on every turn. This setting has one value, so it applies to both in-app chat and the embed widget."
20115
20182
  }
20116
20183
  },
20117
20184
  actions: {
@@ -20159,8 +20226,19 @@ var settingsTabLabels$1 = {
20159
20226
  },
20160
20227
  sections: {
20161
20228
  chatExperience: "Chat experience",
20162
- voiceCalls: "Voice & calls",
20163
- advanced: "Advanced"
20229
+ advanced: "Advanced",
20230
+ perSurface: "Capacidades por superficie",
20231
+ globalSettings: "Capacidades globales"
20232
+ },
20233
+ surfaces: {
20234
+ inAppChat: "In-app chat",
20235
+ embedWidget: "Embed widget"
20236
+ },
20237
+ notes: {
20238
+ perSurface: "Se configuran de forma independiente para el chat en la aplicacion y el widget incrustado.",
20239
+ globalSettings: "Se aplican tanto al chat en la aplicacion como al widget incrustado.",
20240
+ inAppChat: "Conversaciones alojadas dentro de la aplicacion: el chat que tus usuarios abren aqui.",
20241
+ embedWidget: "El widget que incrustas en tu propio sitio con el fragmento de la pestana Insertar."
20164
20242
  }
20165
20243
  };
20166
20244
  var skillsProfileAddSkillDialog$1 = {
@@ -20871,6 +20949,9 @@ var tabsSettingsTab$1 = {
20871
20949
  featuredTooltipAriaLabel: "Más información sobre destacado",
20872
20950
  showAttachmentTooltipAriaLabel: "Más información sobre mostrar adjuntos",
20873
20951
  showVoiceRecordTooltipAriaLabel: "Más información sobre mostrar grabación de voz",
20952
+ showVoiceCallTooltipAriaLabel: "More info about show voice call",
20953
+ inAppChatTooltipAriaLabel: "More info about in-app chat",
20954
+ embedWidgetTooltipAriaLabel: "More info about the embed widget",
20874
20955
  allowCopiesTooltipAriaLabel: "Más información sobre permitir copias",
20875
20956
  showReasoningTooltipAriaLabel: "Más información sobre el razonamiento detallado",
20876
20957
  toggleStateEnabled: "activado",
@@ -27198,11 +27279,24 @@ var settingsTabLabels = {
27198
27279
  },
27199
27280
  showAttachment: {
27200
27281
  label: "显示附件",
27201
- tooltip: "在聊天界面中显示附件选项"
27282
+ tooltip: "允许用户在对话中添加附件。每个界面都有独立的开关:In-app chat 用于应用内托管的对话,Embed widget 用于您自己网站上的小组件。"
27202
27283
  },
27203
27284
  showVoiceRecord: {
27204
27285
  label: "显示语音录制",
27205
- tooltip: "在聊天界面中显示语音录制选项"
27286
+ tooltip: "允许用户发送语音录音而不是打字。每个界面都有独立的开关:In-app chat 用于应用内托管的对话,Embed widget 用于您自己网站上的小组件。"
27287
+ },
27288
+ showVoiceCall: {
27289
+ label: "Show Voice Call",
27290
+ tooltip: "允许用户与智能体发起实时语音通话。每个界面都有独立的开关:In-app chat 用于应用内托管的对话,Embed widget 用于您自己网站上的小组件。"
27291
+ },
27292
+ embedShowAttachment: {
27293
+ label: "显示附件(嵌入式挂件)"
27294
+ },
27295
+ embedShowVoiceRecord: {
27296
+ label: "显示语音录音(嵌入式挂件)"
27297
+ },
27298
+ embedShowVoiceCall: {
27299
+ label: "显示语音通话(嵌入式挂件)"
27206
27300
  },
27207
27301
  allowCopies: {
27208
27302
  label: "允许复制",
@@ -27210,7 +27304,7 @@ var settingsTabLabels = {
27210
27304
  },
27211
27305
  showReasoning: {
27212
27306
  label: "详细推理",
27213
- tooltip: "在智能体响应时显示其推理步骤。"
27307
+ tooltip: "在智能体响应时显示其推理步骤。 此设置只有一个值,因此同时适用于应用内聊天和嵌入式小组件。"
27214
27308
  },
27215
27309
  image: {
27216
27310
  label: "图片",
@@ -27220,19 +27314,19 @@ var settingsTabLabels = {
27220
27314
  },
27221
27315
  enhancedDocRetrieval: {
27222
27316
  label: "Enhanced document retrieval",
27223
- tooltip: "Run multiple search queries per question to pull in more relevant documents."
27317
+ tooltip: "Run multiple search queries per question to pull in more relevant documents. This setting has one value, so it applies to both in-app chat and the embed widget."
27224
27318
  },
27225
27319
  promptCaching: {
27226
27320
  label: "Prompt caching",
27227
- tooltip: "Cache repeated prompt context to lower latency and cost on long conversations."
27321
+ tooltip: "Cache repeated prompt context to lower latency and cost on long conversations. This setting has one value, so it applies to both in-app chat and the embed widget."
27228
27322
  },
27229
27323
  privateMode: {
27230
27324
  label: "Enable private mode",
27231
- tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments."
27325
+ tooltip: "When on, every conversation with this agent runs in private mode — no chat history or memory is stored for any user. Use this for sensitive or compliance-bound deployments. This setting has one value, so it applies to both in-app chat and the embed widget."
27232
27326
  },
27233
27327
  smartDocRetrieval: {
27234
27328
  label: "Smart document retrieval",
27235
- tooltip: "Use function calling during voice calls to fetch documents only when needed."
27329
+ tooltip: "The agent fetches documents only when it needs them, instead of searching the knowledge base on every turn. This setting has one value, so it applies to both in-app chat and the embed widget."
27236
27330
  }
27237
27331
  },
27238
27332
  actions: {
@@ -27280,8 +27374,19 @@ var settingsTabLabels = {
27280
27374
  },
27281
27375
  sections: {
27282
27376
  chatExperience: "Chat experience",
27283
- voiceCalls: "Voice & calls",
27284
- advanced: "Advanced"
27377
+ advanced: "Advanced",
27378
+ perSurface: "按界面功能",
27379
+ globalSettings: "全局功能"
27380
+ },
27381
+ surfaces: {
27382
+ inAppChat: "In-app chat",
27383
+ embedWidget: "Embed widget"
27384
+ },
27385
+ notes: {
27386
+ perSurface: "分别为应用内聊天和嵌入式挂件单独设置。",
27387
+ globalSettings: "同时适用于应用内聊天和嵌入式挂件。",
27388
+ inAppChat: "应用内托管的对话,即用户在此打开的聊天。",
27389
+ embedWidget: "你使用“嵌入”标签页中的代码片段嵌入到自己网站上的挂件。"
27285
27390
  }
27286
27391
  };
27287
27392
  var skillsProfileAddSkillDialog = {
@@ -27992,6 +28097,9 @@ var tabsSettingsTab = {
27992
28097
  featuredTooltipAriaLabel: "关于精选的更多信息",
27993
28098
  showAttachmentTooltipAriaLabel: "关于显示附件的更多信息",
27994
28099
  showVoiceRecordTooltipAriaLabel: "关于显示语音录制的更多信息",
28100
+ showVoiceCallTooltipAriaLabel: "More info about show voice call",
28101
+ inAppChatTooltipAriaLabel: "More info about in-app chat",
28102
+ embedWidgetTooltipAriaLabel: "More info about the embed widget",
27995
28103
  allowCopiesTooltipAriaLabel: "关于允许复制的更多信息",
27996
28104
  showReasoningTooltipAriaLabel: "关于详细推理的更多信息",
27997
28105
  toggleStateEnabled: "已启用",
@@ -186120,6 +186228,12 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
186120
186228
  var _a;
186121
186229
  (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
186122
186230
  };
186231
+ // The picture itself, with no editing affordance around it. The wrapper
186232
+ // below decides whether it is clickable.
186233
+ const profileAvatar = (jsxs(Avatar, { className: "h-20 w-20", children: [((_b = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _b === void 0 ? void 0 : _b.has_image) ? (jsx(AvatarImage, { src: (_c = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _c === void 0 ? void 0 : _c.image_url_full, alt: t('profileIndex.altProfilePicture'), className: "rounded-full object-cover w-full h-full group-hover:opacity-80 transition-opacity" })) : customization.useGravatarPicFallback ? (jsx(Gravatar, { className: "w-full h-full rounded-full object-cover group-hover:opacity-80 transition-opacity", email: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email, size: 80, alt: t('profileIndex.altProfilePictureGravatar') })) : (jsx(Fragment$1, {})), jsx(AvatarFallback, { className: cn('bg-blue-800 text-white text-xl rounded-full', customization.useGravatarPicFallback &&
186234
+ !((_d = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _d === void 0 ? void 0 : _d.image_url_full)
186235
+ ? 'hidden'
186236
+ : ''), children: getInitials((userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.name) || (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.username) || (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email) || '') })] }));
186123
186237
  const handleFileUpload = (event) => {
186124
186238
  var _a;
186125
186239
  const file = (_a = event.target.files) === null || _a === void 0 ? void 0 : _a[0];
@@ -186170,10 +186284,9 @@ function Profile({ tenant, username, tenants, onClose, customization = {}, isAdm
186170
186284
  return (jsxs("div", { className: "flex flex-col lg:flex-row h-full", children: [jsx("div", { className: "lg:hidden", children: jsx("div", { className: "px-6 py-4 border-b border-gray-200", children: jsx("h2", { className: "text-lg font-semibold text-gray-900", children: t('profileIndex.profileHeading') }) }) }), jsxs("div", { className: "hidden lg:flex bg-white border-r border-gray-200 dark:border-gray-700 flex-col overflow-hidden", style: {
186171
186285
  width: '320px',
186172
186286
  height: '100%',
186173
- }, children: [jsxs("div", { className: "flex flex-col items-center justify-center py-6 px-6 border-b border-gray-200 dark:border-gray-700 flex-shrink-0", children: [isUserMetadataEdxLoading || isUploadingProfileImage ? (jsx(Skeleton, { className: "h-20 w-20 mb-6 rounded-full", "aria-label": t('profileIndex.ariaLoadingProfileImage') })) : (jsxs("button", { type: "button", className: "relative w-20 h-20 mb-4 cursor-pointer group rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2", onMouseEnter: () => setIsHovering(true), onMouseLeave: () => setIsHovering(false), onClick: handleAvatarClick, "aria-label": t('profileIndex.ariaUploadProfilePicture'), children: [jsxs(Avatar, { className: "h-20 w-20", children: [((_b = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _b === void 0 ? void 0 : _b.has_image) ? (jsx(AvatarImage, { src: (_c = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _c === void 0 ? void 0 : _c.image_url_full, alt: t('profileIndex.altProfilePicture'), className: "rounded-full object-cover w-full h-full group-hover:opacity-80 transition-opacity" })) : customization.useGravatarPicFallback ? (jsx(Gravatar, { className: "w-full h-full rounded-full object-cover group-hover:opacity-80 transition-opacity", email: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email, size: 80, alt: t('profileIndex.altProfilePictureGravatar') })) : (jsx(Fragment$1, {})), jsx(AvatarFallback, { className: cn('bg-blue-800 text-white text-xl rounded-full', customization.useGravatarPicFallback &&
186174
- !((_d = userMetadataEdx === null || userMetadataEdx === void 0 ? void 0 : userMetadataEdx.profile_image) === null || _d === void 0 ? void 0 : _d.image_url_full)
186175
- ? 'hidden'
186176
- : ''), children: getInitials((userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.name) || (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.username) || (userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email) || '') })] }), isHovering && (jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-blue-800 rounded-full border-4 border-white/20", "aria-hidden": "true", children: jsx("span", { className: "text-white text-xs font-medium text-center px-2", children: t('profileIndex.uploadOverlay') }) })), jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileUpload, className: "hidden", "aria-label": t('profileIndex.ariaChooseProfilePicture'), tabIndex: -1 })] })), jsx("h2", { className: "text-base font-semibold text-gray-900 dark:text-gray-100 text-center mb-3 break-all px-2", title: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email, children: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email }), jsxs("div", { className: "flex justify-center space-x-3", children: [jsxs("div", { className: "bg-blue-100 text-blue-700 px-2 py-1 rounded font-medium flex items-center text-sm", children: [jsx(RoleIcon, { className: "h-4 w-4 mr-2", "aria-hidden": "true" }), jsx("span", { children: isAdmin ? t('profileIndex.roleAdmin') : t('profileIndex.roleUser') })] }), customization.showPlatformName && (jsx("div", { className: "bg-gray-100 text-gray-600 px-4 py-2 rounded text-xs font-medium", children: tenant.toUpperCase() }))] })] }), jsx("nav", { className: "flex-1 overflow-y-auto", style: { minHeight: 0 }, "aria-label": t('profileIndex.ariaProfileTabs'), children: jsx("div", { className: "p-4", children: jsx("div", { className: "flex flex-col space-y-1.5", role: "tablist", "aria-orientation": "vertical", children: TABS.map((tab) => (jsxs("button", { role: "tab", "aria-selected": activeTab === tab.id, "aria-controls": `${tab.id}-tabpanel`, id: `${tab.id}-tab`, onClick: () => setActiveTab(tab.id), className: `w-full justify-start px-4 py-2.5 text-left rounded-lg transition-all flex items-center text-base ${activeTab === tab.id
186287
+ }, children: [jsxs("div", { className: "flex flex-col items-center justify-center py-6 px-6 border-b border-gray-200 dark:border-gray-700 flex-shrink-0", children: [isUserMetadataEdxLoading || isUploadingProfileImage ? (jsx(Skeleton, { className: "h-20 w-20 mb-6 rounded-full", "aria-label": t('profileIndex.ariaLoadingProfileImage') })) : isReadOnly ? (
186288
+ // Someone else's profile: show the picture, offer no way to replace it.
186289
+ jsx("div", { className: "relative w-20 h-20 mb-4 rounded-full", children: profileAvatar })) : (jsxs("button", { type: "button", className: "relative w-20 h-20 mb-4 cursor-pointer group rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2", onMouseEnter: () => setIsHovering(true), onMouseLeave: () => setIsHovering(false), onClick: handleAvatarClick, "aria-label": t('profileIndex.ariaUploadProfilePicture'), children: [profileAvatar, isHovering && (jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-blue-800 rounded-full border-4 border-white/20", "aria-hidden": "true", children: jsx("span", { className: "text-white text-xs font-medium text-center px-2", children: t('profileIndex.uploadOverlay') }) })), jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", onChange: handleFileUpload, className: "hidden", "aria-label": t('profileIndex.ariaChooseProfilePicture'), tabIndex: -1 })] })), jsx("h2", { className: "text-base font-semibold text-gray-900 dark:text-gray-100 text-center mb-3 break-all px-2", title: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email, children: userMetadata === null || userMetadata === void 0 ? void 0 : userMetadata.email }), jsxs("div", { className: "flex justify-center space-x-3", children: [jsxs("div", { className: "bg-blue-100 text-blue-700 px-2 py-1 rounded font-medium flex items-center text-sm", children: [jsx(RoleIcon, { className: "h-4 w-4 mr-2", "aria-hidden": "true" }), jsx("span", { children: isAdmin ? t('profileIndex.roleAdmin') : t('profileIndex.roleUser') })] }), customization.showPlatformName && (jsx("div", { className: "bg-gray-100 text-gray-600 px-4 py-2 rounded text-xs font-medium", children: tenant.toUpperCase() }))] })] }), jsx("nav", { className: "flex-1 overflow-y-auto", style: { minHeight: 0 }, "aria-label": t('profileIndex.ariaProfileTabs'), children: jsx("div", { className: "p-4", children: jsx("div", { className: "flex flex-col space-y-1.5", role: "tablist", "aria-orientation": "vertical", children: TABS.map((tab) => (jsxs("button", { role: "tab", "aria-selected": activeTab === tab.id, "aria-controls": `${tab.id}-tabpanel`, id: `${tab.id}-tab`, onClick: () => setActiveTab(tab.id), className: `w-full justify-start px-4 py-2.5 text-left rounded-lg transition-all flex items-center text-base ${activeTab === tab.id
186177
186290
  ? 'bg-blue-50 text-blue-700 font-medium'
186178
186291
  : 'hover:bg-gray-50 text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100'}`, children: [jsx(tab.renderIcon, { className: "h-5 w-5 mr-3 flex-shrink-0", "aria-hidden": "true" }), jsx("span", { className: "truncate", children: tab.label })] }, tab.id))) }) }) })] }), jsx("nav", { className: "lg:hidden", "aria-label": t('profileIndex.ariaProfileTabsMobile'), children: jsx("div", { className: "w-full justify-start px-6 py-2 bg-white border-b border-gray-200 rounded-none h-auto overflow-x-auto", children: jsx("div", { className: "flex space-x-2", role: "tablist", "aria-orientation": "horizontal", children: TABS.map((tab) => (jsxs("button", { role: "tab", "aria-selected": activeTab === tab.id, "aria-controls": `${tab.id}-tabpanel`, id: `${tab.id}-tab-mobile`, onClick: () => setActiveTab(tab.id), className: `flex items-center gap-2 px-3 py-2 rounded-lg whitespace-nowrap text-sm transition-all ${activeTab === tab.id
186179
186292
  ? 'bg-blue-50 text-blue-600 font-medium'
@@ -191450,7 +191563,18 @@ const TabDescription = ({ icon, title, children }) => {
191450
191563
  };
191451
191564
  const Admin = ({ tenant, onInviteClick, hasUserTabPermission = false, hasGroupsTabPermission = false, hasRolesTabPermission = false, hasPoliciesTabPermission = false, hasTeamsTabPermission = false, hasAlertsTabPermission = false, hasInviteUserPermission = false, hasCreateTeamPermission = false, onLoadGroupPermissions, rbacPermissions = {}, enableRbac = false, showGradebookTab = false, currentSpa, authSpaUrl, onboardingBasePath, }) => {
191452
191565
  const t = useT();
191453
- return (jsx("div", { className: "border border-gray-200 rounded-lg p-6", children: jsxs(Tabs, { defaultValue: "users", "aria-label": t('profileAdmin.rbacManagementTabsAriaLabel'), children: [jsxs(TabsList, { "aria-label": t('profileAdmin.managementTabsAriaLabel'), className: "max-w-full overflow-x-auto justify-start px-1", children: [hasUserTabPermission && (jsx(TabsTrigger, { value: "users", children: t('profileAdmin.usersTab') })), hasGroupsTabPermission && (jsx(TabsTrigger, { value: "groups", children: t('profileAdmin.groupsTab') })), hasRolesTabPermission && (jsx(TabsTrigger, { value: "roles", children: t('profileAdmin.rolesTab') })), hasPoliciesTabPermission && (jsx(TabsTrigger, { value: "policies", children: t('profileAdmin.policiesTab') })), hasTeamsTabPermission && (jsx(TabsTrigger, { value: "teams", children: t('profileAdmin.teamsTab') })), hasAlertsTabPermission && (jsx(TabsTrigger, { value: "alerts", children: t('profileAdmin.alertsTab') })), jsx(TabsTrigger, { value: "applications", children: t('profileAdmin.applicationsTab') }), jsx(TabsTrigger, { value: "onboarding", children: t('profileAdmin.onboardingTab') })] }), hasUserTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "users", children: [jsx(TabDescription, { icon: jsx(Users, { className: "w-5 h-5" }), title: t('profileAdmin.usersTab'), children: t('profileAdmin.usersDescription') }), jsx(UsersTab, { tenant: tenant, onInviteClick: onInviteClick, currentSpa: currentSpa, showGradebookTab: showGradebookTab })] })), hasGroupsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "groups", children: [jsx(TabDescription, { icon: jsx(UsersRound, { className: "w-5 h-5" }), title: t('profileAdmin.groupsTab'), children: t('profileAdmin.groupsDescription') }), jsx(GroupsTab, { tenant: tenant })] })), hasRolesTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "roles", children: [jsx(TabDescription, { icon: jsx(UserCog, { className: "w-5 h-5" }), title: t('profileAdmin.rolesTab'), children: t('profileAdmin.rolesDescription') }), jsx(RolesTab, { tenant: tenant })] })), hasPoliciesTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "policies", children: [jsx(TabDescription, { icon: jsx(ScrollText, { className: "w-5 h-5" }), title: t('profileAdmin.policiesTab'), children: t('profileAdmin.policiesDescription') }), jsx(PoliciesTab, { tenant: tenant })] })), hasTeamsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "teams", children: [jsx(TabDescription, { icon: jsx(Shield, { className: "w-5 h-5" }), title: t('profileAdmin.teamsTab'), children: t('profileAdmin.teamsDescription') }), jsx(GroupsTab, { tenant: tenant, isTeam: true, onInviteClick: onInviteClick, hasInviteUserPermission: hasInviteUserPermission, hasCreateTeamPermission: hasCreateTeamPermission, onLoadGroupPermissions: onLoadGroupPermissions, rbacPermissions: rbacPermissions, enableRbac: enableRbac })] })), hasAlertsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "alerts", children: [jsx(TabDescription, { icon: jsx(BellRing, { className: "w-5 h-5" }), title: t('profileAdmin.alertsTab'), children: t('profileAdmin.alertsDescription') }), jsx(AlertsTab$1, { tenant: tenant })] })), jsxs(TabsContent, { className: "mt-4", value: "applications", children: [jsx(TabDescription, { icon: jsx(ClipboardList, { className: "w-5 h-5" }), title: t('profileAdmin.applicationsTab'), children: t('profileAdmin.applicationsTabDescription') }), jsx(ApplicationsTab, { platformKey: tenant, authSpaUrl: authSpaUrl })] }), jsxs(TabsContent, { className: "mt-4", value: "onboarding", children: [jsx(TabDescription, { icon: jsx(UserPlus, { className: "w-5 h-5" }), title: t('profileAdmin.onboardingTab'), children: t('profileAdmin.onboardingTabDescription') }), jsx(OnboardingTab, { platformKey: tenant, onboardingBasePath: onboardingBasePath })] })] }) }));
191566
+ const { currentTenant } = useCurrentTenant();
191567
+ const storeRbacPermissions = useSelector(selectRbacPermissions);
191568
+ /**
191569
+ * A pure watcher administers nothing — Users is the only tab they get, and
191570
+ * `UsersTab` serves them the users they may watch rather than the tenant
191571
+ * roster. Their `/watchedgroups/#list` permission would otherwise open
191572
+ * Alerts and Teams, and Applications and Onboarding are ungated for
191573
+ * everyone else.
191574
+ */
191575
+ const isWatcher = isPureWatcher(storeRbacPermissions, currentTenant);
191576
+ const showUsersTab = isWatcher || hasUserTabPermission;
191577
+ return (jsx("div", { className: "border border-gray-200 rounded-lg p-6", children: jsxs(Tabs, { defaultValue: "users", "aria-label": t('profileAdmin.rbacManagementTabsAriaLabel'), children: [jsxs(TabsList, { "aria-label": t('profileAdmin.managementTabsAriaLabel'), className: "max-w-full overflow-x-auto justify-start px-1", children: [showUsersTab && jsx(TabsTrigger, { value: "users", children: t('profileAdmin.usersTab') }), !isWatcher && hasGroupsTabPermission && (jsx(TabsTrigger, { value: "groups", children: t('profileAdmin.groupsTab') })), !isWatcher && hasRolesTabPermission && (jsx(TabsTrigger, { value: "roles", children: t('profileAdmin.rolesTab') })), !isWatcher && hasPoliciesTabPermission && (jsx(TabsTrigger, { value: "policies", children: t('profileAdmin.policiesTab') })), !isWatcher && hasTeamsTabPermission && (jsx(TabsTrigger, { value: "teams", children: t('profileAdmin.teamsTab') })), !isWatcher && hasAlertsTabPermission && (jsx(TabsTrigger, { value: "alerts", children: t('profileAdmin.alertsTab') })), !isWatcher && (jsx(TabsTrigger, { value: "applications", children: t('profileAdmin.applicationsTab') })), !isWatcher && (jsx(TabsTrigger, { value: "onboarding", children: t('profileAdmin.onboardingTab') }))] }), showUsersTab && (jsxs(TabsContent, { className: "mt-4", value: "users", children: [jsx(TabDescription, { icon: jsx(Users, { className: "w-5 h-5" }), title: t('profileAdmin.usersTab'), children: t('profileAdmin.usersDescription') }), jsx(UsersTab, { tenant: tenant, onInviteClick: onInviteClick, currentSpa: currentSpa, showGradebookTab: showGradebookTab })] })), !isWatcher && hasGroupsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "groups", children: [jsx(TabDescription, { icon: jsx(UsersRound, { className: "w-5 h-5" }), title: t('profileAdmin.groupsTab'), children: t('profileAdmin.groupsDescription') }), jsx(GroupsTab, { tenant: tenant })] })), !isWatcher && hasRolesTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "roles", children: [jsx(TabDescription, { icon: jsx(UserCog, { className: "w-5 h-5" }), title: t('profileAdmin.rolesTab'), children: t('profileAdmin.rolesDescription') }), jsx(RolesTab, { tenant: tenant })] })), !isWatcher && hasPoliciesTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "policies", children: [jsx(TabDescription, { icon: jsx(ScrollText, { className: "w-5 h-5" }), title: t('profileAdmin.policiesTab'), children: t('profileAdmin.policiesDescription') }), jsx(PoliciesTab, { tenant: tenant })] })), !isWatcher && hasTeamsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "teams", children: [jsx(TabDescription, { icon: jsx(Shield, { className: "w-5 h-5" }), title: t('profileAdmin.teamsTab'), children: t('profileAdmin.teamsDescription') }), jsx(GroupsTab, { tenant: tenant, isTeam: true, onInviteClick: onInviteClick, hasInviteUserPermission: hasInviteUserPermission, hasCreateTeamPermission: hasCreateTeamPermission, onLoadGroupPermissions: onLoadGroupPermissions, rbacPermissions: rbacPermissions, enableRbac: enableRbac })] })), !isWatcher && hasAlertsTabPermission && (jsxs(TabsContent, { className: "mt-4", value: "alerts", children: [jsx(TabDescription, { icon: jsx(BellRing, { className: "w-5 h-5" }), title: t('profileAdmin.alertsTab'), children: t('profileAdmin.alertsDescription') }), jsx(AlertsTab$1, { tenant: tenant })] })), !isWatcher && (jsxs(TabsContent, { className: "mt-4", value: "applications", children: [jsx(TabDescription, { icon: jsx(ClipboardList, { className: "w-5 h-5" }), title: t('profileAdmin.applicationsTab'), children: t('profileAdmin.applicationsTabDescription') }), jsx(ApplicationsTab, { platformKey: tenant, authSpaUrl: authSpaUrl })] })), !isWatcher && (jsxs(TabsContent, { className: "mt-4", value: "onboarding", children: [jsx(TabDescription, { icon: jsx(UserPlus, { className: "w-5 h-5" }), title: t('profileAdmin.onboardingTab'), children: t('profileAdmin.onboardingTabDescription') }), jsx(OnboardingTab, { platformKey: tenant, onboardingBasePath: onboardingBasePath })] }))] }) }));
191454
191578
  };
191455
191579
 
191456
191580
  function DeleteApiModal({ isOpen, onClose, apiKey, tenantKey }) {