@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +681 -0
  2. package/README.md +378 -0
  3. package/config.d.ts +70 -0
  4. package/dist/alpha.d.ts +285 -0
  5. package/dist/alpha.esm.js +3 -0
  6. package/dist/alpha.esm.js.map +1 -0
  7. package/dist/api/LightspeedApiClient.esm.js +234 -0
  8. package/dist/api/LightspeedApiClient.esm.js.map +1 -0
  9. package/dist/api/NotebooksApiClient.esm.js +179 -0
  10. package/dist/api/NotebooksApiClient.esm.js.map +1 -0
  11. package/dist/api/api.esm.js +8 -0
  12. package/dist/api/api.esm.js.map +1 -0
  13. package/dist/api/notebooksApi.esm.js +10 -0
  14. package/dist/api/notebooksApi.esm.js.map +1 -0
  15. package/dist/components/Attachment.esm.js +108 -0
  16. package/dist/components/Attachment.esm.js.map +1 -0
  17. package/dist/components/AttachmentContext.esm.js +125 -0
  18. package/dist/components/AttachmentContext.esm.js.map +1 -0
  19. package/dist/components/CollapsedHistoryStrip.esm.js +87 -0
  20. package/dist/components/CollapsedHistoryStrip.esm.js.map +1 -0
  21. package/dist/components/DeleteModal.esm.js +92 -0
  22. package/dist/components/DeleteModal.esm.js.map +1 -0
  23. package/dist/components/FilePreview.esm.js +49 -0
  24. package/dist/components/FilePreview.esm.js.map +1 -0
  25. package/dist/components/LightSpeedChat.esm.js +1898 -0
  26. package/dist/components/LightSpeedChat.esm.js.map +1 -0
  27. package/dist/components/LightspeedChatBox.esm.js +252 -0
  28. package/dist/components/LightspeedChatBox.esm.js.map +1 -0
  29. package/dist/components/LightspeedChatBoxHeader.esm.js +210 -0
  30. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -0
  31. package/dist/components/LightspeedChatContainer.esm.js +162 -0
  32. package/dist/components/LightspeedChatContainer.esm.js.map +1 -0
  33. package/dist/components/LightspeedChatModelsState.esm.js +198 -0
  34. package/dist/components/LightspeedChatModelsState.esm.js.map +1 -0
  35. package/dist/components/LightspeedDrawerContext.esm.js +15 -0
  36. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -0
  37. package/dist/components/LightspeedDrawerProvider.esm.js +44 -0
  38. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -0
  39. package/dist/components/LightspeedDrawerStateExposer.esm.js +34 -0
  40. package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -0
  41. package/dist/components/LightspeedFAB.esm.js +6 -0
  42. package/dist/components/LightspeedFAB.esm.js.map +1 -0
  43. package/dist/components/LightspeedFABContent.esm.js +65 -0
  44. package/dist/components/LightspeedFABContent.esm.js.map +1 -0
  45. package/dist/components/LightspeedIcon.esm.js +46 -0
  46. package/dist/components/LightspeedIcon.esm.js.map +1 -0
  47. package/dist/components/LightspeedPage.esm.js +31 -0
  48. package/dist/components/LightspeedPage.esm.js.map +1 -0
  49. package/dist/components/McpServersSettings.esm.js +953 -0
  50. package/dist/components/McpServersSettings.esm.js.map +1 -0
  51. package/dist/components/McpSettingsIcon.esm.js +18 -0
  52. package/dist/components/McpSettingsIcon.esm.js.map +1 -0
  53. package/dist/components/MessageBarModelSelector.esm.js +92 -0
  54. package/dist/components/MessageBarModelSelector.esm.js.map +1 -0
  55. package/dist/components/PermissionRequiredIcon.esm.js +18 -0
  56. package/dist/components/PermissionRequiredIcon.esm.js.map +1 -0
  57. package/dist/components/PermissionRequiredState.esm.js +88 -0
  58. package/dist/components/PermissionRequiredState.esm.js.map +1 -0
  59. package/dist/components/RenameConversationModal.esm.js +157 -0
  60. package/dist/components/RenameConversationModal.esm.js.map +1 -0
  61. package/dist/components/Router.esm.js +35 -0
  62. package/dist/components/Router.esm.js.map +1 -0
  63. package/dist/components/SourcesChipModal.esm.js +124 -0
  64. package/dist/components/SourcesChipModal.esm.js.map +1 -0
  65. package/dist/components/ToolCallContent.esm.js +208 -0
  66. package/dist/components/ToolCallContent.esm.js.map +1 -0
  67. package/dist/components/Trans.esm.js +33 -0
  68. package/dist/components/Trans.esm.js.map +1 -0
  69. package/dist/components/notebooks/AddDocumentModal.esm.js +271 -0
  70. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -0
  71. package/dist/components/notebooks/DeleteDocumentModal.esm.js +131 -0
  72. package/dist/components/notebooks/DeleteDocumentModal.esm.js.map +1 -0
  73. package/dist/components/notebooks/DeleteNotebookModal.esm.js +143 -0
  74. package/dist/components/notebooks/DeleteNotebookModal.esm.js.map +1 -0
  75. package/dist/components/notebooks/DocumentSidebar.esm.js +235 -0
  76. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -0
  77. package/dist/components/notebooks/FileListItem.esm.js +94 -0
  78. package/dist/components/notebooks/FileListItem.esm.js.map +1 -0
  79. package/dist/components/notebooks/FileTypeIcon.esm.js +59 -0
  80. package/dist/components/notebooks/FileTypeIcon.esm.js.map +1 -0
  81. package/dist/components/notebooks/NotebookCard.esm.js +118 -0
  82. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -0
  83. package/dist/components/notebooks/NotebookView.esm.js +681 -0
  84. package/dist/components/notebooks/NotebookView.esm.js.map +1 -0
  85. package/dist/components/notebooks/NotebooksTab.esm.js +71 -0
  86. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -0
  87. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +142 -0
  88. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -0
  89. package/dist/components/notebooks/RenameNotebookModal.esm.js +187 -0
  90. package/dist/components/notebooks/RenameNotebookModal.esm.js.map +1 -0
  91. package/dist/components/notebooks/SidebarCollapseIcon.esm.js +50 -0
  92. package/dist/components/notebooks/SidebarCollapseIcon.esm.js.map +1 -0
  93. package/dist/components/notebooks/UploadResourceScreen.esm.js +79 -0
  94. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -0
  95. package/dist/const.esm.js +74 -0
  96. package/dist/const.esm.js.map +1 -0
  97. package/dist/dev.d.ts +2 -0
  98. package/dist/dev.esm.js +48 -0
  99. package/dist/dev.esm.js.map +1 -0
  100. package/dist/hooks/notebooks/useCreateNotebook.esm.js +19 -0
  101. package/dist/hooks/notebooks/useCreateNotebook.esm.js.map +1 -0
  102. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js +24 -0
  103. package/dist/hooks/notebooks/useCreateNotebookMessage.esm.js.map +1 -0
  104. package/dist/hooks/notebooks/useDeleteNotebook.esm.js +19 -0
  105. package/dist/hooks/notebooks/useDeleteNotebook.esm.js.map +1 -0
  106. package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js +40 -0
  107. package/dist/hooks/notebooks/useDocumentStatusPolling.esm.js.map +1 -0
  108. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +15 -0
  109. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -0
  110. package/dist/hooks/notebooks/useNotebookDocuments.esm.js +18 -0
  111. package/dist/hooks/notebooks/useNotebookDocuments.esm.js.map +1 -0
  112. package/dist/hooks/notebooks/useNotebookSession.esm.js +18 -0
  113. package/dist/hooks/notebooks/useNotebookSession.esm.js.map +1 -0
  114. package/dist/hooks/notebooks/useNotebookSessions.esm.js +18 -0
  115. package/dist/hooks/notebooks/useNotebookSessions.esm.js.map +1 -0
  116. package/dist/hooks/notebooks/useRenameNotebook.esm.js +19 -0
  117. package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -0
  118. package/dist/hooks/notebooks/useUploadDocument.esm.js +28 -0
  119. package/dist/hooks/notebooks/useUploadDocument.esm.js.map +1 -0
  120. package/dist/hooks/toolCallsCacheStore.esm.js +61 -0
  121. package/dist/hooks/toolCallsCacheStore.esm.js.map +1 -0
  122. package/dist/hooks/useAllModels.esm.js +20 -0
  123. package/dist/hooks/useAllModels.esm.js.map +1 -0
  124. package/dist/hooks/useAutoScroll.esm.js +78 -0
  125. package/dist/hooks/useAutoScroll.esm.js.map +1 -0
  126. package/dist/hooks/useBackstageUserIdentity.esm.js +14 -0
  127. package/dist/hooks/useBackstageUserIdentity.esm.js.map +1 -0
  128. package/dist/hooks/useBufferedMessages.esm.js +27 -0
  129. package/dist/hooks/useBufferedMessages.esm.js.map +1 -0
  130. package/dist/hooks/useCaptureFeedback.esm.js +21 -0
  131. package/dist/hooks/useCaptureFeedback.esm.js.map +1 -0
  132. package/dist/hooks/useConversationMessages.esm.js +544 -0
  133. package/dist/hooks/useConversationMessages.esm.js.map +1 -0
  134. package/dist/hooks/useConversations.esm.js +25 -0
  135. package/dist/hooks/useConversations.esm.js.map +1 -0
  136. package/dist/hooks/useCreateCoversationMessage.esm.js +33 -0
  137. package/dist/hooks/useCreateCoversationMessage.esm.js.map +1 -0
  138. package/dist/hooks/useDeleteConversation.esm.js +39 -0
  139. package/dist/hooks/useDeleteConversation.esm.js.map +1 -0
  140. package/dist/hooks/useDisplayModeSettings.esm.js +57 -0
  141. package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -0
  142. package/dist/hooks/useFeedbackActions.esm.js +275 -0
  143. package/dist/hooks/useFeedbackActions.esm.js.map +1 -0
  144. package/dist/hooks/useFeedbackState.esm.js +93 -0
  145. package/dist/hooks/useFeedbackState.esm.js.map +1 -0
  146. package/dist/hooks/useFeedbackStatus.esm.js +14 -0
  147. package/dist/hooks/useFeedbackStatus.esm.js.map +1 -0
  148. package/dist/hooks/useIsMobile.esm.js +14 -0
  149. package/dist/hooks/useIsMobile.esm.js.map +1 -0
  150. package/dist/hooks/useLastOpenedConversation.esm.js +51 -0
  151. package/dist/hooks/useLastOpenedConversation.esm.js.map +1 -0
  152. package/dist/hooks/useLightspeedDeletePermission.esm.js +12 -0
  153. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -0
  154. package/dist/hooks/useLightspeedDrawerContext.esm.js +15 -0
  155. package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -0
  156. package/dist/hooks/useLightspeedProviderState.esm.js +277 -0
  157. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -0
  158. package/dist/hooks/useLightspeedUpdatePermission.esm.js +12 -0
  159. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -0
  160. package/dist/hooks/useLightspeedViewPermission.esm.js +18 -0
  161. package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -0
  162. package/dist/hooks/useNotebookConversationIds.esm.js +19 -0
  163. package/dist/hooks/useNotebookConversationIds.esm.js.map +1 -0
  164. package/dist/hooks/useNotebookWelcomePrompts.esm.js +14 -0
  165. package/dist/hooks/useNotebookWelcomePrompts.esm.js.map +1 -0
  166. package/dist/hooks/usePinnedChatsSettings.esm.js +118 -0
  167. package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -0
  168. package/dist/hooks/useQuestionValidation.esm.js +16 -0
  169. package/dist/hooks/useQuestionValidation.esm.js.map +1 -0
  170. package/dist/hooks/useRenameConversation.esm.js +44 -0
  171. package/dist/hooks/useRenameConversation.esm.js.map +1 -0
  172. package/dist/hooks/useSortSettings.esm.js +60 -0
  173. package/dist/hooks/useSortSettings.esm.js.map +1 -0
  174. package/dist/hooks/useStopConversation.esm.js +18 -0
  175. package/dist/hooks/useStopConversation.esm.js.map +1 -0
  176. package/dist/hooks/useTranslation.esm.js +7 -0
  177. package/dist/hooks/useTranslation.esm.js.map +1 -0
  178. package/dist/hooks/useWelcomePrompts.esm.js +36 -0
  179. package/dist/hooks/useWelcomePrompts.esm.js.map +1 -0
  180. package/dist/images/bot-avatar-dark.svg +4 -0
  181. package/dist/images/bot-avatar.svg +4 -0
  182. package/dist/images/permission-required.svg +319 -0
  183. package/dist/images/user-avatar.svg +4 -0
  184. package/dist/index.d.ts +113 -0
  185. package/dist/index.esm.js +137 -0
  186. package/dist/index.esm.js.map +1 -0
  187. package/dist/intelligent-assistant-fab-module.d.ts +4 -0
  188. package/dist/intelligent-assistant-fab-module.esm.js +2 -0
  189. package/dist/intelligent-assistant-fab-module.esm.js.map +1 -0
  190. package/dist/intelligent-assistant-translations-module.d.ts +4 -0
  191. package/dist/intelligent-assistant-translations-module.esm.js +2 -0
  192. package/dist/intelligent-assistant-translations-module.esm.js.map +1 -0
  193. package/dist/legacy.d.ts +75 -0
  194. package/dist/legacy.esm.js +13 -0
  195. package/dist/legacy.esm.js.map +1 -0
  196. package/dist/plugin.esm.js +84 -0
  197. package/dist/plugin.esm.js.map +1 -0
  198. package/dist/routes.esm.js +23 -0
  199. package/dist/routes.esm.js.map +1 -0
  200. package/dist/translations/de.esm.js +278 -0
  201. package/dist/translations/de.esm.js.map +1 -0
  202. package/dist/translations/es.esm.js +278 -0
  203. package/dist/translations/es.esm.js.map +1 -0
  204. package/dist/translations/fr.esm.js +278 -0
  205. package/dist/translations/fr.esm.js.map +1 -0
  206. package/dist/translations/index.esm.js +16 -0
  207. package/dist/translations/index.esm.js.map +1 -0
  208. package/dist/translations/it.esm.js +278 -0
  209. package/dist/translations/it.esm.js.map +1 -0
  210. package/dist/translations/ja.esm.js +278 -0
  211. package/dist/translations/ja.esm.js.map +1 -0
  212. package/dist/translations/ref.esm.js +315 -0
  213. package/dist/translations/ref.esm.js.map +1 -0
  214. package/dist/types.esm.js +9 -0
  215. package/dist/types.esm.js.map +1 -0
  216. package/dist/utils/attachment-utils.esm.js +30 -0
  217. package/dist/utils/attachment-utils.esm.js.map +1 -0
  218. package/dist/utils/formatToolResponseForMarkdown.esm.js +98 -0
  219. package/dist/utils/formatToolResponseForMarkdown.esm.js.map +1 -0
  220. package/dist/utils/generateClassName.esm.js +12 -0
  221. package/dist/utils/generateClassName.esm.js.map +1 -0
  222. package/dist/utils/lightspeed-chatbox-utils.esm.js +232 -0
  223. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -0
  224. package/dist/utils/notebook-upload-utils.esm.js +48 -0
  225. package/dist/utils/notebook-upload-utils.esm.js.map +1 -0
  226. package/dist/utils/notebooks-utils.esm.js +25 -0
  227. package/dist/utils/notebooks-utils.esm.js.map +1 -0
  228. package/dist/utils/prompt-utils.esm.js +17 -0
  229. package/dist/utils/prompt-utils.esm.js.map +1 -0
  230. package/dist/utils/queryClient.esm.js +6 -0
  231. package/dist/utils/queryClient.esm.js.map +1 -0
  232. package/dist/utils/reasoningParser.esm.js +33 -0
  233. package/dist/utils/reasoningParser.esm.js.map +1 -0
  234. package/dist/utils/toolCallMapper.esm.js +15 -0
  235. package/dist/utils/toolCallMapper.esm.js.map +1 -0
  236. package/dist/utils/user-utils.esm.js +7 -0
  237. package/dist/utils/user-utils.esm.js.map +1 -0
  238. package/package.json +182 -0
@@ -0,0 +1,235 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { makeStyles, Typography } from '@material-ui/core';
4
+ import { Tooltip, Button, Spinner, Dropdown, DropdownList, DropdownItem, MenuToggle } from '@patternfly/react-core';
5
+ import { PlusCircleIcon, EllipsisVIcon } from '@patternfly/react-icons';
6
+ import { NOTEBOOK_MAX_FILES } from '../../const.esm.js';
7
+ import { useTranslation } from '../../hooks/useTranslation.esm.js';
8
+ import { FileTypeIcon } from './FileTypeIcon.esm.js';
9
+ import { SidebarCollapseIcon } from './SidebarCollapseIcon.esm.js';
10
+
11
+ const useStyles = makeStyles((theme) => ({
12
+ sidebar: {
13
+ display: "flex",
14
+ flexDirection: "column",
15
+ width: "100%",
16
+ height: "100%",
17
+ padding: theme.spacing(2),
18
+ overflow: "hidden"
19
+ },
20
+ titleRow: {
21
+ display: "flex",
22
+ alignItems: "center",
23
+ justifyContent: "space-between",
24
+ marginBottom: theme.spacing(2),
25
+ gap: theme.spacing(1)
26
+ },
27
+ title: {
28
+ fontWeight: 500,
29
+ fontSize: "1.25rem",
30
+ lineHeight: "2rem",
31
+ letterSpacing: "-0.25px",
32
+ overflow: "hidden",
33
+ textOverflow: "ellipsis",
34
+ whiteSpace: "nowrap",
35
+ flex: 1,
36
+ minWidth: 0
37
+ },
38
+ collapseButton: {
39
+ flexShrink: 0
40
+ },
41
+ documentsRow: {
42
+ display: "flex",
43
+ alignItems: "center",
44
+ justifyContent: "space-between"
45
+ },
46
+ documentCount: {
47
+ fontWeight: 700,
48
+ fontSize: "1.125rem",
49
+ lineHeight: "2rem"
50
+ },
51
+ addButton: {
52
+ textTransform: "none"
53
+ },
54
+ documentsList: {
55
+ marginTop: theme.spacing(2),
56
+ display: "flex",
57
+ flexDirection: "column",
58
+ gap: theme.spacing(0.5),
59
+ overflowY: "auto",
60
+ flex: 1
61
+ },
62
+ documentItem: {
63
+ display: "flex",
64
+ alignItems: "center",
65
+ gap: theme.spacing(1),
66
+ padding: `${theme.spacing(1)}px ${theme.spacing(0.5)}px`,
67
+ borderRadius: 4
68
+ },
69
+ fileIcon: {
70
+ flexShrink: 0,
71
+ color: theme.palette.grey[500],
72
+ fontSize: "1rem"
73
+ },
74
+ fileName: {
75
+ flex: 1,
76
+ minWidth: 0,
77
+ overflow: "hidden",
78
+ textOverflow: "ellipsis",
79
+ whiteSpace: "nowrap",
80
+ fontSize: "0.875rem",
81
+ lineHeight: "1.25rem"
82
+ },
83
+ spinnerContainer: {
84
+ flexShrink: 0
85
+ },
86
+ kebabToggle: {
87
+ padding: 0,
88
+ flexShrink: 0
89
+ },
90
+ kebabDropdownMenu: {
91
+ "& .pf-v6-c-menu__list": {
92
+ paddingInlineStart: 0,
93
+ marginBlockStart: 0,
94
+ marginBlockEnd: 0
95
+ }
96
+ }
97
+ }));
98
+ const DocumentSidebar = ({
99
+ notebookName,
100
+ documents,
101
+ uploadingFileNames,
102
+ completedFileNames,
103
+ deletingDocumentIds,
104
+ collapsed,
105
+ hasUploadsInProgress,
106
+ onToggleCollapse,
107
+ onAddDocument,
108
+ onDeleteDocument
109
+ }) => {
110
+ const classes = useStyles();
111
+ const { t } = useTranslation();
112
+ const [openMenuDocId, setOpenMenuDocId] = useState(null);
113
+ if (collapsed) {
114
+ return null;
115
+ }
116
+ const uploadedNames = new Set(documents.map((d) => d.title));
117
+ const activePending = uploadingFileNames.filter(
118
+ (name) => !uploadedNames.has(name)
119
+ );
120
+ const totalCount = documents.length + activePending.length;
121
+ const isAddDisabled = totalCount >= NOTEBOOK_MAX_FILES;
122
+ return /* @__PURE__ */ jsxs("div", { className: classes.sidebar, children: [
123
+ /* @__PURE__ */ jsxs("div", { className: classes.titleRow, children: [
124
+ /* @__PURE__ */ jsx(Typography, { className: classes.title, children: notebookName }),
125
+ /* @__PURE__ */ jsx(Tooltip, { content: t("notebook.view.sidebar.collapse"), position: "right", children: /* @__PURE__ */ jsx(
126
+ Button,
127
+ {
128
+ variant: "plain",
129
+ className: classes.collapseButton,
130
+ onClick: onToggleCollapse,
131
+ "aria-label": t("notebook.view.sidebar.collapse"),
132
+ children: /* @__PURE__ */ jsx(SidebarCollapseIcon, {})
133
+ }
134
+ ) })
135
+ ] }),
136
+ /* @__PURE__ */ jsxs("div", { className: classes.documentsRow, children: [
137
+ /* @__PURE__ */ jsx(Typography, { className: classes.documentCount, children: t("notebook.view.documents.count", {
138
+ count: totalCount
139
+ }) }),
140
+ isAddDisabled ? /* @__PURE__ */ jsx(
141
+ Tooltip,
142
+ {
143
+ content: hasUploadsInProgress ? t("notebook.view.documents.uploadsInProgress") : t("notebook.view.documents.maxReached"),
144
+ position: "top",
145
+ children: /* @__PURE__ */ jsx(Typography, { component: "div", children: /* @__PURE__ */ jsx(
146
+ Button,
147
+ {
148
+ variant: "link",
149
+ className: classes.addButton,
150
+ icon: /* @__PURE__ */ jsx(PlusCircleIcon, {}),
151
+ isDisabled: true,
152
+ children: t("notebook.view.documents.add")
153
+ }
154
+ ) })
155
+ }
156
+ ) : /* @__PURE__ */ jsx(
157
+ Button,
158
+ {
159
+ variant: "link",
160
+ className: classes.addButton,
161
+ icon: /* @__PURE__ */ jsx(PlusCircleIcon, {}),
162
+ onClick: onAddDocument,
163
+ children: t("notebook.view.documents.add")
164
+ }
165
+ )
166
+ ] }),
167
+ (documents.length > 0 || activePending.length > 0) && /* @__PURE__ */ jsxs("div", { className: classes.documentsList, children: [
168
+ documents.map((doc) => /* @__PURE__ */ jsxs("div", { className: classes.documentItem, children: [
169
+ /* @__PURE__ */ jsx(FileTypeIcon, { fileName: doc.title }),
170
+ /* @__PURE__ */ jsx(Typography, { className: classes.fileName, children: doc.title }),
171
+ deletingDocumentIds?.has(doc.document_id) ? /* @__PURE__ */ jsx("div", { className: classes.spinnerContainer, children: /* @__PURE__ */ jsx(
172
+ Spinner,
173
+ {
174
+ size: "md",
175
+ "aria-label": t("notebook.document.delete")
176
+ }
177
+ ) }) : /* @__PURE__ */ jsx(
178
+ Dropdown,
179
+ {
180
+ className: classes.kebabDropdownMenu,
181
+ isOpen: openMenuDocId === doc.document_id,
182
+ popperProps: {
183
+ position: "end",
184
+ preventOverflow: true
185
+ },
186
+ onOpenChange: (isOpen) => setOpenMenuDocId(isOpen ? doc.document_id : null),
187
+ toggle: (toggleRef) => /* @__PURE__ */ jsx(
188
+ MenuToggle,
189
+ {
190
+ ref: toggleRef,
191
+ variant: "plain",
192
+ className: classes.kebabToggle,
193
+ isExpanded: openMenuDocId === doc.document_id,
194
+ onClick: (event) => {
195
+ event.stopPropagation();
196
+ setOpenMenuDocId(
197
+ (current) => current === doc.document_id ? null : doc.document_id
198
+ );
199
+ },
200
+ "aria-label": t("notebook.document.delete"),
201
+ children: /* @__PURE__ */ jsx(EllipsisVIcon, {})
202
+ }
203
+ ),
204
+ children: /* @__PURE__ */ jsx(DropdownList, { children: /* @__PURE__ */ jsx(
205
+ DropdownItem,
206
+ {
207
+ onClick: (event) => {
208
+ event.stopPropagation();
209
+ setOpenMenuDocId(null);
210
+ onDeleteDocument?.(doc.document_id);
211
+ },
212
+ children: t("notebook.document.delete")
213
+ },
214
+ "delete"
215
+ ) })
216
+ }
217
+ )
218
+ ] }, doc.document_id)),
219
+ activePending.map((fileName) => /* @__PURE__ */ jsxs("div", { className: classes.documentItem, children: [
220
+ /* @__PURE__ */ jsx(FileTypeIcon, { fileName }),
221
+ /* @__PURE__ */ jsx(Typography, { className: classes.fileName, children: fileName }),
222
+ !completedFileNames?.has(fileName) && /* @__PURE__ */ jsx("div", { className: classes.spinnerContainer, children: /* @__PURE__ */ jsx(
223
+ Spinner,
224
+ {
225
+ size: "md",
226
+ "aria-label": t("notebook.view.documents.uploading")
227
+ }
228
+ ) })
229
+ ] }, `pending-${fileName}`))
230
+ ] })
231
+ ] });
232
+ };
233
+
234
+ export { DocumentSidebar };
235
+ //# sourceMappingURL=DocumentSidebar.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentSidebar.esm.js","sources":["../../../src/components/notebooks/DocumentSidebar.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useState } from 'react';\n\nimport { makeStyles, Typography } from '@material-ui/core';\nimport {\n Button,\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n Spinner,\n Tooltip,\n} from '@patternfly/react-core';\nimport { EllipsisVIcon, PlusCircleIcon } from '@patternfly/react-icons';\n\nimport { NOTEBOOK_MAX_FILES } from '../../const';\nimport { useTranslation } from '../../hooks/useTranslation';\nimport { SessionDocument } from '../../types';\nimport { FileTypeIcon } from './FileTypeIcon';\nimport { SidebarCollapseIcon } from './SidebarCollapseIcon';\n\nconst useStyles = makeStyles(theme => ({\n sidebar: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n padding: theme.spacing(2),\n overflow: 'hidden',\n },\n titleRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing(2),\n gap: theme.spacing(1),\n },\n title: {\n fontWeight: 500,\n fontSize: '1.25rem',\n lineHeight: '2rem',\n letterSpacing: '-0.25px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n },\n collapseButton: {\n flexShrink: 0,\n },\n documentsRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n documentCount: {\n fontWeight: 700,\n fontSize: '1.125rem',\n lineHeight: '2rem',\n },\n addButton: {\n textTransform: 'none',\n },\n documentsList: {\n marginTop: theme.spacing(2),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n overflowY: 'auto',\n flex: 1,\n },\n documentItem: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n padding: `${theme.spacing(1)}px ${theme.spacing(0.5)}px`,\n borderRadius: 4,\n },\n fileIcon: {\n flexShrink: 0,\n color: theme.palette.grey[500],\n fontSize: '1rem',\n },\n fileName: {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '0.875rem',\n lineHeight: '1.25rem',\n },\n spinnerContainer: {\n flexShrink: 0,\n },\n kebabToggle: {\n padding: 0,\n flexShrink: 0,\n },\n kebabDropdownMenu: {\n '& .pf-v6-c-menu__list': {\n paddingInlineStart: 0,\n marginBlockStart: 0,\n marginBlockEnd: 0,\n },\n },\n}));\n\ntype DocumentSidebarProps = {\n notebookName: string;\n documents: SessionDocument[];\n uploadingFileNames: string[];\n completedFileNames?: Set<string>;\n deletingDocumentIds?: Set<string>;\n collapsed: boolean;\n hasUploadsInProgress?: boolean;\n onToggleCollapse: () => void;\n onAddDocument: () => void;\n onDeleteDocument?: (documentId: string) => void;\n};\n\nexport const DocumentSidebar = ({\n notebookName,\n documents,\n uploadingFileNames,\n completedFileNames,\n deletingDocumentIds,\n collapsed,\n hasUploadsInProgress,\n onToggleCollapse,\n onAddDocument,\n onDeleteDocument,\n}: DocumentSidebarProps) => {\n const classes = useStyles();\n const { t } = useTranslation();\n const [openMenuDocId, setOpenMenuDocId] = useState<string | null>(null);\n\n if (collapsed) {\n return null;\n }\n\n const uploadedNames = new Set(documents.map(d => d.title));\n const activePending = uploadingFileNames.filter(\n name => !uploadedNames.has(name),\n );\n const totalCount = documents.length + activePending.length;\n const isAddDisabled = totalCount >= NOTEBOOK_MAX_FILES;\n\n return (\n <div className={classes.sidebar}>\n <div className={classes.titleRow}>\n <Typography className={classes.title}>{notebookName}</Typography>\n <Tooltip content={t('notebook.view.sidebar.collapse')} position=\"right\">\n <Button\n variant=\"plain\"\n className={classes.collapseButton}\n onClick={onToggleCollapse}\n aria-label={t('notebook.view.sidebar.collapse')}\n >\n <SidebarCollapseIcon />\n </Button>\n </Tooltip>\n </div>\n\n <div className={classes.documentsRow}>\n <Typography className={classes.documentCount}>\n {t('notebook.view.documents.count', {\n count: totalCount,\n } as any)}\n </Typography>\n {isAddDisabled ? (\n <Tooltip\n content={\n hasUploadsInProgress\n ? t('notebook.view.documents.uploadsInProgress')\n : t('notebook.view.documents.maxReached')\n }\n position=\"top\"\n >\n <Typography component=\"div\">\n <Button\n variant=\"link\"\n className={classes.addButton}\n icon={<PlusCircleIcon />}\n isDisabled\n >\n {t('notebook.view.documents.add')}\n </Button>\n </Typography>\n </Tooltip>\n ) : (\n <Button\n variant=\"link\"\n className={classes.addButton}\n icon={<PlusCircleIcon />}\n onClick={onAddDocument}\n >\n {t('notebook.view.documents.add')}\n </Button>\n )}\n </div>\n\n {(documents.length > 0 || activePending.length > 0) && (\n <div className={classes.documentsList}>\n {documents.map(doc => (\n <div key={doc.document_id} className={classes.documentItem}>\n <FileTypeIcon fileName={doc.title} />\n <Typography className={classes.fileName}>{doc.title}</Typography>\n {deletingDocumentIds?.has(doc.document_id) ? (\n <div className={classes.spinnerContainer}>\n <Spinner\n size=\"md\"\n aria-label={t('notebook.document.delete')}\n />\n </div>\n ) : (\n <Dropdown\n className={classes.kebabDropdownMenu}\n isOpen={openMenuDocId === doc.document_id}\n popperProps={{\n position: 'end',\n preventOverflow: true,\n }}\n onOpenChange={isOpen =>\n setOpenMenuDocId(isOpen ? doc.document_id : null)\n }\n toggle={toggleRef => (\n <MenuToggle\n ref={toggleRef}\n variant=\"plain\"\n className={classes.kebabToggle}\n isExpanded={openMenuDocId === doc.document_id}\n onClick={event => {\n event.stopPropagation();\n setOpenMenuDocId(current =>\n current === doc.document_id ? null : doc.document_id,\n );\n }}\n aria-label={t('notebook.document.delete')}\n >\n <EllipsisVIcon />\n </MenuToggle>\n )}\n >\n <DropdownList>\n <DropdownItem\n key=\"delete\"\n onClick={event => {\n event.stopPropagation();\n setOpenMenuDocId(null);\n onDeleteDocument?.(doc.document_id);\n }}\n >\n {t('notebook.document.delete')}\n </DropdownItem>\n </DropdownList>\n </Dropdown>\n )}\n </div>\n ))}\n {activePending.map(fileName => (\n <div key={`pending-${fileName}`} className={classes.documentItem}>\n <FileTypeIcon fileName={fileName} />\n <Typography className={classes.fileName}>{fileName}</Typography>\n {!completedFileNames?.has(fileName) && (\n <div className={classes.spinnerContainer}>\n <Spinner\n size=\"md\"\n aria-label={t('notebook.view.documents.uploading')}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makeStyles } from '@material-ui/core/styles';
3
+ import CloseIcon from '@mui/icons-material/Close';
4
+ import Box from '@mui/material/Box';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import Typography from '@mui/material/Typography';
7
+ import { FileTypeIcon } from './FileTypeIcon.esm.js';
8
+
9
+ const useStyles = makeStyles((theme) => ({
10
+ container: {
11
+ display: "flex",
12
+ alignItems: "center",
13
+ padding: "8px 12px",
14
+ borderRadius: 8,
15
+ backgroundColor: theme.palette.type === "dark" ? "#2a2a2a" : "#f5f5f5",
16
+ marginBottom: 8,
17
+ "&:last-child": {
18
+ marginBottom: 0
19
+ }
20
+ },
21
+ fileInfo: {
22
+ display: "flex",
23
+ alignItems: "center",
24
+ flex: 1,
25
+ minWidth: 0,
26
+ gap: 12
27
+ },
28
+ fileName: {
29
+ flex: 1,
30
+ minWidth: 0,
31
+ overflow: "hidden",
32
+ textOverflow: "ellipsis",
33
+ whiteSpace: "nowrap",
34
+ fontSize: "0.875rem"
35
+ },
36
+ fileSize: {
37
+ color: theme.palette.text.secondary,
38
+ fontSize: "0.75rem",
39
+ flexShrink: 0,
40
+ marginRight: 8
41
+ },
42
+ removeButton: {
43
+ padding: 4,
44
+ color: theme.palette.action.active,
45
+ "&:hover": {
46
+ color: theme.palette.error.main
47
+ }
48
+ }
49
+ }));
50
+ const formatFileSize = (bytes) => {
51
+ if (bytes === 0) return "0 B";
52
+ const k = 1024;
53
+ const sizes = ["B", "KB", "MB", "GB"];
54
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
55
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
56
+ };
57
+ const MAX_FILENAME_LENGTH = 30;
58
+ const truncateFileName = (fileName, maxLength) => {
59
+ if (fileName.length <= maxLength) return fileName;
60
+ const lastDot = fileName.lastIndexOf(".");
61
+ const extension = lastDot >= 0 ? fileName.slice(lastDot) : "";
62
+ const baseName = lastDot >= 0 ? fileName.slice(0, lastDot) : fileName;
63
+ const availableLength = maxLength - extension.length - 3;
64
+ if (availableLength <= 0) return fileName;
65
+ return `${baseName.slice(0, availableLength)}...${extension}`;
66
+ };
67
+ const FileListItem = ({
68
+ file,
69
+ onRemove,
70
+ removeAriaLabel = "Remove file"
71
+ }) => {
72
+ const classes = useStyles();
73
+ const displayName = truncateFileName(file.name, MAX_FILENAME_LENGTH);
74
+ return /* @__PURE__ */ jsxs(Box, { className: classes.container, children: [
75
+ /* @__PURE__ */ jsxs(Box, { className: classes.fileInfo, children: [
76
+ /* @__PURE__ */ jsx(FileTypeIcon, { fileName: file.name }),
77
+ /* @__PURE__ */ jsx(Typography, { className: classes.fileName, title: file.name, children: displayName })
78
+ ] }),
79
+ /* @__PURE__ */ jsx(Typography, { className: classes.fileSize, children: formatFileSize(file.size) }),
80
+ /* @__PURE__ */ jsx(
81
+ IconButton,
82
+ {
83
+ className: classes.removeButton,
84
+ onClick: onRemove,
85
+ "aria-label": removeAriaLabel,
86
+ size: "small",
87
+ children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" })
88
+ }
89
+ )
90
+ ] });
91
+ };
92
+
93
+ export { FileListItem };
94
+ //# sourceMappingURL=FileListItem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileListItem.esm.js","sources":["../../../src/components/notebooks/FileListItem.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\n\nimport { FileTypeIcon } from './FileTypeIcon';\n\nconst useStyles = makeStyles(theme => ({\n container: {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 12px',\n borderRadius: 8,\n backgroundColor: theme.palette.type === 'dark' ? '#2a2a2a' : '#f5f5f5',\n marginBottom: 8,\n '&:last-child': {\n marginBottom: 0,\n },\n },\n fileInfo: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: 12,\n },\n fileName: {\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n fontSize: '0.875rem',\n },\n fileSize: {\n color: theme.palette.text.secondary,\n fontSize: '0.75rem',\n flexShrink: 0,\n marginRight: 8,\n },\n removeButton: {\n padding: 4,\n color: theme.palette.action.active,\n '&:hover': {\n color: theme.palette.error.main,\n },\n },\n}));\n\ntype FileListItemProps = {\n file: File;\n onRemove: () => void;\n removeAriaLabel?: string;\n};\n\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n};\n\nconst MAX_FILENAME_LENGTH = 30;\n\nconst truncateFileName = (fileName: string, maxLength: number): string => {\n if (fileName.length <= maxLength) return fileName;\n\n const lastDot = fileName.lastIndexOf('.');\n const extension = lastDot >= 0 ? fileName.slice(lastDot) : '';\n const baseName = lastDot >= 0 ? fileName.slice(0, lastDot) : fileName;\n\n const availableLength = maxLength - extension.length - 3;\n if (availableLength <= 0) return fileName;\n\n return `${baseName.slice(0, availableLength)}...${extension}`;\n};\n\nexport const FileListItem = ({\n file,\n onRemove,\n removeAriaLabel = 'Remove file',\n}: FileListItemProps) => {\n const classes = useStyles();\n const displayName = truncateFileName(file.name, MAX_FILENAME_LENGTH);\n\n return (\n <Box className={classes.container}>\n <Box className={classes.fileInfo}>\n <FileTypeIcon fileName={file.name} />\n <Typography className={classes.fileName} title={file.name}>\n {displayName}\n </Typography>\n </Box>\n <Typography className={classes.fileSize}>\n {formatFileSize(file.size)}\n </Typography>\n <IconButton\n className={classes.removeButton}\n onClick={onRemove}\n aria-label={removeAriaLabel}\n size=\"small\"\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makeStyles } from '@material-ui/core';
3
+
4
+ const FILE_TYPE_COLORS = {
5
+ pdf: "#C9190B",
6
+ yaml: "#F0AB00",
7
+ yml: "#F0AB00",
8
+ json: "#F0AB00",
9
+ csv: "#3E8635",
10
+ txt: "#6A6E73",
11
+ md: "#0066CC",
12
+ log: "#6A6E73",
13
+ docx: "#004B95",
14
+ odt: "#009596",
15
+ html: "#EC7A08",
16
+ xml: "#0066CC",
17
+ rtf: "#8476D1",
18
+ pptx: "#C9190B"
19
+ };
20
+ const DEFAULT_COLOR = "#6A6E73";
21
+ const useStyles = makeStyles(() => ({
22
+ badge: {
23
+ display: "inline-flex",
24
+ alignItems: "center",
25
+ justifyContent: "center",
26
+ minWidth: 28,
27
+ height: 22,
28
+ padding: "0 4px",
29
+ borderRadius: 4,
30
+ border: "1.5px solid",
31
+ fontSize: "0.625rem",
32
+ fontWeight: 700,
33
+ textTransform: "uppercase",
34
+ lineHeight: 1,
35
+ flexShrink: 0
36
+ }
37
+ }));
38
+ const getExtension = (fileName) => {
39
+ if (!fileName) return "";
40
+ const lastDot = fileName.lastIndexOf(".");
41
+ return lastDot >= 0 ? fileName.slice(lastDot + 1).toLowerCase() : "";
42
+ };
43
+ const FileTypeIcon = ({ fileName, className }) => {
44
+ const classes = useStyles();
45
+ const ext = getExtension(fileName);
46
+ const color = FILE_TYPE_COLORS[ext] ?? DEFAULT_COLOR;
47
+ const label = ext || "?";
48
+ return /* @__PURE__ */ jsx(
49
+ "span",
50
+ {
51
+ className: `${classes.badge}${className ? ` ${className}` : ""}`,
52
+ style: { borderColor: color, color },
53
+ children: label
54
+ }
55
+ );
56
+ };
57
+
58
+ export { FileTypeIcon };
59
+ //# sourceMappingURL=FileTypeIcon.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTypeIcon.esm.js","sources":["../../../src/components/notebooks/FileTypeIcon.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core';\n\nconst FILE_TYPE_COLORS: Record<string, string> = {\n pdf: '#C9190B',\n yaml: '#F0AB00',\n yml: '#F0AB00',\n json: '#F0AB00',\n csv: '#3E8635',\n txt: '#6A6E73',\n md: '#0066CC',\n log: '#6A6E73',\n docx: '#004B95',\n odt: '#009596',\n html: '#EC7A08',\n xml: '#0066CC',\n rtf: '#8476D1',\n pptx: '#C9190B',\n};\n\nconst DEFAULT_COLOR = '#6A6E73';\n\nconst useStyles = makeStyles(() => ({\n badge: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 28,\n height: 22,\n padding: '0 4px',\n borderRadius: 4,\n border: '1.5px solid',\n fontSize: '0.625rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n lineHeight: 1,\n flexShrink: 0,\n },\n}));\n\ntype FileTypeIconProps = {\n fileName: string;\n className?: string;\n};\n\nconst getExtension = (fileName: string): string => {\n if (!fileName) return '';\n const lastDot = fileName.lastIndexOf('.');\n return lastDot >= 0 ? fileName.slice(lastDot + 1).toLowerCase() : '';\n};\n\nexport const FileTypeIcon = ({ fileName, className }: FileTypeIconProps) => {\n const classes = useStyles();\n const ext = getExtension(fileName);\n const color = FILE_TYPE_COLORS[ext] ?? DEFAULT_COLOR;\n const label = ext || '?';\n\n return (\n <span\n className={`${classes.badge}${className ? ` ${className}` : ''}`}\n style={{ borderColor: color, color }}\n >\n {label}\n </span>\n );\n};\n"],"names":[],"mappings":";;;AAkBA,MAAM,gBAAA,GAA2C;AAAA,EAC/C,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,EAAA,EAAI,SAAA;AAAA,EACJ,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,MAAM,aAAA,GAAgB,SAAA;AAEtB,MAAM,SAAA,GAAY,WAAW,OAAO;AAAA,EAClC,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,OAAA,EAAS,OAAA;AAAA,IACT,YAAA,EAAc,CAAA;AAAA,IACd,MAAA,EAAQ,aAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,aAAA,EAAe,WAAA;AAAA,IACf,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA;AAEhB,CAAA,CAAE,CAAA;AAOF,MAAM,YAAA,GAAe,CAAC,QAAA,KAA6B;AACjD,EAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACxC,EAAA,OAAO,OAAA,IAAW,IAAI,QAAA,CAAS,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,aAAY,GAAI,EAAA;AACpE,CAAA;AAEO,MAAM,YAAA,GAAe,CAAC,EAAE,QAAA,EAAU,WAAU,KAAyB;AAC1E,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAG,CAAA,IAAK,aAAA;AACvC,EAAA,MAAM,QAAQ,GAAA,IAAO,GAAA;AAErB,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAG,OAAA,CAAQ,KAAK,GAAG,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MAC9D,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAM;AAAA,MAElC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -0,0 +1,118 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Typography from '@mui/material/Typography';
3
+ import { Card, CardHeader, CardTitle, Dropdown, DropdownList, DropdownItem, MenuToggle, CardBody } from '@patternfly/react-core';
4
+ import { EllipsisVIcon } from '@patternfly/react-icons';
5
+ import { CatalogIcon } from '@patternfly/react-icons/dist/esm/icons';
6
+ import { formatUpdatedLabel } from '../../utils/notebooks-utils.esm.js';
7
+
8
+ const NotebookCard = ({
9
+ notebook,
10
+ classes,
11
+ openNotebookMenuId,
12
+ setOpenNotebookMenuId,
13
+ onClick,
14
+ onRename,
15
+ onDelete,
16
+ t
17
+ }) => {
18
+ const isMenuOpen = openNotebookMenuId === notebook.session_id;
19
+ const handleCardKeyDown = (e) => {
20
+ if (e.key === "Enter" || e.key === " ") {
21
+ e.preventDefault();
22
+ onClick(notebook);
23
+ }
24
+ };
25
+ return /* @__PURE__ */ jsxs(
26
+ Card,
27
+ {
28
+ className: classes.notebookCard,
29
+ component: "div",
30
+ tabIndex: 0,
31
+ "aria-label": t("notebooks.card.openAria", { name: notebook.name }),
32
+ onClick: () => onClick(notebook),
33
+ onKeyDown: handleCardKeyDown,
34
+ children: [
35
+ /* @__PURE__ */ jsx(
36
+ CardHeader,
37
+ {
38
+ className: classes.notebookCardHeader,
39
+ actions: {
40
+ actions: /* @__PURE__ */ jsx(
41
+ Dropdown,
42
+ {
43
+ className: classes.notebookDropdownMenu,
44
+ isOpen: isMenuOpen,
45
+ popperProps: {
46
+ position: "end",
47
+ preventOverflow: true
48
+ },
49
+ onOpenChange: (isOpen) => setOpenNotebookMenuId(isOpen ? notebook.session_id : null),
50
+ toggle: (toggleRef) => /* @__PURE__ */ jsx(
51
+ MenuToggle,
52
+ {
53
+ ref: toggleRef,
54
+ variant: "plain",
55
+ className: classes.notebookMenuButton,
56
+ "aria-label": t("aria.options.label"),
57
+ isExpanded: isMenuOpen,
58
+ onClick: (event) => {
59
+ event.stopPropagation();
60
+ setOpenNotebookMenuId(
61
+ (current) => current === notebook.session_id ? null : notebook.session_id
62
+ );
63
+ },
64
+ children: /* @__PURE__ */ jsx(EllipsisVIcon, {})
65
+ }
66
+ ),
67
+ children: /* @__PURE__ */ jsxs(DropdownList, { className: classes.notebookDropdownList, children: [
68
+ /* @__PURE__ */ jsx(
69
+ DropdownItem,
70
+ {
71
+ className: classes.notebookDropdownItem,
72
+ onClick: (event) => {
73
+ event.stopPropagation();
74
+ onRename(notebook.session_id);
75
+ setOpenNotebookMenuId(null);
76
+ },
77
+ children: t("notebooks.actions.rename")
78
+ }
79
+ ),
80
+ /* @__PURE__ */ jsx(
81
+ DropdownItem,
82
+ {
83
+ className: classes.notebookDropdownItem,
84
+ onClick: (event) => {
85
+ event.stopPropagation();
86
+ onDelete(notebook.session_id);
87
+ setOpenNotebookMenuId(null);
88
+ },
89
+ children: t("notebooks.actions.delete")
90
+ }
91
+ )
92
+ ] })
93
+ }
94
+ ),
95
+ className: classes.notebookCardHeaderActions
96
+ },
97
+ children: /* @__PURE__ */ jsxs(CardTitle, { className: classes.notebookTitle, children: [
98
+ /* @__PURE__ */ jsx(CatalogIcon, {}),
99
+ /* @__PURE__ */ jsx(Typography, { component: "span", className: classes.notebookTitleText, children: notebook.name })
100
+ ] })
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx("div", { className: classes.notebookCardDivider }),
104
+ /* @__PURE__ */ jsx(CardBody, { className: classes.notebookCardBody, children: /* @__PURE__ */ jsxs("div", { children: [
105
+ /* @__PURE__ */ jsx("div", { className: classes.notebookDocuments, children: /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
106
+ notebook.document_count ?? 0,
107
+ " ",
108
+ t("notebooks.documents")
109
+ ] }) }),
110
+ /* @__PURE__ */ jsx("div", { className: classes.notebookUpdated, children: /* @__PURE__ */ jsx(Typography, { variant: "caption", children: formatUpdatedLabel(notebook.updated_at, t) }) })
111
+ ] }) })
112
+ ]
113
+ }
114
+ );
115
+ };
116
+
117
+ export { NotebookCard };
118
+ //# sourceMappingURL=NotebookCard.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotebookCard.esm.js","sources":["../../../src/components/notebooks/NotebookCard.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { TranslationFunction } from '@backstage/core-plugin-api/alpha';\n\nimport Typography from '@mui/material/Typography';\nimport {\n Card,\n CardBody,\n CardHeader,\n CardTitle,\n Dropdown,\n DropdownItem,\n DropdownList,\n MenuToggle,\n} from '@patternfly/react-core';\nimport { EllipsisVIcon } from '@patternfly/react-icons';\nimport { CatalogIcon } from '@patternfly/react-icons/dist/esm/icons';\n\nimport { intelligentAssistantTranslationRef } from '../../translations/ref';\nimport { NotebookSession } from '../../types';\nimport { formatUpdatedLabel } from '../../utils/notebooks-utils';\n\ntype NotebookCardProps = {\n notebook: NotebookSession;\n classes: Record<string, string>;\n openNotebookMenuId: string | null;\n setOpenNotebookMenuId: React.Dispatch<React.SetStateAction<string | null>>;\n onClick: (notebook: NotebookSession) => void;\n onRename: (sessionId: string) => void;\n onDelete: (sessionId: string) => void;\n t: TranslationFunction<typeof intelligentAssistantTranslationRef.T>;\n};\n\nexport const NotebookCard = ({\n notebook,\n classes,\n openNotebookMenuId,\n setOpenNotebookMenuId,\n onClick,\n onRename,\n onDelete,\n t,\n}: NotebookCardProps) => {\n const isMenuOpen = openNotebookMenuId === notebook.session_id;\n\n const handleCardKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick(notebook);\n }\n };\n\n return (\n <Card\n className={classes.notebookCard}\n component=\"div\"\n tabIndex={0}\n aria-label={t('notebooks.card.openAria' as any, { name: notebook.name })}\n onClick={() => onClick(notebook)}\n onKeyDown={handleCardKeyDown}\n >\n <CardHeader\n className={classes.notebookCardHeader}\n actions={{\n actions: (\n <Dropdown\n className={classes.notebookDropdownMenu}\n isOpen={isMenuOpen}\n popperProps={{\n position: 'end',\n preventOverflow: true,\n }}\n onOpenChange={isOpen =>\n setOpenNotebookMenuId(isOpen ? notebook.session_id : null)\n }\n toggle={toggleRef => (\n <MenuToggle\n ref={toggleRef}\n variant=\"plain\"\n className={classes.notebookMenuButton}\n aria-label={t('aria.options.label')}\n isExpanded={isMenuOpen}\n onClick={event => {\n event.stopPropagation();\n setOpenNotebookMenuId(current =>\n current === notebook.session_id\n ? null\n : notebook.session_id,\n );\n }}\n >\n <EllipsisVIcon />\n </MenuToggle>\n )}\n >\n <DropdownList className={classes.notebookDropdownList}>\n <DropdownItem\n className={classes.notebookDropdownItem}\n onClick={event => {\n event.stopPropagation();\n onRename(notebook.session_id);\n setOpenNotebookMenuId(null);\n }}\n >\n {t('notebooks.actions.rename')}\n </DropdownItem>\n <DropdownItem\n className={classes.notebookDropdownItem}\n onClick={event => {\n event.stopPropagation();\n onDelete(notebook.session_id);\n setOpenNotebookMenuId(null);\n }}\n >\n {t('notebooks.actions.delete')}\n </DropdownItem>\n </DropdownList>\n </Dropdown>\n ),\n className: classes.notebookCardHeaderActions,\n }}\n >\n <CardTitle className={classes.notebookTitle}>\n <CatalogIcon />\n <Typography component=\"span\" className={classes.notebookTitleText}>\n {notebook.name}\n </Typography>\n </CardTitle>\n </CardHeader>\n <div className={classes.notebookCardDivider} />\n <CardBody className={classes.notebookCardBody}>\n <div>\n <div className={classes.notebookDocuments}>\n <Typography variant=\"body2\">\n {notebook.document_count ?? 0} {t('notebooks.documents')}\n </Typography>\n </div>\n <div className={classes.notebookUpdated}>\n <Typography variant=\"caption\">\n {formatUpdatedLabel(notebook.updated_at, t)}\n </Typography>\n </div>\n </div>\n </CardBody>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA+CO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,UAAA,GAAa,uBAAuB,QAAA,CAAS,UAAA;AAEnD,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAA,KAA2B;AACpD,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,YAAA;AAAA,MACnB,SAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,CAAA;AAAA,MACV,cAAY,CAAA,CAAE,yBAAA,EAAkC,EAAE,IAAA,EAAM,QAAA,CAAS,MAAM,CAAA;AAAA,MACvE,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC/B,SAAA,EAAW,iBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,WAAW,OAAA,CAAQ,kBAAA;AAAA,YACnB,OAAA,EAAS;AAAA,cACP,OAAA,kBACE,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,WAAW,OAAA,CAAQ,oBAAA;AAAA,kBACnB,MAAA,EAAQ,UAAA;AAAA,kBACR,WAAA,EAAa;AAAA,oBACX,QAAA,EAAU,KAAA;AAAA,oBACV,eAAA,EAAiB;AAAA,mBACnB;AAAA,kBACA,cAAc,CAAA,MAAA,KACZ,qBAAA,CAAsB,MAAA,GAAS,QAAA,CAAS,aAAa,IAAI,CAAA;AAAA,kBAE3D,QAAQ,CAAA,SAAA,qBACN,GAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,GAAA,EAAK,SAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBACR,WAAW,OAAA,CAAQ,kBAAA;AAAA,sBACnB,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,sBAClC,UAAA,EAAY,UAAA;AAAA,sBACZ,SAAS,CAAA,KAAA,KAAS;AAChB,wBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,wBAAA,qBAAA;AAAA,0BAAsB,CAAA,OAAA,KACpB,OAAA,KAAY,QAAA,CAAS,UAAA,GACjB,OACA,QAAA,CAAS;AAAA,yBACf;AAAA,sBACF,CAAA;AAAA,sBAEA,8BAAC,aAAA,EAAA,EAAc;AAAA;AAAA,mBACjB;AAAA,kBAGF,QAAA,kBAAA,IAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,OAAA,CAAQ,oBAAA,EAC/B,QAAA,EAAA;AAAA,oCAAA,GAAA;AAAA,sBAAC,YAAA;AAAA,sBAAA;AAAA,wBACC,WAAW,OAAA,CAAQ,oBAAA;AAAA,wBACnB,SAAS,CAAA,KAAA,KAAS;AAChB,0BAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,0BAAA,QAAA,CAAS,SAAS,UAAU,CAAA;AAC5B,0BAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,wBAC5B,CAAA;AAAA,wBAEC,YAAE,0BAA0B;AAAA;AAAA,qBAC/B;AAAA,oCACA,GAAA;AAAA,sBAAC,YAAA;AAAA,sBAAA;AAAA,wBACC,WAAW,OAAA,CAAQ,oBAAA;AAAA,wBACnB,SAAS,CAAA,KAAA,KAAS;AAChB,0BAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,0BAAA,QAAA,CAAS,SAAS,UAAU,CAAA;AAC5B,0BAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,wBAC5B,CAAA;AAAA,wBAEC,YAAE,0BAA0B;AAAA;AAAA;AAC/B,mBAAA,EACF;AAAA;AAAA,eACF;AAAA,cAEF,WAAW,OAAA,CAAQ;AAAA,aACrB;AAAA,YAEA,QAAA,kBAAA,IAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,aAAA,EAC5B,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,8BACb,GAAA,CAAC,cAAW,SAAA,EAAU,MAAA,EAAO,WAAW,OAAA,CAAQ,iBAAA,EAC7C,mBAAS,IAAA,EACZ;AAAA,aAAA,EACF;AAAA;AAAA,SACF;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,mBAAA,EAAqB,CAAA;AAAA,4BAC5C,QAAA,EAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,gBAAA,EAC3B,+BAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,mBACtB,QAAA,kBAAA,IAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,OAAA,EACjB,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,cAAA,IAAkB,CAAA;AAAA,YAAE,GAAA;AAAA,YAAE,EAAE,qBAAqB;AAAA,WAAA,EACzD,CAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,iBACtB,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EACjB,QAAA,EAAA,kBAAA,CAAmB,QAAA,CAAS,UAAA,EAAY,CAAC,GAC5C,CAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}