@milaboratories/uikit 2.10.26 → 2.10.27
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 +47 -48
- package/.turbo/turbo-formatter$colon$check.log +2 -2
- package/.turbo/turbo-linter$colon$check.log +2 -2
- package/.turbo/turbo-types$colon$check.log +1 -1
- package/CHANGELOG.md +6 -0
- package/dist/components/DataTable/TableComponent.vue.js +15 -16
- package/dist/components/DataTable/TableComponent.vue.js.map +1 -1
- package/dist/components/PlAutocomplete/PlAutocomplete.vue.js +33 -33
- package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js +17 -17
- package/dist/components/PlBtnGroup/PlBtnGroup.vue.js +17 -17
- package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.js +12 -12
- package/dist/components/PlChip/PlChip.vue.js +8 -8
- package/dist/components/PlDropdown/PlDropdown.vue.js +27 -27
- package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js +39 -39
- package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +20 -20
- package/dist/components/PlFileDialog/PlFileDialog.vue.d.ts +3 -1
- package/dist/components/PlFileDialog/PlFileDialog.vue.d.ts.map +1 -1
- package/dist/components/PlFileDialog/Remote.vue.d.ts +3 -1
- package/dist/components/PlFileDialog/Remote.vue.d.ts.map +1 -1
- package/dist/components/PlFileDialog/Remote.vue.js +80 -76
- package/dist/components/PlFileDialog/Remote.vue.js.map +1 -1
- package/dist/components/PlFileDialog/Shortcuts.vue.d.ts +4 -1
- package/dist/components/PlFileDialog/Shortcuts.vue.d.ts.map +1 -1
- package/dist/components/PlFileDialog/Shortcuts.vue2.js +18 -14
- package/dist/components/PlFileDialog/Shortcuts.vue2.js.map +1 -1
- package/dist/components/PlFileInput/PlFileInput.vue.js +17 -17
- package/dist/components/PlLogView/PlLogView.vue.js +22 -22
- package/dist/components/PlNumberField/PlNumberField.vue.js +8 -8
- package/dist/components/PlSlideModal/PlPureSlideModal.vue.js +2 -3
- package/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
- package/dist/components/PlTabs/Tab.vue.d.ts +42 -12
- package/dist/components/PlTabs/Tab.vue.d.ts.map +1 -1
- package/dist/components/PlTabs/Tab.vue.js +6 -6
- package/dist/components/PlTextArea/PlTextArea.vue.js +22 -22
- package/dist/components/PlTextField/PlTextField.vue.js +14 -14
- package/dist/components/PlTooltip/PlTooltip.vue.d.ts +30 -3
- package/dist/components/PlTooltip/PlTooltip.vue.d.ts.map +1 -1
- package/dist/components/PlTooltip/PlTooltip.vue.js +7 -110
- package/dist/components/PlTooltip/PlTooltip.vue.js.map +1 -1
- package/dist/components/PlTooltip/PlTooltip.vue2.js +132 -2
- package/dist/components/PlTooltip/PlTooltip.vue2.js.map +1 -1
- package/dist/components/PlTooltip/PlTooltip.vue3.js +26 -0
- package/dist/components/PlTooltip/PlTooltip.vue3.js.map +1 -0
- package/dist/components/Slider.vue.d.ts +1 -1
- package/dist/components/Slider.vue.d.ts.map +1 -1
- package/dist/components/Slider.vue.js +21 -21
- package/dist/components/SliderRange.vue.d.ts +1 -1
- package/dist/components/SliderRange.vue.d.ts.map +1 -1
- package/dist/components/SliderRange.vue.js +31 -31
- package/dist/components/SliderRangeTriple.vue.d.ts +1 -1
- package/dist/components/SliderRangeTriple.vue.d.ts.map +1 -1
- package/dist/components/SliderRangeTriple.vue.js +23 -23
- package/dist/index.js +1 -1
- package/dist/utils/DoubleContour.vue2.js +23 -0
- package/dist/utils/DoubleContour.vue2.js.map +1 -0
- package/package.json +4 -4
- package/src/assets/base.scss +4 -1
- package/src/assets/mixins.scss +1 -2
- package/src/assets/utils.scss +1 -1
- package/src/components/PlFileDialog/Remote.vue +5 -3
- package/src/components/PlFileDialog/Shortcuts.vue +5 -1
- package/src/components/PlTooltip/PlTooltip.vue +227 -32
- package/dist/components/PlTooltip/Beak.vue.d.ts +0 -3
- package/dist/components/PlTooltip/Beak.vue.d.ts.map +0 -1
- package/dist/components/PlTooltip/Beak.vue.js +0 -23
- package/dist/components/PlTooltip/Beak.vue.js.map +0 -1
- package/dist/components/PlTooltip/useTooltipPosition.d.ts +0 -12
- package/dist/components/PlTooltip/useTooltipPosition.d.ts.map +0 -1
- package/dist/components/PlTooltip/useTooltipPosition.js +0 -18
- package/dist/components/PlTooltip/useTooltipPosition.js.map +0 -1
- package/src/components/PlTooltip/Beak.vue +0 -12
- package/src/components/PlTooltip/pl-tooltip.scss +0 -117
- package/src/components/PlTooltip/useTooltipPosition.ts +0 -59
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useEventListener as
|
|
3
|
-
import { notEmpty as
|
|
1
|
+
import { defineComponent as J, reactive as Q, computed as p, watch as V, toRef as X, onMounted as Y, ref as Z, createElementBlock as d, openBlock as i, withModifiers as K, normalizeClass as n, unref as s, createElementVNode as c, createVNode as h, Fragment as g, renderList as L, createBlock as ee, createCommentVNode as te, toDisplayString as v, withDirectives as O, createTextVNode as A } from "vue";
|
|
2
|
+
import { useEventListener as le } from "../../composition/useEventListener.js";
|
|
3
|
+
import { notEmpty as M, between as ae, tapIf as se } from "@milaboratories/helpers";
|
|
4
4
|
import { getRawPlatformaInstance as y } from "@platforma-sdk/model";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
5
|
+
import oe from "../PlDropdown/PlDropdown.vue.js";
|
|
6
|
+
import _ from "../PlIcon16/PlIcon16.vue.js";
|
|
7
|
+
import re from "./Shortcuts.vue.js";
|
|
8
|
+
import ne from "../PlSearchField/PlSearchField.vue.js";
|
|
9
9
|
import r from "./pl-file-dialog.module.scss.js";
|
|
10
|
-
import { defaultData as
|
|
11
|
-
import { normalizeExtensions as
|
|
12
|
-
const
|
|
10
|
+
import { defaultData as R, useVisibleItems as ie, vTextOverflown as H } from "./remote.js";
|
|
11
|
+
import { normalizeExtensions as ce, getFilePathBreadcrumbs as de } from "./utils.js";
|
|
12
|
+
const ue = ["title", "onClick"], me = {
|
|
13
13
|
key: 0,
|
|
14
14
|
class: "ls-loader"
|
|
15
|
-
},
|
|
15
|
+
}, fe = ["onClick"], pe = ["title"], he = ["onClick"], ve = ["title"], Be = /* @__PURE__ */ J({
|
|
16
16
|
__name: "Remote",
|
|
17
17
|
props: {
|
|
18
18
|
modelValue: { type: Boolean },
|
|
@@ -23,64 +23,64 @@ const ce = ["title", "onClick"], de = {
|
|
|
23
23
|
submit: {}
|
|
24
24
|
},
|
|
25
25
|
emits: ["update:modelValue", "import:files"],
|
|
26
|
-
setup(N, { expose:
|
|
27
|
-
const
|
|
26
|
+
setup(N, { expose: T }) {
|
|
27
|
+
const b = (e) => e.ctrlKey || e.metaKey, m = N, t = Q(R()), k = () => {
|
|
28
28
|
t.search = "", t.error = "", t.lastSelected = void 0;
|
|
29
|
-
},
|
|
29
|
+
}, E = p(() => ce(m.extensions)), S = ie(t), $ = p(() => {
|
|
30
30
|
var e;
|
|
31
31
|
return {
|
|
32
|
-
modelValue:
|
|
32
|
+
modelValue: m.modelValue,
|
|
33
33
|
dirPath: t.dirPath,
|
|
34
34
|
storageHandle: (e = t.storageEntry) == null ? void 0 : e.handle
|
|
35
35
|
};
|
|
36
|
-
}),
|
|
36
|
+
}), z = (e, l) => {
|
|
37
37
|
y() && t.currentLoadingPath !== l && (t.currentLoadingPath = l, y().lsDriver.listFiles(e, l).then((a) => {
|
|
38
|
-
l === t.dirPath && (t.items =
|
|
38
|
+
l === t.dirPath && (t.items = M(a).entries.map((o) => ({
|
|
39
39
|
path: o.fullPath,
|
|
40
40
|
name: o.name,
|
|
41
41
|
isDir: o.type === "dir",
|
|
42
|
-
canBeSelected: o.type === "file" && (!
|
|
42
|
+
canBeSelected: o.type === "file" && (!E.value || E.value.some((u) => o.fullPath.endsWith(u))),
|
|
43
43
|
handle: o.type === "file" ? o.handle : void 0,
|
|
44
44
|
selected: !1
|
|
45
|
-
})).sort((o,
|
|
45
|
+
})).sort((o, u) => o.isDir && !u.isDir ? -1 : !o.isDir && u.isDir ? 1 : o.name.localeCompare(u.name)).map((o, u) => ({ id: u, ...o })), t.lastSelected = void 0);
|
|
46
46
|
}).catch((a) => t.error = String(a)).finally(() => {
|
|
47
47
|
t.currentLoadingPath = void 0;
|
|
48
48
|
}));
|
|
49
|
-
},
|
|
49
|
+
}, U = () => {
|
|
50
50
|
k();
|
|
51
|
-
const { storageHandle: e, dirPath: l, modelValue: a } =
|
|
52
|
-
e && a &&
|
|
53
|
-
},
|
|
51
|
+
const { storageHandle: e, dirPath: l, modelValue: a } = $.value;
|
|
52
|
+
e && a && z(e, l);
|
|
53
|
+
}, C = p(() => de(t.dirPath)), P = p(
|
|
54
54
|
() => t.items.filter((e) => e.canBeSelected && e.selected && !e.isDir)
|
|
55
|
-
),
|
|
55
|
+
), W = p(() => {
|
|
56
56
|
var e;
|
|
57
57
|
return P.value.length > 0 && ((e = t.storageEntry) == null ? void 0 : e.handle);
|
|
58
|
-
}),
|
|
58
|
+
}), j = () => {
|
|
59
59
|
var e;
|
|
60
60
|
return {
|
|
61
|
-
storageHandle:
|
|
61
|
+
storageHandle: M((e = t.storageEntry) == null ? void 0 : e.handle),
|
|
62
62
|
files: P.value.map((l) => l.handle)
|
|
63
63
|
};
|
|
64
|
-
},
|
|
64
|
+
}, B = (e) => {
|
|
65
65
|
t.dirPath = e;
|
|
66
|
-
},
|
|
67
|
-
const { shiftKey: a } = e, o =
|
|
66
|
+
}, q = (e, l) => {
|
|
67
|
+
const { shiftKey: a } = e, o = b(e), { lastSelected: u } = t;
|
|
68
68
|
e.preventDefault();
|
|
69
69
|
const D = S.value;
|
|
70
70
|
if (l.canBeSelected) {
|
|
71
|
-
if (
|
|
71
|
+
if (m.multi || D.forEach((f) => f.selected = !1), l.selected = !l.selected, !m.multi)
|
|
72
72
|
return;
|
|
73
|
-
!o && !a && D.forEach((
|
|
74
|
-
|
|
75
|
-
}), a &&
|
|
76
|
-
|
|
73
|
+
!o && !a && D.forEach((f) => {
|
|
74
|
+
f.id !== l.id && (f.selected = !1);
|
|
75
|
+
}), a && u !== void 0 && D.forEach((f) => {
|
|
76
|
+
ae(f.id, u, l.id) && (f.selected = !0);
|
|
77
77
|
}), l.selected && (t.lastSelected = l.id);
|
|
78
78
|
}
|
|
79
|
-
},
|
|
80
|
-
e && !
|
|
79
|
+
}, x = (e) => {
|
|
80
|
+
e && !m.multi || S.value.filter((l) => l.canBeSelected).forEach((l) => {
|
|
81
81
|
l.selected = e;
|
|
82
82
|
});
|
|
83
|
-
},
|
|
83
|
+
}, G = () => x(!0), w = () => x(!1), F = () => {
|
|
84
84
|
if (k(), w(), !y()) {
|
|
85
85
|
console.warn("platforma API is not found");
|
|
86
86
|
return;
|
|
@@ -91,42 +91,44 @@ const ce = ["title", "onClick"], de = {
|
|
|
91
91
|
), t.storageOptions = e.map((l) => ({
|
|
92
92
|
text: l.name,
|
|
93
93
|
value: l
|
|
94
|
-
})),
|
|
94
|
+
})), m.autoSelectStorage && se(e[0], (l) => {
|
|
95
95
|
t.storageEntry = l;
|
|
96
96
|
});
|
|
97
97
|
}).catch((e) => t.error = String(e));
|
|
98
98
|
};
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
V(
|
|
100
|
+
X(t, "storageEntry"),
|
|
101
101
|
(e) => {
|
|
102
102
|
k(), t.dirPath = (e == null ? void 0 : e.initialFullPath) ?? "";
|
|
103
103
|
},
|
|
104
104
|
{ immediate: !0 }
|
|
105
105
|
), V([() => t.dirPath, () => t.storageEntry], () => {
|
|
106
|
-
|
|
106
|
+
U();
|
|
107
107
|
}), V(
|
|
108
|
-
() =>
|
|
108
|
+
() => m.modelValue,
|
|
109
109
|
(e) => {
|
|
110
|
-
e ? F() : Object.assign(t,
|
|
110
|
+
e ? F() : Object.assign(t, R());
|
|
111
111
|
},
|
|
112
112
|
{ immediate: !0 }
|
|
113
|
-
),
|
|
114
|
-
if (!
|
|
113
|
+
), le(document, "keydown", (e) => {
|
|
114
|
+
if (!m.modelValue || e.target !== document.body)
|
|
115
115
|
return;
|
|
116
|
-
const l =
|
|
117
|
-
l && e.code === "KeyA" && (e.preventDefault(),
|
|
118
|
-
}),
|
|
119
|
-
isReady:
|
|
120
|
-
getFilesToImport:
|
|
121
|
-
}),
|
|
116
|
+
const l = b(e);
|
|
117
|
+
l && e.code === "KeyA" && (e.preventDefault(), G()), l && e.shiftKey && e.code === "Period" && (e.preventDefault(), t.showHiddenItems = !t.showHiddenItems), e.code === "Enter" && m.submit();
|
|
118
|
+
}), T({
|
|
119
|
+
isReady: W,
|
|
120
|
+
getFilesToImport: j
|
|
121
|
+
}), Y(F);
|
|
122
|
+
const I = Z();
|
|
123
|
+
return (e, l) => (i(), d("div", {
|
|
122
124
|
class: n(s(r).remote),
|
|
123
|
-
onClick:
|
|
125
|
+
onClick: K(w, ["stop"])
|
|
124
126
|
}, [
|
|
125
127
|
c("div", {
|
|
126
128
|
class: n(s(r).search)
|
|
127
129
|
}, [
|
|
128
130
|
c("div", null, [
|
|
129
|
-
|
|
131
|
+
h(s(oe), {
|
|
130
132
|
modelValue: t.storageEntry,
|
|
131
133
|
"onUpdate:modelValue": l[0] || (l[0] = (a) => t.storageEntry = a),
|
|
132
134
|
label: "Select storage",
|
|
@@ -134,7 +136,7 @@ const ce = ["title", "onClick"], de = {
|
|
|
134
136
|
}, null, 8, ["modelValue", "options"])
|
|
135
137
|
]),
|
|
136
138
|
c("div", null, [
|
|
137
|
-
|
|
139
|
+
h(s(ne), {
|
|
138
140
|
modelValue: t.search,
|
|
139
141
|
"onUpdate:modelValue": l[1] || (l[1] = (a) => t.search = a),
|
|
140
142
|
label: "Search in folder",
|
|
@@ -143,7 +145,9 @@ const ce = ["title", "onClick"], de = {
|
|
|
143
145
|
])
|
|
144
146
|
], 2),
|
|
145
147
|
c("div", {
|
|
146
|
-
class: n(s(r)["ls-container"])
|
|
148
|
+
class: n(s(r)["ls-container"]),
|
|
149
|
+
ref_key: "lsContainerRef",
|
|
150
|
+
ref: I
|
|
147
151
|
}, [
|
|
148
152
|
c("div", {
|
|
149
153
|
class: n(s(r)["ls-head"])
|
|
@@ -151,25 +155,25 @@ const ce = ["title", "onClick"], de = {
|
|
|
151
155
|
c("div", {
|
|
152
156
|
class: n(s(r).breadcrumbs)
|
|
153
157
|
}, [
|
|
154
|
-
(i(!0), d(g, null,
|
|
158
|
+
(i(!0), d(g, null, L(C.value, (a, o) => (i(), d(g, { key: o }, [
|
|
155
159
|
c("div", {
|
|
156
160
|
title: a.path,
|
|
157
|
-
onClick: (
|
|
158
|
-
}, v(a.name), 9,
|
|
159
|
-
a.index !==
|
|
161
|
+
onClick: (u) => B(a.path)
|
|
162
|
+
}, v(a.name), 9, ue),
|
|
163
|
+
a.index !== C.value.length - 1 ? (i(), ee(s(_), {
|
|
160
164
|
key: 0,
|
|
161
165
|
name: "chevron-right"
|
|
162
|
-
})) :
|
|
166
|
+
})) : te("", !0)
|
|
163
167
|
], 64))), 128))
|
|
164
168
|
], 2),
|
|
165
169
|
c("div", {
|
|
166
170
|
class: n(s(r).selected)
|
|
167
171
|
}, [
|
|
168
172
|
c("span", null, "Selected: " + v(P.value.length), 1),
|
|
169
|
-
|
|
173
|
+
h(re, { container: I.value }, null, 8, ["container"])
|
|
170
174
|
], 2)
|
|
171
175
|
], 2),
|
|
172
|
-
t.currentLoadingPath !== void 0 ? (i(), d("div",
|
|
176
|
+
t.currentLoadingPath !== void 0 ? (i(), d("div", me, [...l[2] || (l[2] = [
|
|
173
177
|
c("i", { class: "mask-24 mask-loading loader-icon" }, null, -1)
|
|
174
178
|
])])) : t.storageEntry ? t.error ? (i(), d("div", {
|
|
175
179
|
key: 2,
|
|
@@ -185,39 +189,39 @@ const ce = ["title", "onClick"], de = {
|
|
|
185
189
|
key: 3,
|
|
186
190
|
class: n(s(r)["ls-body"])
|
|
187
191
|
}, [
|
|
188
|
-
(i(!0), d(g, null,
|
|
192
|
+
(i(!0), d(g, null, L(s(S), (a) => (i(), d(g, {
|
|
189
193
|
key: a.id
|
|
190
194
|
}, [
|
|
191
195
|
a.isDir ? (i(), d("div", {
|
|
192
196
|
key: 0,
|
|
193
197
|
class: n(s(r).isDir),
|
|
194
|
-
onClick: (o) =>
|
|
198
|
+
onClick: (o) => B(a.path)
|
|
195
199
|
}, [
|
|
196
|
-
|
|
197
|
-
|
|
200
|
+
h(s(_), { name: "chevron-right" }),
|
|
201
|
+
O((i(), d("span", {
|
|
198
202
|
title: a.name
|
|
199
203
|
}, [
|
|
200
|
-
|
|
201
|
-
], 8,
|
|
204
|
+
A(v(a.name), 1)
|
|
205
|
+
], 8, pe)), [
|
|
202
206
|
[s(H)]
|
|
203
207
|
])
|
|
204
|
-
], 10,
|
|
208
|
+
], 10, fe)) : (i(), d("div", {
|
|
205
209
|
key: 1,
|
|
206
210
|
class: n({ [s(r).canBeSelected]: a.canBeSelected, [s(r).selected]: a.selected }),
|
|
207
|
-
onClick:
|
|
211
|
+
onClick: K((o) => q(o, a), ["stop"])
|
|
208
212
|
}, [
|
|
209
|
-
|
|
213
|
+
h(s(_), {
|
|
210
214
|
name: "box",
|
|
211
215
|
class: n(s(r).isFile)
|
|
212
216
|
}, null, 8, ["class"]),
|
|
213
|
-
|
|
217
|
+
O((i(), d("span", {
|
|
214
218
|
title: a.name
|
|
215
219
|
}, [
|
|
216
|
-
|
|
217
|
-
], 8,
|
|
220
|
+
A(v(a.name), 1)
|
|
221
|
+
], 8, ve)), [
|
|
218
222
|
[s(H)]
|
|
219
223
|
])
|
|
220
|
-
], 10,
|
|
224
|
+
], 10, he))
|
|
221
225
|
], 64))), 128))
|
|
222
226
|
], 2)) : (i(), d("div", {
|
|
223
227
|
key: 1,
|
|
@@ -235,6 +239,6 @@ const ce = ["title", "onClick"], de = {
|
|
|
235
239
|
}
|
|
236
240
|
});
|
|
237
241
|
export {
|
|
238
|
-
|
|
242
|
+
Be as default
|
|
239
243
|
};
|
|
240
244
|
//# sourceMappingURL=Remote.vue.js.map
|
|
@@ -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()\n .lsDriver.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:\n item.type === \"file\" &&\n (!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(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\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()\n .lsDriver.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(\n (it) => it.name !== \"local\" && !it.name.startsWith(\"local_disk_\"),\n );\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\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n />\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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"}
|
|
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, ref, 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()\n .lsDriver.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:\n item.type === \"file\" &&\n (!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(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\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()\n .lsDriver.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(\n (it) => it.name !== \"local\" && !it.name.startsWith(\"local_disk_\"),\n );\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\nconst lsContainerRef = ref<HTMLElement | undefined>();\n</script>\n\n<template>\n <div :class=\"style.remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n />\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']\" ref=\"lsContainerRef\">\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 :container=\"lsContainerRef\" />\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","lsContainerRef","ref","_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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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
container?: "body" | HTMLElement;
|
|
3
|
+
};
|
|
4
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
2
5
|
export default _default;
|
|
3
6
|
//# sourceMappingURL=Shortcuts.vue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shortcuts.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Shortcuts.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"names":[],"mappings":"AA8GA,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAClC,CAAC;;AAwGF,wBAOG"}
|
|
@@ -1,27 +1,31 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
const m = /* @__PURE__ */
|
|
1
|
+
import { defineComponent as o, createBlock as s, openBlock as d, unref as a, withCtx as r, createElementVNode as l, normalizeClass as e } from "vue";
|
|
2
|
+
import u from "../PlTooltip/PlTooltip.vue.js";
|
|
3
|
+
const m = /* @__PURE__ */ o({
|
|
4
4
|
__name: "Shortcuts",
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
props: {
|
|
6
|
+
container: {}
|
|
7
|
+
},
|
|
8
|
+
setup(t) {
|
|
9
|
+
return (i, n) => (d(), s(a(u), {
|
|
7
10
|
class: "info",
|
|
8
|
-
position: "
|
|
9
|
-
"max-width": "420px"
|
|
11
|
+
position: "bottom",
|
|
12
|
+
"max-width": "420px",
|
|
13
|
+
container: t.container
|
|
10
14
|
}, {
|
|
11
|
-
tooltip:
|
|
15
|
+
tooltip: r(() => [
|
|
12
16
|
l("span", {
|
|
13
|
-
class:
|
|
17
|
+
class: e(i.$style.title)
|
|
14
18
|
}, "Shortcuts", 2),
|
|
15
19
|
l("div", {
|
|
16
|
-
class:
|
|
17
|
-
}, [...
|
|
20
|
+
class: e([i.$style.row, i.$style.head])
|
|
21
|
+
}, [...n[0] || (n[0] = [
|
|
18
22
|
l("div", null, null, -1),
|
|
19
23
|
l("div", null, "MacOS", -1),
|
|
20
24
|
l("div", null, "Windows/Linux", -1)
|
|
21
25
|
])], 2),
|
|
22
26
|
l("div", {
|
|
23
|
-
class:
|
|
24
|
-
}, [...
|
|
27
|
+
class: e([i.$style.row, i.$style.body])
|
|
28
|
+
}, [...n[1] || (n[1] = [
|
|
25
29
|
l("div", null, "Single File", -1),
|
|
26
30
|
l("div", null, "Click the file", -1),
|
|
27
31
|
l("div", null, "Click the file", -1),
|
|
@@ -37,7 +41,7 @@ const m = /* @__PURE__ */ s({
|
|
|
37
41
|
])], 2)
|
|
38
42
|
]),
|
|
39
43
|
_: 1
|
|
40
|
-
}));
|
|
44
|
+
}, 8, ["container"]));
|
|
41
45
|
}
|
|
42
46
|
});
|
|
43
47
|
export {
|
|
@@ -1 +1 @@
|
|
|
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=\"
|
|
1
|
+
{"version":3,"file":"Shortcuts.vue2.js","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip class=\"info\" position=\"bottom\" max-width=\"420px\" :container=\"container\">\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","__props","_createElementVNode","_normalizeClass","$style"],"mappings":";;;;;;;;2BASEA,EA4BYC,EAAAC,CAAA,GAAA;AAAA,MA5BD,OAAM;AAAA,MAAO,UAAS;AAAA,MAAS,aAAU;AAAA,MAAS,WAAWC,EAAA;AAAA,IAAA;MAC3D,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,EAAO,OAAA,MAAA,MAAA,EAAA;AAAA,UACPA,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;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as I, reactive as
|
|
1
|
+
import { defineComponent as I, reactive as q, useSlots as R, computed as s, watch as U, ref as $, createElementBlock as u, openBlock as t, Fragment as x, createElementVNode as f, createVNode as B, normalizeClass as O, createCommentVNode as d, withModifiers as P, withKeys as z, createBlock as a, normalizeStyle as H, unref as r, toDisplayString as c, withCtx as K, renderSlot as L, createTextVNode as j } from "vue";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import { prettyBytes as g } from "@milaboratories/helpers";
|
|
4
4
|
import { getFileNameFromHandle as A, getFilePathFromHandle as G } from "@platforma-sdk/model";
|
|
@@ -40,37 +40,37 @@ const le = {
|
|
|
40
40
|
fileDialogCloseOnOutsideClick: { type: Boolean, default: !0 }
|
|
41
41
|
},
|
|
42
42
|
emits: ["update:modelValue"],
|
|
43
|
-
setup(l, { emit:
|
|
44
|
-
const n =
|
|
43
|
+
setup(l, { emit: F }) {
|
|
44
|
+
const n = q({
|
|
45
45
|
fileDialogOpen: !1,
|
|
46
46
|
error: void 0
|
|
47
|
-
}), v =
|
|
47
|
+
}), v = R(), h = F, o = l, k = (e, i) => {
|
|
48
48
|
if (e)
|
|
49
49
|
try {
|
|
50
50
|
return i(e);
|
|
51
51
|
} catch (p) {
|
|
52
52
|
return n.error = p instanceof Error ? p.message : String(p), e;
|
|
53
53
|
}
|
|
54
|
-
}, V = s(() => k(o.modelValue, A)), S = s(() => k(o.modelValue, G)),
|
|
54
|
+
}, V = s(() => k(o.modelValue, A)), S = s(() => k(o.modelValue, G)), N = s(() => o.progress && !o.progress.done), T = s(() => o.progress && o.progress.done), b = s(() => J(n.error, o.error)), y = s(() => typeof b.value == "string"), C = s(() => {
|
|
55
55
|
const { status: e, done: i } = o.progress ?? {};
|
|
56
56
|
return !e || !e.bytesTotal ? "" : e.bytesProcessed && !i ? g(e.bytesProcessed, {}) + " / " + g(e.bytesTotal, {}) : g(e.bytesTotal, {});
|
|
57
|
-
}),
|
|
57
|
+
}), E = s(() => {
|
|
58
58
|
var i;
|
|
59
59
|
const { progress: e } = o;
|
|
60
60
|
return e ? {
|
|
61
61
|
width: e.done ? "100%" : Math.round((((i = e.status) == null ? void 0 : i.progress) ?? 0) * 100) + "%"
|
|
62
62
|
} : {};
|
|
63
|
-
}),
|
|
63
|
+
}), _ = () => {
|
|
64
64
|
n.fileDialogOpen = !0;
|
|
65
65
|
}, w = (e) => {
|
|
66
66
|
e.files.length && h("update:modelValue", e.files[0]);
|
|
67
67
|
}, M = () => h("update:modelValue", void 0);
|
|
68
|
-
|
|
68
|
+
U(
|
|
69
69
|
() => o.modelValue,
|
|
70
70
|
() => n.error = void 0,
|
|
71
71
|
{ immediate: !0 }
|
|
72
72
|
);
|
|
73
|
-
const D =
|
|
73
|
+
const D = $();
|
|
74
74
|
return o.cellStyle || W(D), (e, i) => (t(), u(x, null, [
|
|
75
75
|
f("div", {
|
|
76
76
|
class: O([{ "pl-file-input__cell-style": !!l.cellStyle, "has-file": !!V.value }, "pl-file-input__envelope"])
|
|
@@ -80,11 +80,11 @@ const le = {
|
|
|
80
80
|
ref: D,
|
|
81
81
|
class: O([{ dashed: l.dashed, error: y.value }, "pl-file-input"]),
|
|
82
82
|
tabindex: "0",
|
|
83
|
-
onKeyup: z(
|
|
84
|
-
onClick:
|
|
83
|
+
onKeyup: z(_, ["enter"]),
|
|
84
|
+
onClick: P(_, ["stop"])
|
|
85
85
|
}, [
|
|
86
86
|
f("div", {
|
|
87
|
-
style: H(
|
|
87
|
+
style: H(E.value),
|
|
88
88
|
class: "pl-file-input__progress"
|
|
89
89
|
}, null, 4),
|
|
90
90
|
!l.cellStyle && l.label ? (t(), u("label", le, [
|
|
@@ -109,10 +109,10 @@ const le = {
|
|
|
109
109
|
y.value ? (t(), a(r(m), {
|
|
110
110
|
key: 1,
|
|
111
111
|
name: "restart"
|
|
112
|
-
})) :
|
|
112
|
+
})) : N.value ? (t(), a(r(m), {
|
|
113
113
|
key: 2,
|
|
114
114
|
name: "cloud-upload"
|
|
115
|
-
})) :
|
|
115
|
+
})) : T.value ? (t(), a(r(m), {
|
|
116
116
|
key: 3,
|
|
117
117
|
name: "success"
|
|
118
118
|
})) : (t(), a(r(m), {
|
|
@@ -123,16 +123,16 @@ const le = {
|
|
|
123
123
|
"data-placeholder": l.placeholder ?? "Choose file",
|
|
124
124
|
class: "pl-file-input__filename"
|
|
125
125
|
}, c(V.value), 9, te),
|
|
126
|
-
|
|
126
|
+
C.value ? (t(), u("div", oe, c(C.value), 1)) : d("", !0),
|
|
127
127
|
l.modelValue ? (t(), a(r(m), {
|
|
128
128
|
key: 6,
|
|
129
129
|
class: "pl-file-input__clear",
|
|
130
130
|
name: "close",
|
|
131
|
-
onClick:
|
|
131
|
+
onClick: P(M, ["stop"])
|
|
132
132
|
})) : d("", !0),
|
|
133
133
|
B(Q, { class: "pl-file-input__contour" })
|
|
134
134
|
], 34),
|
|
135
|
-
y.value ? (t(), u("div", re, c(
|
|
135
|
+
y.value ? (t(), u("div", re, c(b.value), 1)) : l.helper ? (t(), u("div", ie, c(l.helper), 1)) : d("", !0)
|
|
136
136
|
], 2),
|
|
137
137
|
B(r(X), {
|
|
138
138
|
modelValue: n.fileDialogOpen,
|