@dataloop-ai/components 0.18.0 → 0.18.2

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 (277) hide show
  1. package/package.json +6 -3
  2. package/src/App.vue +5 -227
  3. package/src/assets/constants.scss +2 -1
  4. package/src/assets/globals.scss +21 -0
  5. package/src/components/basic/DlAccordion/DlAccordion.vue +26 -4
  6. package/src/components/basic/DlAccordion/components/AccordionHeader.vue +2 -1
  7. package/src/components/basic/DlAvatar/DlAvatar.vue +1 -1
  8. package/src/components/basic/DlButton/DlButton.vue +115 -25
  9. package/src/components/basic/DlButton/utils.ts +45 -2
  10. package/src/components/basic/DlChip/DlChip.vue +3 -7
  11. package/src/components/basic/DlChip/utils.ts +4 -4
  12. package/src/components/basic/DlContainer/DlContainer.vue +70 -0
  13. package/src/components/basic/DlContainer/index.ts +3 -0
  14. package/src/components/basic/DlEmptyState/DlEmptyState.vue +282 -0
  15. package/src/components/basic/DlEmptyState/index.ts +2 -0
  16. package/src/components/basic/DlEmptyState/types.ts +20 -0
  17. package/src/components/basic/DlGrid/DlGrid.vue +163 -0
  18. package/src/components/basic/DlGrid/index.ts +4 -0
  19. package/src/components/basic/DlGrid/types.ts +5 -0
  20. package/src/components/basic/DlKpi/components/KpiInfo.vue +2 -1
  21. package/src/components/basic/DlListItem/DlListItem.vue +96 -66
  22. package/src/components/basic/DlListItem/utils.ts +0 -3
  23. package/src/components/basic/DlPanelContainer/DlPanelContainer.vue +37 -13
  24. package/src/components/basic/DlPopup/DlPopup.vue +58 -11
  25. package/src/components/basic/DlPopup/components/PopupHeader.vue +11 -6
  26. package/src/components/basic/DlProgressChart/DlProgressChart.vue +2 -1
  27. package/src/components/basic/DlWidget/DlWidget.vue +273 -141
  28. package/src/components/basic/DlWidget/index.ts +1 -3
  29. package/src/components/basic/DlWidget/utils.ts +90 -8
  30. package/src/components/basic/index.ts +4 -2
  31. package/src/components/basic/types.ts +2 -0
  32. package/src/components/compound/DlCard/DlCard.vue +796 -0
  33. package/src/components/compound/DlCard/components/DescriptionModal.vue +137 -0
  34. package/src/components/compound/DlCard/types.ts +38 -0
  35. package/src/components/compound/DlCharts/charts/DlBarChart/DlBarChart.vue +39 -4
  36. package/src/components/compound/DlCharts/charts/DlColumnChart/DlColumnChart.vue +128 -36
  37. package/src/components/compound/DlCharts/charts/DlConfusionMatrix/DlConfusionMatrix.vue +167 -87
  38. package/src/components/compound/DlCharts/charts/DlConfusionMatrix/utils.ts +2 -1
  39. package/src/components/compound/DlCharts/charts/DlDoughnutChart/DlDoughnutChart.vue +44 -3
  40. package/src/components/compound/DlCharts/charts/DlDoughnutChart/DlDoughnutChartWidget.vue +1 -2
  41. package/src/components/compound/DlCharts/charts/DlDoughnutChart/components/DlDoughnutChartLegend.vue +9 -18
  42. package/src/components/compound/DlCharts/charts/DlLineChart/DlLineChart.vue +48 -9
  43. package/src/components/compound/DlCharts/charts/DlScatterChart/DlScatterChart.vue +667 -0
  44. package/src/components/compound/DlCharts/charts/DlScatterChart/index.ts +2 -0
  45. package/src/components/compound/DlCharts/charts/index.ts +1 -0
  46. package/src/components/compound/DlCharts/components/DlBrush.vue +3 -2
  47. package/src/components/compound/DlCharts/components/DlChartLabels.vue +2 -1
  48. package/src/components/compound/DlCharts/components/DlChartScrollBar.vue +1 -0
  49. package/src/components/compound/DlCharts/types/props.ts +5 -1
  50. package/src/components/compound/DlCharts/utils.ts +1 -1
  51. package/src/components/compound/DlCodeEditor/DlCodeEditor.vue +173 -0
  52. package/src/components/compound/DlCodeEditor/README.md +11 -0
  53. package/src/components/compound/DlCodeEditor/components/CodeEditor.vue +705 -0
  54. package/src/components/compound/DlCodeEditor/index.ts +3 -0
  55. package/src/components/compound/DlCodeEditor/styles/themes-base16.css +12809 -0
  56. package/src/components/compound/DlCodeEditor/styles/themes.css +3999 -0
  57. package/src/components/compound/DlCodeEditor/types.ts +21 -0
  58. package/src/components/compound/DlDateTime/DlDatePicker/DlDatePicker.vue +9 -1
  59. package/src/components/compound/DlDateTime/DlDatePicker/components/DlCalendar.vue +4 -2
  60. package/src/components/compound/DlDateTime/DlDatePicker/components/DlMonthCalendar.vue +2 -1
  61. package/src/components/compound/DlDateTime/DlDateTimeRange/{DlCardSidebar.vue → CardSidebar.vue} +10 -11
  62. package/src/components/compound/DlDateTime/DlDateTimeRange/DlDateTimeRange.vue +18 -9
  63. package/src/components/compound/DlDateTime/DlTimePicker/DlTimePicker.vue +2 -2
  64. package/src/components/compound/DlDialogBox/DlDialogBox.vue +74 -15
  65. package/src/components/compound/DlDialogBox/components/DlDialogBoxFooter.vue +1 -1
  66. package/src/components/compound/DlDialogBox/components/DlDialogBoxHeader.vue +9 -7
  67. package/src/components/compound/DlDropdownButton/DlDropdownButton.vue +13 -4
  68. package/src/components/compound/DlInput/DlInput.vue +80 -17
  69. package/src/components/compound/DlJsonEditor/DlJsonEditor.vue +42 -219
  70. package/src/components/compound/DlOptionGroup/DlOptionGroup.vue +16 -17
  71. package/src/components/compound/DlOptionGroup/components/MenuItemWrapper.vue +2 -2
  72. package/src/components/compound/DlPagination/DlPagination.vue +1 -1
  73. package/src/components/compound/DlPagination/components/PaginationLegend.vue +0 -2
  74. package/src/components/compound/DlPagination/components/RowsSelector.vue +0 -2
  75. package/src/components/compound/DlRange/DlRange.vue +3 -2
  76. package/src/components/compound/DlSearches/DlSearch/DlSearch.vue +12 -5
  77. package/src/components/compound/DlSearches/DlSmartSearch/DlSmartSearch.vue +413 -97
  78. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSmartSearchFilters.vue +4 -1
  79. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSmartSearchInput.vue +100 -39
  80. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSuggestionsDropdown.vue +12 -7
  81. package/src/components/compound/DlSearches/DlSmartSearch/components/FiltersQuery.vue +5 -6
  82. package/src/components/compound/DlSearches/DlSmartSearch/types.ts +14 -0
  83. package/src/components/compound/DlSearches/DlSmartSearch/utils/highlightSyntax.ts +10 -6
  84. package/src/components/compound/DlSearches/DlSmartSearch/utils/index.ts +172 -48
  85. package/src/components/compound/DlSelect/DlSelect.vue +264 -130
  86. package/src/components/compound/DlSelect/utils.ts +4 -1
  87. package/src/components/compound/DlSlider/DlSlider.vue +10 -2
  88. package/src/components/compound/DlSlider/components/DlSliderBase.vue +3 -3
  89. package/src/components/compound/DlSlider/components/DlSliderInput.vue +17 -26
  90. package/src/components/compound/DlSlider/sliderStyles.scss +5 -1
  91. package/src/components/compound/DlSlider/useSlider.ts +2 -2
  92. package/src/components/compound/DlSlider/utils.ts +2 -2
  93. package/src/components/compound/DlStepper/DlStepper.vue +46 -4
  94. package/src/components/compound/DlStepper/components/DlStepperContent.vue +6 -2
  95. package/src/components/compound/DlStepper/components/DlStepperFooter.vue +12 -0
  96. package/src/components/compound/DlStepper/components/DlStepperSidebar.vue +24 -11
  97. package/src/components/compound/DlStepper/models/Step.ts +37 -8
  98. package/src/components/compound/DlStepper/models/Stepper.ts +108 -15
  99. package/src/components/compound/DlStepper/models/interfaces.ts +2 -1
  100. package/src/components/compound/DlTable/DlTable.vue +49 -14
  101. package/src/components/compound/DlTable/components/DlTd.vue +9 -9
  102. package/src/components/compound/DlTable/components/DlTh.vue +3 -2
  103. package/src/components/compound/DlTable/hooks/tableColumnSelection.ts +35 -40
  104. package/src/components/compound/DlTable/hooks/tableFilter.ts +33 -21
  105. package/src/components/compound/DlTable/hooks/tablePagination.ts +18 -18
  106. package/src/components/compound/DlTable/hooks/tableRowExpand.ts +2 -1
  107. package/src/components/compound/DlTable/hooks/tableRowSelection.ts +0 -1
  108. package/src/components/compound/DlTable/hooks/tableSort.ts +52 -47
  109. package/src/components/compound/DlTable/styles/dl-table-styles.scss +8 -0
  110. package/src/components/compound/DlTabs/DlTabs.vue +83 -31
  111. package/src/components/compound/DlTabs/components/DlTab.vue +14 -4
  112. package/src/components/compound/DlTabs/components/TabsWrapper.vue +32 -27
  113. package/src/components/compound/DlThumbnailGallery/DlThumbnailGallery.vue +268 -0
  114. package/src/components/compound/DlThumbnailGallery/index.ts +2 -0
  115. package/src/components/compound/DlThumbnailGallery/types.ts +11 -0
  116. package/src/components/compound/DlToast/api/useToast.ts +42 -1
  117. package/src/components/compound/DlToast/components/ToastComponent.vue +24 -32
  118. package/src/components/compound/DlToast/types.ts +52 -0
  119. package/src/components/compound/DlTreeTable/DlTreeTable.vue +1293 -0
  120. package/src/components/compound/DlTreeTable/components/DlTdTree.vue +119 -0
  121. package/src/components/compound/DlTreeTable/components/DlTrTree.vue +52 -0
  122. package/src/components/compound/DlTreeTable/index.ts +3 -0
  123. package/src/components/compound/DlTreeTable/types.ts +1 -0
  124. package/src/components/compound/DlTreeTable/utils/convertToNestedObject.ts +51 -0
  125. package/src/components/compound/DlTreeTable/utils/flatTreeData.ts +19 -0
  126. package/src/components/compound/DlTreeTable/utils/getFromChildren.ts +39 -0
  127. package/src/components/compound/DlTreeTable/utils/trSpacing.ts +13 -0
  128. package/src/components/compound/DlTreeTable/utils/treeTableRowSelection.ts +184 -0
  129. package/src/components/compound/index.ts +14 -1
  130. package/src/components/compound/types.ts +2 -0
  131. package/src/components/essential/DlBadge/DlBadge.vue +3 -3
  132. package/src/components/essential/DlCheckbox/DlCheckbox.vue +10 -7
  133. package/src/components/essential/DlEllipsis/DlEllipsis.vue +141 -0
  134. package/src/components/essential/DlIcon/DlIcon.vue +5 -5
  135. package/src/components/essential/DlLabel/DlLabel.vue +190 -0
  136. package/src/components/essential/DlLabel/index.ts +2 -0
  137. package/src/components/essential/DlList/DlList.vue +3 -3
  138. package/src/components/essential/DlMenu/DlMenu.vue +41 -22
  139. package/src/components/essential/DlMenu/utils.ts +8 -7
  140. package/src/components/essential/DlPageLayout/DlPageLayout.vue +90 -0
  141. package/src/components/essential/DlPageLayout/index.ts +2 -0
  142. package/src/components/essential/DlProgressBar/DlProgressBar.vue +1 -1
  143. package/src/components/essential/DlRadio/DlRadio.vue +10 -5
  144. package/src/components/essential/DlSeparator/DlSeparator.vue +2 -2
  145. package/src/components/essential/DlSpinner/index.ts +1 -13
  146. package/src/components/essential/DlSpinner/styles/spinnerStyles.scss +7 -0
  147. package/src/components/essential/DlSwitch/DlSwitch.vue +6 -3
  148. package/src/components/essential/DlTextArea/DlTextArea.vue +212 -7
  149. package/src/components/essential/DlThemeProvider/DlThemeProvider.vue +6 -0
  150. package/src/components/essential/DlTypography/DlTypography.vue +7 -1
  151. package/src/components/essential/index.ts +3 -2
  152. package/src/components/shared/DlInfoErrorMessage/DlInfoErrorMessage.vue +1 -1
  153. package/src/components/{essential → shared}/DlTooltip/DlTooltip.vue +26 -19
  154. package/src/components/shared/DlVirtualScroll/DlVirtualScroll.vue +106 -43
  155. package/src/components/shared/DlVirtualScroll/useVirtualScroll.ts +28 -4
  156. package/src/components/shared/index.ts +1 -0
  157. package/src/components/types.ts +2 -0
  158. package/src/demos/BarChartDemo.vue +59 -2
  159. package/src/demos/ColumnChartDemo.vue +67 -2
  160. package/src/demos/DlAccordionDemo.vue +92 -43
  161. package/src/demos/DlAlertDemo.vue +14 -0
  162. package/src/demos/DlButtonDemo.vue +41 -4
  163. package/src/demos/DlCardDemo.vue +156 -19
  164. package/src/demos/DlChartDoughnutDemo.vue +49 -2
  165. package/src/demos/DlCheckboxDemo.vue +28 -3
  166. package/src/demos/DlCodeEditor/DlCodeEditorDemo.vue +247 -0
  167. package/src/demos/DlCodeEditor/index.ts +2 -0
  168. package/src/demos/DlConfusionMatrixDemo.vue +93 -37
  169. package/src/demos/DlDemoPage.vue +235 -0
  170. package/src/demos/DlDialogBoxDemo.vue +56 -51
  171. package/src/demos/DlDropdownButtonDemo.vue +35 -27
  172. package/src/demos/DlEmptyStateDemo.vue +81 -0
  173. package/src/demos/DlGridDemo.vue +40 -0
  174. package/src/demos/DlInputDemo.vue +21 -1
  175. package/src/demos/DlJsonEditorDemo.vue +59 -0
  176. package/src/demos/DlLabelDemo.vue +208 -0
  177. package/src/demos/DlLineChartDemo.vue +50 -2
  178. package/src/demos/DlListDemo.vue +12 -9
  179. package/src/demos/DlMenuDemo.vue +147 -20
  180. package/src/demos/DlPageLayoutDemo.vue +146 -0
  181. package/src/demos/DlPanelContainerDemo.vue +113 -2
  182. package/src/demos/DlPopupDemo.vue +82 -1
  183. package/src/demos/DlRadioDemo.vue +16 -1
  184. package/src/demos/DlScatterChartDemo.vue +161 -0
  185. package/src/demos/DlSearchDemo.vue +9 -0
  186. package/src/demos/DlSelectDemo.vue +124 -27
  187. package/src/demos/DlSpinnerDemo.vue +0 -2
  188. package/src/demos/DlStepperDemo/DlStepperDemo.vue +5 -1
  189. package/src/demos/DlStepperDemo/EmptyStateStepper.vue +149 -0
  190. package/src/demos/DlStepperDemo/SimpleStepper.vue +4 -0
  191. package/src/demos/DlStepperDemo/steps/GeneralStep.vue +1 -0
  192. package/src/demos/DlSwitchDemo.vue +12 -0
  193. package/src/demos/DlTableDemo.vue +84 -5
  194. package/src/demos/DlTabsDemo.vue +92 -3
  195. package/src/demos/DlTextAreaDemo.vue +14 -17
  196. package/src/demos/DlThumbnailGalleryDemo.vue +99 -0
  197. package/src/demos/DlToastDemo.vue +3 -9
  198. package/src/demos/DlTooltipDemo.vue +66 -2
  199. package/src/demos/DlTreeTableDemo.vue +694 -0
  200. package/src/demos/DlVirtualScrollDemo.vue +3 -12
  201. package/src/demos/DlWidgetDemo.vue +252 -61
  202. package/src/demos/SmartSearchDemo/DlSmartSearchDemo.vue +151 -32
  203. package/src/demos/index.ts +23 -4
  204. package/src/hooks/use-anchor.ts +15 -17
  205. package/src/hooks/use-arrow-navigation.ts +64 -21
  206. package/src/hooks/use-model-toggle.ts +14 -16
  207. package/src/hooks/use-portal.ts +9 -3
  208. package/src/hooks/use-scroll-target.ts +2 -4
  209. package/src/hooks/use-size-observer.ts +3 -2
  210. package/src/hooks/use-suggestions.ts +239 -49
  211. package/src/hooks/use-transition.ts +10 -4
  212. package/src/index.ts +22 -1
  213. package/src/layouts/DlDatasetBrowser/DemoComponents/DatasetFooter.vue +78 -0
  214. package/src/layouts/DlDatasetBrowser/DemoComponents/DatasetHeader.vue +22 -0
  215. package/src/layouts/DlDatasetBrowser/DemoComponents/DatasetLeftDrawer.vue +96 -0
  216. package/src/layouts/DlDatasetBrowser/DemoComponents/DatasetMainContent.vue +51 -0
  217. package/src/layouts/DlDatasetBrowser/DemoComponents/DatasetRightDrawer.vue +88 -0
  218. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/ActionsMenu.vue +70 -0
  219. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/AutomationMenu.vue +106 -0
  220. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/CardView.vue +101 -0
  221. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/CardViewGallery.vue +141 -0
  222. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/CardViewTable.vue +193 -0
  223. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/EmptyState/LayoutEmptyState.vue +227 -0
  224. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/EmptyState/UploadData.vue +106 -0
  225. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/MainContentImages.vue +540 -0
  226. package/src/layouts/DlDatasetBrowser/DemoComponents/MainContent/MainContentNav.vue +329 -0
  227. package/src/layouts/DlDatasetBrowser/DemoComponents/NavbarKpi.vue +84 -0
  228. package/src/layouts/DlDatasetBrowser/DemoComponents/NavbarSearch.vue +132 -0
  229. package/src/layouts/DlDatasetBrowser/DemoComponents/SearchFilterMenu.vue +19 -0
  230. package/src/layouts/DlDatasetBrowser/DemoComponents/filters/AddFilter.vue +212 -0
  231. package/src/layouts/DlDatasetBrowser/DemoComponents/types/imageMetadata.ts +28 -0
  232. package/src/layouts/DlDatasetBrowser/DlDatasetBrowser.vue +42 -0
  233. package/src/layouts/DlStudioLayout/DlStudioLayout.vue +42 -0
  234. package/src/layouts/DlStudioLayout/components/Demo/LeftMenuContent.vue +23 -0
  235. package/src/layouts/DlStudioLayout/components/Demo/StudioFooter.vue +25 -0
  236. package/src/layouts/DlStudioLayout/components/Demo/StudioHeader.vue +121 -0
  237. package/src/layouts/DlStudioLayout/components/Demo/StudioLeftDrawer.vue +245 -0
  238. package/src/layouts/DlStudioLayout/components/Demo/StudioMainContent.vue +31 -0
  239. package/src/layouts/DlStudioLayout/components/Demo/StudioTabsMenu.vue +117 -0
  240. package/src/layouts/DlStudioLayout/components/Demo/TabMenu/FilterMenu.vue +62 -0
  241. package/src/layouts/DlStudioLayout/components/Demo/TabMenu/TabMenuAnnotations.vue +98 -0
  242. package/src/layouts/DlStudioLayout/components/Demo/TabMenu/TabMenuItem.vue +66 -0
  243. package/src/layouts/DlStudioLayout/components/LayoutNavbar.vue +24 -0
  244. package/src/layouts/DlStudioLayout/components/ListAutocomplete.vue +149 -0
  245. package/src/layouts/DlStudioLayout/components/NavigationDrawer.vue +147 -0
  246. package/src/layouts/DlStudioLayout/index.ts +2 -0
  247. package/src/layouts/DlStudioLayout/types/HorizontalItems.ts +9 -0
  248. package/src/layouts/DlStudioLayout/types/VerticalItems.ts +10 -0
  249. package/src/simple-code-editor.d.ts +1 -0
  250. package/src/utils/click-outside.ts +1 -1
  251. package/src/utils/dom.ts +5 -5
  252. package/src/utils/events.ts +3 -3
  253. package/src/utils/global-nodes.ts +2 -2
  254. package/src/utils/input-sizes.ts +5 -2
  255. package/src/utils/is-ellipsis-active.ts +4 -1
  256. package/src/utils/parse-smart-query.ts +209 -111
  257. package/src/utils/portal.ts +5 -5
  258. package/src/utils/position-engine.ts +7 -7
  259. package/src/utils/render.ts +1 -1
  260. package/src/utils/scroll.ts +2 -2
  261. package/src/utils/selection.ts +3 -3
  262. package/vite.config.ts +9 -1
  263. package/src/components/basic/DlCard/DlCard.vue +0 -241
  264. package/src/components/basic/DlCard/types.ts +0 -20
  265. package/src/components/basic/DlEllipsis/DlEllipsis.vue +0 -114
  266. package/src/components/basic/DlWidget/DlGrid.vue +0 -33
  267. package/src/components/basic/DlWidget/DlGridRow.vue +0 -32
  268. package/src/components/compound/DlSearches/DlSmartSearch/utils/utils.ts +0 -124
  269. package/src/components/compound/DlToast/utils/config.ts +0 -17
  270. package/src/components/essential/DlTextHolder/DlTextHolder.vue +0 -65
  271. package/src/components/essential/DlTextHolder/index.ts +0 -2
  272. package/src/demos/DlTextHolderDemo.vue +0 -42
  273. package/src/utils/swapNodes.ts +0 -30
  274. /package/src/components/{basic → compound}/DlCard/index.ts +0 -0
  275. /package/src/components/compound/DlDateTime/DlDateTimeRange/{DlDateInput.vue → DateInput.vue} +0 -0
  276. /package/src/components/{basic → essential}/DlEllipsis/index.ts +0 -0
  277. /package/src/components/{essential → shared}/DlTooltip/index.ts +0 -0
@@ -6,36 +6,55 @@
6
6
  <div
7
7
  :id="uuid"
8
8
  ref="widget"
9
- :class="widgetStyles"
9
+ :class="widgetClasses"
10
+ @mouseenter="handleVisibleDragIcon(true)"
11
+ @mouseleave="handleVisibleDragIcon(false)"
10
12
  >
11
- <div
12
- class="dl-widget__header"
13
- @mouseenter="visibleDragIcon = true"
14
- @mouseleave="visibleDragIcon = false"
15
- >
16
- <div class="dl-widget__header--titles">
17
- <slot name="header" />
13
+ <dl-icon
14
+ v-if="draggable"
15
+ :style="iconStyles"
16
+ class="dl-widget__drag-icon"
17
+ icon="icon-dl-drag"
18
+ color="dl-color-medium"
19
+ size="15px"
20
+ @mousedown="startDragging"
21
+ />
22
+ <slot>
23
+ <div class="dl-widget__header">
24
+ <div class="dl-widget__header--titles">
25
+ <slot name="header" />
26
+ </div>
27
+ <slot name="menu" />
18
28
  </div>
19
- <dl-icon
20
- :style="`visibility: ${
21
- visibleDragIcon ? 'visible' : 'hidden'
22
- }`"
23
- class="dl-widget__header--drag-icon"
24
- icon="icon-dl-drag"
25
- color="dl-color-medium"
26
- size="15px"
27
- @mousedown="startDragging"
28
- />
29
- <slot name="menu" />
30
- </div>
31
-
32
- <div class="dl-widget__content">
33
- <slot name="content" />
34
- </div>
35
-
36
- <div class="dl-widget__description">
37
- <slot name="description" />
38
- </div>
29
+
30
+ <div class="dl-widget__content">
31
+ <dl-empty-state
32
+ v-if="isEmpty"
33
+ v-bind="emptyStateProps"
34
+ >
35
+ <template
36
+ v-for="(_, slot) in $slots"
37
+ #[slot]="props"
38
+ >
39
+ <slot
40
+ :name="slot"
41
+ v-bind="props"
42
+ />
43
+ </template>
44
+ </dl-empty-state>
45
+ <slot
46
+ v-if="!isEmpty"
47
+ name="content"
48
+ />
49
+ </div>
50
+
51
+ <div
52
+ v-if="!isEmpty"
53
+ class="dl-widget__description"
54
+ >
55
+ <slot name="description" />
56
+ </div>
57
+ </slot>
39
58
  </div>
40
59
  <div
41
60
  ref="clone"
@@ -45,143 +64,232 @@
45
64
  </template>
46
65
  <script lang="ts">
47
66
  import { v4 } from 'uuid'
48
- import { defineComponent } from 'vue-demi'
67
+ import { computed, defineComponent, ref, toRef, PropType } from 'vue-demi'
49
68
  import { DlIcon } from '../../essential'
50
- import {
51
- getElementAbove,
52
- addMouseEnter,
53
- removeMouseEnter,
54
- setFlexBasis,
55
- insertAfter
56
- } from './utils'
57
- import { swapNodes } from '../../../utils/swapNodes'
69
+ import { getElementAbove, addMouseEnter, removeMouseEnter } from './utils'
70
+ import { DlEmptyStateProps } from '../DlEmptyState/types'
71
+ import DlEmptyState from '../DlEmptyState/DlEmptyState.vue'
58
72
 
59
73
  export default defineComponent({
60
74
  name: 'DlWidget',
61
75
  components: {
62
- DlIcon
76
+ DlIcon,
77
+ DlEmptyState
63
78
  },
64
- data() {
65
- return {
66
- uuid: `dl-widget-${v4()}`,
67
- draggedWidget: null,
68
- hoveredWidget: null,
69
- isLeftSide: false,
70
- flexBasis: null,
71
- isDragging: false,
72
- timer: null,
73
- visibleDragIcon: false
74
- }
75
- },
76
- computed: {
77
- widgetStyles() {
78
- return `${this.isDragging ? 'dl-widget__drag' : 'dl-widget'}`
79
+ props: {
80
+ isEmpty: Boolean,
81
+ emptyStateProps: {
82
+ type: Object as PropType<DlEmptyStateProps>,
83
+ default: null
84
+ },
85
+ draggable: {
86
+ type: Boolean,
87
+ default: true
79
88
  }
80
89
  },
81
- mounted() {
82
- setFlexBasis()
83
- },
84
- methods: {
85
- startDragging(e: MouseEvent) {
86
- this.isDragging = true
87
- this.draggedWidget = getElementAbove(
90
+ setup(props) {
91
+ const uuid = ref(`dl-widget-${v4()}`)
92
+ const draggedWidget = ref<HTMLElement>(null)
93
+ const hoveredWidget = ref(null)
94
+ const isLeftSide = ref(false)
95
+ const flexBasis = ref(null)
96
+ const isDragging = ref(false)
97
+ const timer = ref(null)
98
+ const visibleDragIcon = ref(false)
99
+ const wrapper = ref<HTMLDivElement>(null)
100
+ const widget = ref<HTMLDivElement>(null)
101
+ const clone = ref<HTMLDivElement>(null)
102
+ const draggableRef = toRef(props, 'draggable')
103
+
104
+ const widgetClasses = computed(() => {
105
+ return `${isDragging.value ? 'dl-widget__drag' : 'dl-widget'}`
106
+ })
107
+ const iconStyles = computed(() => {
108
+ return {
109
+ '--dl-widget-drag-icon-left': `${
110
+ (widget.value as HTMLElement)?.offsetWidth / 2
111
+ }px`,
112
+ visibility:
113
+ visibleDragIcon.value && !isDragging.value
114
+ ? 'visible'
115
+ : 'hidden'
116
+ }
117
+ })
118
+
119
+ const startDragging = (e: MouseEvent) => {
120
+ isDragging.value = true
121
+ document.body.style.cursor = 'grabbing'
122
+ draggedWidget.value = getElementAbove(
88
123
  e.target as HTMLElement,
89
124
  'dl-widget'
90
125
  )
91
- if (this.draggedWidget) {
92
- (this.$refs.clone as HTMLElement).appendChild(
93
- this.draggedWidget.cloneNode(true)
94
- )
126
+ if (draggedWidget.value && clone.value) {
127
+ clone.value.appendChild(draggedWidget.value.cloneNode(true))
128
+ clone.value.style.visibility = 'visible'
129
+ clone.value.style.width = `${draggedWidget.value.offsetWidth}px`
130
+ clone.value.style.height = `${draggedWidget.value.offsetHeight}px`
131
+ clone.value.style.backgroundColor = `var(--dl-color-bg)`
95
132
  }
96
133
 
97
- const sourceCanvas = this.draggedWidget?.querySelector('canvas')
98
- if (sourceCanvas) {
99
- const targetCanvasCtx = (this.$refs.clone as HTMLElement)
134
+ const sourceCanvas = draggedWidget.value?.querySelector('canvas')
135
+ if (sourceCanvas && clone.value) {
136
+ const targetCanvasCtx = clone.value
100
137
  .querySelector('canvas')
101
138
  .getContext('2d')
102
139
 
103
140
  targetCanvasCtx.drawImage(sourceCanvas, 0, 0)
104
141
  }
105
142
 
106
- this.moveClone(e as MouseEvent)
143
+ moveClone(e as MouseEvent)
107
144
 
108
- addMouseEnter('dl-widget', this.handleMouseEnter as any)
145
+ addMouseEnter('dl-widget', handleMouseEnter as any)
109
146
 
110
- window.addEventListener('mousemove', this.moveClone)
111
- window.addEventListener('mouseup', this.stopDragging)
112
- },
113
- moveClone(e: MouseEvent) {
114
- if (!this.isDragging) return
115
- const clone = this.$refs.clone as HTMLElement
116
- clone.style.left = `${e.pageX - clone.offsetWidth / 2 - 5}px`
117
- clone.style.top = `${e.pageY + 10}px`
118
- },
119
- stopDragging(e: MouseEvent) {
120
- this.isDragging = false
121
- ;(this.$refs.clone as HTMLElement).innerHTML = ''
147
+ window.addEventListener('mousemove', moveClone)
148
+ window.addEventListener('mouseup', stopDragging)
149
+ }
150
+
151
+ const moveClone = (e: MouseEvent) => {
152
+ if (!isDragging.value || !clone.value) return
153
+ clone.value.style.left = `${
154
+ e.pageX - clone.value.offsetWidth / 2 - 5
155
+ }px`
156
+ clone.value.style.top = `${e.pageY + 10}px`
157
+ }
158
+
159
+ const stopDragging = (e: MouseEvent) => {
160
+ isDragging.value = false
161
+ document.body.style.cursor = 'default'
162
+ if (!clone.value || !draggedWidget.value || !wrapper.value) {
163
+ return
164
+ }
165
+ clone.value.style.visibility = 'hidden'
166
+ clone.value.innerHTML = ''
122
167
  const target = getElementAbove(e.target as HTMLElement, 'dl-widget')
123
- if (target && this.draggedWidget) {
124
- swapNodes({
125
- source: this.draggedWidget,
126
- target
168
+ const change = {
169
+ source: draggedWidget.value,
170
+ target,
171
+ endDragging: true
172
+ }
173
+ if (target && draggedWidget.value) {
174
+ const event = new CustomEvent('position-changing', {
175
+ detail: change
127
176
  })
177
+ wrapper.value.dispatchEvent(event)
178
+ } else {
179
+ wrapper.value.dispatchEvent(new CustomEvent('position-changed'))
128
180
  }
129
- window.removeEventListener('mousemove', this.moveClone)
130
- window.removeEventListener('mouseup', this.stopDragging)
181
+ window.removeEventListener('mousemove', moveClone)
182
+ window.removeEventListener('mouseup', stopDragging)
131
183
  setTimeout(() => {
132
- removeMouseEnter('dl-widget', this.handleMouseEnter as any)
184
+ removeMouseEnter('dl-widget', handleMouseEnter as any)
133
185
  }, 1)
134
- },
135
- handleMouseEnter(e: MouseEvent) {
136
- this.hoveredWidget = e.target as HTMLElement
137
- const mouseOffsetInside = e.clientX - this.hoveredWidget.offsetLeft
138
- this.isLeftSide =
139
- mouseOffsetInside < this.hoveredWidget.offsetWidth / 2
140
- this.hoveredWidget.addEventListener(
186
+ }
187
+
188
+ const handleMouseEnter = (e: MouseEvent) => {
189
+ hoveredWidget.value = e.target as HTMLElement
190
+ if (!hoveredWidget.value) {
191
+ return
192
+ }
193
+
194
+ const mouseOffsetInside = e.clientX - hoveredWidget.value.offsetLeft
195
+
196
+ isLeftSide.value =
197
+ mouseOffsetInside < hoveredWidget.value.offsetWidth / 2
198
+
199
+ hoveredWidget.value.addEventListener(
141
200
  'mousemove',
142
- this.handleMouseInsideWidget
201
+ handleMouseInsideWidget
143
202
  )
144
- this.hoveredWidget.addEventListener('mouseleave', () => {
145
- clearTimeout(this.timer)
146
- this.hoveredWidget.removeEventListener(
203
+
204
+ hoveredWidget.value.addEventListener('mouseleave', () => {
205
+ if (timer.value) {
206
+ clearTimeout(timer.value)
207
+ timer.value = null
208
+ }
209
+ hoveredWidget.value.removeEventListener(
147
210
  'mousemove',
148
- this.handleMouseInsideWidget
211
+ handleMouseInsideWidget
149
212
  )
150
213
  })
151
- this.timer = setTimeout(this.insertWidget, 1000)
152
- },
153
- insertWidget() {
214
+
215
+ timer.value = setTimeout(insertWidget, 200)
216
+ }
217
+
218
+ const insertWidget = () => {
219
+ if (!hoveredWidget.value || !wrapper.value) {
220
+ return
221
+ }
222
+
154
223
  const targetWidget = getElementAbove(
155
- this.hoveredWidget,
224
+ hoveredWidget.value,
156
225
  'widget-wrapper'
157
226
  )
158
- const targetRow = getElementAbove(this.hoveredWidget, 'dl-grid-row')
159
- if (this.isLeftSide) {
160
- targetRow.insertBefore(
161
- this.$refs.wrapper as HTMLElement,
162
- targetWidget
163
- )
164
- } else {
165
- insertAfter(
166
- this.$refs.wrapper as unknown as HTMLElement,
167
- targetWidget
168
- )
227
+ const event = new CustomEvent('position-changing', {
228
+ detail: {
229
+ source: wrapper.value,
230
+ target: targetWidget,
231
+ side: isLeftSide.value ? 'left' : 'right'
232
+ }
233
+ })
234
+ wrapper.value.dispatchEvent(event)
235
+ if (timer.value) {
236
+ window.clearTimeout(timer.value)
237
+ timer.value = null
169
238
  }
170
- this.hoveredWidget.removeEventListener(
239
+ hoveredWidget.value.removeEventListener(
171
240
  'mousemove',
172
- this.handleMouseInsideWidget
241
+ handleMouseInsideWidget
173
242
  )
174
- setFlexBasis()
175
- },
176
- handleMouseInsideWidget(e: MouseEvent) {
177
- const mouseOffsetInside = e.clientX - this.hoveredWidget.offsetLeft
178
- const isLeftSide =
179
- mouseOffsetInside < this.hoveredWidget.offsetWidth / 2
180
- if (this.isLeftSide !== isLeftSide) {
181
- clearTimeout(this.timer)
182
- this.handleMouseEnter(e)
243
+ }
244
+
245
+ const handleMouseInsideWidget = (e: MouseEvent) => {
246
+ if (!hoveredWidget.value) {
247
+ return
248
+ }
249
+
250
+ const mouseOffsetInside = e.clientX - hoveredWidget.value.offsetLeft
251
+ const isLeftSideCurrently =
252
+ mouseOffsetInside < hoveredWidget.value.offsetWidth / 2
253
+ if (isLeftSide.value !== isLeftSideCurrently) {
254
+ if (timer.value) {
255
+ clearTimeout(timer.value)
256
+ timer.value = null
257
+ }
258
+ handleMouseEnter(e)
183
259
  }
184
260
  }
261
+
262
+ const handleVisibleDragIcon = (val: boolean) => {
263
+ if (!draggableRef.value) {
264
+ return
265
+ }
266
+ if (!document.querySelector('.drag-clone').innerHTML.toString()) {
267
+ visibleDragIcon.value = val
268
+ }
269
+ }
270
+
271
+ return {
272
+ wrapper,
273
+ widget,
274
+ clone,
275
+ uuid,
276
+ draggedWidget,
277
+ hoveredWidget,
278
+ isLeftSide,
279
+ flexBasis,
280
+ isDragging,
281
+ timer,
282
+ visibleDragIcon,
283
+ widgetClasses,
284
+ iconStyles,
285
+ startDragging,
286
+ moveClone,
287
+ stopDragging,
288
+ handleMouseEnter,
289
+ insertWidget,
290
+ handleMouseInsideWidget,
291
+ handleVisibleDragIcon
292
+ }
185
293
  }
186
294
  })
187
295
  </script>
@@ -193,37 +301,63 @@ export default defineComponent({
193
301
  height: 100%;
194
302
  display: flex;
195
303
  flex-direction: column;
304
+ position: relative;
196
305
  &__header {
197
306
  display: flex;
198
307
  padding: 10px;
199
308
  border-bottom: 1px solid var(--dl-color-separator);
200
-
201
- &--drag-icon {
202
- flex-grow: 1;
203
- cursor: pointer;
204
-
205
- &::v-deep .dl-icon {
206
- transform: rotate(90deg) !important;
207
- }
208
- }
309
+ font-size: 20px;
310
+ color: var(--dl-color-darker);
311
+ justify-content: space-between;
209
312
 
210
313
  &--titles {
211
314
  width: 50%;
212
315
  display: flex;
213
316
  flex-direction: column;
317
+ justify-content: center;
214
318
  }
215
319
  }
216
320
  &__content {
217
321
  padding: 5px;
218
322
  }
219
323
  &__description {
220
- margin-top: auto;
221
- padding: 5px;
222
- font-size: 10px;
324
+ overflow: hidden;
325
+ text-overflow: ellipsis;
326
+ display: -webkit-box;
327
+ -webkit-box-orient: vertical;
328
+ -webkit-line-clamp: 2;
329
+ line-height: 1;
330
+ max-height: 1 * 2;
331
+ margin: 20px 16px 16px 16px;
332
+ font-size: 12px;
333
+ color: var(--dl-color-medium);
334
+ }
335
+
336
+ &__drag-icon {
337
+ position: absolute;
338
+ top: 5px;
339
+ left: calc(var(--dl-widget-drag-icon-left) - 5px);
340
+ flex-grow: 1;
341
+ cursor: grab;
342
+
343
+ &::v-deep .dl-icon {
344
+ transform: rotate(90deg) !important;
345
+ }
223
346
  }
224
347
 
225
348
  &__drag {
226
- visibility: hidden;
349
+ position: relative;
350
+ opacity: 0.2;
351
+ background: var(--dl-color-separator);
352
+ &::after {
353
+ content: '';
354
+ position: absolute;
355
+ width: 100%;
356
+ height: 100%;
357
+ top: 0;
358
+ left: 0;
359
+ border-radius: 5px;
360
+ }
227
361
  }
228
362
  }
229
363
 
@@ -235,7 +369,5 @@ export default defineComponent({
235
369
 
236
370
  .widget-wrapper {
237
371
  flex-basis: var(--widget-flex-basis);
238
- margin: var(--row-gap) var(--column-gap);
239
- transition: 0.1s;
240
372
  }
241
373
  </style>
@@ -1,5 +1,3 @@
1
1
  import DlWidget from './DlWidget.vue'
2
- import DlGrid from './DlGrid.vue'
3
- import DlGridRow from './DlGridRow.vue'
4
2
 
5
- export { DlWidget, DlGrid, DlGridRow }
3
+ export { DlWidget }
@@ -1,3 +1,31 @@
1
+ import { cloneDeep } from 'lodash'
2
+ import { DlGridSideType } from '../DlGrid/types'
3
+
4
+ export function leastCommonMultiple(arr: number[]) {
5
+ if (!arr) return
6
+ const gcd = (a: number, b: number): number => (a ? gcd(b % a, a) : b)
7
+ const lcm = (a: number, b: number): number => (a * b) / gcd(a, b)
8
+ return arr.reduce(lcm)
9
+ }
10
+
11
+ export function getGridTemplate(layout: number[][]) {
12
+ if (!layout) return
13
+ const flatLayout = layout.map((el) => el.length)
14
+ const template = []
15
+ const lcm = leastCommonMultiple(flatLayout)
16
+ for (let i = 0; i < flatLayout.length; i++) {
17
+ const columns = flatLayout[i]
18
+ let columnTrack = 1
19
+ for (let j = 0; j < columns; j++) {
20
+ let gridSpan = lcm / columns
21
+ template.push(`${columnTrack} / ${gridSpan + columnTrack}`)
22
+ columnTrack += gridSpan
23
+ gridSpan += gridSpan
24
+ }
25
+ }
26
+ return template
27
+ }
28
+
1
29
  export function getElementAbove(el: HTMLElement, className: string) {
2
30
  //@ts-ignore
3
31
  for (; el && el !== document; el = el.parentNode) {
@@ -22,16 +50,70 @@ export function removeMouseEnter(
22
50
  })
23
51
  }
24
52
 
25
- export function setFlexBasis() {
26
- Array.from(document.getElementsByClassName('dl-grid-row')).forEach(
27
- (row) => {
28
- Array.from(row.children).forEach((widget: any) => {
29
- widget.style.flexBasis = `${100 / row.children.length}%`
30
- })
53
+ export function findIndexInMatrix(matrix: number[][], nr: number) {
54
+ for (let i = 0; i < matrix.length; i++) {
55
+ for (let j = 0; j < matrix[i].length; j++) {
56
+ if (matrix[i][j] === nr) return { row: i, column: j }
31
57
  }
58
+ }
59
+ }
60
+
61
+ export function swapElemensInMatrix(
62
+ layout: number[][],
63
+ sourceIndex: any,
64
+ targetIndex: any,
65
+ side: DlGridSideType,
66
+ maxElements: number
67
+ ) {
68
+ const newLayout = cloneDeep(layout)
69
+
70
+ const removedElement = newLayout[sourceIndex.row].splice(
71
+ sourceIndex.column,
72
+ 1
32
73
  )
74
+ newLayout[targetIndex.row].splice(
75
+ side === 'right' ? targetIndex.column + 1 : targetIndex.column,
76
+ 0,
77
+ removedElement[0]
78
+ )
79
+
80
+ return isTooLarge(newLayout, maxElements)
81
+ ? moveElementsToNextIndex(newLayout, maxElements)
82
+ : newLayout
83
+ }
84
+
85
+ function moveElementsToNextIndex(
86
+ template: number[][],
87
+ maxElements: number
88
+ ): number[][] {
89
+ const clonedTemplate: number[][] = cloneDeep(template)
90
+ let overflow: number[] = []
91
+
92
+ for (let i = 0; i < clonedTemplate.length; i++) {
93
+ let currentRow = clonedTemplate[i]
94
+ if (overflow.length > 0) {
95
+ currentRow = overflow.concat(currentRow)
96
+ overflow = []
97
+ }
98
+ if (currentRow.length > maxElements) {
99
+ overflow = currentRow.slice(maxElements)
100
+ currentRow = currentRow.slice(0, maxElements)
101
+ }
102
+ clonedTemplate[i] = currentRow
103
+ if (i + 1 < clonedTemplate.length && overflow.length > 0) {
104
+ clonedTemplate[i + 1] = overflow.concat(clonedTemplate[i + 1])
105
+ overflow = []
106
+ }
107
+ }
108
+ return clonedTemplate
109
+ }
110
+
111
+ function isTooLarge(layout: number[][], max: number) {
112
+ const lengths = layout.map((row) => row.length)
113
+ const highest = Math.max(...lengths)
114
+ return highest > max
33
115
  }
34
116
 
35
- export function insertAfter(newNode: HTMLElement, existingNode: HTMLElement) {
36
- existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling)
117
+ export function isCustomEvent(event: Event): event is CustomEvent {
118
+ return 'detail' in event
37
119
  }
@@ -9,6 +9,8 @@ export * from './DlWidget'
9
9
  export * from './DlPopup'
10
10
  export * from './DlPanelContainer'
11
11
  export * from './DlProgressChart'
12
- export * from './DlEllipsis'
13
- export * from './DlCard'
12
+ export * from './DlEmptyState'
13
+ export * from './DlGrid'
14
14
  export * from './DlMarkupTable'
15
+ export * from './DlContainer'
16
+ export * from './DlEmptyState'
@@ -6,3 +6,5 @@ export type { DlChipProps, DlButtonProps }
6
6
  export * from './DlKpi/types'
7
7
  export * from './DlWidget/types'
8
8
  export * from './DlButton/types'
9
+ export * from './DlGrid/types'
10
+ export * from './DlEmptyState/types'