@dataloop-ai/components 0.13.0

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 (294) hide show
  1. package/.eslintrc.js +154 -0
  2. package/.prettierrc.json +7 -0
  3. package/Dockerfile +12 -0
  4. package/LICENSE +201 -0
  5. package/README.md +43 -0
  6. package/favicon.ico +0 -0
  7. package/index.html +13 -0
  8. package/index.ts +1 -0
  9. package/jest.config.js +16 -0
  10. package/jest.setup.js +59 -0
  11. package/models.ts +1 -0
  12. package/package.json +109 -0
  13. package/src/App.vue +201 -0
  14. package/src/assets/globals.scss +253 -0
  15. package/src/assets/globalsKeys.ts +28 -0
  16. package/src/components/DlAccordion/AccordionHeader.vue +148 -0
  17. package/src/components/DlAccordion/DlAccordion.vue +108 -0
  18. package/src/components/DlAccordion/index.ts +2 -0
  19. package/src/components/DlAlert.vue +227 -0
  20. package/src/components/DlAvatar.vue +99 -0
  21. package/src/components/DlBadge.vue +127 -0
  22. package/src/components/DlButton/DlButton.vue +370 -0
  23. package/src/components/DlButton/index.ts +4 -0
  24. package/src/components/DlButton/utils.ts +169 -0
  25. package/src/components/DlButtonGroup.vue +122 -0
  26. package/src/components/DlCheckbox.vue +298 -0
  27. package/src/components/DlChip/DlChip.vue +244 -0
  28. package/src/components/DlChip/index.ts +4 -0
  29. package/src/components/DlChip/utils.ts +100 -0
  30. package/src/components/DlColorPicker/DlAlpha.vue +142 -0
  31. package/src/components/DlColorPicker/DlBox.vue +75 -0
  32. package/src/components/DlColorPicker/DlColorPicker.vue +306 -0
  33. package/src/components/DlColorPicker/DlColors.vue +139 -0
  34. package/src/components/DlColorPicker/DlHue.vue +135 -0
  35. package/src/components/DlColorPicker/DlPreview.vue +61 -0
  36. package/src/components/DlColorPicker/DlSaturation.vue +152 -0
  37. package/src/components/DlColorPicker/constants.ts +16 -0
  38. package/src/components/DlColorPicker/index.ts +20 -0
  39. package/src/components/DlColorPicker/types.ts +11 -0
  40. package/src/components/DlColorPicker/utils.ts +128 -0
  41. package/src/components/DlCounters.vue +173 -0
  42. package/src/components/DlDatePicker/DlCalendar.vue +332 -0
  43. package/src/components/DlDatePicker/DlDatePicker.vue +315 -0
  44. package/src/components/DlDatePicker/DlMonthCalendar.vue +282 -0
  45. package/src/components/DlDatePicker/classes/Calendar.ts +110 -0
  46. package/src/components/DlDatePicker/classes/CalendarDate.ts +12 -0
  47. package/src/components/DlDatePicker/classes/CustomDate.ts +218 -0
  48. package/src/components/DlDatePicker/index.ts +3 -0
  49. package/src/components/DlDatePicker/isInRange.ts +44 -0
  50. package/src/components/DlDatePicker/types.ts +4 -0
  51. package/src/components/DlDatePicker/utils.ts +39 -0
  52. package/src/components/DlDateTimeRange/DlCardSidebar.vue +109 -0
  53. package/src/components/DlDateTimeRange/DlDateInput.vue +105 -0
  54. package/src/components/DlDateTimeRange/DlDateTimeRange.vue +468 -0
  55. package/src/components/DlDateTimeRange/index.ts +3 -0
  56. package/src/components/DlDateTimeRange/types.ts +42 -0
  57. package/src/components/DlDialogBox/DlDialogBox.vue +196 -0
  58. package/src/components/DlDialogBox/DlDialogBoxFooter.vue +22 -0
  59. package/src/components/DlDialogBox/DlDialogBoxHeader.vue +75 -0
  60. package/src/components/DlDialogBox/index.ts +5 -0
  61. package/src/components/DlDropdownButton.vue +463 -0
  62. package/src/components/DlIcon.vue +147 -0
  63. package/src/components/DlInfoErrorMessage.vue +91 -0
  64. package/src/components/DlItem/DlItem.vue +35 -0
  65. package/src/components/DlItem/index.ts +2 -0
  66. package/src/components/DlItemSection.vue +88 -0
  67. package/src/components/DlLink/DlLink.vue +76 -0
  68. package/src/components/DlLink/index.ts +4 -0
  69. package/src/components/DlLink/utils.ts +4 -0
  70. package/src/components/DlList.vue +61 -0
  71. package/src/components/DlListItem/DlListItem.vue +205 -0
  72. package/src/components/DlListItem/index.ts +3 -0
  73. package/src/components/DlListItem/utils.ts +14 -0
  74. package/src/components/DlMenu/DlMenu.vue +438 -0
  75. package/src/components/DlMenu/index.ts +3 -0
  76. package/src/components/DlMenu/utils.ts +138 -0
  77. package/src/components/DlOptionGroup/DlOptionGroup.vue +201 -0
  78. package/src/components/DlOptionGroup/MenuItemWrapper.vue +48 -0
  79. package/src/components/DlOptionGroup/OptionGroup.types.ts +36 -0
  80. package/src/components/DlOptionGroup/SimpleWrapper.vue +28 -0
  81. package/src/components/DlOptionGroup/index.ts +4 -0
  82. package/src/components/DlOptionGroup/utils.ts +40 -0
  83. package/src/components/DlPagination/DlPagination.vue +184 -0
  84. package/src/components/DlPagination/PageNavigation.vue +350 -0
  85. package/src/components/DlPagination/PaginationLegend.vue +41 -0
  86. package/src/components/DlPagination/QuickNavigation.vue +146 -0
  87. package/src/components/DlPagination/RowsSelector.vue +74 -0
  88. package/src/components/DlPagination/index.ts +3 -0
  89. package/src/components/DlPanelContainer/DlPanel.vue +213 -0
  90. package/src/components/DlPanelContainer/DlPanelContainer.vue +527 -0
  91. package/src/components/DlPanelContainer/index.ts +4 -0
  92. package/src/components/DlPopup/DlPopup.vue +478 -0
  93. package/src/components/DlPopup/DraggableUpper.vue +64 -0
  94. package/src/components/DlPopup/PopupHeader.vue +129 -0
  95. package/src/components/DlPopup/index.ts +1 -0
  96. package/src/components/DlProgressBar.vue +159 -0
  97. package/src/components/DlProgressChart.vue +299 -0
  98. package/src/components/DlRadio.vue +218 -0
  99. package/src/components/DlRange/DlRange.vue +439 -0
  100. package/src/components/DlRange/utils.ts +209 -0
  101. package/src/components/DlSearch.vue +155 -0
  102. package/src/components/DlSelect/DlSelect.vue +992 -0
  103. package/src/components/DlSelect/SelectOption.vue +261 -0
  104. package/src/components/DlSelect/index.ts +4 -0
  105. package/src/components/DlSelect/utils.ts +43 -0
  106. package/src/components/DlSkeleton.vue +72 -0
  107. package/src/components/DlSlider/DlSlider.vue +243 -0
  108. package/src/components/DlSlider/components/DlSliderBase.vue +380 -0
  109. package/src/components/DlSlider/components/DlSliderInput.vue +123 -0
  110. package/src/components/DlSlider/components/index.ts +4 -0
  111. package/src/components/DlSlider/index.ts +3 -0
  112. package/src/components/DlSlider/sliderStyles.scss +109 -0
  113. package/src/components/DlSlider/useSlider.ts +277 -0
  114. package/src/components/DlSlider/utils.ts +7 -0
  115. package/src/components/DlSmartSearch/DlJsonEditor.vue +309 -0
  116. package/src/components/DlSmartSearch/DlSmartSearch.vue +333 -0
  117. package/src/components/DlSmartSearch/DlSmartSearchInput.vue +741 -0
  118. package/src/components/DlSmartSearch/DlSuggestionsDropdown.vue +73 -0
  119. package/src/components/DlSmartSearch/highlightSyntax.ts +169 -0
  120. package/src/components/DlSmartSearch/index.ts +4 -0
  121. package/src/components/DlSmartSearch/types.ts +36 -0
  122. package/src/components/DlSmartSearch/utils.ts +45 -0
  123. package/src/components/DlStepper/DlStepper.vue +196 -0
  124. package/src/components/DlStepper/DlStepperContainer.vue +55 -0
  125. package/src/components/DlStepper/DlStepperContent.vue +101 -0
  126. package/src/components/DlStepper/DlStepperFooter.vue +133 -0
  127. package/src/components/DlStepper/DlStepperHeader.vue +49 -0
  128. package/src/components/DlStepper/DlStepperSidebar.vue +167 -0
  129. package/src/components/DlStepper/Step.ts +101 -0
  130. package/src/components/DlStepper/Stepper.ts +107 -0
  131. package/src/components/DlStepper/index.ts +7 -0
  132. package/src/components/DlStepper/interfaces.ts +11 -0
  133. package/src/components/DlSwitch.vue +280 -0
  134. package/src/components/DlTabPanels/DlTabPanel.vue +22 -0
  135. package/src/components/DlTabPanels/DlTabPanels.vue +41 -0
  136. package/src/components/DlTabPanels/index.ts +4 -0
  137. package/src/components/DlTabPanels/utils.ts +19 -0
  138. package/src/components/DlTable/DlTable.vue +1264 -0
  139. package/src/components/DlTable/DlTd.vue +109 -0
  140. package/src/components/DlTable/DlTh.vue +126 -0
  141. package/src/components/DlTable/DlTr.vue +44 -0
  142. package/src/components/DlTable/ResizableManager.ts +233 -0
  143. package/src/components/DlTable/dl-table-styles.scss +466 -0
  144. package/src/components/DlTable/hooks/tableActions.ts +64 -0
  145. package/src/components/DlTable/hooks/tableColumnSelection.ts +112 -0
  146. package/src/components/DlTable/hooks/tableFilter.ts +42 -0
  147. package/src/components/DlTable/hooks/tablePagination.ts +197 -0
  148. package/src/components/DlTable/hooks/tableRowExpand.ts +55 -0
  149. package/src/components/DlTable/hooks/tableRowSelection.ts +106 -0
  150. package/src/components/DlTable/hooks/tableSort.ts +125 -0
  151. package/src/components/DlTable/index.ts +6 -0
  152. package/src/components/DlTable/types.ts +96 -0
  153. package/src/components/DlTabs/DlTab.vue +146 -0
  154. package/src/components/DlTabs/DlTabs.vue +192 -0
  155. package/src/components/DlTabs/TabsWrapper.vue +104 -0
  156. package/src/components/DlTabs/index.ts +4 -0
  157. package/src/components/DlTabs/types.ts +8 -0
  158. package/src/components/DlTextArea.vue +151 -0
  159. package/src/components/DlTextHolder.vue +65 -0
  160. package/src/components/DlTextInput.vue +753 -0
  161. package/src/components/DlThemeProvider.vue +41 -0
  162. package/src/components/DlTimePicker/DlTimeCounter.vue +81 -0
  163. package/src/components/DlTimePicker/DlTimePicker.vue +151 -0
  164. package/src/components/DlTimePicker/DlTimePickerInput.vue +311 -0
  165. package/src/components/DlTimePicker/index.ts +3 -0
  166. package/src/components/DlTimePicker/types.ts +4 -0
  167. package/src/components/DlTooltip.vue +456 -0
  168. package/src/components/DlTrend.vue +97 -0
  169. package/src/components/DlTypography.vue +87 -0
  170. package/src/components/DlVirtualScroll/DlVirtualScroll.vue +290 -0
  171. package/src/components/DlVirtualScroll/index.ts +3 -0
  172. package/src/components/DlVirtualScroll/useVirtualScroll.ts +833 -0
  173. package/src/components/DlWidget/DlWidget.vue +50 -0
  174. package/src/components/DlWidget/DlWidgetGrid.vue +360 -0
  175. package/src/components/DlWidget/index.ts +4 -0
  176. package/src/components/DlWidget/types.ts +6 -0
  177. package/src/components/DlWidget/utils.ts +30 -0
  178. package/src/components/index.ts +118 -0
  179. package/src/demo/DlAccordionDemo.vue +60 -0
  180. package/src/demo/DlAlertDemo.vue +54 -0
  181. package/src/demo/DlAvatarDemo.vue +43 -0
  182. package/src/demo/DlBadgeDemo.vue +65 -0
  183. package/src/demo/DlButtonDemo.vue +266 -0
  184. package/src/demo/DlCheckboxDemo.vue +50 -0
  185. package/src/demo/DlChipDemo.vue +181 -0
  186. package/src/demo/DlColorPickerDemo.vue +43 -0
  187. package/src/demo/DlCounterDemo.vue +53 -0
  188. package/src/demo/DlDateTimeRangeDemo.vue +217 -0
  189. package/src/demo/DlDialogBoxDemo.vue +175 -0
  190. package/src/demo/DlDropdownButtonDemo.vue +260 -0
  191. package/src/demo/DlIconDemo.vue +47 -0
  192. package/src/demo/DlLinkDemo.vue +23 -0
  193. package/src/demo/DlListDemo.vue +177 -0
  194. package/src/demo/DlMenuDemo.vue +524 -0
  195. package/src/demo/DlOptionGroupDemo.vue +79 -0
  196. package/src/demo/DlPaginationDemo.vue +44 -0
  197. package/src/demo/DlPanelContainerDemo.vue +221 -0
  198. package/src/demo/DlPopupDemo.vue +58 -0
  199. package/src/demo/DlProgressBarDemo.vue +22 -0
  200. package/src/demo/DlProgressChartDemo.vue +71 -0
  201. package/src/demo/DlRadioDemo.vue +35 -0
  202. package/src/demo/DlRangeDemo.vue +44 -0
  203. package/src/demo/DlSearchDemo.vue +27 -0
  204. package/src/demo/DlSelectDemo.vue +355 -0
  205. package/src/demo/DlSkeletonDemo.vue +20 -0
  206. package/src/demo/DlSliderDemo.vue +47 -0
  207. package/src/demo/DlStepperDemo/CenteredStepperInDialogBox.vue +260 -0
  208. package/src/demo/DlStepperDemo/SimpleStepper.vue +202 -0
  209. package/src/demo/DlStepperDemo/StepperInDialogBox.vue +261 -0
  210. package/src/demo/DlStepperDemo/index.ts +5 -0
  211. package/src/demo/DlStepperDemo/steps/AssignmentsStep.vue +97 -0
  212. package/src/demo/DlStepperDemo/steps/DataStep.vue +158 -0
  213. package/src/demo/DlStepperDemo/steps/GeneralStep.vue +106 -0
  214. package/src/demo/DlStepperDemo/steps/InstructionStep.vue +176 -0
  215. package/src/demo/DlStepperDemo/steps/QualityStep.vue +65 -0
  216. package/src/demo/DlSwitchDemo.vue +49 -0
  217. package/src/demo/DlTableDemo.vue +475 -0
  218. package/src/demo/DlTabsDemo.vue +67 -0
  219. package/src/demo/DlTdDemo.vue +19 -0
  220. package/src/demo/DlTextAreaDemo.vue +37 -0
  221. package/src/demo/DlTextHolderDemo.vue +42 -0
  222. package/src/demo/DlTextInputDemo.vue +89 -0
  223. package/src/demo/DlThDemo.vue +32 -0
  224. package/src/demo/DlTooltipDemo.vue +60 -0
  225. package/src/demo/DlTrDemo.vue +18 -0
  226. package/src/demo/DlTrendDemo.vue +25 -0
  227. package/src/demo/DlTypographyDemo.vue +93 -0
  228. package/src/demo/DlWidgetDemo.vue +157 -0
  229. package/src/demo/SmartSearchDemo/DlSmartSearchDemo.vue +202 -0
  230. package/src/demo/SmartSearchDemo/schema.ts +44 -0
  231. package/src/demo/index.ts +141 -0
  232. package/src/directives/TouchPan.ts +525 -0
  233. package/src/env.d.ts +8 -0
  234. package/src/hooks/use-anchor.ts +223 -0
  235. package/src/hooks/use-model-toggle.ts +181 -0
  236. package/src/hooks/use-portal.ts +104 -0
  237. package/src/hooks/use-scroll-target.ts +53 -0
  238. package/src/hooks/use-size-observer.ts +24 -0
  239. package/src/hooks/use-suggestions.ts +355 -0
  240. package/src/hooks/use-tick.ts +32 -0
  241. package/src/hooks/use-timeout.ts +20 -0
  242. package/src/hooks/use-transition.ts +32 -0
  243. package/src/hooks/use-window-size.ts +25 -0
  244. package/src/hooks/useForm.ts +12 -0
  245. package/src/index.ts +7 -0
  246. package/src/main.ts +4 -0
  247. package/src/models.ts +4 -0
  248. package/src/types.ts +6 -0
  249. package/src/utils/calcs.ts +18 -0
  250. package/src/utils/click-outside.ts +108 -0
  251. package/src/utils/component-name-parser.ts +1 -0
  252. package/src/utils/css-color-names.ts +150 -0
  253. package/src/utils/dom.ts +55 -0
  254. package/src/utils/draggable-table.ts +416 -0
  255. package/src/utils/escape-key.ts +54 -0
  256. package/src/utils/events.ts +67 -0
  257. package/src/utils/focus-manager.ts +33 -0
  258. package/src/utils/focusout.ts +29 -0
  259. package/src/utils/format.ts +3 -0
  260. package/src/utils/getColor.ts +17 -0
  261. package/src/utils/getLighterGradient.ts +36 -0
  262. package/src/utils/getRootStyles.ts +52 -0
  263. package/src/utils/global-config.ts +6 -0
  264. package/src/utils/global-nodes.ts +42 -0
  265. package/src/utils/includes.ts +3 -0
  266. package/src/utils/index.ts +29 -0
  267. package/src/utils/inject-object-prop.ts +21 -0
  268. package/src/utils/input-sizes.ts +7 -0
  269. package/src/utils/is-ellipsis-active.ts +3 -0
  270. package/src/utils/is-in-viewport.ts +13 -0
  271. package/src/utils/is.ts +15 -0
  272. package/src/utils/key-composition.ts +17 -0
  273. package/src/utils/keyCodes.ts +12 -0
  274. package/src/utils/logger/ConsoleLogger.ts +65 -0
  275. package/src/utils/logger/ILogger.ts +8 -0
  276. package/src/utils/logger/index.ts +8 -0
  277. package/src/utils/nav-keys-constants.ts +1 -0
  278. package/src/utils/portal.ts +55 -0
  279. package/src/utils/position-engine.ts +381 -0
  280. package/src/utils/render.ts +36 -0
  281. package/src/utils/ripple.ts +7 -0
  282. package/src/utils/scroll.ts +73 -0
  283. package/src/utils/selection.ts +15 -0
  284. package/src/utils/sort.ts +7 -0
  285. package/src/utils/splitByQuotes.ts +32 -0
  286. package/src/utils/string.ts +6 -0
  287. package/src/utils/teleport.ts +14 -0
  288. package/src/utils/theme.ts +2 -0
  289. package/src/utils/vm.ts +16 -0
  290. package/storybook.js +8 -0
  291. package/tsconfig.json +44 -0
  292. package/tsconfig.node.json +8 -0
  293. package/types.ts +1 -0
  294. package/vite.config.ts +13 -0
@@ -0,0 +1,741 @@
1
+ <template>
2
+ <div
3
+ class="dl-smart-search-input"
4
+ :style="cssVars"
5
+ >
6
+ <div class="dl-smart-search-input__search-bar-wrapper">
7
+ <div :class="searchBarClasses">
8
+ <div class="dl-smart-search-input__status-icon-wrapper">
9
+ <dl-icon
10
+ v-if="withSearchIcon || status"
11
+ :icon="statusIcon"
12
+ :color="statusIconColor"
13
+ size="18px"
14
+ :inline="false"
15
+ />
16
+ </div>
17
+ <div class="dl-smart-search-input__textarea-wrapper">
18
+ <div
19
+ id="editor"
20
+ ref="input"
21
+ class="dl-smart-search-input__textarea"
22
+ style="-webkit-appearance: textfield"
23
+ :placeholder="placeholder"
24
+ :contenteditable="!disabled"
25
+ @keypress="keyPress"
26
+ @input="handleValueChange"
27
+ @click="focus"
28
+ @blur="blur"
29
+ />
30
+ </div>
31
+ <div class="dl-smart-search-input__toolbar">
32
+ <div
33
+ v-if="withClearBtn && modelValue"
34
+ class="dl-smart-search-input__clear-btn-wrapper"
35
+ >
36
+ <dl-button
37
+ icon="icon-dl-close"
38
+ size="10px"
39
+ flat
40
+ :disabled="disabled"
41
+ @mousedown="clearValue"
42
+ />
43
+ <dl-tooltip> Clear Query </dl-tooltip>
44
+ </div>
45
+ <div
46
+ v-if="withScreenButton"
47
+ class="dl-smart-search-input__screen-btn-wrapper"
48
+ >
49
+ <dl-button
50
+ :icon="screenIcon"
51
+ size="16px"
52
+ flat
53
+ :disabled="disabled"
54
+ @mousedown="handleScreenBtnClick"
55
+ />
56
+ <dl-tooltip>
57
+ {{ expanded ? 'Collapse' : 'Expand' }} Smart Search
58
+ </dl-tooltip>
59
+ </div>
60
+ <div
61
+ v-if="withSaveButton"
62
+ class="dl-smart-search-input__save-btn-wrapper"
63
+ >
64
+ <dl-button
65
+ icon="icon-dl-save"
66
+ size="16px"
67
+ flat
68
+ :disabled="disabled"
69
+ @click="save"
70
+ >
71
+ <dl-tooltip> Save Query </dl-tooltip>
72
+ </dl-button>
73
+ <dl-button
74
+ icon="icon-dl-loop"
75
+ size="16px"
76
+ flat
77
+ text-color="dl-color-darker"
78
+ :disabled="disabled"
79
+ uppercase
80
+ label="dql"
81
+ @click="edit"
82
+ >
83
+ <dl-tooltip> Switch to DQL </dl-tooltip>
84
+ </dl-button>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ <label
89
+ v-show="status.message"
90
+ ref="label"
91
+ class="dl-smart-search-input__search-label"
92
+ for="search-input"
93
+ :style="labelStyles"
94
+ >{{ status.message }}</label>
95
+ </div>
96
+ <div :class="messageClasses">
97
+ {{ message }}
98
+ </div>
99
+ <dl-suggestions-dropdown
100
+ v-model="suggestionModal"
101
+ :disabled="disabled"
102
+ :suggestions="suggestions"
103
+ :offset="menuOffset"
104
+ :expanded="expanded"
105
+ @set-input-value="setInputValue"
106
+ />
107
+ <dl-menu
108
+ v-if="isDatePickerVisible"
109
+ v-model="isDatePickerVisible"
110
+ :disabled="disabled"
111
+ :offset="[0, 3]"
112
+ >
113
+ <div class="dl-smart-search-input__date-picker-wrapper">
114
+ <dl-date-picker @change="handleDateSelectionUpdate" />
115
+ </div>
116
+ </dl-menu>
117
+ </div>
118
+ </template>
119
+ <script lang="ts">
120
+ import { defineComponent, ref, PropType } from 'vue-demi'
121
+ import DlIcon from '../DlIcon.vue'
122
+ import { DlButton } from '../DlButton'
123
+ import { DlDatePicker } from '../DlDatePicker'
124
+ import { DlMenu } from '../DlMenu'
125
+ import { isEllipsisActive } from '../../utils/is-ellipsis-active'
126
+ import { useSizeObserver } from '../../hooks/use-size-observer'
127
+ import { SearchStatus, SyntaxColorSchema } from './types'
128
+ import { debounce } from 'lodash'
129
+ import { isEligibleToChange, setCaret, updateEditor } from './highlightSyntax'
130
+ import DlTooltip from '../DlTooltip.vue'
131
+ import DlSuggestionsDropdown from './DlSuggestionsDropdown.vue'
132
+ import { DateInterval } from '../DlDatePicker/types'
133
+ import { isEndingWithDateIntervalPattern, replaceDateInterval } from './utils'
134
+
135
+ export default defineComponent({
136
+ components: {
137
+ DlIcon,
138
+ DlButton,
139
+ DlSuggestionsDropdown,
140
+ DlTooltip,
141
+ DlDatePicker,
142
+ DlMenu
143
+ },
144
+ model: {
145
+ prop: 'modelValue',
146
+ event: 'update:modelValue'
147
+ },
148
+ props: {
149
+ status: {
150
+ type: Object as PropType<SearchStatus>,
151
+ default: () => ({ type: 'info', message: '' })
152
+ },
153
+ styleModel: {
154
+ type: Object as PropType<SyntaxColorSchema>,
155
+ default: () => {}
156
+ },
157
+ placeholder: {
158
+ type: String,
159
+ default: ''
160
+ },
161
+ suggestions: {
162
+ type: Array as PropType<string[]>,
163
+ default: () => [] as string[]
164
+ },
165
+ inputHeight: {
166
+ type: String,
167
+ default: '26px'
168
+ },
169
+ expandedInputHeight: {
170
+ type: String,
171
+ default: '327px'
172
+ },
173
+ modelValue: {
174
+ type: String,
175
+ default: ''
176
+ },
177
+ withSearchIcon: {
178
+ type: Boolean,
179
+ default: false
180
+ },
181
+ withScreenButton: {
182
+ type: Boolean,
183
+ default: false
184
+ },
185
+ withSaveButton: {
186
+ type: Boolean,
187
+ default: false
188
+ },
189
+ withDQLButton: {
190
+ type: Boolean,
191
+ default: true
192
+ },
193
+ message: {
194
+ type: String,
195
+ default: ''
196
+ },
197
+ disabled: {
198
+ type: Boolean,
199
+ default: false
200
+ }
201
+ },
202
+ emits: [
203
+ 'update:modelValue',
204
+ 'update:expanded',
205
+ 'save',
206
+ 'search',
207
+ 'filter',
208
+ 'dql-edit',
209
+ 'focus'
210
+ ],
211
+ setup(props, { emit }) {
212
+ const input = ref(null)
213
+ const label = ref(null)
214
+ const styledTexarea = ref(null)
215
+ const styledInput = ref(null)
216
+
217
+ const { hasEllipsis } = useSizeObserver(input)
218
+
219
+ const suggestionModal = ref(false)
220
+ const menuOffset = ref([0, 5])
221
+ const cancelBlur = ref(0)
222
+ const expanded = ref(false)
223
+
224
+ const datePickerSelection = ref(null)
225
+ const isDatePickerVisible = ref(false)
226
+
227
+ const setInputValue = (value: string) => {
228
+ const query = props.modelValue
229
+ .split(' ')
230
+ .map((string) => string.trim())
231
+
232
+ suggestionModal.value = false
233
+
234
+ let stringValue = ''
235
+
236
+ if (query.length > 1) {
237
+ if (query[query.length - 1] === '') {
238
+ stringValue = [...query, value, '']
239
+ .join(' ')
240
+ .replace(' ', ' ')
241
+ } else {
242
+ query.splice(-1)
243
+ stringValue = [...query, value, ''].join(' ')
244
+ }
245
+ } else {
246
+ stringValue = [value, ''].join(' ')
247
+ }
248
+
249
+ emit('update:modelValue', stringValue)
250
+ }
251
+
252
+ return {
253
+ input,
254
+ label,
255
+ hasEllipsis,
256
+ suggestionModal,
257
+ setInputValue,
258
+ menuOffset,
259
+ cancelBlur,
260
+ expanded,
261
+ styledTexarea,
262
+ styledInput,
263
+ datePickerSelection,
264
+ isDatePickerVisible
265
+ }
266
+ },
267
+ data(): {
268
+ focused: boolean
269
+ isOverflow: boolean
270
+ isTyping: boolean
271
+ } {
272
+ return {
273
+ focused: false,
274
+ isOverflow: false,
275
+ isTyping: false
276
+ }
277
+ },
278
+ computed: {
279
+ statusIcon(): string {
280
+ switch (this.status.type) {
281
+ case 'success':
282
+ return 'icon-dl-approve-filled'
283
+ case 'error':
284
+ return 'icon-dl-discard-filled'
285
+ case 'warning':
286
+ return 'icon-dl-alert-filled'
287
+ default:
288
+ return ''
289
+ }
290
+ },
291
+ statusIconColor(): string {
292
+ switch (this.status.type) {
293
+ case 'success':
294
+ return 'dl-color-positive'
295
+ case 'error':
296
+ return 'dl-color-negative'
297
+ case 'warning':
298
+ return 'dl-color-warning'
299
+ default:
300
+ return ''
301
+ }
302
+ },
303
+ screenIcon(): string {
304
+ return this.expanded
305
+ ? 'icon-dl-fit-to-screen'
306
+ : 'icon-dl-full-screen'
307
+ },
308
+ searchBarClasses(): string {
309
+ let classes = 'dl-smart-search-input__search-bar'
310
+
311
+ if (this.status.type === 'error') {
312
+ classes += ' dl-smart-search-input__search-bar--error'
313
+ } else if (this.status.type === 'warning') {
314
+ classes += ' dl-smart-search-input__search-bar--warning'
315
+ } else {
316
+ if (this.focused) {
317
+ classes += ' dl-smart-search-input__search-bar--focused'
318
+ }
319
+ }
320
+
321
+ if (this.expanded) {
322
+ classes += ' dl-smart-search-input__search-bar--expanded'
323
+ }
324
+
325
+ if (this.disabled) {
326
+ classes += ' dl-smart-search-input__search-bar--disabled'
327
+ }
328
+
329
+ return classes
330
+ },
331
+ labelStyles(): Record<string, any> {
332
+ return {
333
+ color: this.status.type === 'error' ? 'red' : 'gray'
334
+ }
335
+ },
336
+ messageClasses(): string {
337
+ let classes = 'dl-smart-search-input__message'
338
+
339
+ if (this.status) {
340
+ classes += ` dl-smart-search-input__message--${this.status}`
341
+ }
342
+
343
+ return classes
344
+ },
345
+ withClearBtn(): boolean {
346
+ return this.modelValue.length > 0
347
+ },
348
+ cssVars(): Record<string, string> {
349
+ return {
350
+ '--dl-smart-search-bar-wrapper-height':
351
+ this.expandedInputHeight,
352
+ '--dl-smart-search-input-height': this.inputHeight
353
+ }
354
+ }
355
+ },
356
+ watch: {
357
+ modelValue(value: string) {
358
+ const target = this.$refs['input'] as HTMLInputElement
359
+ value = value?.replaceAll(' ', ' ') ?? ''
360
+ if (!this.isTyping) target.innerHTML = value
361
+ updateEditor(this.styleModel)
362
+ this.setMenuOffset(isEligibleToChange(target, this.expanded))
363
+ if (!this.isTyping) setCaret(target)
364
+ if (!this.expanded) {
365
+ this.isOverflow =
366
+ isEllipsisActive(this.$refs['input'] as Element) ||
367
+ this.hasEllipsis
368
+ }
369
+ if (value.length === 0) {
370
+ this.focus()
371
+ }
372
+ if (isEndingWithDateIntervalPattern(value)) {
373
+ this.isDatePickerVisible = true
374
+ this.suggestionModal = false
375
+ }
376
+ },
377
+ suggestions(val) {
378
+ if (this.isDatePickerVisible) return
379
+
380
+ if (!val.length) {
381
+ this.suggestionModal = false
382
+ }
383
+
384
+ if (!this.suggestionModal && val.length > 0 && this.focused) {
385
+ const deb = debounce(() => (this.suggestionModal = true), 200)
386
+ deb()
387
+ }
388
+ },
389
+ expanded(value) {
390
+ this.$nextTick(() => {
391
+ const element = this.$refs['input'] as HTMLTextAreaElement
392
+
393
+ if (!value) {
394
+ element.scrollLeft = 0
395
+ }
396
+
397
+ this.setMenuOffset(isEligibleToChange(element, value))
398
+
399
+ this.focus()
400
+ })
401
+ },
402
+ isDatePickerVisible(val: boolean) {
403
+ if (!val) {
404
+ this.datePickerSelection = null
405
+
406
+ setTimeout(() => {
407
+ this.focus()
408
+ }, 1)
409
+ }
410
+ }
411
+ },
412
+ mounted() {
413
+ if (!this.expanded) {
414
+ this.isOverflow =
415
+ isEllipsisActive(this.$refs['input'] as Element) ||
416
+ this.hasEllipsis
417
+ }
418
+ window.addEventListener('mousemove', () => (this.isTyping = false))
419
+ },
420
+ methods: {
421
+ setMenuOffset(value: number[]) {
422
+ this.menuOffset = value
423
+ },
424
+ focus() {
425
+ const target = this.$refs['input'] as HTMLInputElement
426
+ if (this.disabled) {
427
+ return
428
+ }
429
+
430
+ target.scrollTo(0, target.scrollHeight)
431
+ target.scrollLeft = target.scrollWidth
432
+
433
+ target.focus()
434
+
435
+ this.focused = true
436
+ this.$emit('focus', true)
437
+ },
438
+ blur() {
439
+ const element = this.$refs['input'] as HTMLTextAreaElement
440
+
441
+ if (this.isDatePickerVisible) {
442
+ return
443
+ }
444
+
445
+ if (this.cancelBlur === 0) {
446
+ if (this.suggestionModal) {
447
+ this.focused = true
448
+ return
449
+ }
450
+ element.scrollLeft = 0
451
+ element.scrollTop = 0
452
+ this.focused = false
453
+ this.$emit('focus', false)
454
+ } else {
455
+ this.focus()
456
+ this.focused = true
457
+ this.cancelBlur = this.cancelBlur - 1
458
+ }
459
+ },
460
+ save() {
461
+ this.$emit('save')
462
+ },
463
+ edit() {
464
+ this.$emit('dql-edit')
465
+ },
466
+ clearValue() {
467
+ this.cancelBlur = this.cancelBlur === 0 ? 1 : this.cancelBlur
468
+ this.$emit('update:modelValue', '')
469
+ if (!this.focused) {
470
+ this.focus()
471
+ }
472
+ },
473
+ keyPress(e: KeyboardEvent) {
474
+ if (e.key === 'Enter') {
475
+ this.$emit('search', this.modelValue)
476
+ e.preventDefault()
477
+ return
478
+ } else if (e.key === 'backspace') {
479
+ setCaret(this.$refs['input'] as HTMLElement)
480
+ }
481
+ },
482
+ handleValueChange(e: Event) {
483
+ this.isTyping = true
484
+ const text = (e.target as HTMLElement).textContent
485
+ .toString()
486
+ .replaceAll(' ', ' ')
487
+
488
+ this.$emit('update:modelValue', text)
489
+ },
490
+ handleScreenBtnClick() {
491
+ this.cancelBlur = this.cancelBlur === 0 ? 1 : this.cancelBlur
492
+ this.expanded = !this.expanded
493
+ if (!this.focused) {
494
+ this.focus()
495
+ }
496
+ },
497
+ handleDateSelectionUpdate(val: DateInterval) {
498
+ this.datePickerSelection = val
499
+
500
+ this.$emit(
501
+ 'update:modelValue',
502
+ replaceDateInterval(this.modelValue, val)
503
+ )
504
+ }
505
+ }
506
+ })
507
+ </script>
508
+ <style lang="scss" scoped>
509
+ .dl-smart-search-input {
510
+ display: flex;
511
+ text-align: left;
512
+
513
+ &__char {
514
+ ::selection {
515
+ color: white;
516
+ }
517
+ }
518
+
519
+ &__search-bar-wrapper {
520
+ position: relative;
521
+ display: flex;
522
+ flex-direction: column;
523
+ flex-grow: 1;
524
+ }
525
+
526
+ &__search-bar {
527
+ display: flex;
528
+ flex-grow: 1;
529
+ height: auto;
530
+ padding: 0 10px;
531
+ overflow-y: auto;
532
+ background-color: var(--dl-color-panel-background);
533
+
534
+ font-size: 12px;
535
+ line-height: 14px;
536
+
537
+ border: 1px solid var(--dl-color-separator);
538
+ border-radius: 2px;
539
+
540
+ max-height: 40px;
541
+
542
+ &--error {
543
+ border-color: var(--dl-color-negative);
544
+ }
545
+
546
+ &--warning {
547
+ border-color: var(--dl-color-warning);
548
+ }
549
+
550
+ &--focused {
551
+ border-color: var(--dl-color-secondary);
552
+ }
553
+
554
+ &--expanded {
555
+ transition: height 0.3s ease-out;
556
+ position: relative;
557
+ top: 0;
558
+ left: 0;
559
+ right: 0;
560
+ height: var(--dl-smart-search-bar-wrapper-height);
561
+ max-height: var(--dl-smart-search-bar-wrapper-height);
562
+ }
563
+
564
+ &--disabled {
565
+ border-color: var(--dl-color-disabled);
566
+ }
567
+ }
568
+
569
+ &__status-icon-wrapper {
570
+ display: flex;
571
+ align-items: center;
572
+ height: var(--dl-smart-search-input-height);
573
+ margin-right: 5px;
574
+ }
575
+
576
+ &__input {
577
+ font-size: 12px;
578
+ line-height: 14px;
579
+ font-weight: 400;
580
+ font-family: 'Roboto', sans-serif;
581
+ width: 100%;
582
+ border: none;
583
+ outline: none;
584
+
585
+ position: absolute;
586
+ width: 100%;
587
+ font-size: inherit;
588
+ font-family: inherit;
589
+
590
+ height: 14px;
591
+ overflow-y: hidden;
592
+ overflow-x: auto;
593
+ white-space: nowrap;
594
+ user-select: none;
595
+
596
+ -ms-overflow-style: none; /* IE and Edge */
597
+ scrollbar-width: none; /* Firefox */
598
+ &::-webkit-scrollbar {
599
+ display: none;
600
+ }
601
+ &:not(:focus) {
602
+ width: 100%;
603
+ text-overflow: ellipsis;
604
+ }
605
+
606
+ caret-color: var(--dl-color-tooltip-background);
607
+ }
608
+
609
+ &__input,
610
+ &__text,
611
+ &__textarea {
612
+ width: 100%;
613
+ font-size: inherit;
614
+ font-family: inherit;
615
+ }
616
+
617
+ &__textarea {
618
+ font-size: 12px;
619
+ line-height: 14px;
620
+ font-weight: 400;
621
+ font-family: 'Roboto', sans-serif;
622
+ width: 100%;
623
+ border: none;
624
+ outline: none;
625
+ resize: none;
626
+
627
+ height: auto;
628
+ min-height: 14px;
629
+ max-height: 100%;
630
+ overflow-y: auto;
631
+
632
+ word-break: break-all;
633
+ flex-wrap: wrap;
634
+ }
635
+
636
+ &__input,
637
+ &__textarea {
638
+ color: var(--dl-color-darker);
639
+ background-color: var(--dl-color-panel-background);
640
+ padding: 0;
641
+
642
+ ::placeholder {
643
+ color: var(--dl-color-lighter);
644
+ }
645
+ & > * {
646
+ display: flex;
647
+ }
648
+ }
649
+
650
+ &__input-wrapper,
651
+ &__textarea-wrapper {
652
+ position: relative;
653
+ display: flex;
654
+ flex-grow: 1;
655
+ padding: 6px 10px 6px 0;
656
+ position: relative;
657
+
658
+ align-items: flex-start;
659
+ justify-content: flex-start;
660
+ }
661
+
662
+ &__input-wrapper {
663
+ align-items: center;
664
+ }
665
+
666
+ &__toolbar {
667
+ display: flex;
668
+ height: var(--dl-smart-search-input-height);
669
+ }
670
+
671
+ &__clear-btn-wrapper {
672
+ border-right: 1px solid var(--dl-color-separator);
673
+ padding: 0 7px;
674
+ display: flex;
675
+ align-items: center;
676
+ ::v-deep .dl-button {
677
+ padding: 0px;
678
+ color: var(--dl-color-darker);
679
+ }
680
+ }
681
+
682
+ &__screen-btn-wrapper {
683
+ display: flex;
684
+ align-items: center;
685
+ padding: 0 10px;
686
+ ::v-deep .dl-icon {
687
+ font-size: 16px;
688
+ color: var(--dl-color-darker);
689
+ }
690
+ }
691
+
692
+ &__save-btn-wrapper {
693
+ display: flex;
694
+ align-items: center;
695
+ color: var(--dl-color-darker);
696
+
697
+ & > div:nth-of-type(1) {
698
+ padding-right: 10px;
699
+ border-right: 1px solid var(--dl-color-separator);
700
+ }
701
+ & > div:nth-of-type(2) {
702
+ padding-left: 10px;
703
+ }
704
+ ::v-deep .dl-icon {
705
+ transition: 1s;
706
+ font-size: 16px;
707
+ color: var(--dl-color-darker);
708
+ }
709
+ }
710
+
711
+ &__action-buttons {
712
+ display: flex;
713
+ align-items: center;
714
+ height: var(--dl-smart-search-input-height);
715
+ }
716
+
717
+ &__message {
718
+ margin-top: 3px;
719
+ color: var(--dl-color-medium);
720
+ font-size: 10px;
721
+ line-height: 12px;
722
+
723
+ &--error {
724
+ color: var(--dl-color-negative);
725
+ }
726
+ }
727
+
728
+ &__search-label {
729
+ font-size: 10px;
730
+ margin-left: 4px;
731
+ margin-top: 4px;
732
+ color: gray;
733
+ position: relative;
734
+ word-break: break-all;
735
+ }
736
+
737
+ &__date-picker-wrapper {
738
+ width: 562px;
739
+ }
740
+ }
741
+ </style>