@dataloop-ai/components 0.18.145 → 0.19.1

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 (86) hide show
  1. package/package.json +4 -1
  2. package/src/assets/constants.scss +25 -26
  3. package/src/assets/globals.scss +58 -56
  4. package/src/assets/grid.css +1 -1
  5. package/src/assets/grid.scss +4 -4
  6. package/src/components/basic/DlAccordion/DlAccordion.vue +10 -3
  7. package/src/components/basic/DlEmptyState/types.ts +1 -1
  8. package/src/components/basic/DlGrid/DlGrid.vue +2 -1
  9. package/src/components/basic/DlPopup/DlPopup.vue +159 -396
  10. package/src/components/basic/DlWidget/DlWidget.vue +2 -1
  11. package/src/components/basic/utils.ts +0 -9
  12. package/src/components/blocks/DlLabelPicker/DlLabelPicker.vue +127 -0
  13. package/src/components/blocks/DlLabelPicker/index.ts +3 -0
  14. package/src/components/blocks/DlLabelPicker/types.ts +6 -0
  15. package/src/components/blocks/index.ts +1 -0
  16. package/src/components/blocks/types.ts +1 -0
  17. package/src/components/compound/DlCodeEditor/README.md +5 -4
  18. package/src/components/compound/DlCodeEditor/styles/themes-base16.css +16934 -11289
  19. package/src/components/compound/DlCodeEditor/styles/themes.css +5122 -3448
  20. package/src/components/compound/DlInput/DlInput.vue +609 -178
  21. package/src/components/compound/DlInput/components/InputFileElement.vue +97 -0
  22. package/src/components/compound/DlInput/types.ts +12 -0
  23. package/src/components/compound/DlInput/utils.ts +117 -0
  24. package/src/components/compound/DlSearches/DlSearch/DlSearch.vue +10 -1
  25. package/src/components/compound/DlSearches/DlSmartSearch/components/DlSmartSearchInput.vue +3 -3
  26. package/src/components/compound/DlSearches/DlSmartSearch/utils/highlightSyntax.ts +1 -1
  27. package/src/components/compound/DlSlider/sliderStyles.scss +92 -92
  28. package/src/components/compound/DlTable/DlTable.vue +701 -358
  29. package/src/components/compound/DlTable/components/DlTd.vue +11 -9
  30. package/src/components/compound/DlTable/components/DlTh.vue +22 -21
  31. package/src/components/compound/DlTable/components/SortableJS.vue +33 -0
  32. package/src/components/compound/DlTable/hooks/tableActions.ts +3 -3
  33. package/src/components/compound/DlTable/hooks/tableColumnSelection.ts +3 -4
  34. package/src/components/compound/DlTable/hooks/use-sortable.ts +152 -0
  35. package/src/components/compound/DlTable/styles/dl-table-styles.scss +372 -377
  36. package/src/components/compound/DlTable/types.ts +6 -0
  37. package/src/components/compound/DlTable/utils/getCellValue.ts +27 -0
  38. package/src/components/compound/DlTable/utils/insertAtIndex.ts +22 -0
  39. package/src/components/compound/DlTable/utils/tableClasses.ts +22 -0
  40. package/src/components/compound/DlToast/api/useToast.ts +10 -4
  41. package/src/components/compound/DlToast/components/ToastComponent.vue +26 -21
  42. package/src/components/compound/DlToast/utils/render.ts +15 -8
  43. package/src/components/compound/DlTreeTable/DlTreeTable.vue +708 -323
  44. package/src/components/compound/DlTreeTable/components/DlTdTree.vue +10 -9
  45. package/src/components/compound/DlTreeTable/components/DlTrTree.vue +13 -0
  46. package/src/components/compound/DlTreeTable/emits.ts +2 -2
  47. package/src/components/compound/DlTreeTable/utils/index.ts +6 -0
  48. package/src/components/compound/DlTreeTable/utils/moveNestedRow.ts +95 -0
  49. package/src/components/compound/DlTreeTable/utils/trSpacing.ts +12 -1
  50. package/src/components/compound/DlTreeTable/utils/treeTableRowSelection.ts +10 -7
  51. package/src/components/compound/DlTreeTable/views/DlTrTreeView.vue +52 -58
  52. package/src/components/essential/DlMenu/DlMenu.vue +25 -0
  53. package/src/components/index.ts +1 -0
  54. package/src/components/shared/DlVirtualScroll/DlVirtualScroll.vue +2 -1
  55. package/src/components/shared/DlVirtualScroll/styles/dl-virtual-scroll-styles.scss +62 -41
  56. package/src/components/types.ts +1 -0
  57. package/src/demos/DlAccordionDemo.vue +32 -0
  58. package/src/demos/DlButtonDemo.vue +7 -0
  59. package/src/demos/DlDemoPage.vue +1 -0
  60. package/src/demos/DlInputDemo.vue +122 -64
  61. package/src/demos/DlLabelPickerDemo.vue +46 -0
  62. package/src/demos/DlPopupDemo.vue +94 -4
  63. package/src/demos/DlSearchDemo.vue +0 -1
  64. package/src/demos/DlTableDemo.vue +261 -162
  65. package/src/demos/DlToastDemo.vue +28 -1
  66. package/src/demos/DlTreeTableDemo.vue +266 -262
  67. package/src/demos/DlVirtualScrollDemo.vue +1 -4
  68. package/src/demos/index.ts +3 -1
  69. package/src/hooks/use-model-toggle.ts +26 -62
  70. package/src/utils/browse-nested-nodes.ts +26 -0
  71. package/src/utils/draggable-table.ts +100 -488
  72. package/src/utils/get-element-above.ts +8 -0
  73. package/src/utils/getSlotByVersion.ts +11 -0
  74. package/src/utils/index.ts +4 -0
  75. package/src/utils/keyCodes.ts +1 -1
  76. package/src/utils/remove-child-nodes.ts +5 -0
  77. package/src/utils/render-fn.ts +46 -0
  78. package/src/utils/resizable-table.ts +110 -0
  79. package/src/utils/selection.ts +196 -0
  80. package/src/utils/swap-nodes.ts +11 -0
  81. package/src/utils/table-columns.ts +209 -0
  82. package/src/components/compound/DlTable/utils/ResizableManager.ts +0 -236
  83. package/src/components/compound/DlTable/utils/index.ts +0 -1
  84. package/src/components/compound/DlTable/utils/props.ts +0 -120
  85. package/src/components/compound/DlTreeTable/props.ts +0 -134
  86. package/src/components/compound/DlTreeTable/utils/flatTreeData.ts +0 -19
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div
3
+ class="input-file-element"
4
+ @mouseenter="visibleMenu = true"
5
+ @mouseleave="visibleMenu = false"
6
+ >
7
+ <div
8
+ v-if="file.image"
9
+ class="file-image"
10
+ :style="`background-image: url(${file.image})`"
11
+ />
12
+ <div
13
+ v-else
14
+ class="file-image input-file-element--default"
15
+ >
16
+ <dl-icon
17
+ size="50px"
18
+ icon="icon-dl-file"
19
+ />
20
+ </div>
21
+ <div
22
+ v-if="visibleMenu"
23
+ class="input-file-element__menu"
24
+ >
25
+ <dl-icon
26
+ v-if="file.image"
27
+ class="input-file-element--icon"
28
+ icon="icon-dl-zoom-in"
29
+ @click="$emit('zoom-image', file)"
30
+ />
31
+ <dl-icon
32
+ class="input-file-element--icon"
33
+ icon="icon-dl-edit"
34
+ @click="$emit('rename-file', file)"
35
+ />
36
+ <dl-icon
37
+ class="input-file-element--icon"
38
+ icon="icon-dl-discard"
39
+ @click="$emit('remove-file', file.id)"
40
+ />
41
+ </div>
42
+ </div>
43
+ </template>
44
+
45
+ <script lang="ts">
46
+ import { defineComponent, PropType } from 'vue-demi'
47
+ import { DlInputFile } from '../types'
48
+ import { DlIcon } from '../../../essential'
49
+ export default defineComponent({
50
+ components: {
51
+ DlIcon
52
+ },
53
+ props: {
54
+ file: {
55
+ type: Object as PropType<DlInputFile>,
56
+ default: null
57
+ }
58
+ },
59
+ emits: ['remove-file', 'zoom-image', 'rename-file'],
60
+ data() {
61
+ return {
62
+ visibleMenu: false
63
+ }
64
+ }
65
+ })
66
+ </script>
67
+
68
+ <style lang="scss" scoped>
69
+ .input-file-element {
70
+ position: relative;
71
+ &--default {
72
+ display: flex;
73
+ justify-content: center;
74
+ align-items: center;
75
+ }
76
+ &__menu {
77
+ background-color: var(--dl-color-panel-background);
78
+ border-radius: 2px;
79
+ padding: 5px;
80
+ display: flex;
81
+ gap: 5px;
82
+ position: absolute;
83
+ top: 5px;
84
+ right: 5px;
85
+ }
86
+ &--icon {
87
+ cursor: pointer;
88
+ }
89
+ padding: 5px;
90
+ }
91
+ .file-image {
92
+ width: 100px;
93
+ height: 100px;
94
+ background-size: cover;
95
+ background-position: center;
96
+ }
97
+ </style>
@@ -0,0 +1,12 @@
1
+ export interface DlInputSuggestion {
2
+ suggestion: string
3
+ image: string
4
+ click: boolean
5
+ }
6
+
7
+ export interface DlInputFile {
8
+ id: string
9
+ name: string
10
+ image: string
11
+ data: ArrayBuffer
12
+ }
@@ -0,0 +1,117 @@
1
+ import {
2
+ getInnerText,
3
+ getSelectionOffset,
4
+ setSelectionOffset
5
+ } from '../../../utils'
6
+ import { DlInputSuggestion } from './types'
7
+
8
+ export function addEventListenersToElement(
9
+ element: HTMLElement,
10
+ eventHandlers: Record<string, (e: any) => void>
11
+ ) {
12
+ for (const eventType in eventHandlers) {
13
+ const handler = eventHandlers[eventType]
14
+ element.addEventListener(eventType, handler)
15
+ }
16
+ }
17
+
18
+ export function clearSuggestion(text: string, suggestion: string) {
19
+ return text.split(' ').slice(0, -1).join(' ') + ' ' + suggestion
20
+ }
21
+
22
+ export function setInnerHTMLWithCursor(
23
+ inputEl: HTMLElement,
24
+ action: (str: string) => void
25
+ ) {
26
+ const [start, end] = getSelectionOffset(inputEl)
27
+ const textBefore = getInnerText(inputEl)
28
+ action(textBefore)
29
+ setSelectionOffset(inputEl, start, end)
30
+ }
31
+
32
+ export function getSuggestItems(
33
+ suggestions: DlInputSuggestion[],
34
+ text: string
35
+ ) {
36
+ if (!text.trim()) {
37
+ return suggestions
38
+ }
39
+ const lowered = text.toLowerCase()
40
+ const split = lowered.split(' ')
41
+ const lastKeyword = split[split.length - 1]
42
+ return suggestions.filter((item) => {
43
+ const lowercasedSuggestion = item.suggestion.toLowerCase()
44
+ return (
45
+ lowercasedSuggestion !== lastKeyword &&
46
+ lowercasedSuggestion.includes(lastKeyword)
47
+ )
48
+ })
49
+ }
50
+
51
+ export async function readClipboard(): Promise<{ type: string; data: any }[]> {
52
+ // removing typing of clipboard for now as it causes conflicts somehow
53
+
54
+ const fetchItemType = async (item: any, type: string) => {
55
+ const itemType: Blob = await item.getType(type)
56
+ return { type: itemType.type, data: itemType }
57
+ }
58
+ const promises: Promise<{ type: string; data: any }>[] = []
59
+
60
+ const clipboard = navigator.clipboard as any
61
+ try {
62
+ const content: any = await clipboard.read()
63
+ for (const item of content) {
64
+ for (const type of item.types) {
65
+ promises.push(fetchItemType(item, type))
66
+ }
67
+ }
68
+
69
+ return Promise.all(promises)
70
+ } catch (e) {
71
+ return []
72
+ }
73
+ }
74
+
75
+ export function readBlob(blob: Blob): Promise<ArrayBuffer> {
76
+ return new Promise((resolve, reject) => {
77
+ const reader = new FileReader()
78
+
79
+ reader.onload = () => {
80
+ const result = reader.result as ArrayBuffer
81
+ resolve(result)
82
+ }
83
+
84
+ reader.onerror = () => {
85
+ reject(new Error('Error reading Blob'))
86
+ }
87
+
88
+ reader.readAsArrayBuffer(blob)
89
+ })
90
+ }
91
+
92
+ export function isArrayBufferImage(arrayBuffer: ArrayBuffer): boolean {
93
+ const view = new DataView(arrayBuffer)
94
+
95
+ if (
96
+ view.getUint8(0) === 0xff &&
97
+ view.getUint8(1) === 0xd8 &&
98
+ view.getUint8(2) === 0xff
99
+ ) {
100
+ return true
101
+ }
102
+
103
+ if (
104
+ view.getUint8(0) === 0x89 &&
105
+ view.getUint8(1) === 0x50 &&
106
+ view.getUint8(2) === 0x4e &&
107
+ view.getUint8(3) === 0x47 &&
108
+ view.getUint8(4) === 0x0d &&
109
+ view.getUint8(5) === 0x0a &&
110
+ view.getUint8(6) === 0x1a &&
111
+ view.getUint8(7) === 0x0a
112
+ ) {
113
+ return true
114
+ }
115
+
116
+ return false
117
+ }
@@ -7,6 +7,7 @@
7
7
  >
8
8
  <dl-input
9
9
  ref="input"
10
+ class="text-input-area"
10
11
  type="text"
11
12
  clear-button-tooltip
12
13
  :size="size"
@@ -16,6 +17,7 @@
16
17
  :highlight-matches="highlightMatches"
17
18
  :dense="dense"
18
19
  :suggest-menu-width="suggestMenuWidth"
20
+ :debounce="debounce"
19
21
  @input="onChange"
20
22
  @focus="onFocus"
21
23
  @blur="onBlur"
@@ -87,7 +89,8 @@ export default defineComponent({
87
89
  highlightMatches: { type: Boolean, default: false },
88
90
  dense: { type: Boolean, default: false },
89
91
  withSearchButton: { type: Boolean, default: false },
90
- suggestMenuWidth: { type: String, default: 'auto' }
92
+ suggestMenuWidth: { type: String, default: 'auto' },
93
+ debounce: { type: Number, default: 0 }
91
94
  },
92
95
  emits: [
93
96
  'input',
@@ -108,6 +111,7 @@ export default defineComponent({
108
111
  return BUTTON_SIZES[this.size]
109
112
  },
110
113
  identifierClass(): string {
114
+ if (!this.placeholder) return 'dl-search'
111
115
  return `dl-search-${this.placeholder}`.replaceAll(' ', '-')
112
116
  },
113
117
  buttonClasses(): string[] {
@@ -150,6 +154,11 @@ export default defineComponent({
150
154
  display: flex;
151
155
  align-items: center;
152
156
  width: 100%;
157
+ gap: 10px;
158
+ }
159
+
160
+ .text-input-area {
161
+ flex-grow: 1;
153
162
  }
154
163
 
155
164
  ::v-deep .dl-text-input {
@@ -105,6 +105,7 @@ import { DlDatePicker } from '../../../DlDateTime'
105
105
  import { DlMenu, DlIcon, DlLabel } from '../../../../essential'
106
106
  import { isEllipsisActive } from '../../../../../utils/is-ellipsis-active'
107
107
  import { useSizeObserver } from '../../../../../hooks/use-size-observer'
108
+ import { setCaretAtTheEnd } from '../../../../../utils'
108
109
  import { ColorSchema, SearchStatus, SyntaxColorSchema } from '../types'
109
110
  import { debounce, isEqual } from 'lodash'
110
111
  import { DlTooltip } from '../../../../shared'
@@ -113,7 +114,6 @@ import { DateInterval } from '../../../DlDateTime/types'
113
114
  import {
114
115
  isEndingWithDateIntervalPattern,
115
116
  replaceDateInterval,
116
- setCaret,
117
117
  updateEditor,
118
118
  isEligibleToChange,
119
119
  createColorSchema,
@@ -355,7 +355,7 @@ export default defineComponent({
355
355
  setInputValue(
356
356
  clearPartlyTypedSuggestion(input.value.innerText, stringValue)
357
357
  )
358
- setCaret(input.value)
358
+ setCaretAtTheEnd(input.value)
359
359
  }
360
360
 
361
361
  const debouncedSetInputValue = debounce(setInputValue, 300)
@@ -599,7 +599,7 @@ export default defineComponent({
599
599
  showDatePicker.value = false
600
600
  showSuggestions.value = true
601
601
  datePickerSelection.value = null
602
- setCaret(input.value)
602
+ setCaretAtTheEnd(input.value)
603
603
  return
604
604
  }
605
605
 
@@ -110,7 +110,7 @@ function renderText(text: string, colorSchema: SyntaxColorSchema) {
110
110
  return output?.join('')
111
111
  }
112
112
 
113
- export function setCaret(target: HTMLElement) {
113
+ export function setCaretAtTheEnd(target: HTMLElement) {
114
114
  const range = document.createRange()
115
115
  const sel = window.getSelection()
116
116
  range.selectNodeContents(target)
@@ -1,117 +1,117 @@
1
1
  .slider-bar {
2
- position: relative;
3
- width: 100%;
4
- cursor: grab;
5
- display: inline-flex;
6
- flex-wrap: nowrap;
7
- flex-direction: column;
8
- opacity: 1;
9
-
10
- & .track-container {
11
- cursor: grab;
12
- outline: 0;
2
+ position: relative;
13
3
  width: 100%;
14
- padding: 4px 0;
15
-
16
- & .track {
17
- height: 2px;
18
- width: inherit;
19
- position: relative;
20
- outline: none;
21
- background-color: var(--dl-color-separator);
22
-
23
- & .selection {
24
- background: currentColor;
25
- border-radius: inherit;
26
- width: 100%;
27
- height: 100%;
28
- position: absolute;
29
- }
4
+ cursor: grab;
5
+ display: inline-flex;
6
+ flex-wrap: nowrap;
7
+ flex-direction: column;
8
+ opacity: 1;
30
9
 
31
- & .thumb {
32
- z-index: 1;
10
+ & .track-container {
11
+ cursor: grab;
33
12
  outline: 0;
34
- transition: transform 0.18s ease-out, fill 0.18s ease-out,
35
- stroke 0.18s ease-out;
36
- top: 50%;
37
- transform: scale(1) translate(-50%, -50%);
38
- position: absolute;
39
- user-select: none;
40
- border-radius: 50%;
41
- }
13
+ width: 100%;
14
+ padding: 4px 0;
15
+
16
+ & .track {
17
+ height: 2px;
18
+ width: inherit;
19
+ position: relative;
20
+ outline: none;
21
+ background-color: var(--dl-color-separator);
22
+
23
+ & .selection {
24
+ background: currentColor;
25
+ border-radius: inherit;
26
+ width: 100%;
27
+ height: 100%;
28
+ position: absolute;
29
+ }
30
+
31
+ & .thumb {
32
+ z-index: 1;
33
+ outline: 0;
34
+ transition: transform 0.18s ease-out, fill 0.18s ease-out,
35
+ stroke 0.18s ease-out;
36
+ top: 50%;
37
+ transform: scale(1) translate(-50%, -50%);
38
+ position: absolute;
39
+ user-select: none;
40
+ border-radius: 50%;
41
+ }
42
+ }
42
43
  }
43
- }
44
44
  }
45
45
 
46
46
  .slider-content {
47
- font-size: var(--dl-font-size-body);
48
- line-height: 13px;
49
- color: var(--text-color);
50
-
51
- .disabled {
52
- color: var(--dl-color-separator);
53
- cursor: not-allowed;
54
- }
55
-
56
- .readonly {
57
- cursor: auto;
58
- }
59
-
60
- #slider-input {
61
- padding: 3px 5px;
62
- }
47
+ font-size: var(--dl-font-size-body);
48
+ line-height: 13px;
49
+ color: var(--text-color);
50
+
51
+ .disabled {
52
+ color: var(--dl-color-separator);
53
+ cursor: not-allowed;
54
+ }
55
+
56
+ .readonly {
57
+ cursor: auto;
58
+ }
59
+
60
+ #slider-input {
61
+ padding: 3px 5px;
62
+ }
63
63
  }
64
64
 
65
65
  .slider {
66
- display: flex;
67
- justify-content: center;
68
- width: var(--width);
69
-
70
- & .slider-bar-container {
71
66
  display: flex;
72
- align-items: center;
73
- width: calc(100% - var(--thumb-size));
74
- align-self: center;
75
- }
67
+ justify-content: center;
68
+ width: var(--width);
69
+
70
+ & .slider-bar-container {
71
+ display: flex;
72
+ align-items: center;
73
+ width: calc(100% - var(--thumb-size));
74
+ align-self: center;
75
+ }
76
76
 
77
- & .text {
78
- padding: 0;
79
- margin-right: 5px;
80
- text-align: left;
81
- }
77
+ & .text {
78
+ padding: 0;
79
+ margin-right: 5px;
80
+ text-align: left;
81
+ }
82
82
 
83
- & .capitalize::first-letter {
84
- text-transform: capitalize;
85
- }
83
+ & .capitalize::first-letter {
84
+ text-transform: capitalize;
85
+ }
86
86
  }
87
87
 
88
88
  .slim {
89
- align-items: center;
90
- flex-direction: row;
89
+ align-items: center;
90
+ flex-direction: row;
91
91
  }
92
92
 
93
93
  .non-slim {
94
- flex-direction: column;
95
-
96
- & .header {
97
- display: flex;
98
- justify-content: space-between;
99
- align-items: center;
100
- margin-bottom: 10px;
101
-
102
- & .right-container {
103
- display: flex;
104
- align-items: center;
105
- justify-content: space-between;
106
- & > * {
107
- margin: 0px 5px
108
- }
94
+ flex-direction: column;
95
+
96
+ & .header {
97
+ display: flex;
98
+ justify-content: space-between;
99
+ align-items: center;
100
+ margin-bottom: 10px;
101
+
102
+ & .right-container {
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ & > * {
107
+ margin: 0px 5px;
108
+ }
109
+ }
109
110
  }
110
- }
111
111
  }
112
112
 
113
113
  // override the button padding
114
114
  .dl-button {
115
- padding: 0;
116
- font-size: var(--dl-font-size-body);
117
- }
115
+ padding: 0;
116
+ font-size: var(--dl-font-size-body);
117
+ }