@red-hat-developer-hub/backstage-plugin-intelligent-assistant 3.2.0 → 4.1.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 (63) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +7 -10
  3. package/config.d.ts +27 -0
  4. package/dist/alpha.d.ts +21 -7
  5. package/dist/api/NotebooksApiClient.esm.js +10 -0
  6. package/dist/api/NotebooksApiClient.esm.js.map +1 -1
  7. package/dist/api/notebooksApi.esm.js.map +1 -1
  8. package/dist/components/LightSpeedChat.esm.js +50 -37
  9. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  10. package/dist/components/LightspeedChatContainer.esm.js +7 -5
  11. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  12. package/dist/components/McpServersSettings.esm.js +4 -3
  13. package/dist/components/McpServersSettings.esm.js.map +1 -1
  14. package/dist/components/notebooks/AddDocumentModal.esm.js +181 -66
  15. package/dist/components/notebooks/AddDocumentModal.esm.js.map +1 -1
  16. package/dist/components/notebooks/DocumentSidebar.esm.js +258 -27
  17. package/dist/components/notebooks/DocumentSidebar.esm.js.map +1 -1
  18. package/dist/components/notebooks/FileListItem.esm.js +15 -9
  19. package/dist/components/notebooks/FileListItem.esm.js.map +1 -1
  20. package/dist/components/notebooks/NotebookCard.esm.js +71 -14
  21. package/dist/components/notebooks/NotebookCard.esm.js.map +1 -1
  22. package/dist/components/notebooks/NotebookView.esm.js +202 -42
  23. package/dist/components/notebooks/NotebookView.esm.js.map +1 -1
  24. package/dist/components/notebooks/NotebooksTab.esm.js.map +1 -1
  25. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +122 -42
  26. package/dist/components/notebooks/OverwriteConfirmModal.esm.js.map +1 -1
  27. package/dist/components/notebooks/UploadResourceScreen.esm.js +0 -1
  28. package/dist/components/notebooks/UploadResourceScreen.esm.js.map +1 -1
  29. package/dist/const.esm.js +2 -1
  30. package/dist/const.esm.js.map +1 -1
  31. package/dist/hooks/notebooks/useInlineEdit.esm.js +60 -0
  32. package/dist/hooks/notebooks/useInlineEdit.esm.js.map +1 -0
  33. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js +4 -3
  34. package/dist/hooks/notebooks/useLightspeedNotebooksPermission.esm.js.map +1 -1
  35. package/dist/hooks/notebooks/useRenameDocument.esm.js +50 -0
  36. package/dist/hooks/notebooks/useRenameDocument.esm.js.map +1 -0
  37. package/dist/hooks/notebooks/useRenameNotebook.esm.js +48 -1
  38. package/dist/hooks/notebooks/useRenameNotebook.esm.js.map +1 -1
  39. package/dist/hooks/notebooks/useRenameNotebookWithAlert.esm.js +34 -0
  40. package/dist/hooks/notebooks/useRenameNotebookWithAlert.esm.js.map +1 -0
  41. package/dist/hooks/useLightspeedDeletePermission.esm.js +2 -2
  42. package/dist/hooks/useLightspeedDeletePermission.esm.js.map +1 -1
  43. package/dist/hooks/useLightspeedUpdatePermission.esm.js +2 -2
  44. package/dist/hooks/useLightspeedUpdatePermission.esm.js.map +1 -1
  45. package/dist/hooks/useLightspeedViewPermission.esm.js +6 -4
  46. package/dist/hooks/useLightspeedViewPermission.esm.js.map +1 -1
  47. package/dist/translations/de.esm.js +31 -17
  48. package/dist/translations/de.esm.js.map +1 -1
  49. package/dist/translations/es.esm.js +31 -17
  50. package/dist/translations/es.esm.js.map +1 -1
  51. package/dist/translations/fr.esm.js +31 -17
  52. package/dist/translations/fr.esm.js.map +1 -1
  53. package/dist/translations/it.esm.js +31 -17
  54. package/dist/translations/it.esm.js.map +1 -1
  55. package/dist/translations/ja.esm.js +31 -17
  56. package/dist/translations/ja.esm.js.map +1 -1
  57. package/dist/translations/ref.esm.js +32 -18
  58. package/dist/translations/ref.esm.js.map +1 -1
  59. package/dist/utils/notebook-upload-runner.esm.js +16 -0
  60. package/dist/utils/notebook-upload-runner.esm.js.map +1 -0
  61. package/package.json +4 -3
  62. package/dist/components/notebooks/RenameNotebookModal.esm.js +0 -187
  63. package/dist/components/notebooks/RenameNotebookModal.esm.js.map +0 -1
@@ -1,9 +1,10 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState } from 'react';
2
+ import { useState, useRef, useCallback } from 'react';
3
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';
4
+ import { TextInput, Tooltip, Button, HelperText, HelperTextItem, Spinner, Dropdown, DropdownList, DropdownItem, MenuToggle } from '@patternfly/react-core';
5
+ import { AddCircleOIcon, PenIcon, TrashIcon, EllipsisVIcon } from '@patternfly/react-icons';
6
+ import { NOTEBOOK_MAX_TITLE_LENGTH, NOTEBOOK_MAX_FILES } from '../../const.esm.js';
7
+ import { useInlineEdit } from '../../hooks/notebooks/useInlineEdit.esm.js';
7
8
  import { useTranslation } from '../../hooks/useTranslation.esm.js';
8
9
  import { FileTypeIcon } from './FileTypeIcon.esm.js';
9
10
  import { SidebarCollapseIcon } from './SidebarCollapseIcon.esm.js';
@@ -32,8 +33,27 @@ const useStyles = makeStyles((theme) => ({
32
33
  overflow: "hidden",
33
34
  textOverflow: "ellipsis",
34
35
  whiteSpace: "nowrap",
36
+ flex: "0 1 auto",
37
+ minWidth: 0,
38
+ cursor: "pointer",
39
+ borderRadius: 4,
40
+ padding: "2px 6px",
41
+ "&:hover": {
42
+ backgroundColor: "var(--pf-t--global--background--color--action--plain--hover)"
43
+ }
44
+ },
45
+ titleInput: {
35
46
  flex: 1,
36
- minWidth: 0
47
+ minWidth: 0,
48
+ "--pf-v6-c-form-control--FontSize": "1.25rem",
49
+ "--pf-v6-c-form-control--LineHeight": "2rem",
50
+ "--pf-v6-c-form-control--before--BorderStyle": "none",
51
+ "& input": {
52
+ fontWeight: 500,
53
+ letterSpacing: "-0.25px",
54
+ padding: "0 4px",
55
+ outline: "none"
56
+ }
37
57
  },
38
58
  collapseButton: {
39
59
  flexShrink: 0
@@ -61,10 +81,19 @@ const useStyles = makeStyles((theme) => ({
61
81
  },
62
82
  documentItem: {
63
83
  display: "flex",
64
- alignItems: "center",
84
+ alignItems: "flex-start",
65
85
  gap: theme.spacing(1),
66
86
  padding: `${theme.spacing(1)}px ${theme.spacing(0.5)}px`,
67
- borderRadius: 4
87
+ borderRadius: 4,
88
+ "&:hover": {
89
+ backgroundColor: "var(--pf-t--global--background--color--action--plain--hover)"
90
+ },
91
+ "&:hover .doc-kebab": {
92
+ visibility: "visible"
93
+ },
94
+ "&:focus-within .doc-kebab": {
95
+ visibility: "visible"
96
+ }
68
97
  },
69
98
  fileIcon: {
70
99
  flexShrink: 0,
@@ -78,14 +107,60 @@ const useStyles = makeStyles((theme) => ({
78
107
  textOverflow: "ellipsis",
79
108
  whiteSpace: "nowrap",
80
109
  fontSize: "0.875rem",
81
- lineHeight: "1.25rem"
110
+ lineHeight: "1.25rem",
111
+ cursor: "pointer",
112
+ borderRadius: 4,
113
+ padding: "2px 6px",
114
+ "&:hover": {
115
+ backgroundColor: "var(--pf-t--global--background--color--action--plain--hover)"
116
+ }
117
+ },
118
+ renameContainer: {
119
+ display: "flex",
120
+ alignItems: "center",
121
+ flexWrap: "wrap",
122
+ flex: 1,
123
+ minWidth: 0
124
+ },
125
+ renameInput: {
126
+ flex: 1,
127
+ minWidth: 0,
128
+ alignItems: "center",
129
+ "--pf-v6-c-form-control--m-error--after--BorderWidth": "2px",
130
+ "--pf-v6-c-form-control--FontSize": "0.875rem",
131
+ "--pf-v6-c-form-control--LineHeight": "1.25rem",
132
+ "& input": {
133
+ padding: "2px 4px",
134
+ outline: "none"
135
+ },
136
+ // Override PF6 asymmetric padding to center the error icon vertically
137
+ "& .pf-v6-c-form-control__utilities": {
138
+ alignSelf: "center",
139
+ alignItems: "center",
140
+ paddingTop: 0,
141
+ paddingBottom: 0
142
+ }
143
+ },
144
+ renameExtension: {
145
+ flexShrink: 0,
146
+ fontSize: "0.875rem",
147
+ lineHeight: "1.25rem",
148
+ whiteSpace: "nowrap"
149
+ },
150
+ renameHelperText: {
151
+ width: "100%",
152
+ paddingTop: 4,
153
+ "& .pf-v6-c-helper-text__item-text": {
154
+ color: "var(--pf-t--global--color--status--danger--default)"
155
+ }
82
156
  },
83
157
  spinnerContainer: {
84
158
  flexShrink: 0
85
159
  },
86
160
  kebabToggle: {
87
161
  padding: 0,
88
- flexShrink: 0
162
+ flexShrink: 0,
163
+ visibility: "hidden"
89
164
  },
90
165
  kebabDropdownMenu: {
91
166
  "& .pf-v6-c-menu__list": {
@@ -95,6 +170,15 @@ const useStyles = makeStyles((theme) => ({
95
170
  }
96
171
  }
97
172
  }));
173
+ const splitFileName = (fileName) => {
174
+ if (!fileName) return { baseName: "", extension: "" };
175
+ const lastDot = fileName.lastIndexOf(".");
176
+ if (lastDot <= 0) return { baseName: fileName, extension: "" };
177
+ return {
178
+ baseName: fileName.slice(0, lastDot),
179
+ extension: fileName.slice(lastDot)
180
+ };
181
+ };
98
182
  const DocumentSidebar = ({
99
183
  notebookName,
100
184
  documents,
@@ -105,11 +189,93 @@ const DocumentSidebar = ({
105
189
  hasUploadsInProgress,
106
190
  onToggleCollapse,
107
191
  onAddDocument,
108
- onDeleteDocument
192
+ onDeleteDocument,
193
+ onRenameDocument,
194
+ onRenameNotebook
109
195
  }) => {
110
196
  const classes = useStyles();
111
197
  const { t } = useTranslation();
112
198
  const [openMenuDocId, setOpenMenuDocId] = useState(null);
199
+ const [editingDocId, setEditingDocId] = useState(null);
200
+ const [editName, setEditName] = useState("");
201
+ const inputRef = useRef(null);
202
+ const startEditing = useCallback((docId, currentTitle) => {
203
+ const { baseName } = splitFileName(currentTitle);
204
+ setEditingDocId(docId);
205
+ setEditName(baseName);
206
+ setOpenMenuDocId(null);
207
+ setTimeout(() => {
208
+ inputRef.current?.focus();
209
+ inputRef.current?.select();
210
+ }, 0);
211
+ }, []);
212
+ const cancelEditing = useCallback(() => {
213
+ setEditingDocId(null);
214
+ setEditName("");
215
+ }, []);
216
+ const getValidationError = useCallback(
217
+ (docId, originalTitle) => {
218
+ const trimmedBase = editName.trim();
219
+ if (!trimmedBase) return null;
220
+ const { baseName, extension } = splitFileName(originalTitle);
221
+ if (trimmedBase === baseName) return null;
222
+ const newFullName = trimmedBase + extension;
223
+ if (newFullName.length > NOTEBOOK_MAX_TITLE_LENGTH) {
224
+ return t("notebook.document.rename.tooLong");
225
+ }
226
+ const conflict = documents.some(
227
+ (d) => d.document_id !== docId && d.title === newFullName
228
+ );
229
+ return conflict ? t("notebook.document.rename.conflict") : null;
230
+ },
231
+ [editName, documents, t]
232
+ );
233
+ const saveRename = useCallback(
234
+ (docId, originalTitle) => {
235
+ const trimmedBase = editName.trim();
236
+ const { baseName, extension } = splitFileName(originalTitle);
237
+ if (!trimmedBase || trimmedBase === baseName) {
238
+ cancelEditing();
239
+ return;
240
+ }
241
+ const newFullName = trimmedBase + extension;
242
+ if (newFullName.length > NOTEBOOK_MAX_TITLE_LENGTH) {
243
+ cancelEditing();
244
+ return;
245
+ }
246
+ if (documents.some((d) => d.document_id !== docId && d.title === newFullName)) {
247
+ cancelEditing();
248
+ return;
249
+ }
250
+ onRenameDocument?.(docId, newFullName);
251
+ cancelEditing();
252
+ },
253
+ [editName, documents, onRenameDocument, cancelEditing]
254
+ );
255
+ const handleKeyDown = useCallback(
256
+ (event, docId, originalTitle) => {
257
+ if (event.key === "Enter") {
258
+ event.preventDefault();
259
+ saveRename(docId, originalTitle);
260
+ } else if (event.key === "Escape") {
261
+ event.preventDefault();
262
+ cancelEditing();
263
+ }
264
+ },
265
+ [saveRename, cancelEditing]
266
+ );
267
+ const {
268
+ isEditing: isEditingTitle,
269
+ editValue: editTitle,
270
+ setEditValue: setEditTitle,
271
+ inputRef: titleInputRef,
272
+ startEditing: startEditingTitle,
273
+ save: saveTitle,
274
+ handleKeyDown: handleTitleKeyDown
275
+ } = useInlineEdit({
276
+ currentName: notebookName,
277
+ onSave: (newName) => onRenameNotebook?.(newName)
278
+ });
113
279
  if (collapsed) {
114
280
  return null;
115
281
  }
@@ -121,7 +287,26 @@ const DocumentSidebar = ({
121
287
  const isAddDisabled = totalCount >= NOTEBOOK_MAX_FILES;
122
288
  return /* @__PURE__ */ jsxs("div", { className: classes.sidebar, children: [
123
289
  /* @__PURE__ */ jsxs("div", { className: classes.titleRow, children: [
124
- /* @__PURE__ */ jsx(Typography, { className: classes.title, children: notebookName }),
290
+ isEditingTitle ? /* @__PURE__ */ jsx(
291
+ TextInput,
292
+ {
293
+ ref: titleInputRef,
294
+ className: classes.titleInput,
295
+ value: editTitle,
296
+ onChange: (_event, value) => setEditTitle(value),
297
+ onBlur: saveTitle,
298
+ onKeyDown: handleTitleKeyDown,
299
+ "aria-label": t("notebooks.rename.inline.tooltip")
300
+ }
301
+ ) : /* @__PURE__ */ jsx(
302
+ Typography,
303
+ {
304
+ className: classes.title,
305
+ title: t("notebooks.rename.inline.tooltip"),
306
+ onClick: startEditingTitle,
307
+ children: notebookName
308
+ }
309
+ ),
125
310
  /* @__PURE__ */ jsx(Tooltip, { content: t("notebook.view.sidebar.collapse"), position: "right", children: /* @__PURE__ */ jsx(
126
311
  Button,
127
312
  {
@@ -147,7 +332,7 @@ const DocumentSidebar = ({
147
332
  {
148
333
  variant: "link",
149
334
  className: classes.addButton,
150
- icon: /* @__PURE__ */ jsx(PlusCircleIcon, {}),
335
+ icon: /* @__PURE__ */ jsx(AddCircleOIcon, {}),
151
336
  isDisabled: true,
152
337
  children: t("notebook.view.documents.add")
153
338
  }
@@ -158,7 +343,7 @@ const DocumentSidebar = ({
158
343
  {
159
344
  variant: "link",
160
345
  className: classes.addButton,
161
- icon: /* @__PURE__ */ jsx(PlusCircleIcon, {}),
346
+ icon: /* @__PURE__ */ jsx(AddCircleOIcon, {}),
162
347
  onClick: onAddDocument,
163
348
  children: t("notebook.view.documents.add")
164
349
  }
@@ -167,7 +352,37 @@ const DocumentSidebar = ({
167
352
  (documents.length > 0 || activePending.length > 0) && /* @__PURE__ */ jsxs("div", { className: classes.documentsList, children: [
168
353
  documents.map((doc) => /* @__PURE__ */ jsxs("div", { className: classes.documentItem, children: [
169
354
  /* @__PURE__ */ jsx(FileTypeIcon, { fileName: doc.title }),
170
- /* @__PURE__ */ jsx(Typography, { className: classes.fileName, children: doc.title }),
355
+ editingDocId === doc.document_id ? (() => {
356
+ const validationError = getValidationError(
357
+ doc.document_id,
358
+ doc.title
359
+ );
360
+ return /* @__PURE__ */ jsxs("div", { className: classes.renameContainer, children: [
361
+ /* @__PURE__ */ jsx(
362
+ TextInput,
363
+ {
364
+ ref: inputRef,
365
+ className: classes.renameInput,
366
+ value: editName,
367
+ onChange: (_event, value) => setEditName(value),
368
+ onBlur: () => saveRename(doc.document_id, doc.title),
369
+ onKeyDown: (event) => handleKeyDown(event, doc.document_id, doc.title),
370
+ validated: validationError ? "error" : "default",
371
+ "aria-label": t("notebook.document.rename")
372
+ }
373
+ ),
374
+ /* @__PURE__ */ jsx(Typography, { className: classes.renameExtension, children: splitFileName(doc.title).extension }),
375
+ validationError && /* @__PURE__ */ jsx("div", { className: classes.renameHelperText, children: /* @__PURE__ */ jsx(HelperText, { children: /* @__PURE__ */ jsx(HelperTextItem, { variant: "error", children: validationError }) }) })
376
+ ] });
377
+ })() : /* @__PURE__ */ jsx(
378
+ Typography,
379
+ {
380
+ className: classes.fileName,
381
+ title: t("notebook.document.rename.tooltip"),
382
+ onClick: () => startEditing(doc.document_id, doc.title),
383
+ children: doc.title
384
+ }
385
+ ),
171
386
  deletingDocumentIds?.has(doc.document_id) ? /* @__PURE__ */ jsx("div", { className: classes.spinnerContainer, children: /* @__PURE__ */ jsx(
172
387
  Spinner,
173
388
  {
@@ -189,7 +404,8 @@ const DocumentSidebar = ({
189
404
  {
190
405
  ref: toggleRef,
191
406
  variant: "plain",
192
- className: classes.kebabToggle,
407
+ className: `${classes.kebabToggle} doc-kebab`,
408
+ style: openMenuDocId === doc.document_id ? { visibility: "visible" } : void 0,
193
409
  isExpanded: openMenuDocId === doc.document_id,
194
410
  onClick: (event) => {
195
411
  event.stopPropagation();
@@ -197,22 +413,37 @@ const DocumentSidebar = ({
197
413
  (current) => current === doc.document_id ? null : doc.document_id
198
414
  );
199
415
  },
200
- "aria-label": t("notebook.document.delete"),
416
+ "aria-label": `${t("aria.options.label")} ${doc.title}`,
201
417
  children: /* @__PURE__ */ jsx(EllipsisVIcon, {})
202
418
  }
203
419
  ),
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);
420
+ children: /* @__PURE__ */ jsxs(DropdownList, { children: [
421
+ /* @__PURE__ */ jsx(
422
+ DropdownItem,
423
+ {
424
+ icon: /* @__PURE__ */ jsx(PenIcon, {}),
425
+ onClick: (event) => {
426
+ event.stopPropagation();
427
+ startEditing(doc.document_id, doc.title);
428
+ },
429
+ children: t("notebook.document.rename")
430
+ },
431
+ "rename"
432
+ ),
433
+ /* @__PURE__ */ jsx(
434
+ DropdownItem,
435
+ {
436
+ icon: /* @__PURE__ */ jsx(TrashIcon, {}),
437
+ onClick: (event) => {
438
+ event.stopPropagation();
439
+ setOpenMenuDocId(null);
440
+ onDeleteDocument?.(doc.document_id);
441
+ },
442
+ children: t("notebook.document.delete")
211
443
  },
212
- children: t("notebook.document.delete")
213
- },
214
- "delete"
215
- ) })
444
+ "delete"
445
+ )
446
+ ] })
216
447
  }
217
448
  )
218
449
  ] }, doc.document_id)),
@@ -1 +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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"}
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 { useCallback, useRef, useState } from 'react';\n\nimport { makeStyles, Typography } from '@material-ui/core';\nimport {\n Button,\n Dropdown,\n DropdownItem,\n DropdownList,\n HelperText,\n HelperTextItem,\n MenuToggle,\n Spinner,\n TextInput,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n AddCircleOIcon,\n EllipsisVIcon,\n PenIcon,\n TrashIcon,\n} from '@patternfly/react-icons';\n\nimport { NOTEBOOK_MAX_FILES, NOTEBOOK_MAX_TITLE_LENGTH } from '../../const';\nimport { useInlineEdit } from '../../hooks/notebooks/useInlineEdit';\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: '0 1 auto',\n minWidth: 0,\n cursor: 'pointer',\n borderRadius: 4,\n padding: '2px 6px',\n '&:hover': {\n backgroundColor:\n 'var(--pf-t--global--background--color--action--plain--hover)',\n },\n },\n titleInput: {\n flex: 1,\n minWidth: 0,\n '--pf-v6-c-form-control--FontSize': '1.25rem',\n '--pf-v6-c-form-control--LineHeight': '2rem',\n '--pf-v6-c-form-control--before--BorderStyle': 'none',\n '& input': {\n fontWeight: 500,\n letterSpacing: '-0.25px',\n padding: '0 4px',\n outline: 'none',\n },\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: 'flex-start',\n gap: theme.spacing(1),\n padding: `${theme.spacing(1)}px ${theme.spacing(0.5)}px`,\n borderRadius: 4,\n '&:hover': {\n backgroundColor:\n 'var(--pf-t--global--background--color--action--plain--hover)',\n },\n '&:hover .doc-kebab': {\n visibility: 'visible',\n },\n '&:focus-within .doc-kebab': {\n visibility: 'visible',\n },\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 cursor: 'pointer',\n borderRadius: 4,\n padding: '2px 6px',\n '&:hover': {\n backgroundColor:\n 'var(--pf-t--global--background--color--action--plain--hover)',\n },\n },\n renameContainer: {\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap' as const,\n flex: 1,\n minWidth: 0,\n },\n renameInput: {\n flex: 1,\n minWidth: 0,\n alignItems: 'center',\n '--pf-v6-c-form-control--m-error--after--BorderWidth': '2px',\n '--pf-v6-c-form-control--FontSize': '0.875rem',\n '--pf-v6-c-form-control--LineHeight': '1.25rem',\n '& input': {\n padding: '2px 4px',\n outline: 'none',\n },\n // Override PF6 asymmetric padding to center the error icon vertically\n '& .pf-v6-c-form-control__utilities': {\n alignSelf: 'center',\n alignItems: 'center',\n paddingTop: 0,\n paddingBottom: 0,\n },\n },\n renameExtension: {\n flexShrink: 0,\n fontSize: '0.875rem',\n lineHeight: '1.25rem',\n whiteSpace: 'nowrap',\n },\n renameHelperText: {\n width: '100%',\n paddingTop: 4,\n '& .pf-v6-c-helper-text__item-text': {\n color: 'var(--pf-t--global--color--status--danger--default)',\n },\n },\n spinnerContainer: {\n flexShrink: 0,\n },\n kebabToggle: {\n padding: 0,\n flexShrink: 0,\n visibility: 'hidden' as const,\n },\n kebabDropdownMenu: {\n '& .pf-v6-c-menu__list': {\n paddingInlineStart: 0,\n marginBlockStart: 0,\n marginBlockEnd: 0,\n },\n },\n}));\n\nconst splitFileName = (\n fileName: string,\n): { baseName: string; extension: string } => {\n if (!fileName) return { baseName: '', extension: '' };\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot <= 0) return { baseName: fileName, extension: '' };\n return {\n baseName: fileName.slice(0, lastDot),\n extension: fileName.slice(lastDot),\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 onRenameDocument?: (documentId: string, newTitle: string) => void;\n onRenameNotebook?: (newName: 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 onRenameDocument,\n onRenameNotebook,\n}: DocumentSidebarProps) => {\n const classes = useStyles();\n const { t } = useTranslation();\n const [openMenuDocId, setOpenMenuDocId] = useState<string | null>(null);\n const [editingDocId, setEditingDocId] = useState<string | null>(null);\n const [editName, setEditName] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const startEditing = useCallback((docId: string, currentTitle: string) => {\n const { baseName } = splitFileName(currentTitle);\n setEditingDocId(docId);\n setEditName(baseName);\n setOpenMenuDocId(null);\n setTimeout(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, 0);\n }, []);\n\n const cancelEditing = useCallback(() => {\n setEditingDocId(null);\n setEditName('');\n }, []);\n\n const getValidationError = useCallback(\n (docId: string, originalTitle: string): string | null => {\n const trimmedBase = editName.trim();\n if (!trimmedBase) return null;\n const { baseName, extension } = splitFileName(originalTitle);\n if (trimmedBase === baseName) return null;\n const newFullName = trimmedBase + extension;\n if (newFullName.length > NOTEBOOK_MAX_TITLE_LENGTH) {\n return t('notebook.document.rename.tooLong');\n }\n const conflict = documents.some(\n d => d.document_id !== docId && d.title === newFullName,\n );\n return conflict ? t('notebook.document.rename.conflict') : null;\n },\n [editName, documents, t],\n );\n\n const saveRename = useCallback(\n (docId: string, originalTitle: string) => {\n const trimmedBase = editName.trim();\n const { baseName, extension } = splitFileName(originalTitle);\n if (!trimmedBase || trimmedBase === baseName) {\n cancelEditing();\n return;\n }\n const newFullName = trimmedBase + extension;\n if (newFullName.length > NOTEBOOK_MAX_TITLE_LENGTH) {\n cancelEditing();\n return;\n }\n if (\n documents.some(d => d.document_id !== docId && d.title === newFullName)\n ) {\n cancelEditing();\n return;\n }\n onRenameDocument?.(docId, newFullName);\n cancelEditing();\n },\n [editName, documents, onRenameDocument, cancelEditing],\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent, docId: string, originalTitle: string) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n saveRename(docId, originalTitle);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n cancelEditing();\n }\n },\n [saveRename, cancelEditing],\n );\n\n const {\n isEditing: isEditingTitle,\n editValue: editTitle,\n setEditValue: setEditTitle,\n inputRef: titleInputRef,\n startEditing: startEditingTitle,\n save: saveTitle,\n handleKeyDown: handleTitleKeyDown,\n } = useInlineEdit({\n currentName: notebookName,\n onSave: newName => onRenameNotebook?.(newName),\n });\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 {isEditingTitle ? (\n <TextInput\n ref={titleInputRef}\n className={classes.titleInput}\n value={editTitle}\n onChange={(_event, value) => setEditTitle(value)}\n onBlur={saveTitle}\n onKeyDown={handleTitleKeyDown}\n aria-label={t('notebooks.rename.inline.tooltip')}\n />\n ) : (\n <Typography\n className={classes.title}\n title={t('notebooks.rename.inline.tooltip')}\n onClick={startEditingTitle}\n >\n {notebookName}\n </Typography>\n )}\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 as Function)('notebook.view.documents.count', {\n count: totalCount,\n })}\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={<AddCircleOIcon />}\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={<AddCircleOIcon />}\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 {editingDocId === doc.document_id ? (\n (() => {\n const validationError = getValidationError(\n doc.document_id,\n doc.title,\n );\n return (\n <div className={classes.renameContainer}>\n <TextInput\n ref={inputRef}\n className={classes.renameInput}\n value={editName}\n onChange={(_event, value) => setEditName(value)}\n onBlur={() => saveRename(doc.document_id, doc.title)}\n onKeyDown={event =>\n handleKeyDown(event, doc.document_id, doc.title)\n }\n validated={validationError ? 'error' : 'default'}\n aria-label={t('notebook.document.rename')}\n />\n <Typography className={classes.renameExtension}>\n {splitFileName(doc.title).extension}\n </Typography>\n {validationError && (\n <div className={classes.renameHelperText}>\n <HelperText>\n <HelperTextItem variant=\"error\">\n {validationError}\n </HelperTextItem>\n </HelperText>\n </div>\n )}\n </div>\n );\n })()\n ) : (\n <Typography\n className={classes.fileName}\n title={t('notebook.document.rename.tooltip')}\n onClick={() => startEditing(doc.document_id, doc.title)}\n >\n {doc.title}\n </Typography>\n )}\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} doc-kebab`}\n style={\n openMenuDocId === doc.document_id\n ? { visibility: 'visible' }\n : undefined\n }\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('aria.options.label')} ${doc.title}`}\n >\n <EllipsisVIcon />\n </MenuToggle>\n )}\n >\n <DropdownList>\n <DropdownItem\n key=\"rename\"\n icon={<PenIcon />}\n onClick={event => {\n event.stopPropagation();\n startEditing(doc.document_id, doc.title);\n }}\n >\n {t('notebook.document.rename')}\n </DropdownItem>\n <DropdownItem\n key=\"delete\"\n icon={<TrashIcon />}\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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"}
@@ -1,9 +1,8 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { makeStyles } from '@material-ui/core/styles';
3
- import CloseIcon from '@mui/icons-material/Close';
4
3
  import Box from '@mui/material/Box';
5
- import IconButton from '@mui/material/IconButton';
6
4
  import Typography from '@mui/material/Typography';
5
+ import { TimesIcon } from '@patternfly/react-icons';
7
6
  import { FileTypeIcon } from './FileTypeIcon.esm.js';
8
7
 
9
8
  const useStyles = makeStyles((theme) => ({
@@ -12,7 +11,8 @@ const useStyles = makeStyles((theme) => ({
12
11
  alignItems: "center",
13
12
  padding: "8px 12px",
14
13
  borderRadius: 8,
15
- backgroundColor: theme.palette.type === "dark" ? "#2a2a2a" : "#f5f5f5",
14
+ border: "1px solid var(--pf-t--global--border--color--default)",
15
+ backgroundColor: "var(--pf-t--global--background--color--secondary--default)",
16
16
  marginBottom: 8,
17
17
  "&:last-child": {
18
18
  marginBottom: 0
@@ -40,11 +40,17 @@ const useStyles = makeStyles((theme) => ({
40
40
  marginRight: 8
41
41
  },
42
42
  removeButton: {
43
+ background: "none",
44
+ border: "none",
45
+ cursor: "pointer",
43
46
  padding: 4,
44
- color: theme.palette.action.active,
47
+ color: "var(--pf-t--global--icon--color--subtle)",
45
48
  "&:hover": {
46
- color: theme.palette.error.main
47
- }
49
+ color: "var(--pf-t--global--icon--color--regular)"
50
+ },
51
+ display: "inline-flex",
52
+ alignItems: "center",
53
+ fontFamily: "inherit"
48
54
  }
49
55
  }));
50
56
  const formatFileSize = (bytes) => {
@@ -78,13 +84,13 @@ const FileListItem = ({
78
84
  ] }),
79
85
  /* @__PURE__ */ jsx(Typography, { className: classes.fileSize, children: formatFileSize(file.size) }),
80
86
  /* @__PURE__ */ jsx(
81
- IconButton,
87
+ "button",
82
88
  {
89
+ type: "button",
83
90
  className: classes.removeButton,
84
91
  onClick: onRemove,
85
92
  "aria-label": removeAriaLabel,
86
- size: "small",
87
- children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" })
93
+ children: /* @__PURE__ */ jsx(TimesIcon, { style: { width: 12, height: 12 } })
88
94
  }
89
95
  )
90
96
  ] });
@@ -1 +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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"}
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 Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { TimesIcon } from '@patternfly/react-icons';\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 border: '1px solid var(--pf-t--global--border--color--default)',\n backgroundColor:\n 'var(--pf-t--global--background--color--secondary--default)',\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 background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 4,\n color: 'var(--pf-t--global--icon--color--subtle)',\n '&:hover': {\n color: 'var(--pf-t--global--icon--color--regular)',\n },\n display: 'inline-flex',\n alignItems: 'center',\n fontFamily: 'inherit',\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 <button\n type=\"button\"\n className={classes.removeButton}\n onClick={onRemove}\n aria-label={removeAriaLabel}\n >\n <TimesIcon style={{ width: 12, height: 12 }} />\n </button>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}