@dataloop-ai/components 0.18.54 → 0.18.56

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.
@@ -24,7 +24,7 @@ import { getLinkTarget, getLinkRel } from './utils'
24
24
  export default defineComponent({
25
25
  name: 'DlLink',
26
26
  props: {
27
- href: { required: true, type: String },
27
+ href: { required: false, type: String, default: null },
28
28
  newtab: { required: false, default: false, type: Boolean },
29
29
  external: { required: false, default: false, type: Boolean },
30
30
  disabled: { required: false, default: false, type: Boolean },
@@ -37,6 +37,9 @@ export default defineComponent({
37
37
  },
38
38
  computed: {
39
39
  link(): string {
40
+ if (!this.href) {
41
+ return null
42
+ }
40
43
  return this.external
41
44
  ? `${this.href}`
42
45
  : `${window.origin}/${this.href}`
@@ -45,9 +48,15 @@ export default defineComponent({
45
48
  return this.color ?? 'dl-color-studio-secondary'
46
49
  },
47
50
  target(): string | null {
51
+ if (!this.href) {
52
+ return null
53
+ }
48
54
  return getLinkTarget(this.newtab)
49
55
  },
50
56
  rel(): string | null {
57
+ if (!this.href) {
58
+ return null
59
+ }
51
60
  return getLinkRel(this.external)
52
61
  }
53
62
  },
@@ -63,6 +72,7 @@ a {
63
72
 
64
73
  a:hover {
65
74
  text-decoration: underline;
75
+ cursor: pointer;
66
76
  }
67
77
 
68
78
  .disabled {
@@ -25,7 +25,7 @@
25
25
  flat
26
26
  @click="log"
27
27
  >
28
- Flat Primary
28
+ flat primary
29
29
  </DlButton>
30
30
  <DlButton
31
31
  color="secondary"
@@ -1,40 +1,321 @@
1
1
  <template>
2
- <div class="container">
3
- <dl-grid>
4
- <img
5
- v-for="(a, index) in 10"
6
- :key="index"
7
- class="grid-image"
8
- :src="getRandomImg()"
2
+ <div class="widgets-demo-wrapper">
3
+ <div>
4
+ <h3>Layout mode</h3>
5
+ <dl-button
6
+ class="select-layout__button"
7
+ style="width: 200px; margin-bottom: 20px"
8
+ @click="addWidget(layout)"
9
9
  >
10
- </dl-grid>
10
+ Add widget
11
+ </dl-button>
12
+ <dl-grid
13
+ :key="cmWidgets.length"
14
+ v-model="cmLayout"
15
+ :max-elements-per-row="cmMaxWidgetsPerRow"
16
+ :mode="layout"
17
+ >
18
+ <dl-widget
19
+ v-for="widget in cmWidgets"
20
+ :key="widget.id"
21
+ >
22
+ <template #header>
23
+ {{ widget.header }}
24
+ </template>
25
+ <template #content>
26
+ <dl-bar-chart
27
+ :data="data"
28
+ :items-in-view="6"
29
+ />
30
+ </template>
31
+ <template #menu>
32
+ <div class="menu-icons">
33
+ <dl-icon
34
+ size="m"
35
+ icon="icon-dl-edit"
36
+ />
37
+ <dl-icon
38
+ size="m"
39
+ icon="icon-dl-delete"
40
+ @click="deleteWidget(layout, widget.id)"
41
+ />
42
+ </div>
43
+ </template>
44
+ <template #description>
45
+ {{ widget.description }}
46
+ </template>
47
+ </dl-widget>
48
+ </dl-grid>
49
+ </div>
50
+ <div>
51
+ <h3>Grid mode</h3>
52
+ <dl-button
53
+ class="select-layout__button"
54
+ style="width: 200px; margin-bottom: 20px"
55
+ @click="addWidget(grid)"
56
+ >
57
+ Add widget
58
+ </dl-button>
59
+ <dl-grid
60
+ :key="dmWidgets.length"
61
+ v-model="dmLayout"
62
+ :max-elements-per-row="dmMaxWidgetsPerRow"
63
+ :mode="grid"
64
+ >
65
+ <dl-widget
66
+ v-for="widget in dmWidgets"
67
+ :key="widget.id"
68
+ >
69
+ <template #header>
70
+ {{ widget.header }}
71
+ </template>
72
+ <template #content>
73
+ <dl-bar-chart
74
+ :data="data"
75
+ :items-in-view="6"
76
+ />
77
+ </template>
78
+ <template #menu>
79
+ <div class="menu-icons">
80
+ <dl-icon
81
+ size="m"
82
+ icon="icon-dl-edit"
83
+ />
84
+ <dl-icon
85
+ size="m"
86
+ icon="icon-dl-delete"
87
+ @click="deleteWidget(grid, widget.id)"
88
+ />
89
+ </div>
90
+ </template>
91
+ <template #description>
92
+ {{ widget.description }}
93
+ </template>
94
+ </dl-widget>
95
+ </dl-grid>
96
+ </div>
97
+ <div>
98
+ <h3>Flex mode</h3>
99
+ <dl-button
100
+ class="select-layout__button"
101
+ style="width: 200px; margin-bottom: 20px"
102
+ @click="addWidget(flex)"
103
+ >
104
+ Add widget
105
+ </dl-button>
106
+ <dl-grid
107
+ :key="fmWidgets.length"
108
+ :mode="flex"
109
+ >
110
+ <dl-widget
111
+ v-for="widget in fmWidgets"
112
+ :key="widget.id"
113
+ :draggable="false"
114
+ style="max-width: 15vw"
115
+ >
116
+ <template #header>
117
+ {{ widget.header }}
118
+ </template>
119
+ <template #content>
120
+ <dl-bar-chart
121
+ :data="data"
122
+ :items-in-view="6"
123
+ />
124
+ </template>
125
+ <template #menu>
126
+ <div class="menu-icons">
127
+ <dl-icon
128
+ size="m"
129
+ icon="icon-dl-edit"
130
+ />
131
+ <dl-icon
132
+ size="m"
133
+ icon="icon-dl-delete"
134
+ @click="deleteWidget(flex, widget.id)"
135
+ />
136
+ </div>
137
+ </template>
138
+ <template #description>
139
+ {{ widget.description }}
140
+ </template>
141
+ </dl-widget>
142
+ </dl-grid>
143
+ </div>
11
144
  </div>
12
145
  </template>
13
146
 
14
147
  <script lang="ts">
15
- import { defineComponent } from 'vue-demi'
16
- import { DlGrid } from '../components/'
17
-
18
- const getRandomImg = () => {
19
- const random = Math.floor(Math.random() * 3) + 1
20
- const link = `https://picsum.photos/${random * 100}/${
21
- random * 100
22
- }?random=${random}`
23
- return link
148
+ import { defineComponent, Ref, ref } from 'vue-demi'
149
+ import { DlWidget, DlGrid, DlBarChart, DlIcon, DlButton } from '../components'
150
+ import { DlGridMode } from '../types'
151
+
152
+ const data = {
153
+ labels: Array.from({ length: 20 }, (_, i) => `${i}`),
154
+ datasets: [
155
+ {
156
+ label: 'Data One',
157
+ backgroundColor: '--dl-color-secondary',
158
+ borderRadius: 4,
159
+ data: Array.from({ length: 20 }, (_, i) => i + 1)
160
+ },
161
+ {
162
+ label: 'Data Two',
163
+ backgroundColor: '--dl-color-warning',
164
+ borderRadius: 4,
165
+ data: Array.from({ length: 20 }, (_, i) => i + 1)
166
+ }
167
+ ]
24
168
  }
169
+
25
170
  export default defineComponent({
26
171
  components: {
27
- DlGrid
172
+ DlGrid,
173
+ DlWidget,
174
+ DlBarChart,
175
+ DlIcon,
176
+ DlButton
28
177
  },
29
178
  setup() {
30
- return { getRandomImg }
179
+ const cmLayout: Ref<string[][]> = ref([
180
+ ['a', 'b', 'c'],
181
+ ['d', 'e']
182
+ ])
183
+ const dmLayout: Ref<string[][]> = ref([
184
+ ['a', 'b', 'c'],
185
+ ['d', 'e']
186
+ ])
187
+ const fmLayout: Ref<string[][]> = ref([
188
+ ['a', 'b', 'c'],
189
+ ['d', 'e', 'f']
190
+ ])
191
+
192
+ const cmMaxWidgetsPerRow = ref(3)
193
+ const dmMaxWidgetsPerRow = ref(3)
194
+ const fmMaxWidgetsPerRow = ref(3)
195
+
196
+ const cmWidgets = ref([])
197
+ const dmWidgets = ref([])
198
+ const fmWidgets = ref([])
199
+
200
+ const createRandomWidgets = (
201
+ layout: Ref<string[][]>,
202
+ widgets: Ref<any[]>,
203
+ numOfWidgets: number
204
+ ) => {
205
+ for (let i = 0; i < numOfWidgets; i++) {
206
+ widgets.value.push({
207
+ id: layout.value.flat()[i],
208
+ header: `Widget ${i}`,
209
+ description: `I'm description`
210
+ })
211
+ }
212
+ }
213
+ createRandomWidgets(cmLayout, cmWidgets, cmLayout.value.flat().length)
214
+ createRandomWidgets(dmLayout, dmWidgets, dmLayout.value.flat().length)
215
+ createRandomWidgets(fmLayout, fmWidgets, fmLayout.value.flat().length)
216
+
217
+ const deleteWidget = (mode: string, id: string) => {
218
+ const { widgets, layout, widgetsPerRow } = modeScope(mode)
219
+ widgets.value = widgets.value.filter((widget) => widget.id !== id)
220
+ layout.value = buildNewLayout(widgets.value, widgetsPerRow)
221
+ }
222
+
223
+ const addWidget = (mode: string) => {
224
+ const { widgets, layout, widgetsPerRow } = modeScope(mode)
225
+ widgets.value.push({
226
+ id: (widgets.value.length + 1).toString(),
227
+ header: `Widget ${widgets.value.length}`,
228
+ description: `I'm description`
229
+ })
230
+ layout.value = buildNewLayout(widgets.value, widgetsPerRow)
231
+ }
232
+
233
+ const modeScope = (mode: string) => {
234
+ let widgets
235
+ let layout
236
+ let widgetsPerRow
237
+ switch (mode) {
238
+ case DlGridMode.LAYOUT:
239
+ widgets = cmWidgets
240
+ layout = cmLayout
241
+ widgetsPerRow = cmMaxWidgetsPerRow.value
242
+ break
243
+ case DlGridMode.GRID:
244
+ widgets = dmWidgets
245
+ layout = dmLayout
246
+ widgetsPerRow = dmMaxWidgetsPerRow.value
247
+ break
248
+ case DlGridMode.FLEX:
249
+ widgets = fmWidgets
250
+ layout = fmLayout
251
+ widgetsPerRow = fmMaxWidgetsPerRow.value
252
+ break
253
+ }
254
+ return { widgets, layout, widgetsPerRow }
255
+ }
256
+
257
+ const buildNewLayout = (widgets: any[], widgetsPerRow: number) => {
258
+ const template: string[][] = []
259
+ let index = 0
260
+
261
+ while (index < widgets.length) {
262
+ const row = widgets.slice(index, index + widgetsPerRow)
263
+ template.push(row.map((w) => w.id))
264
+ index += widgetsPerRow
265
+ }
266
+ return template
267
+ }
268
+
269
+ return {
270
+ data,
271
+ deleteWidget,
272
+ addWidget,
273
+ cmLayout,
274
+ cmWidgets,
275
+ cmMaxWidgetsPerRow,
276
+ fmLayout,
277
+ fmWidgets,
278
+ fmMaxWidgetsPerRow,
279
+ dmLayout,
280
+ dmWidgets,
281
+ dmMaxWidgetsPerRow,
282
+ layout: DlGridMode.LAYOUT,
283
+ flex: DlGridMode.FLEX,
284
+ grid: DlGridMode.GRID
285
+ }
31
286
  }
32
287
  })
33
288
  </script>
34
289
 
35
290
  <style lang="scss" scoped>
36
- .grid-image {
37
- border: 2px solid var(--dl-color-darker);
38
- margin: 5px;
291
+ .widgets-demo-wrapper {
292
+ display: flex;
293
+ flex-direction: column;
294
+ align-items: center;
295
+ justify-content: center;
296
+ gap: 20px;
297
+
298
+ & > * {
299
+ display: flex;
300
+ flex-direction: column;
301
+ gap: 10px;
302
+ border: 1px solid var(--dl-color-separator);
303
+ padding: 10px;
304
+ }
305
+ }
306
+ .widgets-per-row {
307
+ &__input {
308
+ padding: 5px;
309
+ border-radius: 5px;
310
+ width: 50px;
311
+ }
312
+ }
313
+ .menu-icons {
314
+ display: flex;
315
+ align-items: center;
316
+ & > * {
317
+ cursor: pointer;
318
+ margin: 0px 5px;
319
+ }
39
320
  }
40
321
  </style>