@iblai/iblai-js 2.14.0 → 2.16.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.
|
@@ -1980,6 +1980,7 @@ var analyticsAnalyticsCourses$3 = {
|
|
|
1980
1980
|
loading: "Loading...",
|
|
1981
1981
|
colCourseName: "Course Name",
|
|
1982
1982
|
colCourseId: "Course ID",
|
|
1983
|
+
openCourseAriaLabel: "Open course {id} in a new tab",
|
|
1983
1984
|
colEnrollments: "Enrollments",
|
|
1984
1985
|
viewCourseAriaLabel: "View details for {name}",
|
|
1985
1986
|
goToFirstPage: "Go to first page",
|
|
@@ -2032,15 +2033,15 @@ var analyticsAnalyticsFinancialStats$3 = {
|
|
|
2032
2033
|
viewTraces: "Traces →",
|
|
2033
2034
|
costByLLMFooter: "{shown} models · ranked by cost"
|
|
2034
2035
|
};
|
|
2036
|
+
var analyticsAgentScopeLink$3 = {
|
|
2037
|
+
scopeToAgent: "View analytics for {name}"
|
|
2038
|
+
};
|
|
2035
2039
|
var analyticsAnalyticsMemoryStats$3 = {
|
|
2036
2040
|
noPermission: "You do not have permission to view user memories.",
|
|
2037
2041
|
scopeLabel: "Memory scope",
|
|
2038
2042
|
scopeMentor: "This Agent",
|
|
2039
2043
|
scopeAllMentors: "All Agents",
|
|
2040
2044
|
scopeGlobal: "Global",
|
|
2041
|
-
searchAgents: "Search Agents…",
|
|
2042
|
-
searchAgentsTitle: "Search Agents",
|
|
2043
|
-
clearAgentSearch: "Clear Agent Search",
|
|
2044
2045
|
contentPlaceholder: "Search memory content",
|
|
2045
2046
|
pickDateRange: "Pick a Date Range",
|
|
2046
2047
|
allCategories: "All Categories",
|
|
@@ -2185,6 +2186,7 @@ var analyticsAnalyticsPrograms$3 = {
|
|
|
2185
2186
|
loading: "Loading...",
|
|
2186
2187
|
programName: "Program Name",
|
|
2187
2188
|
programId: "Program ID",
|
|
2189
|
+
openProgramAriaLabel: "Open program {id} in a new tab",
|
|
2188
2190
|
viewDetailsAriaLabel: "View details for {name}",
|
|
2189
2191
|
goToFirstPage: "Go to first page",
|
|
2190
2192
|
goToPreviousPage: "Go to previous page",
|
|
@@ -2264,7 +2266,6 @@ var analyticsAnalyticsTranscriptsStats$3 = {
|
|
|
2264
2266
|
labelModel: "Model:",
|
|
2265
2267
|
labelModelCard: "model:",
|
|
2266
2268
|
labelUser: "User:",
|
|
2267
|
-
labelUserId: "user_id:",
|
|
2268
2269
|
roleUser: "User",
|
|
2269
2270
|
roleAgent: "Agent",
|
|
2270
2271
|
noMessages: "No messages in this conversation.",
|
|
@@ -5670,6 +5671,10 @@ var settingsTabLabels$3 = {
|
|
|
5670
5671
|
label: "Featured",
|
|
5671
5672
|
tooltip: "Feature this agent to highlight it in listings."
|
|
5672
5673
|
},
|
|
5674
|
+
showExploreMentors: {
|
|
5675
|
+
label: "Show additional agents",
|
|
5676
|
+
tooltip: "Shows the additional agents section on this agent's welcome screen."
|
|
5677
|
+
},
|
|
5673
5678
|
showAttachment: {
|
|
5674
5679
|
label: "Show Attachment",
|
|
5675
5680
|
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."
|
|
@@ -6488,6 +6493,7 @@ var tabsSettingsTab$3 = {
|
|
|
6488
6493
|
whoCanViewTooltipAriaLabel: "More info about chat access",
|
|
6489
6494
|
whoCanChatTooltipAriaLabel: "More info about chat access",
|
|
6490
6495
|
featuredTooltipAriaLabel: "More info about featured",
|
|
6496
|
+
showExploreMentorsTooltipAriaLabel: "More info about show additional agents",
|
|
6491
6497
|
showAttachmentTooltipAriaLabel: "More info about show attachment",
|
|
6492
6498
|
showVoiceRecordTooltipAriaLabel: "More info about show voice record",
|
|
6493
6499
|
showVoiceCallTooltipAriaLabel: "More info about show voice call",
|
|
@@ -8184,6 +8190,7 @@ var en = {
|
|
|
8184
8190
|
analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$3,
|
|
8185
8191
|
analyticsAnalyticsCourses: analyticsAnalyticsCourses$3,
|
|
8186
8192
|
analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$3,
|
|
8193
|
+
analyticsAgentScopeLink: analyticsAgentScopeLink$3,
|
|
8187
8194
|
analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$3,
|
|
8188
8195
|
analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$3,
|
|
8189
8196
|
analyticsAnalyticsOverview: analyticsAnalyticsOverview$3,
|
|
@@ -9131,6 +9138,7 @@ var analyticsAnalyticsCourses$2 = {
|
|
|
9131
9138
|
loading: "Chargement...",
|
|
9132
9139
|
colCourseName: "Nom du cours",
|
|
9133
9140
|
colCourseId: "ID du cours",
|
|
9141
|
+
openCourseAriaLabel: "Ouvrir le cours {id} dans un nouvel onglet",
|
|
9134
9142
|
colEnrollments: "Inscriptions",
|
|
9135
9143
|
viewCourseAriaLabel: "Voir les détails de {name}",
|
|
9136
9144
|
goToFirstPage: "Aller à la première page",
|
|
@@ -9183,15 +9191,15 @@ var analyticsAnalyticsFinancialStats$2 = {
|
|
|
9183
9191
|
viewTraces: "Traces →",
|
|
9184
9192
|
costByLLMFooter: "{shown} modèles · classés par coût"
|
|
9185
9193
|
};
|
|
9194
|
+
var analyticsAgentScopeLink$2 = {
|
|
9195
|
+
scopeToAgent: "Voir les analyses de {name}"
|
|
9196
|
+
};
|
|
9186
9197
|
var analyticsAnalyticsMemoryStats$2 = {
|
|
9187
9198
|
noPermission: "Vous n'avez pas l'autorisation de consulter les mémoires des utilisateurs.",
|
|
9188
9199
|
scopeLabel: "Portée de la mémoire",
|
|
9189
9200
|
scopeMentor: "Cet agent",
|
|
9190
9201
|
scopeAllMentors: "Tous les agents",
|
|
9191
9202
|
scopeGlobal: "Global",
|
|
9192
|
-
searchAgents: "Rechercher des agents…",
|
|
9193
|
-
searchAgentsTitle: "Rechercher des agents",
|
|
9194
|
-
clearAgentSearch: "Effacer la recherche d'agent",
|
|
9195
9203
|
contentPlaceholder: "Rechercher dans le contenu des mémoires",
|
|
9196
9204
|
pickDateRange: "Choisir une plage de dates",
|
|
9197
9205
|
allCategories: "Toutes les catégories",
|
|
@@ -9336,6 +9344,7 @@ var analyticsAnalyticsPrograms$2 = {
|
|
|
9336
9344
|
loading: "Chargement...",
|
|
9337
9345
|
programName: "Nom du programme",
|
|
9338
9346
|
programId: "ID du programme",
|
|
9347
|
+
openProgramAriaLabel: "Ouvrir le programme {id} dans un nouvel onglet",
|
|
9339
9348
|
viewDetailsAriaLabel: "Voir les détails de {name}",
|
|
9340
9349
|
goToFirstPage: "Aller à la première page",
|
|
9341
9350
|
goToPreviousPage: "Aller à la page précédente",
|
|
@@ -9415,7 +9424,6 @@ var analyticsAnalyticsTranscriptsStats$2 = {
|
|
|
9415
9424
|
labelModel: "Modèle :",
|
|
9416
9425
|
labelModelCard: "modèle :",
|
|
9417
9426
|
labelUser: "Utilisateur :",
|
|
9418
|
-
labelUserId: "ID utilisateur :",
|
|
9419
9427
|
roleUser: "Utilisateur",
|
|
9420
9428
|
roleAgent: "Agent",
|
|
9421
9429
|
noMessages: "Aucun message dans cette conversation.",
|
|
@@ -12987,6 +12995,10 @@ var settingsTabLabels$2 = {
|
|
|
12987
12995
|
label: "En vedette",
|
|
12988
12996
|
tooltip: "Mettez cet agent en avant pour le mettre en valeur dans les listes."
|
|
12989
12997
|
},
|
|
12998
|
+
showExploreMentors: {
|
|
12999
|
+
label: "Afficher les agents supplémentaires",
|
|
13000
|
+
tooltip: "Affiche la section des agents supplémentaires sur l'écran d'accueil de cet agent."
|
|
13001
|
+
},
|
|
12990
13002
|
showAttachment: {
|
|
12991
13003
|
label: "Afficher les pièces jointes",
|
|
12992
13004
|
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."
|
|
@@ -13805,6 +13817,7 @@ var tabsSettingsTab$2 = {
|
|
|
13805
13817
|
whoCanViewTooltipAriaLabel: "Plus d'informations sur l'accès à la consultation",
|
|
13806
13818
|
whoCanChatTooltipAriaLabel: "Plus d'informations sur l'accès au chat",
|
|
13807
13819
|
featuredTooltipAriaLabel: "Plus d'informations sur la mise en avant",
|
|
13820
|
+
showExploreMentorsTooltipAriaLabel: "Plus d'informations sur l'affichage des agents supplémentaires",
|
|
13808
13821
|
showAttachmentTooltipAriaLabel: "Plus d'informations sur l'affichage des pièces jointes",
|
|
13809
13822
|
showVoiceRecordTooltipAriaLabel: "Plus d'informations sur l'affichage de l'enregistrement vocal",
|
|
13810
13823
|
showVoiceCallTooltipAriaLabel: "More info about show voice call",
|
|
@@ -15335,6 +15348,7 @@ var fr = {
|
|
|
15335
15348
|
analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$2,
|
|
15336
15349
|
analyticsAnalyticsCourses: analyticsAnalyticsCourses$2,
|
|
15337
15350
|
analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$2,
|
|
15351
|
+
analyticsAgentScopeLink: analyticsAgentScopeLink$2,
|
|
15338
15352
|
analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$2,
|
|
15339
15353
|
analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$2,
|
|
15340
15354
|
analyticsAnalyticsOverview: analyticsAnalyticsOverview$2,
|
|
@@ -16282,6 +16296,7 @@ var analyticsAnalyticsCourses$1 = {
|
|
|
16282
16296
|
loading: "Cargando...",
|
|
16283
16297
|
colCourseName: "Nombre del curso",
|
|
16284
16298
|
colCourseId: "ID del curso",
|
|
16299
|
+
openCourseAriaLabel: "Abrir el curso {id} en una pestaña nueva",
|
|
16285
16300
|
colEnrollments: "Inscripciones",
|
|
16286
16301
|
viewCourseAriaLabel: "Ver detalles de {name}",
|
|
16287
16302
|
goToFirstPage: "Ir a la primera página",
|
|
@@ -16334,15 +16349,15 @@ var analyticsAnalyticsFinancialStats$1 = {
|
|
|
16334
16349
|
viewTraces: "Trazas →",
|
|
16335
16350
|
costByLLMFooter: "{shown} modelos · ordenados por costo"
|
|
16336
16351
|
};
|
|
16352
|
+
var analyticsAgentScopeLink$1 = {
|
|
16353
|
+
scopeToAgent: "Ver analíticas de {name}"
|
|
16354
|
+
};
|
|
16337
16355
|
var analyticsAnalyticsMemoryStats$1 = {
|
|
16338
16356
|
noPermission: "No tienes permiso para ver los recuerdos de los usuarios.",
|
|
16339
16357
|
scopeLabel: "Alcance de la memoria",
|
|
16340
16358
|
scopeMentor: "Este agente",
|
|
16341
16359
|
scopeAllMentors: "Todos los agentes",
|
|
16342
16360
|
scopeGlobal: "Global",
|
|
16343
|
-
searchAgents: "Buscar agentes…",
|
|
16344
|
-
searchAgentsTitle: "Buscar agentes",
|
|
16345
|
-
clearAgentSearch: "Borrar la búsqueda de agentes",
|
|
16346
16361
|
contentPlaceholder: "Buscar en el contenido de los recuerdos",
|
|
16347
16362
|
pickDateRange: "Elige un rango de fechas",
|
|
16348
16363
|
allCategories: "Todas las categorías",
|
|
@@ -16487,6 +16502,7 @@ var analyticsAnalyticsPrograms$1 = {
|
|
|
16487
16502
|
loading: "Cargando...",
|
|
16488
16503
|
programName: "Nombre del programa",
|
|
16489
16504
|
programId: "ID del programa",
|
|
16505
|
+
openProgramAriaLabel: "Abrir el programa {id} en una pestaña nueva",
|
|
16490
16506
|
viewDetailsAriaLabel: "Ver detalles de {name}",
|
|
16491
16507
|
goToFirstPage: "Ir a la primera página",
|
|
16492
16508
|
goToPreviousPage: "Ir a la página anterior",
|
|
@@ -16566,7 +16582,6 @@ var analyticsAnalyticsTranscriptsStats$1 = {
|
|
|
16566
16582
|
labelModel: "Modelo:",
|
|
16567
16583
|
labelModelCard: "modelo:",
|
|
16568
16584
|
labelUser: "Usuario:",
|
|
16569
|
-
labelUserId: "ID de usuario:",
|
|
16570
16585
|
roleUser: "Usuario",
|
|
16571
16586
|
roleAgent: "Agente",
|
|
16572
16587
|
noMessages: "No hay mensajes en esta conversación.",
|
|
@@ -20138,6 +20153,10 @@ var settingsTabLabels$1 = {
|
|
|
20138
20153
|
label: "Destacado",
|
|
20139
20154
|
tooltip: "Destaque este agente para resaltarlo en los listados."
|
|
20140
20155
|
},
|
|
20156
|
+
showExploreMentors: {
|
|
20157
|
+
label: "Mostrar agentes adicionales",
|
|
20158
|
+
tooltip: "Muestra la sección de agentes adicionales en la pantalla de bienvenida de este agente."
|
|
20159
|
+
},
|
|
20141
20160
|
showAttachment: {
|
|
20142
20161
|
label: "Mostrar archivos adjuntos",
|
|
20143
20162
|
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."
|
|
@@ -20956,6 +20975,7 @@ var tabsSettingsTab$1 = {
|
|
|
20956
20975
|
whoCanViewTooltipAriaLabel: "Más información sobre el acceso de visualización",
|
|
20957
20976
|
whoCanChatTooltipAriaLabel: "Más información sobre el acceso al chat",
|
|
20958
20977
|
featuredTooltipAriaLabel: "Más información sobre destacado",
|
|
20978
|
+
showExploreMentorsTooltipAriaLabel: "Más información sobre mostrar agentes adicionales",
|
|
20959
20979
|
showAttachmentTooltipAriaLabel: "Más información sobre mostrar adjuntos",
|
|
20960
20980
|
showVoiceRecordTooltipAriaLabel: "Más información sobre mostrar grabación de voz",
|
|
20961
20981
|
showVoiceCallTooltipAriaLabel: "More info about show voice call",
|
|
@@ -22486,6 +22506,7 @@ var es = {
|
|
|
22486
22506
|
analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$1,
|
|
22487
22507
|
analyticsAnalyticsCourses: analyticsAnalyticsCourses$1,
|
|
22488
22508
|
analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$1,
|
|
22509
|
+
analyticsAgentScopeLink: analyticsAgentScopeLink$1,
|
|
22489
22510
|
analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$1,
|
|
22490
22511
|
analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$1,
|
|
22491
22512
|
analyticsAnalyticsOverview: analyticsAnalyticsOverview$1,
|
|
@@ -23433,6 +23454,7 @@ var analyticsAnalyticsCourses = {
|
|
|
23433
23454
|
loading: "加载中...",
|
|
23434
23455
|
colCourseName: "课程名称",
|
|
23435
23456
|
colCourseId: "课程 ID",
|
|
23457
|
+
openCourseAriaLabel: "在新标签页中打开课程 {id}",
|
|
23436
23458
|
colEnrollments: "注册人数",
|
|
23437
23459
|
viewCourseAriaLabel: "查看 {name} 的详情",
|
|
23438
23460
|
goToFirstPage: "跳转到第一页",
|
|
@@ -23485,15 +23507,15 @@ var analyticsAnalyticsFinancialStats = {
|
|
|
23485
23507
|
viewTraces: "追踪 →",
|
|
23486
23508
|
costByLLMFooter: "{shown} 个模型 · 按成本排序"
|
|
23487
23509
|
};
|
|
23510
|
+
var analyticsAgentScopeLink = {
|
|
23511
|
+
scopeToAgent: "查看 {name} 的分析"
|
|
23512
|
+
};
|
|
23488
23513
|
var analyticsAnalyticsMemoryStats = {
|
|
23489
23514
|
noPermission: "您没有查看用户记忆的权限。",
|
|
23490
23515
|
scopeLabel: "记忆范围",
|
|
23491
23516
|
scopeMentor: "当前智能体",
|
|
23492
23517
|
scopeAllMentors: "所有智能体",
|
|
23493
23518
|
scopeGlobal: "全局",
|
|
23494
|
-
searchAgents: "搜索智能体…",
|
|
23495
|
-
searchAgentsTitle: "搜索智能体",
|
|
23496
|
-
clearAgentSearch: "清除智能体搜索",
|
|
23497
23519
|
contentPlaceholder: "搜索记忆内容",
|
|
23498
23520
|
pickDateRange: "选择日期范围",
|
|
23499
23521
|
allCategories: "所有类别",
|
|
@@ -23638,6 +23660,7 @@ var analyticsAnalyticsPrograms = {
|
|
|
23638
23660
|
loading: "加载中...",
|
|
23639
23661
|
programName: "项目名称",
|
|
23640
23662
|
programId: "项目 ID",
|
|
23663
|
+
openProgramAriaLabel: "在新标签页中打开项目 {id}",
|
|
23641
23664
|
viewDetailsAriaLabel: "查看 {name} 的详情",
|
|
23642
23665
|
goToFirstPage: "跳至第一页",
|
|
23643
23666
|
goToPreviousPage: "跳至上一页",
|
|
@@ -23717,7 +23740,6 @@ var analyticsAnalyticsTranscriptsStats = {
|
|
|
23717
23740
|
labelModel: "模型:",
|
|
23718
23741
|
labelModelCard: "模型:",
|
|
23719
23742
|
labelUser: "用户:",
|
|
23720
|
-
labelUserId: "用户 ID:",
|
|
23721
23743
|
roleUser: "用户",
|
|
23722
23744
|
roleAgent: "智能体",
|
|
23723
23745
|
noMessages: "此对话中没有消息。",
|
|
@@ -27289,6 +27311,10 @@ var settingsTabLabels = {
|
|
|
27289
27311
|
label: "推荐",
|
|
27290
27312
|
tooltip: "将此智能体设为推荐,使其在列表中突出显示。"
|
|
27291
27313
|
},
|
|
27314
|
+
showExploreMentors: {
|
|
27315
|
+
label: "显示其他智能体",
|
|
27316
|
+
tooltip: "在此智能体的欢迎界面上显示“其他智能体”部分。"
|
|
27317
|
+
},
|
|
27292
27318
|
showAttachment: {
|
|
27293
27319
|
label: "显示附件",
|
|
27294
27320
|
tooltip: "允许用户在对话中添加附件。每个界面都有独立的开关:In-app chat 用于应用内托管的对话,Embed widget 用于您自己网站上的小组件。"
|
|
@@ -28107,6 +28133,7 @@ var tabsSettingsTab = {
|
|
|
28107
28133
|
whoCanViewTooltipAriaLabel: "关于查看访问权限的更多信息",
|
|
28108
28134
|
whoCanChatTooltipAriaLabel: "关于聊天访问权限的更多信息",
|
|
28109
28135
|
featuredTooltipAriaLabel: "关于精选的更多信息",
|
|
28136
|
+
showExploreMentorsTooltipAriaLabel: "关于显示其他智能体的更多信息",
|
|
28110
28137
|
showAttachmentTooltipAriaLabel: "关于显示附件的更多信息",
|
|
28111
28138
|
showVoiceRecordTooltipAriaLabel: "关于显示语音录制的更多信息",
|
|
28112
28139
|
showVoiceCallTooltipAriaLabel: "More info about show voice call",
|
|
@@ -29637,6 +29664,7 @@ var zh = {
|
|
|
29637
29664
|
analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail,
|
|
29638
29665
|
analyticsAnalyticsCourses: analyticsAnalyticsCourses,
|
|
29639
29666
|
analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats,
|
|
29667
|
+
analyticsAgentScopeLink: analyticsAgentScopeLink,
|
|
29640
29668
|
analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats,
|
|
29641
29669
|
analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats,
|
|
29642
29670
|
analyticsAnalyticsOverview: analyticsAnalyticsOverview,
|
|
@@ -78337,7 +78365,7 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
78337
78365
|
*/
|
|
78338
78366
|
|
|
78339
78367
|
|
|
78340
|
-
const __iconNode$
|
|
78368
|
+
const __iconNode$2r = [
|
|
78341
78369
|
[
|
|
78342
78370
|
"path",
|
|
78343
78371
|
{
|
|
@@ -78346,7 +78374,7 @@ const __iconNode$2q = [
|
|
|
78346
78374
|
}
|
|
78347
78375
|
]
|
|
78348
78376
|
];
|
|
78349
|
-
const Activity = createLucideIcon("activity", __iconNode$
|
|
78377
|
+
const Activity = createLucideIcon("activity", __iconNode$2r);
|
|
78350
78378
|
|
|
78351
78379
|
/**
|
|
78352
78380
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78356,12 +78384,12 @@ const Activity = createLucideIcon("activity", __iconNode$2q);
|
|
|
78356
78384
|
*/
|
|
78357
78385
|
|
|
78358
78386
|
|
|
78359
|
-
const __iconNode$
|
|
78387
|
+
const __iconNode$2q = [
|
|
78360
78388
|
["path", { d: "M17 12H7", key: "16if0g" }],
|
|
78361
78389
|
["path", { d: "M19 18H5", key: "18s9l3" }],
|
|
78362
78390
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
|
78363
78391
|
];
|
|
78364
|
-
const AlignCenter = createLucideIcon("align-center", __iconNode$
|
|
78392
|
+
const AlignCenter = createLucideIcon("align-center", __iconNode$2q);
|
|
78365
78393
|
|
|
78366
78394
|
/**
|
|
78367
78395
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78371,12 +78399,12 @@ const AlignCenter = createLucideIcon("align-center", __iconNode$2p);
|
|
|
78371
78399
|
*/
|
|
78372
78400
|
|
|
78373
78401
|
|
|
78374
|
-
const __iconNode$
|
|
78402
|
+
const __iconNode$2p = [
|
|
78375
78403
|
["path", { d: "M15 12H3", key: "6jk70r" }],
|
|
78376
78404
|
["path", { d: "M17 18H3", key: "1amg6g" }],
|
|
78377
78405
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
|
78378
78406
|
];
|
|
78379
|
-
const AlignLeft = createLucideIcon("align-left", __iconNode$
|
|
78407
|
+
const AlignLeft = createLucideIcon("align-left", __iconNode$2p);
|
|
78380
78408
|
|
|
78381
78409
|
/**
|
|
78382
78410
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78386,12 +78414,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$2o);
|
|
|
78386
78414
|
*/
|
|
78387
78415
|
|
|
78388
78416
|
|
|
78389
|
-
const __iconNode$
|
|
78417
|
+
const __iconNode$2o = [
|
|
78390
78418
|
["path", { d: "M21 12H9", key: "dn1m92" }],
|
|
78391
78419
|
["path", { d: "M21 18H7", key: "1ygte8" }],
|
|
78392
78420
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
|
78393
78421
|
];
|
|
78394
|
-
const AlignRight = createLucideIcon("align-right", __iconNode$
|
|
78422
|
+
const AlignRight = createLucideIcon("align-right", __iconNode$2o);
|
|
78395
78423
|
|
|
78396
78424
|
/**
|
|
78397
78425
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78401,12 +78429,12 @@ const AlignRight = createLucideIcon("align-right", __iconNode$2n);
|
|
|
78401
78429
|
*/
|
|
78402
78430
|
|
|
78403
78431
|
|
|
78404
|
-
const __iconNode$
|
|
78432
|
+
const __iconNode$2n = [
|
|
78405
78433
|
["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
|
|
78406
78434
|
["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
|
|
78407
78435
|
["path", { d: "M10 12h4", key: "a56b0p" }]
|
|
78408
78436
|
];
|
|
78409
|
-
const Archive = createLucideIcon("archive", __iconNode$
|
|
78437
|
+
const Archive = createLucideIcon("archive", __iconNode$2n);
|
|
78410
78438
|
|
|
78411
78439
|
/**
|
|
78412
78440
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78416,11 +78444,11 @@ const Archive = createLucideIcon("archive", __iconNode$2m);
|
|
|
78416
78444
|
*/
|
|
78417
78445
|
|
|
78418
78446
|
|
|
78419
|
-
const __iconNode$
|
|
78447
|
+
const __iconNode$2m = [
|
|
78420
78448
|
["path", { d: "M12 5v14", key: "s699le" }],
|
|
78421
78449
|
["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
|
|
78422
78450
|
];
|
|
78423
|
-
const ArrowDown = createLucideIcon("arrow-down", __iconNode$
|
|
78451
|
+
const ArrowDown = createLucideIcon("arrow-down", __iconNode$2m);
|
|
78424
78452
|
|
|
78425
78453
|
/**
|
|
78426
78454
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78430,11 +78458,11 @@ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2l);
|
|
|
78430
78458
|
*/
|
|
78431
78459
|
|
|
78432
78460
|
|
|
78433
|
-
const __iconNode$
|
|
78461
|
+
const __iconNode$2l = [
|
|
78434
78462
|
["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
|
|
78435
78463
|
["path", { d: "M19 12H5", key: "x3x0zl" }]
|
|
78436
78464
|
];
|
|
78437
|
-
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$
|
|
78465
|
+
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2l);
|
|
78438
78466
|
|
|
78439
78467
|
/**
|
|
78440
78468
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78444,11 +78472,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2k);
|
|
|
78444
78472
|
*/
|
|
78445
78473
|
|
|
78446
78474
|
|
|
78447
|
-
const __iconNode$
|
|
78475
|
+
const __iconNode$2k = [
|
|
78448
78476
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
78449
78477
|
["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
|
|
78450
78478
|
];
|
|
78451
|
-
const ArrowRight = createLucideIcon("arrow-right", __iconNode$
|
|
78479
|
+
const ArrowRight = createLucideIcon("arrow-right", __iconNode$2k);
|
|
78452
78480
|
|
|
78453
78481
|
/**
|
|
78454
78482
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78458,11 +78486,11 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2j);
|
|
|
78458
78486
|
*/
|
|
78459
78487
|
|
|
78460
78488
|
|
|
78461
|
-
const __iconNode$
|
|
78489
|
+
const __iconNode$2j = [
|
|
78462
78490
|
["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
|
|
78463
78491
|
["path", { d: "M12 19V5", key: "x0mq9r" }]
|
|
78464
78492
|
];
|
|
78465
|
-
const ArrowUp = createLucideIcon("arrow-up", __iconNode$
|
|
78493
|
+
const ArrowUp = createLucideIcon("arrow-up", __iconNode$2j);
|
|
78466
78494
|
|
|
78467
78495
|
/**
|
|
78468
78496
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78472,7 +78500,7 @@ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2i);
|
|
|
78472
78500
|
*/
|
|
78473
78501
|
|
|
78474
78502
|
|
|
78475
|
-
const __iconNode$
|
|
78503
|
+
const __iconNode$2i = [
|
|
78476
78504
|
[
|
|
78477
78505
|
"path",
|
|
78478
78506
|
{
|
|
@@ -78482,7 +78510,7 @@ const __iconNode$2h = [
|
|
|
78482
78510
|
],
|
|
78483
78511
|
["circle", { cx: "12", cy: "8", r: "6", key: "1vp47v" }]
|
|
78484
78512
|
];
|
|
78485
|
-
const Award = createLucideIcon("award", __iconNode$
|
|
78513
|
+
const Award = createLucideIcon("award", __iconNode$2i);
|
|
78486
78514
|
|
|
78487
78515
|
/**
|
|
78488
78516
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78492,11 +78520,11 @@ const Award = createLucideIcon("award", __iconNode$2h);
|
|
|
78492
78520
|
*/
|
|
78493
78521
|
|
|
78494
78522
|
|
|
78495
|
-
const __iconNode$
|
|
78523
|
+
const __iconNode$2h = [
|
|
78496
78524
|
["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
|
|
78497
78525
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
|
|
78498
78526
|
];
|
|
78499
|
-
const Ban = createLucideIcon("ban", __iconNode$
|
|
78527
|
+
const Ban = createLucideIcon("ban", __iconNode$2h);
|
|
78500
78528
|
|
|
78501
78529
|
/**
|
|
78502
78530
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78506,12 +78534,12 @@ const Ban = createLucideIcon("ban", __iconNode$2g);
|
|
|
78506
78534
|
*/
|
|
78507
78535
|
|
|
78508
78536
|
|
|
78509
|
-
const __iconNode$
|
|
78537
|
+
const __iconNode$2g = [
|
|
78510
78538
|
["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }],
|
|
78511
78539
|
["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }],
|
|
78512
78540
|
["path", { d: "M6 12h.01M18 12h.01", key: "113zkx" }]
|
|
78513
78541
|
];
|
|
78514
|
-
const Banknote = createLucideIcon("banknote", __iconNode$
|
|
78542
|
+
const Banknote = createLucideIcon("banknote", __iconNode$2g);
|
|
78515
78543
|
|
|
78516
78544
|
/**
|
|
78517
78545
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78521,7 +78549,7 @@ const Banknote = createLucideIcon("banknote", __iconNode$2f);
|
|
|
78521
78549
|
*/
|
|
78522
78550
|
|
|
78523
78551
|
|
|
78524
|
-
const __iconNode$
|
|
78552
|
+
const __iconNode$2f = [
|
|
78525
78553
|
["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
|
|
78526
78554
|
["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
|
|
78527
78555
|
[
|
|
@@ -78533,7 +78561,7 @@ const __iconNode$2e = [
|
|
|
78533
78561
|
],
|
|
78534
78562
|
["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
|
|
78535
78563
|
];
|
|
78536
|
-
const BellRing = createLucideIcon("bell-ring", __iconNode$
|
|
78564
|
+
const BellRing = createLucideIcon("bell-ring", __iconNode$2f);
|
|
78537
78565
|
|
|
78538
78566
|
/**
|
|
78539
78567
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78543,7 +78571,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$2e);
|
|
|
78543
78571
|
*/
|
|
78544
78572
|
|
|
78545
78573
|
|
|
78546
|
-
const __iconNode$
|
|
78574
|
+
const __iconNode$2e = [
|
|
78547
78575
|
["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
|
|
78548
78576
|
[
|
|
78549
78577
|
"path",
|
|
@@ -78553,7 +78581,7 @@ const __iconNode$2d = [
|
|
|
78553
78581
|
}
|
|
78554
78582
|
]
|
|
78555
78583
|
];
|
|
78556
|
-
const Bell = createLucideIcon("bell", __iconNode$
|
|
78584
|
+
const Bell = createLucideIcon("bell", __iconNode$2e);
|
|
78557
78585
|
|
|
78558
78586
|
/**
|
|
78559
78587
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78563,13 +78591,13 @@ const Bell = createLucideIcon("bell", __iconNode$2d);
|
|
|
78563
78591
|
*/
|
|
78564
78592
|
|
|
78565
78593
|
|
|
78566
|
-
const __iconNode$
|
|
78594
|
+
const __iconNode$2d = [
|
|
78567
78595
|
[
|
|
78568
78596
|
"path",
|
|
78569
78597
|
{ d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8", key: "mg9rjx" }
|
|
78570
78598
|
]
|
|
78571
78599
|
];
|
|
78572
|
-
const Bold$1 = createLucideIcon("bold", __iconNode$
|
|
78600
|
+
const Bold$1 = createLucideIcon("bold", __iconNode$2d);
|
|
78573
78601
|
|
|
78574
78602
|
/**
|
|
78575
78603
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78579,7 +78607,7 @@ const Bold$1 = createLucideIcon("bold", __iconNode$2c);
|
|
|
78579
78607
|
*/
|
|
78580
78608
|
|
|
78581
78609
|
|
|
78582
|
-
const __iconNode$
|
|
78610
|
+
const __iconNode$2c = [
|
|
78583
78611
|
["path", { d: "M12 7v14", key: "1akyts" }],
|
|
78584
78612
|
[
|
|
78585
78613
|
"path",
|
|
@@ -78589,7 +78617,7 @@ const __iconNode$2b = [
|
|
|
78589
78617
|
}
|
|
78590
78618
|
]
|
|
78591
78619
|
];
|
|
78592
|
-
const BookOpen = createLucideIcon("book-open", __iconNode$
|
|
78620
|
+
const BookOpen = createLucideIcon("book-open", __iconNode$2c);
|
|
78593
78621
|
|
|
78594
78622
|
/**
|
|
78595
78623
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78599,7 +78627,7 @@ const BookOpen = createLucideIcon("book-open", __iconNode$2b);
|
|
|
78599
78627
|
*/
|
|
78600
78628
|
|
|
78601
78629
|
|
|
78602
|
-
const __iconNode$
|
|
78630
|
+
const __iconNode$2b = [
|
|
78603
78631
|
["path", { d: "M12 8V4H8", key: "hb8ula" }],
|
|
78604
78632
|
["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
|
|
78605
78633
|
["path", { d: "M2 14h2", key: "vft8re" }],
|
|
@@ -78607,7 +78635,7 @@ const __iconNode$2a = [
|
|
|
78607
78635
|
["path", { d: "M15 13v2", key: "1xurst" }],
|
|
78608
78636
|
["path", { d: "M9 13v2", key: "rq6x2g" }]
|
|
78609
78637
|
];
|
|
78610
|
-
const Bot = createLucideIcon("bot", __iconNode$
|
|
78638
|
+
const Bot = createLucideIcon("bot", __iconNode$2b);
|
|
78611
78639
|
|
|
78612
78640
|
/**
|
|
78613
78641
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78617,11 +78645,11 @@ const Bot = createLucideIcon("bot", __iconNode$2a);
|
|
|
78617
78645
|
*/
|
|
78618
78646
|
|
|
78619
78647
|
|
|
78620
|
-
const __iconNode$
|
|
78648
|
+
const __iconNode$2a = [
|
|
78621
78649
|
["path", { d: "M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16", key: "jecpp" }],
|
|
78622
78650
|
["rect", { width: "20", height: "14", x: "2", y: "6", rx: "2", key: "i6l2r4" }]
|
|
78623
78651
|
];
|
|
78624
|
-
const Briefcase = createLucideIcon("briefcase", __iconNode$
|
|
78652
|
+
const Briefcase = createLucideIcon("briefcase", __iconNode$2a);
|
|
78625
78653
|
|
|
78626
78654
|
/**
|
|
78627
78655
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78631,7 +78659,7 @@ const Briefcase = createLucideIcon("briefcase", __iconNode$29);
|
|
|
78631
78659
|
*/
|
|
78632
78660
|
|
|
78633
78661
|
|
|
78634
|
-
const __iconNode$
|
|
78662
|
+
const __iconNode$29 = [
|
|
78635
78663
|
["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
|
|
78636
78664
|
["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
|
|
78637
78665
|
["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
|
|
@@ -78640,7 +78668,7 @@ const __iconNode$28 = [
|
|
|
78640
78668
|
["path", { d: "M10 14h4", key: "kelpxr" }],
|
|
78641
78669
|
["path", { d: "M10 18h4", key: "1ulq68" }]
|
|
78642
78670
|
];
|
|
78643
|
-
const Building2 = createLucideIcon("building-2", __iconNode$
|
|
78671
|
+
const Building2 = createLucideIcon("building-2", __iconNode$29);
|
|
78644
78672
|
|
|
78645
78673
|
/**
|
|
78646
78674
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78650,13 +78678,13 @@ const Building2 = createLucideIcon("building-2", __iconNode$28);
|
|
|
78650
78678
|
*/
|
|
78651
78679
|
|
|
78652
78680
|
|
|
78653
|
-
const __iconNode$
|
|
78681
|
+
const __iconNode$28 = [
|
|
78654
78682
|
["path", { d: "M8 2v4", key: "1cmpym" }],
|
|
78655
78683
|
["path", { d: "M16 2v4", key: "4m81vk" }],
|
|
78656
78684
|
["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
|
|
78657
78685
|
["path", { d: "M3 10h18", key: "8toen8" }]
|
|
78658
78686
|
];
|
|
78659
|
-
const Calendar$1 = createLucideIcon("calendar", __iconNode$
|
|
78687
|
+
const Calendar$1 = createLucideIcon("calendar", __iconNode$28);
|
|
78660
78688
|
|
|
78661
78689
|
/**
|
|
78662
78690
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78666,11 +78694,11 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$27);
|
|
|
78666
78694
|
*/
|
|
78667
78695
|
|
|
78668
78696
|
|
|
78669
|
-
const __iconNode$
|
|
78697
|
+
const __iconNode$27 = [
|
|
78670
78698
|
["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
|
|
78671
78699
|
["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
|
|
78672
78700
|
];
|
|
78673
|
-
const CheckCheck = createLucideIcon("check-check", __iconNode$
|
|
78701
|
+
const CheckCheck = createLucideIcon("check-check", __iconNode$27);
|
|
78674
78702
|
|
|
78675
78703
|
/**
|
|
78676
78704
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78680,8 +78708,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$26);
|
|
|
78680
78708
|
*/
|
|
78681
78709
|
|
|
78682
78710
|
|
|
78683
|
-
const __iconNode$
|
|
78684
|
-
const Check = createLucideIcon("check", __iconNode$
|
|
78711
|
+
const __iconNode$26 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
|
|
78712
|
+
const Check = createLucideIcon("check", __iconNode$26);
|
|
78685
78713
|
|
|
78686
78714
|
/**
|
|
78687
78715
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78691,8 +78719,8 @@ const Check = createLucideIcon("check", __iconNode$25);
|
|
|
78691
78719
|
*/
|
|
78692
78720
|
|
|
78693
78721
|
|
|
78694
|
-
const __iconNode$
|
|
78695
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
78722
|
+
const __iconNode$25 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
78723
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$25);
|
|
78696
78724
|
|
|
78697
78725
|
/**
|
|
78698
78726
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78702,11 +78730,11 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$24);
|
|
|
78702
78730
|
*/
|
|
78703
78731
|
|
|
78704
78732
|
|
|
78705
|
-
const __iconNode$
|
|
78733
|
+
const __iconNode$24 = [
|
|
78706
78734
|
["path", { d: "m17 18-6-6 6-6", key: "1yerx2" }],
|
|
78707
78735
|
["path", { d: "M7 6v12", key: "1p53r6" }]
|
|
78708
78736
|
];
|
|
78709
|
-
const ChevronFirst = createLucideIcon("chevron-first", __iconNode$
|
|
78737
|
+
const ChevronFirst = createLucideIcon("chevron-first", __iconNode$24);
|
|
78710
78738
|
|
|
78711
78739
|
/**
|
|
78712
78740
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78716,11 +78744,11 @@ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$23);
|
|
|
78716
78744
|
*/
|
|
78717
78745
|
|
|
78718
78746
|
|
|
78719
|
-
const __iconNode$
|
|
78747
|
+
const __iconNode$23 = [
|
|
78720
78748
|
["path", { d: "m7 18 6-6-6-6", key: "lwmzdw" }],
|
|
78721
78749
|
["path", { d: "M17 6v12", key: "1o0aio" }]
|
|
78722
78750
|
];
|
|
78723
|
-
const ChevronLast = createLucideIcon("chevron-last", __iconNode$
|
|
78751
|
+
const ChevronLast = createLucideIcon("chevron-last", __iconNode$23);
|
|
78724
78752
|
|
|
78725
78753
|
/**
|
|
78726
78754
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78730,8 +78758,8 @@ const ChevronLast = createLucideIcon("chevron-last", __iconNode$22);
|
|
|
78730
78758
|
*/
|
|
78731
78759
|
|
|
78732
78760
|
|
|
78733
|
-
const __iconNode$
|
|
78734
|
-
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$
|
|
78761
|
+
const __iconNode$22 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
|
|
78762
|
+
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$22);
|
|
78735
78763
|
|
|
78736
78764
|
/**
|
|
78737
78765
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78741,8 +78769,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$21);
|
|
|
78741
78769
|
*/
|
|
78742
78770
|
|
|
78743
78771
|
|
|
78744
|
-
const __iconNode$
|
|
78745
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
78772
|
+
const __iconNode$21 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
78773
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$21);
|
|
78746
78774
|
|
|
78747
78775
|
/**
|
|
78748
78776
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78752,8 +78780,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$20);
|
|
|
78752
78780
|
*/
|
|
78753
78781
|
|
|
78754
78782
|
|
|
78755
|
-
const __iconNode$
|
|
78756
|
-
const ChevronUp = createLucideIcon("chevron-up", __iconNode$
|
|
78783
|
+
const __iconNode$20 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
|
|
78784
|
+
const ChevronUp = createLucideIcon("chevron-up", __iconNode$20);
|
|
78757
78785
|
|
|
78758
78786
|
/**
|
|
78759
78787
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78763,11 +78791,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1$);
|
|
|
78763
78791
|
*/
|
|
78764
78792
|
|
|
78765
78793
|
|
|
78766
|
-
const __iconNode$
|
|
78794
|
+
const __iconNode$1$ = [
|
|
78767
78795
|
["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
|
|
78768
78796
|
["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
|
|
78769
78797
|
];
|
|
78770
|
-
const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$
|
|
78798
|
+
const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1$);
|
|
78771
78799
|
|
|
78772
78800
|
/**
|
|
78773
78801
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78777,11 +78805,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1_);
|
|
|
78777
78805
|
*/
|
|
78778
78806
|
|
|
78779
78807
|
|
|
78780
|
-
const __iconNode$
|
|
78808
|
+
const __iconNode$1_ = [
|
|
78781
78809
|
["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
|
|
78782
78810
|
["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
|
|
78783
78811
|
];
|
|
78784
|
-
const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$
|
|
78812
|
+
const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1_);
|
|
78785
78813
|
|
|
78786
78814
|
/**
|
|
78787
78815
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78791,11 +78819,11 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1Z);
|
|
|
78791
78819
|
*/
|
|
78792
78820
|
|
|
78793
78821
|
|
|
78794
|
-
const __iconNode$
|
|
78822
|
+
const __iconNode$1Z = [
|
|
78795
78823
|
["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
|
|
78796
78824
|
["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
|
|
78797
78825
|
];
|
|
78798
|
-
const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$
|
|
78826
|
+
const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1Z);
|
|
78799
78827
|
|
|
78800
78828
|
/**
|
|
78801
78829
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78805,12 +78833,12 @@ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1Y);
|
|
|
78805
78833
|
*/
|
|
78806
78834
|
|
|
78807
78835
|
|
|
78808
|
-
const __iconNode$
|
|
78836
|
+
const __iconNode$1Y = [
|
|
78809
78837
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
78810
78838
|
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
78811
78839
|
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
78812
78840
|
];
|
|
78813
|
-
const CircleAlert = createLucideIcon("circle-alert", __iconNode$
|
|
78841
|
+
const CircleAlert = createLucideIcon("circle-alert", __iconNode$1Y);
|
|
78814
78842
|
|
|
78815
78843
|
/**
|
|
78816
78844
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78820,11 +78848,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1X);
|
|
|
78820
78848
|
*/
|
|
78821
78849
|
|
|
78822
78850
|
|
|
78823
|
-
const __iconNode$
|
|
78851
|
+
const __iconNode$1X = [
|
|
78824
78852
|
["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
|
|
78825
78853
|
["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
|
|
78826
78854
|
];
|
|
78827
|
-
const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$
|
|
78855
|
+
const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1X);
|
|
78828
78856
|
|
|
78829
78857
|
/**
|
|
78830
78858
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78834,11 +78862,11 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1W);
|
|
|
78834
78862
|
*/
|
|
78835
78863
|
|
|
78836
78864
|
|
|
78837
|
-
const __iconNode$
|
|
78865
|
+
const __iconNode$1W = [
|
|
78838
78866
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
78839
78867
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
78840
78868
|
];
|
|
78841
|
-
const CircleCheck = createLucideIcon("circle-check", __iconNode$
|
|
78869
|
+
const CircleCheck = createLucideIcon("circle-check", __iconNode$1W);
|
|
78842
78870
|
|
|
78843
78871
|
/**
|
|
78844
78872
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78848,11 +78876,11 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$1V);
|
|
|
78848
78876
|
*/
|
|
78849
78877
|
|
|
78850
78878
|
|
|
78851
|
-
const __iconNode$
|
|
78879
|
+
const __iconNode$1V = [
|
|
78852
78880
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
78853
78881
|
["path", { d: "M8 12h8", key: "1wcyev" }]
|
|
78854
78882
|
];
|
|
78855
|
-
const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$
|
|
78883
|
+
const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1V);
|
|
78856
78884
|
|
|
78857
78885
|
/**
|
|
78858
78886
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78862,11 +78890,11 @@ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1U);
|
|
|
78862
78890
|
*/
|
|
78863
78891
|
|
|
78864
78892
|
|
|
78865
|
-
const __iconNode$
|
|
78893
|
+
const __iconNode$1U = [
|
|
78866
78894
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
78867
78895
|
["rect", { x: "9", y: "9", width: "6", height: "6", rx: "1", key: "1ssd4o" }]
|
|
78868
78896
|
];
|
|
78869
|
-
const CircleStop = createLucideIcon("circle-stop", __iconNode$
|
|
78897
|
+
const CircleStop = createLucideIcon("circle-stop", __iconNode$1U);
|
|
78870
78898
|
|
|
78871
78899
|
/**
|
|
78872
78900
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78876,12 +78904,12 @@ const CircleStop = createLucideIcon("circle-stop", __iconNode$1T);
|
|
|
78876
78904
|
*/
|
|
78877
78905
|
|
|
78878
78906
|
|
|
78879
|
-
const __iconNode$
|
|
78907
|
+
const __iconNode$1T = [
|
|
78880
78908
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
78881
78909
|
["path", { d: "m15 9-6 6", key: "1uzhvr" }],
|
|
78882
78910
|
["path", { d: "m9 9 6 6", key: "z0biqf" }]
|
|
78883
78911
|
];
|
|
78884
|
-
const CircleX = createLucideIcon("circle-x", __iconNode$
|
|
78912
|
+
const CircleX = createLucideIcon("circle-x", __iconNode$1T);
|
|
78885
78913
|
|
|
78886
78914
|
/**
|
|
78887
78915
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78891,8 +78919,8 @@ const CircleX = createLucideIcon("circle-x", __iconNode$1S);
|
|
|
78891
78919
|
*/
|
|
78892
78920
|
|
|
78893
78921
|
|
|
78894
|
-
const __iconNode$
|
|
78895
|
-
const Circle = createLucideIcon("circle", __iconNode$
|
|
78922
|
+
const __iconNode$1S = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
|
|
78923
|
+
const Circle = createLucideIcon("circle", __iconNode$1S);
|
|
78896
78924
|
|
|
78897
78925
|
/**
|
|
78898
78926
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78902,7 +78930,7 @@ const Circle = createLucideIcon("circle", __iconNode$1R);
|
|
|
78902
78930
|
*/
|
|
78903
78931
|
|
|
78904
78932
|
|
|
78905
|
-
const __iconNode$
|
|
78933
|
+
const __iconNode$1R = [
|
|
78906
78934
|
["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
|
|
78907
78935
|
[
|
|
78908
78936
|
"path",
|
|
@@ -78916,7 +78944,7 @@ const __iconNode$1Q = [
|
|
|
78916
78944
|
["path", { d: "M8 11h.01", key: "1dfujw" }],
|
|
78917
78945
|
["path", { d: "M8 16h.01", key: "18s6g9" }]
|
|
78918
78946
|
];
|
|
78919
|
-
const ClipboardList = createLucideIcon("clipboard-list", __iconNode$
|
|
78947
|
+
const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1R);
|
|
78920
78948
|
|
|
78921
78949
|
/**
|
|
78922
78950
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78926,11 +78954,11 @@ const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1Q);
|
|
|
78926
78954
|
*/
|
|
78927
78955
|
|
|
78928
78956
|
|
|
78929
|
-
const __iconNode$
|
|
78957
|
+
const __iconNode$1Q = [
|
|
78930
78958
|
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
|
|
78931
78959
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
|
|
78932
78960
|
];
|
|
78933
|
-
const Clock = createLucideIcon("clock", __iconNode$
|
|
78961
|
+
const Clock = createLucideIcon("clock", __iconNode$1Q);
|
|
78934
78962
|
|
|
78935
78963
|
/**
|
|
78936
78964
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78940,12 +78968,12 @@ const Clock = createLucideIcon("clock", __iconNode$1P);
|
|
|
78940
78968
|
*/
|
|
78941
78969
|
|
|
78942
78970
|
|
|
78943
|
-
const __iconNode$
|
|
78971
|
+
const __iconNode$1P = [
|
|
78944
78972
|
["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
|
|
78945
78973
|
["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
|
|
78946
78974
|
["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
|
|
78947
78975
|
];
|
|
78948
|
-
const CodeXml = createLucideIcon("code-xml", __iconNode$
|
|
78976
|
+
const CodeXml = createLucideIcon("code-xml", __iconNode$1P);
|
|
78949
78977
|
|
|
78950
78978
|
/**
|
|
78951
78979
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78955,11 +78983,11 @@ const CodeXml = createLucideIcon("code-xml", __iconNode$1O);
|
|
|
78955
78983
|
*/
|
|
78956
78984
|
|
|
78957
78985
|
|
|
78958
|
-
const __iconNode$
|
|
78986
|
+
const __iconNode$1O = [
|
|
78959
78987
|
["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
|
|
78960
78988
|
["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
|
|
78961
78989
|
];
|
|
78962
|
-
const Code$1 = createLucideIcon("code", __iconNode$
|
|
78990
|
+
const Code$1 = createLucideIcon("code", __iconNode$1O);
|
|
78963
78991
|
|
|
78964
78992
|
/**
|
|
78965
78993
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78969,11 +78997,11 @@ const Code$1 = createLucideIcon("code", __iconNode$1N);
|
|
|
78969
78997
|
*/
|
|
78970
78998
|
|
|
78971
78999
|
|
|
78972
|
-
const __iconNode$
|
|
79000
|
+
const __iconNode$1N = [
|
|
78973
79001
|
["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
|
|
78974
79002
|
["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
|
|
78975
79003
|
];
|
|
78976
|
-
const Copy = createLucideIcon("copy", __iconNode$
|
|
79004
|
+
const Copy = createLucideIcon("copy", __iconNode$1N);
|
|
78977
79005
|
|
|
78978
79006
|
/**
|
|
78979
79007
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78983,11 +79011,11 @@ const Copy = createLucideIcon("copy", __iconNode$1M);
|
|
|
78983
79011
|
*/
|
|
78984
79012
|
|
|
78985
79013
|
|
|
78986
|
-
const __iconNode$
|
|
79014
|
+
const __iconNode$1M = [
|
|
78987
79015
|
["rect", { width: "20", height: "14", x: "2", y: "5", rx: "2", key: "ynyp8z" }],
|
|
78988
79016
|
["line", { x1: "2", x2: "22", y1: "10", y2: "10", key: "1b3vmo" }]
|
|
78989
79017
|
];
|
|
78990
|
-
const CreditCard = createLucideIcon("credit-card", __iconNode$
|
|
79018
|
+
const CreditCard = createLucideIcon("credit-card", __iconNode$1M);
|
|
78991
79019
|
|
|
78992
79020
|
/**
|
|
78993
79021
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -78997,12 +79025,12 @@ const CreditCard = createLucideIcon("credit-card", __iconNode$1L);
|
|
|
78997
79025
|
*/
|
|
78998
79026
|
|
|
78999
79027
|
|
|
79000
|
-
const __iconNode$
|
|
79028
|
+
const __iconNode$1L = [
|
|
79001
79029
|
["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
|
|
79002
79030
|
["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
|
|
79003
79031
|
["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
|
|
79004
79032
|
];
|
|
79005
|
-
const Database = createLucideIcon("database", __iconNode$
|
|
79033
|
+
const Database = createLucideIcon("database", __iconNode$1L);
|
|
79006
79034
|
|
|
79007
79035
|
/**
|
|
79008
79036
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79012,11 +79040,11 @@ const Database = createLucideIcon("database", __iconNode$1K);
|
|
|
79012
79040
|
*/
|
|
79013
79041
|
|
|
79014
79042
|
|
|
79015
|
-
const __iconNode$
|
|
79043
|
+
const __iconNode$1K = [
|
|
79016
79044
|
["line", { x1: "12", x2: "12", y1: "2", y2: "22", key: "7eqyqh" }],
|
|
79017
79045
|
["path", { d: "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6", key: "1b0p4s" }]
|
|
79018
79046
|
];
|
|
79019
|
-
const DollarSign = createLucideIcon("dollar-sign", __iconNode$
|
|
79047
|
+
const DollarSign = createLucideIcon("dollar-sign", __iconNode$1K);
|
|
79020
79048
|
|
|
79021
79049
|
/**
|
|
79022
79050
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79026,7 +79054,7 @@ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1J);
|
|
|
79026
79054
|
*/
|
|
79027
79055
|
|
|
79028
79056
|
|
|
79029
|
-
const __iconNode$
|
|
79057
|
+
const __iconNode$1J = [
|
|
79030
79058
|
["path", { d: "M11 20H2", key: "nlcfvz" }],
|
|
79031
79059
|
[
|
|
79032
79060
|
"path",
|
|
@@ -79039,7 +79067,7 @@ const __iconNode$1I = [
|
|
|
79039
79067
|
["path", { d: "M14 12h.01", key: "1jfl7z" }],
|
|
79040
79068
|
["path", { d: "M22 20h-3", key: "vhrsz" }]
|
|
79041
79069
|
];
|
|
79042
|
-
const DoorOpen = createLucideIcon("door-open", __iconNode$
|
|
79070
|
+
const DoorOpen = createLucideIcon("door-open", __iconNode$1J);
|
|
79043
79071
|
|
|
79044
79072
|
/**
|
|
79045
79073
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79049,12 +79077,12 @@ const DoorOpen = createLucideIcon("door-open", __iconNode$1I);
|
|
|
79049
79077
|
*/
|
|
79050
79078
|
|
|
79051
79079
|
|
|
79052
|
-
const __iconNode$
|
|
79080
|
+
const __iconNode$1I = [
|
|
79053
79081
|
["path", { d: "M12 15V3", key: "m9g1x1" }],
|
|
79054
79082
|
["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
|
|
79055
79083
|
["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
|
|
79056
79084
|
];
|
|
79057
|
-
const Download = createLucideIcon("download", __iconNode$
|
|
79085
|
+
const Download = createLucideIcon("download", __iconNode$1I);
|
|
79058
79086
|
|
|
79059
79087
|
/**
|
|
79060
79088
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79064,12 +79092,12 @@ const Download = createLucideIcon("download", __iconNode$1H);
|
|
|
79064
79092
|
*/
|
|
79065
79093
|
|
|
79066
79094
|
|
|
79067
|
-
const __iconNode$
|
|
79095
|
+
const __iconNode$1H = [
|
|
79068
79096
|
["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
|
|
79069
79097
|
["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
|
|
79070
79098
|
["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
|
|
79071
79099
|
];
|
|
79072
|
-
const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$
|
|
79100
|
+
const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1H);
|
|
79073
79101
|
|
|
79074
79102
|
/**
|
|
79075
79103
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79079,12 +79107,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1G);
|
|
|
79079
79107
|
*/
|
|
79080
79108
|
|
|
79081
79109
|
|
|
79082
|
-
const __iconNode$
|
|
79110
|
+
const __iconNode$1G = [
|
|
79083
79111
|
["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
|
|
79084
79112
|
["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
|
|
79085
79113
|
["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
|
|
79086
79114
|
];
|
|
79087
|
-
const Ellipsis = createLucideIcon("ellipsis", __iconNode$
|
|
79115
|
+
const Ellipsis = createLucideIcon("ellipsis", __iconNode$1G);
|
|
79088
79116
|
|
|
79089
79117
|
/**
|
|
79090
79118
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79094,12 +79122,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1F);
|
|
|
79094
79122
|
*/
|
|
79095
79123
|
|
|
79096
79124
|
|
|
79097
|
-
const __iconNode$
|
|
79125
|
+
const __iconNode$1F = [
|
|
79098
79126
|
["path", { d: "M15 3h6v6", key: "1q9fwt" }],
|
|
79099
79127
|
["path", { d: "M10 14 21 3", key: "gplh6r" }],
|
|
79100
79128
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
|
|
79101
79129
|
];
|
|
79102
|
-
const ExternalLink = createLucideIcon("external-link", __iconNode$
|
|
79130
|
+
const ExternalLink = createLucideIcon("external-link", __iconNode$1F);
|
|
79103
79131
|
|
|
79104
79132
|
/**
|
|
79105
79133
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79109,7 +79137,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$1E);
|
|
|
79109
79137
|
*/
|
|
79110
79138
|
|
|
79111
79139
|
|
|
79112
|
-
const __iconNode$
|
|
79140
|
+
const __iconNode$1E = [
|
|
79113
79141
|
[
|
|
79114
79142
|
"path",
|
|
79115
79143
|
{
|
|
@@ -79127,7 +79155,7 @@ const __iconNode$1D = [
|
|
|
79127
79155
|
],
|
|
79128
79156
|
["path", { d: "m2 2 20 20", key: "1ooewy" }]
|
|
79129
79157
|
];
|
|
79130
|
-
const EyeOff = createLucideIcon("eye-off", __iconNode$
|
|
79158
|
+
const EyeOff = createLucideIcon("eye-off", __iconNode$1E);
|
|
79131
79159
|
|
|
79132
79160
|
/**
|
|
79133
79161
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79137,7 +79165,7 @@ const EyeOff = createLucideIcon("eye-off", __iconNode$1D);
|
|
|
79137
79165
|
*/
|
|
79138
79166
|
|
|
79139
79167
|
|
|
79140
|
-
const __iconNode$
|
|
79168
|
+
const __iconNode$1D = [
|
|
79141
79169
|
[
|
|
79142
79170
|
"path",
|
|
79143
79171
|
{
|
|
@@ -79147,7 +79175,7 @@ const __iconNode$1C = [
|
|
|
79147
79175
|
],
|
|
79148
79176
|
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
79149
79177
|
];
|
|
79150
|
-
const Eye = createLucideIcon("eye", __iconNode$
|
|
79178
|
+
const Eye = createLucideIcon("eye", __iconNode$1D);
|
|
79151
79179
|
|
|
79152
79180
|
/**
|
|
79153
79181
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79157,7 +79185,7 @@ const Eye = createLucideIcon("eye", __iconNode$1C);
|
|
|
79157
79185
|
*/
|
|
79158
79186
|
|
|
79159
79187
|
|
|
79160
|
-
const __iconNode$
|
|
79188
|
+
const __iconNode$1C = [
|
|
79161
79189
|
["path", { d: "M10 12v-1", key: "v7bkov" }],
|
|
79162
79190
|
["path", { d: "M10 18v-2", key: "1cjy8d" }],
|
|
79163
79191
|
["path", { d: "M10 7V6", key: "dljcrl" }],
|
|
@@ -79168,7 +79196,7 @@ const __iconNode$1B = [
|
|
|
79168
79196
|
],
|
|
79169
79197
|
["circle", { cx: "10", cy: "20", r: "2", key: "1xzdoj" }]
|
|
79170
79198
|
];
|
|
79171
|
-
const FileArchive = createLucideIcon("file-archive", __iconNode$
|
|
79199
|
+
const FileArchive = createLucideIcon("file-archive", __iconNode$1C);
|
|
79172
79200
|
|
|
79173
79201
|
/**
|
|
79174
79202
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79178,7 +79206,7 @@ const FileArchive = createLucideIcon("file-archive", __iconNode$1B);
|
|
|
79178
79206
|
*/
|
|
79179
79207
|
|
|
79180
79208
|
|
|
79181
|
-
const __iconNode$
|
|
79209
|
+
const __iconNode$1B = [
|
|
79182
79210
|
["path", { d: "M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3", key: "rslqgf" }],
|
|
79183
79211
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79184
79212
|
[
|
|
@@ -79189,7 +79217,7 @@ const __iconNode$1A = [
|
|
|
79189
79217
|
}
|
|
79190
79218
|
]
|
|
79191
79219
|
];
|
|
79192
|
-
const FileAudio = createLucideIcon("file-audio", __iconNode$
|
|
79220
|
+
const FileAudio = createLucideIcon("file-audio", __iconNode$1B);
|
|
79193
79221
|
|
|
79194
79222
|
/**
|
|
79195
79223
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79199,13 +79227,13 @@ const FileAudio = createLucideIcon("file-audio", __iconNode$1A);
|
|
|
79199
79227
|
*/
|
|
79200
79228
|
|
|
79201
79229
|
|
|
79202
|
-
const __iconNode$
|
|
79230
|
+
const __iconNode$1A = [
|
|
79203
79231
|
["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
|
|
79204
79232
|
["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }],
|
|
79205
79233
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79206
79234
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }]
|
|
79207
79235
|
];
|
|
79208
|
-
const FileCode = createLucideIcon("file-code", __iconNode$
|
|
79236
|
+
const FileCode = createLucideIcon("file-code", __iconNode$1A);
|
|
79209
79237
|
|
|
79210
79238
|
/**
|
|
79211
79239
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79215,13 +79243,13 @@ const FileCode = createLucideIcon("file-code", __iconNode$1z);
|
|
|
79215
79243
|
*/
|
|
79216
79244
|
|
|
79217
79245
|
|
|
79218
|
-
const __iconNode$
|
|
79246
|
+
const __iconNode$1z = [
|
|
79219
79247
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
79220
79248
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79221
79249
|
["path", { d: "M12 18v-6", key: "17g6i2" }],
|
|
79222
79250
|
["path", { d: "m9 15 3 3 3-3", key: "1npd3o" }]
|
|
79223
79251
|
];
|
|
79224
|
-
const FileDown = createLucideIcon("file-down", __iconNode$
|
|
79252
|
+
const FileDown = createLucideIcon("file-down", __iconNode$1z);
|
|
79225
79253
|
|
|
79226
79254
|
/**
|
|
79227
79255
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79231,13 +79259,13 @@ const FileDown = createLucideIcon("file-down", __iconNode$1y);
|
|
|
79231
79259
|
*/
|
|
79232
79260
|
|
|
79233
79261
|
|
|
79234
|
-
const __iconNode$
|
|
79262
|
+
const __iconNode$1y = [
|
|
79235
79263
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
79236
79264
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79237
79265
|
["circle", { cx: "10", cy: "12", r: "2", key: "737tya" }],
|
|
79238
79266
|
["path", { d: "m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22", key: "wt3hpn" }]
|
|
79239
79267
|
];
|
|
79240
|
-
const FileImage = createLucideIcon("file-image", __iconNode$
|
|
79268
|
+
const FileImage = createLucideIcon("file-image", __iconNode$1y);
|
|
79241
79269
|
|
|
79242
79270
|
/**
|
|
79243
79271
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79247,7 +79275,7 @@ const FileImage = createLucideIcon("file-image", __iconNode$1x);
|
|
|
79247
79275
|
*/
|
|
79248
79276
|
|
|
79249
79277
|
|
|
79250
|
-
const __iconNode$
|
|
79278
|
+
const __iconNode$1x = [
|
|
79251
79279
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79252
79280
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }],
|
|
79253
79281
|
[
|
|
@@ -79258,7 +79286,7 @@ const __iconNode$1w = [
|
|
|
79258
79286
|
}
|
|
79259
79287
|
]
|
|
79260
79288
|
];
|
|
79261
|
-
const FilePlay = createLucideIcon("file-play", __iconNode$
|
|
79289
|
+
const FilePlay = createLucideIcon("file-play", __iconNode$1x);
|
|
79262
79290
|
|
|
79263
79291
|
/**
|
|
79264
79292
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79268,7 +79296,7 @@ const FilePlay = createLucideIcon("file-play", __iconNode$1w);
|
|
|
79268
79296
|
*/
|
|
79269
79297
|
|
|
79270
79298
|
|
|
79271
|
-
const __iconNode$
|
|
79299
|
+
const __iconNode$1w = [
|
|
79272
79300
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
79273
79301
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79274
79302
|
["path", { d: "M8 13h2", key: "yr2amv" }],
|
|
@@ -79276,7 +79304,7 @@ const __iconNode$1v = [
|
|
|
79276
79304
|
["path", { d: "M8 17h2", key: "2yhykz" }],
|
|
79277
79305
|
["path", { d: "M14 17h2", key: "10kma7" }]
|
|
79278
79306
|
];
|
|
79279
|
-
const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$
|
|
79307
|
+
const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1w);
|
|
79280
79308
|
|
|
79281
79309
|
/**
|
|
79282
79310
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79286,14 +79314,14 @@ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1v);
|
|
|
79286
79314
|
*/
|
|
79287
79315
|
|
|
79288
79316
|
|
|
79289
|
-
const __iconNode$
|
|
79317
|
+
const __iconNode$1v = [
|
|
79290
79318
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
79291
79319
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
79292
79320
|
["path", { d: "M10 9H8", key: "b1mrlr" }],
|
|
79293
79321
|
["path", { d: "M16 13H8", key: "t4e002" }],
|
|
79294
79322
|
["path", { d: "M16 17H8", key: "z1uh3a" }]
|
|
79295
79323
|
];
|
|
79296
|
-
const FileText = createLucideIcon("file-text", __iconNode$
|
|
79324
|
+
const FileText = createLucideIcon("file-text", __iconNode$1v);
|
|
79297
79325
|
|
|
79298
79326
|
/**
|
|
79299
79327
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79303,11 +79331,11 @@ const FileText = createLucideIcon("file-text", __iconNode$1u);
|
|
|
79303
79331
|
*/
|
|
79304
79332
|
|
|
79305
79333
|
|
|
79306
|
-
const __iconNode$
|
|
79334
|
+
const __iconNode$1u = [
|
|
79307
79335
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
79308
79336
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }]
|
|
79309
79337
|
];
|
|
79310
|
-
const File$1 = createLucideIcon("file", __iconNode$
|
|
79338
|
+
const File$1 = createLucideIcon("file", __iconNode$1u);
|
|
79311
79339
|
|
|
79312
79340
|
/**
|
|
79313
79341
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79317,7 +79345,7 @@ const File$1 = createLucideIcon("file", __iconNode$1t);
|
|
|
79317
79345
|
*/
|
|
79318
79346
|
|
|
79319
79347
|
|
|
79320
|
-
const __iconNode$
|
|
79348
|
+
const __iconNode$1t = [
|
|
79321
79349
|
[
|
|
79322
79350
|
"path",
|
|
79323
79351
|
{
|
|
@@ -79335,7 +79363,7 @@ const __iconNode$1s = [
|
|
|
79335
79363
|
["path", { d: "M3 5a2 2 0 0 0 2 2h3", key: "f2jnh7" }],
|
|
79336
79364
|
["path", { d: "M3 3v13a2 2 0 0 0 2 2h3", key: "k8epm1" }]
|
|
79337
79365
|
];
|
|
79338
|
-
const FolderTree = createLucideIcon("folder-tree", __iconNode$
|
|
79366
|
+
const FolderTree = createLucideIcon("folder-tree", __iconNode$1t);
|
|
79339
79367
|
|
|
79340
79368
|
/**
|
|
79341
79369
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79345,14 +79373,14 @@ const FolderTree = createLucideIcon("folder-tree", __iconNode$1s);
|
|
|
79345
79373
|
*/
|
|
79346
79374
|
|
|
79347
79375
|
|
|
79348
|
-
const __iconNode$
|
|
79376
|
+
const __iconNode$1s = [
|
|
79349
79377
|
["path", { d: "m14.5 12.5-8 8a2.119 2.119 0 1 1-3-3l8-8", key: "15492f" }],
|
|
79350
79378
|
["path", { d: "m16 16 6-6", key: "vzrcl6" }],
|
|
79351
79379
|
["path", { d: "m8 8 6-6", key: "18bi4p" }],
|
|
79352
79380
|
["path", { d: "m9 7 8 8", key: "5jnvq1" }],
|
|
79353
79381
|
["path", { d: "m21 11-8-8", key: "z4y7zo" }]
|
|
79354
79382
|
];
|
|
79355
|
-
const Gavel = createLucideIcon("gavel", __iconNode$
|
|
79383
|
+
const Gavel = createLucideIcon("gavel", __iconNode$1s);
|
|
79356
79384
|
|
|
79357
79385
|
/**
|
|
79358
79386
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79362,13 +79390,13 @@ const Gavel = createLucideIcon("gavel", __iconNode$1r);
|
|
|
79362
79390
|
*/
|
|
79363
79391
|
|
|
79364
79392
|
|
|
79365
|
-
const __iconNode$
|
|
79393
|
+
const __iconNode$1r = [
|
|
79366
79394
|
["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
|
|
79367
79395
|
["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
|
|
79368
79396
|
["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
|
|
79369
79397
|
["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
|
|
79370
79398
|
];
|
|
79371
|
-
const GitBranch = createLucideIcon("git-branch", __iconNode$
|
|
79399
|
+
const GitBranch = createLucideIcon("git-branch", __iconNode$1r);
|
|
79372
79400
|
|
|
79373
79401
|
/**
|
|
79374
79402
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79378,12 +79406,12 @@ const GitBranch = createLucideIcon("git-branch", __iconNode$1q);
|
|
|
79378
79406
|
*/
|
|
79379
79407
|
|
|
79380
79408
|
|
|
79381
|
-
const __iconNode$
|
|
79409
|
+
const __iconNode$1q = [
|
|
79382
79410
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
79383
79411
|
["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
|
|
79384
79412
|
["path", { d: "M2 12h20", key: "9i4pu4" }]
|
|
79385
79413
|
];
|
|
79386
|
-
const Globe = createLucideIcon("globe", __iconNode$
|
|
79414
|
+
const Globe = createLucideIcon("globe", __iconNode$1q);
|
|
79387
79415
|
|
|
79388
79416
|
/**
|
|
79389
79417
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79393,7 +79421,7 @@ const Globe = createLucideIcon("globe", __iconNode$1p);
|
|
|
79393
79421
|
*/
|
|
79394
79422
|
|
|
79395
79423
|
|
|
79396
|
-
const __iconNode$
|
|
79424
|
+
const __iconNode$1p = [
|
|
79397
79425
|
[
|
|
79398
79426
|
"path",
|
|
79399
79427
|
{
|
|
@@ -79404,7 +79432,7 @@ const __iconNode$1o = [
|
|
|
79404
79432
|
["path", { d: "M22 10v6", key: "1lu8f3" }],
|
|
79405
79433
|
["path", { d: "M6 12.5V16a6 3 0 0 0 12 0v-3.5", key: "1r8lef" }]
|
|
79406
79434
|
];
|
|
79407
|
-
const GraduationCap = createLucideIcon("graduation-cap", __iconNode$
|
|
79435
|
+
const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1p);
|
|
79408
79436
|
|
|
79409
79437
|
/**
|
|
79410
79438
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79414,7 +79442,7 @@ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1o);
|
|
|
79414
79442
|
*/
|
|
79415
79443
|
|
|
79416
79444
|
|
|
79417
|
-
const __iconNode$
|
|
79445
|
+
const __iconNode$1o = [
|
|
79418
79446
|
["path", { d: "M14 18a2 2 0 0 0-4 0", key: "1v8fkw" }],
|
|
79419
79447
|
[
|
|
79420
79448
|
"path",
|
|
@@ -79427,7 +79455,7 @@ const __iconNode$1n = [
|
|
|
79427
79455
|
["circle", { cx: "17", cy: "18", r: "3", key: "82mm0e" }],
|
|
79428
79456
|
["circle", { cx: "7", cy: "18", r: "3", key: "lvkj7j" }]
|
|
79429
79457
|
];
|
|
79430
|
-
const HatGlasses = createLucideIcon("hat-glasses", __iconNode$
|
|
79458
|
+
const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1o);
|
|
79431
79459
|
|
|
79432
79460
|
/**
|
|
79433
79461
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79437,13 +79465,13 @@ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1n);
|
|
|
79437
79465
|
*/
|
|
79438
79466
|
|
|
79439
79467
|
|
|
79440
|
-
const __iconNode$
|
|
79468
|
+
const __iconNode$1n = [
|
|
79441
79469
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
79442
79470
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
79443
79471
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
79444
79472
|
["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
|
|
79445
79473
|
];
|
|
79446
|
-
const Heading1 = createLucideIcon("heading-1", __iconNode$
|
|
79474
|
+
const Heading1 = createLucideIcon("heading-1", __iconNode$1n);
|
|
79447
79475
|
|
|
79448
79476
|
/**
|
|
79449
79477
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79453,13 +79481,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$1m);
|
|
|
79453
79481
|
*/
|
|
79454
79482
|
|
|
79455
79483
|
|
|
79456
|
-
const __iconNode$
|
|
79484
|
+
const __iconNode$1m = [
|
|
79457
79485
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
79458
79486
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
79459
79487
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
79460
79488
|
["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
|
|
79461
79489
|
];
|
|
79462
|
-
const Heading2 = createLucideIcon("heading-2", __iconNode$
|
|
79490
|
+
const Heading2 = createLucideIcon("heading-2", __iconNode$1m);
|
|
79463
79491
|
|
|
79464
79492
|
/**
|
|
79465
79493
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79469,14 +79497,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$1l);
|
|
|
79469
79497
|
*/
|
|
79470
79498
|
|
|
79471
79499
|
|
|
79472
|
-
const __iconNode$
|
|
79500
|
+
const __iconNode$1l = [
|
|
79473
79501
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
79474
79502
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
79475
79503
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
79476
79504
|
["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
|
|
79477
79505
|
["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
|
|
79478
79506
|
];
|
|
79479
|
-
const Heading3 = createLucideIcon("heading-3", __iconNode$
|
|
79507
|
+
const Heading3 = createLucideIcon("heading-3", __iconNode$1l);
|
|
79480
79508
|
|
|
79481
79509
|
/**
|
|
79482
79510
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79486,12 +79514,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$1k);
|
|
|
79486
79514
|
*/
|
|
79487
79515
|
|
|
79488
79516
|
|
|
79489
|
-
const __iconNode$
|
|
79517
|
+
const __iconNode$1k = [
|
|
79490
79518
|
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
|
|
79491
79519
|
["path", { d: "M3 3v5h5", key: "1xhq8a" }],
|
|
79492
79520
|
["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
|
|
79493
79521
|
];
|
|
79494
|
-
const History = createLucideIcon("history", __iconNode$
|
|
79522
|
+
const History = createLucideIcon("history", __iconNode$1k);
|
|
79495
79523
|
|
|
79496
79524
|
/**
|
|
79497
79525
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79501,12 +79529,12 @@ const History = createLucideIcon("history", __iconNode$1j);
|
|
|
79501
79529
|
*/
|
|
79502
79530
|
|
|
79503
79531
|
|
|
79504
|
-
const __iconNode$
|
|
79532
|
+
const __iconNode$1j = [
|
|
79505
79533
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
|
|
79506
79534
|
["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
|
|
79507
79535
|
["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
|
|
79508
79536
|
];
|
|
79509
|
-
const Image$3 = createLucideIcon("image", __iconNode$
|
|
79537
|
+
const Image$3 = createLucideIcon("image", __iconNode$1j);
|
|
79510
79538
|
|
|
79511
79539
|
/**
|
|
79512
79540
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79516,7 +79544,7 @@ const Image$3 = createLucideIcon("image", __iconNode$1i);
|
|
|
79516
79544
|
*/
|
|
79517
79545
|
|
|
79518
79546
|
|
|
79519
|
-
const __iconNode$
|
|
79547
|
+
const __iconNode$1i = [
|
|
79520
79548
|
["polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12", key: "o97t9d" }],
|
|
79521
79549
|
[
|
|
79522
79550
|
"path",
|
|
@@ -79526,7 +79554,7 @@ const __iconNode$1h = [
|
|
|
79526
79554
|
}
|
|
79527
79555
|
]
|
|
79528
79556
|
];
|
|
79529
|
-
const Inbox = createLucideIcon("inbox", __iconNode$
|
|
79557
|
+
const Inbox = createLucideIcon("inbox", __iconNode$1i);
|
|
79530
79558
|
|
|
79531
79559
|
/**
|
|
79532
79560
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79536,12 +79564,12 @@ const Inbox = createLucideIcon("inbox", __iconNode$1h);
|
|
|
79536
79564
|
*/
|
|
79537
79565
|
|
|
79538
79566
|
|
|
79539
|
-
const __iconNode$
|
|
79567
|
+
const __iconNode$1h = [
|
|
79540
79568
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
79541
79569
|
["path", { d: "M12 16v-4", key: "1dtifu" }],
|
|
79542
79570
|
["path", { d: "M12 8h.01", key: "e9boi3" }]
|
|
79543
79571
|
];
|
|
79544
|
-
const Info$3 = createLucideIcon("info", __iconNode$
|
|
79572
|
+
const Info$3 = createLucideIcon("info", __iconNode$1h);
|
|
79545
79573
|
|
|
79546
79574
|
/**
|
|
79547
79575
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79551,12 +79579,12 @@ const Info$3 = createLucideIcon("info", __iconNode$1g);
|
|
|
79551
79579
|
*/
|
|
79552
79580
|
|
|
79553
79581
|
|
|
79554
|
-
const __iconNode$
|
|
79582
|
+
const __iconNode$1g = [
|
|
79555
79583
|
["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
|
|
79556
79584
|
["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
|
|
79557
79585
|
["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
|
|
79558
79586
|
];
|
|
79559
|
-
const Italic$1 = createLucideIcon("italic", __iconNode$
|
|
79587
|
+
const Italic$1 = createLucideIcon("italic", __iconNode$1g);
|
|
79560
79588
|
|
|
79561
79589
|
/**
|
|
79562
79590
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79566,7 +79594,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$1f);
|
|
|
79566
79594
|
*/
|
|
79567
79595
|
|
|
79568
79596
|
|
|
79569
|
-
const __iconNode$
|
|
79597
|
+
const __iconNode$1f = [
|
|
79570
79598
|
[
|
|
79571
79599
|
"path",
|
|
79572
79600
|
{
|
|
@@ -79576,7 +79604,7 @@ const __iconNode$1e = [
|
|
|
79576
79604
|
],
|
|
79577
79605
|
["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
|
|
79578
79606
|
];
|
|
79579
|
-
const KeyRound = createLucideIcon("key-round", __iconNode$
|
|
79607
|
+
const KeyRound = createLucideIcon("key-round", __iconNode$1f);
|
|
79580
79608
|
|
|
79581
79609
|
/**
|
|
79582
79610
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79586,7 +79614,7 @@ const KeyRound = createLucideIcon("key-round", __iconNode$1e);
|
|
|
79586
79614
|
*/
|
|
79587
79615
|
|
|
79588
79616
|
|
|
79589
|
-
const __iconNode$
|
|
79617
|
+
const __iconNode$1e = [
|
|
79590
79618
|
["path", { d: "M10 18v-7", key: "wt116b" }],
|
|
79591
79619
|
[
|
|
79592
79620
|
"path",
|
|
@@ -79600,7 +79628,7 @@ const __iconNode$1d = [
|
|
|
79600
79628
|
["path", { d: "M3 22h18", key: "8prr45" }],
|
|
79601
79629
|
["path", { d: "M6 18v-7", key: "1ivflk" }]
|
|
79602
79630
|
];
|
|
79603
|
-
const Landmark = createLucideIcon("landmark", __iconNode$
|
|
79631
|
+
const Landmark = createLucideIcon("landmark", __iconNode$1e);
|
|
79604
79632
|
|
|
79605
79633
|
/**
|
|
79606
79634
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79610,7 +79638,7 @@ const Landmark = createLucideIcon("landmark", __iconNode$1d);
|
|
|
79610
79638
|
*/
|
|
79611
79639
|
|
|
79612
79640
|
|
|
79613
|
-
const __iconNode$
|
|
79641
|
+
const __iconNode$1d = [
|
|
79614
79642
|
[
|
|
79615
79643
|
"path",
|
|
79616
79644
|
{
|
|
@@ -79633,7 +79661,7 @@ const __iconNode$1c = [
|
|
|
79633
79661
|
}
|
|
79634
79662
|
]
|
|
79635
79663
|
];
|
|
79636
|
-
const Layers = createLucideIcon("layers", __iconNode$
|
|
79664
|
+
const Layers = createLucideIcon("layers", __iconNode$1d);
|
|
79637
79665
|
|
|
79638
79666
|
/**
|
|
79639
79667
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79643,12 +79671,12 @@ const Layers = createLucideIcon("layers", __iconNode$1c);
|
|
|
79643
79671
|
*/
|
|
79644
79672
|
|
|
79645
79673
|
|
|
79646
|
-
const __iconNode$
|
|
79674
|
+
const __iconNode$1c = [
|
|
79647
79675
|
["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
|
|
79648
79676
|
["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
|
|
79649
79677
|
["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
|
|
79650
79678
|
];
|
|
79651
|
-
const Link2 = createLucideIcon("link-2", __iconNode$
|
|
79679
|
+
const Link2 = createLucideIcon("link-2", __iconNode$1c);
|
|
79652
79680
|
|
|
79653
79681
|
/**
|
|
79654
79682
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79658,11 +79686,11 @@ const Link2 = createLucideIcon("link-2", __iconNode$1b);
|
|
|
79658
79686
|
*/
|
|
79659
79687
|
|
|
79660
79688
|
|
|
79661
|
-
const __iconNode$
|
|
79689
|
+
const __iconNode$1b = [
|
|
79662
79690
|
["path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71", key: "1cjeqo" }],
|
|
79663
79691
|
["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
|
|
79664
79692
|
];
|
|
79665
|
-
const Link$1 = createLucideIcon("link", __iconNode$
|
|
79693
|
+
const Link$1 = createLucideIcon("link", __iconNode$1b);
|
|
79666
79694
|
|
|
79667
79695
|
/**
|
|
79668
79696
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79672,7 +79700,7 @@ const Link$1 = createLucideIcon("link", __iconNode$1a);
|
|
|
79672
79700
|
*/
|
|
79673
79701
|
|
|
79674
79702
|
|
|
79675
|
-
const __iconNode$
|
|
79703
|
+
const __iconNode$1a = [
|
|
79676
79704
|
["path", { d: "M10 12h11", key: "6m4ad9" }],
|
|
79677
79705
|
["path", { d: "M10 18h11", key: "11hvi2" }],
|
|
79678
79706
|
["path", { d: "M10 6h11", key: "c7qv1k" }],
|
|
@@ -79680,7 +79708,7 @@ const __iconNode$19 = [
|
|
|
79680
79708
|
["path", { d: "M4 6h1v4", key: "cnovpq" }],
|
|
79681
79709
|
["path", { d: "M6 18H4c0-1 2-2 2-3s-1-1.5-2-1", key: "m9a95d" }]
|
|
79682
79710
|
];
|
|
79683
|
-
const ListOrdered = createLucideIcon("list-ordered", __iconNode$
|
|
79711
|
+
const ListOrdered = createLucideIcon("list-ordered", __iconNode$1a);
|
|
79684
79712
|
|
|
79685
79713
|
/**
|
|
79686
79714
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79690,7 +79718,7 @@ const ListOrdered = createLucideIcon("list-ordered", __iconNode$19);
|
|
|
79690
79718
|
*/
|
|
79691
79719
|
|
|
79692
79720
|
|
|
79693
|
-
const __iconNode$
|
|
79721
|
+
const __iconNode$19 = [
|
|
79694
79722
|
["path", { d: "M3 12h.01", key: "nlz23k" }],
|
|
79695
79723
|
["path", { d: "M3 18h.01", key: "1tta3j" }],
|
|
79696
79724
|
["path", { d: "M3 6h.01", key: "1rqtza" }],
|
|
@@ -79698,7 +79726,7 @@ const __iconNode$18 = [
|
|
|
79698
79726
|
["path", { d: "M8 18h13", key: "1lx6n3" }],
|
|
79699
79727
|
["path", { d: "M8 6h13", key: "ik3vkj" }]
|
|
79700
79728
|
];
|
|
79701
|
-
const List$1 = createLucideIcon("list", __iconNode$
|
|
79729
|
+
const List$1 = createLucideIcon("list", __iconNode$19);
|
|
79702
79730
|
|
|
79703
79731
|
/**
|
|
79704
79732
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79708,8 +79736,8 @@ const List$1 = createLucideIcon("list", __iconNode$18);
|
|
|
79708
79736
|
*/
|
|
79709
79737
|
|
|
79710
79738
|
|
|
79711
|
-
const __iconNode$
|
|
79712
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
79739
|
+
const __iconNode$18 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
|
|
79740
|
+
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$18);
|
|
79713
79741
|
|
|
79714
79742
|
/**
|
|
79715
79743
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79719,11 +79747,11 @@ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$17);
|
|
|
79719
79747
|
*/
|
|
79720
79748
|
|
|
79721
79749
|
|
|
79722
|
-
const __iconNode$
|
|
79750
|
+
const __iconNode$17 = [
|
|
79723
79751
|
["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
|
|
79724
79752
|
["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
|
|
79725
79753
|
];
|
|
79726
|
-
const Lock = createLucideIcon("lock", __iconNode$
|
|
79754
|
+
const Lock = createLucideIcon("lock", __iconNode$17);
|
|
79727
79755
|
|
|
79728
79756
|
/**
|
|
79729
79757
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79733,11 +79761,11 @@ const Lock = createLucideIcon("lock", __iconNode$16);
|
|
|
79733
79761
|
*/
|
|
79734
79762
|
|
|
79735
79763
|
|
|
79736
|
-
const __iconNode$
|
|
79764
|
+
const __iconNode$16 = [
|
|
79737
79765
|
["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
|
|
79738
79766
|
["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
|
|
79739
79767
|
];
|
|
79740
|
-
const Mail = createLucideIcon("mail", __iconNode$
|
|
79768
|
+
const Mail = createLucideIcon("mail", __iconNode$16);
|
|
79741
79769
|
|
|
79742
79770
|
/**
|
|
79743
79771
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79747,10 +79775,10 @@ const Mail = createLucideIcon("mail", __iconNode$15);
|
|
|
79747
79775
|
*/
|
|
79748
79776
|
|
|
79749
79777
|
|
|
79750
|
-
const __iconNode$
|
|
79778
|
+
const __iconNode$15 = [
|
|
79751
79779
|
["path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z", key: "1lielz" }]
|
|
79752
79780
|
];
|
|
79753
|
-
const MessageSquare = createLucideIcon("message-square", __iconNode$
|
|
79781
|
+
const MessageSquare = createLucideIcon("message-square", __iconNode$15);
|
|
79754
79782
|
|
|
79755
79783
|
/**
|
|
79756
79784
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79760,12 +79788,12 @@ const MessageSquare = createLucideIcon("message-square", __iconNode$14);
|
|
|
79760
79788
|
*/
|
|
79761
79789
|
|
|
79762
79790
|
|
|
79763
|
-
const __iconNode$
|
|
79791
|
+
const __iconNode$14 = [
|
|
79764
79792
|
["path", { d: "M12 19v3", key: "npa21l" }],
|
|
79765
79793
|
["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
|
|
79766
79794
|
["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
|
|
79767
79795
|
];
|
|
79768
|
-
const Mic = createLucideIcon("mic", __iconNode$
|
|
79796
|
+
const Mic = createLucideIcon("mic", __iconNode$14);
|
|
79769
79797
|
|
|
79770
79798
|
/**
|
|
79771
79799
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79775,12 +79803,12 @@ const Mic = createLucideIcon("mic", __iconNode$13);
|
|
|
79775
79803
|
*/
|
|
79776
79804
|
|
|
79777
79805
|
|
|
79778
|
-
const __iconNode$
|
|
79806
|
+
const __iconNode$13 = [
|
|
79779
79807
|
["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
|
|
79780
79808
|
["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
|
|
79781
79809
|
["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
|
|
79782
79810
|
];
|
|
79783
|
-
const Monitor = createLucideIcon("monitor", __iconNode$
|
|
79811
|
+
const Monitor = createLucideIcon("monitor", __iconNode$13);
|
|
79784
79812
|
|
|
79785
79813
|
/**
|
|
79786
79814
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79790,7 +79818,7 @@ const Monitor = createLucideIcon("monitor", __iconNode$12);
|
|
|
79790
79818
|
*/
|
|
79791
79819
|
|
|
79792
79820
|
|
|
79793
|
-
const __iconNode$
|
|
79821
|
+
const __iconNode$12 = [
|
|
79794
79822
|
[
|
|
79795
79823
|
"path",
|
|
79796
79824
|
{
|
|
@@ -79799,7 +79827,7 @@ const __iconNode$11 = [
|
|
|
79799
79827
|
}
|
|
79800
79828
|
]
|
|
79801
79829
|
];
|
|
79802
|
-
const Paperclip = createLucideIcon("paperclip", __iconNode$
|
|
79830
|
+
const Paperclip = createLucideIcon("paperclip", __iconNode$12);
|
|
79803
79831
|
|
|
79804
79832
|
/**
|
|
79805
79833
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79809,7 +79837,7 @@ const Paperclip = createLucideIcon("paperclip", __iconNode$11);
|
|
|
79809
79837
|
*/
|
|
79810
79838
|
|
|
79811
79839
|
|
|
79812
|
-
const __iconNode$
|
|
79840
|
+
const __iconNode$11 = [
|
|
79813
79841
|
["path", { d: "M13 21h8", key: "1jsn5i" }],
|
|
79814
79842
|
[
|
|
79815
79843
|
"path",
|
|
@@ -79819,7 +79847,7 @@ const __iconNode$10 = [
|
|
|
79819
79847
|
}
|
|
79820
79848
|
]
|
|
79821
79849
|
];
|
|
79822
|
-
const PenLine = createLucideIcon("pen-line", __iconNode$
|
|
79850
|
+
const PenLine = createLucideIcon("pen-line", __iconNode$11);
|
|
79823
79851
|
|
|
79824
79852
|
/**
|
|
79825
79853
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79829,7 +79857,7 @@ const PenLine = createLucideIcon("pen-line", __iconNode$10);
|
|
|
79829
79857
|
*/
|
|
79830
79858
|
|
|
79831
79859
|
|
|
79832
|
-
const __iconNode
|
|
79860
|
+
const __iconNode$10 = [
|
|
79833
79861
|
[
|
|
79834
79862
|
"path",
|
|
79835
79863
|
{
|
|
@@ -79838,7 +79866,7 @@ const __iconNode$$ = [
|
|
|
79838
79866
|
}
|
|
79839
79867
|
]
|
|
79840
79868
|
];
|
|
79841
|
-
const Pen = createLucideIcon("pen", __iconNode
|
|
79869
|
+
const Pen = createLucideIcon("pen", __iconNode$10);
|
|
79842
79870
|
|
|
79843
79871
|
/**
|
|
79844
79872
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79848,7 +79876,7 @@ const Pen = createLucideIcon("pen", __iconNode$$);
|
|
|
79848
79876
|
*/
|
|
79849
79877
|
|
|
79850
79878
|
|
|
79851
|
-
const __iconNode
|
|
79879
|
+
const __iconNode$$ = [
|
|
79852
79880
|
[
|
|
79853
79881
|
"path",
|
|
79854
79882
|
{
|
|
@@ -79858,7 +79886,7 @@ const __iconNode$_ = [
|
|
|
79858
79886
|
],
|
|
79859
79887
|
["path", { d: "m15 5 4 4", key: "1mk7zo" }]
|
|
79860
79888
|
];
|
|
79861
|
-
const Pencil = createLucideIcon("pencil", __iconNode
|
|
79889
|
+
const Pencil = createLucideIcon("pencil", __iconNode$$);
|
|
79862
79890
|
|
|
79863
79891
|
/**
|
|
79864
79892
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79868,7 +79896,7 @@ const Pencil = createLucideIcon("pencil", __iconNode$_);
|
|
|
79868
79896
|
*/
|
|
79869
79897
|
|
|
79870
79898
|
|
|
79871
|
-
const __iconNode$
|
|
79899
|
+
const __iconNode$_ = [
|
|
79872
79900
|
[
|
|
79873
79901
|
"path",
|
|
79874
79902
|
{
|
|
@@ -79877,7 +79905,7 @@ const __iconNode$Z = [
|
|
|
79877
79905
|
}
|
|
79878
79906
|
]
|
|
79879
79907
|
];
|
|
79880
|
-
const Play = createLucideIcon("play", __iconNode$
|
|
79908
|
+
const Play = createLucideIcon("play", __iconNode$_);
|
|
79881
79909
|
|
|
79882
79910
|
/**
|
|
79883
79911
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79887,11 +79915,11 @@ const Play = createLucideIcon("play", __iconNode$Z);
|
|
|
79887
79915
|
*/
|
|
79888
79916
|
|
|
79889
79917
|
|
|
79890
|
-
const __iconNode$
|
|
79918
|
+
const __iconNode$Z = [
|
|
79891
79919
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
79892
79920
|
["path", { d: "M12 5v14", key: "s699le" }]
|
|
79893
79921
|
];
|
|
79894
|
-
const Plus = createLucideIcon("plus", __iconNode$
|
|
79922
|
+
const Plus = createLucideIcon("plus", __iconNode$Z);
|
|
79895
79923
|
|
|
79896
79924
|
/**
|
|
79897
79925
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79901,12 +79929,12 @@ const Plus = createLucideIcon("plus", __iconNode$Y);
|
|
|
79901
79929
|
*/
|
|
79902
79930
|
|
|
79903
79931
|
|
|
79904
|
-
const __iconNode$
|
|
79932
|
+
const __iconNode$Y = [
|
|
79905
79933
|
["path", { d: "M2 3h20", key: "91anmk" }],
|
|
79906
79934
|
["path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3", key: "2k9sn8" }],
|
|
79907
79935
|
["path", { d: "m7 21 5-5 5 5", key: "bip4we" }]
|
|
79908
79936
|
];
|
|
79909
|
-
const Presentation = createLucideIcon("presentation", __iconNode$
|
|
79937
|
+
const Presentation = createLucideIcon("presentation", __iconNode$Y);
|
|
79910
79938
|
|
|
79911
79939
|
/**
|
|
79912
79940
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79916,7 +79944,7 @@ const Presentation = createLucideIcon("presentation", __iconNode$X);
|
|
|
79916
79944
|
*/
|
|
79917
79945
|
|
|
79918
79946
|
|
|
79919
|
-
const __iconNode$
|
|
79947
|
+
const __iconNode$X = [
|
|
79920
79948
|
[
|
|
79921
79949
|
"path",
|
|
79922
79950
|
{
|
|
@@ -79925,7 +79953,7 @@ const __iconNode$W = [
|
|
|
79925
79953
|
}
|
|
79926
79954
|
]
|
|
79927
79955
|
];
|
|
79928
|
-
const Puzzle = createLucideIcon("puzzle", __iconNode$
|
|
79956
|
+
const Puzzle = createLucideIcon("puzzle", __iconNode$X);
|
|
79929
79957
|
|
|
79930
79958
|
/**
|
|
79931
79959
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79935,7 +79963,7 @@ const Puzzle = createLucideIcon("puzzle", __iconNode$W);
|
|
|
79935
79963
|
*/
|
|
79936
79964
|
|
|
79937
79965
|
|
|
79938
|
-
const __iconNode$
|
|
79966
|
+
const __iconNode$W = [
|
|
79939
79967
|
[
|
|
79940
79968
|
"path",
|
|
79941
79969
|
{
|
|
@@ -79951,7 +79979,7 @@ const __iconNode$V = [
|
|
|
79951
79979
|
}
|
|
79952
79980
|
]
|
|
79953
79981
|
];
|
|
79954
|
-
const Quote = createLucideIcon("quote", __iconNode$
|
|
79982
|
+
const Quote = createLucideIcon("quote", __iconNode$W);
|
|
79955
79983
|
|
|
79956
79984
|
/**
|
|
79957
79985
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79961,14 +79989,14 @@ const Quote = createLucideIcon("quote", __iconNode$V);
|
|
|
79961
79989
|
*/
|
|
79962
79990
|
|
|
79963
79991
|
|
|
79964
|
-
const __iconNode$
|
|
79992
|
+
const __iconNode$V = [
|
|
79965
79993
|
["path", { d: "M16.247 7.761a6 6 0 0 1 0 8.478", key: "1fwjs5" }],
|
|
79966
79994
|
["path", { d: "M19.075 4.933a10 10 0 0 1 0 14.134", key: "ehdyv1" }],
|
|
79967
79995
|
["path", { d: "M4.925 19.067a10 10 0 0 1 0-14.134", key: "1q22gi" }],
|
|
79968
79996
|
["path", { d: "M7.753 16.239a6 6 0 0 1 0-8.478", key: "r2q7qm" }],
|
|
79969
79997
|
["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }]
|
|
79970
79998
|
];
|
|
79971
|
-
const Radio$1 = createLucideIcon("radio", __iconNode$
|
|
79999
|
+
const Radio$1 = createLucideIcon("radio", __iconNode$V);
|
|
79972
80000
|
|
|
79973
80001
|
/**
|
|
79974
80002
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79978,13 +80006,13 @@ const Radio$1 = createLucideIcon("radio", __iconNode$U);
|
|
|
79978
80006
|
*/
|
|
79979
80007
|
|
|
79980
80008
|
|
|
79981
|
-
const __iconNode$
|
|
80009
|
+
const __iconNode$U = [
|
|
79982
80010
|
["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
|
|
79983
80011
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }],
|
|
79984
80012
|
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
79985
80013
|
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
79986
80014
|
];
|
|
79987
|
-
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$
|
|
80015
|
+
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$U);
|
|
79988
80016
|
|
|
79989
80017
|
/**
|
|
79990
80018
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -79994,13 +80022,13 @@ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$T);
|
|
|
79994
80022
|
*/
|
|
79995
80023
|
|
|
79996
80024
|
|
|
79997
|
-
const __iconNode$
|
|
80025
|
+
const __iconNode$T = [
|
|
79998
80026
|
["path", { d: "m17 2 4 4-4 4", key: "nntrym" }],
|
|
79999
80027
|
["path", { d: "M3 11v-1a4 4 0 0 1 4-4h14", key: "84bu3i" }],
|
|
80000
80028
|
["path", { d: "m7 22-4-4 4-4", key: "1wqhfi" }],
|
|
80001
80029
|
["path", { d: "M21 13v1a4 4 0 0 1-4 4H3", key: "1rx37r" }]
|
|
80002
80030
|
];
|
|
80003
|
-
const Repeat = createLucideIcon("repeat", __iconNode$
|
|
80031
|
+
const Repeat = createLucideIcon("repeat", __iconNode$T);
|
|
80004
80032
|
|
|
80005
80033
|
/**
|
|
80006
80034
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80010,11 +80038,11 @@ const Repeat = createLucideIcon("repeat", __iconNode$S);
|
|
|
80010
80038
|
*/
|
|
80011
80039
|
|
|
80012
80040
|
|
|
80013
|
-
const __iconNode$
|
|
80041
|
+
const __iconNode$S = [
|
|
80014
80042
|
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
|
|
80015
80043
|
["path", { d: "M3 3v5h5", key: "1xhq8a" }]
|
|
80016
80044
|
];
|
|
80017
|
-
const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$
|
|
80045
|
+
const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$S);
|
|
80018
80046
|
|
|
80019
80047
|
/**
|
|
80020
80048
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80024,11 +80052,11 @@ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$R);
|
|
|
80024
80052
|
*/
|
|
80025
80053
|
|
|
80026
80054
|
|
|
80027
|
-
const __iconNode$
|
|
80055
|
+
const __iconNode$R = [
|
|
80028
80056
|
["path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8", key: "1p45f6" }],
|
|
80029
80057
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }]
|
|
80030
80058
|
];
|
|
80031
|
-
const RotateCw = createLucideIcon("rotate-cw", __iconNode$
|
|
80059
|
+
const RotateCw = createLucideIcon("rotate-cw", __iconNode$R);
|
|
80032
80060
|
|
|
80033
80061
|
/**
|
|
80034
80062
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80038,12 +80066,12 @@ const RotateCw = createLucideIcon("rotate-cw", __iconNode$Q);
|
|
|
80038
80066
|
*/
|
|
80039
80067
|
|
|
80040
80068
|
|
|
80041
|
-
const __iconNode$
|
|
80069
|
+
const __iconNode$Q = [
|
|
80042
80070
|
["circle", { cx: "6", cy: "19", r: "3", key: "1kj8tv" }],
|
|
80043
80071
|
["path", { d: "M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15", key: "1d8sl" }],
|
|
80044
80072
|
["circle", { cx: "18", cy: "5", r: "3", key: "gq8acd" }]
|
|
80045
80073
|
];
|
|
80046
|
-
const Route = createLucideIcon("route", __iconNode$
|
|
80074
|
+
const Route = createLucideIcon("route", __iconNode$Q);
|
|
80047
80075
|
|
|
80048
80076
|
/**
|
|
80049
80077
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80053,7 +80081,7 @@ const Route = createLucideIcon("route", __iconNode$P);
|
|
|
80053
80081
|
*/
|
|
80054
80082
|
|
|
80055
80083
|
|
|
80056
|
-
const __iconNode$
|
|
80084
|
+
const __iconNode$P = [
|
|
80057
80085
|
[
|
|
80058
80086
|
"path",
|
|
80059
80087
|
{
|
|
@@ -80064,7 +80092,7 @@ const __iconNode$O = [
|
|
|
80064
80092
|
["path", { d: "M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7", key: "1ydtos" }],
|
|
80065
80093
|
["path", { d: "M7 3v4a1 1 0 0 0 1 1h7", key: "t51u73" }]
|
|
80066
80094
|
];
|
|
80067
|
-
const Save = createLucideIcon("save", __iconNode$
|
|
80095
|
+
const Save = createLucideIcon("save", __iconNode$P);
|
|
80068
80096
|
|
|
80069
80097
|
/**
|
|
80070
80098
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80074,7 +80102,7 @@ const Save = createLucideIcon("save", __iconNode$O);
|
|
|
80074
80102
|
*/
|
|
80075
80103
|
|
|
80076
80104
|
|
|
80077
|
-
const __iconNode$
|
|
80105
|
+
const __iconNode$O = [
|
|
80078
80106
|
["path", { d: "M14 22v-4a2 2 0 1 0-4 0v4", key: "hhkicm" }],
|
|
80079
80107
|
[
|
|
80080
80108
|
"path",
|
|
@@ -80088,7 +80116,7 @@ const __iconNode$N = [
|
|
|
80088
80116
|
["path", { d: "M6 5v17", key: "1xfsm0" }],
|
|
80089
80117
|
["circle", { cx: "12", cy: "9", r: "2", key: "1092wv" }]
|
|
80090
80118
|
];
|
|
80091
|
-
const School = createLucideIcon("school", __iconNode$
|
|
80119
|
+
const School = createLucideIcon("school", __iconNode$O);
|
|
80092
80120
|
|
|
80093
80121
|
/**
|
|
80094
80122
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80098,14 +80126,14 @@ const School = createLucideIcon("school", __iconNode$N);
|
|
|
80098
80126
|
*/
|
|
80099
80127
|
|
|
80100
80128
|
|
|
80101
|
-
const __iconNode$
|
|
80129
|
+
const __iconNode$N = [
|
|
80102
80130
|
["path", { d: "M13 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-3", key: "i8wdob" }],
|
|
80103
80131
|
["path", { d: "M8 21h8", key: "1ev6f3" }],
|
|
80104
80132
|
["path", { d: "M12 17v4", key: "1riwvh" }],
|
|
80105
80133
|
["path", { d: "m17 8 5-5", key: "fqif7o" }],
|
|
80106
80134
|
["path", { d: "M17 3h5v5", key: "1o3tu8" }]
|
|
80107
80135
|
];
|
|
80108
|
-
const ScreenShare = createLucideIcon("screen-share", __iconNode$
|
|
80136
|
+
const ScreenShare = createLucideIcon("screen-share", __iconNode$N);
|
|
80109
80137
|
|
|
80110
80138
|
/**
|
|
80111
80139
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80115,7 +80143,7 @@ const ScreenShare = createLucideIcon("screen-share", __iconNode$M);
|
|
|
80115
80143
|
*/
|
|
80116
80144
|
|
|
80117
80145
|
|
|
80118
|
-
const __iconNode$
|
|
80146
|
+
const __iconNode$M = [
|
|
80119
80147
|
["path", { d: "M15 12h-5", key: "r7krc0" }],
|
|
80120
80148
|
["path", { d: "M15 8h-5", key: "1khuty" }],
|
|
80121
80149
|
["path", { d: "M19 17V5a2 2 0 0 0-2-2H4", key: "zz82l3" }],
|
|
@@ -80127,7 +80155,7 @@ const __iconNode$L = [
|
|
|
80127
80155
|
}
|
|
80128
80156
|
]
|
|
80129
80157
|
];
|
|
80130
|
-
const ScrollText = createLucideIcon("scroll-text", __iconNode$
|
|
80158
|
+
const ScrollText = createLucideIcon("scroll-text", __iconNode$M);
|
|
80131
80159
|
|
|
80132
80160
|
/**
|
|
80133
80161
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80137,11 +80165,11 @@ const ScrollText = createLucideIcon("scroll-text", __iconNode$L);
|
|
|
80137
80165
|
*/
|
|
80138
80166
|
|
|
80139
80167
|
|
|
80140
|
-
const __iconNode$
|
|
80168
|
+
const __iconNode$L = [
|
|
80141
80169
|
["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
|
|
80142
80170
|
["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
|
|
80143
80171
|
];
|
|
80144
|
-
const Search = createLucideIcon("search", __iconNode$
|
|
80172
|
+
const Search = createLucideIcon("search", __iconNode$L);
|
|
80145
80173
|
|
|
80146
80174
|
/**
|
|
80147
80175
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80151,7 +80179,7 @@ const Search = createLucideIcon("search", __iconNode$K);
|
|
|
80151
80179
|
*/
|
|
80152
80180
|
|
|
80153
80181
|
|
|
80154
|
-
const __iconNode$
|
|
80182
|
+
const __iconNode$K = [
|
|
80155
80183
|
[
|
|
80156
80184
|
"path",
|
|
80157
80185
|
{
|
|
@@ -80161,7 +80189,7 @@ const __iconNode$J = [
|
|
|
80161
80189
|
],
|
|
80162
80190
|
["path", { d: "m21.854 2.147-10.94 10.939", key: "12cjpa" }]
|
|
80163
80191
|
];
|
|
80164
|
-
const Send = createLucideIcon("send", __iconNode$
|
|
80192
|
+
const Send = createLucideIcon("send", __iconNode$K);
|
|
80165
80193
|
|
|
80166
80194
|
/**
|
|
80167
80195
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80171,13 +80199,13 @@ const Send = createLucideIcon("send", __iconNode$J);
|
|
|
80171
80199
|
*/
|
|
80172
80200
|
|
|
80173
80201
|
|
|
80174
|
-
const __iconNode$
|
|
80202
|
+
const __iconNode$J = [
|
|
80175
80203
|
["rect", { width: "20", height: "8", x: "2", y: "2", rx: "2", ry: "2", key: "ngkwjq" }],
|
|
80176
80204
|
["rect", { width: "20", height: "8", x: "2", y: "14", rx: "2", ry: "2", key: "iecqi9" }],
|
|
80177
80205
|
["line", { x1: "6", x2: "6.01", y1: "6", y2: "6", key: "16zg32" }],
|
|
80178
80206
|
["line", { x1: "6", x2: "6.01", y1: "18", y2: "18", key: "nzw8ys" }]
|
|
80179
80207
|
];
|
|
80180
|
-
const Server = createLucideIcon("server", __iconNode$
|
|
80208
|
+
const Server = createLucideIcon("server", __iconNode$J);
|
|
80181
80209
|
|
|
80182
80210
|
/**
|
|
80183
80211
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80187,13 +80215,13 @@ const Server = createLucideIcon("server", __iconNode$I);
|
|
|
80187
80215
|
*/
|
|
80188
80216
|
|
|
80189
80217
|
|
|
80190
|
-
const __iconNode$
|
|
80218
|
+
const __iconNode$I = [
|
|
80191
80219
|
["path", { d: "M14 17H5", key: "gfn3mx" }],
|
|
80192
80220
|
["path", { d: "M19 7h-9", key: "6i9tg" }],
|
|
80193
80221
|
["circle", { cx: "17", cy: "17", r: "3", key: "18b49y" }],
|
|
80194
80222
|
["circle", { cx: "7", cy: "7", r: "3", key: "dfmy0x" }]
|
|
80195
80223
|
];
|
|
80196
|
-
const Settings2 = createLucideIcon("settings-2", __iconNode$
|
|
80224
|
+
const Settings2 = createLucideIcon("settings-2", __iconNode$I);
|
|
80197
80225
|
|
|
80198
80226
|
/**
|
|
80199
80227
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80203,7 +80231,7 @@ const Settings2 = createLucideIcon("settings-2", __iconNode$H);
|
|
|
80203
80231
|
*/
|
|
80204
80232
|
|
|
80205
80233
|
|
|
80206
|
-
const __iconNode$
|
|
80234
|
+
const __iconNode$H = [
|
|
80207
80235
|
[
|
|
80208
80236
|
"path",
|
|
80209
80237
|
{
|
|
@@ -80213,7 +80241,7 @@ const __iconNode$G = [
|
|
|
80213
80241
|
],
|
|
80214
80242
|
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
80215
80243
|
];
|
|
80216
|
-
const Settings = createLucideIcon("settings", __iconNode$
|
|
80244
|
+
const Settings = createLucideIcon("settings", __iconNode$H);
|
|
80217
80245
|
|
|
80218
80246
|
/**
|
|
80219
80247
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80223,14 +80251,14 @@ const Settings = createLucideIcon("settings", __iconNode$G);
|
|
|
80223
80251
|
*/
|
|
80224
80252
|
|
|
80225
80253
|
|
|
80226
|
-
const __iconNode$
|
|
80254
|
+
const __iconNode$G = [
|
|
80227
80255
|
["circle", { cx: "18", cy: "5", r: "3", key: "gq8acd" }],
|
|
80228
80256
|
["circle", { cx: "6", cy: "12", r: "3", key: "w7nqdw" }],
|
|
80229
80257
|
["circle", { cx: "18", cy: "19", r: "3", key: "1xt0gg" }],
|
|
80230
80258
|
["line", { x1: "8.59", x2: "15.42", y1: "13.51", y2: "17.49", key: "47mynk" }],
|
|
80231
80259
|
["line", { x1: "15.41", x2: "8.59", y1: "6.51", y2: "10.49", key: "1n3mei" }]
|
|
80232
80260
|
];
|
|
80233
|
-
const Share2 = createLucideIcon("share-2", __iconNode$
|
|
80261
|
+
const Share2 = createLucideIcon("share-2", __iconNode$G);
|
|
80234
80262
|
|
|
80235
80263
|
/**
|
|
80236
80264
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80240,7 +80268,7 @@ const Share2 = createLucideIcon("share-2", __iconNode$F);
|
|
|
80240
80268
|
*/
|
|
80241
80269
|
|
|
80242
80270
|
|
|
80243
|
-
const __iconNode$
|
|
80271
|
+
const __iconNode$F = [
|
|
80244
80272
|
[
|
|
80245
80273
|
"path",
|
|
80246
80274
|
{
|
|
@@ -80251,7 +80279,7 @@ const __iconNode$E = [
|
|
|
80251
80279
|
["path", { d: "M12 8v4", key: "1got3b" }],
|
|
80252
80280
|
["path", { d: "M12 16h.01", key: "1drbdi" }]
|
|
80253
80281
|
];
|
|
80254
|
-
const ShieldAlert = createLucideIcon("shield-alert", __iconNode$
|
|
80282
|
+
const ShieldAlert = createLucideIcon("shield-alert", __iconNode$F);
|
|
80255
80283
|
|
|
80256
80284
|
/**
|
|
80257
80285
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80261,7 +80289,7 @@ const ShieldAlert = createLucideIcon("shield-alert", __iconNode$E);
|
|
|
80261
80289
|
*/
|
|
80262
80290
|
|
|
80263
80291
|
|
|
80264
|
-
const __iconNode$
|
|
80292
|
+
const __iconNode$E = [
|
|
80265
80293
|
[
|
|
80266
80294
|
"path",
|
|
80267
80295
|
{
|
|
@@ -80271,7 +80299,7 @@ const __iconNode$D = [
|
|
|
80271
80299
|
],
|
|
80272
80300
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
80273
80301
|
];
|
|
80274
|
-
const ShieldCheck = createLucideIcon("shield-check", __iconNode$
|
|
80302
|
+
const ShieldCheck = createLucideIcon("shield-check", __iconNode$E);
|
|
80275
80303
|
|
|
80276
80304
|
/**
|
|
80277
80305
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80281,7 +80309,7 @@ const ShieldCheck = createLucideIcon("shield-check", __iconNode$D);
|
|
|
80281
80309
|
*/
|
|
80282
80310
|
|
|
80283
80311
|
|
|
80284
|
-
const __iconNode$
|
|
80312
|
+
const __iconNode$D = [
|
|
80285
80313
|
[
|
|
80286
80314
|
"path",
|
|
80287
80315
|
{
|
|
@@ -80290,7 +80318,7 @@ const __iconNode$C = [
|
|
|
80290
80318
|
}
|
|
80291
80319
|
]
|
|
80292
80320
|
];
|
|
80293
|
-
const Shield = createLucideIcon("shield", __iconNode$
|
|
80321
|
+
const Shield = createLucideIcon("shield", __iconNode$D);
|
|
80294
80322
|
|
|
80295
80323
|
/**
|
|
80296
80324
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80300,7 +80328,7 @@ const Shield = createLucideIcon("shield", __iconNode$C);
|
|
|
80300
80328
|
*/
|
|
80301
80329
|
|
|
80302
80330
|
|
|
80303
|
-
const __iconNode$
|
|
80331
|
+
const __iconNode$C = [
|
|
80304
80332
|
["path", { d: "M16 10a4 4 0 0 1-8 0", key: "1ltviw" }],
|
|
80305
80333
|
["path", { d: "M3.103 6.034h17.794", key: "awc11p" }],
|
|
80306
80334
|
[
|
|
@@ -80311,7 +80339,7 @@ const __iconNode$B = [
|
|
|
80311
80339
|
}
|
|
80312
80340
|
]
|
|
80313
80341
|
];
|
|
80314
|
-
const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$
|
|
80342
|
+
const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$C);
|
|
80315
80343
|
|
|
80316
80344
|
/**
|
|
80317
80345
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80321,14 +80349,14 @@ const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$B);
|
|
|
80321
80349
|
*/
|
|
80322
80350
|
|
|
80323
80351
|
|
|
80324
|
-
const __iconNode$
|
|
80352
|
+
const __iconNode$B = [
|
|
80325
80353
|
["path", { d: "m18 14 4 4-4 4", key: "10pe0f" }],
|
|
80326
80354
|
["path", { d: "m18 2 4 4-4 4", key: "pucp1d" }],
|
|
80327
80355
|
["path", { d: "M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22", key: "1ailkh" }],
|
|
80328
80356
|
["path", { d: "M2 6h1.972a4 4 0 0 1 3.6 2.2", key: "km57vx" }],
|
|
80329
80357
|
["path", { d: "M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45", key: "os18l9" }]
|
|
80330
80358
|
];
|
|
80331
|
-
const Shuffle = createLucideIcon("shuffle", __iconNode$
|
|
80359
|
+
const Shuffle = createLucideIcon("shuffle", __iconNode$B);
|
|
80332
80360
|
|
|
80333
80361
|
/**
|
|
80334
80362
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80338,7 +80366,7 @@ const Shuffle = createLucideIcon("shuffle", __iconNode$A);
|
|
|
80338
80366
|
*/
|
|
80339
80367
|
|
|
80340
80368
|
|
|
80341
|
-
const __iconNode$
|
|
80369
|
+
const __iconNode$A = [
|
|
80342
80370
|
["line", { x1: "21", x2: "14", y1: "4", y2: "4", key: "obuewd" }],
|
|
80343
80371
|
["line", { x1: "10", x2: "3", y1: "4", y2: "4", key: "1q6298" }],
|
|
80344
80372
|
["line", { x1: "21", x2: "12", y1: "12", y2: "12", key: "1iu8h1" }],
|
|
@@ -80349,7 +80377,7 @@ const __iconNode$z = [
|
|
|
80349
80377
|
["line", { x1: "8", x2: "8", y1: "10", y2: "14", key: "1i6ji0" }],
|
|
80350
80378
|
["line", { x1: "16", x2: "16", y1: "18", y2: "22", key: "1lctlv" }]
|
|
80351
80379
|
];
|
|
80352
|
-
const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$
|
|
80380
|
+
const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$A);
|
|
80353
80381
|
|
|
80354
80382
|
/**
|
|
80355
80383
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80359,11 +80387,11 @@ const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$z);
|
|
|
80359
80387
|
*/
|
|
80360
80388
|
|
|
80361
80389
|
|
|
80362
|
-
const __iconNode$
|
|
80390
|
+
const __iconNode$z = [
|
|
80363
80391
|
["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
|
|
80364
80392
|
["path", { d: "M12 18h.01", key: "mhygvu" }]
|
|
80365
80393
|
];
|
|
80366
|
-
const Smartphone = createLucideIcon("smartphone", __iconNode$
|
|
80394
|
+
const Smartphone = createLucideIcon("smartphone", __iconNode$z);
|
|
80367
80395
|
|
|
80368
80396
|
/**
|
|
80369
80397
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80373,7 +80401,7 @@ const Smartphone = createLucideIcon("smartphone", __iconNode$y);
|
|
|
80373
80401
|
*/
|
|
80374
80402
|
|
|
80375
80403
|
|
|
80376
|
-
const __iconNode$
|
|
80404
|
+
const __iconNode$y = [
|
|
80377
80405
|
[
|
|
80378
80406
|
"path",
|
|
80379
80407
|
{
|
|
@@ -80385,7 +80413,7 @@ const __iconNode$x = [
|
|
|
80385
80413
|
["path", { d: "M22 4h-4", key: "gwowj6" }],
|
|
80386
80414
|
["circle", { cx: "4", cy: "20", r: "2", key: "6kqj1y" }]
|
|
80387
80415
|
];
|
|
80388
|
-
const Sparkles = createLucideIcon("sparkles", __iconNode$
|
|
80416
|
+
const Sparkles = createLucideIcon("sparkles", __iconNode$y);
|
|
80389
80417
|
|
|
80390
80418
|
/**
|
|
80391
80419
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80395,7 +80423,7 @@ const Sparkles = createLucideIcon("sparkles", __iconNode$x);
|
|
|
80395
80423
|
*/
|
|
80396
80424
|
|
|
80397
80425
|
|
|
80398
|
-
const __iconNode$
|
|
80426
|
+
const __iconNode$x = [
|
|
80399
80427
|
["path", { d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7", key: "1m0v6g" }],
|
|
80400
80428
|
[
|
|
80401
80429
|
"path",
|
|
@@ -80405,7 +80433,7 @@ const __iconNode$w = [
|
|
|
80405
80433
|
}
|
|
80406
80434
|
]
|
|
80407
80435
|
];
|
|
80408
|
-
const SquarePen = createLucideIcon("square-pen", __iconNode$
|
|
80436
|
+
const SquarePen = createLucideIcon("square-pen", __iconNode$x);
|
|
80409
80437
|
|
|
80410
80438
|
/**
|
|
80411
80439
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80415,10 +80443,10 @@ const SquarePen = createLucideIcon("square-pen", __iconNode$w);
|
|
|
80415
80443
|
*/
|
|
80416
80444
|
|
|
80417
80445
|
|
|
80418
|
-
const __iconNode$
|
|
80446
|
+
const __iconNode$w = [
|
|
80419
80447
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }]
|
|
80420
80448
|
];
|
|
80421
|
-
const Square$1 = createLucideIcon("square", __iconNode$
|
|
80449
|
+
const Square$1 = createLucideIcon("square", __iconNode$w);
|
|
80422
80450
|
|
|
80423
80451
|
/**
|
|
80424
80452
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80428,7 +80456,7 @@ const Square$1 = createLucideIcon("square", __iconNode$v);
|
|
|
80428
80456
|
*/
|
|
80429
80457
|
|
|
80430
80458
|
|
|
80431
|
-
const __iconNode$
|
|
80459
|
+
const __iconNode$v = [
|
|
80432
80460
|
[
|
|
80433
80461
|
"path",
|
|
80434
80462
|
{
|
|
@@ -80437,7 +80465,7 @@ const __iconNode$u = [
|
|
|
80437
80465
|
}
|
|
80438
80466
|
]
|
|
80439
80467
|
];
|
|
80440
|
-
const Star$1 = createLucideIcon("star", __iconNode$
|
|
80468
|
+
const Star$1 = createLucideIcon("star", __iconNode$v);
|
|
80441
80469
|
|
|
80442
80470
|
/**
|
|
80443
80471
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80447,14 +80475,14 @@ const Star$1 = createLucideIcon("star", __iconNode$u);
|
|
|
80447
80475
|
*/
|
|
80448
80476
|
|
|
80449
80477
|
|
|
80450
|
-
const __iconNode$
|
|
80478
|
+
const __iconNode$u = [
|
|
80451
80479
|
["path", { d: "M11 2v2", key: "1539x4" }],
|
|
80452
80480
|
["path", { d: "M5 2v2", key: "1yf1q8" }],
|
|
80453
80481
|
["path", { d: "M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1", key: "rb5t3r" }],
|
|
80454
80482
|
["path", { d: "M8 15a6 6 0 0 0 12 0v-3", key: "x18d4x" }],
|
|
80455
80483
|
["circle", { cx: "20", cy: "10", r: "2", key: "ts1r5v" }]
|
|
80456
80484
|
];
|
|
80457
|
-
const Stethoscope = createLucideIcon("stethoscope", __iconNode$
|
|
80485
|
+
const Stethoscope = createLucideIcon("stethoscope", __iconNode$u);
|
|
80458
80486
|
|
|
80459
80487
|
/**
|
|
80460
80488
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80464,11 +80492,11 @@ const Stethoscope = createLucideIcon("stethoscope", __iconNode$t);
|
|
|
80464
80492
|
*/
|
|
80465
80493
|
|
|
80466
80494
|
|
|
80467
|
-
const __iconNode$
|
|
80495
|
+
const __iconNode$t = [
|
|
80468
80496
|
["path", { d: "M16 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8Z", key: "qazsjp" }],
|
|
80469
80497
|
["path", { d: "M15 3v4a2 2 0 0 0 2 2h4", key: "40519r" }]
|
|
80470
80498
|
];
|
|
80471
|
-
const StickyNote = createLucideIcon("sticky-note", __iconNode$
|
|
80499
|
+
const StickyNote = createLucideIcon("sticky-note", __iconNode$t);
|
|
80472
80500
|
|
|
80473
80501
|
/**
|
|
80474
80502
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80478,7 +80506,7 @@ const StickyNote = createLucideIcon("sticky-note", __iconNode$s);
|
|
|
80478
80506
|
*/
|
|
80479
80507
|
|
|
80480
80508
|
|
|
80481
|
-
const __iconNode$
|
|
80509
|
+
const __iconNode$s = [
|
|
80482
80510
|
["path", { d: "m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7", key: "ztvudi" }],
|
|
80483
80511
|
["path", { d: "M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8", key: "1b2hhj" }],
|
|
80484
80512
|
["path", { d: "M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4", key: "2ebpfo" }],
|
|
@@ -80491,7 +80519,7 @@ const __iconNode$r = [
|
|
|
80491
80519
|
}
|
|
80492
80520
|
]
|
|
80493
80521
|
];
|
|
80494
|
-
const Store$1 = createLucideIcon("store", __iconNode$
|
|
80522
|
+
const Store$1 = createLucideIcon("store", __iconNode$s);
|
|
80495
80523
|
|
|
80496
80524
|
/**
|
|
80497
80525
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80501,7 +80529,7 @@ const Store$1 = createLucideIcon("store", __iconNode$r);
|
|
|
80501
80529
|
*/
|
|
80502
80530
|
|
|
80503
80531
|
|
|
80504
|
-
const __iconNode$
|
|
80532
|
+
const __iconNode$r = [
|
|
80505
80533
|
[
|
|
80506
80534
|
"path",
|
|
80507
80535
|
{
|
|
@@ -80511,7 +80539,7 @@ const __iconNode$q = [
|
|
|
80511
80539
|
],
|
|
80512
80540
|
["circle", { cx: "7.5", cy: "7.5", r: ".5", fill: "currentColor", key: "kqv944" }]
|
|
80513
80541
|
];
|
|
80514
|
-
const Tag = createLucideIcon("tag", __iconNode$
|
|
80542
|
+
const Tag = createLucideIcon("tag", __iconNode$r);
|
|
80515
80543
|
|
|
80516
80544
|
/**
|
|
80517
80545
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80521,7 +80549,7 @@ const Tag = createLucideIcon("tag", __iconNode$q);
|
|
|
80521
80549
|
*/
|
|
80522
80550
|
|
|
80523
80551
|
|
|
80524
|
-
const __iconNode$
|
|
80552
|
+
const __iconNode$q = [
|
|
80525
80553
|
["path", { d: "m15 5 6.3 6.3a2.4 2.4 0 0 1 0 3.4L17 19", key: "1cbfv1" }],
|
|
80526
80554
|
[
|
|
80527
80555
|
"path",
|
|
@@ -80532,7 +80560,7 @@ const __iconNode$p = [
|
|
|
80532
80560
|
],
|
|
80533
80561
|
["circle", { cx: "6.5", cy: "9.5", r: ".5", fill: "currentColor", key: "5pm5xn" }]
|
|
80534
80562
|
];
|
|
80535
|
-
const Tags = createLucideIcon("tags", __iconNode$
|
|
80563
|
+
const Tags = createLucideIcon("tags", __iconNode$q);
|
|
80536
80564
|
|
|
80537
80565
|
/**
|
|
80538
80566
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80542,11 +80570,11 @@ const Tags = createLucideIcon("tags", __iconNode$p);
|
|
|
80542
80570
|
*/
|
|
80543
80571
|
|
|
80544
80572
|
|
|
80545
|
-
const __iconNode$
|
|
80573
|
+
const __iconNode$p = [
|
|
80546
80574
|
["path", { d: "M12 19h8", key: "baeox8" }],
|
|
80547
80575
|
["path", { d: "m4 17 6-6-6-6", key: "1yngyt" }]
|
|
80548
80576
|
];
|
|
80549
|
-
const Terminal = createLucideIcon("terminal", __iconNode$
|
|
80577
|
+
const Terminal = createLucideIcon("terminal", __iconNode$p);
|
|
80550
80578
|
|
|
80551
80579
|
/**
|
|
80552
80580
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80556,7 +80584,7 @@ const Terminal = createLucideIcon("terminal", __iconNode$o);
|
|
|
80556
80584
|
*/
|
|
80557
80585
|
|
|
80558
80586
|
|
|
80559
|
-
const __iconNode$
|
|
80587
|
+
const __iconNode$o = [
|
|
80560
80588
|
["path", { d: "M17 14V2", key: "8ymqnk" }],
|
|
80561
80589
|
[
|
|
80562
80590
|
"path",
|
|
@@ -80566,7 +80594,7 @@ const __iconNode$n = [
|
|
|
80566
80594
|
}
|
|
80567
80595
|
]
|
|
80568
80596
|
];
|
|
80569
|
-
const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$
|
|
80597
|
+
const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$o);
|
|
80570
80598
|
|
|
80571
80599
|
/**
|
|
80572
80600
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80576,7 +80604,7 @@ const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$n);
|
|
|
80576
80604
|
*/
|
|
80577
80605
|
|
|
80578
80606
|
|
|
80579
|
-
const __iconNode$
|
|
80607
|
+
const __iconNode$n = [
|
|
80580
80608
|
["path", { d: "M7 10v12", key: "1qc93n" }],
|
|
80581
80609
|
[
|
|
80582
80610
|
"path",
|
|
@@ -80586,7 +80614,7 @@ const __iconNode$m = [
|
|
|
80586
80614
|
}
|
|
80587
80615
|
]
|
|
80588
80616
|
];
|
|
80589
|
-
const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$
|
|
80617
|
+
const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$n);
|
|
80590
80618
|
|
|
80591
80619
|
/**
|
|
80592
80620
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80596,14 +80624,14 @@ const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$m);
|
|
|
80596
80624
|
*/
|
|
80597
80625
|
|
|
80598
80626
|
|
|
80599
|
-
const __iconNode$
|
|
80627
|
+
const __iconNode$m = [
|
|
80600
80628
|
["path", { d: "M10 11v6", key: "nco0om" }],
|
|
80601
80629
|
["path", { d: "M14 11v6", key: "outv1u" }],
|
|
80602
80630
|
["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
|
|
80603
80631
|
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
80604
80632
|
["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
|
|
80605
80633
|
];
|
|
80606
|
-
const Trash2 = createLucideIcon("trash-2", __iconNode$
|
|
80634
|
+
const Trash2 = createLucideIcon("trash-2", __iconNode$m);
|
|
80607
80635
|
|
|
80608
80636
|
/**
|
|
80609
80637
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -80613,12 +80641,26 @@ const Trash2 = createLucideIcon("trash-2", __iconNode$l);
|
|
|
80613
80641
|
*/
|
|
80614
80642
|
|
|
80615
80643
|
|
|
80616
|
-
const __iconNode$
|
|
80644
|
+
const __iconNode$l = [
|
|
80617
80645
|
["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
|
|
80618
80646
|
["path", { d: "M3 6h18", key: "d0wm0j" }],
|
|
80619
80647
|
["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
|
|
80620
80648
|
];
|
|
80621
|
-
const Trash = createLucideIcon("trash", __iconNode$
|
|
80649
|
+
const Trash = createLucideIcon("trash", __iconNode$l);
|
|
80650
|
+
|
|
80651
|
+
/**
|
|
80652
|
+
* @license lucide-react v0.528.0 - ISC
|
|
80653
|
+
*
|
|
80654
|
+
* This source code is licensed under the ISC license.
|
|
80655
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
80656
|
+
*/
|
|
80657
|
+
|
|
80658
|
+
|
|
80659
|
+
const __iconNode$k = [
|
|
80660
|
+
["path", { d: "M16 7h6v6", key: "box55l" }],
|
|
80661
|
+
["path", { d: "m22 7-8.5 8.5-5-5L2 17", key: "1t1m79" }]
|
|
80662
|
+
];
|
|
80663
|
+
const TrendingUp = createLucideIcon("trending-up", __iconNode$k);
|
|
80622
80664
|
|
|
80623
80665
|
/**
|
|
80624
80666
|
* @license lucide-react v0.528.0 - ISC
|
|
@@ -185540,7 +185582,7 @@ function MultiSearchSelect({ labels, selected, onSelect, onRemove, searchTerm, o
|
|
|
185540
185582
|
*/
|
|
185541
185583
|
function useAgentSearch({ tenantKey, query, limit = 6, offset, starred, featured, category, subjects, llm, types, includeMainPublicMentors, orderDirection, skip = false, }) {
|
|
185542
185584
|
var _a, _b, _c;
|
|
185543
|
-
const { data, isLoading, isFetching, refetch } = useGetAiSearchMentorsQuery({
|
|
185585
|
+
const { data, isLoading, isFetching, isUninitialized, refetch } = useGetAiSearchMentorsQuery({
|
|
185544
185586
|
platform_key: tenantKey,
|
|
185545
185587
|
query: query || undefined,
|
|
185546
185588
|
limit,
|
|
@@ -185564,6 +185606,7 @@ function useAgentSearch({ tenantKey, query, limit = 6, offset, starred, featured
|
|
|
185564
185606
|
totalPages: (_c = data === null || data === void 0 ? void 0 : data.total_pages) !== null && _c !== void 0 ? _c : 0,
|
|
185565
185607
|
isLoading,
|
|
185566
185608
|
isFetching,
|
|
185609
|
+
isUninitialized,
|
|
185567
185610
|
refetch,
|
|
185568
185611
|
};
|
|
185569
185612
|
}
|
|
@@ -194215,29 +194258,60 @@ function SpendLimitsSection({ tenantKey, labels: labelsOverride }) {
|
|
|
194215
194258
|
return (jsxs(Fragment$1, { children: [jsxs("div", { "data-testid": "spend-limits-workspace-section", className: "rounded-lg border border-[#e5e5e5] bg-white shadow-[0_1px_2px_0_rgba(0,0,0,0.05)] dark:bg-zinc-900 dark:border-zinc-800", children: [jsx("div", { className: "flex flex-col gap-2 p-4 sm:flex-row sm:items-start sm:justify-between", children: jsxs("div", { className: "space-y-0.5", children: [jsx("h3", { className: "text-[16px] font-medium leading-6 text-[#101828] dark:text-gray-100", children: labels.tenantSections.workspace.title }), jsx("p", { className: "text-[13px] font-normal leading-5 text-[#4a5565] dark:text-gray-400", children: labels.tenantSections.workspace.description })] }) }), jsx("div", { className: "border-t border-[#e5e7eb] dark:border-zinc-800 px-4 py-3", children: isTenantCapLoading ? (jsx("div", { className: "flex items-center justify-center py-8", "data-testid": "tenant-cap-loading", children: jsx(Spinner, {}) })) : isTenantForbidden ? (jsxs("div", { className: "flex flex-col items-center gap-2 rounded-lg border border-gray-200 bg-gray-50 px-4 py-10 text-center", "data-testid": "spend-limits-denied", children: [jsx(ShieldAlert, { className: "h-6 w-6 text-gray-400" }), jsx("p", { className: "text-sm font-medium text-gray-900", children: labels.denied.title }), jsx("p", { className: "max-w-sm text-xs text-gray-600", children: labels.denied.description })] })) : (jsxs("div", { className: "space-y-4", children: [!tenantCap && (monthlySpend != null || totalSpend != null) && (jsxs("div", { className: "space-y-1", "data-testid": "workspace-actual-spend-stats", children: [jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [monthlySpend != null && (jsxs("div", { className: "space-y-0.5", children: [jsx("p", { className: "text-[11px] font-medium uppercase tracking-wide text-[#6a7282] dark:text-gray-400", children: labels.tenantSections.noCapStats.spentThisMonth }), jsx("p", { className: "text-[18px] font-semibold leading-6 text-[#101828] dark:text-gray-100", "data-testid": "workspace-actual-spend-month", children: formatUsd$2(String(monthlySpend)) })] })), totalSpend != null && (jsxs("div", { className: "space-y-0.5", children: [jsx("p", { className: "text-[11px] font-medium uppercase tracking-wide text-[#6a7282] dark:text-gray-400", children: labels.tenantSections.noCapStats.spentAllTime }), jsx("p", { className: "text-[18px] font-semibold leading-6 text-[#101828] dark:text-gray-100", "data-testid": "workspace-actual-spend-total", children: formatUsd$2(String(totalSpend)) })] }))] }), jsx("p", { className: "text-[12px] font-normal leading-4 text-[#6a7282] dark:text-gray-500", children: labels.tenantSections.noCapStats.hint })] })), jsx(SpendCapForm, { labels: labels, cap: tenantCap, isSaving: isSavingTenantCap, isDeleting: isDeletingTenantCap, onSave: saveTenantCap, onDelete: () => setIsDeleteOpen(true), testId: "tenant-cap" })] })) })] }), jsx(Dialog, { open: isDeleteOpen, onOpenChange: () => setIsDeleteOpen(false), children: jsxs(DialogContent, { "aria-describedby": "tenant-cap-delete-description", "data-testid": "tenant-cap-delete-modal", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.deleteModal.title }) }), jsx("div", { className: "my-5", id: "tenant-cap-delete-description", children: jsx("p", { className: "text-sm text-[#646464]", children: labels.deleteModal.description }) }), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: () => setIsDeleteOpen(false), children: labels.deleteModal.cancel }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: handleConfirmDelete, disabled: isDeletingTenantCap, "data-testid": "tenant-cap-delete-confirm", children: isDeletingTenantCap ? labels.form.removing : labels.deleteModal.confirm })] })] }) })] }));
|
|
194216
194259
|
}
|
|
194217
194260
|
|
|
194261
|
+
/** SPAs whose users have coursework, so the profile leads with a Gradebook tab. */
|
|
194262
|
+
const GRADEBOOK_SPAS = ['lms', 'skills'];
|
|
194263
|
+
/**
|
|
194264
|
+
* The customization `Profile` is opened with: whatever the host passed, with
|
|
194265
|
+
* the Gradebook tab defaulted from the SPA it runs in. An explicit
|
|
194266
|
+
* `showGradebookTab` always wins, so a host can force it either way.
|
|
194267
|
+
*/
|
|
194268
|
+
function profileCustomization(customization, currentSPA) {
|
|
194269
|
+
var _a;
|
|
194270
|
+
return {
|
|
194271
|
+
...customization,
|
|
194272
|
+
showGradebookTab: (_a = customization === null || customization === void 0 ? void 0 : customization.showGradebookTab) !== null && _a !== void 0 ? _a : GRADEBOOK_SPAS.includes((currentSPA !== null && currentSPA !== void 0 ? currentSPA : '').trim().toLowerCase()),
|
|
194273
|
+
};
|
|
194274
|
+
}
|
|
194218
194275
|
/**
|
|
194219
194276
|
* The shared `Profile` viewer in a dialog — the same modal the tenant
|
|
194220
194277
|
* Management tab opens when a user row is clicked. Controlled variant for
|
|
194221
194278
|
* hosts that trigger it from a whole table row.
|
|
194279
|
+
*
|
|
194280
|
+
* Radix portals the dialog into `document.body`, but a React portal still
|
|
194281
|
+
* bubbles its events through the React tree — so without the guard below, a
|
|
194282
|
+
* click *inside* the open profile would reach the row this dialog is rendered
|
|
194283
|
+
* from and fire its `onClick` (e.g. opening the enrollment progress modal
|
|
194284
|
+
* behind the profile). The wrapper is `display: contents`, so it adds nothing
|
|
194285
|
+
* to the host's layout.
|
|
194222
194286
|
*/
|
|
194223
|
-
function UserProfileDialog({ tenantKey, username, isOpen, onClose }) {
|
|
194287
|
+
function UserProfileDialog({ tenantKey, username, isOpen, onClose, customization, currentSPA, }) {
|
|
194224
194288
|
const t = useT();
|
|
194225
194289
|
if (!isOpen)
|
|
194226
194290
|
return null;
|
|
194227
|
-
return (jsx(Dialog, { open: true, onOpenChange: onClose, children: jsxs(DialogContent, { autoFocus: false, className: "profile-component-dialog max-w-7xl w-[85vw] gap-0 overflow-hidden bg-white p-0", style: { height: '85vh', display: 'flex', flexDirection: 'column' }, "data-testid": "user-profile-link-dialog", children: [jsx(DialogTitle, { className: "sr-only", children: t('tabsUserstab.profileDialogTitle') }), jsx(DialogDescription, { className: "sr-only", children: t('tabsUserstab.profileDialogDescription') }), jsx(Profile, { tenant: tenantKey, tenants: [], username: username, onClose: onClose })] }) }));
|
|
194291
|
+
return (jsx("span", { className: "contents", onClick: (event) => event.stopPropagation(), onMouseDown: (event) => event.stopPropagation(), onKeyDown: (event) => event.stopPropagation(), children: jsx(Dialog, { open: true, onOpenChange: onClose, children: jsxs(DialogContent, { autoFocus: false, className: "profile-component-dialog max-w-7xl w-[85vw] gap-0 overflow-hidden bg-white p-0", style: { height: '85vh', display: 'flex', flexDirection: 'column' }, "data-testid": "user-profile-link-dialog", children: [jsx(DialogTitle, { className: "sr-only", children: t('tabsUserstab.profileDialogTitle') }), jsx(DialogDescription, { className: "sr-only", children: t('tabsUserstab.profileDialogDescription') }), jsx(Profile, { tenant: tenantKey, tenants: [], username: username, onClose: onClose, customization: profileCustomization(customization, currentSPA), currentSPA: currentSPA })] }) }) }));
|
|
194228
194292
|
}
|
|
194229
194293
|
/**
|
|
194230
194294
|
* Clickable user identity that opens the shared `Profile` viewer in a dialog
|
|
194231
194295
|
* — the same modal the tenant Management tab opens when a user row is
|
|
194232
|
-
* clicked.
|
|
194296
|
+
* clicked. `Profile` drops into preview (read-only) mode on its own for anyone
|
|
194297
|
+
* but the signed-in user. Used by the spend-cap tables and every analytics
|
|
194298
|
+
* surface that names a user; safe inside clickable rows and cards, since
|
|
194299
|
+
* neither its clicks nor its key presses reach the host's handlers.
|
|
194233
194300
|
*/
|
|
194234
|
-
function UserProfileLink({ tenantKey, username, display, className, testId, }) {
|
|
194301
|
+
function UserProfileLink({ tenantKey, username, display, className, testId, customization, currentSPA, }) {
|
|
194235
194302
|
const t = useT();
|
|
194236
194303
|
const [isOpen, setIsOpen] = React__default.useState(false);
|
|
194304
|
+
if (!username) {
|
|
194305
|
+
// `inline-block`, or `truncate`'s `overflow: hidden` has nothing to clip:
|
|
194306
|
+
// an inline box takes its width from its own text.
|
|
194307
|
+
return (jsx("span", { className: cn('inline-block max-w-full truncate', className), "data-testid": testId, children: display }));
|
|
194308
|
+
}
|
|
194237
194309
|
return (jsxs(Fragment$1, { children: [jsx("button", { type: "button", onClick: (event) => {
|
|
194238
194310
|
event.stopPropagation();
|
|
194239
194311
|
setIsOpen(true);
|
|
194240
|
-
},
|
|
194312
|
+
},
|
|
194313
|
+
// Rows that open on Enter/Space would otherwise swallow the key press.
|
|
194314
|
+
onKeyDown: (event) => event.stopPropagation(), className: cn('max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none', className), "aria-label": t('tabsUserstab.viewProfileAriaLabel', { name: display }), "data-testid": testId, children: display }), jsx(UserProfileDialog, { tenantKey: tenantKey, username: username, isOpen: isOpen, onClose: () => setIsOpen(false), customization: customization, currentSPA: currentSPA })] }));
|
|
194241
194315
|
}
|
|
194242
194316
|
|
|
194243
194317
|
/**
|
|
@@ -229624,6 +229698,13 @@ const AnalyticsScopeProvider = AnalyticsScopeContext.Provider;
|
|
|
229624
229698
|
function useAnalyticsScope() {
|
|
229625
229699
|
return useContext(AnalyticsScopeContext);
|
|
229626
229700
|
}
|
|
229701
|
+
/**
|
|
229702
|
+
* The scope setter, or `undefined` where the page can't be re-scoped — no
|
|
229703
|
+
* provider, or a provider with no picker on screen.
|
|
229704
|
+
*/
|
|
229705
|
+
function useAnalyticsScopeSetter() {
|
|
229706
|
+
return useContext(AnalyticsScopeContext).setScopedMentor;
|
|
229707
|
+
}
|
|
229627
229708
|
/**
|
|
229628
229709
|
* The agent a container should report on, in precedence order:
|
|
229629
229710
|
*
|
|
@@ -229695,12 +229776,12 @@ const xAxisProps = (xKey) => ({
|
|
|
229695
229776
|
interval: 'preserveStartEnd',
|
|
229696
229777
|
minTickGap: 28,
|
|
229697
229778
|
});
|
|
229698
|
-
const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = false, }) => ({
|
|
229779
|
+
const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = false, yAxisWidth = 44, }) => ({
|
|
229699
229780
|
tick: AXIS_TICK,
|
|
229700
229781
|
axisLine: false,
|
|
229701
229782
|
tickLine: false,
|
|
229702
229783
|
tickMargin: 8,
|
|
229703
|
-
width:
|
|
229784
|
+
width: yAxisWidth,
|
|
229704
229785
|
tickCount: yTickCount,
|
|
229705
229786
|
allowDecimals,
|
|
229706
229787
|
domain: yDomain,
|
|
@@ -229708,15 +229789,15 @@ const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = f
|
|
|
229708
229789
|
});
|
|
229709
229790
|
/** Change over time: 2px monotone line over a soft gradient wash, crosshair +
|
|
229710
229791
|
* ring marker on hover. */
|
|
229711
|
-
function AnalyticsAreaChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, width, height, }) {
|
|
229792
|
+
function AnalyticsAreaChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, yAxisWidth, width, height, }) {
|
|
229712
229793
|
const gradientId = React__default.useId();
|
|
229713
229794
|
const tooltip = useChartTooltip({ dataKey, tooltipLabel, tooltipValue, tooltipAriaLabel });
|
|
229714
|
-
return (jsxs(AreaChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, children: [jsx("defs", { children: jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [jsx("stop", { offset: "0%", stopColor: color, stopOpacity: 0.2 }), jsx("stop", { offset: "100%", stopColor: color, stopOpacity: 0 })] }) }), jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals }) }), jsx(Tooltip, { content: tooltip, cursor: { stroke: color, strokeWidth: 1, strokeDasharray: '4 4', opacity: 0.55 }, wrapperStyle: { outline: 'none' } }), jsx(Area, { type: "monotone", dataKey: dataKey, stroke: color, strokeWidth: 2, fill: `url(#${gradientId})`, dot: false, activeDot: { r: 5, fill: '#ffffff', stroke: color, strokeWidth: 2.5 } })] }));
|
|
229795
|
+
return (jsxs(AreaChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, children: [jsx("defs", { children: jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [jsx("stop", { offset: "0%", stopColor: color, stopOpacity: 0.2 }), jsx("stop", { offset: "100%", stopColor: color, stopOpacity: 0 })] }) }), jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals, yAxisWidth }) }), jsx(Tooltip, { content: tooltip, cursor: { stroke: color, strokeWidth: 1, strokeDasharray: '4 4', opacity: 0.55 }, wrapperStyle: { outline: 'none' } }), jsx(Area, { type: "monotone", dataKey: dataKey, stroke: color, strokeWidth: 2, fill: `url(#${gradientId})`, dot: false, activeDot: { r: 5, fill: '#ffffff', stroke: color, strokeWidth: 2.5 } })] }));
|
|
229715
229796
|
}
|
|
229716
229797
|
/** Magnitude per period: 4px-rounded bar tops anchored to the baseline. */
|
|
229717
|
-
function AnalyticsBarChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, width, height, }) {
|
|
229798
|
+
function AnalyticsBarChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, yAxisWidth, width, height, }) {
|
|
229718
229799
|
const tooltip = useChartTooltip({ dataKey, tooltipLabel, tooltipValue, tooltipAriaLabel });
|
|
229719
|
-
return (jsxs(BarChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, barCategoryGap: "28%", children: [jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals }) }), jsx(Tooltip, { content: tooltip, cursor: { fill: 'rgba(0, 0, 0, 0.04)' }, wrapperStyle: { outline: 'none' } }), jsx(Bar, { dataKey: dataKey, fill: color, radius: [4, 4, 0, 0], maxBarSize: 22 })] }));
|
|
229800
|
+
return (jsxs(BarChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, barCategoryGap: "28%", children: [jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals, yAxisWidth }) }), jsx(Tooltip, { content: tooltip, cursor: { fill: 'rgba(0, 0, 0, 0.04)' }, wrapperStyle: { outline: 'none' } }), jsx(Bar, { dataKey: dataKey, fill: color, radius: [4, 4, 0, 0], maxBarSize: 22 })] }));
|
|
229720
229801
|
}
|
|
229721
229802
|
/**
|
|
229722
229803
|
* Identity ranked by magnitude, as rows rather than a rotated bar chart:
|
|
@@ -229757,6 +229838,26 @@ const AGENTS_PAGE_SIZE = 20;
|
|
|
229757
229838
|
const SEARCH_DEBOUNCE_MS$1 = 300;
|
|
229758
229839
|
/** cmdk needs a non-empty value; the handler treats this one as "clear". */
|
|
229759
229840
|
const ALL_AGENTS_VALUE = '__all_agents__';
|
|
229841
|
+
/**
|
|
229842
|
+
* The scope an agent-search result stands for, or `null` when the result has
|
|
229843
|
+
* no `unique_id` — that is what the analytics endpoints filter on, so a
|
|
229844
|
+
* selection without one would silently report on everything.
|
|
229845
|
+
*
|
|
229846
|
+
* Shared with {@link AnalyticsLayout}, which runs the same search to fill in
|
|
229847
|
+
* the `dbId` for a scope set by clicking an agent's name in a stats row.
|
|
229848
|
+
*/
|
|
229849
|
+
function toScopedMentor(agent) {
|
|
229850
|
+
if (!agent.unique_id)
|
|
229851
|
+
return null;
|
|
229852
|
+
return {
|
|
229853
|
+
uniqueId: agent.unique_id,
|
|
229854
|
+
// Search returns the DB id as a number, but every consumer downstream
|
|
229855
|
+
// types it as a string.
|
|
229856
|
+
dbId: String(agent.id),
|
|
229857
|
+
name: agent.name,
|
|
229858
|
+
profileImage: agent.profile_image,
|
|
229859
|
+
};
|
|
229860
|
+
}
|
|
229760
229861
|
function useDebouncedValue$1(value, delay) {
|
|
229761
229862
|
const [debounced, setDebounced] = useState(value);
|
|
229762
229863
|
useEffect(() => {
|
|
@@ -229787,10 +229888,9 @@ function AnalyticsAgentPicker({ tenantKey, value, onChange, className, }) {
|
|
|
229787
229888
|
limit: AGENTS_PAGE_SIZE,
|
|
229788
229889
|
skip: !open,
|
|
229789
229890
|
});
|
|
229790
|
-
const results = useMemo(
|
|
229791
|
-
|
|
229792
|
-
|
|
229793
|
-
() => agents.filter((agent) => !!agent.unique_id), [agents]);
|
|
229891
|
+
const results = useMemo(() => agents
|
|
229892
|
+
.map((agent) => ({ agent, scope: toScopedMentor(agent) }))
|
|
229893
|
+
.filter((entry) => Boolean(entry.scope)), [agents]);
|
|
229794
229894
|
const handleSelect = (mentor) => {
|
|
229795
229895
|
onChange(mentor);
|
|
229796
229896
|
setOpen(false);
|
|
@@ -229806,19 +229906,15 @@ function AnalyticsAgentPicker({ tenantKey, value, onChange, className, }) {
|
|
|
229806
229906
|
variant: "ghost", role: "combobox", "aria-expanded": open, "aria-label": t('analyticsAnalyticsAgentPicker.analyticsScope'), className: cn(
|
|
229807
229907
|
// Capped so a long agent name ellipsizes instead of pushing the tab
|
|
229808
229908
|
// strip along; the label below is what actually truncates.
|
|
229809
|
-
'h-9 max-w-[220px] justify-between bg-transparent pl-2 font-normal', className), children: [jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [value ? (jsxs(Avatar, { className: "h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: value.profileImage, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: value.name.charAt(0).toUpperCase() })] })) : (jsx(Globe, { className: "h-4 w-4 shrink-0 opacity-70", "aria-hidden": "true" })), jsx("span", { className: "min-w-0 truncate", children: value ? value.name : t('analyticsAnalyticsAgentPicker.allAgents') })] }), jsx(ChevronDown, { className: "h-4 w-4 shrink-0 opacity-50", "aria-hidden": "true" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsAnalyticsAgentPicker.searchAgents') }), jsxs(CommandList, { children: [jsx(CommandGroup, { children: jsxs(CommandItem, { value: ALL_AGENTS_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), jsx(Globe, { className: "mr-2 h-4 w-4 opacity-70", "aria-hidden": "true" }), t('analyticsAnalyticsAgentPicker.allAgents')] }) }), results.length > 0 && (jsx(CommandGroup, { heading: t('analyticsAnalyticsAgentPicker.agents'), children: results.map((agent) => {
|
|
229909
|
+
'h-9 max-w-[220px] justify-between bg-transparent pl-2 font-normal', className), children: [jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [value ? (jsxs(Avatar, { className: "h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: value.profileImage, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: value.name.charAt(0).toUpperCase() })] })) : (jsx(Globe, { className: "h-4 w-4 shrink-0 opacity-70", "aria-hidden": "true" })), jsx("span", { className: "min-w-0 truncate", children: value ? value.name : t('analyticsAnalyticsAgentPicker.allAgents') })] }), jsx(ChevronDown, { className: "h-4 w-4 shrink-0 opacity-50", "aria-hidden": "true" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsAnalyticsAgentPicker.searchAgents') }), jsxs(CommandList, { children: [jsx(CommandGroup, { children: jsxs(CommandItem, { value: ALL_AGENTS_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), jsx(Globe, { className: "mr-2 h-4 w-4 opacity-70", "aria-hidden": "true" }), t('analyticsAnalyticsAgentPicker.allAgents')] }) }), results.length > 0 && (jsx(CommandGroup, { heading: t('analyticsAnalyticsAgentPicker.agents'), children: results.map(({ agent, scope }) => {
|
|
229810
229910
|
var _a;
|
|
229811
|
-
const uniqueId = agent.unique_id;
|
|
229812
229911
|
return (jsxs(CommandItem, {
|
|
229912
|
+
// A long name wraps rather than ellipsizing, so the whole
|
|
229913
|
+
// name is readable in a 280px popover; the check and
|
|
229914
|
+
// avatar stay on its first line.
|
|
229915
|
+
className: "items-start",
|
|
229813
229916
|
// cmdk keys items by value; the search itself is server-side.
|
|
229814
|
-
value: uniqueId, onSelect: () => handleSelect({
|
|
229815
|
-
uniqueId,
|
|
229816
|
-
// Search returns the DB id as a number, but every
|
|
229817
|
-
// consumer downstream types it as a string.
|
|
229818
|
-
dbId: String(agent.id),
|
|
229819
|
-
name: agent.name,
|
|
229820
|
-
profileImage: agent.profile_image,
|
|
229821
|
-
}), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', (value === null || value === void 0 ? void 0 : value.uniqueId) === uniqueId ? 'opacity-100' : 'opacity-0') }), jsxs(Avatar, { className: "mr-2 h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: agent.profile_image, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: (_a = agent.name) === null || _a === void 0 ? void 0 : _a.charAt(0).toUpperCase() })] }), jsx("span", { className: "truncate", children: agent.name })] }, uniqueId));
|
|
229917
|
+
value: scope.uniqueId, onSelect: () => handleSelect(scope), children: [jsx(Check, { className: cn('mt-0.5 mr-2 h-4 w-4', (value === null || value === void 0 ? void 0 : value.uniqueId) === scope.uniqueId ? 'opacity-100' : 'opacity-0') }), jsxs(Avatar, { className: "mr-2 h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: agent.profile_image, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: (_a = agent.name) === null || _a === void 0 ? void 0 : _a.charAt(0).toUpperCase() })] }), jsx("span", { className: "min-w-0 flex-1 break-words whitespace-normal", children: agent.name })] }, scope.uniqueId));
|
|
229822
229918
|
}) })), isFetching && results.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsAnalyticsAgentPicker.loading') })), !isFetching && results.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsAnalyticsAgentPicker.noAgentsFound') }))] })] }) })] }));
|
|
229823
229919
|
}
|
|
229824
229920
|
|
|
@@ -229937,6 +230033,12 @@ const defaultTabs = [
|
|
|
229937
230033
|
value: 'monetization',
|
|
229938
230034
|
},*/
|
|
229939
230035
|
];
|
|
230036
|
+
/**
|
|
230037
|
+
* How many results the `dbId` lookup asks for. The query is the agent's own
|
|
230038
|
+
* `unique_id`, so the match is normally first; a handful of rows covers a
|
|
230039
|
+
* backend that treats the term as a loose text search.
|
|
230040
|
+
*/
|
|
230041
|
+
const SCOPE_LOOKUP_LIMIT = 5;
|
|
229940
230042
|
const className = 'inline-flex h-7 shrink-0 items-center justify-center whitespace-nowrap rounded-[5px] px-2 sm:px-2.5 py-0 text-sm text-gray-500 ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-blue-600 data-[state=active]:font-semibold font-medium data-[state=active]:bg-[#f5f7fb] data-[state=active]:shadow-none cursor-pointer';
|
|
229941
230043
|
function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs = defaultTabs, activeTabClassName = '', beforeDataReports, excludeTabs = [], showPicker = false, tenantKey, scopedMentor, onScopedMentorChange, }) {
|
|
229942
230044
|
var _a, _b;
|
|
@@ -229950,17 +230052,59 @@ function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs =
|
|
|
229950
230052
|
const [internalScopedMentor, setInternalScopedMentor] = useState(null);
|
|
229951
230053
|
const isScopeControlled = onScopedMentorChange !== undefined;
|
|
229952
230054
|
const activeScopedMentor = (_a = (isScopeControlled ? scopedMentor : internalScopedMentor)) !== null && _a !== void 0 ? _a : null;
|
|
229953
|
-
const
|
|
230055
|
+
const pickerTenantKey = (_b = tenantKey !== null && tenantKey !== void 0 ? tenantKey : currentTenant === null || currentTenant === void 0 ? void 0 : currentTenant.key) !== null && _b !== void 0 ? _b : '';
|
|
230056
|
+
const publishScopedMentor = useCallback((mentor) => {
|
|
229954
230057
|
if (isScopeControlled) {
|
|
229955
230058
|
onScopedMentorChange === null || onScopedMentorChange === void 0 ? void 0 : onScopedMentorChange(mentor);
|
|
229956
230059
|
return;
|
|
229957
230060
|
}
|
|
229958
230061
|
setInternalScopedMentor(mentor);
|
|
229959
230062
|
}, [isScopeControlled, onScopedMentorChange]);
|
|
230063
|
+
// A scope set by clicking an agent's name in a stats row carries the
|
|
230064
|
+
// `unique_id` alone — those payloads hold nothing else. Reports filters by
|
|
230065
|
+
// the database id, so publishing that straight through would leave the
|
|
230066
|
+
// Reports tab listing every report while the picker names one agent, and
|
|
230067
|
+
// would hand a controlling host a half-filled value to mirror. Resolve the
|
|
230068
|
+
// missing id first, through the same search the picker itself runs.
|
|
230069
|
+
const [pendingScopedMentor, setPendingScopedMentor] = useState(null);
|
|
230070
|
+
const { agents: scopeLookupResults, isFetching: isLookingUpScope, isUninitialized: isScopeLookupIdle, } = useAgentSearch({
|
|
230071
|
+
tenantKey: pickerTenantKey,
|
|
230072
|
+
query: pendingScopedMentor === null || pendingScopedMentor === void 0 ? void 0 : pendingScopedMentor.uniqueId,
|
|
230073
|
+
limit: SCOPE_LOOKUP_LIMIT,
|
|
230074
|
+
skip: !pendingScopedMentor,
|
|
230075
|
+
});
|
|
230076
|
+
useEffect(() => {
|
|
230077
|
+
if (!pendingScopedMentor || isLookingUpScope || isScopeLookupIdle)
|
|
230078
|
+
return;
|
|
230079
|
+
const match = scopeLookupResults.find((agent) => agent.unique_id === pendingScopedMentor.uniqueId);
|
|
230080
|
+
// A lookup that comes back empty still scopes the page: every stats tab
|
|
230081
|
+
// needs only the `unique_id`, and a click that did nothing at all would be
|
|
230082
|
+
// worse than a Reports tab that stays unfiltered.
|
|
230083
|
+
publishScopedMentor((match && toScopedMentor(match)) || pendingScopedMentor);
|
|
230084
|
+
setPendingScopedMentor(null);
|
|
230085
|
+
}, [
|
|
230086
|
+
pendingScopedMentor,
|
|
230087
|
+
isLookingUpScope,
|
|
230088
|
+
isScopeLookupIdle,
|
|
230089
|
+
scopeLookupResults,
|
|
230090
|
+
publishScopedMentor,
|
|
230091
|
+
]);
|
|
230092
|
+
const handleScopedMentorChange = useCallback((mentor) => {
|
|
230093
|
+
if (mentor && !mentor.dbId) {
|
|
230094
|
+
setPendingScopedMentor(mentor);
|
|
230095
|
+
return;
|
|
230096
|
+
}
|
|
230097
|
+
setPendingScopedMentor(null);
|
|
230098
|
+
publishScopedMentor(mentor);
|
|
230099
|
+
}, [publishScopedMentor]);
|
|
229960
230100
|
const scopeValue = useMemo(
|
|
229961
230101
|
// Only a rendered picker may scope the page — otherwise a host that stops
|
|
229962
|
-
// showing it would leave a stale agent filtering every chart
|
|
229963
|
-
|
|
230102
|
+
// showing it would leave a stale agent filtering every chart, and an agent
|
|
230103
|
+
// name clicked in a table would re-scope with nothing on screen saying so.
|
|
230104
|
+
() => ({
|
|
230105
|
+
scopedMentor: showPicker ? activeScopedMentor : null,
|
|
230106
|
+
setScopedMentor: showPicker ? handleScopedMentorChange : undefined,
|
|
230107
|
+
}), [showPicker, activeScopedMentor, handleScopedMentorChange]);
|
|
229964
230108
|
// Only a pure watcher narrows the tab strip — everyone else keeps whatever
|
|
229965
230109
|
// the caller passed, custom tabs included.
|
|
229966
230110
|
const isRestricted = isPureWatcher(rbacPermissions, currentTenant);
|
|
@@ -230035,7 +230179,7 @@ function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs =
|
|
|
230035
230179
|
.map((tab) => {
|
|
230036
230180
|
const isActive = activeTab === tab.value;
|
|
230037
230181
|
return (jsx(TabsTrigger, { value: tab.value, className: cn(className, isActive && activeTabClassName), onClick: () => handleTabClick(tab.value), children: tab.label }, tab.value));
|
|
230038
|
-
}) }) }) }) }), jsx("div", { className: "flex w-full shrink-0 items-center justify-end gap-3 sm:w-auto", children: canAccessTab('reports') && (jsx(Tabs, { className: "bg-[#f5f7fb]", value: activeTab, children: jsx(TabsList, { className: "bg-[#f5f7fb]", children: jsx(TabsTrigger, { value: "reports", className: cn(className, activeTab === 'reports' && activeTabClassName), onClick: () => handleTabClick('reports'), children: "Data Reports" }) }) })) })] }), jsxs(AnalyticsControlBar, { className: "mb-4 sm:mb-4", children: [showPicker && (jsx(AnalyticsAgentPicker, { tenantKey:
|
|
230182
|
+
}) }) }) }) }), jsx("div", { className: "flex w-full shrink-0 items-center justify-end gap-3 sm:w-auto", children: canAccessTab('reports') && (jsx(Tabs, { className: "bg-[#f5f7fb]", value: activeTab, children: jsx(TabsList, { className: "bg-[#f5f7fb]", children: jsx(TabsTrigger, { value: "reports", className: cn(className, activeTab === 'reports' && activeTabClassName), onClick: () => handleTabClick('reports'), children: "Data Reports" }) }) })) })] }), jsxs(AnalyticsControlBar, { className: "mb-4 sm:mb-4", children: [showPicker && (jsx(AnalyticsAgentPicker, { tenantKey: pickerTenantKey, value: activeScopedMentor, onChange: handleScopedMentorChange })), beforeDataReports] })] }), jsx("div", { className: "flex-1 overflow-auto overscroll-contain scrollbar-none px-6 pb-6 pt-0", children: isActiveTabAllowed ? children : null })] }) }) }));
|
|
230039
230183
|
}
|
|
230040
230184
|
|
|
230041
230185
|
const accessTimeData = [
|
|
@@ -230254,7 +230398,7 @@ const formatRelativeTime$1 = (dateString, t) => {
|
|
|
230254
230398
|
return t('analyticsAnalyticsUsersStats.daysAgo', { count: diffInDays });
|
|
230255
230399
|
return date.toLocaleDateString();
|
|
230256
230400
|
};
|
|
230257
|
-
function AnalyticsUsersStats({ tenantKey, mentorId, selectedMentorId, usergroupIds, }) {
|
|
230401
|
+
function AnalyticsUsersStats({ tenantKey, currentSPA, mentorId, selectedMentorId, usergroupIds, }) {
|
|
230258
230402
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
230259
230403
|
const t = useT();
|
|
230260
230404
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
@@ -230262,7 +230406,7 @@ function AnalyticsUsersStats({ tenantKey, mentorId, selectedMentorId, usergroupI
|
|
|
230262
230406
|
return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.usersLoggedInNow'), value: (currentlyActiveUsers === null || currentlyActiveUsers === void 0 ? void 0 : currentlyActiveUsers.count) || 0, loading: isLoadingCurrentlyActiveUsers, description: t('analyticsAnalyticsUsersStats.usersLoggedInNowDescription') }), jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.usersLoggedInPast30Days'), value: (activeUsers30D === null || activeUsers30D === void 0 ? void 0 : activeUsers30D.count) || 0, loading: isLoadingActiveUsers30D, description: t('analyticsAnalyticsUsersStats.usersLoggedInPast30DaysDescription') }), jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.totalRegisteredUsers'), value: (registeredUsers === null || registeredUsers === void 0 ? void 0 : registeredUsers.count) || 0, loading: isLoadingRegisteredUsers, description: t('analyticsAnalyticsUsersStats.totalRegisteredUsersDescription') })] }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-5", children: [jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.activeUsersTitle'), label: t('analyticsAnalyticsUsersStats.activeUsersLabel'), filters: activeUsersStatsDateFilter, setOutsideFilters: setActiveUsersStatsDateFilter, description: t('analyticsAnalyticsUsersStats.activeUsersChartDescription'), children: isLoadingActiveUsers ? (jsx(ChartLoading, {})) : ((_a = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _a === void 0 ? void 0 : _a.length) && ((_b = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _b === void 0 ? void 0 : _b.length) > 0 ? (jsx(AnalyticsBarChart, { data: (_c = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _c === void 0 ? void 0 : _c.map((point) => ({
|
|
230263
230407
|
date: formatDateToShortFormat$2(point.date, activeUsersStatsDateFilter.activeFilter === 'today'),
|
|
230264
230408
|
value: point.value,
|
|
230265
|
-
})), tooltipLabel: t('analyticsAnalyticsUsersStats.activeUsersLabel'), tooltipAriaLabel: (label) => t('analyticsAnalyticsUsersStats.activeUsersAriaLabel', { label }) })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.accessTimesTitle'), label: t('analyticsAnalyticsUsersStats.accessTimesLabel'), filters: accessTimeHeatmapDateFilter, setOutsideFilters: setAccessTimeHeatmapDateFilter, description: t('analyticsAnalyticsUsersStats.accessTimesDescription'), children: jsx(AccessTimeHeatmap, { loading: isLoadingAccessTimeHeatmap, accessTimeData: accessTimeHeatmap }) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.userDetailsTitle'), label: t('analyticsAnalyticsUsersStats.userDetailsLabel'), filters: userDetailsStatsDateFilter, setOutsideFilters: setUserDetailsStatsDateFilter, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsUsersStats.userDetailsDescription'), children: jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-user", type: "text", placeholder: t('analyticsAnalyticsUsersStats.searchPlaceholder'), value: userDetailsStatsSearch, onChange: handleSearchInputChange, required: true, className: `pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11` })] }), jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[200px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUsername') }), jsx(TableHead, { children: t('analyticsAnalyticsUsersStats.tableHeaderMessages') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsUsersStats.tableHeaderLastActive') })] }) }), jsx(TableBody, { children: (_d = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _d === void 0 ? void 0 : _d.map((user, index) => (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: user.email
|
|
230409
|
+
})), tooltipLabel: t('analyticsAnalyticsUsersStats.activeUsersLabel'), tooltipAriaLabel: (label) => t('analyticsAnalyticsUsersStats.activeUsersAriaLabel', { label }) })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.accessTimesTitle'), label: t('analyticsAnalyticsUsersStats.accessTimesLabel'), filters: accessTimeHeatmapDateFilter, setOutsideFilters: setAccessTimeHeatmapDateFilter, description: t('analyticsAnalyticsUsersStats.accessTimesDescription'), children: jsx(AccessTimeHeatmap, { loading: isLoadingAccessTimeHeatmap, accessTimeData: accessTimeHeatmap }) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.userDetailsTitle'), label: t('analyticsAnalyticsUsersStats.userDetailsLabel'), filters: userDetailsStatsDateFilter, setOutsideFilters: setUserDetailsStatsDateFilter, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsUsersStats.userDetailsDescription'), children: jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-user", type: "text", placeholder: t('analyticsAnalyticsUsersStats.searchPlaceholder'), value: userDetailsStatsSearch, onChange: handleSearchInputChange, required: true, className: `pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11` })] }), jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[200px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUsername') }), jsx(TableHead, { children: t('analyticsAnalyticsUsersStats.tableHeaderMessages') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsUsersStats.tableHeaderLastActive') })] }) }), jsx(TableBody, { children: (_d = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _d === void 0 ? void 0 : _d.map((user, index) => (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: user.email ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: user.username, display: user.email })) : (t('analyticsAnalyticsUsersStats.anonymous')) }) }), jsx(TableCell, { children: user.full_name ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: user.username, display: user.full_name })) : null }), jsx(TableCell, { children: user.messages }), jsx(TableCell, { className: "text-right", children: user.last_activity ? formatRelativeTime$1(user.last_activity, t) : '-' })] }, index))) })] }) }), isLoadingUserDetailsStats && (jsx("div", { className: "flex items-center justify-center py-4", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsUsersStats.loading') }) })), !isLoadingUserDetailsStats &&
|
|
230266
230410
|
(!((_e = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _e === void 0 ? void 0 : _e.length) || ((_f = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _f === void 0 ? void 0 : _f.length) === 0) && (jsx(EmptyStats, {})), (userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.pagination) && ((_g = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _g === void 0 ? void 0 : _g.length) > 0 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setUserDetailsStatsPage(1), disabled: !userDetailsStats.pagination.has_previous, children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsUsersStats.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setUserDetailsStatsPage(userDetailsStats.pagination.page - 1), disabled: !userDetailsStats.pagination.has_previous, children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsUsersStats.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: userDetailsStats.pagination.total_pages }, (_, i) => i + 1)
|
|
230267
230411
|
.filter((page) => {
|
|
230268
230412
|
const current = userDetailsStats.pagination.page;
|
|
@@ -230744,6 +230888,15 @@ const SELF_VALUE = '__self__';
|
|
|
230744
230888
|
* whose memories would then come back 403.
|
|
230745
230889
|
*/
|
|
230746
230890
|
const MEMORY_LIST_ACTION = 'Ibl.Mentor/Memory/list';
|
|
230891
|
+
/** Most recognizable label first: full name, then email, then username. */
|
|
230892
|
+
const primaryLabel = (user) => { var _a, _b; return ((_a = user.name) === null || _a === void 0 ? void 0 : _a.trim()) || ((_b = user.email) === null || _b === void 0 ? void 0 : _b.trim()) || user.username; };
|
|
230893
|
+
/** The next identifier down, so two users sharing a name stay distinguishable. */
|
|
230894
|
+
const secondaryLabel = (user) => {
|
|
230895
|
+
var _a, _b, _c;
|
|
230896
|
+
if ((_a = user.name) === null || _a === void 0 ? void 0 : _a.trim())
|
|
230897
|
+
return ((_b = user.email) === null || _b === void 0 ? void 0 : _b.trim()) || user.username;
|
|
230898
|
+
return ((_c = user.email) === null || _c === void 0 ? void 0 : _c.trim()) ? user.username : '';
|
|
230899
|
+
};
|
|
230747
230900
|
function useDebouncedValue(value, delay) {
|
|
230748
230901
|
const [debounced, setDebounced] = useState(value);
|
|
230749
230902
|
useEffect(() => {
|
|
@@ -230769,13 +230922,16 @@ function UserFilterSelect({ tenantKey, currentUsername, value, onChange, showSel
|
|
|
230769
230922
|
const t = useT();
|
|
230770
230923
|
const [open, setOpen] = useState(false);
|
|
230771
230924
|
const [search, setSearch] = useState('');
|
|
230925
|
+
// The filter value is only a username, so the picked row is kept to label
|
|
230926
|
+
// the trigger with its name or email.
|
|
230927
|
+
const [selectedUser, setSelectedUser] = useState(null);
|
|
230772
230928
|
const debouncedSearch = useDebouncedValue(search, SEARCH_DEBOUNCE_MS);
|
|
230773
230929
|
const { currentTenant } = useCurrentTenant();
|
|
230774
230930
|
const rbacPermissions = useSelector(selectRbacPermissions);
|
|
230775
230931
|
const isWatcher = isPureWatcher(rbacPermissions, currentTenant);
|
|
230776
|
-
// Only fetched once the dropdown is open — the trigger
|
|
230777
|
-
//
|
|
230778
|
-
// first.
|
|
230932
|
+
// Only fetched once the dropdown is open — the trigger labels the selection
|
|
230933
|
+
// from the row that was picked, falling back to the username value itself,
|
|
230934
|
+
// so nothing needs looking up first.
|
|
230779
230935
|
const { data, isFetching: isFetchingPlatformUsers } = usePlatformUsersQuery({
|
|
230780
230936
|
platform_key: tenantKey,
|
|
230781
230937
|
platform_org: tenantKey,
|
|
@@ -230832,16 +230988,22 @@ function UserFilterSelect({ tenantKey, currentUsername, value, onChange, showSel
|
|
|
230832
230988
|
// them at the top of the list.
|
|
230833
230989
|
(user) => !!user.username && !(showSelfOption && user.username === currentUsername));
|
|
230834
230990
|
}, [isWatcher, accessibleUsers, data, currentUsername, showSelfOption]);
|
|
230835
|
-
const handleSelect = (
|
|
230836
|
-
|
|
230991
|
+
const handleSelect = (user) => {
|
|
230992
|
+
var _a;
|
|
230993
|
+
setSelectedUser(user);
|
|
230994
|
+
onChange((_a = user === null || user === void 0 ? void 0 : user.username) !== null && _a !== void 0 ? _a : '');
|
|
230837
230995
|
setOpen(false);
|
|
230838
230996
|
};
|
|
230839
|
-
|
|
230997
|
+
// A value set from outside (e.g. the Cost table's "View traces" hand-off)
|
|
230998
|
+
// has no picked row; it resolves once the list holds it, else stays a username.
|
|
230999
|
+
const selectedLabelUser = (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.username) === value ? selectedUser : users.find((user) => user.username === value);
|
|
231000
|
+
const triggerLabel = value ? (selectedLabelUser ? primaryLabel(selectedLabelUser) : value) : '';
|
|
231001
|
+
return (jsxs(Popover, { open: open, onOpenChange: setOpen, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button$1, { variant: "outline", role: "combobox", "aria-expanded": open, "aria-label": t('analyticsUserFilterSelect.filterByUser'), className: cn('h-9 w-full justify-between bg-white font-normal', className), children: [jsx("span", { className: "truncate", children: triggerLabel ||
|
|
230840
231002
|
t(showSelfOption
|
|
230841
231003
|
? 'analyticsUserFilterSelect.you'
|
|
230842
|
-
: 'analyticsUserFilterSelect.allUsers') }), jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsUserFilterSelect.searchPlaceholder') }), jsxs(CommandList, { children: [jsxs(CommandGroup, { children: [showSelfOption && (jsxs(CommandItem, { value: SELF_VALUE, onSelect: () => handleSelect(
|
|
231004
|
+
: 'analyticsUserFilterSelect.allUsers') }), jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsUserFilterSelect.searchPlaceholder') }), jsxs(CommandList, { children: [jsxs(CommandGroup, { children: [showSelfOption && (jsxs(CommandItem, { value: SELF_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), t('analyticsUserFilterSelect.you')] })), users.map((user) => (jsxs(CommandItem, {
|
|
230843
231005
|
// cmdk keys items by value; the search itself is server-side.
|
|
230844
|
-
value: user.username, onSelect: () => handleSelect(user
|
|
231006
|
+
value: user.username, onSelect: () => handleSelect(user), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value === user.username ? 'opacity-100' : 'opacity-0') }), jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx("span", { className: "truncate font-medium", children: primaryLabel(user) }), secondaryLabel(user) && (jsx("span", { className: "truncate text-xs text-gray-500", children: secondaryLabel(user) }))] })] }, user.key)))] }), isFetching && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.loadingUsers') })), !isFetching && users.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.noUsersFound') }))] })] }) })] }));
|
|
230845
231007
|
}
|
|
230846
231008
|
|
|
230847
231009
|
const CELL$1 = 'p-3 text-[#646464]';
|
|
@@ -230887,7 +231049,7 @@ function ObservationRow({ observation, traceStart, traceDuration, }) {
|
|
|
230887
231049
|
background: colorForSeries(observation.name || observation.type || ''),
|
|
230888
231050
|
} }) }), jsx("div", { className: "w-[52px] shrink-0 text-right text-xs text-[#646464] tabular-nums", children: seconds !== undefined ? `${seconds.toFixed(2)}s` : '—' }), jsx("div", { className: "w-[58px] shrink-0 text-right text-xs text-[#646464] tabular-nums", children: tokens !== undefined ? tokens.toLocaleString() : '—' }), jsx("div", { className: "w-[64px] shrink-0 text-right text-xs font-semibold text-[#484848] tabular-nums", children: formatCost(cost) })] }));
|
|
230889
231051
|
}
|
|
230890
|
-
function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOpenTranscript, }) {
|
|
231052
|
+
function TraceDetail({ tenantKey, currentSPA, trace, observations, isLoadingObservations, onClose, onOpenTranscript, }) {
|
|
230891
231053
|
var _a;
|
|
230892
231054
|
const t = useT();
|
|
230893
231055
|
const { traceStart, traceDuration } = useMemo(() => {
|
|
@@ -230903,7 +231065,12 @@ function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOp
|
|
|
230903
231065
|
}, [observations]);
|
|
230904
231066
|
const totalCost = (_a = trace.totalCost) !== null && _a !== void 0 ? _a : observations.reduce((sum, o) => { var _a, _b; return sum + ((_b = (_a = o.calculatedTotalCost) !== null && _a !== void 0 ? _a : o.totalCost) !== null && _b !== void 0 ? _b : 0); }, 0);
|
|
230905
231067
|
const meta = [
|
|
230906
|
-
[
|
|
231068
|
+
[
|
|
231069
|
+
t('analyticsTraces.detailUser'),
|
|
231070
|
+
trace.userId ? (
|
|
231071
|
+
// Langfuse's userId is the platform username the traces filter sends.
|
|
231072
|
+
jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: trace.userId, display: trace.userId })) : ('—'),
|
|
231073
|
+
],
|
|
230907
231074
|
[t('analyticsTraces.detailSession'), trace.sessionId || '—'],
|
|
230908
231075
|
[t('analyticsTraces.detailEnvironment'), trace.environment || '—'],
|
|
230909
231076
|
[t('analyticsTraces.detailStarted'), formatTime(trace.timestamp)],
|
|
@@ -230915,7 +231082,7 @@ function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOp
|
|
|
230915
231082
|
* observations as a waterfall. Ranked totals stay on the Spend sub-tab; this
|
|
230916
231083
|
* surface answers "what actually happened on that call".
|
|
230917
231084
|
*/
|
|
230918
|
-
function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initialUsername, }) {
|
|
231085
|
+
function AnalyticsTraces({ tenantKey, currentSPA, mentorId, filters, onOpenTranscript, initialUsername, }) {
|
|
230919
231086
|
var _a;
|
|
230920
231087
|
const t = useT();
|
|
230921
231088
|
const { traces, meta, isLoadingTraces, isTracesUnavailable, isForbidden, page, setPage, username, traceName, setFilter, selectedTraceId, setSelectedTraceId, selectedTrace, observations, isLoadingObservations, } = useLlmTraces({
|
|
@@ -230939,7 +231106,7 @@ function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initi
|
|
|
230939
231106
|
count: meta.totalItems.toLocaleString(),
|
|
230940
231107
|
}) }))] }), isLoadingTraces ? (jsx("div", { className: "flex w-full items-center justify-center py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : traces.length === 0 ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsTraces.noTraces') }) })) : (jsx("div", { className: "overflow-x-auto", children: jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colStarted') }), jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colService') }), jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colUser') }), jsx(TableHead, { className: cn(HEAD$1, 'text-right'), children: t('analyticsTraces.colLatency') }), jsx(TableHead, { className: cn(HEAD$1, 'text-right'), children: t('analyticsTraces.colCost') }), jsx(TableHead, { className: "w-[36px] p-3" })] }) }), jsx(TableBody, { children: traces.map((trace) => {
|
|
230941
231108
|
const selected = trace.id === selectedTraceId;
|
|
230942
|
-
return (jsxs(TableRow, { "aria-selected": selected, className: cn('cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0', selected ? 'bg-blue-50' : 'hover:bg-gray-50'), onClick: () => setSelectedTraceId(selected ? '' : trace.id), children: [jsx(TableCell, { className: cn(CELL$1, 'whitespace-nowrap tabular-nums'), children: formatTime(trace.timestamp) }), jsx(TableCell, { className: CELL$1, children: jsx(ServiceTag, { name: trace.name || '—' }) }), jsx(TableCell, { className: cn(CELL$1, 'max-w-[180px] truncate', selected && 'font-medium text-[#484848]'), children: trace.userId
|
|
231109
|
+
return (jsxs(TableRow, { "aria-selected": selected, className: cn('cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0', selected ? 'bg-blue-50' : 'hover:bg-gray-50'), onClick: () => setSelectedTraceId(selected ? '' : trace.id), children: [jsx(TableCell, { className: cn(CELL$1, 'whitespace-nowrap tabular-nums'), children: formatTime(trace.timestamp) }), jsx(TableCell, { className: CELL$1, children: jsx(ServiceTag, { name: trace.name || '—' }) }), jsx(TableCell, { className: cn(CELL$1, 'max-w-[180px] truncate', selected && 'font-medium text-[#484848]'), children: trace.userId ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: trace.userId, display: trace.userId })) : (t('analyticsTraces.anonymous')) }), jsx(TableCell, { className: cn(CELL$1, 'text-right tabular-nums'), children: trace.latency !== undefined
|
|
230943
231110
|
? `${Number(trace.latency).toFixed(2)}s`
|
|
230944
231111
|
: '—' }), jsx(TableCell, { className: cn(CELL$1, 'text-right font-semibold text-[#484848] tabular-nums'), children: formatCost(trace.totalCost) }), jsx(TableCell, { className: "p-3 text-right text-gray-400", children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] }, trace.id));
|
|
230945
231112
|
}) })] }) })), totalPages > 1 && (jsxs("div", { className: "flex items-center justify-between border-t border-[oklch(0.922_0_0)] px-4 py-3", children: [jsx("span", { className: "text-[13px] text-[#898989] tabular-nums", children: t('analyticsTraces.pageOf', { page, totalPages }) }), jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-0", disabled: page <= 1, "aria-label": t('analyticsTraces.previousPage'), onClick: () => {
|
|
@@ -230948,13 +231115,27 @@ function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initi
|
|
|
230948
231115
|
}, children: jsx(ChevronLeft, { className: "h-4 w-4", "aria-hidden": "true" }) }), jsx(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-0", disabled: page >= totalPages, "aria-label": t('analyticsTraces.nextPage'), onClick: () => {
|
|
230949
231116
|
setSelectedTraceId('');
|
|
230950
231117
|
setPage(page + 1);
|
|
230951
|
-
}, children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }))] }), selectedTraceId && selectedTrace && (jsx(TraceDetail, { trace: selectedTrace, observations: observations, isLoadingObservations: isLoadingObservations, onClose: () => setSelectedTraceId(''), onOpenTranscript: onOpenTranscript }))] }), mentorId && (jsx(AnalyticsNotice, { tone: "gray", title: t('analyticsTraces.mentorScopeTitle'), children: t('analyticsTraces.mentorScopeBody') }))] }));
|
|
231118
|
+
}, children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }))] }), selectedTraceId && selectedTrace && (jsx(TraceDetail, { tenantKey: tenantKey, currentSPA: currentSPA, trace: selectedTrace, observations: observations, isLoadingObservations: isLoadingObservations, onClose: () => setSelectedTraceId(''), onOpenTranscript: onOpenTranscript }))] }), mentorId && (jsx(AnalyticsNotice, { tone: "gray", title: t('analyticsTraces.mentorScopeTitle'), children: t('analyticsTraces.mentorScopeBody') }))] }));
|
|
230952
231119
|
}
|
|
230953
231120
|
|
|
230954
231121
|
/** An unreachable cost store must never render as $0.00 — it renders as this. */
|
|
230955
231122
|
const COST_UNAVAILABLE = '\u2014';
|
|
230956
231123
|
const hasCostValue = (value, isError) => !isError && value !== undefined && value !== null;
|
|
230957
231124
|
const costValue = (value, isError) => hasCostValue(value, isError) ? Number(value).toFixed(2) : COST_UNAVAILABLE;
|
|
231125
|
+
/**
|
|
231126
|
+
* A dollar amount as a y-axis tick. Ticks land on round numbers, so trailing
|
|
231127
|
+
* zeros only widen the labels ("$12.000" overflowed the axis) — but a tenant
|
|
231128
|
+
* whose whole range sits below a hundredth of a cent would get a column of
|
|
231129
|
+
* identical "$0"s at fixed precision, so amounts under that keep two
|
|
231130
|
+
* significant digits instead.
|
|
231131
|
+
*/
|
|
231132
|
+
const costTick = (value) => {
|
|
231133
|
+
if (value === 0)
|
|
231134
|
+
return '0';
|
|
231135
|
+
if (Math.abs(value) >= 0.0001)
|
|
231136
|
+
return String(parseFloat(value.toFixed(4)));
|
|
231137
|
+
return String(Number(value.toPrecision(2)));
|
|
231138
|
+
};
|
|
230958
231139
|
/**
|
|
230959
231140
|
* The spend side of the unified cost surface: billing totals, ranked per-user
|
|
230960
231141
|
* history, provider and model breakdowns — all from the ClickHouse
|
|
@@ -230962,7 +231143,7 @@ const costValue = (value, isError) => hasCostValue(value, isError) ? Number(valu
|
|
|
230962
231143
|
* family is deprecated), with the daily spend series from Langfuse, the only
|
|
230963
231144
|
* backend with a bucketed cost series.
|
|
230964
231145
|
*/
|
|
230965
|
-
function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTraces, }) {
|
|
231146
|
+
function SpendTab({ tenantKey, currentSPA, mentorId: currentMentorId, userId, onOpenUserTraces, }) {
|
|
230966
231147
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
230967
231148
|
const t = useT();
|
|
230968
231149
|
const { weeklyCostData, isLoadingWeeklyCostData, isErrorWeeklyCostData, monthlyCostData, isLoadingMonthlyCostData, isErrorMonthlyCostData, totalCostData, isLoadingTotalCostData, isErrorTotalCostData, detailedCostPerDayData, isLoadingDetailedCostPerDayData, detailedCostPerDayFilters, setDetailedCostPerDayFilters, detailedCostPerProviderData, isLoadingDetailedCostPerProviderData, detailedCostPerProviderFilters, setDetailedCostPerProviderFilters, detailedCostPerUserData, isLoadingDetailedCostPerUserData, detailedCostPerUserFilters, setDetailedCostPerUserFilters, costPerUserPage, setCostPerUserPage, costPerUserLimit, providerColors, detailedLLMCostData, isLoadingDetailedLLMCostData, detailedLLMCostFilters, setDetailedLLMCostFilters, } = useFinancial({ tenantKey, mentorId: currentMentorId, userId });
|
|
@@ -231034,7 +231215,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
|
|
|
231034
231215
|
((_e = detailedCostPerDayData === null || detailedCostPerDayData === void 0 ? void 0 : detailedCostPerDayData.overtime) === null || _e === void 0 ? void 0 : _e.length) > 0 ? (jsx(AnalyticsBarChart, { data: detailedCostPerDayData.overtime.map((item) => ({
|
|
231035
231216
|
date: formatDateToShortFormat$2(item.date, detailedCostPerDayFilters.activeFilter === 'today'),
|
|
231036
231217
|
value: item.value,
|
|
231037
|
-
})), tooltipLabel: t('analyticsAnalyticsFinancialStats.costPerDayLabel'), tooltipValue: (point) => `$${(Number(point.value) || 0).toFixed(3)}`, tooltipAriaLabel: (label) => t('analyticsAnalyticsFinancialStats.costDetailsAriaLabel', { label }), yTickFormatter: (value) => `$${value
|
|
231218
|
+
})), tooltipLabel: t('analyticsAnalyticsFinancialStats.costPerDayLabel'), tooltipValue: (point) => `$${(Number(point.value) || 0).toFixed(3)}`, tooltipAriaLabel: (label) => t('analyticsAnalyticsFinancialStats.costDetailsAriaLabel', { label }), yTickFormatter: (value) => `$${costTick(value)}`, yAxisWidth: 60, allowDecimals: true })) : (jsx(EmptyStats, {})) }) }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-5", children: [jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costByProviderTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costByProviderLabel'), filters: detailedCostPerProviderFilters, setOutsideFilters: setDetailedCostPerProviderFilters, description: t('analyticsAnalyticsFinancialStats.costByProviderDescription'), children: isLoadingDetailedCostPerProviderData ? (jsx(ChartLoading, {})) : ((_f = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _f === void 0 ? void 0 : _f.length) &&
|
|
231038
231219
|
((_g = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _g === void 0 ? void 0 : _g.length) > 0 ? (jsxs(PieChart, { children: [jsx(Pie, { data: (_h = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _h === void 0 ? void 0 : _h.map((item) => ({
|
|
231039
231220
|
name: item.provider,
|
|
231040
231221
|
value: item.total_cost,
|
|
@@ -231048,7 +231229,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
|
|
|
231048
231229
|
const data = (_a = payload[0]) === null || _a === void 0 ? void 0 : _a.payload;
|
|
231049
231230
|
return (jsxs("div", { className: "bg-background border border-border rounded-md p-3 shadow-lg z-[99999999]", style: { borderColor: 'oklch(.922 0 0)' }, role: "tooltip", "aria-label": t('analyticsAnalyticsFinancialStats.providerCostDetailsAriaLabel', {
|
|
231050
231231
|
label,
|
|
231051
|
-
}), tabIndex: -1, children: [jsx("div", { className: "font-medium text-foreground mb-2 text-base", children: label }), jsx("div", { className: "space-y-2 text-sm", children: jsxs("div", { className: "flex justify-between items-center", children: [jsxs("span", { className: "text-muted-foreground", children: [data === null || data === void 0 ? void 0 : data.name, ":"] }), jsxs("span", { className: "font-medium text-foreground", children: ["$", (_b = data === null || data === void 0 ? void 0 : data.value) === null || _b === void 0 ? void 0 : _b.toFixed(2)] })] }) })] }));
|
|
231232
|
+
}), tabIndex: -1, children: [jsx("div", { className: "font-medium text-foreground mb-2 text-base", children: label }), jsx("div", { className: "space-y-2 text-sm", children: jsxs("div", { className: "flex justify-between items-center", children: [jsxs("span", { className: "text-muted-foreground", children: [data === null || data === void 0 ? void 0 : data.name, ": "] }), jsxs("span", { className: "font-medium text-foreground", children: ["$", (_b = data === null || data === void 0 ? void 0 : data.value) === null || _b === void 0 ? void 0 : _b.toFixed(2)] })] }) })] }));
|
|
231052
231233
|
}, wrapperStyle: { outline: 'none' } })] })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costByLLMTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costByLLMLabel'), filters: detailedLLMCostFilters, setOutsideFilters: setDetailedLLMCostFilters, description: t('analyticsAnalyticsFinancialStats.costByLLMDescription'), overflowAuto: true, children: isLoadingDetailedLLMCostData ? (jsx(ChartLoading, {})) : ((_k = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _k === void 0 ? void 0 : _k.length) && ((_l = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _l === void 0 ? void 0 : _l.length) > 0 ? (jsx(RankedBars, { items: [...((_m = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) !== null && _m !== void 0 ? _m : [])]
|
|
231053
231234
|
.sort((a, b) => Number(b.total_cost) - Number(a.total_cost))
|
|
231054
231235
|
.map((item, index) => ({
|
|
@@ -231059,9 +231240,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
|
|
|
231059
231240
|
shown: (_p = (_o = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _o === void 0 ? void 0 : _o.length) !== null && _p !== void 0 ? _p : 0,
|
|
231060
231241
|
}) })) : (jsx(EmptyStats, {})) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costPerUserTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costPerUserLabel'), filters: detailedCostPerUserFilters, setOutsideFilters: setDetailedCostPerUserFilters, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsFinancialStats.costPerUserDescription'), children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsFinancialStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[120px]", children: t('analyticsAnalyticsFinancialStats.tableHeaderTotalCost') }), hasSessions && (jsx(TableHead, { children: t('analyticsAnalyticsFinancialStats.tableHeaderSessions') })), hasLastActive && (jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsFinancialStats.tableHeaderLastActive') })), onOpenUserTraces && jsx(TableHead, { className: "w-[90px]" })] }) }), jsx(TableBody, { children: (_q = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _q === void 0 ? void 0 : _q.map((user, index) => {
|
|
231061
231242
|
var _a;
|
|
231062
|
-
return (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: (user === null || user === void 0 ? void 0 : user.email) ||
|
|
231063
|
-
(user === null || user === void 0 ? void 0 : user.username) ||
|
|
231064
|
-
t('analyticsAnalyticsFinancialStats.anonymous') }) }), jsxs(TableCell, { className: "font-medium", children: ["$", Number(user.total_cost || 0).toFixed(2)] }), hasSessions && jsx(TableCell, { children: (_a = user.sessions) !== null && _a !== void 0 ? _a : '\u2014' }), hasLastActive && (jsx(TableCell, { className: "text-right", children: user.last_active ? formatRelativeTime$2(user.last_active) : '-' })), onOpenUserTraces && (jsx(TableCell, { className: "text-right", children: (user === null || user === void 0 ? void 0 : user.username) || (user === null || user === void 0 ? void 0 : user.email) ? (jsx("button", { type: "button", className: "cursor-pointer text-sm font-semibold text-blue-600 hover:text-blue-700 hover:underline", onClick: () => onOpenUserTraces(String(user.username || user.email)), children: t('analyticsAnalyticsFinancialStats.viewTraces') })) : null }))] }, index));
|
|
231243
|
+
return (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: (user === null || user === void 0 ? void 0 : user.email) || (user === null || user === void 0 ? void 0 : user.username) ? (jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: user.username, display: String(user.email || user.username) })) : (t('analyticsAnalyticsFinancialStats.anonymous')) }) }), jsxs(TableCell, { className: "font-medium", children: ["$", Number(user.total_cost || 0).toFixed(2)] }), hasSessions && jsx(TableCell, { children: (_a = user.sessions) !== null && _a !== void 0 ? _a : '\u2014' }), hasLastActive && (jsx(TableCell, { className: "text-right", children: user.last_active ? formatRelativeTime$2(user.last_active) : '-' })), onOpenUserTraces && (jsx(TableCell, { className: "text-right", children: (user === null || user === void 0 ? void 0 : user.username) || (user === null || user === void 0 ? void 0 : user.email) ? (jsx("button", { type: "button", className: "cursor-pointer text-sm font-semibold text-blue-600 hover:text-blue-700 hover:underline", onClick: () => onOpenUserTraces(String(user.username || user.email)), children: t('analyticsAnalyticsFinancialStats.viewTraces') })) : null }))] }, index));
|
|
231065
231244
|
}) })] }) }), isLoadingDetailedCostPerUserData && (jsx("div", { className: "h-[60px]", children: jsx(ChartLoading, {}) })), !isLoadingDetailedCostPerUserData &&
|
|
231066
231245
|
(!((_r = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _r === void 0 ? void 0 : _r.length) ||
|
|
231067
231246
|
((_s = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _s === void 0 ? void 0 : _s.length) === 0) && (jsx("div", { className: "h-[60px]", children: jsx(EmptyStats, {}) })), detailedCostPerUserData && detailedCostPerUserData.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-between py-3", children: [jsx("div", { className: "text-sm text-gray-700", children: t('analyticsAnalyticsFinancialStats.paginationShowing', {
|
|
@@ -231077,7 +231256,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
|
|
|
231077
231256
|
* (tokens, latency percentiles, per-call drill-down). Every card names its
|
|
231078
231257
|
* source so a number is never read against the wrong question.
|
|
231079
231258
|
*/
|
|
231080
|
-
function AnalyticsFinancialStats({ tenantKey, mentorId, selectedMentorId, userId, onOpenTranscript, }) {
|
|
231259
|
+
function AnalyticsFinancialStats({ tenantKey, currentSPA, mentorId, selectedMentorId, userId, onOpenTranscript, }) {
|
|
231081
231260
|
var _a, _b;
|
|
231082
231261
|
const t = useT();
|
|
231083
231262
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
@@ -231106,9 +231285,9 @@ function AnalyticsFinancialStats({ tenantKey, mentorId, selectedMentorId, userId
|
|
|
231106
231285
|
}, className: cn('relative h-[38px] cursor-pointer whitespace-nowrap px-px text-sm transition-colors', active
|
|
231107
231286
|
? 'font-semibold text-[#484848]'
|
|
231108
231287
|
: 'font-medium text-gray-500 hover:text-gray-700'), children: [tab.label, active && (jsx("span", { className: "absolute inset-x-0 -bottom-px h-0.5 rounded-sm bg-blue-600" }))] }, tab.value));
|
|
231109
|
-
}) }), subTab === 'spend' && (jsx(SpendTab, { tenantKey: tenantKey, mentorId: currentMentorId, userId: currentUserId, onOpenUserTraces: openUserTraces })), subTab === 'usage' && (jsx(AnalyticsLlmUsageStats, { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters })), subTab === 'traces' && (jsx(AnalyticsTraces
|
|
231288
|
+
}) }), subTab === 'spend' && (jsx(SpendTab, { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: currentMentorId, userId: currentUserId, onOpenUserTraces: openUserTraces })), subTab === 'usage' && (jsx(AnalyticsLlmUsageStats, { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters })), subTab === 'traces' && (jsx(AnalyticsTraces
|
|
231110
231289
|
// Remount when the hand-off user changes so the seeded filter takes.
|
|
231111
|
-
, { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters, onOpenTranscript: onOpenTranscript, initialUsername: tracesUsername || undefined }, tracesUsername || 'all'))] }));
|
|
231290
|
+
, { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: currentMentorId, filters: llmFilters, onOpenTranscript: onOpenTranscript, initialUsername: tracesUsername || undefined }, tracesUsername || 'all'))] }));
|
|
231112
231291
|
}
|
|
231113
231292
|
|
|
231114
231293
|
const useTranscripts = ({ tenantKey, mentorId, usergroupIds, }) => {
|
|
@@ -231186,6 +231365,37 @@ const useTranscripts = ({ tenantKey, mentorId, usergroupIds, }) => {
|
|
|
231186
231365
|
};
|
|
231187
231366
|
};
|
|
231188
231367
|
|
|
231368
|
+
/**
|
|
231369
|
+
* An agent named in a stats row, clickable to re-scope the whole analytics
|
|
231370
|
+
* page to that agent — the same thing the control bar's picker does, reached
|
|
231371
|
+
* from the data instead of from a search box.
|
|
231372
|
+
*
|
|
231373
|
+
* It renders as plain text wherever re-scoping is impossible or pointless: on
|
|
231374
|
+
* per-agent pages (no picker, so nothing would visibly change), and on rows
|
|
231375
|
+
* whose agent the payload identifies by name alone. Safe inside clickable rows
|
|
231376
|
+
* and cards — neither its clicks nor its key presses reach their handlers.
|
|
231377
|
+
*/
|
|
231378
|
+
function AgentScopeLink({ uniqueId, name, fallback = '-', onScoped, className, testId, }) {
|
|
231379
|
+
const t = useT();
|
|
231380
|
+
const setScopedMentor = useAnalyticsScopeSetter();
|
|
231381
|
+
const { scopedMentor } = useAnalyticsScope();
|
|
231382
|
+
const display = name || uniqueId || fallback;
|
|
231383
|
+
if (!setScopedMentor || !uniqueId) {
|
|
231384
|
+
return (jsx("span", { className: className, "data-testid": testId, children: display }));
|
|
231385
|
+
}
|
|
231386
|
+
const isCurrent = (scopedMentor === null || scopedMentor === void 0 ? void 0 : scopedMentor.uniqueId) === uniqueId;
|
|
231387
|
+
return (jsx("button", { type: "button", onClick: (event) => {
|
|
231388
|
+
event.stopPropagation();
|
|
231389
|
+
// No `dbId`: these payloads carry the `unique_id` only. AnalyticsLayout
|
|
231390
|
+
// resolves the rest before the scope reaches anyone — see
|
|
231391
|
+
// AnalyticsScopedMentor.
|
|
231392
|
+
setScopedMentor({ uniqueId, name: name || uniqueId });
|
|
231393
|
+
onScoped === null || onScoped === void 0 ? void 0 : onScoped();
|
|
231394
|
+
},
|
|
231395
|
+
// Rows that open on Enter/Space would otherwise swallow the key press.
|
|
231396
|
+
onKeyDown: (event) => event.stopPropagation(), className: cn('max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none', isCurrent && 'font-medium text-blue-600', className), "aria-label": t('analyticsAgentScopeLink.scopeToAgent', { name: display }), "aria-current": isCurrent ? 'true' : undefined, "data-testid": testId, children: display }));
|
|
231397
|
+
}
|
|
231398
|
+
|
|
231189
231399
|
/**
|
|
231190
231400
|
* Attachments on a transcript turn. A turn can carry files with no text at
|
|
231191
231401
|
* all (an uploaded image and nothing else), so the bubble renders these even
|
|
@@ -231245,8 +231455,8 @@ const getMessageContent = (content) => {
|
|
|
231245
231455
|
* name / username stand in behind it.
|
|
231246
231456
|
*/
|
|
231247
231457
|
const identifyUser = (...candidates) => candidates.find((candidate) => !!candidate) || '-';
|
|
231248
|
-
function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, usergroupIds, }) {
|
|
231249
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
231458
|
+
function AnalyticsTranscriptsStats({ tenantKey, currentSPA, mentorId, selectedMentorId, usergroupIds, }) {
|
|
231459
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
231250
231460
|
const t = useT();
|
|
231251
231461
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
231252
231462
|
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
@@ -231355,14 +231565,14 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
|
|
|
231355
231565
|
};
|
|
231356
231566
|
// Transcript Detail Component (reusable for both desktop and mobile)
|
|
231357
231567
|
const TranscriptDetail = ({ className = '' }) => {
|
|
231358
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
231568
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
231359
231569
|
return (jsx("div", { className: cn('h-full flex flex-col', className), children: !selectedTranscript ? (jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(ArrowLeft, { className: "h-6 w-6 mx-auto mb-2" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.selectConversation') })] }) })) : isLoadingTranscriptsMessagesDetailsData ? (
|
|
231360
231570
|
/* Loading state */
|
|
231361
231571
|
jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-3", "aria-hidden": "true" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.loadingTranscript') })] }) })) : isErrorTranscriptsMessagesDetailsData || !transcriptsMessagesDetailsData ? (
|
|
231362
231572
|
/* Error or no data state */
|
|
231363
231573
|
jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(X$1, { className: "h-6 w-6 mx-auto mb-2 text-red-400" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noTranscriptDetails') }), jsx("p", { className: "text-sm mt-1", children: t('analyticsAnalyticsTranscriptsStats.unableToLoadTranscript') })] }) })) : (
|
|
231364
231574
|
/* Data loaded successfully */
|
|
231365
|
-
jsxs(Fragment$1, { children: [jsxs("div", { className: "mb-4 flex-shrink-0", children: [jsx("h2", { className: "text-lg font-semibold mb-2", children: t('analyticsAnalyticsTranscriptsStats.conversationTranscript') }), jsxs("div", { className: "text-sm text-gray-500", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ',
|
|
231575
|
+
jsxs(Fragment$1, { children: [jsxs("div", { className: "mb-4 flex-shrink-0", children: [jsx("h2", { className: "text-lg font-semibold mb-2", children: t('analyticsAnalyticsTranscriptsStats.conversationTranscript') }), jsxs("div", { className: "text-sm text-gray-500", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_a = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _a === void 0 ? void 0 : _a.username, display: identifyUser((_b = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _b === void 0 ? void 0 : _b.email, (_c = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _c === void 0 ? void 0 : _c.name) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_d = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _d === void 0 ? void 0 : _d.username, display: identifyUser((_e = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _e === void 0 ? void 0 : _e.email, (_f = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _f === void 0 ? void 0 : _f.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: (_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _g === void 0 ? void 0 : _g.mentor_unique_id, name: (_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _h === void 0 ? void 0 : _h.mentor })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_j = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _j === void 0 ? void 0 : _j.model) || '-'] })] })] }), jsx("div", { className: "flex-1 overflow-y-auto space-y-4 min-h-0", children: ((_k = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _k === void 0 ? void 0 : _k.length) > 0 ? ((_l = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _l === void 0 ? void 0 : _l.map((message, index) => {
|
|
231366
231576
|
var _a, _b;
|
|
231367
231577
|
return (jsxs(React__default.Fragment, { children: [((message === null || message === void 0 ? void 0 : message.human) || !!((_a = message === null || message === void 0 ? void 0 : message.human_files) === null || _a === void 0 ? void 0 : _a.length)) && (jsxs("div", { className: `p-3 rounded-lg bg-blue-100 ml-4`, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleUser') }) }), message.human && (jsx("p", { className: "text-sm", children: getMessageContent(message.human) })), jsx(TranscriptFiles, { files: message.human_files })] }, `${index}-human`)), ((message === null || message === void 0 ? void 0 : message.ai) || !!((_b = message === null || message === void 0 ? void 0 : message.ai_files) === null || _b === void 0 ? void 0 : _b.length)) && (jsxs("div", { className: `p-3 rounded-lg bg-white mr-4`, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleAgent') }) }), message.ai && jsx(Markdown, { children: getMessageContent(message.ai) }), jsx(TranscriptFiles, { files: message.ai_files })] }, `${index}-ai`))] }, index));
|
|
231368
231578
|
})) : (jsx("div", { className: "text-center text-gray-500 py-8", children: jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noMessages') }) })) })] })) }));
|
|
@@ -231386,7 +231596,7 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
|
|
|
231386
231596
|
? t('analyticsAnalyticsTranscriptsStats.sentimentNegative')
|
|
231387
231597
|
: transcript.sentiment === 'positive'
|
|
231388
231598
|
? t('analyticsAnalyticsTranscriptsStats.sentimentPositive')
|
|
231389
|
-
: t('analyticsAnalyticsTranscriptsStats.sentimentNeutral'), ' ', t('analyticsAnalyticsTranscriptsStats.userSentiment')] })] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUser'), ' ', identifyUser(transcript === null || transcript === void 0 ? void 0 : transcript.email, transcript === null || transcript === void 0 ? void 0 : transcript.name, transcript === null || transcript === void 0 ? void 0 : transcript.username)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', (transcript === null || transcript === void 0 ? void 0 : transcript.
|
|
231599
|
+
: t('analyticsAnalyticsTranscriptsStats.sentimentNeutral'), ' ', t('analyticsAnalyticsTranscriptsStats.userSentiment')] })] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUser'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: transcript === null || transcript === void 0 ? void 0 : transcript.username, display: identifyUser(transcript === null || transcript === void 0 ? void 0 : transcript.email, transcript === null || transcript === void 0 ? void 0 : transcript.name, transcript === null || transcript === void 0 ? void 0 : transcript.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: transcript === null || transcript === void 0 ? void 0 : transcript.mentor_unique_id, name: transcript === null || transcript === void 0 ? void 0 : transcript.mentor })] })] }), jsx("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModelCard'), ' ', (transcript === null || transcript === void 0 ? void 0 : transcript.model) || '-'] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500", children: [jsxs("div", { children: [transcript.message_count, " ", t('analyticsAnalyticsTranscriptsStats.messages')] }), jsx("div", { children: "\u2022" }), jsxs("div", { children: ["$", Number((transcript === null || transcript === void 0 ? void 0 : transcript.cost) || 0).toFixed(2), ' ', t('analyticsAnalyticsTranscriptsStats.estimatedCost')] }), (transcript === null || transcript === void 0 ? void 0 : transcript.created_at) && (jsxs(Fragment$1, { children: [jsx("div", { children: "\u2022" }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.created'), ' ', formatRelativeTime(transcript.created_at, t)] })] }))] })] }, transcript.session));
|
|
231390
231600
|
})) : (
|
|
231391
231601
|
// Empty state
|
|
231392
231602
|
jsx("div", { className: "text-center py-12", children: jsx("p", { className: "text-gray-500", children: filters.topicSearch || filters.userSearch || filters.rating
|
|
@@ -231422,7 +231632,7 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
|
|
|
231422
231632
|
/* Error or no data state */
|
|
231423
231633
|
jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(X$1, { className: "h-6 w-6 mx-auto mb-2 text-red-400" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noTranscriptDetails') }), jsx("p", { className: "text-sm mt-1", children: t('analyticsAnalyticsTranscriptsStats.unableToLoadTranscript') })] }) })) : (
|
|
231424
231634
|
/* Data loaded successfully */
|
|
231425
|
-
jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "mb-4", children: jsxs("div", { className: "text-sm text-gray-500 space-y-1", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ',
|
|
231635
|
+
jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "mb-4", children: jsxs("div", { className: "text-sm text-gray-500 space-y-1", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _g === void 0 ? void 0 : _g.username, display: identifyUser((_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _h === void 0 ? void 0 : _h.email, (_j = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _j === void 0 ? void 0 : _j.name) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_k = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _k === void 0 ? void 0 : _k.username, display: identifyUser((_l = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _l === void 0 ? void 0 : _l.email, (_m = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _m === void 0 ? void 0 : _m.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: (_o = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _o === void 0 ? void 0 : _o.mentor_unique_id, name: (_p = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _p === void 0 ? void 0 : _p.mentor })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_q = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _q === void 0 ? void 0 : _q.model) || '-'] })] }) }), jsx("div", { className: "space-y-4 pb-4", children: ((_r = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _r === void 0 ? void 0 : _r.length) > 0 ? ((_s = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _s === void 0 ? void 0 : _s.map((message, index) => {
|
|
231426
231636
|
var _a, _b;
|
|
231427
231637
|
return (jsxs(React__default.Fragment, { children: [((message === null || message === void 0 ? void 0 : message.human) || !!((_a = message === null || message === void 0 ? void 0 : message.human_files) === null || _a === void 0 ? void 0 : _a.length)) && (jsxs("div", { className: "p-3 rounded-lg bg-blue-100 ml-4", children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleUser') }) }), message.human && (jsx("p", { className: "text-sm", children: getMessageContent(message.human) })), jsx(TranscriptFiles, { files: message.human_files })] })), ((message === null || message === void 0 ? void 0 : message.ai) || !!((_b = message === null || message === void 0 ? void 0 : message.ai_files) === null || _b === void 0 ? void 0 : _b.length)) && (jsxs("div", { className: "p-3 rounded-lg bg-white mr-4 border", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleAgent') }) }), message.ai && jsx(Markdown, { children: getMessageContent(message.ai) }), jsx(TranscriptFiles, { files: message.ai_files })] }))] }, index));
|
|
231428
231638
|
})) : (jsx("div", { className: "text-center text-gray-500 py-8", children: jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noMessages') }) })) })] })) })] }) }))] }));
|
|
@@ -232439,6 +232649,8 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
|
|
|
232439
232649
|
mentor_unique_id: mentorId,
|
|
232440
232650
|
limit: coursesListLimit,
|
|
232441
232651
|
page: coursesListPage,
|
|
232652
|
+
// Busiest courses first — this list reads as a leaderboard.
|
|
232653
|
+
sort_by: 'active_enrollments',
|
|
232442
232654
|
...(debouncedSearch && { search: debouncedSearch }),
|
|
232443
232655
|
});
|
|
232444
232656
|
}, [
|
|
@@ -232477,11 +232689,31 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
|
|
|
232477
232689
|
debouncedCourseEnrollmentsSearch,
|
|
232478
232690
|
]);
|
|
232479
232691
|
// Query for courses list and summary
|
|
232480
|
-
const { data: contentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
|
|
232692
|
+
const { data: contentAnalyticsData, currentData: currentContentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
|
|
232481
232693
|
// Query for course details (only when courseId is provided)
|
|
232482
|
-
const { data: courseDetailsData, isLoading: isLoadingCourseDetails, isFetching: isFetchingCourseDetails, } = useGetContentAnalyticsDetailsQuery(courseDetailsParams, {
|
|
232694
|
+
const { data: courseDetailsData, currentData: currentCourseDetailsData, isLoading: isLoadingCourseDetails, isFetching: isFetchingCourseDetails, } = useGetContentAnalyticsDetailsQuery(courseDetailsParams, {
|
|
232483
232695
|
skip: !courseDetailsParams,
|
|
232484
232696
|
});
|
|
232697
|
+
// Searching the table re-runs the one request the summary cards and the chart
|
|
232698
|
+
// also read from. RTK keeps the previous arguments' response in `data` while
|
|
232699
|
+
// the new one is in flight, so those sections never blank mid-search — but
|
|
232700
|
+
// `currentData` alone can't tell a search apart from an agent or date change,
|
|
232701
|
+
// which those sections *do* vary with. Comparing their own inputs does: while
|
|
232702
|
+
// they differ from the last settled response, the sections report loading
|
|
232703
|
+
// rather than showing the previous scope's numbers with nothing saying so.
|
|
232704
|
+
const statsKey = JSON.stringify({ tenantKey, mentorId, enrollmentStatsDateFilter });
|
|
232705
|
+
const settledStatsKey = React__default.useRef(statsKey);
|
|
232706
|
+
if (currentContentAnalyticsData)
|
|
232707
|
+
settledStatsKey.current = statsKey;
|
|
232708
|
+
const detailStatsKey = JSON.stringify({
|
|
232709
|
+
courseId,
|
|
232710
|
+
tenantKey,
|
|
232711
|
+
mentorId,
|
|
232712
|
+
timeSpentStatsDateFilter,
|
|
232713
|
+
});
|
|
232714
|
+
const settledDetailStatsKey = React__default.useRef(detailStatsKey);
|
|
232715
|
+
if (currentCourseDetailsData)
|
|
232716
|
+
settledDetailStatsKey.current = detailStatsKey;
|
|
232485
232717
|
// Map content analytics data to courseStats
|
|
232486
232718
|
const courseStats = useMemo(() => {
|
|
232487
232719
|
if (!contentAnalyticsData) {
|
|
@@ -232576,8 +232808,21 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
|
|
|
232576
232808
|
isFetchingContentAnalytics ||
|
|
232577
232809
|
isLoadingCourseDetails ||
|
|
232578
232810
|
isFetchingCourseDetails;
|
|
232811
|
+
// Loading for the sections that don't vary with the table search — see
|
|
232812
|
+
// `statsKey` above for why the key comparison is what distinguishes a search
|
|
232813
|
+
// from a change those sections do have to redraw for.
|
|
232814
|
+
const isStatsLoading = isLoadingContentAnalytics ||
|
|
232815
|
+
(isFetchingContentAnalytics &&
|
|
232816
|
+
currentContentAnalyticsData === undefined &&
|
|
232817
|
+
settledStatsKey.current !== statsKey);
|
|
232818
|
+
const isDetailStatsLoading = isLoadingCourseDetails ||
|
|
232819
|
+
(isFetchingCourseDetails &&
|
|
232820
|
+
currentCourseDetailsData === undefined &&
|
|
232821
|
+
settledDetailStatsKey.current !== detailStatsKey);
|
|
232579
232822
|
return {
|
|
232580
232823
|
courseStats,
|
|
232824
|
+
isStatsLoading,
|
|
232825
|
+
isDetailStatsLoading,
|
|
232581
232826
|
isLoading,
|
|
232582
232827
|
enrollmentStats,
|
|
232583
232828
|
enrollmentStatsDateFilter,
|
|
@@ -232626,30 +232871,40 @@ const formatSecondsToTime$1 = (seconds) => {
|
|
|
232626
232871
|
const formatSecondsToHours$1 = (seconds) => {
|
|
232627
232872
|
return Math.round((seconds / 3600) * 10) / 10;
|
|
232628
232873
|
};
|
|
232629
|
-
function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = '', }) {
|
|
232874
|
+
function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = '', getCourseURL, }) {
|
|
232630
232875
|
var _a, _b, _c;
|
|
232631
232876
|
const t = useT();
|
|
232632
232877
|
const router = useRouter();
|
|
232633
232878
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
232634
|
-
const { courseStats, isLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, coursesList, setCoursesListPage, coursesListSearch, handleSearchInputChange, coursesPagination, } = useCourses({ tenantKey, mentorId: currentMentorId });
|
|
232879
|
+
const { courseStats, isLoading, isStatsLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, coursesList, setCoursesListPage, coursesListSearch, handleSearchInputChange, coursesPagination, } = useCourses({ tenantKey, mentorId: currentMentorId });
|
|
232635
232880
|
const handleCourseClick = (courseId) => {
|
|
232636
232881
|
router.push(`${basePath}/courses/${courseId}`);
|
|
232637
232882
|
};
|
|
232638
232883
|
const hasEnrollmentStatsPoints = Number((_a = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _a === void 0 ? void 0 : _a.length) > 0;
|
|
232639
|
-
return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading:
|
|
232884
|
+
return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.activeCourses'), value: courseStats.active_courses, percentage: courseStats.active_courses_percentage, description: t('analyticsAnalyticsCourses.activeCoursesDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.totalCourses'), value: courseStats.total_courses, percentage: courseStats.total_courses_percentage, description: t('analyticsAnalyticsCourses.totalCoursesDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.enrollments'), value: courseStats.enrollments, percentage: courseStats.enrollments_percentage, description: t('analyticsAnalyticsCourses.enrollmentsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.totalLearners'), value: courseStats.total_learners,
|
|
232640
232885
|
//percentage={courseStats.enrollments_percentage}
|
|
232641
|
-
description: t('analyticsAnalyticsCourses.totalLearnersDescription') })] }), (
|
|
232886
|
+
description: t('analyticsAnalyticsCourses.totalLearnersDescription') })] }), (isStatsLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsCourses.courseOvertime'), label: t('analyticsAnalyticsCourses.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsCourses.courseOvertimeDescription'), children: isStatsLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
|
|
232642
232887
|
date: formatDateToShortFormat$1(point.date, enrollmentStatsDateFilter.activeFilter === 'today'),
|
|
232643
232888
|
value: formatSecondsToHours$1(point.value),
|
|
232644
232889
|
rawSeconds: point.value,
|
|
232645
|
-
}))) || [], tooltipLabel: t('analyticsAnalyticsCourses.tooltipTimeSpentLabel'), tooltipValue: (point) => formatSecondsToTime$1(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsCourses.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourses.coursesTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourses.coursesHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourses.coursesHeading'), description: t('analyticsAnalyticsCourses.coursesTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-course", type: "text", placeholder: t('analyticsAnalyticsCourses.searchPlaceholder'), value: coursesListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourses.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourses.loading') }) })) : ((_c = coursesList === null || coursesList === void 0 ? void 0 : coursesList.courses) === null || _c === void 0 ? void 0 : _c.length) && coursesList.courses.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourses.colEnrollments') })] }) }), jsx(TableBody, { children: coursesList.courses.map((course, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
232646
|
-
|
|
232647
|
-
|
|
232648
|
-
|
|
232649
|
-
|
|
232650
|
-
|
|
232651
|
-
|
|
232652
|
-
|
|
232890
|
+
}))) || [], tooltipLabel: t('analyticsAnalyticsCourses.tooltipTimeSpentLabel'), tooltipValue: (point) => formatSecondsToTime$1(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsCourses.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourses.coursesTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourses.coursesHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourses.coursesHeading'), description: t('analyticsAnalyticsCourses.coursesTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-course", type: "text", placeholder: t('analyticsAnalyticsCourses.searchPlaceholder'), value: coursesListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourses.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourses.loading') }) })) : ((_c = coursesList === null || coursesList === void 0 ? void 0 : coursesList.courses) === null || _c === void 0 ? void 0 : _c.length) && coursesList.courses.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourses.colEnrollments') })] }) }), jsx(TableBody, { children: coursesList.courses.map((course, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
232891
|
+
// Mouse shortcut only; the id cell may hold a link,
|
|
232892
|
+
// so the row itself must not be a button —
|
|
232893
|
+
// interactive content inside one is invalid, and
|
|
232894
|
+
// the row's label would rename the link. Keyboard
|
|
232895
|
+
// and screen-reader users open the detail page
|
|
232896
|
+
// through the course name below.
|
|
232897
|
+
onClick: () => handleCourseClick(course.id), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("button", { type: "button", className: "max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", onClick: (e) => {
|
|
232898
|
+
e.stopPropagation();
|
|
232899
|
+
handleCourseClick(course.id);
|
|
232900
|
+
}, "aria-label": t('analyticsAnalyticsCourses.viewCourseAriaLabel', {
|
|
232901
|
+
name: course.name,
|
|
232902
|
+
}), children: course.name }) }), jsx(TableCell, { className: "text-muted-foreground", children: getCourseURL ? (jsx("a", { href: getCourseURL(course.id), target: "_blank", rel: "noopener noreferrer",
|
|
232903
|
+
// The row navigates to the analytics detail
|
|
232904
|
+
// page; this link goes to the course itself.
|
|
232905
|
+
onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), className: "cursor-pointer hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", "aria-label": t('analyticsAnalyticsCourses.openCourseAriaLabel', {
|
|
232906
|
+
id: course.id,
|
|
232907
|
+
}), children: course.id })) : (course.id) }), jsx(TableCell, { className: "text-right", children: course.enrollments.toLocaleString() })] }, course.id))) })] }) }), coursesPagination && coursesPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.current_page - 1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: coursesPagination.total_pages }, (_, i) => i + 1)
|
|
232653
232908
|
.filter((page) => {
|
|
232654
232909
|
const current = coursesPagination.current_page;
|
|
232655
232910
|
const total = coursesPagination.total_pages;
|
|
@@ -232668,11 +232923,11 @@ function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = ''
|
|
|
232668
232923
|
}), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.current_page + 1), disabled: coursesPagination.current_page === coursesPagination.total_pages, "aria-label": t('analyticsAnalyticsCourses.goToNextPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToNextPage') }), jsx(ChevronRight, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.total_pages), disabled: coursesPagination.current_page === coursesPagination.total_pages, "aria-label": t('analyticsAnalyticsCourses.goToLastPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToLastPage') }), jsx(ChevronsRight, { className: "h-4 w-4" })] })] }))] })) : (jsx(EmptyStats, { title: t('analyticsAnalyticsCourses.noCoursesAvailable') }))] })] }) }) })] }));
|
|
232669
232924
|
}
|
|
232670
232925
|
|
|
232671
|
-
function AnalyticsCourseDetail({ tenantKey, mentorId, selectedMentorId, courseId, courseName, showCourseTitle = true, onBack, }) {
|
|
232926
|
+
function AnalyticsCourseDetail({ tenantKey, currentSPA, mentorId, selectedMentorId, courseId, courseName, showCourseTitle = true, onBack, }) {
|
|
232672
232927
|
var _a, _b;
|
|
232673
232928
|
const t = useT();
|
|
232674
232929
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
232675
|
-
const { courseDetailStats, isLoading, courseEnrollments, courseEnrollmentsSearch, handleCourseEnrollmentsSearchInputChange, setCourseEnrollmentsPage, courseEnrollmentsPagination, courseInfo, } = useCourses({
|
|
232930
|
+
const { courseDetailStats, isLoading, isDetailStatsLoading, courseEnrollments, courseEnrollmentsSearch, handleCourseEnrollmentsSearchInputChange, setCourseEnrollmentsPage, courseEnrollmentsPagination, courseInfo, } = useCourses({
|
|
232676
232931
|
tenantKey,
|
|
232677
232932
|
mentorId: currentMentorId,
|
|
232678
232933
|
courseId,
|
|
@@ -232680,17 +232935,23 @@ function AnalyticsCourseDetail({ tenantKey, mentorId, selectedMentorId, courseId
|
|
|
232680
232935
|
const [selectedEnrollment, setSelectedEnrollment] = useState(null);
|
|
232681
232936
|
const resolvedCourseName = courseName || (courseInfo === null || courseInfo === void 0 ? void 0 : courseInfo.name);
|
|
232682
232937
|
const showTitle = showCourseTitle && !!resolvedCourseName;
|
|
232683
|
-
return (jsxs("div", { className: "space-y-8", children: [(onBack || showTitle) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsCourseDetail.goBackAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), showTitle && (jsx("h2", { className: "flex-1 text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedCourseName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsx(StatCard, { loading:
|
|
232684
|
-
courseEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnLastActiveOn') })] }) }), jsx(TableBody, { children: courseEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
232685
|
-
|
|
232686
|
-
|
|
232687
|
-
|
|
232688
|
-
|
|
232689
|
-
}, "aria-label": t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', { name: enrollment.name }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
|
|
232938
|
+
return (jsxs("div", { className: "space-y-8", children: [(onBack || showTitle) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsCourseDetail.goBackAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), showTitle && (jsx("h2", { className: "flex-1 text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedCourseName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsCourseDetail.activeEnrollments'), value: courseDetailStats.active_enrollments, percentage: courseDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.activeEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsCourseDetail.completedEnrollments'), value: courseDetailStats.completed_enrollments, percentage: courseDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.completedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourseDetail.courseEnrollmentsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourseDetail.enrolledUsers') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourseDetail.enrolledUsers'), description: t('analyticsAnalyticsCourseDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsCourseDetail.searchPlaceholder'), value: courseEnrollmentsSearch, onChange: handleCourseEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourseDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourseDetail.loadingLabel') }) })) : ((_a = courseEnrollments === null || courseEnrollments === void 0 ? void 0 : courseEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
|
|
232939
|
+
courseEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnLastActiveOn') }), jsx(TableHead, { className: "w-[1%] text-right whitespace-nowrap", children: t('analyticsAnalyticsCourseDetail.columnProgress') })] }) }), jsx(TableBody, { children: courseEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
232940
|
+
// Mouse shortcut only; the name and email cells hold profile
|
|
232941
|
+
// links, so keyboard and screen-reader users reach the
|
|
232942
|
+
// progress modal through the Progress column's button.
|
|
232943
|
+
onClick: () => setSelectedEnrollment(enrollment), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.name })) }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.email })) }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
|
|
232690
232944
|
? new Date(enrollment.enrollment_date).toLocaleDateString()
|
|
232691
232945
|
: '—' }), jsx(TableCell, { className: "text-right", children: enrollment.last_active_on
|
|
232692
232946
|
? new Date(enrollment.last_active_on).toLocaleDateString()
|
|
232693
|
-
: '—' })
|
|
232947
|
+
: '—' }), jsx(TableCell, { className: "text-right", children: jsx(Button$1, { variant: "ghost", size: "icon", className: "h-8 w-8 text-gray-500 hover:text-blue-600", onClick: (e) => {
|
|
232948
|
+
e.stopPropagation();
|
|
232949
|
+
setSelectedEnrollment(enrollment);
|
|
232950
|
+
}, "aria-label": t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', {
|
|
232951
|
+
name: enrollment.name || enrollment.email,
|
|
232952
|
+
}), title: t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', {
|
|
232953
|
+
name: enrollment.name || enrollment.email,
|
|
232954
|
+
}), children: jsx(TrendingUp, { className: "h-4 w-4", "aria-hidden": "true" }) }) })] }, index))) })] }) }), courseEnrollmentsPagination && courseEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(courseEnrollmentsPagination.current_page - 1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: courseEnrollmentsPagination.total_pages }, (_, i) => i + 1)
|
|
232694
232955
|
.filter((page) => {
|
|
232695
232956
|
const current = courseEnrollmentsPagination.current_page;
|
|
232696
232957
|
const total = courseEnrollmentsPagination.total_pages;
|
|
@@ -232785,6 +233046,8 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
|
|
|
232785
233046
|
mentor_unique_id: mentorId,
|
|
232786
233047
|
limit: programsListLimit,
|
|
232787
233048
|
page: programsListPage,
|
|
233049
|
+
// Busiest programs first — this list reads as a leaderboard.
|
|
233050
|
+
sort_by: 'active_enrollments',
|
|
232788
233051
|
...(debouncedSearch && { search: debouncedSearch }),
|
|
232789
233052
|
});
|
|
232790
233053
|
}, [
|
|
@@ -232825,11 +233088,31 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
|
|
|
232825
233088
|
debouncedProgramEnrollmentsSearch,
|
|
232826
233089
|
]);
|
|
232827
233090
|
// Query for programs list and summary
|
|
232828
|
-
const { data: contentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
|
|
233091
|
+
const { data: contentAnalyticsData, currentData: currentContentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
|
|
232829
233092
|
// Query for program details (only when programId is provided)
|
|
232830
|
-
const { data: programDetailsData, isLoading: isLoadingProgramDetails, isFetching: isFetchingProgramDetails, } = useGetContentAnalyticsDetailsQuery(programDetailsParams, {
|
|
233093
|
+
const { data: programDetailsData, currentData: currentProgramDetailsData, isLoading: isLoadingProgramDetails, isFetching: isFetchingProgramDetails, } = useGetContentAnalyticsDetailsQuery(programDetailsParams, {
|
|
232831
233094
|
skip: !programDetailsParams,
|
|
232832
233095
|
});
|
|
233096
|
+
// Searching the table re-runs the one request the summary cards and the chart
|
|
233097
|
+
// also read from. RTK keeps the previous arguments' response in `data` while
|
|
233098
|
+
// the new one is in flight, so those sections never blank mid-search — but
|
|
233099
|
+
// `currentData` alone can't tell a search apart from an agent or date change,
|
|
233100
|
+
// which those sections *do* vary with. Comparing their own inputs does: while
|
|
233101
|
+
// they differ from the last settled response, the sections report loading
|
|
233102
|
+
// rather than showing the previous scope's numbers with nothing saying so.
|
|
233103
|
+
const statsKey = JSON.stringify({ tenantKey, mentorId, enrollmentStatsDateFilter });
|
|
233104
|
+
const settledStatsKey = React__default.useRef(statsKey);
|
|
233105
|
+
if (currentContentAnalyticsData)
|
|
233106
|
+
settledStatsKey.current = statsKey;
|
|
233107
|
+
const detailStatsKey = JSON.stringify({
|
|
233108
|
+
programId,
|
|
233109
|
+
tenantKey,
|
|
233110
|
+
mentorId,
|
|
233111
|
+
timeSpentStatsDateFilter,
|
|
233112
|
+
});
|
|
233113
|
+
const settledDetailStatsKey = React__default.useRef(detailStatsKey);
|
|
233114
|
+
if (currentProgramDetailsData)
|
|
233115
|
+
settledDetailStatsKey.current = detailStatsKey;
|
|
232833
233116
|
// Map content analytics data to programStats
|
|
232834
233117
|
const programStats = useMemo(() => {
|
|
232835
233118
|
if (!contentAnalyticsData) {
|
|
@@ -232869,6 +233152,7 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
|
|
|
232869
233152
|
id: program.id,
|
|
232870
233153
|
name: program.name,
|
|
232871
233154
|
enrollments: program.analytics.enrollments || 0,
|
|
233155
|
+
program_id: program.program_id,
|
|
232872
233156
|
})),
|
|
232873
233157
|
total: contentAnalyticsData.pagination.count,
|
|
232874
233158
|
};
|
|
@@ -232924,8 +233208,21 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
|
|
|
232924
233208
|
isFetchingContentAnalytics ||
|
|
232925
233209
|
isLoadingProgramDetails ||
|
|
232926
233210
|
isFetchingProgramDetails;
|
|
233211
|
+
// Loading for the sections that don't vary with the table search — see
|
|
233212
|
+
// `statsKey` above for why the key comparison is what distinguishes a search
|
|
233213
|
+
// from a change those sections do have to redraw for.
|
|
233214
|
+
const isStatsLoading = isLoadingContentAnalytics ||
|
|
233215
|
+
(isFetchingContentAnalytics &&
|
|
233216
|
+
currentContentAnalyticsData === undefined &&
|
|
233217
|
+
settledStatsKey.current !== statsKey);
|
|
233218
|
+
const isDetailStatsLoading = isLoadingProgramDetails ||
|
|
233219
|
+
(isFetchingProgramDetails &&
|
|
233220
|
+
currentProgramDetailsData === undefined &&
|
|
233221
|
+
settledDetailStatsKey.current !== detailStatsKey);
|
|
232927
233222
|
return {
|
|
232928
233223
|
programStats,
|
|
233224
|
+
isStatsLoading,
|
|
233225
|
+
isDetailStatsLoading,
|
|
232929
233226
|
isLoading,
|
|
232930
233227
|
enrollmentStats,
|
|
232931
233228
|
enrollmentStatsDateFilter,
|
|
@@ -232974,30 +233271,40 @@ const formatSecondsToTime = (seconds) => {
|
|
|
232974
233271
|
const formatSecondsToHours = (seconds) => {
|
|
232975
233272
|
return Math.round((seconds / 3600) * 10) / 10;
|
|
232976
233273
|
};
|
|
232977
|
-
function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '', }) {
|
|
233274
|
+
function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '', getProgramURL, }) {
|
|
232978
233275
|
var _a, _b, _c;
|
|
232979
233276
|
const t = useT();
|
|
232980
233277
|
const router = useRouter();
|
|
232981
233278
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
232982
|
-
const { programStats, isLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, programsList, setProgramsListPage, programsListSearch, handleSearchInputChange, programsPagination, } = usePrograms({ tenantKey, mentorId: currentMentorId });
|
|
233279
|
+
const { programStats, isLoading, isStatsLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, programsList, setProgramsListPage, programsListSearch, handleSearchInputChange, programsPagination, } = usePrograms({ tenantKey, mentorId: currentMentorId });
|
|
232983
233280
|
const handleProgramClick = (programId) => {
|
|
232984
233281
|
router.push(`${basePath}/programs/${programId}`);
|
|
232985
233282
|
};
|
|
232986
233283
|
const hasEnrollmentStatsPoints = Number((_a = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _a === void 0 ? void 0 : _a.length) > 0;
|
|
232987
|
-
return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading:
|
|
233284
|
+
return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.activePrograms'), value: programStats.active_programs, percentage: programStats.active_programs_percentage, description: t('analyticsAnalyticsPrograms.activeProgramsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.totalPrograms'), value: programStats.total_programs, percentage: programStats.total_programs_percentage, description: t('analyticsAnalyticsPrograms.totalProgramsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.enrollments'), value: programStats.enrollments, percentage: programStats.enrollments_percentage, description: t('analyticsAnalyticsPrograms.enrollmentsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.totalLearners'), value: programStats.total_learners,
|
|
232988
233285
|
//percentage={programStats.enrollments_percentage}
|
|
232989
|
-
description: t('analyticsAnalyticsPrograms.totalLearnersDescription') })] }), (
|
|
233286
|
+
description: t('analyticsAnalyticsPrograms.totalLearnersDescription') })] }), (isStatsLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsPrograms.programOvertime'), label: t('analyticsAnalyticsPrograms.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsPrograms.programOvertimeDescription'), children: isStatsLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
|
|
232990
233287
|
date: formatDateToShortFormat(point.date, enrollmentStatsDateFilter.activeFilter === 'today'),
|
|
232991
233288
|
value: formatSecondsToHours(point.value),
|
|
232992
233289
|
rawSeconds: point.value,
|
|
232993
|
-
}))) || [], tooltipLabel: t('analyticsAnalyticsPrograms.timeSpent'), tooltipValue: (point) => formatSecondsToTime(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsPrograms.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsPrograms.programsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsPrograms.programs') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsPrograms.programs'), description: t('analyticsAnalyticsPrograms.programsTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-program", type: "text", placeholder: t('analyticsAnalyticsPrograms.searchPlaceholder'), value: programsListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsPrograms.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsPrograms.loading') }) })) : ((_c = programsList === null || programsList === void 0 ? void 0 : programsList.programs) === null || _c === void 0 ? void 0 : _c.length) && programsList.programs.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsPrograms.enrollments') })] }) }), jsx(TableBody, { children: programsList.programs.map((program, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
232994
|
-
|
|
232995
|
-
|
|
232996
|
-
|
|
232997
|
-
|
|
232998
|
-
|
|
232999
|
-
|
|
233000
|
-
|
|
233290
|
+
}))) || [], tooltipLabel: t('analyticsAnalyticsPrograms.timeSpent'), tooltipValue: (point) => formatSecondsToTime(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsPrograms.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsPrograms.programsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsPrograms.programs') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsPrograms.programs'), description: t('analyticsAnalyticsPrograms.programsTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-program", type: "text", placeholder: t('analyticsAnalyticsPrograms.searchPlaceholder'), value: programsListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsPrograms.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsPrograms.loading') }) })) : ((_c = programsList === null || programsList === void 0 ? void 0 : programsList.programs) === null || _c === void 0 ? void 0 : _c.length) && programsList.programs.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsPrograms.enrollments') })] }) }), jsx(TableBody, { children: programsList.programs.map((program, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
233291
|
+
// Mouse shortcut only; the id cell may hold a link,
|
|
233292
|
+
// so the row itself must not be a button —
|
|
233293
|
+
// interactive content inside one is invalid, and
|
|
233294
|
+
// the row's label would rename the link. Keyboard
|
|
233295
|
+
// and screen-reader users open the detail page
|
|
233296
|
+
// through the program name below.
|
|
233297
|
+
onClick: () => handleProgramClick(program.id), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("button", { type: "button", className: "max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", onClick: (e) => {
|
|
233298
|
+
e.stopPropagation();
|
|
233299
|
+
handleProgramClick(program.id);
|
|
233300
|
+
}, "aria-label": t('analyticsAnalyticsPrograms.viewDetailsAriaLabel', {
|
|
233301
|
+
name: program.name,
|
|
233302
|
+
}), children: program.name }) }), jsx(TableCell, { className: "text-muted-foreground", children: getProgramURL && program.program_id ? (jsx("a", { href: getProgramURL(program.program_id), target: "_blank", rel: "noopener noreferrer",
|
|
233303
|
+
// The row navigates to the analytics detail
|
|
233304
|
+
// page; this link goes to the program itself.
|
|
233305
|
+
onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), className: "cursor-pointer hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", "aria-label": t('analyticsAnalyticsPrograms.openProgramAriaLabel', {
|
|
233306
|
+
id: program.program_id,
|
|
233307
|
+
}), children: program.id })) : (program.id) }), jsx(TableCell, { className: "text-right", children: program.enrollments.toLocaleString() })] }, program.id))) })] }) }), programsPagination && programsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.current_page - 1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programsPagination.total_pages }, (_, i) => i + 1)
|
|
233001
233308
|
.filter((page) => {
|
|
233002
233309
|
const current = programsPagination.current_page;
|
|
233003
233310
|
const total = programsPagination.total_pages;
|
|
@@ -233016,28 +233323,34 @@ function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '
|
|
|
233016
233323
|
}), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.current_page + 1), disabled: programsPagination.current_page === programsPagination.total_pages, "aria-label": t('analyticsAnalyticsPrograms.goToNextPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToNextPage') }), jsx(ChevronRight, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.total_pages), disabled: programsPagination.current_page === programsPagination.total_pages, "aria-label": t('analyticsAnalyticsPrograms.goToLastPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToLastPage') }), jsx(ChevronsRight, { className: "h-4 w-4" })] })] }))] })) : (jsx(EmptyStats, { title: t('analyticsAnalyticsPrograms.noProgramsAvailable') }))] })] }) }) })] }));
|
|
233017
233324
|
}
|
|
233018
233325
|
|
|
233019
|
-
function AnalyticsProgramDetail({ tenantKey, mentorId, selectedMentorId, programId, programName, onBack, }) {
|
|
233326
|
+
function AnalyticsProgramDetail({ tenantKey, currentSPA, mentorId, selectedMentorId, programId, programName, onBack, }) {
|
|
233020
233327
|
var _a, _b;
|
|
233021
233328
|
const t = useT();
|
|
233022
233329
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
233023
|
-
const { programDetailStats, isLoading, programEnrollments, programEnrollmentsSearch, handleProgramEnrollmentsSearchInputChange, setProgramEnrollmentsPage, programEnrollmentsPagination, programInfo, } = usePrograms({
|
|
233330
|
+
const { programDetailStats, isLoading, isDetailStatsLoading, programEnrollments, programEnrollmentsSearch, handleProgramEnrollmentsSearchInputChange, setProgramEnrollmentsPage, programEnrollmentsPagination, programInfo, } = usePrograms({
|
|
233024
233331
|
tenantKey,
|
|
233025
233332
|
mentorId: currentMentorId,
|
|
233026
233333
|
programId,
|
|
233027
233334
|
});
|
|
233028
233335
|
const [selectedEnrollment, setSelectedEnrollment] = useState(null);
|
|
233029
233336
|
const resolvedProgramName = programName || (programInfo === null || programInfo === void 0 ? void 0 : programInfo.name);
|
|
233030
|
-
return (jsxs("div", { className: "space-y-8", children: [(onBack || resolvedProgramName) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsProgramDetail.backAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), resolvedProgramName && (jsx("h2", { className: "flex-1 truncate text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedProgramName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { loading:
|
|
233031
|
-
programEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colLastActiveOn') })] }) }), jsx(TableBody, { children: programEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
233032
|
-
|
|
233033
|
-
|
|
233034
|
-
|
|
233035
|
-
|
|
233036
|
-
}, "aria-label": t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', { name: enrollment.name }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
|
|
233337
|
+
return (jsxs("div", { className: "space-y-8", children: [(onBack || resolvedProgramName) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsProgramDetail.backAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), resolvedProgramName && (jsx("h2", { className: "flex-1 truncate text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedProgramName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statTotalEnrollments'), value: programDetailStats.enrollments, percentage: programDetailStats.enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statTotalEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statActiveEnrollments'), value: programDetailStats.active_enrollments, percentage: programDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statActiveEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statCompletedEnrollments'), value: programDetailStats.completed_enrollments, percentage: programDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statCompletedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsProgramDetail.tableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading'), description: t('analyticsAnalyticsProgramDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsProgramDetail.searchPlaceholder'), value: programEnrollmentsSearch, onChange: handleProgramEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsProgramDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsProgramDetail.loadingLabel') }) })) : ((_a = programEnrollments === null || programEnrollments === void 0 ? void 0 : programEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
|
|
233338
|
+
programEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colLastActiveOn') }), jsx(TableHead, { className: "w-[1%] text-right whitespace-nowrap", children: t('analyticsAnalyticsProgramDetail.colProgress') })] }) }), jsx(TableBody, { children: programEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
|
|
233339
|
+
// Mouse shortcut only; the name and email cells hold profile
|
|
233340
|
+
// links, so keyboard and screen-reader users reach the
|
|
233341
|
+
// progress modal through the Progress column's button.
|
|
233342
|
+
onClick: () => setSelectedEnrollment(enrollment), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.name })) }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.email })) }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
|
|
233037
233343
|
? new Date(enrollment.enrollment_date).toLocaleDateString()
|
|
233038
233344
|
: '—' }), jsx(TableCell, { className: "text-right", children: enrollment.last_active_on
|
|
233039
233345
|
? new Date(enrollment.last_active_on).toLocaleDateString()
|
|
233040
|
-
: '—' })
|
|
233346
|
+
: '—' }), jsx(TableCell, { className: "text-right", children: jsx(Button$1, { variant: "ghost", size: "icon", className: "h-8 w-8 text-gray-500 hover:text-blue-600", onClick: (e) => {
|
|
233347
|
+
e.stopPropagation();
|
|
233348
|
+
setSelectedEnrollment(enrollment);
|
|
233349
|
+
}, "aria-label": t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', {
|
|
233350
|
+
name: enrollment.name || enrollment.email,
|
|
233351
|
+
}), title: t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', {
|
|
233352
|
+
name: enrollment.name || enrollment.email,
|
|
233353
|
+
}), children: jsx(TrendingUp, { className: "h-4 w-4", "aria-hidden": "true" }) }) })] }, index))) })] }) }), programEnrollmentsPagination && programEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(programEnrollmentsPagination.current_page - 1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programEnrollmentsPagination.total_pages }, (_, i) => i + 1)
|
|
233041
233354
|
.filter((page) => {
|
|
233042
233355
|
const current = programEnrollmentsPagination.current_page;
|
|
233043
233356
|
const total = programEnrollmentsPagination.total_pages;
|
|
@@ -233628,14 +233941,14 @@ function DetailRow({ label, value }) {
|
|
|
233628
233941
|
* decided by the `event_type === null` branch: CRUD entries get the field-level
|
|
233629
233942
|
* `changes` diff, manual events get their `metadata`.
|
|
233630
233943
|
*/
|
|
233631
|
-
function PlatformAuditLogDetailSheet({ entry, open, onOpenChange, timeZone, }) {
|
|
233944
|
+
function PlatformAuditLogDetailSheet({ entry, open, onOpenChange, timeZone, platformKey, currentSPA, }) {
|
|
233632
233945
|
const t = useT();
|
|
233633
233946
|
const { eventTypeLabel, actionLabel } = usePlatformAuditLabels();
|
|
233634
233947
|
const isCrudEntry = entry ? entry.event_type === null : false;
|
|
233635
233948
|
const placeholder = t('analyticsPlatformAuditLogDetailSheet.notAvailable');
|
|
233636
233949
|
return (jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: jsxs(SheetContent, { side: "right", className: "w-full overflow-y-auto sm:max-w-xl", "data-testid": "platform-audit-detail", children: [jsxs(SheetHeader, { children: [jsx(SheetTitle, { children: t('analyticsPlatformAuditLogDetailSheet.title') }), jsx(SheetDescription, { children: t('analyticsPlatformAuditLogDetailSheet.description') })] }), entry && (jsxs("div", { className: "space-y-6 px-4 pb-6", children: [jsxs("dl", { className: "divide-y divide-gray-100", children: [jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.timestamp'), value: formatAuditTimestamp(entry.timestamp, timeZone) }), jsx(DetailRow, { label: isCrudEntry
|
|
233637
233950
|
? t('analyticsPlatformAuditLogDetailSheet.action')
|
|
233638
|
-
: t('analyticsPlatformAuditLogDetailSheet.event'), value: isCrudEntry ? actionLabel(entry.action) : eventTypeLabel(String(entry.event_type)) }), !isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.action'), value: actionLabel(entry.action) })), jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.actor'), value: entry.actor_username || entry.actor_email ? (jsxs("span", { className: "flex flex-col", children: [entry.actor_username && jsx(
|
|
233951
|
+
: t('analyticsPlatformAuditLogDetailSheet.event'), value: isCrudEntry ? actionLabel(entry.action) : eventTypeLabel(String(entry.event_type)) }), !isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.action'), value: actionLabel(entry.action) })), jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.actor'), value: entry.actor_username || entry.actor_email ? (jsxs("span", { className: "flex flex-col items-start", children: [entry.actor_username && (jsx(UserProfileLink, { tenantKey: platformKey !== null && platformKey !== void 0 ? platformKey : '', currentSPA: currentSPA, username: platformKey ? entry.actor_username : null, display: entry.actor_username })), entry.actor_email && (jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email }))] })) : (placeholder) }), isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.resource'), value: entry.resource_type || entry.resource_repr ? (jsxs("span", { className: "flex flex-col", children: [entry.resource_repr && jsx("span", { children: entry.resource_repr }), jsx("span", { className: "text-xs text-gray-500", children: [
|
|
233639
233952
|
entry.resource_type ? humanizeAuditToken(entry.resource_type) : null,
|
|
233640
233953
|
entry.resource_id ? `#${entry.resource_id}` : null,
|
|
233641
233954
|
]
|
|
@@ -233783,12 +234096,12 @@ const SKELETON_ROW_KEYS = ['a', 'b', 'c', 'd', 'e'];
|
|
|
233783
234096
|
function isCrudEntry(entry) {
|
|
233784
234097
|
return entry.event_type === null;
|
|
233785
234098
|
}
|
|
233786
|
-
function formatActor(entry, placeholder) {
|
|
234099
|
+
function formatActor(entry, placeholder, platformKey, currentSPA) {
|
|
233787
234100
|
if (!entry.actor_username && !entry.actor_email)
|
|
233788
234101
|
return null;
|
|
233789
|
-
return (jsxs("span", { className: "flex flex-col", children: [jsx(
|
|
234102
|
+
return (jsxs("span", { className: "flex flex-col items-start", children: [jsx(UserProfileLink, { tenantKey: platformKey, currentSPA: currentSPA, username: entry.actor_username, display: entry.actor_username || placeholder, className: "font-medium text-gray-700" }), entry.actor_email && jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email })] }));
|
|
233790
234103
|
}
|
|
233791
|
-
function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
|
|
234104
|
+
function AnalyticsPlatformAuditLog({ platformKey, timezone, currentSPA, }) {
|
|
233792
234105
|
var _a, _b, _c;
|
|
233793
234106
|
const t = useT();
|
|
233794
234107
|
const [selectedEntry, setSelectedEntry] = useState(null);
|
|
@@ -233815,7 +234128,7 @@ function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
|
|
|
233815
234128
|
timezone: timeZoneLabel,
|
|
233816
234129
|
}) }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colEvent') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colActor') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colResource') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colIpAddress') }), jsx(TableHead, { className: "p-3 text-right text-sm whitespace-nowrap text-[#646464]", children: jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPlatformAuditLog.colDetails') }) })] }) }), jsx(TableBody, { children: results.map((entry) => {
|
|
233817
234130
|
const crud = isCrudEntry(entry);
|
|
233818
|
-
const actor = formatActor(entry, placeholder);
|
|
234131
|
+
const actor = formatActor(entry, placeholder, platformKey, currentSPA);
|
|
233819
234132
|
return (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatAuditTimestamp(entry.timestamp, timeZone) }), jsx(TableCell, { className: "p-3 text-[#646464]", children: jsxs("span", { className: "flex flex-col", children: [jsx("span", { className: "font-medium text-gray-700", children: crud
|
|
233820
234133
|
? actionLabel(entry.action)
|
|
233821
234134
|
: eventTypeLabel(String(entry.event_type)) }), jsx("span", { className: "text-xs text-gray-500", children: crud
|
|
@@ -233827,7 +234140,7 @@ function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
|
|
|
233827
234140
|
}) })), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isFetching }), jsx(PlatformAuditLogDetailSheet, { entry: selectedEntry, open: selectedEntry !== null, onOpenChange: (open) => {
|
|
233828
234141
|
if (!open)
|
|
233829
234142
|
setSelectedEntry(null);
|
|
233830
|
-
}, timeZone: timeZone })] }));
|
|
234143
|
+
}, timeZone: timeZone, platformKey: platformKey, currentSPA: currentSPA })] }));
|
|
233831
234144
|
}
|
|
233832
234145
|
|
|
233833
234146
|
const ACTION_LABELS = {
|
|
@@ -233978,7 +234291,7 @@ function summarizeChanges(entry) {
|
|
|
233978
234291
|
return `${action} ${target}`;
|
|
233979
234292
|
}
|
|
233980
234293
|
/** The per-agent change log — the original audit view, unchanged. */
|
|
233981
|
-
function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, }) {
|
|
234294
|
+
function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, currentSPA, }) {
|
|
233982
234295
|
var _a;
|
|
233983
234296
|
const t = useT();
|
|
233984
234297
|
const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
@@ -234016,9 +234329,9 @@ function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, }) {
|
|
|
234016
234329
|
}, numberOfMonths: 2 }) })] }), jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: actionFilter !== undefined ? String(actionFilter) : 'all', onValueChange: (val) => {
|
|
234017
234330
|
setActionFilter(val === 'all' ? undefined : Number(val));
|
|
234018
234331
|
setPage(1);
|
|
234019
|
-
}, children: [jsx(SelectTrigger, { className: "w-full font-normal bg-white h-9", children: jsx(SelectValue, { placeholder: t('analyticsAnalyticsAuditLogStats.allActions') }) }), jsx(SelectContent, { children: ACTION_FILTER_OPTIONS.map((opt) => (jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) })] }) }), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex items-center justify-center w-full py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error && !is403 ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.loadError') })) : !((_a = data === null || data === void 0 ? void 0 : data.results) === null || _a === void 0 ? void 0 : _a.length) ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsAuditLogStats.noEntries') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colUser') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colAction') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colTime') })] }) }), jsx(TableBody, { children: data.results.map((entry) => (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: entry.actor_email }), jsx(TableCell, { className: "min-w-[250px] p-3 text-[#646464]", children: summarizeChanges(entry) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatDistanceToNow(new Date(entry.timestamp), { addSuffix: true }) })] }, entry.id))) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading })] }));
|
|
234332
|
+
}, children: [jsx(SelectTrigger, { className: "w-full font-normal bg-white h-9", children: jsx(SelectValue, { placeholder: t('analyticsAnalyticsAuditLogStats.allActions') }) }), jsx(SelectContent, { children: ACTION_FILTER_OPTIONS.map((opt) => (jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) })] }) }), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex items-center justify-center w-full py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error && !is403 ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.loadError') })) : !((_a = data === null || data === void 0 ? void 0 : data.results) === null || _a === void 0 ? void 0 : _a.length) ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsAuditLogStats.noEntries') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colUser') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colAction') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colTime') })] }) }), jsx(TableBody, { children: data.results.map((entry) => (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: entry.actor_username, display: entry.actor_email || entry.actor_username }) }), jsx(TableCell, { className: "min-w-[250px] p-3 text-[#646464]", children: summarizeChanges(entry) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatDistanceToNow(new Date(entry.timestamp), { addSuffix: true }) })] }, entry.id))) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading })] }));
|
|
234020
234333
|
}
|
|
234021
|
-
function AnalyticsAuditLogStats({ tenantKey, mentorId, userId, selectedMentorId, defaultScope = 'agent', timezone, canViewPlatformAudit, }) {
|
|
234334
|
+
function AnalyticsAuditLogStats({ tenantKey, currentSPA, mentorId, userId, selectedMentorId, defaultScope = 'agent', timezone, canViewPlatformAudit, }) {
|
|
234022
234335
|
const t = useT();
|
|
234023
234336
|
const { currentTenant } = useCurrentTenant();
|
|
234024
234337
|
const rbacPermissions = useSelector(selectRbacPermissions);
|
|
@@ -234041,28 +234354,7 @@ function AnalyticsAuditLogStats({ tenantKey, mentorId, userId, selectedMentorId,
|
|
|
234041
234354
|
: 'font-medium text-gray-500 hover:text-gray-700'), children: [tab.label, active && (jsx("span", { className: "absolute inset-x-0 -bottom-px h-0.5 rounded-sm bg-blue-600" }))] }, tab.value));
|
|
234042
234355
|
}) }), jsx("p", { className: "hidden pb-2 text-xs text-gray-500 sm:block", children: activeScope === 'agent'
|
|
234043
234356
|
? t('analyticsAnalyticsAuditLogStats.scopeAgentHint')
|
|
234044
|
-
: t('analyticsAnalyticsAuditLogStats.scopePlatformHint') })] })), activeScope === 'platform' ? (jsx(AnalyticsPlatformAuditLog, { platformKey: tenantKey, timezone: timezone })) : (jsx(AgentAuditLogView, { tenantKey: tenantKey, mentorId: mentorId, userId: userId, selectedMentorId: selectedMentorId }))] }));
|
|
234045
|
-
}
|
|
234046
|
-
|
|
234047
|
-
function MentorSelectionGrid({ selectedMentorIds, onMentorSelect, searchQuery, onSearchChange, tenantKey, itemsPerPage = 8, showSearch = true, minHeight = '400px', }) {
|
|
234048
|
-
const t = useT();
|
|
234049
|
-
const { agents: mentors, isLoading: isMentorsLoading, isFetching: isMentorsFetching, currentPage, totalPages, setSearchQuery: setMentorSearch, handlePageChange, } = useAgentSearchWithPagination({ tenantKey, itemsPerPage });
|
|
234050
|
-
// Update search query with debounce effect handled by the hook
|
|
234051
|
-
React__default.useEffect(() => {
|
|
234052
|
-
setMentorSearch(searchQuery);
|
|
234053
|
-
}, [searchQuery]);
|
|
234054
|
-
const isMentorSelected = (mentorId) => {
|
|
234055
|
-
return selectedMentorIds.includes(mentorId);
|
|
234056
|
-
};
|
|
234057
|
-
return (jsxs("div", { className: "space-y-4", children: [showSearch && (jsxs("div", { className: "relative", children: [isMentorsFetching ? (jsx(Spinner, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })) : (jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })), jsx(Input, { placeholder: t('mentorsMentorSelectionGrid.searchAgentsPlaceholder'), value: searchQuery, onChange: (e) => onSearchChange(e.target.value), className: "h-10 border-gray-200 pl-10 focus:border-blue-500 focus:ring-0" })] })), jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "grid max-h-96 auto-rows-min grid-cols-1 items-start gap-3 overflow-y-auto rounded-lg border border-gray-200 p-4 md:max-h-none md:grid-cols-2", style: { minHeight }, children: isMentorsLoading ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.loadingAgents') })) : mentors.length === 0 ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.noAgentsFound') })) : (mentors.map((mentor) => {
|
|
234058
|
-
const isSelected = isMentorSelected(mentor.unique_id || '');
|
|
234059
|
-
const isAlreadyAdded = selectedMentorIds.includes(mentor.unique_id || '');
|
|
234060
|
-
return (jsxs("button", { onClick: () => onMentorSelect(mentor), className: `flex cursor-pointer items-center gap-3 rounded-lg border-2 p-3 transition-all ${isSelected
|
|
234061
|
-
? 'border-blue-500 bg-blue-50'
|
|
234062
|
-
: isAlreadyAdded
|
|
234063
|
-
? 'bg-blue-25 border-blue-300'
|
|
234064
|
-
: 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'}`, children: [jsxs(Avatar, { className: "h-12 w-12 flex-shrink-0", children: [jsx(AvatarImage, { src: mentor.profile_image || '/placeholder.svg', alt: mentor.name }), jsx(AvatarFallback, { children: mentor.name.substring(0, 2) })] }), jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-start text-left", children: [jsx("h4", { className: "truncate text-sm font-medium text-gray-900", children: mentor.name }), jsx("p", { className: "line-clamp-2 text-xs text-gray-600", children: mentor.description })] }), isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-600", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) })), isAlreadyAdded && !isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-400", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) }))] }, mentor.unique_id));
|
|
234065
|
-
})) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: handlePageChange, disabled: isMentorsFetching || isMentorsLoading })] })] }));
|
|
234357
|
+
: t('analyticsAnalyticsAuditLogStats.scopePlatformHint') })] })), activeScope === 'platform' ? (jsx(AnalyticsPlatformAuditLog, { platformKey: tenantKey, timezone: timezone, currentSPA: currentSPA })) : (jsx(AgentAuditLogView, { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: mentorId, userId: userId, selectedMentorId: selectedMentorId }))] }));
|
|
234066
234358
|
}
|
|
234067
234359
|
|
|
234068
234360
|
/**
|
|
@@ -234085,6 +234377,7 @@ function toRowFromMentorMemory(memory) {
|
|
|
234085
234377
|
categoryName: (_b = (_a = memory.category) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : null,
|
|
234086
234378
|
categorySlug: (_d = (_c = memory.category) === null || _c === void 0 ? void 0 : _c.slug) !== null && _d !== void 0 ? _d : null,
|
|
234087
234379
|
learner: memory.email || memory.username,
|
|
234380
|
+
username: memory.username,
|
|
234088
234381
|
email: memory.email || null,
|
|
234089
234382
|
mentorId: (_e = memory.mentor_id) !== null && _e !== void 0 ? _e : null,
|
|
234090
234383
|
mentorName: 'mentor_name' in memory ? ((_f = memory.mentor_name) !== null && _f !== void 0 ? _f : null) : null,
|
|
@@ -234100,6 +234393,7 @@ function toRowFromGlobalMemory(memory) {
|
|
|
234100
234393
|
categoryName: null,
|
|
234101
234394
|
categorySlug: null,
|
|
234102
234395
|
learner: memory.username,
|
|
234396
|
+
username: memory.username,
|
|
234103
234397
|
email: null,
|
|
234104
234398
|
mentorId: null,
|
|
234105
234399
|
mentorName: null,
|
|
@@ -234109,50 +234403,40 @@ function toRowFromGlobalMemory(memory) {
|
|
|
234109
234403
|
};
|
|
234110
234404
|
}
|
|
234111
234405
|
/**
|
|
234112
|
-
* Backs the analytics Memory tab. Owns scope selection
|
|
234113
|
-
*
|
|
234114
|
-
*
|
|
234115
|
-
* into a single row type.
|
|
234406
|
+
* Backs the analytics Memory tab. Owns scope selection, the shared filter
|
|
234407
|
+
* state and pagination, and normalizes the three differently-shaped memory
|
|
234408
|
+
* endpoints into a single row type.
|
|
234116
234409
|
*
|
|
234117
234410
|
* All three list queries are always mounted (RTK Query hooks can't be called
|
|
234118
234411
|
* conditionally); `skip` keeps only the active scope's request in flight.
|
|
234119
234412
|
*/
|
|
234120
234413
|
const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
234121
|
-
const
|
|
234122
|
-
// An agent picked from the scope dropdown's search stands in for the route
|
|
234123
|
-
// agent, so admins can inspect any agent's memories without leaving the tab.
|
|
234124
|
-
const activeMentorId = (searchedMentor === null || searchedMentor === void 0 ? void 0 : searchedMentor.id) || mentorId;
|
|
234125
|
-
const hasMentor = !!activeMentorId;
|
|
234414
|
+
const hasMentor = !!mentorId;
|
|
234126
234415
|
// Global (agent-independent) memories lead: they are the ones that hold for
|
|
234127
234416
|
// the user everywhere, so the tab opens on them and the dropdown lists them
|
|
234128
|
-
// first.
|
|
234129
|
-
|
|
234417
|
+
// first. The agent dimension is whatever the analytics agent picker resolved
|
|
234418
|
+
// to — one agent or all of them — never both, so the tab can't disagree with
|
|
234419
|
+
// the picker about which agents are on screen.
|
|
234420
|
+
const availableScopes = useMemo(() => (hasMentor ? ['global', 'mentor'] : ['global', 'all-mentors']), [hasMentor]);
|
|
234130
234421
|
const [scope, setScope] = useState('global');
|
|
234131
234422
|
const [page, setPage] = useState(1);
|
|
234132
234423
|
const [learnerFilter, setLearnerFilter] = useState('');
|
|
234133
234424
|
const [categoryFilter, setCategoryFilter] = useState(ALL_CATEGORIES);
|
|
234134
234425
|
const [contentFilter, setContentFilter] = useState('');
|
|
234135
234426
|
const [dateRange, setDateRange] = useState(undefined);
|
|
234136
|
-
|
|
234137
|
-
|
|
234138
|
-
// Categories belong to a single agent, so a slug carried over from the
|
|
234139
|
-
// previous one would filter the new agent's memories down to nothing.
|
|
234140
|
-
setCategoryFilter(ALL_CATEGORIES);
|
|
234141
|
-
if (mentor)
|
|
234142
|
-
setScope('mentor');
|
|
234143
|
-
}, []);
|
|
234144
|
-
// Picking an agent in the analytics switcher is the more explicit choice, so
|
|
234145
|
-
// it drops whatever the tab's own search had pinned.
|
|
234427
|
+
// Categories belong to a single agent, so a slug carried over from the
|
|
234428
|
+
// previous one would filter the new agent's memories down to nothing.
|
|
234146
234429
|
useEffect(() => {
|
|
234147
|
-
setSearchedMentor(null);
|
|
234148
234430
|
setCategoryFilter(ALL_CATEGORIES);
|
|
234149
234431
|
}, [mentorId]);
|
|
234150
|
-
//
|
|
234151
|
-
//
|
|
234432
|
+
// Whichever agent scope the picker just took off the menu, move to the one it
|
|
234433
|
+
// put there — staying put would leave the tab on a scope it no longer offers
|
|
234434
|
+
// (and, for `mentor` without an agent, one it can't even query).
|
|
234152
234435
|
useEffect(() => {
|
|
234153
|
-
if (!hasMentor && scope === 'mentor')
|
|
234436
|
+
if (!hasMentor && scope === 'mentor')
|
|
234154
234437
|
setScope('all-mentors');
|
|
234155
|
-
|
|
234438
|
+
if (hasMentor && scope === 'all-mentors')
|
|
234439
|
+
setScope('mentor');
|
|
234156
234440
|
}, [hasMentor, scope]);
|
|
234157
234441
|
// Only the agent-scoped endpoint takes a `category`, and the category list is
|
|
234158
234442
|
// that agent's. Drop the selection anywhere else so a filter the UI no longer
|
|
@@ -234181,7 +234465,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
|
234181
234465
|
...(endDate ? { end_date: endDate } : {}),
|
|
234182
234466
|
...(myMemory ? { my_memory: true } : {}),
|
|
234183
234467
|
}), [page, categoryFilter, learnerFilter, startDate, endDate, myMemory]);
|
|
234184
|
-
const { data: mentorList, isLoading: isLoadingMentorList, isFetching: isFetchingMentorList, error: mentorListError, } = useGetMentorMemoriesListQuery({ org: tenantKey, userId, mentorId:
|
|
234468
|
+
const { data: mentorList, isLoading: isLoadingMentorList, isFetching: isFetchingMentorList, error: mentorListError, } = useGetMentorMemoriesListQuery({ org: tenantKey, userId, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '', params: mentorListParams }, { skip: !hasIdentity || !isMentorScope });
|
|
234185
234469
|
// Unpaginated, grouped-by-category companion to the list above. It honors the
|
|
234186
234470
|
// same filters, so it's the only place we can source aggregates that describe
|
|
234187
234471
|
// the whole filtered set instead of just the visible page.
|
|
@@ -234191,7 +234475,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
|
234191
234475
|
...(endDate ? { end_date: endDate } : {}),
|
|
234192
234476
|
...(myMemory ? { my_memory: true } : {}),
|
|
234193
234477
|
}), [learnerFilter, startDate, endDate, myMemory]);
|
|
234194
|
-
const { data: mentorGrouped, isLoading: isLoadingMentorGrouped } = useGetMentorMemoriesQuery({ org: tenantKey, userId, mentorId:
|
|
234478
|
+
const { data: mentorGrouped, isLoading: isLoadingMentorGrouped } = useGetMentorMemoriesQuery({ org: tenantKey, userId, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '', params: mentorSnapshotParams }, { skip: !hasIdentity || !isMentorScope });
|
|
234195
234479
|
// Deliberately unfiltered by mentor — the point of this scope is to span
|
|
234196
234480
|
// every agent. Per-agent numbers come from the `mentor` scope instead.
|
|
234197
234481
|
const allMentorsParams = useMemo(() => ({
|
|
@@ -234211,7 +234495,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
|
234211
234495
|
...(endDate ? { end_date: endDate } : {}),
|
|
234212
234496
|
}), [page, learnerFilter, contentFilter, startDate, endDate]);
|
|
234213
234497
|
const { data: globalMemories, isLoading: isLoadingGlobal, isFetching: isFetchingGlobal, error: globalError, } = useGetGlobalMemoriesQuery({ org: tenantKey, userId, params: globalParams }, { skip: !hasIdentity || !isGlobalScope });
|
|
234214
|
-
const { data: adminCategories } = useGetMemoryCategoriesAdminQuery({ org: tenantKey, mentorId:
|
|
234498
|
+
const { data: adminCategories } = useGetMemoryCategoriesAdminQuery({ org: tenantKey, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '' }, { skip: !tenantKey || !hasMentor });
|
|
234215
234499
|
const rows = useMemo(() => {
|
|
234216
234500
|
var _a, _b, _c;
|
|
234217
234501
|
if (isMentorScope)
|
|
@@ -234275,8 +234559,6 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
|
234275
234559
|
scope,
|
|
234276
234560
|
setScope,
|
|
234277
234561
|
availableScopes,
|
|
234278
|
-
searchedMentor,
|
|
234279
|
-
selectSearchedMentor,
|
|
234280
234562
|
rows,
|
|
234281
234563
|
aggregates,
|
|
234282
234564
|
totalCount,
|
|
@@ -234302,59 +234584,48 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
|
|
|
234302
234584
|
|
|
234303
234585
|
const CELL = 'p-3 text-[#646464]';
|
|
234304
234586
|
const HEAD = 'p-3 text-left text-sm whitespace-nowrap text-[#646464]';
|
|
234305
|
-
|
|
234306
|
-
* Action items that share the scope dropdown. Radix rejects empty values and
|
|
234307
|
-
* matches the trigger label by value, so these are sentinels the change handler
|
|
234308
|
-
* intercepts rather than selectable scopes.
|
|
234309
|
-
*/
|
|
234310
|
-
const SEARCH_AGENTS_ACTION = '__search-agents__';
|
|
234311
|
-
const CLEAR_AGENT_ACTION = '__clear-agent__';
|
|
234312
|
-
function MemoryDetailDialog({ memory, onClose, scope, }) {
|
|
234587
|
+
function MemoryDetailDialog({ memory, onClose, scope, tenantKey, currentSPA, }) {
|
|
234313
234588
|
const t = useT();
|
|
234314
|
-
return (jsx(Dialog, { open: !!memory, onOpenChange: (open) => !open && onClose(), children: jsxs(DialogContent, { className: "max-w-lg", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.detailTitle') }) }), memory && (jsxs("div", { className: "space-y-4", children: [jsx("p", { className: "text-sm whitespace-pre-wrap text-gray-700", children: memory.content }), jsxs("dl", { className: "grid grid-cols-2 gap-3 border-t border-gray-100 pt-3 text-xs", children: [jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailUser') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: memory.learner })] }), memory.categoryName && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCategory') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.categoryName })] })), scope === 'all-mentors' && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailAgent') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children:
|
|
234589
|
+
return (jsx(Dialog, { open: !!memory, onOpenChange: (open) => !open && onClose(), children: jsxs(DialogContent, { className: "max-w-lg", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.detailTitle') }) }), memory && (jsxs("div", { className: "space-y-4", children: [jsx("p", { className: "text-sm whitespace-pre-wrap text-gray-700", children: memory.content }), jsxs("dl", { className: "grid grid-cols-2 gap-3 border-t border-gray-100 pt-3 text-xs", children: [jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailUser') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: memory.username, display: memory.learner }) })] }), memory.categoryName && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCategory') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.categoryName })] })), scope === 'all-mentors' && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailAgent') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: jsx(AgentScopeLink, { uniqueId: memory.mentorId, name: memory.mentorName, fallback: "\u2014",
|
|
234590
|
+
// Re-scoping reloads the table underneath; this dialog
|
|
234591
|
+
// would otherwise stay open on a memory that the new
|
|
234592
|
+
// scope may not even list.
|
|
234593
|
+
onScoped: onClose }) })] })), jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailSource') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.isAutoGenerated
|
|
234315
234594
|
? t('analyticsAnalyticsMemoryStats.sourceAuto')
|
|
234316
234595
|
: t('analyticsAnalyticsMemoryStats.sourceManual') })] }), jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCaptured') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: format$1(new Date(memory.createdAt), "MMM dd, yyyy 'at' h:mm a") })] }), memory.sourceSessionId && (jsxs("div", { className: "col-span-2", children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailSession') }), jsx("dd", { className: "mt-0.5 font-mono text-[11px] break-all text-gray-800", children: memory.sourceSessionId })] }))] })] }))] }) }));
|
|
234317
234596
|
}
|
|
234318
|
-
function AgentSearchDialog({ tenantKey, open, onClose, selectedMentorId, onSelect, }) {
|
|
234319
|
-
const t = useT();
|
|
234320
|
-
const [query, setQuery] = useState('');
|
|
234321
|
-
return (jsx(Dialog, { open: open, onOpenChange: (next) => !next && onClose(), children: jsxs(DialogContent, { className: "max-w-2xl", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.searchAgentsTitle') }) }), jsx(MentorSelectionGrid, { tenantKey: tenantKey, searchQuery: query, onSearchChange: setQuery, selectedMentorIds: selectedMentorId ? [selectedMentorId] : [], itemsPerPage: 6, minHeight: "240px", onMentorSelect: (mentor) => {
|
|
234322
|
-
if (!(mentor === null || mentor === void 0 ? void 0 : mentor.unique_id))
|
|
234323
|
-
return;
|
|
234324
|
-
onSelect({ id: mentor.unique_id, name: mentor.name });
|
|
234325
|
-
onClose();
|
|
234326
|
-
} })] }) }));
|
|
234327
|
-
}
|
|
234328
234597
|
/**
|
|
234329
234598
|
* Analytics "Memory" tab. Surfaces the memories memsearch captures while users
|
|
234330
|
-
* chat with agents
|
|
234331
|
-
*
|
|
234332
|
-
*
|
|
234333
|
-
*
|
|
234599
|
+
* chat with agents.
|
|
234600
|
+
*
|
|
234601
|
+
* The scope dropdown is a single choice between global (agent-independent)
|
|
234602
|
+
* memories and the agent dimension, which follows the control bar's agent
|
|
234603
|
+
* picker rather than repeating it: with an agent picked it reads "This Agent"
|
|
234604
|
+
* (named), and with none it reads "All Agents".
|
|
234334
234605
|
*
|
|
234335
234606
|
* Hosts are expected to gate this behind `GET .../memsearch-status/`; the
|
|
234336
234607
|
* component itself only handles the per-request permission failure (403).
|
|
234337
234608
|
*/
|
|
234338
|
-
function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, myMemory = false, }) {
|
|
234609
|
+
function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, myMemory = false, currentSPA, }) {
|
|
234339
234610
|
const t = useT();
|
|
234340
234611
|
const scopedMentorId = useScopedMentorId(selectedMentorId, mentorId);
|
|
234612
|
+
const { scopedMentor } = useAnalyticsScope();
|
|
234341
234613
|
const [selectedMemory, setSelectedMemory] = useState(null);
|
|
234342
|
-
const [agentSearchOpen, setAgentSearchOpen] = useState(false);
|
|
234343
234614
|
// The content search is committed on Enter/blur rather than per-keystroke so
|
|
234344
234615
|
// we don't fire a request (and reset pagination) on every character typed.
|
|
234345
234616
|
const [contentInput, setContentInput] = useState('');
|
|
234346
|
-
const { scope, setScope, availableScopes,
|
|
234617
|
+
const { scope, setScope, availableScopes, rows, aggregates, categories, isLoading, error, isForbidden, page, setPage, totalPages, learnerFilter, setLearnerFilter, categoryFilter, setCategoryFilter, setContentFilter, dateRange, setDateRange, } = useMemory({
|
|
234347
234618
|
tenantKey,
|
|
234348
234619
|
userId,
|
|
234349
|
-
// The agent
|
|
234350
|
-
// tab
|
|
234351
|
-
// rather than the two controls fighting over the scope.
|
|
234620
|
+
// The only agent input: whatever the control bar's picker (or the route)
|
|
234621
|
+
// resolved to. The tab no longer picks an agent of its own.
|
|
234352
234622
|
mentorId: scopedMentorId,
|
|
234353
234623
|
myMemory,
|
|
234354
234624
|
});
|
|
234355
234625
|
const scopeLabels = {
|
|
234356
|
-
//
|
|
234357
|
-
|
|
234626
|
+
// Name the picked agent where the picker knows it, so the trigger says
|
|
234627
|
+
// which agent "This Agent" means.
|
|
234628
|
+
mentor: (scopedMentor === null || scopedMentor === void 0 ? void 0 : scopedMentor.name) || t('analyticsAnalyticsMemoryStats.scopeMentor'),
|
|
234358
234629
|
'all-mentors': t('analyticsAnalyticsMemoryStats.scopeAllMentors'),
|
|
234359
234630
|
global: t('analyticsAnalyticsMemoryStats.scopeGlobal'),
|
|
234360
234631
|
};
|
|
@@ -234366,19 +234637,7 @@ function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, m
|
|
|
234366
234637
|
if (isForbidden) {
|
|
234367
234638
|
return (jsx(Card, { className: "rounded-lg border border-gray-100 bg-white shadow-sm", children: jsx(CardContent, { className: "p-8 text-center", children: jsx("p", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.noPermission') }) }) }));
|
|
234368
234639
|
}
|
|
234369
|
-
return (jsxs("div", { className: "space-y-6", children: [jsx("div", { className: "rounded-lg border border-[oklch(0.922_0_0)] bg-white p-4", children: jsxs("div", { className: "flex flex-col gap-3 lg:flex-row", children: [jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: scope, onValueChange: (value) => {
|
|
234370
|
-
// The trailing items are actions, not scopes — the Select stays
|
|
234371
|
-
// on whatever scope is currently active.
|
|
234372
|
-
if (value === SEARCH_AGENTS_ACTION) {
|
|
234373
|
-
setAgentSearchOpen(true);
|
|
234374
|
-
return;
|
|
234375
|
-
}
|
|
234376
|
-
if (value === CLEAR_AGENT_ACTION) {
|
|
234377
|
-
selectSearchedMentor(null);
|
|
234378
|
-
return;
|
|
234379
|
-
}
|
|
234380
|
-
setScope(value);
|
|
234381
|
-
}, children: [jsx(SelectTrigger, { className: "h-9 w-full bg-white font-normal", "aria-label": t('analyticsAnalyticsMemoryStats.scopeLabel'), children: jsx(SelectValue, {}) }), jsxs(SelectContent, { children: [availableScopes.map((value) => (jsx(SelectItem, { value: value, children: scopeLabels[value] }, value))), jsx(SelectSeparator, {}), jsx(SelectItem, { value: SEARCH_AGENTS_ACTION, children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(Search, { className: "h-3.5 w-3.5" }), t('analyticsAnalyticsMemoryStats.searchAgents')] }) }), searchedMentor && (jsx(SelectItem, { value: CLEAR_AGENT_ACTION, children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(X$1, { className: "h-3.5 w-3.5" }), t('analyticsAnalyticsMemoryStats.clearAgentSearch')] }) }))] })] }) }), jsx("div", { className: "min-w-[200px] flex-1", children: jsx(UserFilterSelect, { tenantKey: tenantKey, currentUsername: userId, value: learnerFilter, onChange: setLearnerFilter }) }), scope === 'global' && (jsx("form", { className: "min-w-[180px] flex-1", onSubmit: (event) => {
|
|
234640
|
+
return (jsxs("div", { className: "space-y-6", children: [jsx("div", { className: "rounded-lg border border-[oklch(0.922_0_0)] bg-white p-4", children: jsxs("div", { className: "flex flex-col gap-3 lg:flex-row", children: [jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: scope, onValueChange: (value) => setScope(value), children: [jsx(SelectTrigger, { className: "h-9 w-full bg-white font-normal", "aria-label": t('analyticsAnalyticsMemoryStats.scopeLabel'), children: jsx(SelectValue, {}) }), jsx(SelectContent, { children: availableScopes.map((value) => (jsx(SelectItem, { value: value, children: scopeLabels[value] }, value))) })] }) }), jsx("div", { className: "min-w-[200px] flex-1", children: jsx(UserFilterSelect, { tenantKey: tenantKey, currentUsername: userId, value: learnerFilter, onChange: setLearnerFilter }) }), scope === 'global' && (jsx("form", { className: "min-w-[180px] flex-1", onSubmit: (event) => {
|
|
234382
234641
|
event.preventDefault();
|
|
234383
234642
|
setContentFilter(contentInput.trim());
|
|
234384
234643
|
}, children: jsx(Input, { value: contentInput, onChange: (event) => setContentInput(event.target.value), onBlur: () => setContentFilter(contentInput.trim()), placeholder: t('analyticsAnalyticsMemoryStats.contentPlaceholder'), "aria-label": t('analyticsAnalyticsMemoryStats.contentPlaceholder'), className: "h-9 bg-white" }) })), jsxs(Popover, { modal: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button$1, { variant: "outline", className: "flex h-9 w-full items-center gap-2 bg-white font-normal whitespace-nowrap lg:w-auto", children: [jsx(Calendar$1, { className: "h-4 w-4" }), (dateRange === null || dateRange === void 0 ? void 0 : dateRange.from) && (dateRange === null || dateRange === void 0 ? void 0 : dateRange.to)
|
|
@@ -234393,8 +234652,8 @@ function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, m
|
|
|
234393
234652
|
}) })] }), jsx("div", { className: "h-2 w-full overflow-hidden rounded-full bg-gray-100", children: jsx("div", { className: "h-full rounded-full bg-blue-600", style: { width: `${percent}%` } }) })] }, category.slug));
|
|
234394
234653
|
}) })] })), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex w-full items-center justify-center py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsMemoryStats.loadError') })) : rows.length === 0 ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsMemoryStats.noMemories') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colUser') }), jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colMemory') }), showAgentColumn && (jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colAgent') })), showCategoryColumn && (jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colCategory') })), jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colCaptured') })] }) }), jsx(TableBody, { children: rows.map((row) => {
|
|
234395
234654
|
var _a;
|
|
234396
|
-
return (jsxs(TableRow, { onClick: () => setSelectedMemory(row), className: "cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0 hover:bg-gray-50", children: [jsx(TableCell, { className: cn(CELL, 'font-medium whitespace-nowrap'), children: row.learner }), jsx(TableCell, { className: cn(CELL, 'min-w-[280px]'), children: jsx("span", { className: "line-clamp-2", children: row.content }) }), showAgentColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: row.
|
|
234397
|
-
}) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading }), jsx(MemoryDetailDialog, { memory: selectedMemory, scope: scope,
|
|
234655
|
+
return (jsxs(TableRow, { onClick: () => setSelectedMemory(row), className: "cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0 hover:bg-gray-50", children: [jsx(TableCell, { className: cn(CELL, 'font-medium whitespace-nowrap'), children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: row.username, display: row.learner }) }), jsx(TableCell, { className: cn(CELL, 'min-w-[280px]'), children: jsx("span", { className: "line-clamp-2", children: row.content }) }), showAgentColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: jsx(AgentScopeLink, { uniqueId: row.mentorId, name: row.mentorName, fallback: "\u2014" }) })), showCategoryColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: row.categoryName ? (jsx("span", { className: "rounded-md bg-blue-100 px-2 py-1 text-xs text-blue-700", children: row.categoryName })) : ('—') })), jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: formatDistanceToNow(new Date(row.createdAt), { addSuffix: true }) })] }, `${(_a = row.mentorId) !== null && _a !== void 0 ? _a : 'global'}-${row.id}`));
|
|
234656
|
+
}) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading }), jsx(MemoryDetailDialog, { memory: selectedMemory, scope: scope, tenantKey: tenantKey, currentSPA: currentSPA, onClose: () => setSelectedMemory(null) })] }));
|
|
234398
234657
|
}
|
|
234399
234658
|
|
|
234400
234659
|
const SkeletonMultiplier = ({ Skeleton, multiplier }) => {
|
|
@@ -241337,6 +241596,27 @@ var minimumMentorAlert = /*#__PURE__*/Object.freeze({
|
|
|
241337
241596
|
MinimumMentorAlert: MinimumMentorAlert
|
|
241338
241597
|
});
|
|
241339
241598
|
|
|
241599
|
+
function MentorSelectionGrid({ selectedMentorIds, onMentorSelect, searchQuery, onSearchChange, tenantKey, itemsPerPage = 8, showSearch = true, minHeight = '400px', }) {
|
|
241600
|
+
const t = useT();
|
|
241601
|
+
const { agents: mentors, isLoading: isMentorsLoading, isFetching: isMentorsFetching, currentPage, totalPages, setSearchQuery: setMentorSearch, handlePageChange, } = useAgentSearchWithPagination({ tenantKey, itemsPerPage });
|
|
241602
|
+
// Update search query with debounce effect handled by the hook
|
|
241603
|
+
React__default.useEffect(() => {
|
|
241604
|
+
setMentorSearch(searchQuery);
|
|
241605
|
+
}, [searchQuery]);
|
|
241606
|
+
const isMentorSelected = (mentorId) => {
|
|
241607
|
+
return selectedMentorIds.includes(mentorId);
|
|
241608
|
+
};
|
|
241609
|
+
return (jsxs("div", { className: "space-y-4", children: [showSearch && (jsxs("div", { className: "relative", children: [isMentorsFetching ? (jsx(Spinner, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })) : (jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })), jsx(Input, { placeholder: t('mentorsMentorSelectionGrid.searchAgentsPlaceholder'), value: searchQuery, onChange: (e) => onSearchChange(e.target.value), className: "h-10 border-gray-200 pl-10 focus:border-blue-500 focus:ring-0" })] })), jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "grid max-h-96 auto-rows-min grid-cols-1 items-start gap-3 overflow-y-auto rounded-lg border border-gray-200 p-4 md:max-h-none md:grid-cols-2", style: { minHeight }, children: isMentorsLoading ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.loadingAgents') })) : mentors.length === 0 ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.noAgentsFound') })) : (mentors.map((mentor) => {
|
|
241610
|
+
const isSelected = isMentorSelected(mentor.unique_id || '');
|
|
241611
|
+
const isAlreadyAdded = selectedMentorIds.includes(mentor.unique_id || '');
|
|
241612
|
+
return (jsxs("button", { onClick: () => onMentorSelect(mentor), className: `flex cursor-pointer items-center gap-3 rounded-lg border-2 p-3 transition-all ${isSelected
|
|
241613
|
+
? 'border-blue-500 bg-blue-50'
|
|
241614
|
+
: isAlreadyAdded
|
|
241615
|
+
? 'bg-blue-25 border-blue-300'
|
|
241616
|
+
: 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'}`, children: [jsxs(Avatar, { className: "h-12 w-12 flex-shrink-0", children: [jsx(AvatarImage, { src: mentor.profile_image || '/placeholder.svg', alt: mentor.name }), jsx(AvatarFallback, { children: mentor.name.substring(0, 2) })] }), jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-start text-left", children: [jsx("h4", { className: "truncate text-sm font-medium text-gray-900", children: mentor.name }), jsx("p", { className: "line-clamp-2 text-xs text-gray-600", children: mentor.description })] }), isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-600", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) })), isAlreadyAdded && !isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-400", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) }))] }, mentor.unique_id));
|
|
241617
|
+
})) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: handlePageChange, disabled: isMentorsFetching || isMentorsLoading })] })] }));
|
|
241618
|
+
}
|
|
241619
|
+
|
|
241340
241620
|
function CreateProjectModal({ isOpen, onClose, tenantKey, username, navigateToMentorInProject, }) {
|
|
241341
241621
|
const t = useT();
|
|
241342
241622
|
const dispatch = useDispatch();
|
|
@@ -245812,5 +246092,5 @@ var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
|
|
|
245812
246092
|
TrainOrDeleteModal: TrainOrDeleteModal
|
|
245813
246093
|
});
|
|
245814
246094
|
|
|
245815
|
-
export { ACCESS_COURSE_LABEL, ALL_CATEGORIES, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentSkills, AlertsTab, AnalyticsAgentPicker, AnalyticsAreaChart, AnalyticsAuditLogStats, AnalyticsBarChart, AnalyticsControlBar, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsGlobalFiltersProvider, AnalyticsLayout, AnalyticsLlmUsageStats, AnalyticsMemoryStats, AnalyticsMonetizationStats, AnalyticsNotice, AnalyticsOverview, AnalyticsPlatformAuditLog, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsScopeProvider, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTraces, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, AuditLogChangesView, AuditLogJsonView, BUY_NOW_LABEL, BillingTab, CATALOGS, CHART_ORDINAL_RAMP, CHART_SERIES_COLORS, CHART_SINGLE_SERIES_COLOR, CREATE_AGENT_LABELS, CUA_DRIVER_REPO_URL, CUA_DRIVER_TAURI_COMMANDS, CUA_DRIVER_TAURI_EVENTS, CardInfoIcon, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChartTooltipCard, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_COWORK_REQUIRED_SIZE_GB, DEFAULT_LOCALE, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_LLM_CHANGED_EVENT, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, MEMORY_PAGE_SIZE, Markdown, MemoryAdminTab, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_FIELD_TYPES, ONBOARDING_SECTORS, OnboardingField, OnboardingShell, OnboardingWizard, PLATFORM_AUDIT_DEEP_PAGING_THRESHOLD, PLATFORM_AUDIT_PAGE_SIZE, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformAuditLogDetailSheet, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RankedBars, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SERVICE_COLOR_ORDER, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, SlashSkillPicker, SourceChip, Spinner, StatCard, StepHeader, SummerNoteTextEditor, TAURI_COMMANDS, TAURI_EVENTS, TRACES_PAGE_SIZE, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, TrendSparkline, USER_ONBOARDING_FORM_SLUG, USER_ONBOARDING_FORM_VERSION, USER_ONBOARDING_SUBMISSION_SLUG, UpgradePackageModal, UserAvatar, UserOnboardingWizard, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, areChartFiltersEqual, availablePlacementExams, buildOnboardingAgentPath, buildUserOnboardingFormMetadata, buildUserOnboardingSubmissionMetadata, coerceOnboardingAgent, coerceOnboardingAgents, coerceUserOnboardingForm, colorForRank, colorForSeries, emptyUserOnboardingForm, findLastResumeBlock, findOnboardingAgent, findSequentialParent, flattenVerticalBlocks, formatAuditTimestamp, formatCompactNumber, formatLatencySeconds, formatTimeZoneLabel, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, granularityForFilter, hasOnboardingContent, humanizeAuditToken, inBrowserPrint, inIframe, initialCuaDriverInstallState, initialModelDownloadState, isCoworkEnabled, isLlmUsageForbidden, isLlmUsageUnavailable, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSlashCommandToken, isTauriApp, isValidLocale, isValidTimeZone, llmUsageDateArgs, components as markdownComponents, modelSupportsCowork, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, readUserOnboardingForm, readUserOnboardingSubmission, readUserOnboardingSubmissions, resolveAuditTimeZone, resolveCreateAgentLabels, sanitizeCss, setCoworkEnabled, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, smallestCoworkModel, useAnalyticsGlobalFilters, useAnalyticsScope, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useCuaDriver, useDiscover, useEdxIframe, useFinancial, useIframeMessageHandler, useLlmTraces, useLlmUsage, useLocalStorage, useMemory, useModelDownload, useMonetization, useOverview, usePlatformAuditLabels, usePlatformAuditLog, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useScopedMentorDbId, useScopedMentorId, useSelectedLocalModel, useSlashSkillPicker, useSlashSkills, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
|
|
246095
|
+
export { ACCESS_COURSE_LABEL, ALL_CATEGORIES, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentScopeLink, AgentSkills, AlertsTab, AnalyticsAgentPicker, AnalyticsAreaChart, AnalyticsAuditLogStats, AnalyticsBarChart, AnalyticsControlBar, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsGlobalFiltersProvider, AnalyticsLayout, AnalyticsLlmUsageStats, AnalyticsMemoryStats, AnalyticsMonetizationStats, AnalyticsNotice, AnalyticsOverview, AnalyticsPlatformAuditLog, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsScopeProvider, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTraces, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, AuditLogChangesView, AuditLogJsonView, BUY_NOW_LABEL, BillingTab, CATALOGS, CHART_ORDINAL_RAMP, CHART_SERIES_COLORS, CHART_SINGLE_SERIES_COLOR, CREATE_AGENT_LABELS, CUA_DRIVER_REPO_URL, CUA_DRIVER_TAURI_COMMANDS, CUA_DRIVER_TAURI_EVENTS, CardInfoIcon, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChartTooltipCard, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_COWORK_REQUIRED_SIZE_GB, DEFAULT_LOCALE, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_LLM_CHANGED_EVENT, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, MEMORY_PAGE_SIZE, Markdown, MemoryAdminTab, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_FIELD_TYPES, ONBOARDING_SECTORS, OnboardingField, OnboardingShell, OnboardingWizard, PLATFORM_AUDIT_DEEP_PAGING_THRESHOLD, PLATFORM_AUDIT_PAGE_SIZE, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformAuditLogDetailSheet, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RankedBars, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SERVICE_COLOR_ORDER, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, SlashSkillPicker, SourceChip, Spinner, StatCard, StepHeader, SummerNoteTextEditor, TAURI_COMMANDS, TAURI_EVENTS, TRACES_PAGE_SIZE, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, TrendSparkline, USER_ONBOARDING_FORM_SLUG, USER_ONBOARDING_FORM_VERSION, USER_ONBOARDING_SUBMISSION_SLUG, UpgradePackageModal, UserAvatar, UserOnboardingWizard, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, areChartFiltersEqual, availablePlacementExams, buildOnboardingAgentPath, buildUserOnboardingFormMetadata, buildUserOnboardingSubmissionMetadata, coerceOnboardingAgent, coerceOnboardingAgents, coerceUserOnboardingForm, colorForRank, colorForSeries, emptyUserOnboardingForm, findLastResumeBlock, findOnboardingAgent, findSequentialParent, flattenVerticalBlocks, formatAuditTimestamp, formatCompactNumber, formatLatencySeconds, formatTimeZoneLabel, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, granularityForFilter, hasOnboardingContent, humanizeAuditToken, inBrowserPrint, inIframe, initialCuaDriverInstallState, initialModelDownloadState, isCoworkEnabled, isLlmUsageForbidden, isLlmUsageUnavailable, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSlashCommandToken, isTauriApp, isValidLocale, isValidTimeZone, llmUsageDateArgs, components as markdownComponents, modelSupportsCowork, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, readUserOnboardingForm, readUserOnboardingSubmission, readUserOnboardingSubmissions, resolveAuditTimeZone, resolveCreateAgentLabels, sanitizeCss, setCoworkEnabled, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, smallestCoworkModel, useAnalyticsGlobalFilters, useAnalyticsScope, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useCuaDriver, useDiscover, useEdxIframe, useFinancial, useIframeMessageHandler, useLlmTraces, useLlmUsage, useLocalStorage, useMemory, useModelDownload, useMonetization, useOverview, usePlatformAuditLabels, usePlatformAuditLog, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useScopedMentorDbId, useScopedMentorId, useSelectedLocalModel, useSlashSkillPicker, useSlashSkills, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
|
|
245816
246096
|
//# sourceMappingURL=index.esm.js.map
|