@strapi/upload 5.58.0 → 5.60.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.
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
- package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
- package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
- package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
- package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
- package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +142 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +140 -0
- package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
- package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
- package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +156 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +154 -0
- package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
- package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js +211 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +208 -0
- package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
- package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +439 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +433 -0
- package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
- package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
- package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
- package/dist/admin/components/UploadProgressDialog.js +2 -1
- package/dist/admin/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/components/UploadProgressDialog.mjs +2 -1
- package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
- package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
- package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
- package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
- package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs +16 -2
- package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
- package/dist/admin/hooks/useTracking.js +5 -1
- package/dist/admin/hooks/useTracking.js.map +1 -1
- package/dist/admin/hooks/useTracking.mjs +5 -1
- package/dist/admin/hooks/useTracking.mjs.map +1 -1
- package/dist/admin/index.js +7 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +7 -2
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
- package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
- package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
- package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
- package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
- package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
- package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
- package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
- package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
- package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
- package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
- package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
- package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
- package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
- package/dist/admin/legacy/components/TableList/TableList.js +3 -1
- package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
- package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
- package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
- package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
- package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
- package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
- package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
- package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
- package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
- package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.js +13 -302
- package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
- package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.js +143 -31
- package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs +146 -34
- package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
- package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
- package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.js +60 -35
- package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsTable.mjs +62 -37
- package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
- package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
- package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
- package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +4 -2
- package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
- package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
- package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
- package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
- package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
- package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
- package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
- package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
- package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
- package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
- package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
- package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
- package/dist/admin/pages/Assets/components/FilterBadges.mjs +35 -6
- package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
- package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
- package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
- package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
- package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
- package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
- package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
- package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
- package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
- package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
- package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
- package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
- package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
- package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
- package/dist/admin/services/api.js +106 -11
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +105 -13
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
- package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
- package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
- package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
- package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
- package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +21 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
- package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +25 -0
- package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
- package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +28 -0
- package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
- package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
- package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +3 -0
- package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
- package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
- package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
- package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
- package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
- package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
- package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
- package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
- package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
- package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
- package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
- package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
- package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
- package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
- package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
- package/dist/admin/src/services/api.d.ts +30 -1
- package/dist/admin/src/store/uploadProgress.d.ts +14 -1
- package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
- package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
- package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
- package/dist/admin/store/uploadProgress.js +30 -3
- package/dist/admin/store/uploadProgress.js.map +1 -1
- package/dist/admin/store/uploadProgress.mjs +29 -4
- package/dist/admin/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/translations/ca.json.js +3 -3
- package/dist/admin/translations/ca.json.mjs +3 -3
- package/dist/admin/translations/da.json.js +1 -1
- package/dist/admin/translations/da.json.mjs +1 -1
- package/dist/admin/translations/de.json.js +1 -1
- package/dist/admin/translations/de.json.mjs +1 -1
- package/dist/admin/translations/en.json.js +29 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +29 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -1
- package/dist/admin/translations/es.json.mjs +1 -1
- package/dist/admin/translations/sk.json.js +2 -2
- package/dist/admin/translations/sk.json.mjs +2 -2
- package/dist/admin/translations/tr.json.js +2 -2
- package/dist/admin/translations/tr.json.mjs +2 -2
- package/dist/admin/translations/zh-Hans.json.js +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +1 -1
- package/dist/admin/translations/zh.json.js +2 -2
- package/dist/admin/translations/zh.json.mjs +2 -2
- package/dist/admin/utils/allowedMediaTypes.js +42 -0
- package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
- package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
- package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
- package/dist/admin/utils/findFolderPath.js +26 -0
- package/dist/admin/utils/findFolderPath.js.map +1 -0
- package/dist/admin/utils/findFolderPath.mjs +24 -0
- package/dist/admin/utils/findFolderPath.mjs.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.js +33 -0
- package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
- package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
- package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
- package/dist/server/config.js +6 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +6 -0
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/controllers/admin-settings.js +5 -1
- package/dist/server/controllers/admin-settings.js.map +1 -1
- package/dist/server/controllers/admin-settings.mjs +5 -1
- package/dist/server/controllers/admin-settings.mjs.map +1 -1
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
- package/dist/server/mcp/ambient-instance.js +7 -5
- package/dist/server/mcp/ambient-instance.js.map +1 -1
- package/dist/server/mcp/ambient-instance.mjs +7 -5
- package/dist/server/mcp/ambient-instance.mjs.map +1 -1
- package/dist/server/mcp/handlers/folder-handlers.js +4 -16
- package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
- package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/read-handlers.js +6 -14
- package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
- package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
- package/dist/server/mcp/handlers/write-handlers.js +3 -13
- package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
- package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
- package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
- package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
- package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
- package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
- package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
- package/dist/server/services/image-manipulation.js +35 -16
- package/dist/server/services/image-manipulation.js.map +1 -1
- package/dist/server/services/image-manipulation.mjs +35 -16
- package/dist/server/services/image-manipulation.mjs.map +1 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/config.d.ts +3 -0
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
- package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
- package/dist/server/src/services/extensions/utils.d.ts +11 -11
- package/dist/server/src/services/image-manipulation.d.ts +1 -1
- package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -1
- package/dist/server/src/types.d.ts +64 -12
- package/dist/server/src/types.d.ts.map +1 -1
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadProgress.mjs","sources":["../../../admin/src/store/uploadProgress.ts"],"sourcesContent":["import { createSelector, createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\n/**\n * AI metadata generation phase for a single row, tracked independently from the\n * upload status: a metadata failure never turns a successful upload into an error.\n * `undefined` means the row has no metadata phase at all, i.e. AI metadata is\n * disabled — non-images do get a phase and come back `skipped` from the server.\n */\nexport type FileMetadataStatus = 'generating' | 'generated' | 'skipped' | 'failed';\n\nexport type FileMetadataResultStatus = Exclude<FileMetadataStatus, 'generating'>;\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n uploadedBytes: number;\n file?: File;\n /** When the server confirmed the upload. Set with the row's asset. */\n completedAt?: number;\n error?: string;\n metadataStatus?: FileMetadataStatus;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n /**\n * Whether every row's size was known when the batch opened (the direct-file flow), so\n * the byte-weighted aggregate is meaningful. The URL flow learns sizes one row at a time.\n */\n reportsByteProgress: boolean;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n reportsByteProgress: false,\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{\n totalFiles: number;\n fileNames: string[];\n fileSizes?: number[];\n }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n\n // Create pending files for upload\n const pendingFiles: FileProgress[] = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[index] ?? 0,\n uploadedBytes: 0,\n }));\n\n state.files = pendingFiles;\n state.totalFiles = action.payload.totalFiles;\n state.errors = [];\n state.uploadId += 1;\n // Known sizes == the direct-file flow == the flow that streams bytes.\n state.reportsByteProgress = action.payload.fileSizes !== undefined;\n },\n /**\n * Rows for a second drop, joined to the batch already uploading. Indices\n * continue from the current length so the earlier drop's in-flight uploads\n * keep addressing their own rows.\n */\n appendUploadFiles(\n state,\n action: PayloadAction<{\n uploadId: number;\n fileNames: string[];\n fileSizes?: number[];\n }>\n ) {\n if (action.payload.uploadId !== state.uploadId) {\n return;\n }\n\n const offset = state.files.length;\n\n state.files.push(\n ...action.payload.fileNames.map((name, i) => ({\n name,\n index: offset + i,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[i] ?? 0,\n uploadedBytes: 0,\n }))\n );\n\n state.totalFiles += action.payload.fileNames.length;\n // The dialog may have been dismissed while the first drop was running.\n state.isVisible = true;\n state.isMinimized = false;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; size: number; uploadId: number }>\n ) {\n const { index, size, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n state.files[index].size = size;\n }\n },\n /**\n * `size` is optional and only sent by the URL flow, which learns the size from the\n * same server event that carries the first byte count — the row was created with\n * `size: 0`, and bytes clamped against a zero size would all read as zero. The\n * direct-file flow already knows the size up front and omits it.\n */\n setFileProgress(\n state,\n action: PayloadAction<{ index: number; bytes: number; uploadId: number; size?: number }>\n ) {\n const { index, bytes, size, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n const file = state.files[index];\n if (file) {\n if (size !== undefined && file.size === 0) {\n file.size = size;\n }\n // Clamp to the known file size so the aggregate can never exceed 100%.\n file.uploadedBytes = Math.min(bytes, file.size);\n }\n },\n setFileComplete(\n state,\n action: PayloadAction<{ index: number; file: File; uploadId: number; completedAt: number }>\n ) {\n const { index, file, uploadId, completedAt } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n state.files[index].completedAt = completedAt;\n // Reflect completion in the aggregate even if the final progress event was throttled.\n state.files[index].uploadedBytes = state.files[index].size;\n }\n },\n setFileError(\n state,\n action: PayloadAction<{ index: number; name: string; message: string; uploadId: number }>\n ) {\n const { index, name, message, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n },\n /**\n * Metadata generation started for a row.\n *\n * Metadata requests are fired-and-forgotten, so their callbacks can land after\n * a new batch has replaced `files` and reused the same row indices. Every\n * metadata payload therefore carries the `uploadId` it was fired for, and stale\n * ones are dropped instead of writing onto another batch's row.\n */\n setFileMetadataGenerating(state, action: PayloadAction<{ index: number; uploadId: number }>) {\n const { index, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].metadataStatus = 'generating';\n }\n },\n /**\n * Terminal metadata outcome for a row. Never touches `status`/`error`/`errors`:\n * the upload itself already succeeded regardless of how generation went.\n */\n setFileMetadataResult(\n state,\n action: PayloadAction<{\n index: number;\n uploadId: number;\n status: FileMetadataResultStatus;\n }>\n ) {\n const { index, uploadId, status } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].metadataStatus = status;\n }\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n state.reportsByteProgress = false;\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n uploadedBytes: 0,\n // A retried row goes through the metadata phase again from scratch.\n metadataStatus: undefined,\n };\n }\n return file;\n });\n },\n },\n});\n\n/**\n * Assets whose own upload has already finished, newest batch only.\n *\n * The list behind the upload dialog uses these to show each asset the moment it\n * lands, instead of waiting for the batch mutation to invalidate the cache. Rows\n * only carry a `file` once the server has created it, so every entry here is a\n * real, persisted asset.\n */\nconst NO_FILES: FileProgress[] = [];\n\n/** An uploaded asset, with the moment the server confirmed it. */\nexport interface CompletedUpload {\n asset: File;\n completedAt: number;\n}\n\nexport const selectCompletedUploads = createSelector(\n // The plugin registers this slice in `register()`, so a host that has not\n // reached that point has no upload state — and therefore nothing to place.\n (state: Partial<RootState>) => state.uploadProgress?.files ?? NO_FILES,\n (files): CompletedUpload[] =>\n files.reduce<CompletedUpload[]>((completed, row) => {\n if (row.status === 'complete' && row.file && row.completedAt !== undefined) {\n completed.push({ asset: row.file, completedAt: row.completedAt });\n }\n\n return completed;\n }, [])\n);\n\n/**\n * Byte-weighted aggregate progress across the whole batch: `sum(uploadedBytes) / sum(size)`.\n *\n * Falls back to count-based progress (settled files / total files) when all sizes are\n * zero — e.g. URL-flow rows where the file size is unknown up front.\n */\nexport const selectAggregateProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number => {\n if (files.length === 0) return 0;\n\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n\n if (totalSize === 0) {\n const settled = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((settled / files.length) * 100);\n }\n\n const uploadedBytes = files.reduce((sum, f) => sum + f.uploadedBytes, 0);\n return Math.round((uploadedBytes / totalSize) * 100);\n }\n);\n\n/**\n * Whether to show byte-weighted `selectAggregateProgress` rather than `selectCountBasedProgress`.\n *\n * Only the flag: byte-weighting needs every size up front. A URL batch learns sizes one row\n * at a time, so weighting over the sizes known so far makes the header jump backwards at\n * every file boundary.\n */\nexport const selectReportsByteProgress = createSelector(\n (state: RootState) => state.uploadProgress.reportsByteProgress,\n (reportsByteProgress): boolean => reportsByteProgress\n);\n\n/**\n * Row-weighted progress for a batch whose sizes are not known up front (the URL flow).\n * Each row is worth `1 / total`: settled rows count fully and an in-flight row contributes\n * `uploadedBytes / size` once it reports bytes, so a multi-URL batch climbs smoothly to\n * 33 → 67 → 100 and never moves backwards.\n *\n * Returns `null` until something has moved — 0% is the frozen signal this flow exists to\n * remove, so the header stays indeterminate until there's real progress.\n */\nexport const selectCountBasedProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number | null => {\n const done = files.reduce((sum, f) => {\n if (f.status === 'complete' || f.status === 'error' || f.status === 'cancelled') {\n return sum + 1;\n }\n return f.size > 0 ? sum + Math.min(f.uploadedBytes / f.size, 1) : sum;\n }, 0);\n\n if (done === 0) {\n return null;\n }\n\n return Math.round((done / files.length) * 100);\n }\n);\n\n/**\n * Count-based metadata progress across the whole batch: `settled / expected`.\n *\n * Count-based rather than byte-weighted because the generation endpoint answers in one\n * go — there is no intermediate progress to weight.\n *\n * The denominator is every row *expected* to enter the phase, not just those that\n * already have. Generation is fired per file as each upload finishes, so counting only\n * started rows made the denominator grow mid-batch and the percentage jump backwards\n * (1/1 = 100%, then a second row starts and it drops to 1/2 = 50%), which flickered the\n * header subtitle on and off once per file.\n *\n * \"Expected\" is derived from upload outcome rather than from the AI-metadata flag:\n * - a row still uploading may yet enter the phase, so it counts toward the total;\n * - an errored or cancelled row never will, so it must not — otherwise a batch with\n * one failure could never reach 100%.\n *\n * Returns `null` when nothing has entered the phase and nothing is pending — i.e. AI\n * metadata is off, or the batch is done — so the header can hide the subtitle.\n */\nexport const selectMetadataProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number | null => {\n const started = files.filter((f) => f.metadataStatus !== undefined);\n\n // Nothing has entered the phase yet: with no started row there is no evidence AI\n // metadata is even enabled, so stay silent rather than showing a premature 0%.\n if (started.length === 0) return null;\n\n // Rows whose upload is still in flight are counted in the denominator so the\n // percentage only ever climbs as the batch progresses.\n const pending = files.filter(\n (f) => f.metadataStatus === undefined && (f.status === 'pending' || f.status === 'uploading')\n ).length;\n\n const expected = started.length + pending;\n const settled = started.filter((f) => f.metadataStatus !== 'generating').length;\n\n return Math.round((settled / expected) * 100);\n }\n);\n\n/**\n * Whether the metadata phase is still ongoing for the batch as a whole.\n *\n * The header uses this — not `selectMetadataProgress === 100` — to decide when to drop\n * the subtitle. Two distinct reasons the phase can be unfinished:\n * - a row is generating right now;\n * - no row is generating this instant, but rows are still uploading and will enter the\n * phase when they finish.\n *\n * The second clause is what keeps the subtitle stable. Generation for file N typically\n * finishes before file N+1 finishes uploading, so a naive \"is anything generating?\"\n * check goes false between every pair of files and blinks the subtitle out and back in.\n */\nexport const selectIsGeneratingMetadata = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): boolean => {\n if (files.some((f) => f.metadataStatus === 'generating')) return true;\n\n // Only bridge the gap if some row has already entered the phase — otherwise a batch\n // with AI metadata disabled would report the phase as ongoing for its whole upload.\n const hasStarted = files.some((f) => f.metadataStatus !== undefined);\n\n return hasStarted && files.some((f) => f.status === 'pending' || f.status === 'uploading');\n }\n);\n\n/**\n * How many rows reached each terminal metadata outcome, for the header's completion\n * message. `null` while the phase is unfinished — or was never entered at all — so the\n * caller has a single check for \"there is no settled outcome to report yet\".\n *\n * Counts are reported separately rather than collapsed into one total because they are\n * not interchangeable: only `generated` rows actually had metadata written, so only that\n * count can be claimed as a success. A batch of non-images settles entirely on `skipped`,\n * where \"generated on 0 files\" would be worse than saying nothing.\n */\nexport const selectMetadataOutcome = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): { generated: number; skipped: number; failed: number } | null => {\n const started = files.filter((f) => f.metadataStatus !== undefined);\n\n if (started.length === 0) return null;\n\n // Mirrors `selectIsGeneratingMetadata`: the phase isn't over while a row is\n // generating, nor while a row is still uploading and has yet to enter it.\n const isOngoing =\n started.some((f) => f.metadataStatus === 'generating') ||\n files.some((f) => f.status === 'pending' || f.status === 'uploading');\n\n if (isOngoing) return null;\n\n return {\n generated: started.filter((f) => f.metadataStatus === 'generated').length,\n skipped: started.filter((f) => f.metadataStatus === 'skipped').length,\n failed: started.filter((f) => f.metadataStatus === 'failed').length,\n };\n }\n);\n\nexport const {\n openUploadProgress,\n appendUploadFiles,\n setFileUploading,\n setFileProgress,\n setFileComplete,\n setFileError,\n setFileMetadataGenerating,\n setFileMetadataResult,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\n/**\n * The merge/reset switch. Errored and cancelled rows count as settled, so a\n * batch that finished badly is still replaced by the next drop.\n */\nexport const isUploadInFlight = (files: ReadonlyArray<{ status: FileProgressStatus }>): boolean =>\n files.some((f) => f.status === 'pending' || f.status === 'uploading');\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","totalFiles","files","errors","uploadId","reportsByteProgress","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","pendingFiles","payload","fileNames","map","index","status","size","fileSizes","uploadedBytes","undefined","appendUploadFiles","offset","length","push","i","setFileUploading","setFileProgress","bytes","file","Math","min","setFileComplete","completedAt","setFileError","message","error","setFileMetadataGenerating","metadataStatus","setFileMetadataResult","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","retryCancelledFiles","NO_FILES","selectCompletedUploads","createSelector","uploadProgress","reduce","completed","row","asset","selectAggregateProgress","totalSize","sum","f","settled","filter","round","selectReportsByteProgress","selectCountBasedProgress","done","selectMetadataProgress","started","pending","expected","selectIsGeneratingMetadata","some","hasStarted","selectMetadataOutcome","isOngoing","generated","skipped","failed","actions","isUploadInFlight","uploadProgressReducer","reducer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadProgress.mjs","sources":["../../../admin/src/store/uploadProgress.ts"],"sourcesContent":["import { createSelector, createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { File } from '../../../shared/contracts/files';\n\nexport interface FileUploadError {\n name: string;\n message: string;\n}\n\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error' | 'cancelled';\n\n/**\n * AI metadata generation phase for a single row, tracked independently from the\n * upload status: a metadata failure never turns a successful upload into an error.\n * `undefined` means the row has no metadata phase at all, i.e. AI metadata is\n * disabled — non-images do get a phase and come back `skipped` from the server.\n */\nexport type FileMetadataStatus = 'generating' | 'generated' | 'skipped' | 'failed';\n\nexport type FileMetadataResultStatus = Exclude<FileMetadataStatus, 'generating'>;\n\nexport interface FileProgress {\n name: string;\n index: number;\n status: FileProgressStatus;\n size: number;\n uploadedBytes: number;\n file?: File;\n /** When the server confirmed the upload. Set with the row's asset. */\n completedAt?: number;\n error?: string;\n metadataStatus?: FileMetadataStatus;\n /**\n * Who started the row, when that is not the progress dialog alone. The Content\n * Manager field tags its own uploads so it can show their state in place.\n */\n owner?: string;\n}\n\nexport interface UploadProgressState {\n isVisible: boolean;\n isMinimized: boolean;\n totalFiles: number;\n files: FileProgress[];\n errors: FileUploadError[];\n uploadId: number;\n /**\n * Whether every row's size was known when the batch opened (the direct-file flow), so\n * the byte-weighted aggregate is meaningful. The URL flow learns sizes one row at a time.\n */\n reportsByteProgress: boolean;\n}\n\nexport interface RootState {\n uploadProgress: UploadProgressState;\n}\n\nconst initialState: UploadProgressState = {\n isVisible: false,\n isMinimized: false,\n totalFiles: 0,\n files: [],\n errors: [],\n uploadId: 0,\n reportsByteProgress: false,\n};\n\nconst uploadProgressSlice = createSlice({\n name: 'uploadProgress',\n initialState,\n reducers: {\n openUploadProgress(\n state,\n action: PayloadAction<{\n totalFiles: number;\n fileNames: string[];\n fileSizes?: number[];\n owner?: string;\n }>\n ) {\n state.isVisible = true;\n state.isMinimized = false;\n\n // Create pending files for upload\n const pendingFiles: FileProgress[] = action.payload.fileNames.map((name, index) => ({\n name,\n index,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[index] ?? 0,\n uploadedBytes: 0,\n owner: action.payload.owner,\n }));\n\n state.files = pendingFiles;\n state.totalFiles = action.payload.totalFiles;\n state.errors = [];\n state.uploadId += 1;\n // Known sizes == the direct-file flow == the flow that streams bytes.\n state.reportsByteProgress = action.payload.fileSizes !== undefined;\n },\n /**\n * Rows for a second drop, joined to the batch already uploading. Indices\n * continue from the current length so the earlier drop's in-flight uploads\n * keep addressing their own rows.\n */\n appendUploadFiles(\n state,\n action: PayloadAction<{\n uploadId: number;\n fileNames: string[];\n fileSizes?: number[];\n owner?: string;\n }>\n ) {\n if (action.payload.uploadId !== state.uploadId) {\n return;\n }\n\n const offset = state.files.length;\n\n state.files.push(\n ...action.payload.fileNames.map((name, i) => ({\n name,\n index: offset + i,\n status: 'pending' as FileProgressStatus,\n size: action.payload.fileSizes?.[i] ?? 0,\n uploadedBytes: 0,\n owner: action.payload.owner,\n }))\n );\n\n state.totalFiles += action.payload.fileNames.length;\n // The dialog may have been dismissed while the first drop was running.\n state.isVisible = true;\n state.isMinimized = false;\n },\n setFileUploading(\n state,\n action: PayloadAction<{ name: string; index: number; size: number; uploadId: number }>\n ) {\n const { index, size, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'uploading';\n state.files[index].size = size;\n }\n },\n /**\n * `size` is optional and only sent by the URL flow, which learns the size from the\n * same server event that carries the first byte count — the row was created with\n * `size: 0`, and bytes clamped against a zero size would all read as zero. The\n * direct-file flow already knows the size up front and omits it.\n */\n setFileProgress(\n state,\n action: PayloadAction<{ index: number; bytes: number; uploadId: number; size?: number }>\n ) {\n const { index, bytes, size, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n const file = state.files[index];\n if (file) {\n if (size !== undefined && file.size === 0) {\n file.size = size;\n }\n // Clamp to the known file size so the aggregate can never exceed 100%.\n file.uploadedBytes = Math.min(bytes, file.size);\n }\n },\n setFileComplete(\n state,\n action: PayloadAction<{ index: number; file: File; uploadId: number; completedAt: number }>\n ) {\n const { index, file, uploadId, completedAt } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'complete';\n state.files[index].file = file;\n state.files[index].completedAt = completedAt;\n // Reflect completion in the aggregate even if the final progress event was throttled.\n state.files[index].uploadedBytes = state.files[index].size;\n }\n },\n setFileError(\n state,\n action: PayloadAction<{ index: number; name: string; message: string; uploadId: number }>\n ) {\n const { index, name, message, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].status = 'error';\n state.files[index].error = message;\n }\n state.errors = [...state.errors, { name, message }];\n },\n /**\n * Metadata generation started for a row.\n *\n * Metadata requests are fired-and-forgotten, so their callbacks can land after\n * a new batch has replaced `files` and reused the same row indices. Every\n * metadata payload therefore carries the `uploadId` it was fired for, and stale\n * ones are dropped instead of writing onto another batch's row.\n */\n setFileMetadataGenerating(state, action: PayloadAction<{ index: number; uploadId: number }>) {\n const { index, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].metadataStatus = 'generating';\n }\n },\n /**\n * Terminal metadata outcome for a row. Never touches `status`/`error`/`errors`:\n * the upload itself already succeeded regardless of how generation went.\n */\n setFileMetadataResult(\n state,\n action: PayloadAction<{\n index: number;\n uploadId: number;\n status: FileMetadataResultStatus;\n }>\n ) {\n const { index, uploadId, status } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n if (state.files[index]) {\n state.files[index].metadataStatus = status;\n }\n },\n addUploadErrors(state, action: PayloadAction<FileUploadError[]>) {\n state.errors = [...state.errors, ...action.payload];\n },\n closeUploadProgress(state) {\n state.isVisible = false;\n state.isMinimized = false;\n state.totalFiles = 0;\n state.files = [];\n state.errors = [];\n state.reportsByteProgress = false;\n },\n toggleMinimize(state) {\n state.isMinimized = !state.isMinimized;\n },\n cancelUpload(state) {\n // Mark all pending and uploading files as cancelled\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return { ...file, status: 'cancelled' as FileProgressStatus };\n }\n return file;\n });\n },\n setUploadFailed(state, action: PayloadAction<{ message: string }>) {\n // Mark all pending and uploading files as errored when a catastrophic failure occurs\n state.files = state.files.map((file) => {\n if (file.status === 'pending' || file.status === 'uploading') {\n return {\n ...file,\n status: 'error' as FileProgressStatus,\n error: action.payload.message,\n };\n }\n return file;\n });\n state.errors = [...state.errors, { name: 'Upload Error', message: action.payload.message }];\n },\n /** Cancels one row, leaving the rest of the batch running. */\n cancelFile(state, action: PayloadAction<{ index: number; uploadId: number }>) {\n const { index, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n const file = state.files[index];\n if (file && (file.status === 'pending' || file.status === 'uploading')) {\n file.status = 'cancelled';\n }\n },\n /** Puts one cancelled or failed row back in the queue. */\n retryFile(state, action: PayloadAction<{ index: number; uploadId: number }>) {\n const { index, uploadId } = action.payload;\n if (uploadId !== state.uploadId) {\n return;\n }\n const file = state.files[index];\n if (file && (file.status === 'cancelled' || file.status === 'error')) {\n file.status = 'pending';\n file.uploadedBytes = 0;\n file.error = undefined;\n file.metadataStatus = undefined;\n }\n },\n retryCancelledFiles(state) {\n // Reset all cancelled files back to pending for retry\n state.files = state.files.map((file) => {\n if (file.status === 'cancelled') {\n return {\n ...file,\n status: 'pending' as FileProgressStatus,\n uploadedBytes: 0,\n // A retried row goes through the metadata phase again from scratch.\n metadataStatus: undefined,\n };\n }\n return file;\n });\n },\n },\n});\n\n/**\n * Assets whose own upload has already finished, newest batch only.\n *\n * The list behind the upload dialog uses these to show each asset the moment it\n * lands, instead of waiting for the batch mutation to invalidate the cache. Rows\n * only carry a `file` once the server has created it, so every entry here is a\n * real, persisted asset.\n */\nconst NO_FILES: FileProgress[] = [];\n\n/** An uploaded asset, with the moment the server confirmed it. */\nexport interface CompletedUpload {\n asset: File;\n completedAt: number;\n}\n\nexport const selectCompletedUploads = createSelector(\n // The plugin registers this slice in `register()`, so a host that has not\n // reached that point has no upload state — and therefore nothing to place.\n (state: Partial<RootState>) => state.uploadProgress?.files ?? NO_FILES,\n (files): CompletedUpload[] =>\n files.reduce<CompletedUpload[]>((completed, row) => {\n if (row.status === 'complete' && row.file && row.completedAt !== undefined) {\n completed.push({ asset: row.file, completedAt: row.completedAt });\n }\n\n return completed;\n }, [])\n);\n\n/**\n * Byte-weighted aggregate progress across the whole batch: `sum(uploadedBytes) / sum(size)`.\n *\n * Falls back to count-based progress (settled files / total files) when all sizes are\n * zero — e.g. URL-flow rows where the file size is unknown up front.\n */\nexport const selectAggregateProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number => {\n if (files.length === 0) return 0;\n\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n\n if (totalSize === 0) {\n const settled = files.filter(\n (f) => f.status === 'complete' || f.status === 'error' || f.status === 'cancelled'\n ).length;\n return Math.round((settled / files.length) * 100);\n }\n\n const uploadedBytes = files.reduce((sum, f) => sum + f.uploadedBytes, 0);\n return Math.round((uploadedBytes / totalSize) * 100);\n }\n);\n\n/**\n * Whether to show byte-weighted `selectAggregateProgress` rather than `selectCountBasedProgress`.\n *\n * Only the flag: byte-weighting needs every size up front. A URL batch learns sizes one row\n * at a time, so weighting over the sizes known so far makes the header jump backwards at\n * every file boundary.\n */\nexport const selectReportsByteProgress = createSelector(\n (state: RootState) => state.uploadProgress.reportsByteProgress,\n (reportsByteProgress): boolean => reportsByteProgress\n);\n\n/**\n * Row-weighted progress for a batch whose sizes are not known up front (the URL flow).\n * Each row is worth `1 / total`: settled rows count fully and an in-flight row contributes\n * `uploadedBytes / size` once it reports bytes, so a multi-URL batch climbs smoothly to\n * 33 → 67 → 100 and never moves backwards.\n *\n * Returns `null` until something has moved — 0% is the frozen signal this flow exists to\n * remove, so the header stays indeterminate until there's real progress.\n */\nexport const selectCountBasedProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number | null => {\n const done = files.reduce((sum, f) => {\n if (f.status === 'complete' || f.status === 'error' || f.status === 'cancelled') {\n return sum + 1;\n }\n return f.size > 0 ? sum + Math.min(f.uploadedBytes / f.size, 1) : sum;\n }, 0);\n\n if (done === 0) {\n return null;\n }\n\n return Math.round((done / files.length) * 100);\n }\n);\n\n/**\n * Count-based metadata progress across the whole batch: `settled / expected`.\n *\n * Count-based rather than byte-weighted because the generation endpoint answers in one\n * go — there is no intermediate progress to weight.\n *\n * The denominator is every row *expected* to enter the phase, not just those that\n * already have. Generation is fired per file as each upload finishes, so counting only\n * started rows made the denominator grow mid-batch and the percentage jump backwards\n * (1/1 = 100%, then a second row starts and it drops to 1/2 = 50%), which flickered the\n * header subtitle on and off once per file.\n *\n * \"Expected\" is derived from upload outcome rather than from the AI-metadata flag:\n * - a row still uploading may yet enter the phase, so it counts toward the total;\n * - an errored or cancelled row never will, so it must not — otherwise a batch with\n * one failure could never reach 100%.\n *\n * Returns `null` when nothing has entered the phase and nothing is pending — i.e. AI\n * metadata is off, or the batch is done — so the header can hide the subtitle.\n */\nexport const selectMetadataProgress = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): number | null => {\n const started = files.filter((f) => f.metadataStatus !== undefined);\n\n // Nothing has entered the phase yet: with no started row there is no evidence AI\n // metadata is even enabled, so stay silent rather than showing a premature 0%.\n if (started.length === 0) return null;\n\n // Rows whose upload is still in flight are counted in the denominator so the\n // percentage only ever climbs as the batch progresses.\n const pending = files.filter(\n (f) => f.metadataStatus === undefined && (f.status === 'pending' || f.status === 'uploading')\n ).length;\n\n const expected = started.length + pending;\n const settled = started.filter((f) => f.metadataStatus !== 'generating').length;\n\n return Math.round((settled / expected) * 100);\n }\n);\n\n/**\n * Whether the metadata phase is still ongoing for the batch as a whole.\n *\n * The header uses this — not `selectMetadataProgress === 100` — to decide when to drop\n * the subtitle. Two distinct reasons the phase can be unfinished:\n * - a row is generating right now;\n * - no row is generating this instant, but rows are still uploading and will enter the\n * phase when they finish.\n *\n * The second clause is what keeps the subtitle stable. Generation for file N typically\n * finishes before file N+1 finishes uploading, so a naive \"is anything generating?\"\n * check goes false between every pair of files and blinks the subtitle out and back in.\n */\nexport const selectIsGeneratingMetadata = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): boolean => {\n if (files.some((f) => f.metadataStatus === 'generating')) return true;\n\n // Only bridge the gap if some row has already entered the phase — otherwise a batch\n // with AI metadata disabled would report the phase as ongoing for its whole upload.\n const hasStarted = files.some((f) => f.metadataStatus !== undefined);\n\n return hasStarted && files.some((f) => f.status === 'pending' || f.status === 'uploading');\n }\n);\n\n/**\n * How many rows reached each terminal metadata outcome, for the header's completion\n * message. `null` while the phase is unfinished — or was never entered at all — so the\n * caller has a single check for \"there is no settled outcome to report yet\".\n *\n * Counts are reported separately rather than collapsed into one total because they are\n * not interchangeable: only `generated` rows actually had metadata written, so only that\n * count can be claimed as a success. A batch of non-images settles entirely on `skipped`,\n * where \"generated on 0 files\" would be worse than saying nothing.\n */\nexport const selectMetadataOutcome = createSelector(\n (state: RootState) => state.uploadProgress.files,\n (files): { generated: number; skipped: number; failed: number } | null => {\n const started = files.filter((f) => f.metadataStatus !== undefined);\n\n if (started.length === 0) return null;\n\n // Mirrors `selectIsGeneratingMetadata`: the phase isn't over while a row is\n // generating, nor while a row is still uploading and has yet to enter it.\n const isOngoing =\n started.some((f) => f.metadataStatus === 'generating') ||\n files.some((f) => f.status === 'pending' || f.status === 'uploading');\n\n if (isOngoing) return null;\n\n return {\n generated: started.filter((f) => f.metadataStatus === 'generated').length,\n skipped: started.filter((f) => f.metadataStatus === 'skipped').length,\n failed: started.filter((f) => f.metadataStatus === 'failed').length,\n };\n }\n);\n\nexport const {\n openUploadProgress,\n appendUploadFiles,\n setFileUploading,\n setFileProgress,\n setFileComplete,\n setFileError,\n setFileMetadataGenerating,\n setFileMetadataResult,\n addUploadErrors,\n closeUploadProgress,\n toggleMinimize,\n cancelUpload,\n setUploadFailed,\n cancelFile,\n retryFile,\n retryCancelledFiles,\n} = uploadProgressSlice.actions;\n\n/**\n * The merge/reset switch. Errored and cancelled rows count as settled, so a\n * batch that finished badly is still replaced by the next drop.\n */\nexport const isUploadInFlight = (files: ReadonlyArray<{ status: FileProgressStatus }>): boolean =>\n files.some((f) => f.status === 'pending' || f.status === 'uploading');\n\nexport const uploadProgressReducer = uploadProgressSlice.reducer;\n"],"names":["initialState","isVisible","isMinimized","totalFiles","files","errors","uploadId","reportsByteProgress","uploadProgressSlice","createSlice","name","reducers","openUploadProgress","state","action","pendingFiles","payload","fileNames","map","index","status","size","fileSizes","uploadedBytes","owner","undefined","appendUploadFiles","offset","length","push","i","setFileUploading","setFileProgress","bytes","file","Math","min","setFileComplete","completedAt","setFileError","message","error","setFileMetadataGenerating","metadataStatus","setFileMetadataResult","addUploadErrors","closeUploadProgress","toggleMinimize","cancelUpload","setUploadFailed","cancelFile","retryFile","retryCancelledFiles","NO_FILES","selectCompletedUploads","createSelector","uploadProgress","reduce","completed","row","asset","selectAggregateProgress","totalSize","sum","f","settled","filter","round","selectReportsByteProgress","selectCountBasedProgress","done","selectMetadataProgress","started","pending","expected","selectIsGeneratingMetadata","some","hasStarted","selectMetadataOutcome","isOngoing","generated","skipped","failed","actions","isUploadInFlight","uploadProgressReducer","reducer"],"mappings":"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"}
|
|
@@ -51,13 +51,13 @@ var ca = {
|
|
|
51
51
|
"list.assets.loading-asset": "S'està carregant la previsualització dels mitjans: {path}",
|
|
52
52
|
"list.assets.not-supported-content": "No hi ha vista prèvia disponible",
|
|
53
53
|
"list.assets.preview-asset": "Vista prèvia del vídeo al camí {path}",
|
|
54
|
-
"list.assets.selected": "{
|
|
54
|
+
"list.assets.selected": "{numberFolders, plural, one {1 carpeta} other {# carpetes}} - {numberAssets, plural, one {1 fitxer} other {# fitxers}}",
|
|
55
55
|
"list.assets.title": "Fitxers",
|
|
56
56
|
"list.assets.to-upload": "{number, plural, =0 {Cap fitxer} one {1 fitxer} other {# fitxers}} a punt per pujar",
|
|
57
57
|
"list.assets.type-not-allowed": "Aquest tipus de fitxer no està permès.",
|
|
58
58
|
"list.folder.edit": "Edita la carpeta",
|
|
59
59
|
"list.folder.subtitle": "{folderCount, plural, =0 {Cap carpeta} one {# carpeta} other {# carpetes}}, {filesCount, plural, =0 {Cap fitxer} one {# fitxer} other {# fitxers}}",
|
|
60
|
-
"list.folders.title": "Carpetes",
|
|
60
|
+
"list.folders.title": "Carpetes ({count})",
|
|
61
61
|
"mediaLibraryInput.actions.nextSlide": "Següent diapositiva",
|
|
62
62
|
"mediaLibraryInput.actions.previousSlide": "Diapositiva anterior",
|
|
63
63
|
"mediaLibraryInput.placeholder": "Feu clic per afegir un fitxer o arrossegueu-ne un en aquesta àrea",
|
|
@@ -80,7 +80,7 @@ var ca = {
|
|
|
80
80
|
"modal.nav.url": "Des de l'URL",
|
|
81
81
|
"modal.remove.success-label": "El fitxer s'ha eliminat correctament.",
|
|
82
82
|
"modal.selected-list.sub-header-subtitle": "Arrossegueu i deixeu anar per reordenar els fitxers al camp",
|
|
83
|
-
"modal.upload-list.footer.button": "Carregueu {
|
|
83
|
+
"modal.upload-list.footer.button": "Carregueu {number, plural, one {# fitxer} other {# fitxers}} a la biblioteca",
|
|
84
84
|
"modal.upload-list.sub-header-subtitle": "Gestioneu els fitxers abans d'afegir-los a la Mediateca",
|
|
85
85
|
"modal.upload-list.sub-header.button": "Afegeix més actius",
|
|
86
86
|
"modal.upload.cancelled": "La càrrega s'ha avortat manualment.",
|
|
@@ -49,13 +49,13 @@ var ca = {
|
|
|
49
49
|
"list.assets.loading-asset": "S'està carregant la previsualització dels mitjans: {path}",
|
|
50
50
|
"list.assets.not-supported-content": "No hi ha vista prèvia disponible",
|
|
51
51
|
"list.assets.preview-asset": "Vista prèvia del vídeo al camí {path}",
|
|
52
|
-
"list.assets.selected": "{
|
|
52
|
+
"list.assets.selected": "{numberFolders, plural, one {1 carpeta} other {# carpetes}} - {numberAssets, plural, one {1 fitxer} other {# fitxers}}",
|
|
53
53
|
"list.assets.title": "Fitxers",
|
|
54
54
|
"list.assets.to-upload": "{number, plural, =0 {Cap fitxer} one {1 fitxer} other {# fitxers}} a punt per pujar",
|
|
55
55
|
"list.assets.type-not-allowed": "Aquest tipus de fitxer no està permès.",
|
|
56
56
|
"list.folder.edit": "Edita la carpeta",
|
|
57
57
|
"list.folder.subtitle": "{folderCount, plural, =0 {Cap carpeta} one {# carpeta} other {# carpetes}}, {filesCount, plural, =0 {Cap fitxer} one {# fitxer} other {# fitxers}}",
|
|
58
|
-
"list.folders.title": "Carpetes",
|
|
58
|
+
"list.folders.title": "Carpetes ({count})",
|
|
59
59
|
"mediaLibraryInput.actions.nextSlide": "Següent diapositiva",
|
|
60
60
|
"mediaLibraryInput.actions.previousSlide": "Diapositiva anterior",
|
|
61
61
|
"mediaLibraryInput.placeholder": "Feu clic per afegir un fitxer o arrossegueu-ne un en aquesta àrea",
|
|
@@ -78,7 +78,7 @@ var ca = {
|
|
|
78
78
|
"modal.nav.url": "Des de l'URL",
|
|
79
79
|
"modal.remove.success-label": "El fitxer s'ha eliminat correctament.",
|
|
80
80
|
"modal.selected-list.sub-header-subtitle": "Arrossegueu i deixeu anar per reordenar els fitxers al camp",
|
|
81
|
-
"modal.upload-list.footer.button": "Carregueu {
|
|
81
|
+
"modal.upload-list.footer.button": "Carregueu {number, plural, one {# fitxer} other {# fitxers}} a la biblioteca",
|
|
82
82
|
"modal.upload-list.sub-header-subtitle": "Gestioneu els fitxers abans d'afegir-los a la Mediateca",
|
|
83
83
|
"modal.upload-list.sub-header.button": "Afegeix més actius",
|
|
84
84
|
"modal.upload.cancelled": "La càrrega s'ha avortat manualment.",
|
|
@@ -44,7 +44,7 @@ var da = {
|
|
|
44
44
|
"list.assets.loading-asset": "Henter forhåndsvisning for mediet: {path}",
|
|
45
45
|
"list.assets.not-supported-content": "Ingen forhåndsvisning mulig",
|
|
46
46
|
"list.assets.preview-asset": "Forhåndsvisning af videoen her {path}",
|
|
47
|
-
"list.assets.selected": "{
|
|
47
|
+
"list.assets.selected": "{numberFolders, plural, one {1 mappe} other {# mapper}} - {numberAssets, plural, one {1 medie} other {# medier}}",
|
|
48
48
|
"list.assets.type-not-allowed": "Filtypen er ikke tilladt.",
|
|
49
49
|
"mediaLibraryInput.actions.nextSlide": "Næste slide",
|
|
50
50
|
"mediaLibraryInput.actions.previousSlide": "Forrige slide",
|
|
@@ -42,7 +42,7 @@ var da = {
|
|
|
42
42
|
"list.assets.loading-asset": "Henter forhåndsvisning for mediet: {path}",
|
|
43
43
|
"list.assets.not-supported-content": "Ingen forhåndsvisning mulig",
|
|
44
44
|
"list.assets.preview-asset": "Forhåndsvisning af videoen her {path}",
|
|
45
|
-
"list.assets.selected": "{
|
|
45
|
+
"list.assets.selected": "{numberFolders, plural, one {1 mappe} other {# mapper}} - {numberAssets, plural, one {1 medie} other {# medier}}",
|
|
46
46
|
"list.assets.type-not-allowed": "Filtypen er ikke tilladt.",
|
|
47
47
|
"mediaLibraryInput.actions.nextSlide": "Næste slide",
|
|
48
48
|
"mediaLibraryInput.actions.previousSlide": "Forrige slide",
|
|
@@ -55,7 +55,7 @@ var de = {
|
|
|
55
55
|
"list.assets.loading-asset": "Lade die Vorschau für Medien: {path}",
|
|
56
56
|
"list.assets.not-supported-content": "Keine Vorschau verfügbar",
|
|
57
57
|
"list.assets.preview-asset": "Vorschau für das Video unter {path}",
|
|
58
|
-
"list.assets.selected": "{
|
|
58
|
+
"list.assets.selected": "{numberFolders, plural, one {1 Ordner} other {# Ordner}} - {numberAssets, plural, one {1 Datei} other {# Dateien}}",
|
|
59
59
|
"list-assets-select": "Datei {name} auswählen",
|
|
60
60
|
"list.assets.type-not-allowed": "Dieser Dateityp ist nicht zulässig.",
|
|
61
61
|
"list.assets.to-upload": "{number, plural, =0 {Keine Datei} one {1 Datei} other {# Dateien}} bereit zum Hochladen",
|
|
@@ -53,7 +53,7 @@ var de = {
|
|
|
53
53
|
"list.assets.loading-asset": "Lade die Vorschau für Medien: {path}",
|
|
54
54
|
"list.assets.not-supported-content": "Keine Vorschau verfügbar",
|
|
55
55
|
"list.assets.preview-asset": "Vorschau für das Video unter {path}",
|
|
56
|
-
"list.assets.selected": "{
|
|
56
|
+
"list.assets.selected": "{numberFolders, plural, one {1 Ordner} other {# Ordner}} - {numberAssets, plural, one {1 Datei} other {# Dateien}}",
|
|
57
57
|
"list-assets-select": "Datei {name} auswählen",
|
|
58
58
|
"list.assets.type-not-allowed": "Dieser Dateityp ist nicht zulässig.",
|
|
59
59
|
"list.assets.to-upload": "{number, plural, =0 {Keine Datei} one {1 Datei} other {# Dateien}} bereit zum Hochladen",
|
|
@@ -4,6 +4,14 @@ var en = {
|
|
|
4
4
|
"apiError.FileTooBig": "The file is too large to be uploaded. It exceeds the maximum request size allowed by the server.",
|
|
5
5
|
"apiError.FolderContainsUnauthorizedAssetsError": "The selected folders contain assets that you do not have permission to delete.",
|
|
6
6
|
"assets.uploaded": "{number, plural, one {# asset} other {# assets}} uploaded successfully",
|
|
7
|
+
"asset-picker.breadcrumbs.label": "Folder navigation",
|
|
8
|
+
"asset-picker.breadcrumbs.more": "Show more folders",
|
|
9
|
+
"asset-picker.confirm": "Confirm",
|
|
10
|
+
"asset-picker.selected.empty": "No asset selected yet.",
|
|
11
|
+
"asset-picker.tabs.browse": "Browse assets",
|
|
12
|
+
"asset-picker.tabs.label": "Asset picker tabs",
|
|
13
|
+
"asset-picker.tabs.selected": "Selected assets",
|
|
14
|
+
"asset-picker.title": "Add asset for {fieldName}",
|
|
7
15
|
"asset-details.title": "File details",
|
|
8
16
|
"asset-details.description": "Displays file information and metadata",
|
|
9
17
|
"asset-details.fileInfo": "File info",
|
|
@@ -70,6 +78,21 @@ var en = {
|
|
|
70
78
|
"asset-details.crop.error": "Failed to update the file.",
|
|
71
79
|
"asset-details.crop.loading": "Saving the copy…",
|
|
72
80
|
"asset-details.noPreview": "No preview available",
|
|
81
|
+
"content-manager.input.actions.copy-link": "Copy link to {name}",
|
|
82
|
+
"content-manager.input.actions.edit": "Edit {name}",
|
|
83
|
+
"content-manager.input.actions.remove": "Remove {name}",
|
|
84
|
+
"content-manager.input.notification.single-file": "This field accepts only one file.",
|
|
85
|
+
"content-manager.input.notification.not-attached": "{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.",
|
|
86
|
+
"content-manager.input.add-asset": "Add asset",
|
|
87
|
+
"content-manager.input.add-asset.browse": "Browse library",
|
|
88
|
+
"content-manager.input.add-asset.device": "Upload from device",
|
|
89
|
+
"content-manager.input.add-asset.url": "Upload from URL",
|
|
90
|
+
"content-manager.input.actions.cancel": "Cancel upload of {name}",
|
|
91
|
+
"content-manager.input.actions.more": "More actions for {name}",
|
|
92
|
+
"content-manager.input.actions.remove-failed": "Remove",
|
|
93
|
+
"content-manager.input.actions.retry": "Retry uploading {name}",
|
|
94
|
+
"content-manager.input.placeholder": "Drag & drop an asset here",
|
|
95
|
+
"content-manager.input.status.uploading": "Uploading",
|
|
73
96
|
"upload.generic-error": "An error occurred while uploading the file.",
|
|
74
97
|
"upload.progress": "Upload progress",
|
|
75
98
|
"upload.progress.description": "Shows upload progress and status",
|
|
@@ -252,6 +275,11 @@ var en = {
|
|
|
252
275
|
"list.folder.select": "Select {name} folder",
|
|
253
276
|
"list.folder.subtitle": "{folderCount, plural, one {# folder} other {# folders}}, {filesCount, plural, one {# asset} other {# assets}}",
|
|
254
277
|
"list.folders.title": "Folders ({count})",
|
|
278
|
+
"list.item.reorder": "Reorder {name}",
|
|
279
|
+
"list.reorder.cancelled": "Reordering cancelled. {name} is back at position {position} of {count}.",
|
|
280
|
+
"list.reorder.dropped": "{name} dropped at position {position} of {count}.",
|
|
281
|
+
"list.reorder.moved": "{name} moved to position {position} of {count}.",
|
|
282
|
+
"list.reorder.picked-up": "Picked up {name}. Position {position} of {count}.",
|
|
255
283
|
"list.folders.link-label": "Access folder",
|
|
256
284
|
"mediaLibraryInput.actions.nextSlide": "Next slide",
|
|
257
285
|
"mediaLibraryInput.actions.previousSlide": "Previous slide",
|
|
@@ -397,6 +425,7 @@ var en = {
|
|
|
397
425
|
"sidebar.tree.actions": "Actions for {name}",
|
|
398
426
|
"sidebar.tree.empty": "No folders yet",
|
|
399
427
|
"sidebar.tree.loading": "Loading folders...",
|
|
428
|
+
"sidebar.tree.hidden-ancestors": "{count, plural, one {# parent folder} other {# parent folders}}",
|
|
400
429
|
"sidebar.tree.error": "Could not load folders."
|
|
401
430
|
};
|
|
402
431
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,6 +2,14 @@ var en = {
|
|
|
2
2
|
"apiError.FileTooBig": "The file is too large to be uploaded. It exceeds the maximum request size allowed by the server.",
|
|
3
3
|
"apiError.FolderContainsUnauthorizedAssetsError": "The selected folders contain assets that you do not have permission to delete.",
|
|
4
4
|
"assets.uploaded": "{number, plural, one {# asset} other {# assets}} uploaded successfully",
|
|
5
|
+
"asset-picker.breadcrumbs.label": "Folder navigation",
|
|
6
|
+
"asset-picker.breadcrumbs.more": "Show more folders",
|
|
7
|
+
"asset-picker.confirm": "Confirm",
|
|
8
|
+
"asset-picker.selected.empty": "No asset selected yet.",
|
|
9
|
+
"asset-picker.tabs.browse": "Browse assets",
|
|
10
|
+
"asset-picker.tabs.label": "Asset picker tabs",
|
|
11
|
+
"asset-picker.tabs.selected": "Selected assets",
|
|
12
|
+
"asset-picker.title": "Add asset for {fieldName}",
|
|
5
13
|
"asset-details.title": "File details",
|
|
6
14
|
"asset-details.description": "Displays file information and metadata",
|
|
7
15
|
"asset-details.fileInfo": "File info",
|
|
@@ -68,6 +76,21 @@ var en = {
|
|
|
68
76
|
"asset-details.crop.error": "Failed to update the file.",
|
|
69
77
|
"asset-details.crop.loading": "Saving the copy…",
|
|
70
78
|
"asset-details.noPreview": "No preview available",
|
|
79
|
+
"content-manager.input.actions.copy-link": "Copy link to {name}",
|
|
80
|
+
"content-manager.input.actions.edit": "Edit {name}",
|
|
81
|
+
"content-manager.input.actions.remove": "Remove {name}",
|
|
82
|
+
"content-manager.input.notification.single-file": "This field accepts only one file.",
|
|
83
|
+
"content-manager.input.notification.not-attached": "{fileNames} {count, plural, one {was} other {were}} added to the Media Library, but this field only accepts {fileTypes}.",
|
|
84
|
+
"content-manager.input.add-asset": "Add asset",
|
|
85
|
+
"content-manager.input.add-asset.browse": "Browse library",
|
|
86
|
+
"content-manager.input.add-asset.device": "Upload from device",
|
|
87
|
+
"content-manager.input.add-asset.url": "Upload from URL",
|
|
88
|
+
"content-manager.input.actions.cancel": "Cancel upload of {name}",
|
|
89
|
+
"content-manager.input.actions.more": "More actions for {name}",
|
|
90
|
+
"content-manager.input.actions.remove-failed": "Remove",
|
|
91
|
+
"content-manager.input.actions.retry": "Retry uploading {name}",
|
|
92
|
+
"content-manager.input.placeholder": "Drag & drop an asset here",
|
|
93
|
+
"content-manager.input.status.uploading": "Uploading",
|
|
71
94
|
"upload.generic-error": "An error occurred while uploading the file.",
|
|
72
95
|
"upload.progress": "Upload progress",
|
|
73
96
|
"upload.progress.description": "Shows upload progress and status",
|
|
@@ -250,6 +273,11 @@ var en = {
|
|
|
250
273
|
"list.folder.select": "Select {name} folder",
|
|
251
274
|
"list.folder.subtitle": "{folderCount, plural, one {# folder} other {# folders}}, {filesCount, plural, one {# asset} other {# assets}}",
|
|
252
275
|
"list.folders.title": "Folders ({count})",
|
|
276
|
+
"list.item.reorder": "Reorder {name}",
|
|
277
|
+
"list.reorder.cancelled": "Reordering cancelled. {name} is back at position {position} of {count}.",
|
|
278
|
+
"list.reorder.dropped": "{name} dropped at position {position} of {count}.",
|
|
279
|
+
"list.reorder.moved": "{name} moved to position {position} of {count}.",
|
|
280
|
+
"list.reorder.picked-up": "Picked up {name}. Position {position} of {count}.",
|
|
253
281
|
"list.folders.link-label": "Access folder",
|
|
254
282
|
"mediaLibraryInput.actions.nextSlide": "Next slide",
|
|
255
283
|
"mediaLibraryInput.actions.previousSlide": "Previous slide",
|
|
@@ -395,6 +423,7 @@ var en = {
|
|
|
395
423
|
"sidebar.tree.actions": "Actions for {name}",
|
|
396
424
|
"sidebar.tree.empty": "No folders yet",
|
|
397
425
|
"sidebar.tree.loading": "Loading folders...",
|
|
426
|
+
"sidebar.tree.hidden-ancestors": "{count, plural, one {# parent folder} other {# parent folders}}",
|
|
398
427
|
"sidebar.tree.error": "Could not load folders."
|
|
399
428
|
};
|
|
400
429
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -49,7 +49,7 @@ var es = {
|
|
|
49
49
|
"list.assets.loading-asset": "Cargando la vista previa de los recursos: {path}",
|
|
50
50
|
"list.assets.not-supported-content": "No hay vista previa disponible",
|
|
51
51
|
"list.assets.preview-asset": "Vista previa del video en la ruta {path}",
|
|
52
|
-
"list.assets.selected": "{
|
|
52
|
+
"list.assets.selected": "{numberFolders, plural, one {1 carpeta} other {# carpetas}} - {numberAssets, plural, one {1 recurso} other {# recursos}}",
|
|
53
53
|
"list.assets.type-not-allowed": "Este tipo de archivo no está permitido.",
|
|
54
54
|
"mediaLibraryInput.actions.nextSlide": "Siguiente",
|
|
55
55
|
"mediaLibraryInput.actions.previousSlide": "Anterior",
|
|
@@ -47,7 +47,7 @@ var es = {
|
|
|
47
47
|
"list.assets.loading-asset": "Cargando la vista previa de los recursos: {path}",
|
|
48
48
|
"list.assets.not-supported-content": "No hay vista previa disponible",
|
|
49
49
|
"list.assets.preview-asset": "Vista previa del video en la ruta {path}",
|
|
50
|
-
"list.assets.selected": "{
|
|
50
|
+
"list.assets.selected": "{numberFolders, plural, one {1 carpeta} other {# carpetas}} - {numberAssets, plural, one {1 recurso} other {# recursos}}",
|
|
51
51
|
"list.assets.type-not-allowed": "Este tipo de archivo no está permitido.",
|
|
52
52
|
"mediaLibraryInput.actions.nextSlide": "Siguiente",
|
|
53
53
|
"mediaLibraryInput.actions.previousSlide": "Anterior",
|
|
@@ -101,7 +101,7 @@ var sk = {
|
|
|
101
101
|
"input.url.label": "URL",
|
|
102
102
|
"input.url.placeholder": "Prázdne",
|
|
103
103
|
"input.notification.not-supported": "Tento typ súboru nemôžete nahrať, akceptované sú iba nasledujúce typy – {fileTypes}",
|
|
104
|
-
"list.assets.title": "Súbory",
|
|
104
|
+
"list.assets.title": "Súbory ({count})",
|
|
105
105
|
"list.asset.at.finished": "Načítavanie súbor ukončené.",
|
|
106
106
|
"list.assets-empty.search": "Žiadne výsledky",
|
|
107
107
|
"list.assets-empty.subtitle": "Pridať jeden do zoznamu.",
|
|
@@ -122,7 +122,7 @@ var sk = {
|
|
|
122
122
|
"list.folder.edit": "Upraviť priečinok",
|
|
123
123
|
"list.folder.select": "Vybrať priečinok {name}",
|
|
124
124
|
"list.folder.subtitle": "{folderCount, plural, one {# priečinok} few {# priečinky} other {# priečinkov}}, {filesCount, plural, one {# súbor} few {# súbory} other {# súborov}}",
|
|
125
|
-
"list.folders.title": "Priečinky",
|
|
125
|
+
"list.folders.title": "Priečinky ({count})",
|
|
126
126
|
"list.folders.link-label": "Prístup k priečinku",
|
|
127
127
|
"mediaLibraryInput.actions.nextSlide": "Ďalší slide",
|
|
128
128
|
"mediaLibraryInput.actions.previousSlide": "Predošlý slide",
|
|
@@ -99,7 +99,7 @@ var sk = {
|
|
|
99
99
|
"input.url.label": "URL",
|
|
100
100
|
"input.url.placeholder": "Prázdne",
|
|
101
101
|
"input.notification.not-supported": "Tento typ súboru nemôžete nahrať, akceptované sú iba nasledujúce typy – {fileTypes}",
|
|
102
|
-
"list.assets.title": "Súbory",
|
|
102
|
+
"list.assets.title": "Súbory ({count})",
|
|
103
103
|
"list.asset.at.finished": "Načítavanie súbor ukončené.",
|
|
104
104
|
"list.assets-empty.search": "Žiadne výsledky",
|
|
105
105
|
"list.assets-empty.subtitle": "Pridať jeden do zoznamu.",
|
|
@@ -120,7 +120,7 @@ var sk = {
|
|
|
120
120
|
"list.folder.edit": "Upraviť priečinok",
|
|
121
121
|
"list.folder.select": "Vybrať priečinok {name}",
|
|
122
122
|
"list.folder.subtitle": "{folderCount, plural, one {# priečinok} few {# priečinky} other {# priečinkov}}, {filesCount, plural, one {# súbor} few {# súbory} other {# súborov}}",
|
|
123
|
-
"list.folders.title": "Priečinky",
|
|
123
|
+
"list.folders.title": "Priečinky ({count})",
|
|
124
124
|
"list.folders.link-label": "Prístup k priečinku",
|
|
125
125
|
"mediaLibraryInput.actions.nextSlide": "Ďalší slide",
|
|
126
126
|
"mediaLibraryInput.actions.previousSlide": "Predošlý slide",
|
|
@@ -40,7 +40,7 @@ var tr = {
|
|
|
40
40
|
"input.placeholder.icon": "Dosyayı bu bölgeye bırak",
|
|
41
41
|
"input.url.description": "URL bağlantıları arasına yeni bir satır ekle.",
|
|
42
42
|
"input.url.label": "URL",
|
|
43
|
-
"list.assets.title": "Dosyalar",
|
|
43
|
+
"list.assets.title": "Dosyalar ({count})",
|
|
44
44
|
"list.asset.at.finished": "Dosyaların yüklenmesi tamamlandı.",
|
|
45
45
|
"list.assets-empty.search": "Sonuç bulunamadı",
|
|
46
46
|
"list.assets-empty.subtitle": "Listeye bir tane ekle.",
|
|
@@ -57,7 +57,7 @@ var tr = {
|
|
|
57
57
|
"list.assets.to-upload": "{number} yüklenmeye hazır",
|
|
58
58
|
"list.folder.edit": "Klasörü düzenle",
|
|
59
59
|
"list.folder.subtitle": "{folderCount} klasör, {filesCount} dosya",
|
|
60
|
-
"list.folders.title": "Klasörler",
|
|
60
|
+
"list.folders.title": "Klasörler ({count})",
|
|
61
61
|
"mediaLibraryInput.actions.nextSlide": "Sonraki slayt",
|
|
62
62
|
"mediaLibraryInput.actions.previousSlide": "Önceki slayt",
|
|
63
63
|
"mediaLibraryInput.placeholder": "Dosya yüklemek için tıkla ya da bu alana sürükle ve bırak",
|
|
@@ -38,7 +38,7 @@ var tr = {
|
|
|
38
38
|
"input.placeholder.icon": "Dosyayı bu bölgeye bırak",
|
|
39
39
|
"input.url.description": "URL bağlantıları arasına yeni bir satır ekle.",
|
|
40
40
|
"input.url.label": "URL",
|
|
41
|
-
"list.assets.title": "Dosyalar",
|
|
41
|
+
"list.assets.title": "Dosyalar ({count})",
|
|
42
42
|
"list.asset.at.finished": "Dosyaların yüklenmesi tamamlandı.",
|
|
43
43
|
"list.assets-empty.search": "Sonuç bulunamadı",
|
|
44
44
|
"list.assets-empty.subtitle": "Listeye bir tane ekle.",
|
|
@@ -55,7 +55,7 @@ var tr = {
|
|
|
55
55
|
"list.assets.to-upload": "{number} yüklenmeye hazır",
|
|
56
56
|
"list.folder.edit": "Klasörü düzenle",
|
|
57
57
|
"list.folder.subtitle": "{folderCount} klasör, {filesCount} dosya",
|
|
58
|
-
"list.folders.title": "Klasörler",
|
|
58
|
+
"list.folders.title": "Klasörler ({count})",
|
|
59
59
|
"mediaLibraryInput.actions.nextSlide": "Sonraki slayt",
|
|
60
60
|
"mediaLibraryInput.actions.previousSlide": "Önceki slayt",
|
|
61
61
|
"mediaLibraryInput.placeholder": "Dosya yüklemek için tıkla ya da bu alana sürükle ve bırak",
|
|
@@ -42,7 +42,7 @@ var zhHans = {
|
|
|
42
42
|
"list.assets.loading-asset": "正在为媒体加载预览: {path}",
|
|
43
43
|
"list.assets.not-supported-content": "无可用预览",
|
|
44
44
|
"list.assets.preview-asset": "预览视频(路径:{path})",
|
|
45
|
-
"list.assets.selected": "{
|
|
45
|
+
"list.assets.selected": "{numberFolders, plural, other {# 个文件夹}} - {numberAssets, plural, other {# 个素材}}",
|
|
46
46
|
"list.assets.type-not-allowed": "文件类型不合法",
|
|
47
47
|
"list.table.header.actions": "操作",
|
|
48
48
|
"list.table.header.preview": "预览",
|
|
@@ -40,7 +40,7 @@ var zhHans = {
|
|
|
40
40
|
"list.assets.loading-asset": "正在为媒体加载预览: {path}",
|
|
41
41
|
"list.assets.not-supported-content": "无可用预览",
|
|
42
42
|
"list.assets.preview-asset": "预览视频(路径:{path})",
|
|
43
|
-
"list.assets.selected": "{
|
|
43
|
+
"list.assets.selected": "{numberFolders, plural, other {# 个文件夹}} - {numberAssets, plural, other {# 个素材}}",
|
|
44
44
|
"list.assets.type-not-allowed": "文件类型不合法",
|
|
45
45
|
"list.table.header.actions": "操作",
|
|
46
46
|
"list.table.header.preview": "预览",
|
|
@@ -43,7 +43,7 @@ var zh = {
|
|
|
43
43
|
"input.placeholder.icon": "將素材拖曳至此區域",
|
|
44
44
|
"input.url.description": "以跳行符號分隔連結",
|
|
45
45
|
"input.url.label": "連結",
|
|
46
|
-
"list.assets.title": "
|
|
46
|
+
"list.assets.title": "素材({count})",
|
|
47
47
|
"list.asset.at.finished": "素材已完成載入。",
|
|
48
48
|
"list.assets-empty.search": "找不到結果",
|
|
49
49
|
"list.assets-empty.subtitle": "從開頭新增",
|
|
@@ -60,7 +60,7 @@ var zh = {
|
|
|
60
60
|
"list.assets.to-upload": "{number, plural, =0 {沒有} one {1 個} other {# 個}}素材準備上傳",
|
|
61
61
|
"list.folder.edit": "編輯資料夾",
|
|
62
62
|
"list.folder.subtitle": "{folderCount, plural, =0 {# 資料夾} one {# 資料夾} other {# 資料夾}}, {filesCount, plural, =0 {# 素材} one {# 素材} other {# 素材}}",
|
|
63
|
-
"list.folders.title": "
|
|
63
|
+
"list.folders.title": "資料夾({count})",
|
|
64
64
|
"mediaLibraryInput.actions.nextSlide": "下一張投影片",
|
|
65
65
|
"mediaLibraryInput.actions.previousSlide": "上一張投影片",
|
|
66
66
|
"mediaLibraryInput.placeholder": "點擊以新增素材,或拖曳至此區域",
|
|
@@ -41,7 +41,7 @@ var zh = {
|
|
|
41
41
|
"input.placeholder.icon": "將素材拖曳至此區域",
|
|
42
42
|
"input.url.description": "以跳行符號分隔連結",
|
|
43
43
|
"input.url.label": "連結",
|
|
44
|
-
"list.assets.title": "
|
|
44
|
+
"list.assets.title": "素材({count})",
|
|
45
45
|
"list.asset.at.finished": "素材已完成載入。",
|
|
46
46
|
"list.assets-empty.search": "找不到結果",
|
|
47
47
|
"list.assets-empty.subtitle": "從開頭新增",
|
|
@@ -58,7 +58,7 @@ var zh = {
|
|
|
58
58
|
"list.assets.to-upload": "{number, plural, =0 {沒有} one {1 個} other {# 個}}素材準備上傳",
|
|
59
59
|
"list.folder.edit": "編輯資料夾",
|
|
60
60
|
"list.folder.subtitle": "{folderCount, plural, =0 {# 資料夾} one {# 資料夾} other {# 資料夾}}, {filesCount, plural, =0 {# 素材} one {# 素材} other {# 素材}}",
|
|
61
|
-
"list.folders.title": "
|
|
61
|
+
"list.folders.title": "資料夾({count})",
|
|
62
62
|
"mediaLibraryInput.actions.nextSlide": "下一張投影片",
|
|
63
63
|
"mediaLibraryInput.actions.previousSlide": "上一張投影片",
|
|
64
64
|
"mediaLibraryInput.placeholder": "點擊以新增素材,或拖曳至此區域",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The `allowedTypes` values a `media` attribute can carry, and the mime prefix
|
|
5
|
+
* each one stands for. `files` is the catch-all: anything that is not an image,
|
|
6
|
+
* video or audio.
|
|
7
|
+
*/ const MEDIA_KINDS = [
|
|
8
|
+
'image',
|
|
9
|
+
'video',
|
|
10
|
+
'audio'
|
|
11
|
+
];
|
|
12
|
+
const SINGULAR = {
|
|
13
|
+
files: 'file',
|
|
14
|
+
images: 'image',
|
|
15
|
+
videos: 'video',
|
|
16
|
+
audios: 'audio'
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Whether a mime type satisfies a field's `allowedTypes`.
|
|
20
|
+
*
|
|
21
|
+
* No `allowedTypes` means the field takes anything. A file with no mime is only
|
|
22
|
+
* allowed where `files` is, since nothing places it in one of the three media
|
|
23
|
+
* kinds.
|
|
24
|
+
*/ const isMediaTypeAllowed = (allowedTypes, mime)=>{
|
|
25
|
+
if (!allowedTypes || allowedTypes.length === 0) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const singularTypes = new Set(allowedTypes.map((type)=>SINGULAR[type]).filter((type)=>Boolean(type)));
|
|
29
|
+
const kind = mime?.split('/')[0];
|
|
30
|
+
if (!kind) {
|
|
31
|
+
return singularTypes.has('file');
|
|
32
|
+
}
|
|
33
|
+
if (singularTypes.has('file') && !MEDIA_KINDS.includes(kind)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return singularTypes.has(kind);
|
|
37
|
+
};
|
|
38
|
+
/** The subset of `files` this field accepts, in the order they were given. */ const filterAllowedFiles = (allowedTypes, files)=>files.filter((file)=>isMediaTypeAllowed(allowedTypes, file.type));
|
|
39
|
+
|
|
40
|
+
exports.filterAllowedFiles = filterAllowedFiles;
|
|
41
|
+
exports.isMediaTypeAllowed = isMediaTypeAllowed;
|
|
42
|
+
//# sourceMappingURL=allowedMediaTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowedMediaTypes.js","sources":["../../../admin/src/utils/allowedMediaTypes.ts"],"sourcesContent":["/**\n * The `allowedTypes` values a `media` attribute can carry, and the mime prefix\n * each one stands for. `files` is the catch-all: anything that is not an image,\n * video or audio.\n */\nexport type AllowedMediaType = 'files' | 'images' | 'videos' | 'audios';\n\nconst MEDIA_KINDS = ['image', 'video', 'audio'] as const;\n\nconst SINGULAR: Record<AllowedMediaType, string> = {\n files: 'file',\n images: 'image',\n videos: 'video',\n audios: 'audio',\n};\n\n/**\n * Whether a mime type satisfies a field's `allowedTypes`.\n *\n * No `allowedTypes` means the field takes anything. A file with no mime is only\n * allowed where `files` is, since nothing places it in one of the three media\n * kinds.\n */\nexport const isMediaTypeAllowed = (\n allowedTypes: AllowedMediaType[] | null | undefined,\n mime: string | undefined\n): boolean => {\n if (!allowedTypes || allowedTypes.length === 0) {\n return true;\n }\n\n const singularTypes = new Set(\n allowedTypes.map((type) => SINGULAR[type]).filter((type): type is string => Boolean(type))\n );\n const kind = mime?.split('/')[0];\n\n if (!kind) {\n return singularTypes.has('file');\n }\n\n if (singularTypes.has('file') && !MEDIA_KINDS.includes(kind as (typeof MEDIA_KINDS)[number])) {\n return true;\n }\n\n return singularTypes.has(kind);\n};\n\n/** The subset of `files` this field accepts, in the order they were given. */\nexport const filterAllowedFiles = (\n allowedTypes: AllowedMediaType[] | null | undefined,\n files: globalThis.File[]\n): globalThis.File[] => files.filter((file) => isMediaTypeAllowed(allowedTypes, file.type));\n"],"names":["MEDIA_KINDS","SINGULAR","files","images","videos","audios","isMediaTypeAllowed","allowedTypes","mime","length","singularTypes","Set","map","type","filter","Boolean","kind","split","has","includes","filterAllowedFiles","file"],"mappings":";;AAAA;;;;AAIC,IAGD,MAAMA,WAAAA,GAAc;AAAC,IAAA,OAAA;AAAS,IAAA,OAAA;AAAS,IAAA;AAAQ,CAAA;AAE/C,MAAMC,QAAAA,GAA6C;IACjDC,KAAAA,EAAO,MAAA;IACPC,MAAAA,EAAQ,OAAA;IACRC,MAAAA,EAAQ,OAAA;IACRC,MAAAA,EAAQ;AACV,CAAA;AAEA;;;;;;AAMC,IACM,MAAMC,kBAAAA,GAAqB,CAChCC,YAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,IAAI,CAACD,YAAAA,IAAgBA,YAAAA,CAAaE,MAAM,KAAK,CAAA,EAAG;QAC9C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,gBAAgB,IAAIC,GAAAA,CACxBJ,YAAAA,CAAaK,GAAG,CAAC,CAACC,IAAAA,GAASZ,QAAQ,CAACY,KAAK,CAAA,CAAEC,MAAM,CAAC,CAACD,OAAyBE,OAAAA,CAAQF,IAAAA,CAAAA,CAAAA,CAAAA;AAEtF,IAAA,MAAMG,IAAAA,GAAOR,IAAAA,EAAMS,KAAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE;AAEhC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAON,aAAAA,CAAcQ,GAAG,CAAC,MAAA,CAAA;AAC3B,IAAA;IAEA,IAAIR,aAAAA,CAAcQ,GAAG,CAAC,MAAA,CAAA,IAAW,CAAClB,WAAAA,CAAYmB,QAAQ,CAACH,IAAAA,CAAAA,EAAuC;QAC5F,OAAO,IAAA;AACT,IAAA;IAEA,OAAON,aAAAA,CAAcQ,GAAG,CAACF,IAAAA,CAAAA;AAC3B;AAEA,+EACO,MAAMI,kBAAAA,GAAqB,CAChCb,cACAL,KAAAA,GACsBA,KAAAA,CAAMY,MAAM,CAAC,CAACO,IAAAA,GAASf,kBAAAA,CAAmBC,YAAAA,EAAcc,IAAAA,CAAKR,IAAI,CAAA;;;;;"}
|