@parallelworks/ui 0.20.0 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/ai/adapter/openai/createOpenAIStream.js +3 -2
- package/dist/ai/agent/diff.d.ts +0 -1
- package/dist/ai/agent/diff.js +3 -2
- package/dist/ai/agent/toolfmt.js +2 -3
- package/dist/ai/ai.css +5 -0
- package/dist/ai/components/AllocationSelector.js +3 -2
- package/dist/ai/components/AttachmentManager.js +7 -5
- package/dist/ai/components/AttachmentUpload.js +11 -7
- package/dist/ai/components/BlockedGroupBanner.js +2 -2
- package/dist/ai/components/BranchNavigator.js +8 -5
- package/dist/ai/components/ChatEmptyState.js +8 -5
- package/dist/ai/components/ChatInput.d.ts +2 -5
- package/dist/ai/components/ChatInput.js +16 -11
- package/dist/ai/components/ChatMessage.js +25 -17
- package/dist/ai/components/ChatMessageList.js +4 -3
- package/dist/ai/components/ChatSidebar.d.ts +0 -1
- package/dist/ai/components/ChatSidebar.js +22 -16
- package/dist/ai/components/ChatThread.js +9 -11
- package/dist/ai/components/ComposerChrome.js +2 -2
- package/dist/ai/components/ModelSelector.js +20 -14
- package/dist/ai/components/ShareDialog.js +10 -6
- package/dist/ai/components/SlashMenu.d.ts +0 -1
- package/dist/ai/components/agent/ActivityLine.d.ts +0 -1
- package/dist/ai/components/agent/ActivityLine.js +5 -4
- package/dist/ai/components/agent/AgentMessageParts.d.ts +1 -26
- package/dist/ai/components/agent/AgentMessageParts.js +13 -12
- package/dist/ai/core/ChatProvider.d.ts +2 -6
- package/dist/ai/core/ChatProvider.js +42 -67
- package/dist/ai/core/KeyboardShortcutsProvider.js +1 -1
- package/dist/ai/core/chatReducer.d.ts +0 -6
- package/dist/ai/core/chatReducer.js +1 -15
- package/dist/ai/core/useKeyboardShortcuts.d.ts +3 -1
- package/dist/ai/core/useKeyboardShortcuts.js +9 -11
- package/dist/ai/core/useSSEStream.d.ts +0 -1
- package/dist/ai/core/useSSEStream.js +5 -17
- package/dist/ai/strings.d.ts +0 -1
- package/dist/ai/strings.js +0 -1
- package/dist/ai/types.d.ts +1 -1
- package/dist/ai/ui/Avatar.d.ts +1 -2
- package/dist/ai/ui/Avatar.js +7 -18
- package/dist/ai/ui/Dropdown.js +2 -2
- package/dist/ai/ui/Markdown.d.ts +1 -3
- package/dist/ai/ui/Markdown.js +1 -2
- package/dist/ai/ui/Notice.js +5 -3
- package/dist/ai/ui/sidebar.d.ts +0 -1
- package/dist/ai/ui/sidebar.js +5 -3
- package/dist/ai/utils.js +1 -1
- package/dist/components/Avatar.js +4 -2
- package/dist/components/BareModal.js +1 -5
- package/dist/components/Breadcrumbs.js +21 -14
- package/dist/components/Button.js +3 -2
- package/dist/components/Callout.js +4 -3
- package/dist/components/CollapsiblePanel.d.ts +1 -3
- package/dist/components/CollapsiblePanel.js +7 -7
- package/dist/components/CopyToClipboard.js +8 -4
- package/dist/components/CreateModal.js +11 -7
- package/dist/components/Dropdown.d.ts +0 -4
- package/dist/components/Dropdown.js +7 -8
- package/dist/components/Filter.js +2 -2
- package/dist/components/Indicator.js +14 -9
- package/dist/components/Input.js +6 -4
- package/dist/components/Listbox.js +16 -20
- package/dist/components/Loader.js +1 -1
- package/dist/components/MultiSelect.js +5 -8
- package/dist/components/PageHeader.js +10 -7
- package/dist/components/Pagination.js +1 -1
- package/dist/components/Provider.d.ts +0 -8
- package/dist/components/Sort.js +6 -4
- package/dist/components/StatusIcons.d.ts +11 -0
- package/dist/components/StatusIcons.js +20 -0
- package/dist/components/SwitchToggle.js +3 -5
- package/dist/components/Table.d.ts +1 -3
- package/dist/components/Tooltip.js +3 -3
- package/dist/components/dropdownUtils.js +7 -8
- package/dist/components/relativeTime.d.ts +0 -7
- package/dist/components/relativeTime.js +1 -1
- package/dist/duration.js +1 -1
- package/dist/editor/Editor.d.ts +1 -1
- package/dist/editor/Editor.js +1 -1
- package/dist/editor/EditorField.d.ts +0 -1
- package/dist/editor/EditorField.js +8 -8
- package/dist/editor/FormCodePanel.js +20 -23
- package/dist/editor/yamlLanguage.js +2 -2
- package/dist/file-explorer/FileExplorer.js +94 -82
- package/dist/file-explorer/FileExplorerContext.d.ts +1 -2
- package/dist/file-explorer/FileExplorerContext.js +92 -125
- package/dist/file-explorer/FilePreview/Inline.d.ts +1 -2
- package/dist/file-explorer/FilePreview/Inline.js +4 -4
- package/dist/file-explorer/FilePreview/StreamedBadge.js +2 -2
- package/dist/file-explorer/FilePreview/Viewer.js +14 -14
- package/dist/file-explorer/FilePreview/index.d.ts +1 -2
- package/dist/file-explorer/FilePreview/index.js +20 -13
- package/dist/file-explorer/FilePreview/parse.d.ts +2 -1
- package/dist/file-explorer/FilePreview/useObjectBlobUrl.d.ts +5 -4
- package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +23 -36
- package/dist/file-explorer/FilePreview/useObjectText.d.ts +1 -2
- package/dist/file-explorer/FilePreview/useObjectText.js +5 -7
- package/dist/file-explorer/FileRow.js +3 -3
- package/dist/file-explorer/FileRowsWindow.d.ts +5 -12
- package/dist/file-explorer/FileRowsWindow.js +3 -2
- package/dist/file-explorer/FileTable.d.ts +2 -6
- package/dist/file-explorer/LoadMoreRow.d.ts +8 -0
- package/dist/file-explorer/TreeView.d.ts +0 -1
- package/dist/file-explorer/TreeView.js +11 -9
- package/dist/file-explorer/helpers.js +45 -33
- package/dist/file-explorer/lib/fileExplorer.d.ts +0 -2
- package/dist/file-explorer/lib/types.d.ts +0 -1
- package/dist/file-explorer/lib/utils.js +15 -20
- package/dist/file-explorer/toasts.js +54 -45
- package/dist/form/Fields/BooleanField.js +5 -4
- package/dist/form/Fields/CheckboxGroupField.js +5 -4
- package/dist/form/Fields/ColorField.js +5 -4
- package/dist/form/Fields/DropdownField.d.ts +0 -1
- package/dist/form/Fields/DropdownField.js +10 -13
- package/dist/form/Fields/DurationField.js +2 -2
- package/dist/form/Fields/LabelField.js +5 -5
- package/dist/form/Fields/MultiDropdownField.d.ts +1 -1
- package/dist/form/Fields/MultiDropdownField.js +8 -11
- package/dist/form/Fields/NumberField.js +6 -5
- package/dist/form/Fields/ObjectField.d.ts +1 -2
- package/dist/form/Fields/ObjectField.js +22 -21
- package/dist/form/Fields/RadioField.js +4 -3
- package/dist/form/Fields/RangeField.js +7 -6
- package/dist/form/Fields/StringField.js +2 -1
- package/dist/form/Fields/TextAreaField.js +2 -1
- package/dist/form/Form.d.ts +7 -8
- package/dist/form/Form.js +56 -81
- package/dist/form/SpecialTypes/DropdownWrapper.d.ts +0 -2
- package/dist/form/SpecialTypes/DropdownWrapper.js +1 -3
- package/dist/form/SpecialTypes/FormikCustomDropdown.d.ts +1 -3
- package/dist/form/SpecialTypes/FormikCustomDropdown.js +4 -7
- package/dist/form/SpecialTypes/FormikCustomInput.js +16 -13
- package/dist/form/Wizard/WizardContainer.js +8 -25
- package/dist/form/Wizard/WizardNavigation.d.ts +1 -1
- package/dist/form/Wizard/WizardNavigation.js +5 -6
- package/dist/form/Wizard/WizardStepContent.d.ts +1 -1
- package/dist/form/Wizard/WizardStepContent.js +2 -2
- package/dist/form/Wizard/WizardStepIndicator.js +7 -17
- package/dist/form/Wizard/types.d.ts +4 -46
- package/dist/form/Wizard/useWizardState.d.ts +2 -10
- package/dist/form/Wizard/useWizardState.js +42 -92
- package/dist/form/Wizard/utils.js +6 -11
- package/dist/form/lib.js +28 -54
- package/dist/form/types/fieldTypes.d.ts +4 -5
- package/dist/form/utils/dependentOptions.d.ts +6 -0
- package/dist/form/utils/dependentOptions.js +21 -0
- package/dist/form/utils/getParentValue.d.ts +2 -1
- package/dist/form/utils/getParentValue.js +10 -15
- package/dist/form/utils/getValueUsingPath.js +1 -1
- package/dist/graph/AnnotationBanner.d.ts +1 -1
- package/dist/graph/AnnotationBanner.js +10 -6
- package/dist/graph/Collapse.d.ts +3 -3
- package/dist/graph/Collapse.js +3 -8
- package/dist/graph/DependencyGraph.d.ts +5 -4
- package/dist/graph/DependencyGraph.js +178 -226
- package/dist/graph/JobSummary.d.ts +10 -8
- package/dist/graph/JobSummary.js +17 -16
- package/dist/graph/MatrixGroup.d.ts +5 -17
- package/dist/graph/MatrixGroup.js +11 -22
- package/dist/graph/TreeView.d.ts +1 -3
- package/dist/graph/TreeView.js +106 -492
- package/dist/graph/types.d.ts +3 -2
- package/dist/graph/util.d.ts +5 -0
- package/dist/graph/util.js +18 -0
- package/dist/icons/ai/AiOutlineRollback.js +16 -0
- package/dist/icons/bi/BiBell.js +16 -0
- package/dist/icons/bi/BiBellOff.js +16 -0
- package/dist/icons/bi/BiBuildings.js +20 -0
- package/dist/icons/bi/BiError.js +20 -0
- package/dist/icons/bi/BiExpandVertical.js +16 -0
- package/dist/icons/bi/BiPause.js +16 -0
- package/dist/icons/bi/BiPlay.js +16 -0
- package/dist/icons/bi/BiSolidCheckShield.js +16 -0
- package/dist/icons/bi/BiSolidTrashAlt.js +16 -0
- package/dist/icons/bi/BiStop.js +16 -0
- package/dist/icons/bs/BsArrowsCollapse.js +22 -0
- package/dist/icons/bs/BsBank2.js +19 -0
- package/dist/icons/bs/BsBriefcase.js +19 -0
- package/dist/icons/bs/BsBucket.js +19 -0
- package/dist/icons/bs/BsCalendarX.js +23 -0
- package/dist/icons/bs/BsChatLeft.js +19 -0
- package/dist/icons/bs/BsChevronDoubleDown.js +29 -0
- package/dist/icons/bs/BsChevronDoubleUp.js +29 -0
- package/dist/icons/bs/BsClipboardCheck.js +34 -0
- package/dist/icons/bs/BsCurrencyDollar.js +19 -0
- package/dist/icons/bs/BsDash.js +19 -0
- package/dist/icons/bs/BsFileEarmarkZip.js +23 -0
- package/dist/icons/bs/BsFiles.js +19 -0
- package/dist/icons/bs/BsGeoAlt.js +23 -0
- package/dist/icons/bs/BsGrid.js +19 -0
- package/dist/icons/bs/BsLayers.js +19 -0
- package/dist/icons/bs/BsLayoutThreeColumns.js +19 -0
- package/dist/icons/bs/BsListUl.js +22 -0
- package/dist/icons/bs/BsMortarboard.js +23 -0
- package/dist/icons/bs/BsMusicNoteBeamed.js +34 -0
- package/dist/icons/bs/BsOpenai.js +19 -0
- package/dist/icons/bs/BsPersonPlus.js +26 -0
- package/dist/icons/bs/BsSearch.js +19 -0
- package/dist/icons/bs/BsSend.js +19 -0
- package/dist/icons/bs/BsShieldSlash.js +22 -0
- package/dist/icons/bs/BsStar.js +19 -0
- package/dist/icons/bs/BsStarFill.js +19 -0
- package/dist/icons/bs/BsStopCircle.js +23 -0
- package/dist/icons/bs/BsTag.js +23 -0
- package/dist/icons/bs/BsTelephone.js +19 -0
- package/dist/icons/bs/BsTerminal.js +23 -0
- package/dist/icons/bs/BsTerminalFill.js +19 -0
- package/dist/icons/bs/BsThreeDots.js +19 -0
- package/dist/icons/bs/BsThreeDotsVertical.js +19 -0
- package/dist/icons/bs/BsZoomIn.js +37 -0
- package/dist/icons/fa/FaAmazon.js +16 -0
- package/dist/icons/fa/FaAngleDown.js +16 -0
- package/dist/icons/fa/FaAngleLeft.js +16 -0
- package/dist/icons/fa/FaAngleRight.js +16 -0
- package/dist/icons/fa/FaAngleUp.js +16 -0
- package/dist/icons/fa/FaArrowDown.js +16 -0
- package/dist/icons/fa/FaArrowLeft.js +16 -0
- package/dist/icons/fa/FaArrowRight.js +16 -0
- package/dist/icons/fa/FaArrowUp.js +16 -0
- package/dist/icons/fa/FaBalanceScale.js +16 -0
- package/dist/icons/fa/FaCaretDown.js +16 -0
- package/dist/icons/fa/FaCentos.js +16 -0
- package/dist/icons/fa/FaChartLine.js +16 -0
- package/dist/icons/fa/FaChartPie.js +16 -0
- package/dist/icons/fa/FaCheck.js +16 -0
- package/dist/icons/fa/FaChevronDown.js +16 -0
- package/dist/icons/fa/FaChevronUp.js +16 -0
- package/dist/icons/fa/FaChrome.js +16 -0
- package/dist/icons/fa/FaCircleNotch.js +16 -0
- package/dist/icons/fa/FaCloud.js +16 -0
- package/dist/icons/fa/FaCloudDownloadAlt.js +16 -0
- package/dist/icons/fa/FaCog.js +16 -0
- package/dist/icons/fa/FaCogs.js +16 -0
- package/dist/icons/fa/FaComments.js +16 -0
- package/dist/icons/fa/FaCompress.js +16 -0
- package/dist/icons/fa/FaDesktop.js +16 -0
- package/dist/icons/fa/FaDocker.js +16 -0
- package/dist/icons/fa/FaDollarSign.js +16 -0
- package/dist/icons/fa/FaEdge.js +16 -0
- package/dist/icons/fa/FaEdit.js +16 -0
- package/dist/icons/fa/FaExclamationTriangle.js +16 -0
- package/dist/icons/fa/FaExpand.js +16 -0
- package/dist/icons/fa/FaEye.js +16 -0
- package/dist/icons/fa/FaEyeSlash.js +16 -0
- package/dist/icons/fa/FaFile.js +16 -0
- package/dist/icons/fa/FaFilePdf.js +16 -0
- package/dist/icons/fa/FaFilter.js +16 -0
- package/dist/icons/fa/FaFirefoxBrowser.js +16 -0
- package/dist/icons/fa/FaFlask.js +16 -0
- package/dist/icons/fa/FaFolder.js +16 -0
- package/dist/icons/fa/FaGithub.js +16 -0
- package/dist/icons/fa/FaGitlab.js +16 -0
- package/dist/icons/fa/FaGlobe.js +16 -0
- package/dist/icons/fa/FaGlobeAmericas.js +16 -0
- package/dist/icons/fa/FaImage.js +16 -0
- package/dist/icons/fa/FaInfoCircle.js +16 -0
- package/dist/icons/fa/FaKey.js +16 -0
- package/dist/icons/fa/FaLayerGroup.js +16 -0
- package/dist/icons/fa/FaLink.js +16 -0
- package/dist/icons/fa/FaLinkedin.js +16 -0
- package/dist/icons/fa/FaLinux.js +16 -0
- package/dist/icons/fa/FaList.js +16 -0
- package/dist/icons/fa/FaLock.js +16 -0
- package/dist/icons/fa/FaOpenid.js +16 -0
- package/dist/icons/fa/FaOpera.js +16 -0
- package/dist/icons/fa/FaPaperclip.js +16 -0
- package/dist/icons/fa/FaPlus.js +16 -0
- package/dist/icons/fa/FaPowerOff.js +16 -0
- package/dist/icons/fa/FaPrint.js +16 -0
- package/dist/icons/fa/FaQrcode.js +16 -0
- package/dist/icons/fa/FaQuestionCircle.js +16 -0
- package/dist/icons/fa/FaRedhat.js +16 -0
- package/dist/icons/fa/FaRegCircle.js +16 -0
- package/dist/icons/fa/FaRegFileImage.js +16 -0
- package/dist/icons/fa/FaRegFolder.js +16 -0
- package/dist/icons/fa/FaRobot.js +16 -0
- package/dist/icons/fa/FaRocket.js +16 -0
- package/dist/icons/fa/FaRunning.js +16 -0
- package/dist/icons/fa/FaSafari.js +16 -0
- package/dist/icons/fa/FaSave.js +16 -0
- package/dist/icons/fa/FaSearch.js +16 -0
- package/dist/icons/fa/FaShieldAlt.js +16 -0
- package/dist/icons/fa/FaSlack.js +16 -0
- package/dist/icons/fa/FaStar.js +16 -0
- package/dist/icons/fa/FaStop.js +16 -0
- package/dist/icons/fa/FaSuse.js +16 -0
- package/dist/icons/fa/FaTerminal.js +16 -0
- package/dist/icons/fa/FaTimes.js +16 -0
- package/dist/icons/fa/FaUbuntu.js +16 -0
- package/dist/icons/fa/FaUndoAlt.js +16 -0
- package/dist/icons/fa/FaUnlink.js +16 -0
- package/dist/icons/fa/FaUser.js +16 -0
- package/dist/icons/fa/FaUsers.js +16 -0
- package/dist/icons/fa/FaWindows.js +16 -0
- package/dist/icons/fa6/FaApple.js +16 -0
- package/dist/icons/fa6/FaArrowsRotate.js +16 -0
- package/dist/icons/fa6/FaDebian.js +16 -0
- package/dist/icons/fa6/FaFilterCircleXmark.js +16 -0
- package/dist/icons/fa6/FaInbox.js +16 -0
- package/dist/icons/fa6/FaLocationDot.js +16 -0
- package/dist/icons/fa6/FaRegFilePdf.js +16 -0
- package/dist/icons/fa6/FaRegFolderOpen.js +16 -0
- package/dist/icons/fa6/FaUpRightFromSquare.js +16 -0
- package/dist/icons/fa6/FaWandMagicSparkles.js +16 -0
- package/dist/icons/fa6/FaXTwitter.js +16 -0
- package/dist/icons/fi/FiActivity.js +23 -0
- package/dist/icons/fi/FiAlertCircle.js +49 -0
- package/dist/icons/fi/FiChevronDown.js +23 -0
- package/dist/icons/fi/FiClock.js +31 -0
- package/dist/icons/fi/FiCopy.js +34 -0
- package/dist/icons/fi/FiDownload.js +40 -0
- package/dist/icons/fi/FiFile.js +27 -0
- package/dist/icons/fi/FiFileText.js +55 -0
- package/dist/icons/fi/FiHardDrive.js +55 -0
- package/dist/icons/fi/FiRotateCcw.js +27 -0
- package/dist/icons/fi/FiUpload.js +40 -0
- package/dist/icons/fi/FiX.js +37 -0
- package/dist/icons/fi/FiZap.js +23 -0
- package/dist/icons/gi/GiSpy.js +16 -0
- package/dist/icons/go/GoGitCommit.js +16 -0
- package/dist/icons/go/GoGitPullRequest.js +20 -0
- package/dist/icons/go/GoIssueOpened.js +16 -0
- package/dist/icons/go/GoPlus.js +16 -0
- package/dist/icons/go/GoRepoForked.js +28 -0
- package/dist/icons/go/GoSignOut.js +16 -0
- package/dist/icons/go/GoSkip.js +20 -0
- package/dist/icons/go/GoVideo.js +20 -0
- package/dist/icons/gr/GrCloudComputer.js +20 -0
- package/dist/icons/gr/GrInbox.js +20 -0
- package/dist/icons/gr/GrServerCluster.js +20 -0
- package/dist/icons/gr/GrStorage.js +20 -0
- package/dist/icons/gr/GrTasks.js +20 -0
- package/dist/icons/hi/HiCog.js +24 -0
- package/dist/icons/hi/HiDuplicate.js +24 -0
- package/dist/icons/hi/HiOutlineArchive.js +26 -0
- package/dist/icons/hi/HiOutlineClipboardCopy.js +26 -0
- package/dist/icons/hi/HiOutlineHome.js +26 -0
- package/dist/icons/hi/HiQuestionMarkCircle.js +24 -0
- package/dist/icons/hi/HiServer.js +24 -0
- package/dist/icons/hi2/HiMiniCheckCircle.js +24 -0
- package/dist/icons/hi2/HiMiniLanguage.js +28 -0
- package/dist/icons/hi2/HiMiniMinusCircle.js +24 -0
- package/dist/icons/hi2/HiMiniXCircle.js +24 -0
- package/dist/icons/hi2/HiSparkles.js +24 -0
- package/dist/icons/im/ImSpinner5.js +19 -0
- package/dist/icons/io/IoIosNotifications.js +16 -0
- package/dist/icons/io/IoMdBuild.js +16 -0
- package/dist/icons/io/IoMdClose.js +16 -0
- package/dist/icons/io5/IoCloudUploadOutline.js +32 -0
- package/dist/icons/io5/IoDocumentTextOutline.js +31 -0
- package/dist/icons/io5/IoFileTrayFullOutline.js +31 -0
- package/dist/icons/io5/IoHeart.js +16 -0
- package/dist/icons/io5/IoHeartDislike.js +16 -0
- package/dist/icons/io5/IoHeartOutline.js +22 -0
- package/dist/icons/io5/IoInformationCircleOutline.js +50 -0
- package/dist/icons/io5/IoSettingsOutline.js +22 -0
- package/dist/icons/io5/IoWarningOutline.js +40 -0
- package/dist/icons/lu/LuArrowRight.js +27 -0
- package/dist/icons/lu/LuBadgeCheck.js +27 -0
- package/dist/icons/lu/LuBrainCircuit.js +101 -0
- package/dist/icons/lu/LuCalendar.js +46 -0
- package/dist/icons/lu/LuCheck.js +23 -0
- package/dist/icons/lu/LuChevronLeft.js +23 -0
- package/dist/icons/lu/LuChevronRight.js +23 -0
- package/dist/icons/lu/LuExternalLink.js +35 -0
- package/dist/icons/lu/LuEye.js +31 -0
- package/dist/icons/lu/LuEyeOff.js +40 -0
- package/dist/icons/lu/LuFolderTree.js +40 -0
- package/dist/icons/lu/LuIdCard.js +55 -0
- package/dist/icons/lu/LuLogs.js +65 -0
- package/dist/icons/lu/LuMail.js +33 -0
- package/dist/icons/lu/LuMegaphone.js +27 -0
- package/dist/icons/lu/LuMoon.js +23 -0
- package/dist/icons/lu/LuPartyPopper.js +65 -0
- package/dist/icons/lu/LuSettings2.js +48 -0
- package/dist/icons/lu/LuSheet.js +72 -0
- package/dist/icons/lu/LuShield.js +23 -0
- package/dist/icons/lu/LuSun.js +69 -0
- package/dist/icons/lu/LuX.js +27 -0
- package/dist/icons/lu/LuZoomIn.js +59 -0
- package/dist/icons/lu/LuZoomOut.js +49 -0
- package/dist/icons/md/MdClear.js +23 -0
- package/dist/icons/md/MdDragHandle.js +23 -0
- package/dist/icons/md/MdInstallDesktop.js +31 -0
- package/dist/icons/md/MdOutlineAttachMoney.js +23 -0
- package/dist/icons/md/MdOutlineMoneyOff.js +23 -0
- package/dist/icons/md/MdPieChart.js +23 -0
- package/dist/icons/md/MdRefresh.js +23 -0
- package/dist/icons/md/MdReplay.js +23 -0
- package/dist/icons/md/MdSmartphone.js +23 -0
- package/dist/icons/pi/PiArrowBendUpRightBold.js +19 -0
- package/dist/icons/pi/PiPlugsConnectedFill.js +19 -0
- package/dist/icons/pi/PiRectangleDashed.js +19 -0
- package/dist/icons/pi/PiShareBold.js +19 -0
- package/dist/icons/si/SiAnthropic.js +19 -0
- package/dist/icons/si/SiHelm.js +19 -0
- package/dist/icons/si/SiKubernetes.js +19 -0
- package/dist/icons/tb/TbAlertTriangle.js +35 -0
- package/dist/icons/tb/TbAlertTriangleFilled.js +19 -0
- package/dist/icons/tb/TbApi.js +40 -0
- package/dist/icons/tb/TbBrain.js +50 -0
- package/dist/icons/tb/TbBuildingTunnel.js +65 -0
- package/dist/icons/tb/TbEdit.js +35 -0
- package/dist/icons/tb/TbLayoutSidebar.js +27 -0
- package/dist/icons/tb/TbLayoutSidebarLeftCollapse.js +35 -0
- package/dist/icons/tb/TbLayoutSidebarRightCollapse.js +35 -0
- package/dist/icons/tb/TbUser.js +27 -0
- package/dist/icons/tb/TbUserOff.js +35 -0
- package/dist/icons/tb/TbWorldShare.js +55 -0
- package/dist/icons/tb/TbWorldWww.js +65 -0
- package/dist/icons/ti/TiArrowSortedDown.js +20 -0
- package/dist/icons/ti/TiArrowSortedUp.js +20 -0
- package/dist/icons/ti/TiArrowUnsorted.js +20 -0
- package/dist/icons/ti/TiCancel.js +20 -0
- package/dist/icons/vsc/VscChromeMinimize.js +19 -0
- package/dist/icons/vsc/VscJson.js +19 -0
- package/dist/icons/vsc/VscLayoutSidebarLeft.js +19 -0
- package/dist/icons/vsc/VscPass.js +27 -0
- package/dist/icons/vsc/VscSplitHorizontal.js +19 -0
- package/dist/icons/vsc/VscTerminalPowershell.js +19 -0
- package/dist/icons.d.ts +7 -22
- package/dist/icons.js +257 -38
- package/dist/index.d.ts +1 -1
- package/dist/list/ActionToolbar.js +2 -2
- package/dist/list/ListPager.js +4 -3
- package/dist/list/ListTable.js +2 -2
- package/dist/list/ListViewControls.js +29 -42
- package/dist/list/RowContextMenu.js +28 -19
- package/dist/list/listSearch.js +6 -5
- package/dist/logviewer/LogViewer.js +28 -20
- package/dist/logviewer/segments.js +2 -2
- package/dist/styles/theme.css +1 -0
- package/dist/styles.css +1 -1
- package/dist/theme/index.js +5 -5
- package/package.json +28 -30
- package/dist/ai/ui/buttons.d.ts +0 -1
|
@@ -3,44 +3,40 @@ import { fetchPreviewObject, loadPreviewContent, peekPreviewContent } from "./pr
|
|
|
3
3
|
import { readCappedBytes } from "./readCappedBytes.js";
|
|
4
4
|
import { useEffect, useState } from "react";
|
|
5
5
|
//#region src/file-explorer/FilePreview/useObjectBlobUrl.ts
|
|
6
|
+
var IDLE = {
|
|
7
|
+
blobUrl: null,
|
|
8
|
+
loading: false,
|
|
9
|
+
error: null,
|
|
10
|
+
tooLarge: false,
|
|
11
|
+
corsError: false
|
|
12
|
+
};
|
|
6
13
|
function toState(result) {
|
|
7
14
|
return {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
error: null,
|
|
11
|
-
tooLarge: result.tooLarge,
|
|
12
|
-
corsError: false
|
|
15
|
+
...IDLE,
|
|
16
|
+
...result
|
|
13
17
|
};
|
|
14
18
|
}
|
|
15
19
|
function disposeBlob(result) {
|
|
16
20
|
if (result.blobUrl) URL.revokeObjectURL(result.blobUrl);
|
|
17
21
|
}
|
|
18
22
|
/** Fetch an object into a blob URL with a forced MIME type so e.g. PDFs render inline even when served as octet-stream; cached per `cacheKey` so repeated mounts share one download and one blob URL, revoked when the cache drops it. */
|
|
19
|
-
function useObjectBlobUrl(url, {
|
|
23
|
+
function useObjectBlobUrl(url, { maxBytes, knownSize, mimeType, cacheKey }) {
|
|
20
24
|
const [state, setState] = useState({
|
|
21
|
-
|
|
22
|
-
loading:
|
|
23
|
-
error: null,
|
|
24
|
-
tooLarge: false,
|
|
25
|
-
corsError: false
|
|
25
|
+
...IDLE,
|
|
26
|
+
loading: true
|
|
26
27
|
});
|
|
27
28
|
const tooLarge = typeof knownSize === "number" && knownSize > maxBytes;
|
|
28
|
-
const key = enabled ? cacheKey : null;
|
|
29
29
|
useEffect(() => {
|
|
30
|
-
if (!enabled || !url || !key) return;
|
|
31
30
|
if (tooLarge) {
|
|
32
31
|
setState({
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
error: null,
|
|
36
|
-
tooLarge: true,
|
|
37
|
-
corsError: false
|
|
32
|
+
...IDLE,
|
|
33
|
+
tooLarge: true
|
|
38
34
|
});
|
|
39
35
|
return;
|
|
40
36
|
}
|
|
41
37
|
let cancelled = false;
|
|
42
|
-
const record = loadPreviewContent(
|
|
43
|
-
const response = await fetchPreviewObject(
|
|
38
|
+
const record = loadPreviewContent(cacheKey, async (signal) => {
|
|
39
|
+
const response = await fetchPreviewObject(cacheKey, url, signal);
|
|
44
40
|
const { bytes, tooLarge: exceeded } = await readCappedBytes(response, maxBytes);
|
|
45
41
|
if (exceeded) return {
|
|
46
42
|
blobUrl: null,
|
|
@@ -52,21 +48,16 @@ function useObjectBlobUrl(url, { enabled, maxBytes, knownSize, mimeType, cacheKe
|
|
|
52
48
|
};
|
|
53
49
|
}, disposeBlob);
|
|
54
50
|
setState(record.value ? toState(record.value) : {
|
|
55
|
-
|
|
56
|
-
loading: true
|
|
57
|
-
error: null,
|
|
58
|
-
tooLarge: false,
|
|
59
|
-
corsError: false
|
|
51
|
+
...IDLE,
|
|
52
|
+
loading: true
|
|
60
53
|
});
|
|
61
54
|
record.promise.then((result) => {
|
|
62
55
|
if (!cancelled) setState(toState(result));
|
|
63
56
|
}).catch((err) => {
|
|
64
57
|
if (err instanceof DOMException && err.name === "AbortError") return;
|
|
65
58
|
if (!cancelled) setState({
|
|
66
|
-
|
|
67
|
-
loading: false,
|
|
59
|
+
...IDLE,
|
|
68
60
|
error: err instanceof Error ? err.message : "Failed to load file",
|
|
69
|
-
tooLarge: false,
|
|
70
61
|
corsError: err instanceof CorsError
|
|
71
62
|
});
|
|
72
63
|
});
|
|
@@ -75,20 +66,16 @@ function useObjectBlobUrl(url, { enabled, maxBytes, knownSize, mimeType, cacheKe
|
|
|
75
66
|
};
|
|
76
67
|
}, [
|
|
77
68
|
url,
|
|
78
|
-
|
|
79
|
-
key,
|
|
69
|
+
cacheKey,
|
|
80
70
|
maxBytes,
|
|
81
71
|
mimeType,
|
|
82
72
|
tooLarge
|
|
83
73
|
]);
|
|
84
74
|
if (tooLarge) return {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
error: null,
|
|
88
|
-
tooLarge: true,
|
|
89
|
-
corsError: false
|
|
75
|
+
...IDLE,
|
|
76
|
+
tooLarge: true
|
|
90
77
|
};
|
|
91
|
-
const cached =
|
|
78
|
+
const cached = peekPreviewContent(cacheKey);
|
|
92
79
|
return cached ? toState(cached) : state;
|
|
93
80
|
}
|
|
94
81
|
//#endregion
|
|
@@ -12,8 +12,7 @@ interface ObjectTextState extends TextResult {
|
|
|
12
12
|
* download it once. `maxLines` stops the read early and `maxBytes` cuts short what it
|
|
13
13
|
* hasn't. `tail` reads the end of the object instead of the start, and caches
|
|
14
14
|
* separately because the same object yields different text. */
|
|
15
|
-
export declare function useObjectText(url: string
|
|
16
|
-
enabled: boolean;
|
|
15
|
+
export declare function useObjectText(url: string, { maxBytes, maxLines, knownSize, cacheKey, tail, }: {
|
|
17
16
|
maxBytes: number;
|
|
18
17
|
maxLines?: number | undefined;
|
|
19
18
|
knownSize?: number | undefined;
|
|
@@ -37,23 +37,22 @@ async function readObjectText(signal, { url, cacheKey, maxBytes, maxLines, known
|
|
|
37
37
|
* download it once. `maxLines` stops the read early and `maxBytes` cuts short what it
|
|
38
38
|
* hasn't. `tail` reads the end of the object instead of the start, and caches
|
|
39
39
|
* separately because the same object yields different text. */
|
|
40
|
-
function useObjectText(url, {
|
|
40
|
+
function useObjectText(url, { maxBytes, maxLines, knownSize, cacheKey, tail = false }) {
|
|
41
41
|
const tooLarge = maxLines === void 0 && !tail && typeof knownSize === "number" && knownSize > maxBytes;
|
|
42
|
-
const key =
|
|
42
|
+
const key = tail ? `${cacheKey}#tail` : cacheKey;
|
|
43
43
|
const [state, setState] = useState({
|
|
44
44
|
...IDLE,
|
|
45
|
-
loading:
|
|
45
|
+
loading: true
|
|
46
46
|
});
|
|
47
47
|
const [stateKey, setStateKey] = useState(key);
|
|
48
48
|
if (stateKey !== key) {
|
|
49
49
|
setStateKey(key);
|
|
50
50
|
setState({
|
|
51
51
|
...IDLE,
|
|
52
|
-
loading:
|
|
52
|
+
loading: true
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
useEffect(() => {
|
|
56
|
-
if (!enabled || !url || !key) return;
|
|
57
56
|
if (tooLarge) {
|
|
58
57
|
setState({
|
|
59
58
|
...IDLE,
|
|
@@ -89,7 +88,6 @@ function useObjectText(url, { enabled, maxBytes, maxLines, knownSize, cacheKey,
|
|
|
89
88
|
};
|
|
90
89
|
}, [
|
|
91
90
|
url,
|
|
92
|
-
enabled,
|
|
93
91
|
key,
|
|
94
92
|
maxBytes,
|
|
95
93
|
maxLines,
|
|
@@ -102,7 +100,7 @@ function useObjectText(url, { enabled, maxBytes, maxLines, knownSize, cacheKey,
|
|
|
102
100
|
...IDLE,
|
|
103
101
|
tooLarge: true
|
|
104
102
|
};
|
|
105
|
-
const cached =
|
|
103
|
+
const cached = peekPreviewContent(key);
|
|
106
104
|
return cached ? toState(cached) : state;
|
|
107
105
|
}
|
|
108
106
|
//#endregion
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useStrings } from "../components/Provider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { LuEye } from "../icons/lu/LuEye.js";
|
|
3
3
|
import { TOOLTIP_ID } from "../components/Tooltip.js";
|
|
4
4
|
import { MoreButton, useRowMenuActive } from "../list/RowContextMenu.js";
|
|
5
5
|
import { Table } from "../components/Table.js";
|
|
@@ -111,7 +111,7 @@ function FileRow({ node, icon, rowId, rowIndex, active, checked, canPreview, get
|
|
|
111
111
|
children: [/* @__PURE__ */ jsx("div", {
|
|
112
112
|
className: "truncate text-[13px] font-medium leading-tight text-(--theme-app)",
|
|
113
113
|
children: node.displayName || node.name
|
|
114
|
-
}),
|
|
114
|
+
}), isTwoLineRow(node) && /* @__PURE__ */ jsx("div", {
|
|
115
115
|
className: "truncate text-xs leading-tight text-(--theme-muted-text-color)",
|
|
116
116
|
children: node.contentType
|
|
117
117
|
})]
|
|
@@ -151,7 +151,7 @@ function FileRow({ node, icon, rowId, rowIndex, active, checked, canPreview, get
|
|
|
151
151
|
onPreview(node);
|
|
152
152
|
},
|
|
153
153
|
className: cx("rounded p-1 text-(--theme-muted-text-color) transition-colors hover:bg-(--theme-muted-panel-bg) hover:text-(--theme-app) [&>svg]:h-4 [&>svg]:w-4", menuActive ? "opacity-100" : "opacity-0 group-hover:opacity-100 focus-visible:opacity-100"),
|
|
154
|
-
children: /* @__PURE__ */ jsx(
|
|
154
|
+
children: /* @__PURE__ */ jsx(LuEye, {})
|
|
155
155
|
}), /* @__PURE__ */ jsx(MoreButton, {
|
|
156
156
|
active: menuActive,
|
|
157
157
|
onOpen: (x, y) => openRowMenu(x, y, getItems())
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { OpenMenu, RowMenuItem } from '../list/index.js';
|
|
2
|
+
import { type LoadMoreState } from './LoadMoreRow.js';
|
|
2
3
|
import type { TreeNode } from './lib/types.js';
|
|
3
4
|
interface Span {
|
|
4
5
|
start: number;
|
|
@@ -10,13 +11,10 @@ export declare function spacerHeights(items: readonly Span[], totalSize: number,
|
|
|
10
11
|
top: number;
|
|
11
12
|
bottom: number;
|
|
12
13
|
};
|
|
13
|
-
interface VirtualRow {
|
|
14
|
-
index: number;
|
|
15
|
-
start: number;
|
|
16
|
-
size: number;
|
|
17
|
-
}
|
|
18
14
|
interface FileRowsWindowProps {
|
|
19
|
-
items: readonly
|
|
15
|
+
items: readonly {
|
|
16
|
+
index: number;
|
|
17
|
+
}[];
|
|
20
18
|
padTop: number;
|
|
21
19
|
padBottom: number;
|
|
22
20
|
nodes: TreeNode[];
|
|
@@ -25,12 +23,7 @@ interface FileRowsWindowProps {
|
|
|
25
23
|
activeIndex: number;
|
|
26
24
|
rowIdPrefix: string;
|
|
27
25
|
scrollEl: HTMLElement | null;
|
|
28
|
-
loadMore?:
|
|
29
|
-
loading: boolean;
|
|
30
|
-
error: string | undefined;
|
|
31
|
-
auto: boolean;
|
|
32
|
-
onLoadMore: () => void;
|
|
33
|
-
} | undefined;
|
|
26
|
+
loadMore?: LoadMoreState | undefined;
|
|
34
27
|
getItems: (node: TreeNode) => RowMenuItem[];
|
|
35
28
|
openMenu: OpenMenu;
|
|
36
29
|
onOpen: (node: TreeNode) => void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useSlots, useStrings } from "../components/Provider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { FaRegFolder } from "../icons/fa/FaRegFolder.js";
|
|
3
|
+
import { FiFile } from "../icons/fi/FiFile.js";
|
|
3
4
|
import { canPreview } from "./FilePreview/previewType.js";
|
|
4
5
|
import { getNodeIcon } from "./helpers.js";
|
|
5
6
|
import { FileRow } from "./FileRow.js";
|
|
@@ -41,7 +42,7 @@ function FileRowsWindow({ items, padTop, padBottom, nodes, checkedItems, activeI
|
|
|
41
42
|
root: scrollEl,
|
|
42
43
|
onLoadMore: loadMore.onLoadMore
|
|
43
44
|
}, "load-more") : null;
|
|
44
|
-
const icon = getNodeIcon(node, storageIconUrl, storageIconAlt) ?? (node.type === "directory" ? /* @__PURE__ */ jsx(
|
|
45
|
+
const icon = getNodeIcon(node, storageIconUrl, storageIconAlt) ?? (node.type === "directory" ? /* @__PURE__ */ jsx(FaRegFolder, { className: "h-4 w-4 text-sky-500/80" }) : /* @__PURE__ */ jsx(FiFile, { className: "h-4 w-4 theme-muted-text" }));
|
|
45
46
|
return /* @__PURE__ */ jsx(FileRow, {
|
|
46
47
|
rowId: `${rowIdPrefix}-${item.index}`,
|
|
47
48
|
rowIndex: item.index + 2,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type OpenMenu, type RowMenuItem } from '../list/index.js';
|
|
2
|
+
import { type LoadMoreState } from './LoadMoreRow.js';
|
|
2
3
|
import type { TreeNode } from './lib/types.js';
|
|
3
4
|
interface FileTableProps {
|
|
4
5
|
nodes: TreeNode[];
|
|
@@ -12,12 +13,7 @@ interface FileTableProps {
|
|
|
12
13
|
onToggleCheck: (node: TreeNode, checked: boolean) => void;
|
|
13
14
|
onPreview: (node: TreeNode) => void;
|
|
14
15
|
/** Set when the folder has pages left to fetch. */
|
|
15
|
-
loadMore?:
|
|
16
|
-
loading: boolean;
|
|
17
|
-
error: string | undefined;
|
|
18
|
-
auto: boolean;
|
|
19
|
-
onLoadMore: () => void;
|
|
20
|
-
} | undefined;
|
|
16
|
+
loadMore?: LoadMoreState | undefined;
|
|
21
17
|
}
|
|
22
18
|
/** The file table. Give it a `key` of the folder path: a folder change must reset
|
|
23
19
|
* the cursor, the scroll offset and the virtualizer's measurements, and a remount
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/** The virtualizer sizes this row from the constant, never by measuring it. */
|
|
2
2
|
export declare const LOAD_MORE_ROW_HEIGHT = 45;
|
|
3
|
+
/** A folder's paging state, as the table's sentinel row needs it. */
|
|
4
|
+
export interface LoadMoreState {
|
|
5
|
+
loading: boolean;
|
|
6
|
+
error: string | undefined;
|
|
7
|
+
/** False past the auto-load cap, where the user asks for each page. */
|
|
8
|
+
auto: boolean;
|
|
9
|
+
onLoadMore: () => void;
|
|
10
|
+
}
|
|
3
11
|
interface LoadMoreRowProps {
|
|
4
12
|
rowId: string;
|
|
5
13
|
rowIndex: number;
|
|
@@ -2,7 +2,6 @@ import type { TreeNode } from './lib/types.js';
|
|
|
2
2
|
/** Row pitch, with `space-y-0.5` folded in: absolutely positioned rows cannot use
|
|
3
3
|
* sibling margins. useTreePitchAudit warns if this drifts from the DOM. */
|
|
4
4
|
export declare const TREE_ROW_HEIGHT = 30;
|
|
5
|
-
export declare const TREE_SKELETON_HEIGHT = 64;
|
|
6
5
|
interface TreeViewProps {
|
|
7
6
|
rootNodes: TreeNode[];
|
|
8
7
|
parentToChildrenMap: Record<string, TreeNode[]>;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useStrings } from "../components/Provider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { FaAngleRight } from "../icons/fa/FaAngleRight.js";
|
|
3
|
+
import { FaRegFolder } from "../icons/fa/FaRegFolder.js";
|
|
4
|
+
import { FaRegFolderOpen } from "../icons/fa6/FaRegFolderOpen.js";
|
|
3
5
|
import { positionKeys } from "../components/keys.js";
|
|
4
6
|
import { getParentPath } from "./lib/utils.js";
|
|
5
7
|
import { canPreview } from "./FilePreview/previewType.js";
|
|
@@ -16,8 +18,9 @@ var INDENT_PER_LEVEL = 21;
|
|
|
16
18
|
var GUIDE_OFFSET = 9;
|
|
17
19
|
var ROW_PAD_DIRECTORY = 8;
|
|
18
20
|
var ROW_PAD_FILE = 28;
|
|
21
|
+
var TREE_SKELETON_HEIGHT = 64;
|
|
19
22
|
function rowHeight(row) {
|
|
20
|
-
return row.kind === "skeleton" ?
|
|
23
|
+
return row.kind === "skeleton" ? TREE_SKELETON_HEIGHT : 30;
|
|
21
24
|
}
|
|
22
25
|
/** The sidebar tree, flattened and windowed. The flat array is the single source
|
|
23
26
|
* of truth for rendering, arrow keys and ARIA. */
|
|
@@ -191,12 +194,9 @@ function RowIcons({ isDirectory, isExpanded, customIcon }) {
|
|
|
191
194
|
className: "shrink-0",
|
|
192
195
|
children: customIcon
|
|
193
196
|
});
|
|
194
|
-
const folder = isExpanded ? /* @__PURE__ */ jsx(
|
|
195
|
-
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(
|
|
197
|
+
const folder = isExpanded ? /* @__PURE__ */ jsx(FaRegFolderOpen, { className: "h-4 w-4 mr-1 text-sky-500" }) : /* @__PURE__ */ jsx(FaRegFolder, { className: "h-4 w-4 mr-1 text-sky-500/80" });
|
|
198
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FaAngleRight, { className: cx("h-3.5 w-3.5 shrink-0 theme-muted-text transition-transform duration-150", isExpanded && "rotate-90") }), customIcon ?? folder] });
|
|
196
199
|
}
|
|
197
|
-
/** Sized by the slot, not by its contents: react-loading-skeleton wraps each bar
|
|
198
|
-
* in an inline span, so a bar occupies a line box taller than its `height` and
|
|
199
|
-
* the overflow would sit on top of the absolutely positioned row below. */
|
|
200
200
|
/** Click-only, unlike the table's sentinel: the tree is a navigation aid, and
|
|
201
201
|
* growing it automatically as the user scrolls is what the cap exists to prevent. */
|
|
202
202
|
function TreeMoreRow({ depth, hiddenFiles, partial, loading, failed, onReveal }) {
|
|
@@ -220,6 +220,9 @@ function TreeMoreRow({ depth, hiddenFiles, partial, loading, failed, onReveal })
|
|
|
220
220
|
})]
|
|
221
221
|
});
|
|
222
222
|
}
|
|
223
|
+
/** Sized by the slot, not by its contents: react-loading-skeleton wraps each bar
|
|
224
|
+
* in an inline span, so a bar occupies a line box taller than its `height` and
|
|
225
|
+
* the overflow would sit on top of the absolutely positioned row below. */
|
|
223
226
|
function TreeSkeletonRow({ depth }) {
|
|
224
227
|
return /* @__PURE__ */ jsxs("div", {
|
|
225
228
|
className: "relative h-full overflow-hidden",
|
|
@@ -312,7 +315,6 @@ function dispatchRowKey(e, { node, isDirectory, isExpanded, onSelect, onToggleEx
|
|
|
312
315
|
var TreeRowItem = memo(function TreeRowItem({ row, isSelected, onToggleExpand, onSelect, onDropToFolder, onContextMenu, onKeyDown }) {
|
|
313
316
|
const { node, depth, isExpanded } = row;
|
|
314
317
|
const isDirectory = node.type === "directory";
|
|
315
|
-
const isStorageNode = !!node.displayName && node.storageId;
|
|
316
318
|
const { dragActive, dragHandlers } = useSpringLoadedDrop({
|
|
317
319
|
node,
|
|
318
320
|
dropPath: isDirectory ? node.path : getParentPath(node.path),
|
|
@@ -335,7 +337,7 @@ var TreeRowItem = memo(function TreeRowItem({ row, isSelected, onToggleExpand, o
|
|
|
335
337
|
onDelegate: onKeyDown
|
|
336
338
|
});
|
|
337
339
|
const customIcon = getNodeIcon(node);
|
|
338
|
-
const label = isDirectory &&
|
|
340
|
+
const label = isDirectory && node.storageId && node.displayName ? node.displayName : node.name;
|
|
339
341
|
return /* @__PURE__ */ jsxs("div", {
|
|
340
342
|
className: cx("relative h-full rounded-md transition-[box-shadow,background-color] duration-150", dragActive && "ring-1 ring-(--theme-link)/60"),
|
|
341
343
|
...dragHandlers,
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { useNotify, useProvisionCorsRules, useStrings } from "../components/Provider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { BsFileEarmarkZip } from "../icons/bs/BsFileEarmarkZip.js";
|
|
3
|
+
import { FaRegFileImage } from "../icons/fa/FaRegFileImage.js";
|
|
4
|
+
import { FaRegFolder } from "../icons/fa/FaRegFolder.js";
|
|
5
|
+
import { FaUser } from "../icons/fa/FaUser.js";
|
|
6
|
+
import { FaRegFilePdf } from "../icons/fa6/FaRegFilePdf.js";
|
|
7
|
+
import { FaWandMagicSparkles } from "../icons/fa6/FaWandMagicSparkles.js";
|
|
8
|
+
import { FiFile } from "../icons/fi/FiFile.js";
|
|
9
|
+
import { FiFileText } from "../icons/fi/FiFileText.js";
|
|
10
|
+
import { FiHardDrive } from "../icons/fi/FiHardDrive.js";
|
|
11
|
+
import { GoVideo } from "../icons/go/GoVideo.js";
|
|
12
|
+
import { IoDocumentTextOutline } from "../icons/io5/IoDocumentTextOutline.js";
|
|
13
|
+
import { LuSheet } from "../icons/lu/LuSheet.js";
|
|
14
|
+
import { MdRefresh } from "../icons/md/MdRefresh.js";
|
|
15
|
+
import { PiShareBold } from "../icons/pi/PiShareBold.js";
|
|
16
|
+
import { TbAlertTriangle } from "../icons/tb/TbAlertTriangle.js";
|
|
3
17
|
import { positionKeys } from "../components/keys.js";
|
|
4
18
|
import Callout from "../components/Callout.js";
|
|
5
19
|
import { ListSkeleton } from "../list/ListTable.js";
|
|
@@ -15,73 +29,73 @@ var SIDEBAR_WIDTH_STORAGE_KEY = "fileExplorerSidebarWidth";
|
|
|
15
29
|
var contentTypeIconMap = [
|
|
16
30
|
{
|
|
17
31
|
pattern: /^image\//,
|
|
18
|
-
icon: /* @__PURE__ */ jsx(
|
|
32
|
+
icon: /* @__PURE__ */ jsx(FaRegFileImage, { className: "h-4 w-4 text-blue-500" })
|
|
19
33
|
},
|
|
20
34
|
{
|
|
21
35
|
pattern: /^video\//,
|
|
22
|
-
icon: /* @__PURE__ */ jsx(
|
|
36
|
+
icon: /* @__PURE__ */ jsx(GoVideo, { className: "h-4 w-4 text-purple-500" })
|
|
23
37
|
},
|
|
24
38
|
{
|
|
25
39
|
pattern: /^application\/pdf$/,
|
|
26
|
-
icon: /* @__PURE__ */ jsx(
|
|
40
|
+
icon: /* @__PURE__ */ jsx(FaRegFilePdf, { className: "h-4 w-4 text-red-500" })
|
|
27
41
|
},
|
|
28
42
|
{
|
|
29
43
|
pattern: /(spreadsheet|csv|excel)/,
|
|
30
|
-
icon: /* @__PURE__ */ jsx(
|
|
44
|
+
icon: /* @__PURE__ */ jsx(LuSheet, { className: "h-4 w-4 text-green-500" })
|
|
31
45
|
},
|
|
32
46
|
{
|
|
33
47
|
pattern: /(document|word)/,
|
|
34
|
-
icon: /* @__PURE__ */ jsx(
|
|
48
|
+
icon: /* @__PURE__ */ jsx(IoDocumentTextOutline, { className: "h-4 w-4 text-blue-400" })
|
|
35
49
|
},
|
|
36
50
|
{
|
|
37
51
|
pattern: /(javascript|json|css|html)/,
|
|
38
|
-
icon: /* @__PURE__ */ jsx(
|
|
52
|
+
icon: /* @__PURE__ */ jsx(FiFileText, { className: "h-4 w-4 text-yellow-500" })
|
|
39
53
|
},
|
|
40
54
|
{
|
|
41
55
|
pattern: /(zip|gzip|tar)/,
|
|
42
|
-
icon: /* @__PURE__ */ jsx(
|
|
56
|
+
icon: /* @__PURE__ */ jsx(BsFileEarmarkZip, { className: "h-4 w-4 text-purple-600" })
|
|
43
57
|
}
|
|
44
58
|
];
|
|
45
59
|
var extensionIconMap = [
|
|
46
60
|
{
|
|
47
61
|
pattern: /^(jpe?g|png|gif|svg|webp)$/i,
|
|
48
|
-
icon: /* @__PURE__ */ jsx(
|
|
62
|
+
icon: /* @__PURE__ */ jsx(FaRegFileImage, { className: "h-4 w-4 text-blue-500" })
|
|
49
63
|
},
|
|
50
64
|
{
|
|
51
65
|
pattern: /^(mp4|mov|avi|mkv)$/i,
|
|
52
|
-
icon: /* @__PURE__ */ jsx(
|
|
66
|
+
icon: /* @__PURE__ */ jsx(GoVideo, { className: "h-4 w-4 text-purple-500" })
|
|
53
67
|
},
|
|
54
68
|
{
|
|
55
69
|
pattern: /^pdf$/i,
|
|
56
|
-
icon: /* @__PURE__ */ jsx(
|
|
70
|
+
icon: /* @__PURE__ */ jsx(FaRegFilePdf, { className: "h-4 w-4 text-red-500" })
|
|
57
71
|
},
|
|
58
72
|
{
|
|
59
73
|
pattern: /^(xlsx?|csv|ods)$/i,
|
|
60
|
-
icon: /* @__PURE__ */ jsx(
|
|
74
|
+
icon: /* @__PURE__ */ jsx(LuSheet, { className: "h-4 w-4 text-green-500" })
|
|
61
75
|
},
|
|
62
76
|
{
|
|
63
77
|
pattern: /^(docx?|odt)$/i,
|
|
64
|
-
icon: /* @__PURE__ */ jsx(
|
|
78
|
+
icon: /* @__PURE__ */ jsx(IoDocumentTextOutline, { className: "h-4 w-4 text-blue-400" })
|
|
65
79
|
},
|
|
66
80
|
{
|
|
67
81
|
pattern: /^(js|ts|json|css|html|md|txt)$/i,
|
|
68
|
-
icon: /* @__PURE__ */ jsx(
|
|
82
|
+
icon: /* @__PURE__ */ jsx(FiFileText, { className: "h-4 w-4 text-yellow-500" })
|
|
69
83
|
},
|
|
70
84
|
{
|
|
71
85
|
pattern: /^(zip|gz|gzip|tar|rar)$/i,
|
|
72
|
-
icon: /* @__PURE__ */ jsx(
|
|
86
|
+
icon: /* @__PURE__ */ jsx(BsFileEarmarkZip, { className: "h-4 w-4 text-purple-600" })
|
|
73
87
|
}
|
|
74
88
|
];
|
|
75
89
|
function getNodeIcon(node, storageIconUrl, storageIconAlt = "Storage icon") {
|
|
76
90
|
const isUserNode = !node.storageId;
|
|
77
91
|
const isStorageNode = node.root;
|
|
78
|
-
if (isUserNode) return /* @__PURE__ */ jsx(
|
|
79
|
-
if (isStorageNode && node.storageType === "workspace") return /* @__PURE__ */ jsx(
|
|
92
|
+
if (isUserNode) return /* @__PURE__ */ jsx(FaUser, { className: "h-3 w-3 mr-2" });
|
|
93
|
+
if (isStorageNode && node.storageType === "workspace") return /* @__PURE__ */ jsx(FiHardDrive, { className: "h-4 w-4 mr-2" });
|
|
80
94
|
if (isStorageNode && node.storageNodeIcon) {
|
|
81
95
|
const storageNodeIcon = node.storageNodeIcon;
|
|
82
96
|
const fallbackSrc = storageIconUrl?.({ type: storageNodeIcon });
|
|
83
97
|
const iconSrc = node.storageImageUrl || fallbackSrc;
|
|
84
|
-
if (!iconSrc) return /* @__PURE__ */ jsx(
|
|
98
|
+
if (!iconSrc) return /* @__PURE__ */ jsx(FiHardDrive, { className: "h-4 w-4 mr-2" });
|
|
85
99
|
return /* @__PURE__ */ jsx("img", {
|
|
86
100
|
className: "h-4 w-4 mr-2",
|
|
87
101
|
src: iconSrc,
|
|
@@ -91,7 +105,7 @@ function getNodeIcon(node, storageIconUrl, storageIconAlt = "Storage icon") {
|
|
|
91
105
|
}
|
|
92
106
|
});
|
|
93
107
|
}
|
|
94
|
-
if (!isStorageNode &&
|
|
108
|
+
if (!isStorageNode && node.type === "directory") return null;
|
|
95
109
|
if (node.contentType) {
|
|
96
110
|
for (const { pattern, icon } of contentTypeIconMap) if (pattern.test(node.contentType)) return icon;
|
|
97
111
|
}
|
|
@@ -99,7 +113,7 @@ function getNodeIcon(node, storageIconUrl, storageIconAlt = "Storage icon") {
|
|
|
99
113
|
if (ext) {
|
|
100
114
|
for (const { pattern, icon } of extensionIconMap) if (pattern.test(ext)) return icon;
|
|
101
115
|
}
|
|
102
|
-
return /* @__PURE__ */ jsx(
|
|
116
|
+
return /* @__PURE__ */ jsx(FiFile, { className: "h-4 w-4 theme-muted-text" });
|
|
103
117
|
}
|
|
104
118
|
function renderUploadNodes(uploadNodes) {
|
|
105
119
|
const sorted = [...uploadNodes].sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
@@ -112,7 +126,7 @@ function renderUploadNodes(uploadNodes) {
|
|
|
112
126
|
while (common < folders.length && common < lastFolders.length && folders[common] === lastFolders[common]) common++;
|
|
113
127
|
const folderElements = folders.slice(common).map((folder, i) => /* @__PURE__ */ jsxs("div", {
|
|
114
128
|
style: { marginLeft: (common + i) * 16 },
|
|
115
|
-
children: [/* @__PURE__ */ jsx(
|
|
129
|
+
children: [/* @__PURE__ */ jsx(FaRegFolder, { className: "inline h-3 w-3 mr-1" }), /* @__PURE__ */ jsxs("span", {
|
|
116
130
|
className: "font-semibold",
|
|
117
131
|
children: [folder, "/"]
|
|
118
132
|
})]
|
|
@@ -144,7 +158,7 @@ function NoFileSelectedPreview() {
|
|
|
144
158
|
children: [
|
|
145
159
|
/* @__PURE__ */ jsx("div", {
|
|
146
160
|
className: "inline-flex items-center justify-center w-14 h-14 rounded-full theme-muted-panel mb-4",
|
|
147
|
-
children: /* @__PURE__ */ jsx(
|
|
161
|
+
children: /* @__PURE__ */ jsx(FiHardDrive, { className: "h-6 w-6 theme-muted-text" })
|
|
148
162
|
}),
|
|
149
163
|
/* @__PURE__ */ jsx("h2", {
|
|
150
164
|
className: "text-base font-semibold mb-1",
|
|
@@ -169,7 +183,7 @@ function NotFoundPreview({ path, onRetry }) {
|
|
|
169
183
|
children: [
|
|
170
184
|
/* @__PURE__ */ jsx("div", {
|
|
171
185
|
className: "inline-flex items-center justify-center w-14 h-14 rounded-full theme-muted-panel mb-4",
|
|
172
|
-
children: /* @__PURE__ */ jsx(
|
|
186
|
+
children: /* @__PURE__ */ jsx(FiHardDrive, { className: "h-6 w-6 theme-muted-text" })
|
|
173
187
|
}),
|
|
174
188
|
/* @__PURE__ */ jsx("h2", {
|
|
175
189
|
className: "text-base font-semibold mb-1",
|
|
@@ -183,7 +197,7 @@ function NotFoundPreview({ path, onRetry }) {
|
|
|
183
197
|
type: "button",
|
|
184
198
|
className: "btn btn-info gap-2",
|
|
185
199
|
onClick: onRetry,
|
|
186
|
-
children: [/* @__PURE__ */ jsx(
|
|
200
|
+
children: [/* @__PURE__ */ jsx(MdRefresh, { className: "h-4 w-4" }), t.retry]
|
|
187
201
|
})
|
|
188
202
|
]
|
|
189
203
|
})
|
|
@@ -237,12 +251,12 @@ function CorsIssuePreview({ selectedStorage, onRefresh }) {
|
|
|
237
251
|
type: "button",
|
|
238
252
|
className: "btn btn-info cursor-pointer flex items-center",
|
|
239
253
|
onClick: onRefresh ? () => onRefresh() : void 0,
|
|
240
|
-
children: [/* @__PURE__ */ jsx(
|
|
254
|
+
children: [/* @__PURE__ */ jsx(MdRefresh, { className: "h-4 w-4 mr-2" }), t.actions.retry]
|
|
241
255
|
}), provisionCorsRules && /* @__PURE__ */ jsxs("button", {
|
|
242
256
|
type: "button",
|
|
243
257
|
className: "btn btn-info cursor-pointer flex items-center",
|
|
244
258
|
onClick: handleAddCorsRules,
|
|
245
|
-
children: [/* @__PURE__ */ jsx(
|
|
259
|
+
children: [/* @__PURE__ */ jsx(FaWandMagicSparkles, { className: "h-4 w-4 mr-2" }), /* @__PURE__ */ jsx("span", { children: t.actions.addRules })]
|
|
246
260
|
})]
|
|
247
261
|
})]
|
|
248
262
|
});
|
|
@@ -253,7 +267,6 @@ function CorsPropagatingPreview() {
|
|
|
253
267
|
const [elapsedMs, setElapsedMs] = useState(0);
|
|
254
268
|
useEffect(() => {
|
|
255
269
|
const start = Date.now();
|
|
256
|
-
setElapsedMs(0);
|
|
257
270
|
const id = setInterval(() => {
|
|
258
271
|
setElapsedMs(Date.now() - start);
|
|
259
272
|
}, 500);
|
|
@@ -399,7 +412,7 @@ function NoDataAvailablePreview({ selectedStorage, error, onRefresh, connectionI
|
|
|
399
412
|
children: [
|
|
400
413
|
/* @__PURE__ */ jsx("div", {
|
|
401
414
|
className: "inline-flex items-center justify-center w-14 h-14 rounded-full theme-muted-panel mb-4",
|
|
402
|
-
children: /* @__PURE__ */ jsx(
|
|
415
|
+
children: /* @__PURE__ */ jsx(FiFile, { className: "h-6 w-6 theme-muted-text" })
|
|
403
416
|
}),
|
|
404
417
|
/* @__PURE__ */ jsx("h2", {
|
|
405
418
|
className: "text-base font-semibold mb-1",
|
|
@@ -415,7 +428,7 @@ function NoDataAvailablePreview({ selectedStorage, error, onRefresh, connectionI
|
|
|
415
428
|
children: [
|
|
416
429
|
/* @__PURE__ */ jsx("div", {
|
|
417
430
|
className: "inline-flex items-center justify-center w-14 h-14 rounded-full bg-amber-500/10 mb-4",
|
|
418
|
-
children: /* @__PURE__ */ jsx(
|
|
431
|
+
children: /* @__PURE__ */ jsx(TbAlertTriangle, { className: "h-6 w-6 text-amber-500" })
|
|
419
432
|
}),
|
|
420
433
|
/* @__PURE__ */ jsx("h2", {
|
|
421
434
|
className: "text-base font-semibold mb-1",
|
|
@@ -429,7 +442,7 @@ function NoDataAvailablePreview({ selectedStorage, error, onRefresh, connectionI
|
|
|
429
442
|
type: "button",
|
|
430
443
|
className: "btn btn-info cursor-pointer flex items-center gap-2",
|
|
431
444
|
onClick: onRefresh ? () => onRefresh() : void 0,
|
|
432
|
-
children: [/* @__PURE__ */ jsx(
|
|
445
|
+
children: [/* @__PURE__ */ jsx(MdRefresh, { className: "h-4 w-4" }), t.empty.tryAgain]
|
|
433
446
|
})
|
|
434
447
|
]
|
|
435
448
|
})
|
|
@@ -493,7 +506,7 @@ function ShareFileButton({ node, onShare }) {
|
|
|
493
506
|
});
|
|
494
507
|
},
|
|
495
508
|
disabled: isPending,
|
|
496
|
-
children: [/* @__PURE__ */ jsx(
|
|
509
|
+
children: [/* @__PURE__ */ jsx(PiShareBold, { className: "h-4 w-4" }), /* @__PURE__ */ jsx("span", {
|
|
497
510
|
className: "hidden md:inline",
|
|
498
511
|
children: t.empty.shareThisFile
|
|
499
512
|
})]
|
|
@@ -523,8 +536,7 @@ async function addCorsRules({ provision, notify, strings, csp, type, username, s
|
|
|
523
536
|
const deadline = Date.now() + pollBudgetMs;
|
|
524
537
|
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
525
538
|
while (Date.now() < deadline) {
|
|
526
|
-
|
|
527
|
-
if (!result || !result.corsError) {
|
|
539
|
+
if (!(await onRefresh({ silent: true }))?.corsError) {
|
|
528
540
|
await onRefresh();
|
|
529
541
|
notify.success(strings.corsAdded);
|
|
530
542
|
return;
|
|
@@ -8,7 +8,6 @@ export interface FileExplorerDeleteFilesResult {
|
|
|
8
8
|
Errors?: unknown[] | undefined;
|
|
9
9
|
}
|
|
10
10
|
export interface IFileExplorerClient {
|
|
11
|
-
getStorageName(): string;
|
|
12
11
|
getExpiresAt(): Date;
|
|
13
12
|
getFile(input: unknown): Promise<FileExplorerGetFileResult>;
|
|
14
13
|
listDirectory(input: unknown): Promise<unknown>;
|
|
@@ -20,7 +19,6 @@ export interface IFileExplorerClient {
|
|
|
20
19
|
}) => void, abortController?: AbortController): Promise<unknown>;
|
|
21
20
|
}
|
|
22
21
|
export interface IFileExplorerProvider {
|
|
23
|
-
createClient: ((organization: string, username: string, name: string) => Promise<IFileExplorerClient | null>) | null;
|
|
24
22
|
convertDataToStorageObjects?(data: unknown): TStorageObject[];
|
|
25
23
|
/** Absent ⇒ the explorer treats one page as the whole directory. Method syntax for
|
|
26
24
|
* the same bivariance reason as the two above. */
|