@milaboratories/uikit 2.15.36 → 2.15.38

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 (457) hide show
  1. package/.turbo/turbo-build.log +175 -175
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +12 -0
  6. package/dist/__tests__/default-testid.test.d.ts +2 -0
  7. package/dist/__tests__/default-testid.test.d.ts.map +1 -0
  8. package/dist/base/BtnBase.js.map +1 -1
  9. package/dist/base/BtnBase.vue.d.ts.map +1 -1
  10. package/dist/base/BtnBase.vue2.js +6 -1
  11. package/dist/base/BtnBase.vue2.js.map +1 -1
  12. package/dist/components/DropdownListItem.js.map +1 -1
  13. package/dist/components/DropdownListItem.vue.d.ts.map +1 -1
  14. package/dist/components/DropdownListItem.vue2.js +13 -4
  15. package/dist/components/DropdownListItem.vue2.js.map +1 -1
  16. package/dist/components/InputRange.js.map +1 -1
  17. package/dist/components/InputRange.vue.d.ts.map +1 -1
  18. package/dist/components/InputRange.vue2.js +10 -2
  19. package/dist/components/InputRange.vue2.js.map +1 -1
  20. package/dist/components/PlAccordion/PlAccordionSection.js.map +1 -1
  21. package/dist/components/PlAccordion/PlAccordionSection.style.js.map +1 -1
  22. package/dist/components/PlAccordion/PlAccordionSection.vue.d.ts.map +1 -1
  23. package/dist/components/PlAccordion/PlAccordionSection.vue2.js +7 -1
  24. package/dist/components/PlAccordion/PlAccordionSection.vue2.js.map +1 -1
  25. package/dist/components/PlAlert/PlAlert.js.map +1 -1
  26. package/dist/components/PlAlert/PlAlert.vue.d.ts.map +1 -1
  27. package/dist/components/PlAlert/PlAlert.vue2.js +10 -1
  28. package/dist/components/PlAlert/PlAlert.vue2.js.map +1 -1
  29. package/dist/components/PlAutocomplete/PlAutocomplete.js.map +1 -1
  30. package/dist/components/PlAutocomplete/PlAutocomplete.vue.d.ts.map +1 -1
  31. package/dist/components/PlAutocomplete/PlAutocomplete.vue2.js +29 -11
  32. package/dist/components/PlAutocomplete/PlAutocomplete.vue2.js.map +1 -1
  33. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.js.map +1 -1
  34. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue.d.ts.map +1 -1
  35. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue2.js +30 -9
  36. package/dist/components/PlAutocompleteMulti/PlAutocompleteMulti.vue2.js.map +1 -1
  37. package/dist/components/PlBtnAccent/PlBtnAccent.js.map +1 -1
  38. package/dist/components/PlBtnAccent/PlBtnAccent.vue.d.ts.map +1 -1
  39. package/dist/components/PlBtnAccent/PlBtnAccent.vue2.js +4 -1
  40. package/dist/components/PlBtnAccent/PlBtnAccent.vue2.js.map +1 -1
  41. package/dist/components/PlBtnDanger/PlBtnDanger.js.map +1 -1
  42. package/dist/components/PlBtnDanger/PlBtnDanger.vue.d.ts.map +1 -1
  43. package/dist/components/PlBtnDanger/PlBtnDanger.vue2.js +4 -1
  44. package/dist/components/PlBtnDanger/PlBtnDanger.vue2.js.map +1 -1
  45. package/dist/components/PlBtnGhost/PlBtnGhost.js.map +1 -1
  46. package/dist/components/PlBtnGhost/PlBtnGhost.vue.d.ts.map +1 -1
  47. package/dist/components/PlBtnGhost/PlBtnGhost.vue2.js +7 -1
  48. package/dist/components/PlBtnGhost/PlBtnGhost.vue2.js.map +1 -1
  49. package/dist/components/PlBtnGroup/PlBtnGroup.js.map +1 -1
  50. package/dist/components/PlBtnGroup/PlBtnGroup.vue.d.ts.map +1 -1
  51. package/dist/components/PlBtnGroup/PlBtnGroup.vue2.js +19 -6
  52. package/dist/components/PlBtnGroup/PlBtnGroup.vue2.js.map +1 -1
  53. package/dist/components/PlBtnLink/PlBtnLink.js.map +1 -1
  54. package/dist/components/PlBtnLink/PlBtnLink.vue.d.ts.map +1 -1
  55. package/dist/components/PlBtnLink/PlBtnLink.vue2.js +2 -0
  56. package/dist/components/PlBtnLink/PlBtnLink.vue2.js.map +1 -1
  57. package/dist/components/PlBtnPrimary/PlBtnPrimary.js.map +1 -1
  58. package/dist/components/PlBtnPrimary/PlBtnPrimary.vue.d.ts.map +1 -1
  59. package/dist/components/PlBtnPrimary/PlBtnPrimary.vue2.js +4 -1
  60. package/dist/components/PlBtnPrimary/PlBtnPrimary.vue2.js.map +1 -1
  61. package/dist/components/PlBtnSecondary/PlBtnSecondary.js.map +1 -1
  62. package/dist/components/PlBtnSecondary/PlBtnSecondary.vue.d.ts.map +1 -1
  63. package/dist/components/PlBtnSecondary/PlBtnSecondary.vue2.js +1 -1
  64. package/dist/components/PlBtnSecondary/PlBtnSecondary.vue2.js.map +1 -1
  65. package/dist/components/PlBtnSplit/PlBtnSplit.js.map +1 -1
  66. package/dist/components/PlBtnSplit/PlBtnSplit.vue.d.ts.map +1 -1
  67. package/dist/components/PlBtnSplit/PlBtnSplit.vue2.js +6 -0
  68. package/dist/components/PlBtnSplit/PlBtnSplit.vue2.js.map +1 -1
  69. package/dist/components/PlChartHistogram/PlChartHistogram.js.map +1 -1
  70. package/dist/components/PlChartHistogram/PlChartHistogram.style.js.map +1 -1
  71. package/dist/components/PlChartHistogram/PlChartHistogram.vue.d.ts.map +1 -1
  72. package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js +7 -2
  73. package/dist/components/PlChartHistogram/PlChartHistogram.vue2.js.map +1 -1
  74. package/dist/components/PlChartHistogram/createGridlines.d.ts.map +1 -1
  75. package/dist/components/PlChartHistogram/createGridlines.js +1 -1
  76. package/dist/components/PlChartHistogram/createGridlines.js.map +1 -1
  77. package/dist/components/PlChartHistogram/createLabels.d.ts.map +1 -1
  78. package/dist/components/PlChartHistogram/createLabels.js +1 -1
  79. package/dist/components/PlChartHistogram/createLabels.js.map +1 -1
  80. package/dist/components/PlChartHistogram/createSvgContainer.d.ts.map +1 -1
  81. package/dist/components/PlChartHistogram/createSvgContainer.js +1 -1
  82. package/dist/components/PlChartHistogram/createSvgContainer.js.map +1 -1
  83. package/dist/components/PlChartHistogram/drawBins.d.ts.map +1 -1
  84. package/dist/components/PlChartHistogram/drawBins.js +2 -2
  85. package/dist/components/PlChartHistogram/drawBins.js.map +1 -1
  86. package/dist/components/PlChartHistogram/drawThreshold.d.ts.map +1 -1
  87. package/dist/components/PlChartHistogram/drawThreshold.js +1 -1
  88. package/dist/components/PlChartHistogram/drawThreshold.js.map +1 -1
  89. package/dist/components/PlChartHistogram/histogram.d.ts.map +1 -1
  90. package/dist/components/PlChartHistogram/histogram.js +1 -1
  91. package/dist/components/PlChartHistogram/histogram.js.map +1 -1
  92. package/dist/components/PlChartStackedBar/Legends.js.map +1 -1
  93. package/dist/components/PlChartStackedBar/Legends.style.js.map +1 -1
  94. package/dist/components/PlChartStackedBar/Legends.vue.d.ts.map +1 -1
  95. package/dist/components/PlChartStackedBar/Legends.vue2.js +7 -1
  96. package/dist/components/PlChartStackedBar/Legends.vue2.js.map +1 -1
  97. package/dist/components/PlChartStackedBar/PlChartStackedBar.js.map +1 -1
  98. package/dist/components/PlChartStackedBar/PlChartStackedBar.style.js.map +1 -1
  99. package/dist/components/PlChartStackedBar/PlChartStackedBar.vue.d.ts.map +1 -1
  100. package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js +5 -1
  101. package/dist/components/PlChartStackedBar/PlChartStackedBar.vue2.js.map +1 -1
  102. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.js.map +1 -1
  103. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.style.js.map +1 -1
  104. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.vue.d.ts.map +1 -1
  105. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.vue2.js +4 -1
  106. package/dist/components/PlChartStackedBar/PlChartStackedBarCompact.vue2.js.map +1 -1
  107. package/dist/components/PlChartStackedBar/StackedRow.js.map +1 -1
  108. package/dist/components/PlChartStackedBar/StackedRow.style.js.map +1 -1
  109. package/dist/components/PlChartStackedBar/StackedRow.vue.d.ts.map +1 -1
  110. package/dist/components/PlChartStackedBar/StackedRow.vue2.js +13 -3
  111. package/dist/components/PlChartStackedBar/StackedRow.vue2.js.map +1 -1
  112. package/dist/components/PlChartStackedBar/StackedRowCompact.js.map +1 -1
  113. package/dist/components/PlChartStackedBar/StackedRowCompact.style.js.map +1 -1
  114. package/dist/components/PlChartStackedBar/StackedRowCompact.vue.d.ts.map +1 -1
  115. package/dist/components/PlChartStackedBar/StackedRowCompact.vue2.js +8 -2
  116. package/dist/components/PlChartStackedBar/StackedRowCompact.vue2.js.map +1 -1
  117. package/dist/components/PlCheckbox/PlCheckbox.js.map +1 -1
  118. package/dist/components/PlCheckbox/PlCheckbox.vue.d.ts.map +1 -1
  119. package/dist/components/PlCheckbox/PlCheckbox.vue2.js +9 -2
  120. package/dist/components/PlCheckbox/PlCheckbox.vue2.js.map +1 -1
  121. package/dist/components/PlCheckbox/PlCheckboxBase.js.map +1 -1
  122. package/dist/components/PlCheckbox/PlCheckboxBase.vue.d.ts.map +1 -1
  123. package/dist/components/PlCheckbox/PlCheckboxBase.vue2.js +1 -0
  124. package/dist/components/PlCheckbox/PlCheckboxBase.vue2.js.map +1 -1
  125. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.js.map +1 -1
  126. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue.d.ts.map +1 -1
  127. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue2.js +19 -5
  128. package/dist/components/PlCheckboxGroup/PlCheckboxGroup.vue2.js.map +1 -1
  129. package/dist/components/PlChip/PlChip.js.map +1 -1
  130. package/dist/components/PlChip/PlChip.vue.d.ts.map +1 -1
  131. package/dist/components/PlChip/PlChip.vue2.js +7 -1
  132. package/dist/components/PlChip/PlChip.vue2.js.map +1 -1
  133. package/dist/components/PlClipboard/PlClipboard.js.map +1 -1
  134. package/dist/components/PlClipboard/PlClipboard.style.js.map +1 -1
  135. package/dist/components/PlClipboard/PlClipboard.vue.d.ts.map +1 -1
  136. package/dist/components/PlClipboard/PlClipboard.vue2.js +1 -0
  137. package/dist/components/PlClipboard/PlClipboard.vue2.js.map +1 -1
  138. package/dist/components/PlConfirmDialog.js.map +1 -1
  139. package/dist/components/PlConfirmDialog.vue.d.ts.map +1 -1
  140. package/dist/components/PlConfirmDialog.vue2.js +9 -2
  141. package/dist/components/PlConfirmDialog.vue2.js.map +1 -1
  142. package/dist/components/PlDialogModal/PlDialogModal.js.map +1 -1
  143. package/dist/components/PlDialogModal/PlDialogModal.vue.d.ts.map +1 -1
  144. package/dist/components/PlDialogModal/PlDialogModal.vue2.js +12 -5
  145. package/dist/components/PlDialogModal/PlDialogModal.vue2.js.map +1 -1
  146. package/dist/components/PlDropdown/OptionList.js.map +1 -1
  147. package/dist/components/PlDropdown/OptionList.vue.d.ts.map +1 -1
  148. package/dist/components/PlDropdown/OptionList.vue2.js +11 -5
  149. package/dist/components/PlDropdown/OptionList.vue2.js.map +1 -1
  150. package/dist/components/PlDropdown/PlDropdown.js.map +1 -1
  151. package/dist/components/PlDropdown/PlDropdown.vue.d.ts.map +1 -1
  152. package/dist/components/PlDropdown/PlDropdown.vue2.js +26 -10
  153. package/dist/components/PlDropdown/PlDropdown.vue2.js.map +1 -1
  154. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.js.map +1 -1
  155. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.d.ts.map +1 -1
  156. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue2.js +32 -10
  157. package/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue2.js.map +1 -1
  158. package/dist/components/PlDropdownLine/PlDropdownLine.js.map +1 -1
  159. package/dist/components/PlDropdownLine/PlDropdownLine.vue.d.ts.map +1 -1
  160. package/dist/components/PlDropdownLine/PlDropdownLine.vue2.js +17 -3
  161. package/dist/components/PlDropdownLine/PlDropdownLine.vue2.js.map +1 -1
  162. package/dist/components/PlDropdownLine/ResizableInput.js.map +1 -1
  163. package/dist/components/PlDropdownLine/ResizableInput.vue.d.ts.map +1 -1
  164. package/dist/components/PlDropdownLine/ResizableInput.vue2.js +5 -2
  165. package/dist/components/PlDropdownLine/ResizableInput.vue2.js.map +1 -1
  166. package/dist/components/PlDropdownMulti/PlDropdownMulti.js.map +1 -1
  167. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue.d.ts.map +1 -1
  168. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue2.js +31 -10
  169. package/dist/components/PlDropdownMulti/PlDropdownMulti.vue2.js.map +1 -1
  170. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.js.map +1 -1
  171. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue.d.ts.map +1 -1
  172. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue2.js +1 -1
  173. package/dist/components/PlDropdownMultiRef/PlDropdownMultiRef.vue2.js.map +1 -1
  174. package/dist/components/PlDropdownRef/PlDropdownRef.js.map +1 -1
  175. package/dist/components/PlDropdownRef/PlDropdownRef.vue.d.ts.map +1 -1
  176. package/dist/components/PlDropdownRef/PlDropdownRef.vue2.js +1 -1
  177. package/dist/components/PlDropdownRef/PlDropdownRef.vue2.js.map +1 -1
  178. package/dist/components/PlEditableTitle/PlEditableTitle.js.map +1 -1
  179. package/dist/components/PlEditableTitle/PlEditableTitle.vue.d.ts.map +1 -1
  180. package/dist/components/PlEditableTitle/PlEditableTitle.vue2.js +9 -3
  181. package/dist/components/PlEditableTitle/PlEditableTitle.vue2.js.map +1 -1
  182. package/dist/components/PlElementList/PlElementList.js.map +1 -1
  183. package/dist/components/PlElementList/PlElementList.style.js.map +1 -1
  184. package/dist/components/PlElementList/PlElementList.vue.d.ts.map +1 -1
  185. package/dist/components/PlElementList/PlElementList.vue2.js +6 -1
  186. package/dist/components/PlElementList/PlElementList.vue2.js.map +1 -1
  187. package/dist/components/PlElementList/PlElementListItem.js.map +1 -1
  188. package/dist/components/PlElementList/PlElementListItem.style.js.map +1 -1
  189. package/dist/components/PlElementList/PlElementListItem.vue.d.ts.map +1 -1
  190. package/dist/components/PlElementList/PlElementListItem.vue2.js +34 -13
  191. package/dist/components/PlElementList/PlElementListItem.vue2.js.map +1 -1
  192. package/dist/components/PlErrorAlert/PlErrorAlert.js.map +1 -1
  193. package/dist/components/PlErrorAlert/PlErrorAlert.style.js.map +1 -1
  194. package/dist/components/PlErrorAlert/PlErrorAlert.vue.d.ts.map +1 -1
  195. package/dist/components/PlErrorAlert/PlErrorAlert.vue2.js +15 -3
  196. package/dist/components/PlErrorAlert/PlErrorAlert.vue2.js.map +1 -1
  197. package/dist/components/PlErrorBoundary/PlErrorBoundary.js.map +1 -1
  198. package/dist/components/PlErrorBoundary/PlErrorBoundary.vue.d.ts.map +1 -1
  199. package/dist/components/PlErrorBoundary/PlErrorBoundary.vue2.js +1 -0
  200. package/dist/components/PlErrorBoundary/PlErrorBoundary.vue2.js.map +1 -1
  201. package/dist/components/PlFileDialog/Local.js.map +1 -1
  202. package/dist/components/PlFileDialog/Local.vue.d.ts.map +1 -1
  203. package/dist/components/PlFileDialog/Local.vue2.js +23 -20
  204. package/dist/components/PlFileDialog/Local.vue2.js.map +1 -1
  205. package/dist/components/PlFileDialog/PlFileDialog.js.map +1 -1
  206. package/dist/components/PlFileDialog/PlFileDialog.vue.d.ts.map +1 -1
  207. package/dist/components/PlFileDialog/PlFileDialog.vue2.js +5 -1
  208. package/dist/components/PlFileDialog/PlFileDialog.vue2.js.map +1 -1
  209. package/dist/components/PlFileDialog/Remote.js.map +1 -1
  210. package/dist/components/PlFileDialog/Remote.vue.d.ts.map +1 -1
  211. package/dist/components/PlFileDialog/Remote.vue2.js +108 -94
  212. package/dist/components/PlFileDialog/Remote.vue2.js.map +1 -1
  213. package/dist/components/PlFileDialog/Shortcuts.js.map +1 -1
  214. package/dist/components/PlFileDialog/Shortcuts.style.js.map +1 -1
  215. package/dist/components/PlFileDialog/Shortcuts.vue.d.ts.map +1 -1
  216. package/dist/components/PlFileDialog/Shortcuts.vue2.js +2 -1
  217. package/dist/components/PlFileDialog/Shortcuts.vue2.js.map +1 -1
  218. package/dist/components/PlFileInput/PlFileInput.js.map +1 -1
  219. package/dist/components/PlFileInput/PlFileInput.vue.d.ts.map +1 -1
  220. package/dist/components/PlFileInput/PlFileInput.vue2.js +92 -71
  221. package/dist/components/PlFileInput/PlFileInput.vue2.js.map +1 -1
  222. package/dist/components/PlLoaderCircular/PlLoaderCircular.js.map +1 -1
  223. package/dist/components/PlLoaderCircular/PlLoaderCircular.vue.d.ts.map +1 -1
  224. package/dist/components/PlLoaderCircular/PlLoaderCircular.vue2.js +4 -1
  225. package/dist/components/PlLoaderCircular/PlLoaderCircular.vue2.js.map +1 -1
  226. package/dist/components/PlLoaderLogo.js.map +1 -1
  227. package/dist/components/PlLoaderLogo.style.js.map +1 -1
  228. package/dist/components/PlLoaderLogo.vue.css +1 -1
  229. package/dist/components/PlLoaderLogo.vue.d.ts.map +1 -1
  230. package/dist/components/PlLoaderLogo.vue2.js +4 -3
  231. package/dist/components/PlLoaderLogo.vue2.js.map +1 -1
  232. package/dist/components/PlLogView/PlLogView.js.map +1 -1
  233. package/dist/components/PlLogView/PlLogView.vue.d.ts.map +1 -1
  234. package/dist/components/PlLogView/PlLogView.vue2.js +13 -1
  235. package/dist/components/PlLogView/PlLogView.vue2.js.map +1 -1
  236. package/dist/components/PlNotificationAlert/PlNotificationAlert.js.map +1 -1
  237. package/dist/components/PlNotificationAlert/PlNotificationAlert.vue.d.ts.map +1 -1
  238. package/dist/components/PlNotificationAlert/PlNotificationAlert.vue2.js +8 -2
  239. package/dist/components/PlNotificationAlert/PlNotificationAlert.vue2.js.map +1 -1
  240. package/dist/components/PlNumberField/PlNumberField.js.map +1 -1
  241. package/dist/components/PlNumberField/PlNumberField.vue.d.ts.map +1 -1
  242. package/dist/components/PlNumberField/PlNumberField.vue2.js +12 -3
  243. package/dist/components/PlNumberField/PlNumberField.vue2.js.map +1 -1
  244. package/dist/components/PlProgressBar/PlProgressBar.js.map +1 -1
  245. package/dist/components/PlProgressBar/PlProgressBar.vue.d.ts.map +1 -1
  246. package/dist/components/PlProgressBar/PlProgressBar.vue2.js +9 -1
  247. package/dist/components/PlProgressBar/PlProgressBar.vue2.js.map +1 -1
  248. package/dist/components/PlProgressCell/PlProgressCell.js.map +1 -1
  249. package/dist/components/PlProgressCell/PlProgressCell.vue.d.ts.map +1 -1
  250. package/dist/components/PlProgressCell/PlProgressCell.vue2.js +19 -7
  251. package/dist/components/PlProgressCell/PlProgressCell.vue2.js.map +1 -1
  252. package/dist/components/PlRadio/PlRadio.js.map +1 -1
  253. package/dist/components/PlRadio/PlRadio.style.js.map +1 -1
  254. package/dist/components/PlRadio/PlRadio.vue.d.ts.map +1 -1
  255. package/dist/components/PlRadio/PlRadio.vue2.js +10 -3
  256. package/dist/components/PlRadio/PlRadio.vue2.js.map +1 -1
  257. package/dist/components/PlRadio/PlRadioGroup.js.map +1 -1
  258. package/dist/components/PlRadio/PlRadioGroup.style.js.map +1 -1
  259. package/dist/components/PlRadio/PlRadioGroup.vue.d.ts.map +1 -1
  260. package/dist/components/PlRadio/PlRadioGroup.vue2.js +10 -3
  261. package/dist/components/PlRadio/PlRadioGroup.vue2.js.map +1 -1
  262. package/dist/components/PlSearchField/PlSearchField.js.map +1 -1
  263. package/dist/components/PlSearchField/PlSearchField.style.js.map +1 -1
  264. package/dist/components/PlSearchField/PlSearchField.vue.d.ts.map +1 -1
  265. package/dist/components/PlSearchField/PlSearchField.vue2.js +11 -4
  266. package/dist/components/PlSearchField/PlSearchField.vue2.js.map +1 -1
  267. package/dist/components/PlSectionSeparator/PlSectionSeparator.js.map +1 -1
  268. package/dist/components/PlSectionSeparator/PlSectionSeparator.style.js.map +1 -1
  269. package/dist/components/PlSectionSeparator/PlSectionSeparator.vue.d.ts.map +1 -1
  270. package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js +7 -1
  271. package/dist/components/PlSectionSeparator/PlSectionSeparator.vue2.js.map +1 -1
  272. package/dist/components/PlSidebar/PlSidebarGroup.js.map +1 -1
  273. package/dist/components/PlSidebar/PlSidebarGroup.style.js.map +1 -1
  274. package/dist/components/PlSidebar/PlSidebarGroup.vue.d.ts.map +1 -1
  275. package/dist/components/PlSidebar/PlSidebarGroup.vue2.js +5 -1
  276. package/dist/components/PlSidebar/PlSidebarGroup.vue2.js.map +1 -1
  277. package/dist/components/PlSidebar/PlSidebarItem.js.map +1 -1
  278. package/dist/components/PlSidebar/PlSidebarItem.style.js.map +1 -1
  279. package/dist/components/PlSidebar/PlSidebarItem.vue.d.ts.map +1 -1
  280. package/dist/components/PlSidebar/PlSidebarItem.vue2.js +7 -1
  281. package/dist/components/PlSidebar/PlSidebarItem.vue2.js.map +1 -1
  282. package/dist/components/PlSlideModal/PlPureSlideModal.js.map +1 -1
  283. package/dist/components/PlSlideModal/PlPureSlideModal.vue.d.ts.map +1 -1
  284. package/dist/components/PlSlideModal/PlPureSlideModal.vue2.js +4 -1
  285. package/dist/components/PlSlideModal/PlPureSlideModal.vue2.js.map +1 -1
  286. package/dist/components/PlSlideModal/PlSlideModal.js.map +1 -1
  287. package/dist/components/PlSlideModal/PlSlideModal.style.js.map +1 -1
  288. package/dist/components/PlSlideModal/PlSlideModal.vue.d.ts.map +1 -1
  289. package/dist/components/PlSlideModal/PlSlideModal.vue2.js +7 -2
  290. package/dist/components/PlSlideModal/PlSlideModal.vue2.js.map +1 -1
  291. package/dist/components/PlSpacer/PlSpacer.vue.d.ts.map +1 -1
  292. package/dist/components/PlSplash/PlSplash.js.map +1 -1
  293. package/dist/components/PlSplash/PlSplash.vue.d.ts.map +1 -1
  294. package/dist/components/PlSplash/PlSplash.vue2.js +13 -5
  295. package/dist/components/PlSplash/PlSplash.vue2.js.map +1 -1
  296. package/dist/components/PlStatusTag/PlStatusTag.js.map +1 -1
  297. package/dist/components/PlStatusTag/PlStatusTag.vue.d.ts.map +1 -1
  298. package/dist/components/PlStatusTag/PlStatusTag.vue2.js +4 -1
  299. package/dist/components/PlStatusTag/PlStatusTag.vue2.js.map +1 -1
  300. package/dist/components/PlTabs/PlTabs.js.map +1 -1
  301. package/dist/components/PlTabs/PlTabs.vue.d.ts.map +1 -1
  302. package/dist/components/PlTabs/PlTabs.vue2.js +16 -11
  303. package/dist/components/PlTabs/PlTabs.vue2.js.map +1 -1
  304. package/dist/components/PlTextArea/PlTextArea.js.map +1 -1
  305. package/dist/components/PlTextArea/PlTextArea.vue.d.ts.map +1 -1
  306. package/dist/components/PlTextArea/PlTextArea.vue2.js +21 -8
  307. package/dist/components/PlTextArea/PlTextArea.vue2.js.map +1 -1
  308. package/dist/components/PlTextField/PlTextField.js.map +1 -1
  309. package/dist/components/PlTextField/PlTextField.vue.d.ts.map +1 -1
  310. package/dist/components/PlTextField/PlTextField.vue2.js +23 -9
  311. package/dist/components/PlTextField/PlTextField.vue2.js.map +1 -1
  312. package/dist/components/PlToggleSwitch/PlToggleSwitch.js.map +1 -1
  313. package/dist/components/PlToggleSwitch/PlToggleSwitch.vue.d.ts.map +1 -1
  314. package/dist/components/PlToggleSwitch/PlToggleSwitch.vue2.js +10 -2
  315. package/dist/components/PlToggleSwitch/PlToggleSwitch.vue2.js.map +1 -1
  316. package/dist/components/PlTooltip/PlTooltip.js.map +1 -1
  317. package/dist/components/PlTooltip/PlTooltip.style.js.map +1 -1
  318. package/dist/components/PlTooltip/PlTooltip.vue.css +1 -1
  319. package/dist/components/PlTooltip/PlTooltip.vue.d.ts.map +1 -1
  320. package/dist/components/PlTooltip/PlTooltip.vue2.js +7 -2
  321. package/dist/components/PlTooltip/PlTooltip.vue2.js.map +1 -1
  322. package/dist/components/Slider.js.map +1 -1
  323. package/dist/components/Slider.vue.d.ts.map +1 -1
  324. package/dist/components/Slider.vue2.js +13 -1
  325. package/dist/components/Slider.vue2.js.map +1 -1
  326. package/dist/components/SliderRange.js.map +1 -1
  327. package/dist/components/SliderRange.vue.d.ts.map +1 -1
  328. package/dist/components/SliderRange.vue2.js +14 -1
  329. package/dist/components/SliderRange.vue2.js.map +1 -1
  330. package/dist/components/SliderRangeTriple.js.map +1 -1
  331. package/dist/components/SliderRangeTriple.vue.d.ts.map +1 -1
  332. package/dist/components/SliderRangeTriple.vue2.js +13 -1
  333. package/dist/components/SliderRangeTriple.vue2.js.map +1 -1
  334. package/dist/components/TabItem.js.map +1 -1
  335. package/dist/components/TabItem.vue.d.ts.map +1 -1
  336. package/dist/components/TabItem.vue2.js +8 -2
  337. package/dist/components/TabItem.vue2.js.map +1 -1
  338. package/dist/components/contextMenu/Menu.js +1 -1
  339. package/dist/components/contextMenu/Menu.js.map +1 -1
  340. package/dist/components/contextMenu/Menu.style.css +1 -1
  341. package/dist/components/contextMenu/Menu.vue.d.ts.map +1 -1
  342. package/dist/components/contextMenu/Menu.vue2.js +12 -8
  343. package/dist/components/contextMenu/Menu.vue2.js.map +1 -1
  344. package/dist/layout/PlBlockPage/PlBlockPage.js.map +1 -1
  345. package/dist/layout/PlBlockPage/PlBlockPage.style.js.map +1 -1
  346. package/dist/layout/PlBlockPage/PlBlockPage.vue.d.ts.map +1 -1
  347. package/dist/layout/PlBlockPage/PlBlockPage.vue2.js +45 -25
  348. package/dist/layout/PlBlockPage/PlBlockPage.vue2.js.map +1 -1
  349. package/dist/layout/PlContainer/PlContainer.js.map +1 -1
  350. package/dist/layout/PlContainer/PlContainer.vue.d.ts.map +1 -1
  351. package/dist/layout/PlContainer/PlContainer.vue2.js +1 -0
  352. package/dist/layout/PlContainer/PlContainer.vue2.js.map +1 -1
  353. package/dist/layout/PlGrid/PlGrid.js.map +1 -1
  354. package/dist/layout/PlGrid/PlGrid.vue.d.ts.map +1 -1
  355. package/dist/layout/PlGrid/PlGrid.vue2.js +1 -0
  356. package/dist/layout/PlGrid/PlGrid.vue2.js.map +1 -1
  357. package/dist/layout/PlPlaceholder/PlPlaceholder.js.map +1 -1
  358. package/dist/layout/PlPlaceholder/PlPlaceholder.style.js.map +1 -1
  359. package/dist/layout/PlPlaceholder/PlPlaceholder.vue.d.ts.map +1 -1
  360. package/dist/layout/PlPlaceholder/PlPlaceholder.vue2.js +25 -6
  361. package/dist/layout/PlPlaceholder/PlPlaceholder.vue2.js.map +1 -1
  362. package/dist/layout/PlRow/PlRow.js.map +1 -1
  363. package/dist/layout/PlRow/PlRow.vue.d.ts.map +1 -1
  364. package/dist/layout/PlRow/PlRow.vue2.js +7 -4
  365. package/dist/layout/PlRow/PlRow.vue2.js.map +1 -1
  366. package/dist/layout/PlSpacer/PlSpacer.js.map +1 -1
  367. package/dist/layout/PlSpacer/PlSpacer.vue.d.ts.map +1 -1
  368. package/dist/layout/PlSpacer/PlSpacer.vue2.js +1 -0
  369. package/dist/layout/PlSpacer/PlSpacer.vue2.js.map +1 -1
  370. package/package.json +4 -4
  371. package/src/__tests__/default-testid.test.ts +95 -0
  372. package/src/base/BtnBase.vue +3 -3
  373. package/src/components/DropdownListItem.vue +14 -4
  374. package/src/components/InputRange.vue +6 -2
  375. package/src/components/PlAccordion/PlAccordionSection.vue +13 -4
  376. package/src/components/PlAlert/PlAlert.vue +5 -3
  377. package/src/components/PlAutocomplete/PlAutocomplete.vue +47 -11
  378. package/src/components/PlAutocompleteMulti/PlAutocompleteMulti.vue +53 -11
  379. package/src/components/PlBtnAccent/PlBtnAccent.vue +1 -1
  380. package/src/components/PlBtnDanger/PlBtnDanger.vue +1 -1
  381. package/src/components/PlBtnGhost/PlBtnGhost.vue +4 -3
  382. package/src/components/PlBtnGroup/PlBtnGroup.vue +16 -6
  383. package/src/components/PlBtnLink/PlBtnLink.vue +2 -1
  384. package/src/components/PlBtnPrimary/PlBtnPrimary.vue +1 -1
  385. package/src/components/PlBtnSecondary/PlBtnSecondary.vue +1 -1
  386. package/src/components/PlBtnSplit/PlBtnSplit.vue +12 -2
  387. package/src/components/PlChartHistogram/PlChartHistogram.vue +9 -3
  388. package/src/components/PlChartHistogram/createGridlines.ts +2 -0
  389. package/src/components/PlChartHistogram/createLabels.ts +2 -0
  390. package/src/components/PlChartHistogram/createSvgContainer.ts +2 -0
  391. package/src/components/PlChartHistogram/drawBins.ts +2 -0
  392. package/src/components/PlChartHistogram/drawThreshold.ts +1 -0
  393. package/src/components/PlChartHistogram/histogram.ts +6 -1
  394. package/src/components/PlChartStackedBar/Legends.vue +18 -4
  395. package/src/components/PlChartStackedBar/PlChartStackedBar.vue +4 -2
  396. package/src/components/PlChartStackedBar/PlChartStackedBarCompact.vue +1 -1
  397. package/src/components/PlChartStackedBar/StackedRow.vue +12 -4
  398. package/src/components/PlChartStackedBar/StackedRowCompact.vue +10 -3
  399. package/src/components/PlCheckbox/PlCheckbox.vue +15 -4
  400. package/src/components/PlCheckbox/PlCheckboxBase.vue +1 -0
  401. package/src/components/PlCheckboxGroup/PlCheckboxGroup.vue +15 -4
  402. package/src/components/PlChip/PlChip.vue +4 -3
  403. package/src/components/PlClipboard/PlClipboard.vue +7 -1
  404. package/src/components/PlConfirmDialog.vue +8 -3
  405. package/src/components/PlDialogModal/PlDialogModal.vue +15 -2
  406. package/src/components/PlDropdown/OptionList.vue +13 -3
  407. package/src/components/PlDropdown/PlDropdown.vue +35 -11
  408. package/src/components/PlDropdownLegacy/PlDropdownLegacy.vue +51 -12
  409. package/src/components/PlDropdownLine/PlDropdownLine.vue +29 -5
  410. package/src/components/PlDropdownLine/ResizableInput.vue +2 -1
  411. package/src/components/PlDropdownMulti/PlDropdownMulti.vue +47 -11
  412. package/src/components/PlDropdownMultiRef/PlDropdownMultiRef.vue +1 -0
  413. package/src/components/PlDropdownRef/PlDropdownRef.vue +1 -0
  414. package/src/components/PlEditableTitle/PlEditableTitle.vue +11 -3
  415. package/src/components/PlElementList/PlElementList.vue +8 -3
  416. package/src/components/PlElementList/PlElementListItem.vue +16 -5
  417. package/src/components/PlErrorAlert/PlErrorAlert.vue +8 -6
  418. package/src/components/PlErrorBoundary/PlErrorBoundary.vue +7 -1
  419. package/src/components/PlFileDialog/Local.vue +12 -4
  420. package/src/components/PlFileDialog/PlFileDialog.vue +13 -3
  421. package/src/components/PlFileDialog/Remote.vue +39 -11
  422. package/src/components/PlFileDialog/Shortcuts.vue +7 -1
  423. package/src/components/PlFileInput/PlFileInput.vue +44 -19
  424. package/src/components/PlLoaderCircular/PlLoaderCircular.vue +1 -1
  425. package/src/components/PlLoaderLogo.vue +6 -1
  426. package/src/components/PlLogView/PlLogView.vue +30 -8
  427. package/src/components/PlNotificationAlert/PlNotificationAlert.vue +15 -3
  428. package/src/components/PlNumberField/PlNumberField.vue +14 -3
  429. package/src/components/PlProgressBar/PlProgressBar.vue +12 -4
  430. package/src/components/PlProgressCell/PlProgressCell.vue +13 -4
  431. package/src/components/PlRadio/PlRadio.vue +10 -3
  432. package/src/components/PlRadio/PlRadioGroup.vue +3 -2
  433. package/src/components/PlSearchField/PlSearchField.vue +5 -3
  434. package/src/components/PlSectionSeparator/PlSectionSeparator.vue +6 -2
  435. package/src/components/PlSidebar/PlSidebarGroup.vue +2 -2
  436. package/src/components/PlSidebar/PlSidebarItem.vue +12 -4
  437. package/src/components/PlSlideModal/PlPureSlideModal.vue +7 -1
  438. package/src/components/PlSlideModal/PlSlideModal.vue +4 -3
  439. package/src/components/PlSpacer/PlSpacer.vue +1 -1
  440. package/src/components/PlSplash/PlSplash.vue +6 -3
  441. package/src/components/PlStatusTag/PlStatusTag.vue +1 -0
  442. package/src/components/PlTabs/PlTabs.vue +6 -2
  443. package/src/components/PlTextArea/PlTextArea.vue +21 -8
  444. package/src/components/PlTextField/PlTextField.vue +23 -8
  445. package/src/components/PlToggleSwitch/PlToggleSwitch.vue +4 -3
  446. package/src/components/PlTooltip/PlTooltip.vue +3 -0
  447. package/src/components/Slider.vue +27 -7
  448. package/src/components/SliderRange.vue +28 -7
  449. package/src/components/SliderRangeTriple.vue +19 -5
  450. package/src/components/TabItem.vue +2 -2
  451. package/src/components/contextMenu/Menu.vue +8 -3
  452. package/src/layout/PlBlockPage/PlBlockPage.vue +40 -11
  453. package/src/layout/PlContainer/PlContainer.vue +1 -0
  454. package/src/layout/PlGrid/PlGrid.vue +1 -1
  455. package/src/layout/PlPlaceholder/PlPlaceholder.vue +20 -8
  456. package/src/layout/PlRow/PlRow.vue +5 -1
  457. package/src/layout/PlSpacer/PlSpacer.vue +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Remote.js","names":[],"sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from \"../../composition/useEventListener\";\nimport type { ImportedFiles } from \"../../types\";\nimport { between, notEmpty, tapIf } from \"@milaboratories/helpers\";\nimport { getRawPlatformaInstance, type StorageHandle } from \"@platforma-sdk/model\";\nimport { computed, onMounted, reactive, ref, toRef, watch } from \"vue\";\nimport { PlDropdown } from \"../PlDropdown\";\nimport { PlIcon16 } from \"../PlIcon16\";\nimport Shortcuts from \"./Shortcuts.vue\";\nimport { PlMaskIcon16 } from \"../PlMaskIcon16\";\nimport { PlSearchField } from \"../PlSearchField\";\nimport style from \"./pl-file-dialog.module.scss\";\nimport { defaultData, useVisibleItems, vTextOverflown } from \"./remote-helpers\";\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from \"./utils\";\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: \"update:modelValue\", value: boolean): void;\n (e: \"import:files\", value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = \"\";\n data.error = \"\";\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance()\n .lsDriver.listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === \"dir\",\n canBeSelected:\n item.type === \"file\" &&\n (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === \"file\" ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn(\"platforma API is not found\");\n return;\n }\n getRawPlatformaInstance()\n .lsDriver.getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter(\n (it) => it.id !== \"local\" && !it.id.startsWith(\"local_disk_\"),\n );\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, \"storageEntry\"),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? \"\";\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, \"keydown\", (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === \"KeyA\") {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === \"Period\") {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === \"Enter\") {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n\nconst lsContainerRef = ref<HTMLElement | undefined>();\n</script>\n\n<template>\n <div :class=\"style.remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n />\n </div>\n <div>\n <PlSearchField v-model=\"data.search\" label=\"Search in folder\" clearable />\n </div>\n </div>\n <div :class=\"style['ls-container']\" ref=\"lsContainerRef\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div :title=\"s.path\" @click=\"setDirPath(s.path)\">{{ s.name }}</div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span>Selected: {{ selectedFiles.length }}</span>\n <Shortcuts :container=\"lsContainerRef\" />\n </div>\n </div>\n <div v-if=\"data.currentLoadingPath !== undefined\" class=\"ls-loader\">\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div v-else-if=\"!data.storageEntry\" :class=\"style['ls-empty']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">Select storage to preview</div>\n </div>\n <div v-else-if=\"data.error\" :class=\"style['ls-error']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div v-if=\"file.isDir\" :class=\"style.isDir\" @click=\"setDirPath(file.path)\">\n <PlIcon16 name=\"chevron-right\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n <div\n v-else\n :class=\"{ [style.canBeSelected]: file.canBeSelected, [style.selected]: file.selected }\"\n @click.stop=\"(ev) => selectFile(ev, file)\"\n >\n <PlMaskIcon16 name=\"box\" :class=\"style.isFile\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Remote.js","names":[],"sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from \"../../composition/useEventListener\";\nimport type { ImportedFiles } from \"../../types\";\nimport { between, notEmpty, tapIf } from \"@milaboratories/helpers\";\nimport { getRawPlatformaInstance, type StorageHandle } from \"@platforma-sdk/model\";\nimport { computed, onMounted, reactive, ref, toRef, watch } from \"vue\";\nimport { PlDropdown } from \"../PlDropdown\";\nimport { PlIcon16 } from \"../PlIcon16\";\nimport Shortcuts from \"./Shortcuts.vue\";\nimport { PlMaskIcon16 } from \"../PlMaskIcon16\";\nimport { PlSearchField } from \"../PlSearchField\";\nimport style from \"./pl-file-dialog.module.scss\";\nimport { defaultData, useVisibleItems, vTextOverflown } from \"./remote-helpers\";\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from \"./utils\";\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: \"update:modelValue\", value: boolean): void;\n (e: \"import:files\", value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = \"\";\n data.error = \"\";\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance()\n .lsDriver.listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === \"dir\",\n canBeSelected:\n item.type === \"file\" &&\n (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === \"file\" ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn(\"platforma API is not found\");\n return;\n }\n getRawPlatformaInstance()\n .lsDriver.getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter(\n (it) => it.id !== \"local\" && !it.id.startsWith(\"local_disk_\"),\n );\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, \"storageEntry\"),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? \"\";\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, \"keydown\", (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === \"KeyA\") {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === \"Period\") {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === \"Enter\") {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n\nconst lsContainerRef = ref<HTMLElement | undefined>();\n</script>\n\n<template>\n <div :class=\"style.remote\" data-testid=\"pl-file-dialog-remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n data-testid=\"pl-file-dialog-storage\"\n />\n </div>\n <div>\n <PlSearchField\n v-model=\"data.search\"\n label=\"Search in folder\"\n clearable\n data-testid=\"pl-file-dialog-search\"\n />\n </div>\n </div>\n <div :class=\"style['ls-container']\" ref=\"lsContainerRef\" data-testid=\"pl-file-dialog-browser\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\" data-testid=\"pl-file-dialog-breadcrumbs\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div\n :title=\"s.path\"\n data-testid=\"pl-file-dialog-breadcrumb\"\n @click=\"setDirPath(s.path)\"\n >\n {{ s.name }}\n </div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span data-testid=\"pl-file-dialog-selected-count\"\n >Selected: {{ selectedFiles.length }}</span\n >\n <Shortcuts :container=\"lsContainerRef\" />\n </div>\n </div>\n <div\n v-if=\"data.currentLoadingPath !== undefined\"\n class=\"ls-loader\"\n data-testid=\"pl-file-dialog-loading\"\n >\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div\n v-else-if=\"!data.storageEntry\"\n :class=\"style['ls-empty']\"\n data-testid=\"pl-file-dialog-empty\"\n >\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']\" data-testid=\"pl-file-dialog-error\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\" data-testid=\"pl-file-dialog-items\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div\n v-if=\"file.isDir\"\n :class=\"style.isDir\"\n data-testid=\"pl-file-dialog-dir\"\n @click=\"setDirPath(file.path)\"\n >\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 data-testid=\"pl-file-dialog-file\"\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"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Remote.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Remote.vue"],"names":[],"mappings":"AAoVA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoBnF,KAAK,WAAW,GAAG;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAmeJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;WAteN,MAAM;gBAFD,MAAM,EAAE;uBAGD,OAAO;6EA0e7B,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"Remote.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Remote.vue"],"names":[],"mappings":"AAgXA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoBnF,KAAK,WAAW,GAAG;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAkfJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;WArfN,MAAM;gBAFD,MAAM,EAAE;uBAGD,OAAO;6EAyf7B,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -9,15 +9,16 @@ import "../PlSearchField/index.js";
9
9
  import i from "./pl-file-dialog.module.js";
10
10
  import a from "./Shortcuts.js";
11
11
  import { defaultData as o, useVisibleItems as s, vTextOverflown as c } from "./remote-helpers.js";
12
- import { getFilePathBreadcrumbs as l, normalizeExtensions as ee } from "./utils.js";
13
- import { Fragment as u, computed as d, createBlock as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createTextVNode as g, createVNode as _, defineComponent as v, normalizeClass as y, onMounted as b, openBlock as x, reactive as S, ref as C, renderList as w, toDisplayString as T, toRef as E, unref as D, watch as O, withDirectives as k, withModifiers as A } from "vue";
14
- import { between as j, notEmpty as M, tapIf as N } from "@milaboratories/helpers";
15
- import { getRawPlatformaInstance as P } from "@platforma-sdk/model";
12
+ import { getFilePathBreadcrumbs as l, normalizeExtensions as u } from "./utils.js";
13
+ import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as _, createVNode as v, defineComponent as y, normalizeClass as b, onMounted as x, openBlock as S, reactive as ee, ref as te, renderList as C, toDisplayString as w, toRef as T, unref as E, watch as D, withDirectives as O, withModifiers as k } from "vue";
14
+ import { between as A, notEmpty as j, tapIf as ne } from "@milaboratories/helpers";
15
+ import { getRawPlatformaInstance as M } from "@platforma-sdk/model";
16
16
  //#region src/components/PlFileDialog/Remote.vue?vue&type=script&setup=true&lang.ts
17
- var te = ["title", "onClick"], ne = {
17
+ var re = ["title", "onClick"], ie = { "data-testid": "pl-file-dialog-selected-count" }, ae = {
18
18
  key: 0,
19
- class: "ls-loader"
20
- }, re = ["onClick"], ie = ["title"], F = ["onClick"], I = ["title"], L = /* @__PURE__ */ v({
19
+ class: "ls-loader",
20
+ "data-testid": "pl-file-dialog-loading"
21
+ }, oe = ["onClick"], N = ["title"], P = ["onClick"], F = ["title"], I = /* @__PURE__ */ y({
21
22
  __name: "Remote",
22
23
  props: {
23
24
  modelValue: { type: Boolean },
@@ -31,133 +32,146 @@ var te = ["title", "onClick"], ne = {
31
32
  submit: {}
32
33
  },
33
34
  emits: ["update:modelValue", "import:files"],
34
- setup(v, { expose: L }) {
35
- let R = (e) => e.ctrlKey || e.metaKey, z = v, B = S(o()), V = () => {
36
- B.search = "", B.error = "", B.lastSelected = void 0;
37
- }, H = d(() => ee(z.extensions)), U = s(B), W = d(() => ({
38
- modelValue: z.modelValue,
39
- dirPath: B.dirPath,
40
- storageHandle: B.storageEntry?.handle
41
- })), G = (e, t) => {
42
- P() && B.currentLoadingPath !== t && (B.currentLoadingPath = t, P().lsDriver.listFiles(e, t).then((e) => {
43
- t === B.dirPath && (B.items = M(e).entries.map((e) => ({
35
+ setup(y, { expose: I }) {
36
+ let L = (e) => e.ctrlKey || e.metaKey, R = y, z = ee(o()), B = () => {
37
+ z.search = "", z.error = "", z.lastSelected = void 0;
38
+ }, V = f(() => u(R.extensions)), H = s(z), U = f(() => ({
39
+ modelValue: R.modelValue,
40
+ dirPath: z.dirPath,
41
+ storageHandle: z.storageEntry?.handle
42
+ })), W = (e, t) => {
43
+ M() && z.currentLoadingPath !== t && (z.currentLoadingPath = t, M().lsDriver.listFiles(e, t).then((e) => {
44
+ t === z.dirPath && (z.items = j(e).entries.map((e) => ({
44
45
  path: e.fullPath,
45
46
  name: e.name,
46
47
  isDir: e.type === "dir",
47
- canBeSelected: e.type === "file" && (!H.value || H.value.some((t) => e.fullPath.endsWith(t))),
48
+ canBeSelected: e.type === "file" && (!V.value || V.value.some((t) => e.fullPath.endsWith(t))),
48
49
  handle: e.type === "file" ? e.handle : void 0,
49
50
  selected: !1
50
51
  })).sort((e, t) => e.isDir && !t.isDir ? -1 : !e.isDir && t.isDir ? 1 : e.name.localeCompare(t.name)).map((e, t) => ({
51
52
  id: t,
52
53
  ...e
53
- })), B.lastSelected = void 0);
54
- }).catch((e) => B.error = String(e)).finally(() => {
55
- B.currentLoadingPath = void 0;
54
+ })), z.lastSelected = void 0);
55
+ }).catch((e) => z.error = String(e)).finally(() => {
56
+ z.currentLoadingPath = void 0;
56
57
  }));
57
- }, K = () => {
58
- V();
59
- let { storageHandle: e, dirPath: t, modelValue: n } = W.value;
60
- e && n && G(e, t);
61
- }, q = d(() => l(B.dirPath)), J = d(() => B.items.filter((e) => e.canBeSelected && e.selected && !e.isDir)), ae = d(() => J.value.length > 0 && B.storageEntry?.handle), oe = () => ({
62
- storageHandle: M(B.storageEntry?.handle),
63
- files: J.value.map((e) => e.handle)
64
- }), Y = (e) => {
65
- B.dirPath = e;
66
- }, se = (e, t) => {
67
- let { shiftKey: n } = e, r = R(e), { lastSelected: i } = B;
58
+ }, G = () => {
59
+ B();
60
+ let { storageHandle: e, dirPath: t, modelValue: n } = U.value;
61
+ e && n && W(e, t);
62
+ }, K = f(() => l(z.dirPath)), q = f(() => z.items.filter((e) => e.canBeSelected && e.selected && !e.isDir)), se = f(() => q.value.length > 0 && z.storageEntry?.handle), ce = () => ({
63
+ storageHandle: j(z.storageEntry?.handle),
64
+ files: q.value.map((e) => e.handle)
65
+ }), J = (e) => {
66
+ z.dirPath = e;
67
+ }, le = (e, t) => {
68
+ let { shiftKey: n } = e, r = L(e), { lastSelected: i } = z;
68
69
  e.preventDefault();
69
- let a = U.value;
70
+ let a = H.value;
70
71
  if (t.canBeSelected) {
71
- if (z.multi || a.forEach((e) => e.selected = !1), t.selected = !t.selected, !z.multi) return;
72
+ if (R.multi || a.forEach((e) => e.selected = !1), t.selected = !t.selected, !R.multi) return;
72
73
  !r && !n && a.forEach((e) => {
73
74
  e.id !== t.id && (e.selected = !1);
74
75
  }), n && i !== void 0 && a.forEach((e) => {
75
- j(e.id, i, t.id) && (e.selected = !0);
76
- }), t.selected && (B.lastSelected = t.id);
76
+ A(e.id, i, t.id) && (e.selected = !0);
77
+ }), t.selected && (z.lastSelected = t.id);
77
78
  }
78
- }, X = (e) => {
79
- e && !z.multi || U.value.filter((e) => e.canBeSelected).forEach((t) => {
79
+ }, Y = (e) => {
80
+ e && !R.multi || H.value.filter((e) => e.canBeSelected).forEach((t) => {
80
81
  t.selected = e;
81
82
  });
82
- }, ce = () => X(!0), Z = () => X(!1), Q = () => {
83
- if (V(), Z(), !P()) {
83
+ }, X = () => Y(!0), Z = () => Y(!1), Q = () => {
84
+ if (B(), Z(), !M()) {
84
85
  console.warn("platforma API is not found");
85
86
  return;
86
87
  }
87
- P().lsDriver.getStorageList().then((e) => {
88
- e = e.filter((e) => e.id !== "local" && !e.id.startsWith("local_disk_")), B.storageOptions = e.map((e) => ({
88
+ M().lsDriver.getStorageList().then((e) => {
89
+ e = e.filter((e) => e.id !== "local" && !e.id.startsWith("local_disk_")), z.storageOptions = e.map((e) => ({
89
90
  text: e.name,
90
91
  value: e
91
- })), z.autoSelectStorage && N(e[0], (e) => {
92
- B.storageEntry = e;
92
+ })), R.autoSelectStorage && ne(e[0], (e) => {
93
+ z.storageEntry = e;
93
94
  });
94
- }).catch((e) => B.error = String(e));
95
+ }).catch((e) => z.error = String(e));
95
96
  };
96
- O(E(B, "storageEntry"), (e) => {
97
- V(), B.dirPath = e?.initialFullPath ?? "";
98
- }, { immediate: !0 }), O([() => B.dirPath, () => B.storageEntry], () => {
99
- K();
100
- }), O(() => z.modelValue, (e) => {
101
- e ? Q() : Object.assign(B, o());
97
+ D(T(z, "storageEntry"), (e) => {
98
+ B(), z.dirPath = e?.initialFullPath ?? "";
99
+ }, { immediate: !0 }), D([() => z.dirPath, () => z.storageEntry], () => {
100
+ G();
101
+ }), D(() => R.modelValue, (e) => {
102
+ e ? Q() : Object.assign(z, o());
102
103
  }, { immediate: !0 }), e(document, "keydown", (e) => {
103
- if (!z.modelValue || e.target !== document.body) return;
104
- let t = R(e);
105
- t && e.code === "KeyA" && (e.preventDefault(), ce()), t && e.shiftKey && e.code === "Period" && (e.preventDefault(), B.showHiddenItems = !B.showHiddenItems), e.code === "Enter" && z.submit();
106
- }), L({
107
- isReady: ae,
108
- getFilesToImport: oe
109
- }), b(Q);
110
- let $ = C();
111
- return (e, o) => (x(), m("div", {
112
- class: y(D(i).remote),
113
- onClick: A(Z, ["stop"])
114
- }, [h("div", { class: y(D(i).search) }, [h("div", null, [_(D(n), {
115
- modelValue: B.storageEntry,
116
- "onUpdate:modelValue": o[0] ||= (e) => B.storageEntry = e,
104
+ if (!R.modelValue || e.target !== document.body) return;
105
+ let t = L(e);
106
+ t && e.code === "KeyA" && (e.preventDefault(), X()), t && e.shiftKey && e.code === "Period" && (e.preventDefault(), z.showHiddenItems = !z.showHiddenItems), e.code === "Enter" && R.submit();
107
+ }), I({
108
+ isReady: se,
109
+ getFilesToImport: ce
110
+ }), x(Q);
111
+ let $ = te();
112
+ return (e, o) => (S(), h("div", {
113
+ class: b(E(i).remote),
114
+ "data-testid": "pl-file-dialog-remote",
115
+ onClick: k(Z, ["stop"])
116
+ }, [g("div", { class: b(E(i).search) }, [g("div", null, [v(E(n), {
117
+ modelValue: z.storageEntry,
118
+ "onUpdate:modelValue": o[0] ||= (e) => z.storageEntry = e,
117
119
  label: "Select storage",
118
- options: B.storageOptions
119
- }, null, 8, ["modelValue", "options"])]), h("div", null, [_(D(r), {
120
- modelValue: B.search,
121
- "onUpdate:modelValue": o[1] ||= (e) => B.search = e,
120
+ options: z.storageOptions,
121
+ "data-testid": "pl-file-dialog-storage"
122
+ }, null, 8, ["modelValue", "options"])]), g("div", null, [v(E(r), {
123
+ modelValue: z.search,
124
+ "onUpdate:modelValue": o[1] ||= (e) => z.search = e,
122
125
  label: "Search in folder",
123
- clearable: ""
124
- }, null, 8, ["modelValue"])])], 2), h("div", {
125
- class: y(D(i)["ls-container"]),
126
+ clearable: "",
127
+ "data-testid": "pl-file-dialog-search"
128
+ }, null, 8, ["modelValue"])])], 2), g("div", {
129
+ class: b(E(i)["ls-container"]),
126
130
  ref_key: "lsContainerRef",
127
- ref: $
128
- }, [h("div", { class: y(D(i)["ls-head"]) }, [h("div", { class: y(D(i).breadcrumbs) }, [(x(!0), m(u, null, w(q.value, (e, n) => (x(), m(u, { key: n }, [h("div", {
131
+ ref: $,
132
+ "data-testid": "pl-file-dialog-browser"
133
+ }, [g("div", { class: b(E(i)["ls-head"]) }, [g("div", {
134
+ class: b(E(i).breadcrumbs),
135
+ "data-testid": "pl-file-dialog-breadcrumbs"
136
+ }, [(S(!0), h(d, null, C(K.value, (e, n) => (S(), h(d, { key: n }, [g("div", {
129
137
  title: e.path,
130
- onClick: (t) => Y(e.path)
131
- }, T(e.name), 9, te), e.index === q.value.length - 1 ? p("", !0) : (x(), f(D(t), {
138
+ "data-testid": "pl-file-dialog-breadcrumb",
139
+ onClick: (t) => J(e.path)
140
+ }, w(e.name), 9, re), e.index === K.value.length - 1 ? m("", !0) : (S(), p(E(t), {
132
141
  key: 0,
133
142
  name: "chevron-right"
134
- }))], 64))), 128))], 2), h("div", { class: y(D(i).selected) }, [h("span", null, "Selected: " + T(J.value.length), 1), _(a, { container: $.value }, null, 8, ["container"])], 2)], 2), B.currentLoadingPath === void 0 ? B.storageEntry ? B.error ? (x(), m("div", {
143
+ }))], 64))), 128))], 2), g("div", { class: b(E(i).selected) }, [g("span", ie, "Selected: " + w(q.value.length), 1), v(a, { container: $.value }, null, 8, ["container"])], 2)], 2), z.currentLoadingPath === void 0 ? z.storageEntry ? z.error ? (S(), h("div", {
135
144
  key: 2,
136
- class: y(D(i)["ls-error"])
137
- }, [h("div", { class: y(D(i).cat) }, null, 2), h("div", { class: y(D(i).message) }, T(B.error), 3)], 2)) : (x(), m("div", {
145
+ class: b(E(i)["ls-error"]),
146
+ "data-testid": "pl-file-dialog-error"
147
+ }, [g("div", { class: b(E(i).cat) }, null, 2), g("div", { class: b(E(i).message) }, w(z.error), 3)], 2)) : (S(), h("div", {
138
148
  key: 3,
139
- class: y(D(i)["ls-body"])
140
- }, [(x(!0), m(u, null, w(D(U), (e) => (x(), m(u, { key: e.id }, [e.isDir ? (x(), m("div", {
149
+ class: b(E(i)["ls-body"]),
150
+ "data-testid": "pl-file-dialog-items"
151
+ }, [(S(!0), h(d, null, C(E(H), (e) => (S(), h(d, { key: e.id }, [e.isDir ? (S(), h("div", {
141
152
  key: 0,
142
- class: y(D(i).isDir),
143
- onClick: (t) => Y(e.path)
144
- }, [_(D(t), { name: "chevron-right" }), k((x(), m("span", { title: e.name }, [g(T(e.name), 1)], 8, ie)), [[D(c)]])], 10, re)) : (x(), m("div", {
153
+ class: b(E(i).isDir),
154
+ "data-testid": "pl-file-dialog-dir",
155
+ onClick: (t) => J(e.path)
156
+ }, [v(E(t), { name: "chevron-right" }), O((S(), h("span", { title: e.name }, [_(w(e.name), 1)], 8, N)), [[E(c)]])], 10, oe)) : (S(), h("div", {
145
157
  key: 1,
146
- class: y({
147
- [D(i).canBeSelected]: e.canBeSelected,
148
- [D(i).selected]: e.selected
158
+ class: b({
159
+ [E(i).canBeSelected]: e.canBeSelected,
160
+ [E(i).selected]: e.selected
149
161
  }),
150
- onClick: A((t) => se(t, e), ["stop"])
151
- }, [_(D(t), {
162
+ "data-testid": "pl-file-dialog-file",
163
+ onClick: k((t) => le(t, e), ["stop"])
164
+ }, [v(E(t), {
152
165
  name: "box",
153
- class: y(D(i).isFile)
154
- }, null, 8, ["class"]), k((x(), m("span", { title: e.name }, [g(T(e.name), 1)], 8, I)), [[D(c)]])], 10, F))], 64))), 128))], 2)) : (x(), m("div", {
166
+ class: b(E(i).isFile)
167
+ }, null, 8, ["class"]), O((S(), h("span", { title: e.name }, [_(w(e.name), 1)], 8, F)), [[E(c)]])], 10, P))], 64))), 128))], 2)) : (S(), h("div", {
155
168
  key: 1,
156
- class: y(D(i)["ls-empty"])
157
- }, [h("div", { class: y(D(i).cat) }, null, 2), h("div", { class: y(D(i).message) }, "Select storage to preview", 2)], 2)) : (x(), m("div", ne, [...o[2] ||= [h("i", { class: "mask-24 mask-loading loader-icon" }, null, -1)]]))], 2)], 2));
169
+ class: b(E(i)["ls-empty"]),
170
+ "data-testid": "pl-file-dialog-empty"
171
+ }, [g("div", { class: b(E(i).cat) }, null, 2), g("div", { class: b(E(i).message) }, "Select storage to preview", 2)], 2)) : (S(), h("div", ae, [...o[2] ||= [g("i", { class: "mask-24 mask-loading loader-icon" }, null, -1)]]))], 2)], 2));
158
172
  }
159
173
  });
160
174
  //#endregion
161
- export { L as default };
175
+ export { I as default };
162
176
 
163
177
  //# sourceMappingURL=Remote.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Remote.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from \"../../composition/useEventListener\";\nimport type { ImportedFiles } from \"../../types\";\nimport { between, notEmpty, tapIf } from \"@milaboratories/helpers\";\nimport { getRawPlatformaInstance, type StorageHandle } from \"@platforma-sdk/model\";\nimport { computed, onMounted, reactive, ref, toRef, watch } from \"vue\";\nimport { PlDropdown } from \"../PlDropdown\";\nimport { PlIcon16 } from \"../PlIcon16\";\nimport Shortcuts from \"./Shortcuts.vue\";\nimport { PlMaskIcon16 } from \"../PlMaskIcon16\";\nimport { PlSearchField } from \"../PlSearchField\";\nimport style from \"./pl-file-dialog.module.scss\";\nimport { defaultData, useVisibleItems, vTextOverflown } from \"./remote-helpers\";\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from \"./utils\";\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: \"update:modelValue\", value: boolean): void;\n (e: \"import:files\", value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = \"\";\n data.error = \"\";\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance()\n .lsDriver.listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === \"dir\",\n canBeSelected:\n item.type === \"file\" &&\n (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === \"file\" ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn(\"platforma API is not found\");\n return;\n }\n getRawPlatformaInstance()\n .lsDriver.getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter(\n (it) => it.id !== \"local\" && !it.id.startsWith(\"local_disk_\"),\n );\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, \"storageEntry\"),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? \"\";\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, \"keydown\", (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === \"KeyA\") {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === \"Period\") {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === \"Enter\") {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n\nconst lsContainerRef = ref<HTMLElement | undefined>();\n</script>\n\n<template>\n <div :class=\"style.remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n />\n </div>\n <div>\n <PlSearchField v-model=\"data.search\" label=\"Search in folder\" clearable />\n </div>\n </div>\n <div :class=\"style['ls-container']\" ref=\"lsContainerRef\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div :title=\"s.path\" @click=\"setDirPath(s.path)\">{{ s.name }}</div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span>Selected: {{ selectedFiles.length }}</span>\n <Shortcuts :container=\"lsContainerRef\" />\n </div>\n </div>\n <div v-if=\"data.currentLoadingPath !== undefined\" class=\"ls-loader\">\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div v-else-if=\"!data.storageEntry\" :class=\"style['ls-empty']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">Select storage to preview</div>\n </div>\n <div v-else-if=\"data.error\" :class=\"style['ls-error']\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div v-if=\"file.isDir\" :class=\"style.isDir\" @click=\"setDirPath(file.path)\">\n <PlIcon16 name=\"chevron-right\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n <div\n v-else\n :class=\"{ [style.canBeSelected]: file.canBeSelected, [style.selected]: file.selected }\"\n @click.stop=\"(ev) => selectFile(ev, file)\"\n >\n <PlMaskIcon16 name=\"box\" :class=\"style.isFile\" />\n <span v-text-overflown :title=\"file.name\">{{ file.name }}</span>\n </div>\n </template>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"Remote.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/PlFileDialog/Remote.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useEventListener } from \"../../composition/useEventListener\";\nimport type { ImportedFiles } from \"../../types\";\nimport { between, notEmpty, tapIf } from \"@milaboratories/helpers\";\nimport { getRawPlatformaInstance, type StorageHandle } from \"@platforma-sdk/model\";\nimport { computed, onMounted, reactive, ref, toRef, watch } from \"vue\";\nimport { PlDropdown } from \"../PlDropdown\";\nimport { PlIcon16 } from \"../PlIcon16\";\nimport Shortcuts from \"./Shortcuts.vue\";\nimport { PlMaskIcon16 } from \"../PlMaskIcon16\";\nimport { PlSearchField } from \"../PlSearchField\";\nimport style from \"./pl-file-dialog.module.scss\";\nimport { defaultData, useVisibleItems, vTextOverflown } from \"./remote-helpers\";\nimport { getFilePathBreadcrumbs, normalizeExtensions, type FileDialogItem } from \"./utils\";\n\n// note that on a Mac, a click combined with the control key is intercepted by the operating system and used to open a context menu, so ctrlKey is not detectable on click events.\nconst isCtrlOrMeta = (ev: KeyboardEvent | MouseEvent) => ev.ctrlKey || ev.metaKey;\n\ndefineEmits<{\n (e: \"update:modelValue\", value: boolean): void;\n (e: \"import:files\", value: ImportedFiles): void;\n}>();\n\nconst props = withDefaults(\n defineProps<{\n modelValue: boolean;\n extensions?: string[]; // with dot, like ['.fastq.gz', '.fastq']\n multi?: boolean;\n title?: string;\n autoSelectStorage?: boolean;\n submit: () => void;\n }>(),\n {\n extensions: undefined,\n title: undefined,\n autoSelectStorage: true,\n },\n);\n\nconst data = reactive(defaultData());\n\nconst resetData = () => {\n data.search = \"\";\n data.error = \"\";\n data.lastSelected = undefined;\n};\n\nconst extensions = computed(() => normalizeExtensions(props.extensions));\n\nconst visibleItems = useVisibleItems(data);\n\nconst lookup = computed(() => {\n return {\n modelValue: props.modelValue,\n dirPath: data.dirPath,\n storageHandle: data.storageEntry?.handle,\n };\n});\n\nconst query = (storageHandle: StorageHandle, dirPath: string) => {\n if (!getRawPlatformaInstance()) {\n return;\n }\n\n if (data.currentLoadingPath === dirPath) {\n return;\n }\n\n data.currentLoadingPath = dirPath;\n\n getRawPlatformaInstance()\n .lsDriver.listFiles(storageHandle, dirPath)\n .then((res) => {\n if (dirPath !== data.dirPath) {\n return;\n }\n\n data.items = notEmpty(res)\n .entries.map((item) => ({\n path: item.fullPath,\n name: item.name,\n isDir: item.type === \"dir\",\n canBeSelected:\n item.type === \"file\" &&\n (!extensions.value || extensions.value.some((ext) => item.fullPath.endsWith(ext))),\n handle: item.type === \"file\" ? item.handle : undefined,\n selected: false,\n }))\n .sort((a, b) => {\n if (a.isDir && !b.isDir) return -1;\n if (!a.isDir && b.isDir) return 1;\n // localeCompare for unicode alphabets\n return a.name.localeCompare(b.name);\n })\n .map((it, id) => ({ id, ...it }));\n\n data.lastSelected = undefined;\n })\n .catch((err) => (data.error = String(err)))\n .finally(() => {\n data.currentLoadingPath = undefined;\n });\n};\n\nconst load = () => {\n resetData();\n const { storageHandle, dirPath, modelValue } = lookup.value;\n if (storageHandle && modelValue) {\n query(storageHandle, dirPath);\n }\n};\n\nconst breadcrumbs = computed(() => getFilePathBreadcrumbs(data.dirPath));\n\nconst selectedFiles = computed(() =>\n data.items.filter((f) => f.canBeSelected && f.selected && !f.isDir),\n);\n\nconst isReady = computed(() => selectedFiles.value.length > 0 && data.storageEntry?.handle);\n\nconst getFilesToImport = () => ({\n storageHandle: notEmpty(data.storageEntry?.handle),\n files: selectedFiles.value.map((f) => f.handle!),\n});\n\nconst setDirPath = (dirPath: string) => {\n data.dirPath = dirPath;\n};\n\nconst selectFile = (ev: MouseEvent, file: FileDialogItem) => {\n const { shiftKey } = ev;\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n const { lastSelected } = data;\n\n ev.preventDefault();\n\n const items = visibleItems.value;\n\n if (file.canBeSelected) {\n if (!props.multi) {\n items.forEach((f) => (f.selected = false));\n }\n\n file.selected = !file.selected;\n\n if (!props.multi) {\n return;\n }\n\n if (!ctrlOrMetaKey && !shiftKey) {\n items.forEach((f) => {\n if (f.id !== file.id) {\n f.selected = false;\n }\n });\n }\n\n if (shiftKey && lastSelected !== undefined) {\n items.forEach((f) => {\n if (between(f.id, lastSelected, file.id)) {\n f.selected = true;\n }\n });\n }\n\n if (file.selected) {\n data.lastSelected = file.id;\n }\n }\n};\n\nconst changeAll = (selected: boolean) => {\n if (selected && !props.multi) {\n return;\n }\n\n visibleItems.value\n .filter((f) => f.canBeSelected)\n .forEach((file) => {\n file.selected = selected;\n });\n};\n\nconst selectAll = () => changeAll(true);\n\nconst deselectAll = () => changeAll(false);\n\nconst loadAvailableStorages = () => {\n resetData();\n deselectAll();\n if (!getRawPlatformaInstance()) {\n console.warn(\"platforma API is not found\");\n return;\n }\n getRawPlatformaInstance()\n .lsDriver.getStorageList()\n .then((storageEntries) => {\n // local storage is always returned by the ML, so we need to remove it from remote dialog manually\n storageEntries = storageEntries.filter(\n (it) => it.id !== \"local\" && !it.id.startsWith(\"local_disk_\"),\n );\n\n data.storageOptions = storageEntries.map((it) => ({\n text: it.name,\n value: it,\n }));\n\n if (props.autoSelectStorage) {\n tapIf(storageEntries[0], (entry) => {\n data.storageEntry = entry;\n });\n }\n })\n .catch((err) => (data.error = String(err)));\n};\n\nwatch(\n toRef(data, \"storageEntry\"),\n (entry) => {\n resetData();\n data.dirPath = entry?.initialFullPath ?? \"\";\n },\n { immediate: true },\n);\n\nwatch([() => data.dirPath, () => data.storageEntry], () => {\n load();\n});\n\nwatch(\n () => props.modelValue,\n (isOpen) => {\n if (isOpen) {\n loadAvailableStorages();\n } else {\n Object.assign(data, defaultData());\n }\n },\n { immediate: true },\n);\n\nuseEventListener(document, \"keydown\", (ev: KeyboardEvent) => {\n if (!props.modelValue) {\n return;\n }\n\n if (ev.target !== document.body) {\n return;\n }\n\n const ctrlOrMetaKey = isCtrlOrMeta(ev);\n\n if (ctrlOrMetaKey && ev.code === \"KeyA\") {\n ev.preventDefault();\n selectAll();\n }\n\n if (ctrlOrMetaKey && ev.shiftKey && ev.code === \"Period\") {\n ev.preventDefault();\n data.showHiddenItems = !data.showHiddenItems;\n }\n\n if (ev.code === \"Enter\") {\n props.submit();\n }\n});\n\ndefineExpose({\n isReady,\n getFilesToImport,\n});\n\nonMounted(loadAvailableStorages);\n\nconst lsContainerRef = ref<HTMLElement | undefined>();\n</script>\n\n<template>\n <div :class=\"style.remote\" data-testid=\"pl-file-dialog-remote\" @click.stop=\"deselectAll\">\n <div :class=\"style.search\">\n <div>\n <PlDropdown\n v-model=\"data.storageEntry\"\n label=\"Select storage\"\n :options=\"data.storageOptions\"\n data-testid=\"pl-file-dialog-storage\"\n />\n </div>\n <div>\n <PlSearchField\n v-model=\"data.search\"\n label=\"Search in folder\"\n clearable\n data-testid=\"pl-file-dialog-search\"\n />\n </div>\n </div>\n <div :class=\"style['ls-container']\" ref=\"lsContainerRef\" data-testid=\"pl-file-dialog-browser\">\n <div :class=\"style['ls-head']\">\n <div :class=\"style['breadcrumbs']\" data-testid=\"pl-file-dialog-breadcrumbs\">\n <template v-for=\"(s, i) in breadcrumbs\" :key=\"i\">\n <div\n :title=\"s.path\"\n data-testid=\"pl-file-dialog-breadcrumb\"\n @click=\"setDirPath(s.path)\"\n >\n {{ s.name }}\n </div>\n <PlIcon16 v-if=\"s.index !== breadcrumbs.length - 1\" name=\"chevron-right\" />\n </template>\n </div>\n <div :class=\"style.selected\">\n <span data-testid=\"pl-file-dialog-selected-count\"\n >Selected: {{ selectedFiles.length }}</span\n >\n <Shortcuts :container=\"lsContainerRef\" />\n </div>\n </div>\n <div\n v-if=\"data.currentLoadingPath !== undefined\"\n class=\"ls-loader\"\n data-testid=\"pl-file-dialog-loading\"\n >\n <i class=\"mask-24 mask-loading loader-icon\" />\n </div>\n <div\n v-else-if=\"!data.storageEntry\"\n :class=\"style['ls-empty']\"\n data-testid=\"pl-file-dialog-empty\"\n >\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']\" data-testid=\"pl-file-dialog-error\">\n <div :class=\"style.cat\" />\n <div :class=\"style.message\">{{ data.error }}</div>\n </div>\n <div v-else :class=\"style['ls-body']\" data-testid=\"pl-file-dialog-items\">\n <template v-for=\"file in visibleItems\" :key=\"file.id\">\n <div\n v-if=\"file.isDir\"\n :class=\"style.isDir\"\n data-testid=\"pl-file-dialog-dir\"\n @click=\"setDirPath(file.path)\"\n >\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 data-testid=\"pl-file-dialog-file\"\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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Shortcuts.js","names":[],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip class=\"info\" position=\"bottom\" max-width=\"420px\" :container=\"container\">\n <template #tooltip>\n <span :class=\"$style.title\">Shortcuts</span>\n\n <div :class=\"[$style.row, $style.head]\">\n <div />\n <div>MacOS</div>\n <div>Windows/Linux</div>\n </div>\n\n <div :class=\"[$style.row, $style.body]\">\n <div>Single File</div>\n <div>Click the file</div>\n <div>Click the file</div>\n\n <div>Adjacent multiple files</div>\n <div>Hold Shift, click first and last files</div>\n <div>Hold Shift, click first and last files</div>\n\n <div>Non-adjacent multiple files</div>\n <div>Hold Command (⌘), click each file</div>\n <div>Hold Ctrl, click each file</div>\n\n <div>All files</div>\n <div>Press Command (⌘) + A</div>\n <div>Press Ctrl + A</div>\n </div>\n </template>\n </PlTooltip>\n</template>\n\n<style lang=\"css\" module>\n.title {\n display: inline-block;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n margin-bottom: 10px;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n width: 100%;\n color: #fff;\n column-gap: 1px;\n\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.row > div:nth-child(3n + 1) {\n padding-left: 4px;\n}\n\n.row > div:nth-child(3n) {\n padding-right: 4px;\n}\n\n.head {\n background-color: #110529;\n position: relative;\n}\n\n.head:before {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n left: -12px;\n height: 100%;\n}\n\n.head:after {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n right: -12px;\n height: 100%;\n}\n\n.head > div {\n padding: 6px 12px;\n background-color: #231842;\n}\n\n.body {\n background-color: #231842;\n}\n\n.body > div {\n padding: 6px 12px;\n background: #110529;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"Shortcuts.js","names":[],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip\n class=\"info\"\n position=\"bottom\"\n max-width=\"420px\"\n :container=\"container\"\n data-testid=\"pl-file-dialog-shortcuts\"\n >\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"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Shortcuts.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip class=\"info\" position=\"bottom\" max-width=\"420px\" :container=\"container\">\n <template #tooltip>\n <span :class=\"$style.title\">Shortcuts</span>\n\n <div :class=\"[$style.row, $style.head]\">\n <div />\n <div>MacOS</div>\n <div>Windows/Linux</div>\n </div>\n\n <div :class=\"[$style.row, $style.body]\">\n <div>Single File</div>\n <div>Click the file</div>\n <div>Click the file</div>\n\n <div>Adjacent multiple files</div>\n <div>Hold Shift, click first and last files</div>\n <div>Hold Shift, click first and last files</div>\n\n <div>Non-adjacent multiple files</div>\n <div>Hold Command (⌘), click each file</div>\n <div>Hold Ctrl, click each file</div>\n\n <div>All files</div>\n <div>Press Command (⌘) + A</div>\n <div>Press Ctrl + A</div>\n </div>\n </template>\n </PlTooltip>\n</template>\n\n<style lang=\"css\" module>\n.title {\n display: inline-block;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n margin-bottom: 10px;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n width: 100%;\n color: #fff;\n column-gap: 1px;\n\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.row > div:nth-child(3n + 1) {\n padding-left: 4px;\n}\n\n.row > div:nth-child(3n) {\n padding-right: 4px;\n}\n\n.head {\n background-color: #110529;\n position: relative;\n}\n\n.head:before {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n left: -12px;\n height: 100%;\n}\n\n.head:after {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n right: -12px;\n height: 100%;\n}\n\n.head > div {\n padding: 6px 12px;\n background-color: #231842;\n}\n\n.body {\n background-color: #231842;\n}\n\n.body > div {\n padding: 6px 12px;\n background: #110529;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"Shortcuts.vue_vue_type_style_index_0_lang.module.js","names":[],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip\n class=\"info\"\n position=\"bottom\"\n max-width=\"420px\"\n :container=\"container\"\n data-testid=\"pl-file-dialog-shortcuts\"\n >\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"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Shortcuts.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"names":[],"mappings":"AA+GA,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAClC,CAAC;AAwGF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"Shortcuts.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"names":[],"mappings":"AAqHA,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAClC,CAAC;AA0GF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -10,7 +10,8 @@ var c = /* @__PURE__ */ r({
10
10
  class: "info",
11
11
  position: "bottom",
12
12
  "max-width": "420px",
13
- container: r.container
13
+ container: r.container,
14
+ "data-testid": "pl-file-dialog-shortcuts"
14
15
  }, {
15
16
  tooltip: s(() => [
16
17
  n("span", { class: i(c.$style.title) }, "Shortcuts", 2),
@@ -1 +1 @@
1
- {"version":3,"file":"Shortcuts.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip class=\"info\" position=\"bottom\" max-width=\"420px\" :container=\"container\">\n <template #tooltip>\n <span :class=\"$style.title\">Shortcuts</span>\n\n <div :class=\"[$style.row, $style.head]\">\n <div />\n <div>MacOS</div>\n <div>Windows/Linux</div>\n </div>\n\n <div :class=\"[$style.row, $style.body]\">\n <div>Single File</div>\n <div>Click the file</div>\n <div>Click the file</div>\n\n <div>Adjacent multiple files</div>\n <div>Hold Shift, click first and last files</div>\n <div>Hold Shift, click first and last files</div>\n\n <div>Non-adjacent multiple files</div>\n <div>Hold Command (⌘), click each file</div>\n <div>Hold Ctrl, click each file</div>\n\n <div>All files</div>\n <div>Press Command (⌘) + A</div>\n <div>Press Ctrl + A</div>\n </div>\n </template>\n </PlTooltip>\n</template>\n\n<style lang=\"css\" module>\n.title {\n display: inline-block;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n margin-bottom: 10px;\n}\n\n.row {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n width: 100%;\n color: #fff;\n column-gap: 1px;\n\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.row > div:nth-child(3n + 1) {\n padding-left: 4px;\n}\n\n.row > div:nth-child(3n) {\n padding-right: 4px;\n}\n\n.head {\n background-color: #110529;\n position: relative;\n}\n\n.head:before {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n left: -12px;\n height: 100%;\n}\n\n.head:after {\n position: absolute;\n content: \"\";\n background-color: #231842;\n width: 12px;\n right: -12px;\n height: 100%;\n}\n\n.head > div {\n padding: 6px 12px;\n background-color: #231842;\n}\n\n.body {\n background-color: #231842;\n}\n\n.body > div {\n padding: 6px 12px;\n background: #110529;\n}\n</style>\n"],"mappings":";;;;;;;;yBASE,EA4BY,EAAA,EAAA,EAAA;GA5BD,OAAM;GAAO,UAAS;GAAS,aAAU;GAAS,WAAW,EAAA;;GAC3D,SAAO,QAC4B;IAA5C,EAA4C,QAAA,EAArC,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAE,aAAS,EAAA;IAErC,EAIM,OAAA,EAJA,OAAK,EAAA,CAAGA,EAAAA,OAAO,KAAKA,EAAAA,OAAO,KAAI,CAAA,EAAA,EAAA,CAAA,GAAA,AAAA,EAAA,OAAA;KACnC,EAAO,OAAA,MAAA,MAAA,GAAA;KACP,EAAgB,OAAA,MAAX,SAAK,GAAA;KACV,EAAwB,OAAA,MAAnB,iBAAa,GAAA;;IAGpB,EAgBM,OAAA,EAhBA,OAAK,EAAA,CAAGA,EAAAA,OAAO,KAAKA,EAAAA,OAAO,KAAI,CAAA,EAAA,EAAA,CAAA,GAAA,AAAA,EAAA,OAAA;KACnC,EAAsB,OAAA,MAAjB,eAAW,GAAA;KAChB,EAAyB,OAAA,MAApB,kBAAc,GAAA;KACnB,EAAyB,OAAA,MAApB,kBAAc,GAAA;KAEnB,EAAkC,OAAA,MAA7B,2BAAuB,GAAA;KAC5B,EAAiD,OAAA,MAA5C,0CAAsC,GAAA;KAC3C,EAAiD,OAAA,MAA5C,0CAAsC,GAAA;KAE3C,EAAsC,OAAA,MAAjC,+BAA2B,GAAA;KAChC,EAA4C,OAAA,MAAvC,qCAAiC,GAAA;KACtC,EAAqC,OAAA,MAAhC,8BAA0B,GAAA;KAE/B,EAAoB,OAAA,MAAf,aAAS,GAAA;KACd,EAAgC,OAAA,MAA3B,yBAAqB,GAAA;KAC1B,EAAyB,OAAA,MAApB,kBAAc,GAAA"}
1
+ {"version":3,"file":"Shortcuts.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlFileDialog/Shortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PlTooltip } from \"../PlTooltip\";\n\ndefineProps<{\n container?: \"body\" | HTMLElement;\n}>();\n</script>\n\n<template>\n <PlTooltip\n class=\"info\"\n position=\"bottom\"\n max-width=\"420px\"\n :container=\"container\"\n data-testid=\"pl-file-dialog-shortcuts\"\n >\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"],"mappings":";;;;;;;;yBASE,EAkCY,EAAA,EAAA,EAAA;GAjCV,OAAM;GACN,UAAS;GACT,aAAU;GACT,WAAW,EAAA;GACZ,eAAY;;GAED,SAAO,QAC4B;IAA5C,EAA4C,QAAA,EAArC,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAE,aAAS,EAAA;IAErC,EAIM,OAAA,EAJA,OAAK,EAAA,CAAGA,EAAAA,OAAO,KAAKA,EAAAA,OAAO,KAAI,CAAA,EAAA,EAAA,CAAA,GAAA,AAAA,EAAA,OAAA;KACnC,EAAO,OAAA,MAAA,MAAA,GAAA;KACP,EAAgB,OAAA,MAAX,SAAK,GAAA;KACV,EAAwB,OAAA,MAAnB,iBAAa,GAAA;;IAGpB,EAgBM,OAAA,EAhBA,OAAK,EAAA,CAAGA,EAAAA,OAAO,KAAKA,EAAAA,OAAO,KAAI,CAAA,EAAA,EAAA,CAAA,GAAA,AAAA,EAAA,OAAA;KACnC,EAAsB,OAAA,MAAjB,eAAW,GAAA;KAChB,EAAyB,OAAA,MAApB,kBAAc,GAAA;KACnB,EAAyB,OAAA,MAApB,kBAAc,GAAA;KAEnB,EAAkC,OAAA,MAA7B,2BAAuB,GAAA;KAC5B,EAAiD,OAAA,MAA5C,0CAAsC,GAAA;KAC3C,EAAiD,OAAA,MAA5C,0CAAsC,GAAA;KAE3C,EAAsC,OAAA,MAAjC,+BAA2B,GAAA;KAChC,EAA4C,OAAA,MAAvC,qCAAiC,GAAA;KACtC,EAAqC,OAAA,MAAhC,8BAA0B,GAAA;KAE/B,EAAoB,OAAA,MAAf,aAAS,GAAA;KACd,EAAgC,OAAA,MAA3B,yBAAqB,GAAA;KAC1B,EAAyB,OAAA,MAApB,kBAAc,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlFileInput.js","names":[],"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>(\n v: T | undefined,\n cb: (v: T) => string | undefined,\n) => {\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\n :class=\"{ 'pl-file-input__cell-style': !!cellStyle, 'has-file': !!fileName }\"\n class=\"pl-file-input__envelope\"\n >\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\n v-if=\"modelValue\"\n class=\"pl-file-input__clear\"\n name=\"close\"\n @click.stop=\"clear\"\n />\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"],"mappings":""}
1
+ {"version":3,"file":"PlFileInput.js","names":[],"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>(\n v: T | undefined,\n cb: (v: T) => string | undefined,\n) => {\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\n :class=\"{ 'pl-file-input__cell-style': !!cellStyle, 'has-file': !!fileName }\"\n class=\"pl-file-input__envelope\"\n data-testid=\"pl-file-input\"\n >\n <div\n ref=\"rootRef\"\n :class=\"{ dashed, error: hasErrors }\"\n class=\"pl-file-input\"\n data-testid=\"pl-file-input-control\"\n tabindex=\"0\"\n @keyup.enter=\"openFileDialog\"\n @click.stop=\"openFileDialog\"\n >\n <div\n :style=\"progressStyle\"\n class=\"pl-file-input__progress\"\n data-testid=\"pl-file-input-progress\"\n />\n <label v-if=\"!cellStyle && label\" ref=\"label\" data-testid=\"pl-file-input-label\">\n <PlSvg v-if=\"required\" :uri=\"SvgRequired\" data-testid=\"pl-file-input-required\" />\n <span>{{ label }}</span>\n <PlTooltip\n v-if=\"slots.tooltip || filePath\"\n class=\"info\"\n position=\"top\"\n data-testid=\"pl-file-input-tooltip\"\n >\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\" data-testid=\"pl-file-input-status-icon\" />\n <PlMaskIcon24\n v-else-if=\"isUploading\"\n name=\"cloud-upload\"\n data-testid=\"pl-file-input-status-icon\"\n />\n <PlMaskIcon24 v-else-if=\"isUploaded\" name=\"success\" data-testid=\"pl-file-input-status-icon\" />\n <PlMaskIcon24 v-else name=\"paper-clip\" data-testid=\"pl-file-input-status-icon\" />\n <div\n :data-placeholder=\"placeholder ?? 'Choose file'\"\n class=\"pl-file-input__filename\"\n data-testid=\"pl-file-input-filename\"\n >\n {{ fileName }}\n </div>\n <div v-if=\"uploadStats\" class=\"pl-file-input__stats\" data-testid=\"pl-file-input-stats\">\n {{ uploadStats }}\n </div>\n <PlMaskIcon24\n v-if=\"modelValue\"\n class=\"pl-file-input__clear\"\n data-testid=\"pl-file-input-clear\"\n name=\"close\"\n @click.stop=\"clear\"\n />\n <DoubleContour class=\"pl-file-input__contour\" />\n </div>\n <div v-if=\"hasErrors\" class=\"pl-file-input__error\" data-testid=\"pl-file-input-error\">\n {{ computedErrorMessage }}\n </div>\n <div v-else-if=\"helper\" class=\"pl-file-input__helper\" data-testid=\"pl-file-input-helper\">\n {{ helper }}\n </div>\n <!-- Teleported to <body> by PlDialogModal; kept inside so the component has a single root. -->\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 </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"PlFileInput.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileInput/PlFileInput.vue"],"names":[],"mappings":"AAoOA,OAAO,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0B7E,KAAK,WAAW,GAAG;IACf;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC,CAAC;AA6VJ,QAAA,IAAI,QAAQ,IAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAMhD,QAAA,MAAM,UAAU;;;;;WA9YJ,MAAM;cAoBH,cAAc;;YAQhB,MAAM;iBAZD,MAAM;gBAJP,MAAM,EAAE;eAoBT,OAAO;qBAID,MAAM;mCAIQ,OAAO;6EA0WzC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"PlFileInput.vue.d.ts","sourceRoot":"","sources":["../../../src/components/PlFileInput/PlFileInput.vue"],"names":[],"mappings":"AA6PA,OAAO,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0B7E,KAAK,WAAW,GAAG;IACf;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC,CAAC;AAmXJ,QAAA,IAAI,QAAQ,IAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAQhD,QAAA,MAAM,UAAU;;;;;WAtaJ,MAAM;cAoBH,cAAc;;YAQhB,MAAM;iBAZD,MAAM;gBAJP,MAAM,EAAE;eAoBT,OAAO;qBAID,MAAM;mCAIQ,OAAO;6EAkYzC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}