@milaboratories/uikit 2.6.2 → 2.6.3
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/.turbo/turbo-build.log +135 -135
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +6 -0
- package/dist/base/BtnBase.vue.js +18 -18
- package/dist/base/BtnBase.vue.js.map +1 -1
- package/dist/components/ContextProvider.vue.js.map +1 -1
- package/dist/components/DataTable/BaseCellComponent.vue.js +20 -20
- package/dist/components/DataTable/BaseCellComponent.vue.js.map +1 -1
- package/dist/components/DataTable/ColumnCaret.vue.js +6 -6
- package/dist/components/DataTable/ColumnCaret.vue.js.map +1 -1
- package/dist/components/DataTable/ColumnsCommandMenu.vue.js.map +1 -1
- package/dist/components/DataTable/RowsCommandMenu.vue.js.map +1 -1
- package/dist/components/DataTable/TScroll.vue.js +12 -12
- package/dist/components/DataTable/TScroll.vue.js.map +1 -1
- package/dist/components/DataTable/TableComponent.vue.js +1 -1
- package/dist/components/DataTable/TableComponent.vue.js.map +1 -1
- package/dist/components/DataTable/TdCell.vue.js +36 -36
- package/dist/components/DataTable/TdCell.vue.js.map +1 -1
- package/dist/components/DataTable/ThCell.vue.js +27 -27
- package/dist/components/DataTable/ThCell.vue.js.map +1 -1
- package/dist/components/DataTable/TrBody.vue.js +12 -12
- package/dist/components/DataTable/TrBody.vue.js.map +1 -1
- package/dist/components/DataTable/TrHead.vue.js.map +1 -1
- package/dist/components/DataTable/assets/TableIcon.vue.js +2 -2
- package/dist/components/DataTable/assets/TableIcon.vue.js.map +1 -1
- package/dist/components/DropdownListItem.vue.js +18 -18
- package/dist/components/DropdownListItem.vue.js.map +1 -1
- package/dist/components/HScroll.vue.js.map +1 -1
- package/dist/components/InputRange.vue.js.map +1 -1
- package/dist/components/LongText.vue.js +1 -1
- package/dist/components/LongText.vue.js.map +1 -1
- package/dist/components/LongText.vue3.js +1 -1
- package/dist/components/PlAccordion/ExpandTransition.vue.js +27 -0
- package/dist/components/PlAccordion/ExpandTransition.vue.js.map +1 -0
- package/dist/components/PlAccordion/ExpandTransition.vue2.js.map +1 -1
- package/dist/components/PlAccordion/PlAccordion.vue.js.map +1 -1
- package/dist/components/PlAccordion/PlAccordionSection.vue2.js +21 -21
- package/dist/components/PlAccordion/PlAccordionSection.vue2.js.map +1 -1
- package/dist/components/PlAlert/PlAlert.vue.js +23 -23
- package/dist/components/PlAlert/PlAlert.vue.js.map +1 -1
- package/dist/components/PlAutocomplete/PlAutocomplete.vue.js +86 -86
- package/dist/components/PlAutocomplete/PlAutocomplete.vue.js.map +1 -1
- package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js +83 -83
- package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js.map +1 -1
- package/dist/components/PlBtnAccent/PlBtnAccent.vue.js.map +1 -1
- package/dist/components/PlBtnDanger/PlBtnDanger.vue.js.map +1 -1
- package/dist/components/PlBtnGhost/PlBtnGhost.vue.js +21 -21
- package/dist/components/PlBtnGhost/PlBtnGhost.vue.js.map +1 -1
- package/dist/components/PlBtnGroup/PlBtnGroup.vue.js +34 -34
- package/dist/components/PlBtnGroup/PlBtnGroup.vue.js.map +1 -1
- package/dist/components/PlBtnLink/PlBtnLink.vue.js +12 -12
- package/dist/components/PlBtnLink/PlBtnLink.vue.js.map +1 -1
- package/dist/components/PlBtnPrimary/PlBtnPrimary.vue.js.map +1 -1
- package/dist/components/PlBtnSecondary/PlBtnSecondary.vue.js.map +1 -1
- package/dist/components/PlBtnSplit/PlBtnSplit.vue.js +31 -31
- package/dist/components/PlBtnSplit/PlBtnSplit.vue.js.map +1 -1
- package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js +18 -18
- package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js.map +1 -1
- package/dist/components/PlChartStackedBar/Legends.vue2.js.map +1 -1
- package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js +15 -15
- package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js.map +1 -1
- package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.vue2.js.map +1 -1
- package/dist/components/PlChartStackedBar/StackedRow.vue2.js.map +1 -1
- package/dist/components/PlChartStackedBar/StackedRowCompact.vue2.js.map +1 -1
- package/dist/components/PlCheckbox/PlCheckbox.vue.js +13 -13
- package/dist/components/PlCheckbox/PlCheckbox.vue.js.map +1 -1
- package/dist/components/PlCheckbox/PlCheckboxBase.vue.js +6 -6
- package/dist/components/PlCheckbox/PlCheckboxBase.vue.js.map +1 -1
- package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.js +28 -28
- package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.js.map +1 -1
- package/dist/components/PlChip/PlChip.vue.js +20 -20
- package/dist/components/PlChip/PlChip.vue.js.map +1 -1
- package/dist/components/PlClipboard/PlClipboard.vue2.js.map +1 -1
- package/dist/components/PlConfirmDialog.vue.js +14 -14
- package/dist/components/PlConfirmDialog.vue.js.map +1 -1
- package/dist/components/PlDialogModal/PlDialogModal.vue.js +30 -30
- package/dist/components/PlDialogModal/PlDialogModal.vue.js.map +1 -1
- package/dist/components/PlDropdown/OptionList.vue.js +40 -40
- package/dist/components/PlDropdown/OptionList.vue.js.map +1 -1
- package/dist/components/PlDropdown/PlDropdown.vue.js +89 -89
- package/dist/components/PlDropdown/PlDropdown.vue.js.map +1 -1
- package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js +92 -92
- package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js.map +1 -1
- package/dist/components/PlDropdownLine/PlDropdownLine.vue.d.ts +1 -1
- package/dist/components/PlDropdownLine/PlDropdownLine.vue.js +4 -4
- package/dist/components/PlDropdownLine/PlDropdownLine.vue.js.map +1 -1
- package/dist/components/PlDropdownLine/ResizableInput.vue.js +12 -12
- package/dist/components/PlDropdownLine/ResizableInput.vue.js.map +1 -1
- package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +70 -70
- package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js.map +1 -1
- package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue.d.ts +1 -1
- package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue.js.map +1 -1
- package/dist/components/PlDropdownRef/PlDropdownRef.vue.js +11 -11
- package/dist/components/PlDropdownRef/PlDropdownRef.vue.js.map +1 -1
- package/dist/components/PlEditableTitle/PlEditableTitle.vue.d.ts +1 -1
- package/dist/components/PlEditableTitle/PlEditableTitle.vue.js +36 -36
- package/dist/components/PlEditableTitle/PlEditableTitle.vue.js.map +1 -1
- package/dist/components/PlElementList/PlElementList.vue2.js.map +1 -1
- package/dist/components/PlElementList/PlElementListItem.vue2.js +67 -67
- package/dist/components/PlElementList/PlElementListItem.vue2.js.map +1 -1
- package/dist/components/PlErrorAlert/PlErrorAlert.vue2.js.map +1 -1
- package/dist/components/PlErrorBoundary/PlErrorBoundary.vue.js.map +1 -1
- package/dist/components/PlFileDialog/Local.vue.js +24 -24
- package/dist/components/PlFileDialog/Local.vue.js.map +1 -1
- package/dist/components/PlFileDialog/PlFileDialog.vue.js +38 -38
- package/dist/components/PlFileDialog/PlFileDialog.vue.js.map +1 -1
- package/dist/components/PlFileDialog/Remote.vue.js +2 -2
- package/dist/components/PlFileDialog/Remote.vue.js.map +1 -1
- package/dist/components/PlFileDialog/Shortcuts.vue2.js +4 -4
- package/dist/components/PlFileDialog/Shortcuts.vue2.js.map +1 -1
- package/dist/components/PlFileInput/PlFileInput.vue.d.ts +1 -1
- package/dist/components/PlFileInput/PlFileInput.vue.js +75 -75
- package/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
- package/dist/components/PlIcon16/PlIcon16.vue2.js.map +1 -1
- package/dist/components/PlIcon24/PlIcon24.vue2.js.map +1 -1
- package/dist/components/PlLoaderCircular/PlLoaderCircular.vue.js +11 -11
- package/dist/components/PlLoaderCircular/PlLoaderCircular.vue.js.map +1 -1
- package/dist/components/PlLogView/PlLogView.vue.js +58 -58
- package/dist/components/PlLogView/PlLogView.vue.js.map +1 -1
- package/dist/components/PlNotificationAlert/PlNotificationAlert.vue.js +22 -22
- package/dist/components/PlNotificationAlert/PlNotificationAlert.vue.js.map +1 -1
- package/dist/components/PlNumberField/PlNumberField.vue.d.ts +1 -1
- package/dist/components/PlNumberField/PlNumberField.vue.js +75 -75
- package/dist/components/PlNumberField/PlNumberField.vue.js.map +1 -1
- package/dist/components/PlProgressBar/PlProgressBar.vue.js +12 -12
- package/dist/components/PlProgressBar/PlProgressBar.vue.js.map +1 -1
- package/dist/components/PlProgressCell/PlProgressCell.vue.js +20 -20
- package/dist/components/PlProgressCell/PlProgressCell.vue.js.map +1 -1
- package/dist/components/PlRadio/PlRadio.vue2.js.map +1 -1
- package/dist/components/PlRadio/PlRadioGroup.vue2.js +8 -8
- package/dist/components/PlRadio/PlRadioGroup.vue2.js.map +1 -1
- package/dist/components/PlSearchField/PlSearchField.vue2.js +19 -19
- package/dist/components/PlSearchField/PlSearchField.vue2.js.map +1 -1
- package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js +8 -8
- package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js.map +1 -1
- package/dist/components/PlSidebar/PlSidebarGroup.vue2.js.map +1 -1
- package/dist/components/PlSidebar/PlSidebarItem.vue2.js.map +1 -1
- package/dist/components/PlSlideModal/PlPureSlideModal.vue.js +1 -1
- package/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
- package/dist/components/PlSlideModal/PlSlideModal.vue2.js.map +1 -1
- package/dist/components/PlSplash/PlSplash.vue.js +16 -16
- package/dist/components/PlSplash/PlSplash.vue.js.map +1 -1
- package/dist/components/PlStatusTag/PlStatusTag.vue.js +7 -7
- package/dist/components/PlStatusTag/PlStatusTag.vue.js.map +1 -1
- package/dist/components/PlSvg/PlSvg.vue2.js.map +1 -1
- package/dist/components/PlTabs/PlTabs.vue.js +18 -18
- package/dist/components/PlTabs/PlTabs.vue.js.map +1 -1
- package/dist/components/PlTabs/Tab.vue.js +9 -9
- package/dist/components/PlTabs/Tab.vue.js.map +1 -1
- package/dist/components/PlTextArea/PlTextArea.vue.js +51 -51
- package/dist/components/PlTextArea/PlTextArea.vue.js.map +1 -1
- package/dist/components/PlTextField/PlTextField.vue.js +62 -62
- package/dist/components/PlTextField/PlTextField.vue.js.map +1 -1
- package/dist/components/PlToggleSwitch/PlToggleSwitch.vue.js +14 -14
- package/dist/components/PlToggleSwitch/PlToggleSwitch.vue.js.map +1 -1
- package/dist/components/PlTooltip/Beak.vue.js +2 -2
- package/dist/components/PlTooltip/Beak.vue.js.map +1 -1
- package/dist/components/PlTooltip/PlTooltip.vue.js +50 -50
- package/dist/components/PlTooltip/PlTooltip.vue.js.map +1 -1
- package/dist/components/Scrollable.vue.js.map +1 -1
- package/dist/components/Slider.vue.js +35 -35
- package/dist/components/Slider.vue.js.map +1 -1
- package/dist/components/SliderRange.vue.js +47 -47
- package/dist/components/SliderRange.vue.js.map +1 -1
- package/dist/components/SliderRangeTriple.vue.js +47 -47
- package/dist/components/SliderRangeTriple.vue.js.map +1 -1
- package/dist/components/TabItem.vue.js.map +1 -1
- package/dist/components/ThemeSwitcher.vue.js +2 -2
- package/dist/components/ThemeSwitcher.vue.js.map +1 -1
- package/dist/components/TransitionSlidePanel.vue.js.map +1 -1
- package/dist/components/VScroll.vue.js.map +1 -1
- package/dist/components/contextMenu/Menu.vue2.js +12 -12
- package/dist/components/contextMenu/Menu.vue2.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/layout/PlBlockPage/PlBlockPage.vue.js +27 -27
- package/dist/layout/PlBlockPage/PlBlockPage.vue.js.map +1 -1
- package/dist/layout/PlContainer/PlContainer.vue.js +10 -10
- package/dist/layout/PlContainer/PlContainer.vue.js.map +1 -1
- package/dist/layout/PlGrid/PlGrid.vue.js.map +1 -1
- package/dist/layout/PlRow/PlRow.vue.js +8 -8
- package/dist/layout/PlRow/PlRow.vue.js.map +1 -1
- package/dist/layout/PlSpacer/PlSpacer.vue.js.map +1 -1
- package/dist/utils/DoubleContour.vue.js +9 -9
- package/dist/utils/DoubleContour.vue.js.map +1 -1
- package/dist/utils/DropdownOverlay/DropdownOverlay.vue.js.map +1 -1
- package/dist/utils/PlCloseModalBtn.vue.js +2 -2
- package/dist/utils/PlCloseModalBtn.vue.js.map +1 -1
- package/dist/utils/TextLabel.vue.js.map +1 -1
- package/package.json +4 -4
- package/dist/utils/DoubleContour.vue2.js +0 -23
- package/dist/utils/DoubleContour.vue2.js.map +0 -1
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { defineComponent as I, reactive as w, computed as P, createElementBlock as
|
|
2
|
-
import
|
|
1
|
+
import { defineComponent as I, reactive as w, computed as P, createElementBlock as a, openBlock as c, withModifiers as S, normalizeClass as v, unref as m, createVNode as C, createElementVNode as N, createCommentVNode as g, toDisplayString as p } from "vue";
|
|
2
|
+
import h from "./pl-file-dialog.module.scss.js";
|
|
3
3
|
import T from "../PlIcon24/PlIcon24.vue.js";
|
|
4
|
-
import { getRawPlatformaInstance as
|
|
5
|
-
import { normalizeExtensions as
|
|
6
|
-
const
|
|
4
|
+
import { getRawPlatformaInstance as f } from "@platforma-sdk/model";
|
|
5
|
+
import { normalizeExtensions as B } from "./utils.js";
|
|
6
|
+
const E = {
|
|
7
7
|
key: 1,
|
|
8
8
|
class: "alert-error"
|
|
9
|
-
},
|
|
9
|
+
}, A = /* @__PURE__ */ I({
|
|
10
10
|
__name: "Local",
|
|
11
11
|
props: {
|
|
12
12
|
importFiles: { type: Function },
|
|
13
13
|
multi: { type: Boolean },
|
|
14
14
|
extensions: {}
|
|
15
15
|
},
|
|
16
|
-
setup(
|
|
17
|
-
const o =
|
|
16
|
+
setup(s) {
|
|
17
|
+
const o = s, l = w({
|
|
18
18
|
error: void 0
|
|
19
19
|
}), x = P(() => o.multi ? "Drag & Drop files here or click to add" : "Drag & Drop file here or click to add"), k = async (r) => {
|
|
20
|
-
var
|
|
21
|
-
const t = (
|
|
20
|
+
var d, u, D;
|
|
21
|
+
const t = (u = (d = f()) == null ? void 0 : d.lsDriver) == null ? void 0 : u.fileToImportHandle;
|
|
22
22
|
if (!t)
|
|
23
23
|
return console.error("API getPlatformaRawInstance().lsDriver.fileToImportHandle is not available");
|
|
24
|
-
const n =
|
|
25
|
-
[...((
|
|
24
|
+
const n = B(o.extensions), e = await Promise.all(
|
|
25
|
+
[...((D = r.dataTransfer) == null ? void 0 : D.files) ?? []].filter((i) => !!i).filter((i) => n ? n.some((F) => i.name.endsWith(F)) : !0).map((i) => t(i))
|
|
26
26
|
);
|
|
27
27
|
e.length && o.importFiles({
|
|
28
28
|
files: e
|
|
@@ -35,40 +35,40 @@ const B = {
|
|
|
35
35
|
extensions: [...o.extensions]
|
|
36
36
|
}
|
|
37
37
|
] : [];
|
|
38
|
-
o.multi ? (t =
|
|
38
|
+
o.multi ? (t = f()) == null || t.lsDriver.showOpenMultipleFilesDialog({
|
|
39
39
|
title: "Select files to import",
|
|
40
40
|
filters: r
|
|
41
41
|
}).then(({ files: e }) => {
|
|
42
42
|
e && o.importFiles({
|
|
43
43
|
files: e
|
|
44
44
|
});
|
|
45
|
-
}).catch((e) =>
|
|
45
|
+
}).catch((e) => l.error = e) : (n = f()) == null || n.lsDriver.showOpenSingleFileDialog({
|
|
46
46
|
title: "Select file to import",
|
|
47
47
|
filters: r
|
|
48
48
|
}).then(({ file: e }) => {
|
|
49
49
|
e && o.importFiles({
|
|
50
50
|
files: [e]
|
|
51
51
|
});
|
|
52
|
-
}).catch((e) =>
|
|
52
|
+
}).catch((e) => l.error = e);
|
|
53
53
|
};
|
|
54
|
-
return (r, t) => (
|
|
55
|
-
class:
|
|
54
|
+
return (r, t) => (c(), a("div", {
|
|
55
|
+
class: v(m(h).local),
|
|
56
56
|
onDrop: k,
|
|
57
57
|
onDragover: t[0] || (t[0] = S(() => {
|
|
58
58
|
}, ["prevent"])),
|
|
59
59
|
onClick: y
|
|
60
60
|
}, [
|
|
61
|
-
C(
|
|
62
|
-
N("span", null,
|
|
63
|
-
|
|
61
|
+
C(m(T), { name: "cloud-upload" }),
|
|
62
|
+
N("span", null, p(x.value), 1),
|
|
63
|
+
s.extensions ? (c(), a("span", {
|
|
64
64
|
key: 0,
|
|
65
|
-
class:
|
|
66
|
-
}, "Supported formats: " +
|
|
67
|
-
|
|
65
|
+
class: v(m(h).supported)
|
|
66
|
+
}, "Supported formats: " + p(s.extensions.join(", ")), 3)) : g("", !0),
|
|
67
|
+
l.error ? (c(), a("span", E, p(l.error), 1)) : g("", !0)
|
|
68
68
|
], 34));
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
71
|
export {
|
|
72
|
-
|
|
72
|
+
A as default
|
|
73
73
|
};
|
|
74
74
|
//# sourceMappingURL=Local.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Local.vue.js","sources":["../../../src/components/PlFileDialog/Local.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport style from './pl-file-dialog.module.scss';\nimport type { ImportedFiles } from '../../types';\nimport { PlIcon24 } from '../PlIcon24';\nimport { computed, reactive } from 'vue';\nimport { getRawPlatformaInstance, type OpenDialogFilter } from '@platforma-sdk/model';\nimport { normalizeExtensions } from './utils';\n\nconst props = defineProps<{\n importFiles: (value: ImportedFiles) => void;\n multi?: boolean;\n extensions?: string[];\n}>();\n\nconst data = reactive({\n error: undefined as unknown,\n});\n\nconst label = computed(() => (props.multi ? 'Drag & Drop files here or click to add' : 'Drag & Drop file here or click to add'));\n\nconst onDrop = async (ev: DragEvent) => {\n const fileToImportHandle = getRawPlatformaInstance()?.lsDriver?.fileToImportHandle;\n\n if (!fileToImportHandle) {\n return console.error('API getPlatformaRawInstance().lsDriver.fileToImportHandle is not available');\n }\n\n const extensions = normalizeExtensions(props.extensions);\n\n const files = await Promise.all(\n [...(ev.dataTransfer?.files ?? [])]\n .filter((f) => !!f)\n .filter((f) => (extensions ? extensions.some((ext) => f.name.endsWith(ext)) : true))\n .map((file) => {\n return fileToImportHandle(file);\n }),\n );\n\n if (files.length) {\n props.importFiles({\n files,\n });\n }\n};\n\nconst openNativeDialog = async () => {\n const filters: OpenDialogFilter[] = props.extensions\n ? [\n {\n name: 'All Files',\n extensions: [...props.extensions],\n },\n ]\n : [];\n\n if (props.multi) {\n getRawPlatformaInstance()?.lsDriver\n .showOpenMultipleFilesDialog({\n title: 'Select files to import',\n filters,\n })\n .then(({ files }) => {\n if (files) {\n props.importFiles({\n files,\n });\n }\n })\n .catch((err) => (data.error = err));\n } else {\n getRawPlatformaInstance()?.lsDriver\n .showOpenSingleFileDialog({\n title: 'Select file to import',\n filters,\n })\n .then(({ file }) => {\n if (file) {\n props.importFiles({\n files: [file],\n });\n }\n })\n .catch((err) => (data.error = err));\n }\n};\n</script>\n\n<template>\n <div :class=\"style.local\" @drop=\"onDrop\" @dragover.prevent @click=\"openNativeDialog\">\n <PlIcon24 name=\"cloud-upload\" />\n <span>{{ label }}</span>\n <span v-if=\"extensions\" :class=\"style.supported\">Supported formats: {{ extensions.join(', ') }}</span>\n <span v-if=\"data.error\" class=\"alert-error\">{{ data.error }}</span>\n </div>\n</template>\n"],"names":["props","__props","data","reactive","label","computed","onDrop","ev","fileToImportHandle","_b","_a","getRawPlatformaInstance","extensions","normalizeExtensions","files","_c","f","ext","file","openNativeDialog","filters","err"],"mappings":";;;;;;;;;;;;;;;;AAQA,UAAMA,IAAQC,GAMRC,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR,GAEKC,IAAQC,EAAS,MAAOL,EAAM,QAAQ,2CAA2C,uCAAwC,GAEzHM,IAAS,OAAOC,MAAkB;;AACtC,YAAMC,KAAqBC,KAAAC,IAAAC,QAAA,gBAAAD,EAA2B,aAA3B,gBAAAD,EAAqC;AAEhE,UAAI,CAACD;AACH,eAAO,QAAQ,MAAM,4EAA4E;AAGnG,YAAMI,IAAaC,EAAoBb,EAAM,UAAU,GAEjDc,IAAQ,MAAM,QAAQ;AAAA,QAC1B,CAAC,KAAIC,IAAAR,EAAG,iBAAH,gBAAAQ,EAAiB,UAAS,CAAA,CAAG,EAC/B,OAAO,CAACC,MAAM,CAAC,CAACA,CAAC,EACjB,OAAO,CAACA,MAAOJ,IAAaA,EAAW,KAAK,CAACK,MAAQD,EAAE,KAAK,SAASC,CAAG,CAAC,IAAI,EAAK,EAClF,IAAI,CAACC,MACGV,EAAmBU,CAAI,CAC/B;AAAA,MAAA;AAGL,MAAIJ,EAAM,UACRd,EAAM,YAAY;AAAA,QAChB,OAAAc;AAAA,MAAA,CACD;AAAA,IAEL,GAEMK,IAAmB,YAAY;;AACnC,YAAMC,IAA8BpB,EAAM,aACtC;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,YAAY,CAAC,GAAGA,EAAM,UAAU;AAAA,QAAA;AAAA,MAClC,IAEF,CAAA;AAEJ,MAAIA,EAAM,SACRU,IAAAC,EAAA,MAAA,QAAAD,EAA2B,SACxB,4BAA4B;AAAA,QAC3B,OAAO;AAAA,QACP,SAAAU;AAAA,MAAA,GAED,KAAK,CAAC,EAAE,OAAAN,QAAY;AACnB,QAAIA,KACFd,EAAM,YAAY;AAAA,UAChB,OAAAc;AAAA,QAAA,CACD;AAAA,MAEL,GACC,MAAM,CAACO,MAASnB,EAAK,QAAQmB,MAEhCZ,IAAAE,EAAA,MAAA,QAAAF,EAA2B,SACxB,yBAAyB;AAAA,QACxB,OAAO;AAAA,QACP,SAAAW;AAAA,MAAA,GAED,KAAK,CAAC,EAAE,MAAAF,QAAW;AAClB,QAAIA,KACFlB,EAAM,YAAY;AAAA,UAChB,OAAO,CAACkB,CAAI;AAAA,QAAA,CACb;AAAA,MAEL,GACC,MAAM,CAACG,MAASnB,EAAK,QAAQmB;AAAA,IAEpC
|
|
1
|
+
{"version":3,"file":"Local.vue.js","sources":["../../../src/components/PlFileDialog/Local.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport style from './pl-file-dialog.module.scss';\nimport type { ImportedFiles } from '../../types';\nimport { PlIcon24 } from '../PlIcon24';\nimport { computed, reactive } from 'vue';\nimport { getRawPlatformaInstance, type OpenDialogFilter } from '@platforma-sdk/model';\nimport { normalizeExtensions } from './utils';\n\nconst props = defineProps<{\n importFiles: (value: ImportedFiles) => void;\n multi?: boolean;\n extensions?: string[];\n}>();\n\nconst data = reactive({\n error: undefined as unknown,\n});\n\nconst label = computed(() => (props.multi ? 'Drag & Drop files here or click to add' : 'Drag & Drop file here or click to add'));\n\nconst onDrop = async (ev: DragEvent) => {\n const fileToImportHandle = getRawPlatformaInstance()?.lsDriver?.fileToImportHandle;\n\n if (!fileToImportHandle) {\n return console.error('API getPlatformaRawInstance().lsDriver.fileToImportHandle is not available');\n }\n\n const extensions = normalizeExtensions(props.extensions);\n\n const files = await Promise.all(\n [...(ev.dataTransfer?.files ?? [])]\n .filter((f) => !!f)\n .filter((f) => (extensions ? extensions.some((ext) => f.name.endsWith(ext)) : true))\n .map((file) => {\n return fileToImportHandle(file);\n }),\n );\n\n if (files.length) {\n props.importFiles({\n files,\n });\n }\n};\n\nconst openNativeDialog = async () => {\n const filters: OpenDialogFilter[] = props.extensions\n ? [\n {\n name: 'All Files',\n extensions: [...props.extensions],\n },\n ]\n : [];\n\n if (props.multi) {\n getRawPlatformaInstance()?.lsDriver\n .showOpenMultipleFilesDialog({\n title: 'Select files to import',\n filters,\n })\n .then(({ files }) => {\n if (files) {\n props.importFiles({\n files,\n });\n }\n })\n .catch((err) => (data.error = err));\n } else {\n getRawPlatformaInstance()?.lsDriver\n .showOpenSingleFileDialog({\n title: 'Select file to import',\n filters,\n })\n .then(({ file }) => {\n if (file) {\n props.importFiles({\n files: [file],\n });\n }\n })\n .catch((err) => (data.error = err));\n }\n};\n</script>\n\n<template>\n <div :class=\"style.local\" @drop=\"onDrop\" @dragover.prevent @click=\"openNativeDialog\">\n <PlIcon24 name=\"cloud-upload\" />\n <span>{{ label }}</span>\n <span v-if=\"extensions\" :class=\"style.supported\">Supported formats: {{ extensions.join(', ') }}</span>\n <span v-if=\"data.error\" class=\"alert-error\">{{ data.error }}</span>\n </div>\n</template>\n"],"names":["props","__props","data","reactive","label","computed","onDrop","ev","fileToImportHandle","_b","_a","getRawPlatformaInstance","extensions","normalizeExtensions","files","_c","f","ext","file","openNativeDialog","filters","err","_createElementBlock","_normalizeClass","_unref","style","_createVNode","PlIcon24","_createElementVNode","_toDisplayString","_openBlock","_hoisted_1"],"mappings":";;;;;;;;;;;;;;;;AAQA,UAAMA,IAAQC,GAMRC,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR,GAEKC,IAAQC,EAAS,MAAOL,EAAM,QAAQ,2CAA2C,uCAAwC,GAEzHM,IAAS,OAAOC,MAAkB;;AACtC,YAAMC,KAAqBC,KAAAC,IAAAC,QAAA,gBAAAD,EAA2B,aAA3B,gBAAAD,EAAqC;AAEhE,UAAI,CAACD;AACH,eAAO,QAAQ,MAAM,4EAA4E;AAGnG,YAAMI,IAAaC,EAAoBb,EAAM,UAAU,GAEjDc,IAAQ,MAAM,QAAQ;AAAA,QAC1B,CAAC,KAAIC,IAAAR,EAAG,iBAAH,gBAAAQ,EAAiB,UAAS,CAAA,CAAG,EAC/B,OAAO,CAACC,MAAM,CAAC,CAACA,CAAC,EACjB,OAAO,CAACA,MAAOJ,IAAaA,EAAW,KAAK,CAACK,MAAQD,EAAE,KAAK,SAASC,CAAG,CAAC,IAAI,EAAK,EAClF,IAAI,CAACC,MACGV,EAAmBU,CAAI,CAC/B;AAAA,MAAA;AAGL,MAAIJ,EAAM,UACRd,EAAM,YAAY;AAAA,QAChB,OAAAc;AAAA,MAAA,CACD;AAAA,IAEL,GAEMK,IAAmB,YAAY;;AACnC,YAAMC,IAA8BpB,EAAM,aACtC;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,YAAY,CAAC,GAAGA,EAAM,UAAU;AAAA,QAAA;AAAA,MAClC,IAEF,CAAA;AAEJ,MAAIA,EAAM,SACRU,IAAAC,EAAA,MAAA,QAAAD,EAA2B,SACxB,4BAA4B;AAAA,QAC3B,OAAO;AAAA,QACP,SAAAU;AAAA,MAAA,GAED,KAAK,CAAC,EAAE,OAAAN,QAAY;AACnB,QAAIA,KACFd,EAAM,YAAY;AAAA,UAChB,OAAAc;AAAA,QAAA,CACD;AAAA,MAEL,GACC,MAAM,CAACO,MAASnB,EAAK,QAAQmB,MAEhCZ,IAAAE,EAAA,MAAA,QAAAF,EAA2B,SACxB,yBAAyB;AAAA,QACxB,OAAO;AAAA,QACP,SAAAW;AAAA,MAAA,GAED,KAAK,CAAC,EAAE,MAAAF,QAAW;AAClB,QAAIA,KACFlB,EAAM,YAAY;AAAA,UAChB,OAAO,CAACkB,CAAI;AAAA,QAAA,CACb;AAAA,MAEL,GACC,MAAM,CAACG,MAASnB,EAAK,QAAQmB;AAAA,IAEpC;2BAIEC,EAKM,OAAA;AAAA,MALA,OAAKC,EAAEC,EAAAC,CAAA,EAAM,KAAK;AAAA,MAAG,QAAAnB;AAAA,MAAe,8BAAD,MAAA;AAAA,MAAA,GAAiB,CAAA,SAAA,CAAA;AAAA,MAAE,SAAOa;AAAA,IAAA;MACjEO,EAAgCF,EAAAG,CAAA,GAAA,EAAtB,MAAK,gBAAc;AAAA,MAC7BC,EAAwB,gBAAfxB,EAAA,KAAK,GAAA,CAAA;AAAA,MACFH,EAAA,mBAAZqB,EAAsG,QAAA;AAAA;QAA7E,OAAKC,EAAEC,EAAAC,CAAA,EAAM,SAAS;AAAA,MAAA,GAAE,wBAAmBI,EAAG5B,EAAA,WAAW,KAAI,IAAA,CAAA,GAAA,CAAA;MAC1EC,EAAK,SAAjB4B,EAAA,GAAAR,EAAmE,QAAnES,GAAmEF,EAApB3B,EAAK,KAAK,GAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as _, ref as B, computed as S, useTemplateRef as b, createBlock as u, openBlock as d, unref as l, withModifiers as p, normalizeClass as F, createSlots as O, withCtx as i, createElementVNode as R, createCommentVNode as y, createVNode as f, mergeProps as k, createTextVNode as c, toDisplayString as w } from "vue";
|
|
2
2
|
import I from "./pl-file-dialog.module.scss.js";
|
|
3
3
|
import { notEmpty as N } from "@milaboratories/helpers";
|
|
4
4
|
import T from "../PlDialogModal/PlDialogModal.vue.js";
|
|
@@ -7,7 +7,7 @@ import D from "../PlBtnGhost/PlBtnGhost.vue.js";
|
|
|
7
7
|
import E from "../PlBtnGroup/PlBtnGroup.vue.js";
|
|
8
8
|
import P from "./Remote.vue.js";
|
|
9
9
|
import U from "./Local.vue.js";
|
|
10
|
-
const j = { style: { margin: "0 24px" } }, Q = /* @__PURE__ */
|
|
10
|
+
const j = { style: { margin: "0 24px" } }, Q = /* @__PURE__ */ _({
|
|
11
11
|
__name: "PlFileDialog",
|
|
12
12
|
props: {
|
|
13
13
|
modelValue: { type: Boolean },
|
|
@@ -18,8 +18,8 @@ const j = { style: { margin: "0 24px" } }, Q = /* @__PURE__ */ B({
|
|
|
18
18
|
closeOnOutsideClick: { type: Boolean, default: !0 }
|
|
19
19
|
},
|
|
20
20
|
emits: ["update:modelValue", "import:files"],
|
|
21
|
-
setup(
|
|
22
|
-
const
|
|
21
|
+
setup(m, { emit: V }) {
|
|
22
|
+
const n = V, C = m, o = B("local"), g = S(() => C.multi ? "Select Files to Import" : "Select File to Import"), $ = [
|
|
23
23
|
{
|
|
24
24
|
label: "My Computer",
|
|
25
25
|
value: "local"
|
|
@@ -28,67 +28,67 @@ const j = { style: { margin: "0 24px" } }, Q = /* @__PURE__ */ B({
|
|
|
28
28
|
label: "Remote",
|
|
29
29
|
value: "remote"
|
|
30
30
|
}
|
|
31
|
-
],
|
|
32
|
-
var
|
|
33
|
-
(
|
|
34
|
-
},
|
|
35
|
-
|
|
31
|
+
], a = () => n("update:modelValue", !1), r = b("remote"), v = () => {
|
|
32
|
+
var t, e;
|
|
33
|
+
(t = r.value) != null && t.isReady && (n("import:files", N((e = r.value) == null ? void 0 : e.getFilesToImport())), a());
|
|
34
|
+
}, x = (t) => {
|
|
35
|
+
n("import:files", t), a();
|
|
36
36
|
};
|
|
37
|
-
return (
|
|
37
|
+
return (t, e) => (d(), u(l(T), {
|
|
38
38
|
"no-content-gutters": !0,
|
|
39
|
-
"close-on-outside-click":
|
|
40
|
-
class:
|
|
41
|
-
"model-value":
|
|
39
|
+
"close-on-outside-click": m.closeOnOutsideClick,
|
|
40
|
+
class: F(["pl-dialog-modal", l(I).component]),
|
|
41
|
+
"model-value": m.modelValue,
|
|
42
42
|
width: "688px",
|
|
43
43
|
height: "720px",
|
|
44
|
-
"onUpdate:modelValue":
|
|
44
|
+
"onUpdate:modelValue": a,
|
|
45
45
|
onClick: e[1] || (e[1] = p(() => {
|
|
46
46
|
}, ["stop"]))
|
|
47
|
-
},
|
|
47
|
+
}, O({
|
|
48
48
|
title: i(() => [
|
|
49
|
-
|
|
49
|
+
c(w(m.title ?? g.value), 1)
|
|
50
50
|
]),
|
|
51
51
|
default: i(() => [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
modelValue:
|
|
55
|
-
"onUpdate:modelValue": e[0] || (e[0] = (s) =>
|
|
56
|
-
options:
|
|
52
|
+
R("div", j, [
|
|
53
|
+
f(l(E), {
|
|
54
|
+
modelValue: o.value,
|
|
55
|
+
"onUpdate:modelValue": e[0] || (e[0] = (s) => o.value = s),
|
|
56
|
+
options: $
|
|
57
57
|
}, null, 8, ["modelValue"])
|
|
58
58
|
]),
|
|
59
|
-
|
|
59
|
+
o.value === "remote" ? (d(), u(P, k({
|
|
60
60
|
key: 0,
|
|
61
61
|
ref: "remote"
|
|
62
|
-
},
|
|
63
|
-
|
|
62
|
+
}, t.$props, { submit: v }), null, 16)) : y("", !0),
|
|
63
|
+
o.value === "local" ? (d(), u(U, k({
|
|
64
64
|
key: 1,
|
|
65
|
-
"import-files":
|
|
66
|
-
},
|
|
65
|
+
"import-files": x
|
|
66
|
+
}, t.$props), null, 16)) : y("", !0)
|
|
67
67
|
]),
|
|
68
68
|
_: 2
|
|
69
69
|
}, [
|
|
70
|
-
|
|
70
|
+
o.value === "remote" ? {
|
|
71
71
|
name: "actions",
|
|
72
72
|
fn: i(() => {
|
|
73
73
|
var s;
|
|
74
74
|
return [
|
|
75
|
-
|
|
75
|
+
f(l(M), {
|
|
76
76
|
style: { "min-width": "160px" },
|
|
77
|
-
disabled: !((s =
|
|
78
|
-
onClick: p(
|
|
77
|
+
disabled: !((s = r.value) != null && s.isReady),
|
|
78
|
+
onClick: p(v, ["stop"])
|
|
79
79
|
}, {
|
|
80
|
-
default: i(() => e[2] || (e[2] = [
|
|
81
|
-
|
|
82
|
-
])),
|
|
80
|
+
default: i(() => [...e[2] || (e[2] = [
|
|
81
|
+
c("Import", -1)
|
|
82
|
+
])]),
|
|
83
83
|
_: 1
|
|
84
84
|
}, 8, ["disabled"]),
|
|
85
|
-
|
|
85
|
+
f(l(D), {
|
|
86
86
|
"justify-center": !1,
|
|
87
|
-
onClick: p(
|
|
87
|
+
onClick: p(a, ["stop"])
|
|
88
88
|
}, {
|
|
89
|
-
default: i(() => e[3] || (e[3] = [
|
|
90
|
-
|
|
91
|
-
])),
|
|
89
|
+
default: i(() => [...e[3] || (e[3] = [
|
|
90
|
+
c("Cancel", -1)
|
|
91
|
+
])]),
|
|
92
92
|
_: 1
|
|
93
93
|
})
|
|
94
94
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlFileDialog.vue.js","sources":["../../../src/components/PlFileDialog/PlFileDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport style from './pl-file-dialog.module.scss';\nimport { computed, ref, useTemplateRef } from 'vue';\nimport { notEmpty } from '@milaboratories/helpers';\nimport type { ImportedFiles, SimpleOption } from '../../types';\nimport { PlDialogModal } from '../PlDialogModal';\nimport { PlBtnPrimary } from '../PlBtnPrimary';\nimport { PlBtnGhost } from '../PlBtnGhost';\nimport { PlBtnGroup } from '../PlBtnGroup';\nimport Remote from './Remote.vue';\nimport Local from './Local.vue';\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void;\n (e: 'import:files', value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Controls the visibility of the modal.\n *\n * When `true`, the modal is open. When `false`, the modal is closed.\n */\n modelValue: boolean;\n /**\n * Specifies the file extensions that are allowed for selection.\n *\n * Provide an array of strings representing file extensions (leading dot can be omitted)\n * If not specified, all file types are allowed.\n */\n extensions?: string[];\n /**\n * Enables the selection of multiple files.\n *\n * When `true`, the user can select multiple files.\n * When `false` or not specified, only a single file can be selected.\n */\n multi?: boolean;\n /**\n * The custom title of the dialog.\n */\n title?: string;\n /**\n * Automatically selects the initial storage option.\n * When `true`, the default storage is pre-selected for the user (default: `true`)\n */\n autoSelectStorage?: boolean;\n /**\n * If `true`, the modal window closes when clicking outside the modal area (default: `true`)\n */\n closeOnOutsideClick?: boolean;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n closeOnOutsideClick: true,\n },\n);\n\nconst mode = ref<'local' | 'remote'>('local');\n\nconst defaultTitle = computed(() => (props.multi ? 'Select Files to Import' : 'Select File to Import'));\n\nconst modeOptions = [\n {\n label: 'My Computer',\n value: 'local',\n },\n {\n label: 'Remote',\n value: 'remote',\n },\n] satisfies SimpleOption[];\n\nconst closeModal = () => emit('update:modelValue', false);\n\nconst remoteRef = useTemplateRef('remote');\n\nconst submit = () => {\n if (remoteRef.value?.isReady) {\n emit('import:files', notEmpty(remoteRef.value?.getFilesToImport()));\n closeModal();\n }\n};\n\nconst importFiles = (importedFiles: ImportedFiles) => {\n emit('import:files', importedFiles);\n closeModal();\n};\n</script>\n\n<template>\n <PlDialogModal\n :no-content-gutters=\"true\"\n :close-on-outside-click=\"closeOnOutsideClick\"\n class=\"pl-dialog-modal\"\n :class=\"style.component\"\n :model-value=\"modelValue\"\n width=\"688px\"\n height=\"720px\"\n @update:model-value=\"closeModal\"\n @click.stop\n >\n <template #title>{{ title ?? defaultTitle }}</template>\n <div style=\"margin: 0 24px\">\n <PlBtnGroup v-model=\"mode\" :options=\"modeOptions\" />\n </div>\n <Remote v-if=\"mode === 'remote'\" ref=\"remote\" v-bind=\"$props\" :submit=\"submit\" />\n <Local v-if=\"mode === 'local'\" :import-files=\"importFiles\" v-bind=\"$props\" />\n <template v-if=\"mode === 'remote'\" #actions>\n <PlBtnPrimary style=\"min-width: 160px\" :disabled=\"!remoteRef?.isReady\" @click.stop=\"submit\">Import</PlBtnPrimary>\n <PlBtnGhost :justify-center=\"false\" @click.stop=\"closeModal\">Cancel</PlBtnGhost>\n </template>\n </PlDialogModal>\n</template>\n"],"names":["emit","__emit","props","__props","mode","ref","defaultTitle","computed","modeOptions","closeModal","remoteRef","useTemplateRef","submit","_a","notEmpty","_b","importFiles","importedFiles"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,UAAMA,IAAOC,GAKPC,IAAQC,GA4CRC,IAAOC,EAAwB,OAAO,GAEtCC,IAAeC,EAAS,MAAOL,EAAM,QAAQ,2BAA2B,uBAAwB,GAEhGM,IAAc;AAAA,MAClB;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IACT,GAGIC,IAAa,MAAMT,EAAK,qBAAqB,EAAK,GAElDU,IAAYC,EAAe,QAAQ,GAEnCC,IAAS,MAAM;;AACnB,OAAIC,IAAAH,EAAU,UAAV,QAAAG,EAAiB,YACnBb,EAAK,gBAAgBc,GAASC,IAAAL,EAAU,UAAV,gBAAAK,EAAiB,kBAAkB,CAAC,GAClEN,EAAA;AAAA,IAEJ,GAEMO,IAAc,CAACC,MAAiC;AACpD,MAAAjB,EAAK,gBAAgBiB,CAAa,GAClCR,EAAA;AAAA,IACF
|
|
1
|
+
{"version":3,"file":"PlFileDialog.vue.js","sources":["../../../src/components/PlFileDialog/PlFileDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport style from './pl-file-dialog.module.scss';\nimport { computed, ref, useTemplateRef } from 'vue';\nimport { notEmpty } from '@milaboratories/helpers';\nimport type { ImportedFiles, SimpleOption } from '../../types';\nimport { PlDialogModal } from '../PlDialogModal';\nimport { PlBtnPrimary } from '../PlBtnPrimary';\nimport { PlBtnGhost } from '../PlBtnGhost';\nimport { PlBtnGroup } from '../PlBtnGroup';\nimport Remote from './Remote.vue';\nimport Local from './Local.vue';\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: boolean): void;\n (e: 'import:files', value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Controls the visibility of the modal.\n *\n * When `true`, the modal is open. When `false`, the modal is closed.\n */\n modelValue: boolean;\n /**\n * Specifies the file extensions that are allowed for selection.\n *\n * Provide an array of strings representing file extensions (leading dot can be omitted)\n * If not specified, all file types are allowed.\n */\n extensions?: string[];\n /**\n * Enables the selection of multiple files.\n *\n * When `true`, the user can select multiple files.\n * When `false` or not specified, only a single file can be selected.\n */\n multi?: boolean;\n /**\n * The custom title of the dialog.\n */\n title?: string;\n /**\n * Automatically selects the initial storage option.\n * When `true`, the default storage is pre-selected for the user (default: `true`)\n */\n autoSelectStorage?: boolean;\n /**\n * If `true`, the modal window closes when clicking outside the modal area (default: `true`)\n */\n closeOnOutsideClick?: boolean;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n closeOnOutsideClick: true,\n },\n);\n\nconst mode = ref<'local' | 'remote'>('local');\n\nconst defaultTitle = computed(() => (props.multi ? 'Select Files to Import' : 'Select File to Import'));\n\nconst modeOptions = [\n {\n label: 'My Computer',\n value: 'local',\n },\n {\n label: 'Remote',\n value: 'remote',\n },\n] satisfies SimpleOption[];\n\nconst closeModal = () => emit('update:modelValue', false);\n\nconst remoteRef = useTemplateRef('remote');\n\nconst submit = () => {\n if (remoteRef.value?.isReady) {\n emit('import:files', notEmpty(remoteRef.value?.getFilesToImport()));\n closeModal();\n }\n};\n\nconst importFiles = (importedFiles: ImportedFiles) => {\n emit('import:files', importedFiles);\n closeModal();\n};\n</script>\n\n<template>\n <PlDialogModal\n :no-content-gutters=\"true\"\n :close-on-outside-click=\"closeOnOutsideClick\"\n class=\"pl-dialog-modal\"\n :class=\"style.component\"\n :model-value=\"modelValue\"\n width=\"688px\"\n height=\"720px\"\n @update:model-value=\"closeModal\"\n @click.stop\n >\n <template #title>{{ title ?? defaultTitle }}</template>\n <div style=\"margin: 0 24px\">\n <PlBtnGroup v-model=\"mode\" :options=\"modeOptions\" />\n </div>\n <Remote v-if=\"mode === 'remote'\" ref=\"remote\" v-bind=\"$props\" :submit=\"submit\" />\n <Local v-if=\"mode === 'local'\" :import-files=\"importFiles\" v-bind=\"$props\" />\n <template v-if=\"mode === 'remote'\" #actions>\n <PlBtnPrimary style=\"min-width: 160px\" :disabled=\"!remoteRef?.isReady\" @click.stop=\"submit\">Import</PlBtnPrimary>\n <PlBtnGhost :justify-center=\"false\" @click.stop=\"closeModal\">Cancel</PlBtnGhost>\n </template>\n </PlDialogModal>\n</template>\n"],"names":["emit","__emit","props","__props","mode","ref","defaultTitle","computed","modeOptions","closeModal","remoteRef","useTemplateRef","submit","_a","notEmpty","_b","importFiles","importedFiles","_createBlock","_unref","PlDialogModal","_normalizeClass","style","_createTextVNode","_toDisplayString","_createElementVNode","_hoisted_1","_createVNode","PlBtnGroup","$event","_openBlock","Remote","_mergeProps","$props","Local","PlBtnPrimary","_cache","PlBtnGhost"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,UAAMA,IAAOC,GAKPC,IAAQC,GA4CRC,IAAOC,EAAwB,OAAO,GAEtCC,IAAeC,EAAS,MAAOL,EAAM,QAAQ,2BAA2B,uBAAwB,GAEhGM,IAAc;AAAA,MAClB;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IACT,GAGIC,IAAa,MAAMT,EAAK,qBAAqB,EAAK,GAElDU,IAAYC,EAAe,QAAQ,GAEnCC,IAAS,MAAM;;AACnB,OAAIC,IAAAH,EAAU,UAAV,QAAAG,EAAiB,YACnBb,EAAK,gBAAgBc,GAASC,IAAAL,EAAU,UAAV,gBAAAK,EAAiB,kBAAkB,CAAC,GAClEN,EAAA;AAAA,IAEJ,GAEMO,IAAc,CAACC,MAAiC;AACpD,MAAAjB,EAAK,gBAAgBiB,CAAa,GAClCR,EAAA;AAAA,IACF;2BAIES,EAqBgBC,EAAAC,CAAA,GAAA;AAAA,MApBb,sBAAoB;AAAA,MACpB,0BAAwBjB,EAAA;AAAA,MACzB,OAAKkB,EAAA,CAAC,mBACEF,EAAAG,CAAA,EAAM,SAAS,CAAA;AAAA,MACtB,eAAanB,EAAA;AAAA,MACd,OAAM;AAAA,MACN,QAAO;AAAA,MACN,uBAAoBM;AAAA,MACpB,2BAAD,MAAA;AAAA,MAAA,GAAW,CAAA,MAAA,CAAA;AAAA,IAAA;MAEA,SAAM,MAA2B;AAAA,QAAxBc,EAAAC,EAAArB,EAAA,SAASG,EAAA,KAAY,GAAA,CAAA;AAAA,MAAA;iBACzC,MAEM;AAAA,QAFNmB,EAEM,OAFNC,GAEM;AAAA,UADJC,EAAoDR,EAAAS,CAAA,GAAA;AAAA,wBAA/BxB,EAAA;AAAA,0DAAAA,EAAI,QAAAyB;AAAA,YAAG,SAASrB;AAAA,UAAA;;QAEzBJ,EAAA,UAAI,YAAlB0B,KAAAZ,EAAiFa,GAAjFC,EAAiF;AAAA;UAAhD,KAAI;AAAA,QAAA,GAAiBC,EAAAA,QAAM,EAAG,QAAArB,GAAc,GAAA,MAAA,EAAA;QAChER,EAAA,UAAI,WAAjB0B,KAAAZ,EAA6EgB,GAA7EF,EAA6E;AAAA;UAA7C,gBAAchB;AAAA,QAAA,GAAqBiB,EAAAA,MAAM,GAAA,MAAA,EAAA;;;;MACzD7B,EAAA,UAAI;cAAgB;AAAA,cAClC,MAAA;;AAAiH;AAAA,YAAjHuB,EAAiHR,EAAAgB,CAAA,GAAA;AAAA,cAAnG,OAAA,EAAA,aAAA,QAAA;AAAA,cAA0B,UAAQ,GAAGtB,IAAAH,EAAA,UAAA,QAAAG,EAAW;AAAA,cAAU,WAAYD,GAAM,CAAA,MAAA,CAAA;AAAA,YAAA;yBAAE,MAAM,CAAA,GAAAwB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAN,UAAM,EAAA;AAAA,cAAA;;;YAClGT,EAAgFR,EAAAkB,CAAA,GAAA;AAAA,cAAnE,kBAAgB;AAAA,cAAQ,WAAY5B,GAAU,CAAA,MAAA,CAAA;AAAA,YAAA;yBAAE,MAAM,CAAA,GAAA2B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAAN,UAAM,EAAA;AAAA,cAAA;;;;;;;;;;"}
|
|
@@ -165,9 +165,9 @@ const ce = ["title", "onClick"], de = {
|
|
|
165
165
|
f(se)
|
|
166
166
|
], 2)
|
|
167
167
|
], 2),
|
|
168
|
-
t.currentLoadingPath !== void 0 ? (i(), d("div", de, l[2] || (l[2] = [
|
|
168
|
+
t.currentLoadingPath !== void 0 ? (i(), d("div", de, [...l[2] || (l[2] = [
|
|
169
169
|
c("i", { class: "mask-24 mask-loading loader-icon" }, null, -1)
|
|
170
|
-
]))) : t.storageEntry ? t.error ? (i(), d("div", {
|
|
170
|
+
])])) : t.storageEntry ? t.error ? (i(), d("div", {
|
|
171
171
|
key: 2,
|
|
172
172
|
class: n(s(r)["ls-error"])
|
|
173
173
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Remote.vue.js","sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from '../../composition/useEventListener';\nimport type { ImportedFiles } from '../../types';\nimport { between, notEmpty, tapIf } from '@milaboratories/helpers';\nimport { getRawPlatformaInstance, type StorageHandle } from '@platforma-sdk/model';\nimport { computed, onMounted, reactive, toRef, watch } from 'vue';\nimport { PlDropdown } from '../PlDropdown';\nimport { PlIcon16 } from '../PlIcon16';\nimport Shortcuts from './Shortcuts.vue';\nimport { PlMaskIcon16 } from '../PlMaskIcon16';\nimport { PlSearchField } from '../PlSearchField';\nimport style from './pl-file-dialog.module.scss';\nimport { defaultData, useVisibleItems, vTextOverflown } from './remote';\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from './utils';\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: 'update:modelValue', value: boolean): void;\n (e: 'import:files', value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = '';\n data.error = '';\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance().lsDriver\n .listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === 'dir',\n canBeSelected: item.type === 'file' && (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === 'file' ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() => data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir));\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn('platforma API is not found');\n return;\n }\n getRawPlatformaInstance().lsDriver\n .getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter((it) => it.name !== 'local' && !it.name.startsWith('local_disk_'));\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, 'storageEntry'),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? '';\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, 'keydown', (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === 'KeyA') {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === 'Period') {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === 'Enter') {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n</script>\n\n<template>\n <div :class=\"style.remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown v-model=\"data.storageEntry\" label=\"Select storage\" :options=\"data.storageOptions\" />\n </div>\n <div>\n <PlSearchField v-model=\"data.search\" label=\"Search in folder\" clearable />\n </div>\n </div>\n <div :class=\"style['ls-container']\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div :title=\"s.path\" @click=\"setDirPath(s.path)\">{{ s.name }}</div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span>Selected: {{ selectedFiles.length }}</span>\n <Shortcuts />\n </div>\n </div>\n <div v-if=\"data.currentLoadingPath !== undefined\" class=\"ls-loader\">\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div v-else-if=\"!data.storageEntry\" :class=\"style['ls-empty']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">Select storage to preview</div>\n </div>\n <div v-else-if=\"data.error\" :class=\"style['ls-error']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div v-if=\"file.isDir\" :class=\"style.isDir\" @click=\"setDirPath(file.path)\">\n <PlIcon16 name=\"chevron-right\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n <div\n v-else\n :class=\"{ [style.canBeSelected]: file.canBeSelected, [style.selected]: file.selected }\"\n @click.stop=\"(ev) => selectFile(ev, file)\"\n >\n <PlMaskIcon16 name=\"box\" :class=\"style.isFile\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n"],"names":["isCtrlOrMeta","ev","props","__props","data","reactive","defaultData","resetData","extensions","computed","normalizeExtensions","visibleItems","useVisibleItems","lookup","_a","query","storageHandle","dirPath","getRawPlatformaInstance","res","notEmpty","item","ext","a","b","it","id","err","load","modelValue","breadcrumbs","getFilePathBreadcrumbs","selectedFiles","f","isReady","getFilesToImport","setDirPath","selectFile","file","shiftKey","ctrlOrMetaKey","lastSelected","items","between","changeAll","selected","selectAll","deselectAll","loadAvailableStorages","storageEntries","tapIf","entry","watch","toRef","isOpen","useEventListener","__expose","onMounted"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Remote.vue.js","sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from '../../composition/useEventListener';\nimport type { ImportedFiles } from '../../types';\nimport { between, notEmpty, tapIf } from '@milaboratories/helpers';\nimport { getRawPlatformaInstance, type StorageHandle } from '@platforma-sdk/model';\nimport { computed, onMounted, reactive, toRef, watch } from 'vue';\nimport { PlDropdown } from '../PlDropdown';\nimport { PlIcon16 } from '../PlIcon16';\nimport Shortcuts from './Shortcuts.vue';\nimport { PlMaskIcon16 } from '../PlMaskIcon16';\nimport { PlSearchField } from '../PlSearchField';\nimport style from './pl-file-dialog.module.scss';\nimport { defaultData, useVisibleItems, vTextOverflown } from './remote';\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from './utils';\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: 'update:modelValue', value: boolean): void;\n (e: 'import:files', value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = '';\n data.error = '';\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance().lsDriver\n .listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === 'dir',\n canBeSelected: item.type === 'file' && (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === 'file' ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() => data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir));\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn('platforma API is not found');\n return;\n }\n getRawPlatformaInstance().lsDriver\n .getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter((it) => it.name !== 'local' && !it.name.startsWith('local_disk_'));\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, 'storageEntry'),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? '';\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, 'keydown', (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === 'KeyA') {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === 'Period') {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === 'Enter') {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n</script>\n\n<template>\n <div :class=\"style.remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown v-model=\"data.storageEntry\" label=\"Select storage\" :options=\"data.storageOptions\" />\n </div>\n <div>\n <PlSearchField v-model=\"data.search\" label=\"Search in folder\" clearable />\n </div>\n </div>\n <div :class=\"style['ls-container']\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div :title=\"s.path\" @click=\"setDirPath(s.path)\">{{ s.name }}</div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span>Selected: {{ selectedFiles.length }}</span>\n <Shortcuts />\n </div>\n </div>\n <div v-if=\"data.currentLoadingPath !== undefined\" class=\"ls-loader\">\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div v-else-if=\"!data.storageEntry\" :class=\"style['ls-empty']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">Select storage to preview</div>\n </div>\n <div v-else-if=\"data.error\" :class=\"style['ls-error']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div v-if=\"file.isDir\" :class=\"style.isDir\" @click=\"setDirPath(file.path)\">\n <PlIcon16 name=\"chevron-right\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n <div\n v-else\n :class=\"{ [style.canBeSelected]: file.canBeSelected, [style.selected]: file.selected }\"\n @click.stop=\"(ev) => selectFile(ev, file)\"\n >\n <PlMaskIcon16 name=\"box\" :class=\"style.isFile\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n"],"names":["isCtrlOrMeta","ev","props","__props","data","reactive","defaultData","resetData","extensions","computed","normalizeExtensions","visibleItems","useVisibleItems","lookup","_a","query","storageHandle","dirPath","getRawPlatformaInstance","res","notEmpty","item","ext","a","b","it","id","err","load","modelValue","breadcrumbs","getFilePathBreadcrumbs","selectedFiles","f","isReady","getFilesToImport","setDirPath","selectFile","file","shiftKey","ctrlOrMetaKey","lastSelected","items","between","changeAll","selected","selectAll","deselectAll","loadAvailableStorages","storageEntries","tapIf","entry","watch","toRef","isOpen","useEventListener","__expose","onMounted","_createElementBlock","_normalizeClass","_unref","style","_createElementVNode","_createVNode","PlDropdown","_cache","$event","PlSearchField","_openBlock","_Fragment","_renderList","s","i","_toDisplayString","_hoisted_1","_createBlock","PlIcon16","Shortcuts","_hoisted_2","_createTextVNode","PlMaskIcon16"],"mappings":"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"}
|
|
@@ -14,14 +14,14 @@ const m = /* @__PURE__ */ s({
|
|
|
14
14
|
}, "Shortcuts", 2),
|
|
15
15
|
l("div", {
|
|
16
16
|
class: n([i.$style.row, i.$style.head])
|
|
17
|
-
}, e[0] || (e[0] = [
|
|
17
|
+
}, [...e[0] || (e[0] = [
|
|
18
18
|
l("div", null, null, -1),
|
|
19
19
|
l("div", null, "MacOS", -1),
|
|
20
20
|
l("div", null, "Windows/Linux", -1)
|
|
21
|
-
]), 2),
|
|
21
|
+
])], 2),
|
|
22
22
|
l("div", {
|
|
23
23
|
class: n([i.$style.row, i.$style.body])
|
|
24
|
-
}, e[1] || (e[1] = [
|
|
24
|
+
}, [...e[1] || (e[1] = [
|
|
25
25
|
l("div", null, "Single File", -1),
|
|
26
26
|
l("div", null, "Click the file", -1),
|
|
27
27
|
l("div", null, "Click the file", -1),
|
|
@@ -34,7 +34,7 @@ const m = /* @__PURE__ */ s({
|
|
|
34
34
|
l("div", null, "All files", -1),
|
|
35
35
|
l("div", null, "Press Command (⌘) + A", -1),
|
|
36
36
|
l("div", null, "Press Ctrl + A", -1)
|
|
37
|
-
]), 2)
|
|
37
|
+
])], 2)
|
|
38
38
|
]),
|
|
39
39
|
_: 1
|
|
40
40
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shortcuts.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Shortcuts.vue2.js","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from '../PlTooltip';\n</script>\n\n<template>\n <PlTooltip class=\"info\" position=\"southwest\" max-width=\"420px\">\n <template #tooltip>\n <span :class=\"$style.title\">Shortcuts</span>\n\n <div :class=\"[$style.row, $style.head]\">\n <div/>\n <div>MacOS</div>\n <div>Windows/Linux</div>\n </div>\n\n <div :class=\"[$style.row, $style.body]\">\n <div>Single File</div>\n <div>Click the file</div>\n <div>Click the file</div>\n\n <div>Adjacent multiple files</div>\n <div>Hold Shift, click first and last files</div>\n <div>Hold Shift, click first and last files</div>\n\n <div>Non-adjacent multiple files</div>\n <div>Hold Command (⌘), click each file</div>\n <div>Hold Ctrl, click each file</div>\n\n <div>All files</div>\n <div>Press Command (⌘) + A</div>\n <div>Press Ctrl + A</div>\n </div>\n </template>\n </PlTooltip>\n</template>\n\n<style lang=\"css\" module>\n.title {\n display: inline-block;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n margin-bottom: 10px;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n width: 100%;\n color: #fff;\n column-gap: 1px;\n\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.row > div:nth-child(3n + 1) {\n padding-left: 4px;\n}\n\n.row > div:nth-child(3n) {\n padding-right: 4px;\n}\n\n.head {\n background-color: #110529;\n position: relative;\n}\n\n.head:before {\n position: absolute;\n content: '';\n background-color: #231842;\n width: 12px;\n left: -12px;\n height: 100%;\n}\n\n.head:after {\n position: absolute;\n content: '';\n background-color: #231842;\n width: 12px;\n right: -12px;\n height: 100%;\n}\n\n.head > div {\n padding: 6px 12px;\n background-color: #231842;\n}\n\n.body {\n background-color: #231842;\n}\n\n.body > div {\n padding: 6px 12px;\n background: #110529;\n}\n</style>\n"],"names":["_createBlock","_unref","PlTooltip","_createElementVNode","_normalizeClass","$style"],"mappings":";;;;;2BAKEA,EA4BYC,EAAAC,CAAA,GAAA;AAAA,MA5BD,OAAM;AAAA,MAAO,UAAS;AAAA,MAAY,aAAU;AAAA,IAAA;MAC1C,WACT,MAA4C;AAAA,QAA5CC,EAA4C,QAAA;AAAA,UAArC,OAAKC,EAAEC,EAAAA,OAAO,KAAK;AAAA,QAAA,GAAE,aAAS,CAAA;AAAA,QAErCF,EAIM,OAAA;AAAA,UAJA,UAAQE,EAAAA,OAAO,KAAKA,EAAAA,OAAO,IAAI,CAAA;AAAA,QAAA;UACnCF,EAAM,OAAA,MAAA,MAAA,EAAA;AAAA,UACNA,EAAgB,aAAX,SAAK,EAAA;AAAA,UACVA,EAAwB,aAAnB,iBAAa,EAAA;AAAA,QAAA;QAGpBA,EAgBM,OAAA;AAAA,UAhBA,UAAQE,EAAAA,OAAO,KAAKA,EAAAA,OAAO,IAAI,CAAA;AAAA,QAAA;UACnCF,EAAsB,aAAjB,eAAW,EAAA;AAAA,UAChBA,EAAyB,aAApB,kBAAc,EAAA;AAAA,UACnBA,EAAyB,aAApB,kBAAc,EAAA;AAAA,UAEnBA,EAAkC,aAA7B,2BAAuB,EAAA;AAAA,UAC5BA,EAAiD,aAA5C,0CAAsC,EAAA;AAAA,UAC3CA,EAAiD,aAA5C,0CAAsC,EAAA;AAAA,UAE3CA,EAAsC,aAAjC,+BAA2B,EAAA;AAAA,UAChCA,EAA4C,aAAvC,qCAAiC,EAAA;AAAA,UACtCA,EAAqC,aAAhC,8BAA0B,EAAA;AAAA,UAE/BA,EAAoB,aAAf,aAAS,EAAA;AAAA,UACdA,EAAgC,aAA3B,yBAAqB,EAAA;AAAA,UAC1BA,EAAyB,aAApB,kBAAc,EAAA;AAAA,QAAA;;;;;;"}
|
|
@@ -69,8 +69,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
|
|
|
69
69
|
label: string;
|
|
70
70
|
progress: ImportProgress;
|
|
71
71
|
error: undefined;
|
|
72
|
-
helper: string;
|
|
73
72
|
placeholder: string;
|
|
73
|
+
helper: string;
|
|
74
74
|
extensions: string[];
|
|
75
75
|
cellStyle: boolean;
|
|
76
76
|
fileDialogTitle: string;
|