@dataloop-ai/components 0.13.19 → 0.14.4

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 (94) hide show
  1. package/.nvmrc +1 -0
  2. package/README.md +3 -1
  3. package/package.json +19 -17
  4. package/src/assets/globals.scss +38 -3
  5. package/src/assets/grid.scss +9 -0
  6. package/src/components/DlAccordion/DlAccordion.vue +4 -4
  7. package/src/components/DlAlert.vue +6 -6
  8. package/src/components/DlChart/BrushThumb.vue +83 -0
  9. package/src/components/DlChart/DlBarChart.vue +545 -0
  10. package/src/components/DlChart/DlBrush.vue +475 -0
  11. package/src/components/DlChart/DlChartLabels.vue +279 -0
  12. package/src/components/DlChart/DlChartLegend.vue +141 -0
  13. package/src/components/DlChart/DlColumnChart.vue +555 -0
  14. package/src/components/DlChart/DlLineChart.vue +644 -0
  15. package/src/components/DlChart/DlScrollBar.vue +147 -0
  16. package/src/components/DlChart/Doughnut/DlDoughnutChart.vue +448 -0
  17. package/src/components/DlChart/Doughnut/DlDoughnutChartLegend.vue +281 -0
  18. package/src/components/DlChart/Doughnut/DlDoughnutChartWidget.vue +64 -0
  19. package/src/components/DlChart/Doughnut/types/TDoughnutChartAnimation.ts +4 -0
  20. package/src/components/DlChart/Doughnut/types/TDoughnutChartData.ts +16 -0
  21. package/src/components/DlChart/Doughnut/types/TDoughnutChartOptions.ts +11 -0
  22. package/src/components/DlChart/Doughnut/types/TDoughnutChartProps.ts +8 -0
  23. package/src/components/DlChart/Doughnut/types/TDoughnutWithOriginalColor.ts +13 -0
  24. package/src/components/DlChart/chart.ts +122 -0
  25. package/src/components/DlChart/index.ts +36 -0
  26. package/src/components/DlChart/props.ts +348 -0
  27. package/src/components/DlChart/typedCharts.ts +88 -0
  28. package/src/components/DlChart/types.ts +63 -0
  29. package/src/components/DlChart/utils.ts +153 -0
  30. package/src/components/DlChip/DlChip.vue +40 -13
  31. package/src/components/DlCounters.vue +31 -7
  32. package/src/components/DlDatePicker/DlCalendar.vue +22 -10
  33. package/src/components/DlDatePicker/DlDatePicker.vue +8 -5
  34. package/src/components/DlDateTimeRange/types.ts +2 -2
  35. package/src/components/DlDropdownButton.vue +5 -3
  36. package/src/components/DlMenu/DlMenu.vue +4 -2
  37. package/src/components/DlPagination/RowsSelector.vue +15 -2
  38. package/src/components/DlPopup/DlPopup.vue +0 -1
  39. package/src/components/DlRange/DlRange.vue +3 -2
  40. package/src/components/DlSearch.vue +1 -1
  41. package/src/components/DlSelect/DlSelect.vue +3 -2
  42. package/src/components/DlSlider/sliderStyles.scss +4 -0
  43. package/src/components/DlSlider/useSlider.ts +39 -12
  44. package/src/components/DlSmartSearch/DlSuggestionsDropdown.vue +1 -1
  45. package/src/components/DlSpinner.vue +259 -0
  46. package/src/components/DlTable/DlTable.vue +4 -1
  47. package/src/components/DlTable/hooks/tablePagination.ts +8 -2
  48. package/src/components/DlTextArea.vue +9 -0
  49. package/src/components/DlTextInput.vue +4 -2
  50. package/src/components/DlThemeProvider.vue +22 -13
  51. package/src/components/DlToastMessage/api/useToast.ts +23 -0
  52. package/src/components/DlToastMessage/components/ToastComponent.vue +279 -0
  53. package/src/components/DlToastMessage/index.ts +5 -0
  54. package/src/components/DlToastMessage/types.ts +4 -0
  55. package/src/components/DlToastMessage/utils/config.ts +17 -0
  56. package/src/components/DlToastMessage/utils/render.ts +56 -0
  57. package/src/components/DlTypography.vue +1 -1
  58. package/src/components/DlWidget/DlGrid.vue +33 -0
  59. package/src/components/DlWidget/DlGridRow.vue +32 -0
  60. package/src/components/DlWidget/DlWidget.vue +202 -11
  61. package/src/components/DlWidget/index.ts +2 -2
  62. package/src/components/DlWidget/utils.ts +26 -19
  63. package/src/components/index.ts +8 -3
  64. package/src/demo/BarChartDemo.vue +77 -0
  65. package/src/demo/ColumnChartDemo.vue +230 -0
  66. package/src/demo/DlButtonDemo.vue +1 -1
  67. package/src/demo/DlChartDoughnutDemo.vue +229 -0
  68. package/src/demo/DlChipDemo.vue +42 -18
  69. package/src/demo/DlDialogBoxDemo.vue +4 -4
  70. package/src/demo/DlDropdownButtonDemo.vue +1 -1
  71. package/src/demo/DlLineChartDemo.vue +375 -0
  72. package/src/demo/DlMenuDemo.vue +1 -1
  73. package/src/demo/DlOptionGroupDemo.vue +1 -1
  74. package/src/demo/DlSelectDemo.vue +1 -1
  75. package/src/demo/DlSpinnerDemo.vue +20 -0
  76. package/src/demo/DlTableDemo.vue +13 -94
  77. package/src/demo/DlToastMessageDemo.vue +143 -0
  78. package/src/demo/DlWidgetDemo.vue +105 -143
  79. package/src/demo/index.ts +20 -2
  80. package/src/hooks/use-theme.ts +19 -0
  81. package/src/utils/abbreviate-to-string.ts +14 -0
  82. package/src/utils/colors.ts +47 -0
  83. package/src/utils/getRootStyles.ts +1 -1
  84. package/src/utils/index.ts +1 -0
  85. package/src/utils/position-engine.ts +11 -2
  86. package/src/utils/swapNodes.ts +30 -0
  87. package/src/utils/update-key.ts +90 -0
  88. package/tsconfig.json +0 -1
  89. package/vite.config.ts +17 -0
  90. package/Dockerfile +0 -12
  91. package/jest.config.js +0 -16
  92. package/jest.setup.js +0 -59
  93. package/src/components/DlWidget/DlWidgetGrid.vue +0 -360
  94. package/storybook.js +0 -8
@@ -0,0 +1,279 @@
1
+ <template>
2
+ <div
3
+ :style="labelStyles"
4
+ class="dl-chart-labels-container"
5
+ >
6
+ <div class="dl-chart-labels">
7
+ <div
8
+ v-for="(label, index) in labels"
9
+ :key="index"
10
+ class="dl-chart-labels--label"
11
+ >
12
+ <dl-tooltip v-if="isOverflowing[index]">
13
+ {{ stringVerification(label.title, label) }}
14
+ </dl-tooltip>
15
+ <dl-typography
16
+ v-if="isVue2"
17
+ ref="textRef"
18
+ :size="fontSize"
19
+ :data-index="index"
20
+ :color="labelColor"
21
+ >
22
+ {{ label.title || label }}
23
+ </dl-typography>
24
+ <dl-typography
25
+ v-else
26
+ :ref="(el) => forwardChildEl(el, 'textRef', index)"
27
+ :data-index="index"
28
+ :size="fontSize"
29
+ :color="labelColor"
30
+ >
31
+ {{ stringVerification(label.title, label) }}
32
+ </dl-typography>
33
+ </div>
34
+ </div>
35
+ <div
36
+ v-if="hasSubtitles"
37
+ class="dl-chart-labels"
38
+ >
39
+ <div
40
+ v-for="(label, index) in labels"
41
+ :key="index"
42
+ class="dl-chart-labels--label"
43
+ >
44
+ <dl-tooltip v-if="isOverFlowingSubtitles[index]">
45
+ {{ stringVerification(label.subtitle) }}
46
+ </dl-tooltip>
47
+ <dl-typography
48
+ v-if="isVue2"
49
+ ref="subtitleRef"
50
+ :size="fontSize"
51
+ :data-index="index"
52
+ color="dl-color-medium"
53
+ >
54
+ {{ stringVerification(label.subtitle) }}
55
+ </dl-typography>
56
+ <dl-typography
57
+ v-else
58
+ :ref="(el) => forwardChildEl(el, 'subtitleRef', index)"
59
+ :data-index="index"
60
+ :size="fontSize"
61
+ color="dl-color-medium"
62
+ >
63
+ {{ stringVerification(label.subtitle) }}
64
+ </dl-typography>
65
+ </div>
66
+ </div>
67
+ <div
68
+ v-if="title"
69
+ class="dl-chart-labels-title"
70
+ >
71
+ <dl-typography
72
+ :size="titleSize"
73
+ :color="titleColor"
74
+ >
75
+ {{ title }}
76
+ </dl-typography>
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <script lang="ts">
82
+ import { v4 } from 'uuid'
83
+ import { defineComponent, PropType, isVue2 } from 'vue-demi'
84
+ import { isEllipsisActive } from '../../utils/is-ellipsis-active'
85
+ import DlTypography from '../DlTypography.vue'
86
+ import DlTooltip from '../DlTooltip.vue'
87
+
88
+ type ObserverRefs = {
89
+ ref: 'resizeObserverTitle' | 'resizeObserverSubtitle'
90
+ elementRef: 'textRef' | 'subtitleRef'
91
+ state: 'isOverflowing' | 'isOverFlowingSubtitles'
92
+ }
93
+
94
+ const observerRefs = [
95
+ {
96
+ ref: 'resizeObserverTitle',
97
+ elementRef: 'textRef',
98
+ state: 'isOverflowing'
99
+ },
100
+ {
101
+ ref: 'resizeObserverSubtitle',
102
+ elementRef: 'subtitleRef',
103
+ state: 'isOverFlowingSubtitles'
104
+ }
105
+ ] as ObserverRefs[]
106
+
107
+ export default defineComponent({
108
+ name: 'DlChartLabels',
109
+ components: {
110
+ DlTooltip,
111
+ DlTypography
112
+ },
113
+ props: {
114
+ width: {
115
+ type: String,
116
+ default: '100%'
117
+ },
118
+ fontSize: {
119
+ type: String,
120
+ default: '12px'
121
+ },
122
+ title: {
123
+ type: String,
124
+ default: null
125
+ },
126
+ titleSize: {
127
+ type: String,
128
+ default: '12px'
129
+ },
130
+ titleColor: {
131
+ type: String,
132
+ default: '#000'
133
+ },
134
+ labelColor: {
135
+ type: String,
136
+ default: '#000'
137
+ },
138
+ labels: {
139
+ type: Array as PropType<
140
+ string[] | { title: string; subtitle: string }[]
141
+ >,
142
+ default: () =>
143
+ [] as unknown as
144
+ | string[]
145
+ | { title: string; subtitle: string }[]
146
+ }
147
+ },
148
+ data(): {
149
+ uuid: string
150
+ isOverflowing: boolean[]
151
+ isOverFlowingSubtitles: boolean[]
152
+ textRef: Element[]
153
+ subtitleRef: Element[]
154
+ resizeObserverTitle: ResizeObserver | null
155
+ resizeObserverSubtitle: ResizeObserver | null
156
+ } {
157
+ return {
158
+ uuid: `dl-chart-legent-${v4()}`,
159
+ isOverflowing: [],
160
+ isOverFlowingSubtitles: [],
161
+ textRef: [],
162
+ subtitleRef: [],
163
+ resizeObserverTitle: null,
164
+ resizeObserverSubtitle: null
165
+ }
166
+ },
167
+ computed: {
168
+ labelStyles(): Record<string, string> {
169
+ return {
170
+ '--dl-chart-labels-width': this.width
171
+ }
172
+ },
173
+ hasSubtitles(): boolean {
174
+ return this.labels.some(
175
+ (e: string | Record<string, string>) =>
176
+ typeof e === 'object' && !!e.subtitle
177
+ )
178
+ },
179
+ isVue2(): boolean {
180
+ return isVue2
181
+ }
182
+ },
183
+ mounted() {
184
+ observerRefs.forEach(({ ref, state }) => {
185
+ this[ref] = new ResizeObserver((entries) => {
186
+ const tempArr = [...this[state]]
187
+ this.getEllipsedElements(entries, tempArr)
188
+ this[state] = tempArr
189
+ })
190
+ })
191
+ observerRefs.forEach(({ elementRef, ref }) => {
192
+ const elements = isVue2
193
+ ? (((this.$refs[elementRef] as any[]) || []).map(
194
+ (ref: any) => ref.$el
195
+ ) as Element[])
196
+ : this[elementRef]
197
+ for (const el of elements as Element[]) {
198
+ (this[ref] as ResizeObserver).observe(el)
199
+ }
200
+ })
201
+ },
202
+ beforeUnmount() {
203
+ observerRefs.forEach(({ ref }) => {
204
+ (this[ref] as ResizeObserver).disconnect()
205
+ this[ref] = null
206
+ })
207
+ },
208
+ methods: {
209
+ stringVerification(value: string, fallback = '') {
210
+ return value || fallback
211
+ },
212
+ getEllipsedElements(elements: ResizeObserverEntry[], state: boolean[]) {
213
+ for (const entry of elements) {
214
+ const index = parseInt(
215
+ (entry.target as any).dataset.index ?? '0'
216
+ )
217
+ state[index] = isEllipsisActive(entry.target)
218
+ }
219
+ },
220
+ forwardChildEl(
221
+ el: { $el: Element },
222
+ refName: 'textRef' | 'subtitleRef',
223
+ index: number
224
+ ) {
225
+ if (el?.$el) {
226
+ (this[refName] as Element[])[index] = el.$el
227
+ }
228
+ }
229
+ }
230
+ })
231
+ </script>
232
+
233
+ <style scoped lang="scss">
234
+ .dl-chart-labels-container {
235
+ width: 100%;
236
+ display: flex;
237
+ flex-direction: column;
238
+
239
+ .dl-chart-labels-title {
240
+ width: 100%;
241
+ display: flex;
242
+ align-self: flex-end;
243
+ justify-content: center;
244
+ margin-top: 10px;
245
+ max-width: var(--dl-chart-labels-width);
246
+ }
247
+
248
+ .dl-chart-labels {
249
+ display: flex;
250
+ align-self: flex-end;
251
+ justify-content: space-between;
252
+ max-width: var(--dl-chart-labels-width);
253
+ width: 100%;
254
+
255
+ &--label {
256
+ display: flex;
257
+ width: 100%;
258
+ justify-content: center;
259
+ white-space: nowrap;
260
+ overflow: hidden;
261
+ text-overflow: ellipsis;
262
+ align-items: flex-start;
263
+
264
+ & > .dl-typography {
265
+ white-space: nowrap;
266
+ overflow: hidden;
267
+ text-overflow: ellipsis;
268
+ }
269
+
270
+ & > div,
271
+ .dl-typography {
272
+ white-space: nowrap;
273
+ overflow: hidden;
274
+ text-overflow: ellipsis;
275
+ }
276
+ }
277
+ }
278
+ }
279
+ </style>
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <div
3
+ :style="legendStyles"
4
+ class="dl-chart-legend"
5
+ >
6
+ <div
7
+ v-for="(item, index) in datasets"
8
+ :key="index"
9
+ class="dl-chart-legend--item"
10
+ :style="{
11
+ '--dl-chart-badge-color': getColor(
12
+ item.backgroundColor.replace('--', '')
13
+ )
14
+ }"
15
+ @click="hideData($event, item, index)"
16
+ @mouseenter="onMouseEnter(item, index)"
17
+ @mouseleave="onMouseLeave(item, index)"
18
+ >
19
+ <dl-badge
20
+ :color="
21
+ item.hidden
22
+ ? 'var(--dl-color-disabled)'
23
+ : getColor(item.backgroundColor.replace('--', ''))
24
+ "
25
+ />
26
+ <dl-typography
27
+ size="small"
28
+ :color="item.hidden ? 'dl-color-disabled' : 'dl-color-darker'"
29
+ >
30
+ {{ item.label }}
31
+ </dl-typography>
32
+ </div>
33
+ </div>
34
+ </template>
35
+
36
+ <script lang="ts">
37
+ import { defineComponent, PropType } from 'vue-demi'
38
+ import type { LegendItem, DatasetChartOptions } from 'chart.js'
39
+ import { getColor } from '../../utils'
40
+ import DlBadge from '../DlBadge.vue'
41
+ import DlTypography from '../DlTypography.vue'
42
+
43
+ const positions = {
44
+ left: 'flex-start',
45
+ right: 'flex-end',
46
+ center: 'center'
47
+ }
48
+
49
+ export default defineComponent({
50
+ name: 'DlChartLegend',
51
+ components: {
52
+ DlBadge,
53
+ DlTypography
54
+ },
55
+ props: {
56
+ width: {
57
+ type: String,
58
+ default: '100%'
59
+ },
60
+ datasets: {
61
+ type: Array,
62
+ default: () => [] as unknown as DatasetChartOptions
63
+ },
64
+ alignItems: {
65
+ type: String as PropType<'left' | 'right' | 'center'>,
66
+ default: 'center'
67
+ }
68
+ },
69
+ emits: ['hide', 'on-hover', 'on-leave'],
70
+ computed: {
71
+ legendStyles(): Record<string, string> {
72
+ return {
73
+ '--dl-chart-legend-width': this.width,
74
+ '--dl-chart-legend-position': positions[this.alignItems]
75
+ }
76
+ }
77
+ },
78
+ methods: {
79
+ onMouseEnter(item: LegendItem, index: number) {
80
+ if (!item.hidden) {
81
+ this.$emit('on-hover', item, index)
82
+ }
83
+ },
84
+ onMouseLeave(item: LegendItem, index: number) {
85
+ if (!item.hidden) {
86
+ this.$emit('on-leave', item, index)
87
+ }
88
+ },
89
+ hideData(event: Event, item: LegendItem, index: number) {
90
+ this.$emit(
91
+ 'hide',
92
+ {
93
+ ...item,
94
+ hidden: !item.hidden
95
+ },
96
+ index
97
+ )
98
+ },
99
+ getColor
100
+ }
101
+ })
102
+ </script>
103
+
104
+ <style scoped lang="scss">
105
+ .dl-chart-legend {
106
+ display: flex;
107
+ flex-wrap: wrap;
108
+ justify-content: var(--dl-chart-legend-position);
109
+ max-width: var(--dl-chart-legend-width);
110
+ width: 100%;
111
+ gap: 10px;
112
+
113
+ &--item {
114
+ display: flex;
115
+ gap: 5px;
116
+ align-items: center;
117
+ cursor: pointer;
118
+ user-select: none;
119
+
120
+ .dl-badge {
121
+ font-size: 8px;
122
+ line-height: 8px;
123
+ min-height: 8px;
124
+ }
125
+
126
+ .dl-typography--small:hover {
127
+ color: var(--dl-color-darker) !important;
128
+ }
129
+
130
+ &:hover {
131
+ .dl-badge {
132
+ background-color: var(--dl-chart-badge-color) !important;
133
+ }
134
+
135
+ .dl-typography--small {
136
+ color: var(--dl-color-darker) !important;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ </style>