@milaboratories/uikit 2.6.1 → 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.
Files changed (215) hide show
  1. package/.turbo/turbo-build.log +143 -143
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +14 -0
  4. package/dist/base/BtnBase.vue.js +18 -18
  5. package/dist/base/BtnBase.vue.js.map +1 -1
  6. package/dist/components/ContextProvider.vue.js.map +1 -1
  7. package/dist/components/DataTable/BaseCellComponent.vue.js +20 -20
  8. package/dist/components/DataTable/BaseCellComponent.vue.js.map +1 -1
  9. package/dist/components/DataTable/ColumnCaret.vue.js +6 -6
  10. package/dist/components/DataTable/ColumnCaret.vue.js.map +1 -1
  11. package/dist/components/DataTable/ColumnsCommandMenu.vue.js.map +1 -1
  12. package/dist/components/DataTable/RowsCommandMenu.vue.js.map +1 -1
  13. package/dist/components/DataTable/TScroll.vue.js +12 -12
  14. package/dist/components/DataTable/TScroll.vue.js.map +1 -1
  15. package/dist/components/DataTable/TableComponent.vue.js +5 -3
  16. package/dist/components/DataTable/TableComponent.vue.js.map +1 -1
  17. package/dist/components/DataTable/TdCell.vue.js +36 -36
  18. package/dist/components/DataTable/TdCell.vue.js.map +1 -1
  19. package/dist/components/DataTable/ThCell.vue.js +27 -27
  20. package/dist/components/DataTable/ThCell.vue.js.map +1 -1
  21. package/dist/components/DataTable/TrBody.vue.js +12 -12
  22. package/dist/components/DataTable/TrBody.vue.js.map +1 -1
  23. package/dist/components/DataTable/TrHead.vue.js.map +1 -1
  24. package/dist/components/DataTable/assets/TableIcon.vue.js +2 -2
  25. package/dist/components/DataTable/assets/TableIcon.vue.js.map +1 -1
  26. package/dist/components/DropdownListItem.vue.js +18 -18
  27. package/dist/components/DropdownListItem.vue.js.map +1 -1
  28. package/dist/components/HScroll.vue.js.map +1 -1
  29. package/dist/components/InputRange.vue.js.map +1 -1
  30. package/dist/components/LongText.vue.js +1 -1
  31. package/dist/components/LongText.vue.js.map +1 -1
  32. package/dist/components/LongText.vue3.js +1 -1
  33. package/dist/components/PlAccordion/ExpandTransition.vue.js.map +1 -1
  34. package/dist/components/PlAccordion/ExpandTransition.vue2.js.map +1 -1
  35. package/dist/components/PlAccordion/ExpandTransition.vue3.js +1 -1
  36. package/dist/components/PlAccordion/PlAccordion.vue.js.map +1 -1
  37. package/dist/components/PlAccordion/PlAccordionSection.vue2.js +21 -21
  38. package/dist/components/PlAccordion/PlAccordionSection.vue2.js.map +1 -1
  39. package/dist/components/PlAlert/PlAlert.vue.js +23 -23
  40. package/dist/components/PlAlert/PlAlert.vue.js.map +1 -1
  41. package/dist/components/PlAutocomplete/PlAutocomplete.vue.d.ts +4 -0
  42. package/dist/components/PlAutocomplete/PlAutocomplete.vue.js +112 -106
  43. package/dist/components/PlAutocomplete/PlAutocomplete.vue.js.map +1 -1
  44. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.d.ts +4 -0
  45. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js +100 -94
  46. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.js.map +1 -1
  47. package/dist/components/PlBtnAccent/PlBtnAccent.vue.js.map +1 -1
  48. package/dist/components/PlBtnDanger/PlBtnDanger.vue.js.map +1 -1
  49. package/dist/components/PlBtnGhost/PlBtnGhost.vue.js +21 -21
  50. package/dist/components/PlBtnGhost/PlBtnGhost.vue.js.map +1 -1
  51. package/dist/components/PlBtnGroup/PlBtnGroup.vue.js +34 -34
  52. package/dist/components/PlBtnGroup/PlBtnGroup.vue.js.map +1 -1
  53. package/dist/components/PlBtnLink/PlBtnLink.vue.js +12 -12
  54. package/dist/components/PlBtnLink/PlBtnLink.vue.js.map +1 -1
  55. package/dist/components/PlBtnPrimary/PlBtnPrimary.vue.js.map +1 -1
  56. package/dist/components/PlBtnSecondary/PlBtnSecondary.vue.js.map +1 -1
  57. package/dist/components/PlBtnSplit/PlBtnSplit.vue.js +31 -31
  58. package/dist/components/PlBtnSplit/PlBtnSplit.vue.js.map +1 -1
  59. package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js +18 -18
  60. package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js.map +1 -1
  61. package/dist/components/PlChartStackedBar/Legends.vue2.js.map +1 -1
  62. package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js +15 -15
  63. package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js.map +1 -1
  64. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.vue2.js.map +1 -1
  65. package/dist/components/PlChartStackedBar/StackedRow.vue2.js.map +1 -1
  66. package/dist/components/PlChartStackedBar/StackedRowCompact.vue2.js.map +1 -1
  67. package/dist/components/PlCheckbox/PlCheckbox.vue.js +13 -13
  68. package/dist/components/PlCheckbox/PlCheckbox.vue.js.map +1 -1
  69. package/dist/components/PlCheckbox/PlCheckboxBase.vue.js +6 -6
  70. package/dist/components/PlCheckbox/PlCheckboxBase.vue.js.map +1 -1
  71. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.js +28 -28
  72. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.js.map +1 -1
  73. package/dist/components/PlChip/PlChip.vue.js +20 -20
  74. package/dist/components/PlChip/PlChip.vue.js.map +1 -1
  75. package/dist/components/PlClipboard/PlClipboard.vue2.js.map +1 -1
  76. package/dist/components/PlConfirmDialog.vue.js +14 -14
  77. package/dist/components/PlConfirmDialog.vue.js.map +1 -1
  78. package/dist/components/PlDialogModal/PlDialogModal.vue.js +30 -30
  79. package/dist/components/PlDialogModal/PlDialogModal.vue.js.map +1 -1
  80. package/dist/components/PlDropdown/OptionList.vue.js +40 -40
  81. package/dist/components/PlDropdown/OptionList.vue.js.map +1 -1
  82. package/dist/components/PlDropdown/PlDropdown.vue.d.ts +8 -0
  83. package/dist/components/PlDropdown/PlDropdown.vue.js +102 -95
  84. package/dist/components/PlDropdown/PlDropdown.vue.js.map +1 -1
  85. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js +95 -93
  86. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js.map +1 -1
  87. package/dist/components/PlDropdownLine/PlDropdownLine.vue.d.ts +1 -1
  88. package/dist/components/PlDropdownLine/PlDropdownLine.vue.js +4 -4
  89. package/dist/components/PlDropdownLine/PlDropdownLine.vue.js.map +1 -1
  90. package/dist/components/PlDropdownLine/ResizableInput.vue.js +12 -12
  91. package/dist/components/PlDropdownLine/ResizableInput.vue.js.map +1 -1
  92. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.d.ts +4 -0
  93. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +88 -82
  94. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js.map +1 -1
  95. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue.d.ts +1 -1
  96. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue.js.map +1 -1
  97. package/dist/components/PlDropdownRef/PlDropdownRef.vue.js +11 -11
  98. package/dist/components/PlDropdownRef/PlDropdownRef.vue.js.map +1 -1
  99. package/dist/components/PlEditableTitle/PlEditableTitle.vue.d.ts +1 -1
  100. package/dist/components/PlEditableTitle/PlEditableTitle.vue.js +36 -36
  101. package/dist/components/PlEditableTitle/PlEditableTitle.vue.js.map +1 -1
  102. package/dist/components/PlElementList/PlElementList.vue.d.ts +20 -0
  103. package/dist/components/PlElementList/PlElementList.vue2.js +180 -135
  104. package/dist/components/PlElementList/PlElementList.vue2.js.map +1 -1
  105. package/dist/components/PlElementList/PlElementListItem.vue.d.ts +20 -0
  106. package/dist/components/PlElementList/PlElementListItem.vue2.js +101 -76
  107. package/dist/components/PlElementList/PlElementListItem.vue2.js.map +1 -1
  108. package/dist/components/PlErrorAlert/PlErrorAlert.vue2.js.map +1 -1
  109. package/dist/components/PlErrorBoundary/PlErrorBoundary.vue.js.map +1 -1
  110. package/dist/components/PlFileDialog/Local.vue.js +24 -24
  111. package/dist/components/PlFileDialog/Local.vue.js.map +1 -1
  112. package/dist/components/PlFileDialog/PlFileDialog.vue.js +38 -38
  113. package/dist/components/PlFileDialog/PlFileDialog.vue.js.map +1 -1
  114. package/dist/components/PlFileDialog/Remote.vue.js +2 -2
  115. package/dist/components/PlFileDialog/Remote.vue.js.map +1 -1
  116. package/dist/components/PlFileDialog/Shortcuts.vue2.js +4 -4
  117. package/dist/components/PlFileDialog/Shortcuts.vue2.js.map +1 -1
  118. package/dist/components/PlFileInput/PlFileInput.vue.d.ts +1 -1
  119. package/dist/components/PlFileInput/PlFileInput.vue.js +78 -76
  120. package/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
  121. package/dist/components/PlIcon16/PlIcon16.vue2.js.map +1 -1
  122. package/dist/components/PlIcon24/PlIcon24.vue2.js.map +1 -1
  123. package/dist/components/PlLoaderCircular/PlLoaderCircular.vue.js +11 -11
  124. package/dist/components/PlLoaderCircular/PlLoaderCircular.vue.js.map +1 -1
  125. package/dist/components/PlLogView/PlLogView.vue.js +62 -60
  126. package/dist/components/PlLogView/PlLogView.vue.js.map +1 -1
  127. package/dist/components/PlNotificationAlert/PlNotificationAlert.vue.js +22 -22
  128. package/dist/components/PlNotificationAlert/PlNotificationAlert.vue.js.map +1 -1
  129. package/dist/components/PlNumberField/PlNumberField.vue.d.ts +6 -1
  130. package/dist/components/PlNumberField/PlNumberField.vue.js +66 -60
  131. package/dist/components/PlNumberField/PlNumberField.vue.js.map +1 -1
  132. package/dist/components/PlProgressBar/PlProgressBar.vue.js +12 -12
  133. package/dist/components/PlProgressBar/PlProgressBar.vue.js.map +1 -1
  134. package/dist/components/PlProgressCell/PlProgressCell.vue.js +20 -20
  135. package/dist/components/PlProgressCell/PlProgressCell.vue.js.map +1 -1
  136. package/dist/components/PlRadio/PlRadio.vue2.js.map +1 -1
  137. package/dist/components/PlRadio/PlRadioGroup.vue2.js +8 -8
  138. package/dist/components/PlRadio/PlRadioGroup.vue2.js.map +1 -1
  139. package/dist/components/PlSearchField/PlSearchField.vue2.js +19 -19
  140. package/dist/components/PlSearchField/PlSearchField.vue2.js.map +1 -1
  141. package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js +8 -8
  142. package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js.map +1 -1
  143. package/dist/components/PlSidebar/PlSidebarGroup.vue2.js.map +1 -1
  144. package/dist/components/PlSidebar/PlSidebarItem.vue2.js.map +1 -1
  145. package/dist/components/PlSlideModal/PlPureSlideModal.vue.js +5 -3
  146. package/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
  147. package/dist/components/PlSlideModal/PlSlideModal.vue2.js.map +1 -1
  148. package/dist/components/PlSplash/PlSplash.vue.js +16 -16
  149. package/dist/components/PlSplash/PlSplash.vue.js.map +1 -1
  150. package/dist/components/PlStatusTag/PlStatusTag.vue.js +7 -7
  151. package/dist/components/PlStatusTag/PlStatusTag.vue.js.map +1 -1
  152. package/dist/components/PlSvg/PlSvg.vue2.js.map +1 -1
  153. package/dist/components/PlTabs/PlTabs.vue.js +18 -18
  154. package/dist/components/PlTabs/PlTabs.vue.js.map +1 -1
  155. package/dist/components/PlTabs/Tab.vue.js +9 -9
  156. package/dist/components/PlTabs/Tab.vue.js.map +1 -1
  157. package/dist/components/PlTextArea/PlTextArea.vue.js +55 -53
  158. package/dist/components/PlTextArea/PlTextArea.vue.js.map +1 -1
  159. package/dist/components/PlTextField/PlTextField.vue.d.ts +4 -0
  160. package/dist/components/PlTextField/PlTextField.vue.js +66 -60
  161. package/dist/components/PlTextField/PlTextField.vue.js.map +1 -1
  162. package/dist/components/PlToggleSwitch/PlToggleSwitch.vue.js +14 -14
  163. package/dist/components/PlToggleSwitch/PlToggleSwitch.vue.js.map +1 -1
  164. package/dist/components/PlTooltip/Beak.vue.js +2 -2
  165. package/dist/components/PlTooltip/Beak.vue.js.map +1 -1
  166. package/dist/components/PlTooltip/PlTooltip.vue.js +50 -50
  167. package/dist/components/PlTooltip/PlTooltip.vue.js.map +1 -1
  168. package/dist/components/Scrollable.vue.js.map +1 -1
  169. package/dist/components/Slider.vue.js +35 -35
  170. package/dist/components/Slider.vue.js.map +1 -1
  171. package/dist/components/SliderRange.vue.js +47 -47
  172. package/dist/components/SliderRange.vue.js.map +1 -1
  173. package/dist/components/SliderRangeTriple.vue.js +47 -47
  174. package/dist/components/SliderRangeTriple.vue.js.map +1 -1
  175. package/dist/components/TabItem.vue.js.map +1 -1
  176. package/dist/components/ThemeSwitcher.vue.js +2 -2
  177. package/dist/components/ThemeSwitcher.vue.js.map +1 -1
  178. package/dist/components/TransitionSlidePanel.vue.js.map +1 -1
  179. package/dist/components/VScroll.vue.js.map +1 -1
  180. package/dist/components/contextMenu/Menu.vue2.js +12 -12
  181. package/dist/components/contextMenu/Menu.vue2.js.map +1 -1
  182. package/dist/composition/filters/metadata.d.ts +205 -0
  183. package/dist/composition/filters/metadata.js +129 -19
  184. package/dist/composition/filters/metadata.js.map +1 -1
  185. package/dist/index.js +1 -1
  186. package/dist/layout/PlBlockPage/PlBlockPage.vue.js +27 -27
  187. package/dist/layout/PlBlockPage/PlBlockPage.vue.js.map +1 -1
  188. package/dist/layout/PlContainer/PlContainer.vue.js +10 -10
  189. package/dist/layout/PlContainer/PlContainer.vue.js.map +1 -1
  190. package/dist/layout/PlGrid/PlGrid.vue.js.map +1 -1
  191. package/dist/layout/PlRow/PlRow.vue.js +8 -8
  192. package/dist/layout/PlRow/PlRow.vue.js.map +1 -1
  193. package/dist/layout/PlSpacer/PlSpacer.vue.js.map +1 -1
  194. package/dist/utils/DoubleContour.vue.d.ts +7 -1
  195. package/dist/utils/DoubleContour.vue.js +20 -13
  196. package/dist/utils/DoubleContour.vue.js.map +1 -1
  197. package/dist/utils/DoubleContour.vue3.js +7 -0
  198. package/dist/utils/DoubleContour.vue3.js.map +1 -0
  199. package/dist/utils/DropdownOverlay/DropdownOverlay.vue.js.map +1 -1
  200. package/dist/utils/PlCloseModalBtn.vue.js +2 -2
  201. package/dist/utils/PlCloseModalBtn.vue.js.map +1 -1
  202. package/dist/utils/TextLabel.vue.js.map +1 -1
  203. package/package.json +5 -5
  204. package/src/components/PlAutocomplete/PlAutocomplete.vue +6 -1
  205. package/src/components/PlAutocompleteMulti/PlAutocompleteMulti.vue +6 -1
  206. package/src/components/PlDropdown/PlDropdown.vue +12 -2
  207. package/src/components/PlDropdownMulti/PlDropdownMulti.vue +6 -1
  208. package/src/components/PlElementList/PlElementList.vue +40 -6
  209. package/src/components/PlElementList/PlElementListItem.vue +64 -47
  210. package/src/components/PlNumberField/PlNumberField.vue +4 -1
  211. package/src/components/PlTextField/PlTextField.vue +5 -1
  212. package/src/composition/filters/metadata.ts +105 -0
  213. package/src/utils/DoubleContour.vue +68 -2
  214. package/dist/utils/DoubleContour.vue2.js +0 -7
  215. package/dist/utils/DoubleContour.vue2.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { defineComponent as B, ref as S, computed as b, useTemplateRef as F, createBlock as n, openBlock as u, unref as t, withModifiers as p, normalizeClass as O, createSlots as R, withCtx as i, createElementVNode as w, createCommentVNode as v, createVNode as d, mergeProps as y, createTextVNode as f, toDisplayString as x } from "vue";
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__ */ B({
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(k, { emit: V }) {
22
- const a = V, C = k, l = S("local"), _ = b(() => C.multi ? "Select Files to Import" : "Select File to Import"), g = [
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
- ], m = () => a("update:modelValue", !1), r = F("remote"), c = () => {
32
- var o, e;
33
- (o = r.value) != null && o.isReady && (a("import:files", N((e = r.value) == null ? void 0 : e.getFilesToImport())), m());
34
- }, $ = (o) => {
35
- a("import:files", o), m();
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 (o, e) => (u(), n(t(T), {
37
+ return (t, e) => (d(), u(l(T), {
38
38
  "no-content-gutters": !0,
39
- "close-on-outside-click": o.closeOnOutsideClick,
40
- class: O(["pl-dialog-modal", t(I).component]),
41
- "model-value": o.modelValue,
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": m,
44
+ "onUpdate:modelValue": a,
45
45
  onClick: e[1] || (e[1] = p(() => {
46
46
  }, ["stop"]))
47
- }, R({
47
+ }, O({
48
48
  title: i(() => [
49
- f(x(o.title ?? _.value), 1)
49
+ c(w(m.title ?? g.value), 1)
50
50
  ]),
51
51
  default: i(() => [
52
- w("div", j, [
53
- d(t(E), {
54
- modelValue: l.value,
55
- "onUpdate:modelValue": e[0] || (e[0] = (s) => l.value = s),
56
- options: g
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
- l.value === "remote" ? (u(), n(P, y({
59
+ o.value === "remote" ? (d(), u(P, k({
60
60
  key: 0,
61
61
  ref: "remote"
62
- }, o.$props, { submit: c }), null, 16)) : v("", !0),
63
- l.value === "local" ? (u(), n(U, y({
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
- }, o.$props), null, 16)) : v("", !0)
65
+ "import-files": x
66
+ }, t.$props), null, 16)) : y("", !0)
67
67
  ]),
68
68
  _: 2
69
69
  }, [
70
- l.value === "remote" ? {
70
+ o.value === "remote" ? {
71
71
  name: "actions",
72
72
  fn: i(() => {
73
73
  var s;
74
74
  return [
75
- d(t(M), {
75
+ f(l(M), {
76
76
  style: { "min-width": "160px" },
77
- disabled: !((s = t(r)) != null && s.isReady),
78
- onClick: p(c, ["stop"])
77
+ disabled: !((s = r.value) != null && s.isReady),
78
+ onClick: p(v, ["stop"])
79
79
  }, {
80
- default: i(() => e[2] || (e[2] = [
81
- f("Import")
82
- ])),
80
+ default: i(() => [...e[2] || (e[2] = [
81
+ c("Import", -1)
82
+ ])]),
83
83
  _: 1
84
84
  }, 8, ["disabled"]),
85
- d(t(D), {
85
+ f(l(D), {
86
86
  "justify-center": !1,
87
- onClick: p(m, ["stop"])
87
+ onClick: p(a, ["stop"])
88
88
  }, {
89
- default: i(() => e[3] || (e[3] = [
90
- f("Cancel")
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,UAAMA,IAAe,CAACC,MAAmCA,EAAG,WAAWA,EAAG,SAOpEC,IAAQC,GAgBRC,IAAOC,EAASC,GAAa,GAE7BC,IAAY,MAAM;AACtB,MAAAH,EAAK,SAAS,IACdA,EAAK,QAAQ,IACbA,EAAK,eAAe;AAAA,IACtB,GAEMI,IAAaC,EAAS,MAAMC,GAAoBR,EAAM,UAAU,CAAC,GAEjES,IAAeC,GAAgBR,CAAI,GAEnCS,IAASJ,EAAS,MAAM;;AAC5B,aAAO;AAAA,QACL,YAAYP,EAAM;AAAA,QAClB,SAASE,EAAK;AAAA,QACd,gBAAeU,IAAAV,EAAK,iBAAL,gBAAAU,EAAmB;AAAA,MAAA;AAAA,IAEtC,CAAC,GAEKC,IAAQ,CAACC,GAA8BC,MAAoB;AAC/D,MAAKC,OAIDd,EAAK,uBAAuBa,MAIhCb,EAAK,qBAAqBa,GAE1BC,EAAA,EAA0B,SACvB,UAAUF,GAAeC,CAAO,EAChC,KAAK,CAACE,MAAQ;AACb,QAAIF,MAAYb,EAAK,YAIrBA,EAAK,QAAQgB,EAASD,CAAG,EACtB,QAAQ,IAAI,CAACE,OAAU;AAAA,UACtB,MAAMA,EAAK;AAAA,UACX,MAAMA,EAAK;AAAA,UACX,OAAOA,EAAK,SAAS;AAAA,UACrB,eAAeA,EAAK,SAAS,WAAW,CAACb,EAAW,SAASA,EAAW,MAAM,KAAK,CAACc,MAAQD,EAAK,SAAS,SAASC,CAAG,CAAC;AAAA,UACvH,QAAQD,EAAK,SAAS,SAASA,EAAK,SAAS;AAAA,UAC7C,UAAU;AAAA,QAAA,EACV,EACD,KAAK,CAACE,GAAGC,MACJD,EAAE,SAAS,CAACC,EAAE,QAAc,KAC5B,CAACD,EAAE,SAASC,EAAE,QAAc,IAEzBD,EAAE,KAAK,cAAcC,EAAE,IAAI,CACnC,EACA,IAAI,CAACC,GAAIC,OAAQ,EAAE,IAAAA,GAAI,GAAGD,EAAA,EAAK,GAElCrB,EAAK,eAAe;AAAA,MACtB,CAAC,EACA,MAAM,CAACuB,MAASvB,EAAK,QAAQ,OAAOuB,CAAG,CAAE,EACzC,QAAQ,MAAM;AACb,QAAAvB,EAAK,qBAAqB;AAAA,MAC5B,CAAC;AAAA,IACL,GAEMwB,IAAO,MAAM;AACjB,MAAArB,EAAA;AACA,YAAM,EAAE,eAAAS,GAAe,SAAAC,GAAS,YAAAY,EAAA,IAAehB,EAAO;AACtD,MAAIG,KAAiBa,KACnBd,EAAMC,GAAeC,CAAO;AAAA,IAEhC,GAEMa,IAAcrB,EAAS,MAAMsB,GAAuB3B,EAAK,OAAO,CAAC,GAEjE4B,IAAgBvB,EAAS,MAAML,EAAK,MAAM,OAAO,CAAC6B,MAAMA,EAAE,iBAAiBA,EAAE,YAAY,CAACA,EAAE,KAAK,CAAC,GAElGC,IAAUzB,EAAS,MAAA;;AAAM,aAAAuB,EAAc,MAAM,SAAS,OAAKlB,IAAAV,EAAK,iBAAL,gBAAAU,EAAmB;AAAA,KAAM,GAEpFqB,IAAmB,MAAA;;AAAO;AAAA,QAC9B,eAAef,GAASN,IAAAV,EAAK,iBAAL,gBAAAU,EAAmB,MAAM;AAAA,QACjD,OAAOkB,EAAc,MAAM,IAAI,CAACC,MAAMA,EAAE,MAAO;AAAA,MAAA;AAAA,OAG3CG,IAAa,CAACnB,MAAoB;AACtC,MAAAb,EAAK,UAAUa;AAAA,IACjB,GAEMoB,IAAa,CAACpC,GAAgBqC,MAAyB;AAC3D,YAAM,EAAE,UAAAC,MAAatC,GAEfuC,IAAgBxC,EAAaC,CAAE,GAE/B,EAAE,cAAAwC,MAAiBrC;AAEzB,MAAAH,EAAG,eAAA;AAEH,YAAMyC,IAAQ/B,EAAa;AAE3B,UAAI2B,EAAK,eAAe;AAOtB,YANKpC,EAAM,SACTwC,EAAM,QAAQ,CAACT,MAAOA,EAAE,WAAW,EAAM,GAG3CK,EAAK,WAAW,CAACA,EAAK,UAElB,CAACpC,EAAM;AACT;AAGF,QAAI,CAACsC,KAAiB,CAACD,KACrBG,EAAM,QAAQ,CAACT,MAAM;AACnB,UAAIA,EAAE,OAAOK,EAAK,OAChBL,EAAE,WAAW;AAAA,QAEjB,CAAC,GAGCM,KAAYE,MAAiB,UAC/BC,EAAM,QAAQ,CAACT,MAAM;AACnB,UAAIU,GAAQV,EAAE,IAAIQ,GAAcH,EAAK,EAAE,MACrCL,EAAE,WAAW;AAAA,QAEjB,CAAC,GAGCK,EAAK,aACPlC,EAAK,eAAekC,EAAK;AAAA,MAE7B;AAAA,IACF,GAEMM,IAAY,CAACC,MAAsB;AACvC,MAAIA,KAAY,CAAC3C,EAAM,SAIvBS,EAAa,MACV,OAAO,CAACsB,MAAMA,EAAE,aAAa,EAC7B,QAAQ,CAACK,MAAS;AACjB,QAAAA,EAAK,WAAWO;AAAA,MAClB,CAAC;AAAA,IACL,GAEMC,IAAY,MAAMF,EAAU,EAAI,GAEhCG,IAAc,MAAMH,EAAU,EAAK,GAEnCI,IAAwB,MAAM;AAGlC,UAFAzC,EAAA,GACAwC,EAAA,GACI,CAAC7B,KAA2B;AAC9B,gBAAQ,KAAK,4BAA4B;AACzC;AAAA,MACF;AACA,MAAAA,EAAA,EAA0B,SACvB,eAAA,EACA,KAAK,CAAC+B,MAAmB;AAExB,QAAAA,IAAiBA,EAAe,OAAO,CAACxB,MAAOA,EAAG,SAAS,WAAW,CAACA,EAAG,KAAK,WAAW,aAAa,CAAC,GAExGrB,EAAK,iBAAiB6C,EAAe,IAAI,CAACxB,OAAQ;AAAA,UAChD,MAAMA,EAAG;AAAA,UACT,OAAOA;AAAA,QAAA,EACP,GAEEvB,EAAM,qBACRgD,GAAMD,EAAe,CAAC,GAAG,CAACE,MAAU;AAClC,UAAA/C,EAAK,eAAe+C;AAAA,QACtB,CAAC;AAAA,MAEL,CAAC,EACA,MAAM,CAACxB,MAASvB,EAAK,QAAQ,OAAOuB,CAAG,CAAE;AAAA,IAC9C;AAEA,WAAAyB;AAAA,MACEC,EAAMjD,GAAM,cAAc;AAAA,MAC1B,CAAC+C,MAAU;AACT,QAAA5C,EAAA,GACAH,EAAK,WAAU+C,KAAA,gBAAAA,EAAO,oBAAmB;AAAA,MAC3C;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBC,EAAM,CAAC,MAAMhD,EAAK,SAAS,MAAMA,EAAK,YAAY,GAAG,MAAM;AACzD,MAAAwB,EAAA;AAAA,IACF,CAAC,GAEDwB;AAAA,MACE,MAAMlD,EAAM;AAAA,MACZ,CAACoD,MAAW;AACV,QAAIA,IACFN,EAAA,IAEA,OAAO,OAAO5C,GAAME,GAAa;AAAA,MAErC;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBiD,GAAiB,UAAU,WAAW,CAACtD,MAAsB;AAK3D,UAJI,CAACC,EAAM,cAIPD,EAAG,WAAW,SAAS;AACzB;AAGF,YAAMuC,IAAgBxC,EAAaC,CAAE;AAErC,MAAIuC,KAAiBvC,EAAG,SAAS,WAC/BA,EAAG,eAAA,GACH6C,EAAA,IAGEN,KAAiBvC,EAAG,YAAYA,EAAG,SAAS,aAC9CA,EAAG,eAAA,GACHG,EAAK,kBAAkB,CAACA,EAAK,kBAG3BH,EAAG,SAAS,WACdC,EAAM,OAAA;AAAA,IAEV,CAAC,GAEDsD,EAAa;AAAA,MACX,SAAAtB;AAAA,MACA,kBAAAC;AAAA,IAAA,CACD,GAEDsB,EAAUT,CAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
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;
@@ -1,29 +1,31 @@
1
- (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".pl-file-input{--contour-color: var(--txt-01);--label-color: var(--txt-01);--text-color: var(--txt-01);--contour-border-width: 1px;--contour-box-shadow: none;--label-offset-left-x: 8px;--label-offset-right-x: 8px;--prefix-color: var(--color-placeholder);--contour-offset: 2px;--icon-color: #000;position:relative;z-index:0;width:100%;height:var(--control-height, 40px);border-radius:var(--border-radius-control);display:flex;flex-direction:row;align-items:center;outline:none;padding:0 8px;gap:8px;cursor:pointer}.pl-file-input__envelope{font-family:var(--font-family-base);display:flex;flex-direction:column;min-width:160px}.pl-file-input .mask-24{display:block;min-width:24px}.pl-file-input .mask-close{cursor:pointer}.pl-file-input__progress{position:absolute;z-index:-1;top:0;bottom:0;left:0;right:0;background:linear-gradient(90deg,#fff,#d8fac8);pointer-events:none;width:0}.pl-file-input__clear{--icon-color: var(--ic-02)}.pl-file-input__filename{width:100%;border:none;font-size:inherit;background-color:transparent;color:var(--text-color);caret-color:var(--border-color-focus);z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.pl-file-input__filename:empty:before{color:var(--color-placeholder);content:attr(data-placeholder);color:var(--txt-03);font-size:14px;font-weight:500;line-height:20px}.pl-file-input__stats{white-space:nowrap;z-index:1;font-size:11px;font-weight:600;letter-spacing:.44px;text-transform:uppercase;color:var(--txt-03)}.pl-file-input label{display:flex;align-items:center;gap:4px;position:absolute;top:0;transform:translateY(-60%);left:var(--label-offset-left-x);padding:0 4px;max-width:calc(100% - 16px);overflow:hidden;white-space:pre;text-overflow:ellipsis;cursor:inherit;color:var(--label-color);font-size:12px;font-weight:500;border-bottom-right-radius:4px;border-bottom-left-radius:4px;background:var(--bg-elevated-01)}.pl-file-input label>span{overflow:hidden;white-space:pre;text-overflow:ellipsis}.pl-file-input__contour{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:var(--border-radius-control);border-width:var(--contour-border-width);border-color:var(--contour-color);border-style:solid;box-shadow:var(--contour-box-shadow);z-index:0;pointer-events:none}.pl-file-input__prefix{padding-left:12px;white-space:nowrap;margin-right:-12px;color:var(--prefix-color)}.pl-file-input__helper{font-size:12px;color:var(--txt-03);padding:2px 0 0;white-space:pre-wrap;text-overflow:ellipsis;font-weight:500;line-height:16px;margin-top:6px}.pl-file-input__error{font-size:12px;color:var(--txt-error);padding:2px 0 0;white-space:pre-wrap;text-overflow:ellipsis;font-weight:500;line-height:16px;margin-top:6px}.pl-file-input:hover{--contour-color: var(--control-hover-color)}.pl-file-input:focus-within:not(.error){--label-color: var(--txt-focus);--contour-color: var(--border-color-focus);--contour-border-width: 2px;--contour-box-shadow: 0 0 0 4px var(--border-color-focus-shadow)}.pl-file-input:focus-within.error{--contour-border-width: 2px;--contour-box-shadow: 0 0 0 4px var(--color-error-shadow)}.pl-file-input.dashed .pl-file-input__contour{border-style:dashed}.pl-file-input.nonEmpty{--prefix-color: var(--txt-01)}.pl-file-input.error{--contour-color: var(--txt-error);--label-color: var(--txt-error);--text-color: var(--txt-error);--icon-color: var(--txt-error)}.pl-file-input.error .pl-file-input__progress{display:none}.pl-file-input.disabled{--contour-color: var(--color-dis-01);cursor:not-allowed}.pl-file-input__cell-style{--border-radius-control: 0px;--input-active-color: var(--bg-base-light);--border-color: var(--border-color-div-grey);background-color:var(--input-active-color);padding:4px;height:100%;position:relative}.pl-file-input__cell-style .mask-paper-clip{display:none}.pl-file-input__cell-style .pl-file-input{height:100%!important;position:unset}.pl-file-input__cell-style .pl-file-input .double-contour{top:2px;right:2px;bottom:2px;left:2px}.pl-file-input__cell-style .pl-file-input__contour{border-width:1px;box-shadow:unset!important;border-color:var(--border-color);border-style:dashed}.pl-file-input__cell-style .pl-file-input__filename{text-align:center!important}.pl-file-input__cell-style .pl-file-input__error{margin-top:0;margin-right:8px}.pl-file-input__cell-style:hover{--border-color: var(--border-color-focus);background-color:#d9f8ca}.pl-file-input__cell-style:hover .pl-file-input__filename:before{color:#110529!important}.pl-file-input__cell-style.has-file:hover{background-color:var(--input-active-color)}.pl-file-input__cell-style.has-file{padding-left:0;padding-right:0}.pl-file-input__cell-style.has-file .pl-file-input__contour{border:unset}.pl-file-input__cell-style.has-file .pl-file-input__filename{text-align:left!important}.pl-file-input__cell-style.has-file .mask-paper-clip{display:block}")),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
2
- import { defineComponent as q, reactive as R, useSlots as U, computed as s, watch as $, ref as z, createElementBlock as n, openBlock as l, Fragment as D, createElementVNode as c, createVNode as B, normalizeClass as O, createCommentVNode as u, withModifiers as F, withKeys as H, createBlock as i, normalizeStyle as K, unref as t, toDisplayString as p, withCtx as L, renderSlot as j, createTextVNode as A } from "vue";
1
+ (function(){"use strict";try{if(typeof document<"u"){var o=document.createElement("style");o.appendChild(document.createTextNode(`.pl-file-input{--contour-color: var(--txt-01);--label-color: var(--txt-01);--text-color: var(--txt-01);--contour-border-width: 1px;--contour-box-shadow: none;--label-offset-left-x: 8px;--label-offset-right-x: 8px;--prefix-color: var(--color-placeholder);--contour-offset: 2px;--icon-color: #000;position:relative;z-index:0;width:100%;height:var(--control-height, 40px);border-radius:var(--border-radius-control);display:flex;flex-direction:row;align-items:center;outline:none;padding:0 8px;gap:8px;cursor:pointer}.pl-file-input__envelope{font-family:var(--font-family-base);display:flex;flex-direction:column;min-width:160px}.pl-file-input .mask-24{display:block;min-width:24px}.pl-file-input .mask-close{cursor:pointer}.pl-file-input__progress{position:absolute;z-index:-1;top:0;bottom:0;left:0;right:0;background:linear-gradient(90deg,#fff,#d8fac8);pointer-events:none;width:0}.pl-file-input__clear{--icon-color: var(--ic-02)}.pl-file-input__filename{width:100%;border:none;font-size:inherit;background-color:transparent;color:var(--text-color);caret-color:var(--border-color-focus);z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:18px}.pl-file-input__filename:empty:before{color:var(--color-placeholder);content:attr(data-placeholder);color:var(--txt-03);font-size:14px;font-weight:500;line-height:20px}.pl-file-input__stats{white-space:nowrap;z-index:1;font-size:11px;font-weight:600;letter-spacing:.44px;text-transform:uppercase;color:var(--txt-03)}.pl-file-input label{display:flex;align-items:center;gap:4px;position:absolute;top:0;transform:translateY(-60%);left:var(--label-offset-left-x);padding:0 4px;max-width:calc(100% - 16px);overflow:hidden;white-space:pre;text-overflow:ellipsis;cursor:inherit;color:var(--label-color);font-size:12px;font-weight:500;border-bottom-right-radius:4px;border-bottom-left-radius:4px;background:var(--bg-elevated-01)}.pl-file-input label>span{overflow:hidden;white-space:pre;text-overflow:ellipsis}.pl-file-input__contour{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:var(--border-radius-control);border-width:var(--contour-border-width);border-color:var(--contour-color);border-style:solid;box-shadow:var(--contour-box-shadow);z-index:0;pointer-events:none}.pl-file-input__prefix{padding-left:12px;white-space:nowrap;margin-right:-12px;color:var(--prefix-color)}.pl-file-input__helper{font-size:12px;color:var(--txt-03);padding:2px 0 0;white-space:pre-wrap;text-overflow:ellipsis;font-weight:500;line-height:16px;margin-top:6px}.pl-file-input__error{font-size:12px;color:var(--txt-error);padding:2px 0 0;white-space:pre-wrap;text-overflow:ellipsis;font-weight:500;line-height:16px;margin-top:6px}.pl-file-input:hover{--contour-color: var(--control-hover-color)}.pl-file-input:focus-within:not(.error){--label-color: var(--txt-focus);--contour-color: var(--border-color-focus);--contour-border-width: 2px;--contour-box-shadow: 0 0 0 4px var(--border-color-focus-shadow)}.pl-file-input:focus-within.error{--contour-border-width: 2px;--contour-box-shadow: 0 0 0 4px var(--color-error-shadow)}.pl-file-input.dashed .pl-file-input__contour{border-style:dashed}.pl-file-input.nonEmpty{--prefix-color: var(--txt-01)}.pl-file-input.error{--contour-color: var(--txt-error);--label-color: var(--txt-error);--text-color: var(--txt-error);--icon-color: var(--txt-error)}.pl-file-input.error .pl-file-input__progress{display:none}.pl-file-input.disabled{--contour-color: var(--color-dis-01);cursor:not-allowed}.pl-file-input__cell-style{--border-radius-control: 0px;--input-active-color: var(--bg-base-light);--border-color: var(--border-color-div-grey);background-color:var(--input-active-color);padding:4px;height:100%;position:relative}.pl-file-input__cell-style .mask-paper-clip{display:none}.pl-file-input__cell-style .pl-file-input{height:100%!important;position:unset}.pl-file-input__cell-style .pl-file-input .double-contour{top:2px;right:2px;bottom:2px;left:2px}.pl-file-input__cell-style .pl-file-input__contour{border-width:1px;box-shadow:unset!important;border-color:var(--border-color);border-style:dashed}.pl-file-input__cell-style .pl-file-input__filename{text-align:center!important}.pl-file-input__cell-style .pl-file-input__error{margin-top:0;margin-right:8px}.pl-file-input__cell-style:hover{--border-color: var(--border-color-focus);background-color:#d9f8ca}.pl-file-input__cell-style:hover .pl-file-input__filename:before{color:#110529!important}.pl-file-input__cell-style.has-file:hover{background-color:var(--input-active-color)}.pl-file-input__cell-style.has-file{padding-left:0;padding-right:0}.pl-file-input__cell-style.has-file .pl-file-input__contour{border:unset}.pl-file-input__cell-style.has-file .pl-file-input__filename{text-align:left!important}.pl-file-input__cell-style.has-file .mask-paper-clip{display:block}
2
+ .double-contour.top>div{border-bottom-right-radius:0;border-bottom-left-radius:0}.double-contour.bottom>div{border-top-right-radius:0;border-top-left-radius:0}.double-contour.left>div{border-top-right-radius:0;border-bottom-right-radius:0}.double-contour.right>div{border-top-left-radius:0;border-bottom-left-radius:0}.double-contour.top-left>div{border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.double-contour.top-right>div{border-bottom-right-radius:0;border-top-left-radius:0;border-top-right-radius:0}.double-contour.bottom-left>div{border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:0}.double-contour.bottom-right>div{border-top-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.double-contour.middle>div{border-radius:0}`)),document.head.appendChild(o)}}catch(r){console.error("vite-plugin-css-injected-by-js",r)}})();
3
+ import { defineComponent as I, reactive as $, useSlots as q, computed as s, watch as R, ref as U, createElementBlock as u, openBlock as t, Fragment as x, createElementVNode as f, createVNode as B, normalizeClass as O, createCommentVNode as d, withModifiers as F, 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";
3
4
 
4
- import { prettyBytes as y } from "@milaboratories/helpers";
5
- import { getFileNameFromHandle as G, getFilePathFromHandle as J } from "@platforma-sdk/model";
6
- import { getErrorMessage as Q } from "../../helpers/error.js";
7
- import W from "../../utils/DoubleContour.vue.js";
8
- import { useLabelNotch as X } from "../../utils/useLabelNotch.js";
9
- import Y from "../PlFileDialog/PlFileDialog.vue.js";
10
- import f from "../PlIcon24/PlIcon24.vue.js";
11
- import Z from "../PlTooltip/PlTooltip.vue.js";
12
- import x from "../../assets/images/required.svg.js";
5
+ import { prettyBytes as g } from "@milaboratories/helpers";
6
+ import { getFileNameFromHandle as A, getFilePathFromHandle as G } from "@platforma-sdk/model";
7
+ import { getErrorMessage as J } from "../../helpers/error.js";
8
+ import Q from "../../utils/DoubleContour.vue.js";
9
+
10
+ import { useLabelNotch as W } from "../../utils/useLabelNotch.js";
11
+ import X from "../PlFileDialog/PlFileDialog.vue.js";
12
+ import m from "../PlIcon24/PlIcon24.vue.js";
13
+ import Y from "../PlTooltip/PlTooltip.vue.js";
14
+ import Z from "../../assets/images/required.svg.js";
13
15
  import ee from "../PlSvg/PlSvg.vue.js";
14
16
  const le = {
15
17
  key: 0,
16
18
  ref: "label"
17
- }, oe = ["data-placeholder"], te = {
19
+ }, te = ["data-placeholder"], oe = {
18
20
  key: 5,
19
21
  class: "pl-file-input__stats"
20
22
  }, re = {
21
23
  key: 0,
22
24
  class: "pl-file-input__error"
23
- }, se = {
25
+ }, ie = {
24
26
  key: 1,
25
27
  class: "pl-file-input__helper"
26
- }, he = /* @__PURE__ */ q({
28
+ }, ke = /* @__PURE__ */ I({
27
29
  __name: "PlFileInput",
28
30
  props: {
29
31
  modelValue: {},
@@ -40,112 +42,112 @@ const le = {
40
42
  fileDialogCloseOnOutsideClick: { type: Boolean, default: !0 }
41
43
  },
42
44
  emits: ["update:modelValue"],
43
- setup(N, { emit: P }) {
44
- const a = R({
45
+ setup(l, { emit: N }) {
46
+ const n = $({
45
47
  fileDialogOpen: !1,
46
48
  error: void 0
47
- }), g = U(), v = P, o = N, h = (e, r) => {
49
+ }), v = q(), h = N, o = l, k = (e, i) => {
48
50
  if (e)
49
51
  try {
50
- return r(e);
51
- } catch (d) {
52
- return a.error = d instanceof Error ? d.message : String(d), e;
52
+ return i(e);
53
+ } catch (p) {
54
+ return n.error = p instanceof Error ? p.message : String(p), e;
53
55
  }
54
- }, k = s(() => h(o.modelValue, G)), _ = s(() => h(o.modelValue, J)), E = s(() => o.progress && !o.progress.done), T = s(() => o.progress && o.progress.done), V = s(() => Q(a.error, o.error)), m = s(() => typeof V.value == "string"), b = s(() => {
55
- const { status: e, done: r } = o.progress ?? {};
56
- return !e || !e.bytesTotal ? "" : e.bytesProcessed && !r ? y(e.bytesProcessed, {}) + " / " + y(e.bytesTotal, {}) : y(e.bytesTotal, {});
57
- }), w = s(() => {
58
- var r;
56
+ }, V = s(() => k(o.modelValue, A)), S = s(() => k(o.modelValue, G)), P = s(() => o.progress && !o.progress.done), E = s(() => o.progress && o.progress.done), _ = s(() => J(n.error, o.error)), y = s(() => typeof _.value == "string"), b = s(() => {
57
+ const { status: e, done: i } = o.progress ?? {};
58
+ return !e || !e.bytesTotal ? "" : e.bytesProcessed && !i ? g(e.bytesProcessed, {}) + " / " + g(e.bytesTotal, {}) : g(e.bytesTotal, {});
59
+ }), T = s(() => {
60
+ var i;
59
61
  const { progress: e } = o;
60
62
  return e ? {
61
- width: e.done ? "100%" : Math.round((((r = e.status) == null ? void 0 : r.progress) ?? 0) * 100) + "%"
63
+ width: e.done ? "100%" : Math.round((((i = e.status) == null ? void 0 : i.progress) ?? 0) * 100) + "%"
62
64
  } : {};
63
- }), S = () => {
64
- a.fileDialogOpen = !0;
65
- }, M = (e) => {
66
- e.files.length && v("update:modelValue", e.files[0]);
67
- }, I = () => v("update:modelValue", void 0);
68
- $(
65
+ }), C = () => {
66
+ n.fileDialogOpen = !0;
67
+ }, w = (e) => {
68
+ e.files.length && h("update:modelValue", e.files[0]);
69
+ }, M = () => h("update:modelValue", void 0);
70
+ R(
69
71
  () => o.modelValue,
70
- () => a.error = void 0,
72
+ () => n.error = void 0,
71
73
  { immediate: !0 }
72
74
  );
73
- const C = z();
74
- return o.cellStyle || X(C), (e, r) => (l(), n(D, null, [
75
- c("div", {
76
- class: O([{ "pl-file-input__cell-style": !!e.cellStyle, "has-file": !!k.value }, "pl-file-input__envelope"])
75
+ const D = U();
76
+ return o.cellStyle || W(D), (e, i) => (t(), u(x, null, [
77
+ f("div", {
78
+ class: O([{ "pl-file-input__cell-style": !!l.cellStyle, "has-file": !!V.value }, "pl-file-input__envelope"])
77
79
  }, [
78
- c("div", {
80
+ f("div", {
79
81
  ref_key: "rootRef",
80
- ref: C,
81
- class: O([{ dashed: e.dashed, error: m.value }, "pl-file-input"]),
82
+ ref: D,
83
+ class: O([{ dashed: l.dashed, error: y.value }, "pl-file-input"]),
82
84
  tabindex: "0",
83
- onKeyup: H(S, ["enter"]),
84
- onClick: F(S, ["stop"])
85
+ onKeyup: z(C, ["enter"]),
86
+ onClick: F(C, ["stop"])
85
87
  }, [
86
- c("div", {
87
- style: K(w.value),
88
+ f("div", {
89
+ style: H(T.value),
88
90
  class: "pl-file-input__progress"
89
91
  }, null, 4),
90
- !e.cellStyle && e.label ? (l(), n("label", le, [
91
- e.required ? (l(), i(t(ee), {
92
+ !l.cellStyle && l.label ? (t(), u("label", le, [
93
+ l.required ? (t(), a(r(ee), {
92
94
  key: 0,
93
- uri: t(x)
94
- }, null, 8, ["uri"])) : u("", !0),
95
- c("span", null, p(e.label), 1),
96
- t(g).tooltip || _.value ? (l(), i(t(Z), {
95
+ uri: r(Z)
96
+ }, null, 8, ["uri"])) : d("", !0),
97
+ f("span", null, c(l.label), 1),
98
+ r(v).tooltip || S.value ? (t(), a(r(Y), {
97
99
  key: 1,
98
100
  class: "info",
99
101
  position: "top"
100
102
  }, {
101
- tooltip: L(() => [
102
- t(g).tooltip ? j(e.$slots, "tooltip", { key: 0 }) : (l(), n(D, { key: 1 }, [
103
- A(p(_.value), 1)
103
+ tooltip: K(() => [
104
+ r(v).tooltip ? L(e.$slots, "tooltip", { key: 0 }) : (t(), u(x, { key: 1 }, [
105
+ j(c(S.value), 1)
104
106
  ], 64))
105
107
  ]),
106
108
  _: 3
107
- })) : u("", !0)
108
- ], 512)) : u("", !0),
109
- m.value ? (l(), i(t(f), {
109
+ })) : d("", !0)
110
+ ], 512)) : d("", !0),
111
+ y.value ? (t(), a(r(m), {
110
112
  key: 1,
111
113
  name: "restart"
112
- })) : E.value ? (l(), i(t(f), {
114
+ })) : P.value ? (t(), a(r(m), {
113
115
  key: 2,
114
116
  name: "cloud-upload"
115
- })) : T.value ? (l(), i(t(f), {
117
+ })) : E.value ? (t(), a(r(m), {
116
118
  key: 3,
117
119
  name: "success"
118
- })) : (l(), i(t(f), {
120
+ })) : (t(), a(r(m), {
119
121
  key: 4,
120
122
  name: "paper-clip"
121
123
  })),
122
- c("div", {
123
- "data-placeholder": e.placeholder ?? "Choose file",
124
+ f("div", {
125
+ "data-placeholder": l.placeholder ?? "Choose file",
124
126
  class: "pl-file-input__filename"
125
- }, p(k.value), 9, oe),
126
- b.value ? (l(), n("div", te, p(b.value), 1)) : u("", !0),
127
- e.modelValue ? (l(), i(t(f), {
127
+ }, c(V.value), 9, te),
128
+ b.value ? (t(), u("div", oe, c(b.value), 1)) : d("", !0),
129
+ l.modelValue ? (t(), a(r(m), {
128
130
  key: 6,
129
131
  class: "pl-file-input__clear",
130
132
  name: "close",
131
- onClick: F(I, ["stop"])
132
- })) : u("", !0),
133
- B(W, { class: "pl-file-input__contour" })
133
+ onClick: F(M, ["stop"])
134
+ })) : d("", !0),
135
+ B(Q, { class: "pl-file-input__contour" })
134
136
  ], 34),
135
- m.value ? (l(), n("div", re, p(V.value), 1)) : e.helper ? (l(), n("div", se, p(e.helper), 1)) : u("", !0)
137
+ y.value ? (t(), u("div", re, c(_.value), 1)) : l.helper ? (t(), u("div", ie, c(l.helper), 1)) : d("", !0)
136
138
  ], 2),
137
- B(t(Y), {
138
- modelValue: a.fileDialogOpen,
139
- "onUpdate:modelValue": r[0] || (r[0] = (d) => a.fileDialogOpen = d),
140
- "close-on-outside-click": e.fileDialogCloseOnOutsideClick,
141
- extensions: e.extensions,
142
- title: e.fileDialogTitle,
143
- "onImport:files": M
139
+ B(r(X), {
140
+ modelValue: n.fileDialogOpen,
141
+ "onUpdate:modelValue": i[0] || (i[0] = (p) => n.fileDialogOpen = p),
142
+ "close-on-outside-click": l.fileDialogCloseOnOutsideClick,
143
+ extensions: l.extensions,
144
+ title: l.fileDialogTitle,
145
+ "onImport:files": w
144
146
  }, null, 8, ["modelValue", "close-on-outside-click", "extensions", "title"])
145
147
  ], 64));
146
148
  }
147
149
  });
148
150
  export {
149
- he as default
151
+ ke as default
150
152
  };
151
153
  //# sourceMappingURL=PlFileInput.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlFileInput.vue.js","sources":["../../../src/components/PlFileInput/PlFileInput.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './pl-file-input.scss';\n\nimport { prettyBytes } from '@milaboratories/helpers';\nimport type { ImportFileHandle, ImportProgress } from '@platforma-sdk/model';\nimport { getFileNameFromHandle, getFilePathFromHandle } from '@platforma-sdk/model';\nimport { computed, reactive, ref, useSlots, watch } from 'vue';\nimport { getErrorMessage } from '../../helpers/error.ts';\nimport type { ImportedFiles } from '../../types';\nimport DoubleContour from '../../utils/DoubleContour.vue';\nimport { useLabelNotch } from '../../utils/useLabelNotch';\nimport { PlFileDialog } from '../PlFileDialog';\nimport { PlMaskIcon24 } from '../PlMaskIcon24';\nimport { PlTooltip } from '../PlTooltip';\n\nimport SvgRequired from '../../assets/images/required.svg?raw';\nimport { PlSvg } from '../PlSvg';\n\nconst data = reactive({\n fileDialogOpen: false,\n error: undefined as undefined | string,\n});\n\nconst slots = useSlots();\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: ImportFileHandle | undefined): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The current import file handle.\n */\n modelValue: ImportFileHandle | undefined;\n /**\n * The label to display above the input field.\n */\n label?: string;\n /**\n * If `true`, the input field is marked as required.\n */\n required?: boolean;\n /**\n * If `true`, the component border is dashed.\n */\n dashed?: boolean;\n /**\n * Allowed file extensions (should start with `.`)\n */\n extensions?: string[];\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Import/Upload progress\n */\n progress?: ImportProgress;\n /**\n * An error message to display below the input field.\n */\n error?: unknown;\n /**\n * A helper text to display below the input field when there are no errors.\n */\n helper?: string;\n /**\n * Remove rounded border and change styles\n */\n cellStyle?: boolean;\n /**\n * File dialog title\n */\n fileDialogTitle?: string;\n /**\n * If `true`, the file dialog window closes when clicking outside the modal area (default: `true`)\n */\n fileDialogCloseOnOutsideClick?: boolean;\n }>(),\n {\n label: undefined,\n extensions: undefined,\n fileDialogTitle: undefined,\n placeholder: undefined,\n progress: undefined,\n error: undefined,\n helper: undefined,\n cellStyle: false,\n fileDialogCloseOnOutsideClick: true,\n },\n);\n\nconst tryValue = <T extends ImportFileHandle>(v: T | undefined, cb: (v: T) => string | undefined) => {\n if (!v) {\n return undefined;\n }\n\n try {\n return cb(v);\n } catch (err) {\n data.error = err instanceof Error ? err.message : String(err);\n return v;\n }\n};\n\nconst fileName = computed(() => tryValue(props.modelValue, getFileNameFromHandle));\n\nconst filePath = computed(() => tryValue(props.modelValue, getFilePathFromHandle));\n\nconst isUploading = computed(() => props.progress && !props.progress.done);\n\nconst isUploaded = computed(() => props.progress && props.progress.done);\n\nconst computedErrorMessage = computed(() => getErrorMessage(data.error, props.error));\n\nconst hasErrors = computed(() => typeof computedErrorMessage.value === 'string');\n\nconst uploadStats = computed(() => {\n const { status, done } = props.progress ?? {};\n\n if (!status || !status.bytesTotal) {\n return '';\n }\n\n if (status.bytesProcessed && !done) {\n return prettyBytes(status.bytesProcessed, {}) + ' / ' + prettyBytes(status.bytesTotal, {});\n }\n\n return prettyBytes(status.bytesTotal, {});\n});\n\nconst progressStyle = computed(() => {\n const { progress } = props;\n\n if (!progress) {\n return {};\n }\n\n return {\n width: progress.done ? '100%' : Math.round((progress.status?.progress ?? 0) * 100) + '%',\n };\n});\n\nconst openFileDialog = () => {\n data.fileDialogOpen = true;\n};\n\nconst onImport = (v: ImportedFiles) => {\n if (v.files.length) {\n emit('update:modelValue', v.files[0]);\n }\n};\n\nconst clear = () => emit('update:modelValue', undefined);\n\nwatch(\n () => props.modelValue,\n () => (data.error = undefined),\n { immediate: true },\n);\n\nconst rootRef = ref();\n\nif (!props.cellStyle) {\n useLabelNotch(rootRef);\n}\n</script>\n\n<template>\n <div :class=\"{ 'pl-file-input__cell-style': !!cellStyle, 'has-file': !!fileName }\" class=\"pl-file-input__envelope\">\n <div\n ref=\"rootRef\"\n :class=\"{ dashed, error: hasErrors }\"\n class=\"pl-file-input\"\n tabindex=\"0\"\n @keyup.enter=\"openFileDialog\"\n @click.stop=\"openFileDialog\"\n >\n <div :style=\"progressStyle\" class=\"pl-file-input__progress\" />\n <label v-if=\"!cellStyle && label\" ref=\"label\">\n <PlSvg v-if=\"required\" :uri=\"SvgRequired\" />\n <span>{{ label }}</span>\n <PlTooltip v-if=\"slots.tooltip || filePath\" class=\"info\" position=\"top\">\n <template #tooltip>\n <slot v-if=\"slots.tooltip\" name=\"tooltip\" />\n <template v-else>{{ filePath }}</template>\n </template>\n </PlTooltip>\n </label>\n <PlMaskIcon24 v-if=\"hasErrors\" name=\"restart\" />\n <PlMaskIcon24 v-else-if=\"isUploading\" name=\"cloud-upload\" />\n <PlMaskIcon24 v-else-if=\"isUploaded\" name=\"success\" />\n <PlMaskIcon24 v-else name=\"paper-clip\" />\n <div :data-placeholder=\"placeholder ?? 'Choose file'\" class=\"pl-file-input__filename\">\n {{ fileName }}\n </div>\n <div v-if=\"uploadStats\" class=\"pl-file-input__stats\">{{ uploadStats }}</div>\n <PlMaskIcon24 v-if=\"modelValue\" class=\"pl-file-input__clear\" name=\"close\" @click.stop=\"clear\" />\n <DoubleContour class=\"pl-file-input__contour\" />\n </div>\n <div v-if=\"hasErrors\" class=\"pl-file-input__error\">\n {{ computedErrorMessage }}\n </div>\n <div v-else-if=\"helper\" class=\"pl-file-input__helper\">{{ helper }}</div>\n </div>\n <PlFileDialog\n v-model=\"data.fileDialogOpen\"\n :close-on-outside-click=\"fileDialogCloseOnOutsideClick\"\n :extensions=\"extensions\"\n :title=\"fileDialogTitle\"\n @import:files=\"onImport\"\n />\n</template>\n"],"names":["data","reactive","slots","useSlots","emit","__emit","props","__props","tryValue","v","cb","err","fileName","computed","getFileNameFromHandle","filePath","getFilePathFromHandle","isUploading","isUploaded","computedErrorMessage","getErrorMessage","hasErrors","uploadStats","status","done","prettyBytes","progressStyle","progress","_a","openFileDialog","onImport","clear","watch","rootRef","ref","useLabelNotch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,UAAMA,IAAOC,EAAS;AAAA,MACpB,gBAAgB;AAAA,MAChB,OAAO;AAAA,IAAA,CACR,GAEKC,IAAQC,EAAA,GAERC,IAAOC,GAIPC,IAAQC,GAgERC,IAAW,CAA6BC,GAAkBC,MAAqC;AACnG,UAAKD;AAIL,YAAI;AACF,iBAAOC,EAAGD,CAAC;AAAA,QACb,SAASE,GAAK;AACZ,iBAAAX,EAAK,QAAQW,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GACrDF;AAAA,QACT;AAAA,IACF,GAEMG,IAAWC,EAAS,MAAML,EAASF,EAAM,YAAYQ,CAAqB,CAAC,GAE3EC,IAAWF,EAAS,MAAML,EAASF,EAAM,YAAYU,CAAqB,CAAC,GAE3EC,IAAcJ,EAAS,MAAMP,EAAM,YAAY,CAACA,EAAM,SAAS,IAAI,GAEnEY,IAAaL,EAAS,MAAMP,EAAM,YAAYA,EAAM,SAAS,IAAI,GAEjEa,IAAuBN,EAAS,MAAMO,EAAgBpB,EAAK,OAAOM,EAAM,KAAK,CAAC,GAE9Ee,IAAYR,EAAS,MAAM,OAAOM,EAAqB,SAAU,QAAQ,GAEzEG,IAAcT,EAAS,MAAM;AACjC,YAAM,EAAE,QAAAU,GAAQ,MAAAC,EAAA,IAASlB,EAAM,YAAY,CAAA;AAE3C,aAAI,CAACiB,KAAU,CAACA,EAAO,aACd,KAGLA,EAAO,kBAAkB,CAACC,IACrBC,EAAYF,EAAO,gBAAgB,CAAA,CAAE,IAAI,QAAQE,EAAYF,EAAO,YAAY,EAAE,IAGpFE,EAAYF,EAAO,YAAY,EAAE;AAAA,IAC1C,CAAC,GAEKG,IAAgBb,EAAS,MAAM;;AACnC,YAAM,EAAE,UAAAc,MAAarB;AAErB,aAAKqB,IAIE;AAAA,QACL,OAAOA,EAAS,OAAO,SAAS,KAAK,SAAOC,IAAAD,EAAS,WAAT,gBAAAC,EAAiB,aAAY,KAAK,GAAG,IAAI;AAAA,MAAA,IAJ9E,CAAA;AAAA,IAMX,CAAC,GAEKC,IAAiB,MAAM;AAC3B,MAAA7B,EAAK,iBAAiB;AAAA,IACxB,GAEM8B,IAAW,CAACrB,MAAqB;AACrC,MAAIA,EAAE,MAAM,UACVL,EAAK,qBAAqBK,EAAE,MAAM,CAAC,CAAC;AAAA,IAExC,GAEMsB,IAAQ,MAAM3B,EAAK,qBAAqB,MAAS;AAEvD,IAAA4B;AAAA,MACE,MAAM1B,EAAM;AAAA,MACZ,MAAON,EAAK,QAAQ;AAAA,MACpB,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMiC,IAAUC,EAAA;AAEhB,WAAK5B,EAAM,aACT6B,EAAcF,CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"PlFileInput.vue.js","sources":["../../../src/components/PlFileInput/PlFileInput.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport './pl-file-input.scss';\n\nimport { prettyBytes } from '@milaboratories/helpers';\nimport type { ImportFileHandle, ImportProgress } from '@platforma-sdk/model';\nimport { getFileNameFromHandle, getFilePathFromHandle } from '@platforma-sdk/model';\nimport { computed, reactive, ref, useSlots, watch } from 'vue';\nimport { getErrorMessage } from '../../helpers/error.ts';\nimport type { ImportedFiles } from '../../types';\nimport DoubleContour from '../../utils/DoubleContour.vue';\nimport { useLabelNotch } from '../../utils/useLabelNotch';\nimport { PlFileDialog } from '../PlFileDialog';\nimport { PlMaskIcon24 } from '../PlMaskIcon24';\nimport { PlTooltip } from '../PlTooltip';\n\nimport SvgRequired from '../../assets/images/required.svg?raw';\nimport { PlSvg } from '../PlSvg';\n\nconst data = reactive({\n fileDialogOpen: false,\n error: undefined as undefined | string,\n});\n\nconst slots = useSlots();\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: ImportFileHandle | undefined): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n /**\n * The current import file handle.\n */\n modelValue: ImportFileHandle | undefined;\n /**\n * The label to display above the input field.\n */\n label?: string;\n /**\n * If `true`, the input field is marked as required.\n */\n required?: boolean;\n /**\n * If `true`, the component border is dashed.\n */\n dashed?: boolean;\n /**\n * Allowed file extensions (should start with `.`)\n */\n extensions?: string[];\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Import/Upload progress\n */\n progress?: ImportProgress;\n /**\n * An error message to display below the input field.\n */\n error?: unknown;\n /**\n * A helper text to display below the input field when there are no errors.\n */\n helper?: string;\n /**\n * Remove rounded border and change styles\n */\n cellStyle?: boolean;\n /**\n * File dialog title\n */\n fileDialogTitle?: string;\n /**\n * If `true`, the file dialog window closes when clicking outside the modal area (default: `true`)\n */\n fileDialogCloseOnOutsideClick?: boolean;\n }>(),\n {\n label: undefined,\n extensions: undefined,\n fileDialogTitle: undefined,\n placeholder: undefined,\n progress: undefined,\n error: undefined,\n helper: undefined,\n cellStyle: false,\n fileDialogCloseOnOutsideClick: true,\n },\n);\n\nconst tryValue = <T extends ImportFileHandle>(v: T | undefined, cb: (v: T) => string | undefined) => {\n if (!v) {\n return undefined;\n }\n\n try {\n return cb(v);\n } catch (err) {\n data.error = err instanceof Error ? err.message : String(err);\n return v;\n }\n};\n\nconst fileName = computed(() => tryValue(props.modelValue, getFileNameFromHandle));\n\nconst filePath = computed(() => tryValue(props.modelValue, getFilePathFromHandle));\n\nconst isUploading = computed(() => props.progress && !props.progress.done);\n\nconst isUploaded = computed(() => props.progress && props.progress.done);\n\nconst computedErrorMessage = computed(() => getErrorMessage(data.error, props.error));\n\nconst hasErrors = computed(() => typeof computedErrorMessage.value === 'string');\n\nconst uploadStats = computed(() => {\n const { status, done } = props.progress ?? {};\n\n if (!status || !status.bytesTotal) {\n return '';\n }\n\n if (status.bytesProcessed && !done) {\n return prettyBytes(status.bytesProcessed, {}) + ' / ' + prettyBytes(status.bytesTotal, {});\n }\n\n return prettyBytes(status.bytesTotal, {});\n});\n\nconst progressStyle = computed(() => {\n const { progress } = props;\n\n if (!progress) {\n return {};\n }\n\n return {\n width: progress.done ? '100%' : Math.round((progress.status?.progress ?? 0) * 100) + '%',\n };\n});\n\nconst openFileDialog = () => {\n data.fileDialogOpen = true;\n};\n\nconst onImport = (v: ImportedFiles) => {\n if (v.files.length) {\n emit('update:modelValue', v.files[0]);\n }\n};\n\nconst clear = () => emit('update:modelValue', undefined);\n\nwatch(\n () => props.modelValue,\n () => (data.error = undefined),\n { immediate: true },\n);\n\nconst rootRef = ref();\n\nif (!props.cellStyle) {\n useLabelNotch(rootRef);\n}\n</script>\n\n<template>\n <div :class=\"{ 'pl-file-input__cell-style': !!cellStyle, 'has-file': !!fileName }\" class=\"pl-file-input__envelope\">\n <div\n ref=\"rootRef\"\n :class=\"{ dashed, error: hasErrors }\"\n class=\"pl-file-input\"\n tabindex=\"0\"\n @keyup.enter=\"openFileDialog\"\n @click.stop=\"openFileDialog\"\n >\n <div :style=\"progressStyle\" class=\"pl-file-input__progress\" />\n <label v-if=\"!cellStyle && label\" ref=\"label\">\n <PlSvg v-if=\"required\" :uri=\"SvgRequired\" />\n <span>{{ label }}</span>\n <PlTooltip v-if=\"slots.tooltip || filePath\" class=\"info\" position=\"top\">\n <template #tooltip>\n <slot v-if=\"slots.tooltip\" name=\"tooltip\" />\n <template v-else>{{ filePath }}</template>\n </template>\n </PlTooltip>\n </label>\n <PlMaskIcon24 v-if=\"hasErrors\" name=\"restart\" />\n <PlMaskIcon24 v-else-if=\"isUploading\" name=\"cloud-upload\" />\n <PlMaskIcon24 v-else-if=\"isUploaded\" name=\"success\" />\n <PlMaskIcon24 v-else name=\"paper-clip\" />\n <div :data-placeholder=\"placeholder ?? 'Choose file'\" class=\"pl-file-input__filename\">\n {{ fileName }}\n </div>\n <div v-if=\"uploadStats\" class=\"pl-file-input__stats\">{{ uploadStats }}</div>\n <PlMaskIcon24 v-if=\"modelValue\" class=\"pl-file-input__clear\" name=\"close\" @click.stop=\"clear\" />\n <DoubleContour class=\"pl-file-input__contour\" />\n </div>\n <div v-if=\"hasErrors\" class=\"pl-file-input__error\">\n {{ computedErrorMessage }}\n </div>\n <div v-else-if=\"helper\" class=\"pl-file-input__helper\">{{ helper }}</div>\n </div>\n <PlFileDialog\n v-model=\"data.fileDialogOpen\"\n :close-on-outside-click=\"fileDialogCloseOnOutsideClick\"\n :extensions=\"extensions\"\n :title=\"fileDialogTitle\"\n @import:files=\"onImport\"\n />\n</template>\n"],"names":["data","reactive","slots","useSlots","emit","__emit","props","__props","tryValue","v","cb","err","fileName","computed","getFileNameFromHandle","filePath","getFilePathFromHandle","isUploading","isUploaded","computedErrorMessage","getErrorMessage","hasErrors","uploadStats","status","done","prettyBytes","progressStyle","progress","_a","openFileDialog","onImport","clear","watch","rootRef","ref","useLabelNotch","_createElementVNode","_normalizeClass","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","PlSvg","SvgRequired","PlTooltip","_renderSlot","_ctx","_Fragment","PlMaskIcon24","_hoisted_2","_hoisted_3","_toDisplayString","_createVNode","DoubleContour","_hoisted_4","_hoisted_5","PlFileDialog","_cache","$event"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,UAAMA,IAAOC,EAAS;AAAA,MACpB,gBAAgB;AAAA,MAChB,OAAO;AAAA,IAAA,CACR,GAEKC,IAAQC,EAAA,GAERC,IAAOC,GAIPC,IAAQC,GAgERC,IAAW,CAA6BC,GAAkBC,MAAqC;AACnG,UAAKD;AAIL,YAAI;AACF,iBAAOC,EAAGD,CAAC;AAAA,QACb,SAASE,GAAK;AACZ,iBAAAX,EAAK,QAAQW,aAAe,QAAQA,EAAI,UAAU,OAAOA,CAAG,GACrDF;AAAA,QACT;AAAA,IACF,GAEMG,IAAWC,EAAS,MAAML,EAASF,EAAM,YAAYQ,CAAqB,CAAC,GAE3EC,IAAWF,EAAS,MAAML,EAASF,EAAM,YAAYU,CAAqB,CAAC,GAE3EC,IAAcJ,EAAS,MAAMP,EAAM,YAAY,CAACA,EAAM,SAAS,IAAI,GAEnEY,IAAaL,EAAS,MAAMP,EAAM,YAAYA,EAAM,SAAS,IAAI,GAEjEa,IAAuBN,EAAS,MAAMO,EAAgBpB,EAAK,OAAOM,EAAM,KAAK,CAAC,GAE9Ee,IAAYR,EAAS,MAAM,OAAOM,EAAqB,SAAU,QAAQ,GAEzEG,IAAcT,EAAS,MAAM;AACjC,YAAM,EAAE,QAAAU,GAAQ,MAAAC,EAAA,IAASlB,EAAM,YAAY,CAAA;AAE3C,aAAI,CAACiB,KAAU,CAACA,EAAO,aACd,KAGLA,EAAO,kBAAkB,CAACC,IACrBC,EAAYF,EAAO,gBAAgB,CAAA,CAAE,IAAI,QAAQE,EAAYF,EAAO,YAAY,EAAE,IAGpFE,EAAYF,EAAO,YAAY,EAAE;AAAA,IAC1C,CAAC,GAEKG,IAAgBb,EAAS,MAAM;;AACnC,YAAM,EAAE,UAAAc,MAAarB;AAErB,aAAKqB,IAIE;AAAA,QACL,OAAOA,EAAS,OAAO,SAAS,KAAK,SAAOC,IAAAD,EAAS,WAAT,gBAAAC,EAAiB,aAAY,KAAK,GAAG,IAAI;AAAA,MAAA,IAJ9E,CAAA;AAAA,IAMX,CAAC,GAEKC,IAAiB,MAAM;AAC3B,MAAA7B,EAAK,iBAAiB;AAAA,IACxB,GAEM8B,IAAW,CAACrB,MAAqB;AACrC,MAAIA,EAAE,MAAM,UACVL,EAAK,qBAAqBK,EAAE,MAAM,CAAC,CAAC;AAAA,IAExC,GAEMsB,IAAQ,MAAM3B,EAAK,qBAAqB,MAAS;AAEvD,IAAA4B;AAAA,MACE,MAAM1B,EAAM;AAAA,MACZ,MAAON,EAAK,QAAQ;AAAA,MACpB,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAMiC,IAAUC,EAAA;AAEhB,WAAK5B,EAAM,aACT6B,EAAcF,CAAO;MAKrBG,EAmCM,OAAA;AAAA,QAnCA,OAAKC,EAAA,CAAA,EAAA,6BAAA,CAAA,CAAmC9B,EAAA,WAAS,YAAA,CAAA,CAAgBK,EAAA,MAAA,GAAkB,yBAAyB,CAAA;AAAA,MAAA;QAChHwB,EA6BM,OAAA;AAAA,mBA5BA;AAAA,UAAJ,KAAIH;AAAA,UACH,OAAKI,EAAA,CAAA,EAAA,QAAI9B,EAAA,QAAM,OAASc,EAAA,MAAA,GACnB,eAAe,CAAA;AAAA,UACrB,UAAS;AAAA,UACR,WAAaQ,GAAc,CAAA,OAAA,CAAA;AAAA,UAC3B,WAAYA,GAAc,CAAA,MAAA,CAAA;AAAA,QAAA;UAE3BO,EAA8D,OAAA;AAAA,YAAxD,SAAOV,EAAA,KAAa;AAAA,YAAE,OAAM;AAAA,UAAA;UACpB,CAAAnB,EAAA,aAAaA,EAAA,SAA3B+B,KAAAC,EASQ,SATRC,IASQ;AAAA,YAROjC,EAAA,iBAAbkC,EAA4CC,EAAAC,EAAA,GAAA;AAAA;cAApB,KAAKD,EAAAE,CAAA;AAAA,YAAA;YAC7BR,EAAwB,gBAAf7B,EAAA,KAAK,GAAA,CAAA;AAAA,YACGmC,EAAAxC,CAAA,EAAM,WAAWa,EAAA,cAAlC0B,EAKYC,EAAAG,CAAA,GAAA;AAAA;cALgC,OAAM;AAAA,cAAO,UAAS;AAAA,YAAA;cACrD,WACT,MAA4C;AAAA,gBAAhCH,EAAAxC,CAAA,EAAM,UAAlB4C,EAA4CC,EAAA,QAAA,WAAA,EAAA,KAAA,GAAA,UAC5CR,EAA0CS,GAAA,EAAA,KAAA,KAAA;AAAA,sBAAtBjC,EAAA,KAAQ,GAAA,CAAA;AAAA,gBAAA;;;;;UAIdM,EAAA,cAApBoB,EAAgDC,EAAAO,CAAA,GAAA;AAAA;YAAjB,MAAK;AAAA,UAAA,MACXhC,EAAA,cAAzBwB,EAA4DC,EAAAO,CAAA,GAAA;AAAA;YAAtB,MAAK;AAAA,UAAA,MAClB/B,EAAA,cAAzBuB,EAAsDC,EAAAO,CAAA,GAAA;AAAA;YAAjB,MAAK;AAAA,UAAA,YAC1CR,EAAyCC,EAAAO,CAAA,GAAA;AAAA;YAApB,MAAK;AAAA,UAAA;UAC1Bb,EAEM,OAAA;AAAA,YAFA,oBAAkB7B,EAAA,eAAW;AAAA,YAAmB,OAAM;AAAA,UAAA,KACvDK,EAAA,KAAQ,GAAA,GAAAsC,EAAA;AAAA,UAEF5B,EAAA,cAAXiB,EAA4E,OAA5EY,IAA4EC,EAApB9B,EAAA,KAAW,GAAA,CAAA;UAC/Cf,EAAA,mBAApBkC,EAAgGC,EAAAO,CAAA,GAAA;AAAA;YAAhE,OAAM;AAAA,YAAuB,MAAK;AAAA,YAAS,WAAYlB,GAAK,CAAA,MAAA,CAAA;AAAA,UAAA;UAC5FsB,EAAgDC,GAAA,EAAjC,OAAM,0BAAwB;AAAA,QAAA;QAEpCjC,EAAA,cAAXkB,EAEM,OAFNgB,IAEMH,EADDjC,EAAA,KAAoB,GAAA,CAAA,KAETZ,EAAA,eAAhBgC,EAAwE,OAAxEiB,IAAwEJ,EAAf7C,EAAA,MAAM,GAAA,CAAA;;MAEjE8C,EAMEX,EAAAe,CAAA,GAAA;AAAA,QALS,YAAAzD,EAAK;AAAA,QAAL,uBAAA0D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAA3D,EAAK,iBAAc2D;AAAA,QAC3B,0BAAwBpD,EAAA;AAAA,QACxB,YAAYA,EAAA;AAAA,QACZ,OAAOA,EAAA;AAAA,QACP,kBAAcuB;AAAA,MAAA;;;;"}