@datametria/vue-components 2.2.0 → 2.3.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 (78) hide show
  1. package/README.md +25 -7
  2. package/dist/index.es.js +3378 -2148
  3. package/dist/index.umd.js +9 -9
  4. package/dist/src/components/DatametriaAutocomplete.vue.d.ts +14 -17
  5. package/dist/src/components/DatametriaBreadcrumb.vue.d.ts +39 -7
  6. package/dist/src/components/DatametriaCheckbox.vue.d.ts +35 -6
  7. package/dist/src/components/DatametriaCheckboxGroup.vue.d.ts +30 -0
  8. package/dist/src/components/DatametriaDataTable.vue.d.ts +64 -0
  9. package/dist/src/components/DatametriaDatePicker.vue.d.ts +15 -37
  10. package/dist/src/components/DatametriaDialog.vue.d.ts +71 -0
  11. package/dist/src/components/DatametriaEmpty.vue.d.ts +30 -0
  12. package/dist/src/components/DatametriaFloatingBar.vue.d.ts +2 -2
  13. package/dist/src/components/DatametriaForm.vue.d.ts +40 -0
  14. package/dist/src/components/DatametriaFormItem.vue.d.ts +28 -0
  15. package/dist/src/components/DatametriaGrid.vue.d.ts +1 -1
  16. package/dist/src/components/DatametriaInput.vue.d.ts +69 -10
  17. package/dist/src/components/DatametriaMenu.vue.d.ts +3 -3
  18. package/dist/src/components/DatametriaNavbar.vue.d.ts +2 -2
  19. package/dist/src/components/DatametriaPagination.vue.d.ts +29 -0
  20. package/dist/src/components/DatametriaPopconfirm.vue.d.ts +43 -0
  21. package/dist/src/components/DatametriaProgress.vue.d.ts +33 -8
  22. package/dist/src/components/DatametriaRadio.vue.d.ts +25 -6
  23. package/dist/src/components/DatametriaRadioGroup.vue.d.ts +29 -0
  24. package/dist/src/components/DatametriaResult.vue.d.ts +30 -0
  25. package/dist/src/components/DatametriaSelect.vue.d.ts +16 -11
  26. package/dist/src/components/DatametriaSidebar.vue.d.ts +3 -3
  27. package/dist/src/components/DatametriaSlider.vue.d.ts +3 -3
  28. package/dist/src/components/DatametriaSortableTable.vue.d.ts +1 -1
  29. package/dist/src/components/DatametriaSteps.vue.d.ts +45 -0
  30. package/dist/src/components/DatametriaSwitch.vue.d.ts +9 -4
  31. package/dist/src/components/DatametriaTabPane.vue.d.ts +28 -0
  32. package/dist/src/components/DatametriaTextarea.vue.d.ts +27 -8
  33. package/dist/src/components/DatametriaTimePicker.vue.d.ts +17 -25
  34. package/dist/src/components/DatametriaToast.vue.d.ts +1 -1
  35. package/dist/src/components/DatametriaTooltip.vue.d.ts +1 -1
  36. package/dist/src/components/DatametriaTree.vue.d.ts +31 -0
  37. package/dist/src/components/DatametriaTreeNode.vue.d.ts +17 -0
  38. package/dist/src/components/DatametriaUpload.vue.d.ts +64 -0
  39. package/dist/src/index.d.ts +14 -0
  40. package/dist/vue-components.css +1 -1
  41. package/package.json +4 -3
  42. package/src/components/DatametriaAutocomplete.vue +155 -260
  43. package/src/components/DatametriaBreadcrumb.vue +66 -80
  44. package/src/components/DatametriaCheckbox.vue +150 -37
  45. package/src/components/DatametriaCheckboxGroup.vue +43 -0
  46. package/src/components/DatametriaDataTable.vue +304 -0
  47. package/src/components/DatametriaDatePicker.vue +238 -614
  48. package/src/components/DatametriaDialog.vue +295 -0
  49. package/src/components/DatametriaDropdown.vue +352 -0
  50. package/src/components/DatametriaEmpty.vue +153 -0
  51. package/src/components/DatametriaForm.vue +160 -0
  52. package/src/components/DatametriaFormItem.vue +181 -0
  53. package/src/components/DatametriaInput.vue +226 -63
  54. package/src/components/DatametriaPagination.vue +373 -0
  55. package/src/components/DatametriaPopconfirm.vue +236 -0
  56. package/src/components/DatametriaProgress.vue +176 -63
  57. package/src/components/DatametriaRadio.vue +83 -72
  58. package/src/components/DatametriaRadioGroup.vue +42 -0
  59. package/src/components/DatametriaResult.vue +133 -0
  60. package/src/components/DatametriaSelect.vue +172 -67
  61. package/src/components/DatametriaSortableTable.vue +35 -4
  62. package/src/components/DatametriaSteps.vue +314 -0
  63. package/src/components/DatametriaSwitch.vue +86 -80
  64. package/src/components/DatametriaTabPane.vue +82 -0
  65. package/src/components/DatametriaTextarea.vue +140 -100
  66. package/src/components/DatametriaTimePicker.vue +231 -214
  67. package/src/components/DatametriaTree.vue +124 -0
  68. package/src/components/DatametriaTreeNode.vue +174 -0
  69. package/src/components/DatametriaUpload.vue +365 -0
  70. package/src/index.ts +25 -11
  71. package/src/components/__tests__/DatametriaAutocomplete.test.ts +0 -180
  72. package/src/components/__tests__/DatametriaBreadcrumb.test.ts +0 -75
  73. package/src/components/__tests__/DatametriaCheckbox.test.ts +0 -47
  74. package/src/components/__tests__/DatametriaDatePicker.test.ts +0 -234
  75. package/src/components/__tests__/DatametriaProgress.test.ts +0 -90
  76. package/src/components/__tests__/DatametriaRadio.test.ts +0 -77
  77. package/src/components/__tests__/DatametriaSwitch.test.ts +0 -64
  78. package/src/components/__tests__/DatametriaTextarea.test.ts +0 -66
@@ -0,0 +1,304 @@
1
+ <template>
2
+ <div class="datametria-datatable" :class="{ 'datametria-datatable--stripe': stripe, 'datametria-datatable--border': border }">
3
+ <div v-if="loading" class="datametria-datatable__loading">Carregando...</div>
4
+ <table class="datametria-datatable__table" :style="{ height }">
5
+ <thead class="datametria-datatable__header">
6
+ <tr>
7
+ <th v-if="selectable" class="datametria-datatable__cell datametria-datatable__cell--checkbox">
8
+ <input
9
+ v-if="multiple"
10
+ type="checkbox"
11
+ :checked="isAllSelected"
12
+ @change="toggleAll"
13
+ />
14
+ </th>
15
+ <th v-if="expandable" class="datametria-datatable__cell datametria-datatable__cell--expand"></th>
16
+ <th
17
+ v-for="column in columns"
18
+ :key="column.prop"
19
+ class="datametria-datatable__cell"
20
+ :class="{ 'datametria-datatable__cell--sortable': column.sortable }"
21
+ :style="{ width: column.width, minWidth: column.minWidth }"
22
+ @click="column.sortable && handleSort(column.prop)"
23
+ >
24
+ {{ column.label }}
25
+ <span v-if="column.sortable && sortBy === column.prop" class="datametria-datatable__sort-icon">
26
+ {{ sortOrder === 'asc' ? '↑' : '↓' }}
27
+ </span>
28
+ </th>
29
+ </tr>
30
+ </thead>
31
+ <tbody class="datametria-datatable__body">
32
+ <template v-for="(row, index) in displayData" :key="row[rowKey] || index">
33
+ <tr
34
+ class="datametria-datatable__row"
35
+ :class="{ 'datametria-datatable__row--selected': isSelected(row) }"
36
+ @click="handleRowClick(row)"
37
+ >
38
+ <td v-if="selectable" class="datametria-datatable__cell datametria-datatable__cell--checkbox">
39
+ <input
40
+ type="checkbox"
41
+ :checked="isSelected(row)"
42
+ @click.stop
43
+ @change="toggleSelection(row)"
44
+ />
45
+ </td>
46
+ <td v-if="expandable" class="datametria-datatable__cell datametria-datatable__cell--expand">
47
+ <button @click.stop="toggleExpand(row)">
48
+ {{ isExpanded(row) ? '−' : '+' }}
49
+ </button>
50
+ </td>
51
+ <td
52
+ v-for="column in columns"
53
+ :key="column.prop"
54
+ class="datametria-datatable__cell"
55
+ >
56
+ <slot :name="`cell-${column.prop}`" :row="row" :column="column">
57
+ {{ row[column.prop] }}
58
+ </slot>
59
+ </td>
60
+ </tr>
61
+ <tr v-if="expandable && isExpanded(row)" class="datametria-datatable__expand-row">
62
+ <td :colspan="totalColumns">
63
+ <slot name="expand" :row="row">
64
+ {{ row }}
65
+ </slot>
66
+ </td>
67
+ </tr>
68
+ </template>
69
+ </tbody>
70
+ </table>
71
+ </div>
72
+ </template>
73
+
74
+ <script setup lang="ts">
75
+ import { ref, computed } from 'vue'
76
+
77
+ interface Column {
78
+ prop: string
79
+ label: string
80
+ sortable?: boolean
81
+ width?: string
82
+ minWidth?: string
83
+ }
84
+
85
+ interface Props {
86
+ data: any[]
87
+ columns: Column[]
88
+ loading?: boolean
89
+ stripe?: boolean
90
+ border?: boolean
91
+ height?: string
92
+ rowKey?: string
93
+ selectable?: boolean
94
+ multiple?: boolean
95
+ expandable?: boolean
96
+ }
97
+
98
+ const props = withDefaults(defineProps<Props>(), {
99
+ data: () => [],
100
+ columns: () => [],
101
+ loading: false,
102
+ stripe: false,
103
+ border: false,
104
+ height: 'auto',
105
+ rowKey: 'id',
106
+ selectable: false,
107
+ multiple: false,
108
+ expandable: false
109
+ })
110
+
111
+ const emit = defineEmits<{
112
+ 'selection-change': [selection: any[]]
113
+ 'row-click': [row: any]
114
+ 'sort-change': [prop: string, order: 'asc' | 'desc']
115
+ }>()
116
+
117
+ const sortBy = ref<string>('')
118
+ const sortOrder = ref<'asc' | 'desc'>('asc')
119
+ const selectedRows = ref<any[]>([])
120
+ const expandedRows = ref<Set<any>>(new Set())
121
+
122
+ const totalColumns = computed(() => {
123
+ let count = props.columns.length
124
+ if (props.selectable) count++
125
+ if (props.expandable) count++
126
+ return count
127
+ })
128
+
129
+ const displayData = computed(() => {
130
+ let result = [...props.data]
131
+
132
+ if (sortBy.value) {
133
+ result.sort((a, b) => {
134
+ const aVal = a[sortBy.value]
135
+ const bVal = b[sortBy.value]
136
+
137
+ if (aVal === bVal) return 0
138
+
139
+ const comparison = aVal > bVal ? 1 : -1
140
+ return sortOrder.value === 'asc' ? comparison : -comparison
141
+ })
142
+ }
143
+
144
+ return result
145
+ })
146
+
147
+ const isAllSelected = computed(() => {
148
+ return props.data.length > 0 && selectedRows.value.length === props.data.length
149
+ })
150
+
151
+ const handleSort = (prop: string) => {
152
+ if (sortBy.value === prop) {
153
+ sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc'
154
+ } else {
155
+ sortBy.value = prop
156
+ sortOrder.value = 'asc'
157
+ }
158
+ emit('sort-change', prop, sortOrder.value)
159
+ }
160
+
161
+ const isSelected = (row: any): boolean => {
162
+ return selectedRows.value.some(r => r[props.rowKey] === row[props.rowKey])
163
+ }
164
+
165
+ const toggleSelection = (row: any) => {
166
+ const index = selectedRows.value.findIndex(r => r[props.rowKey] === row[props.rowKey])
167
+
168
+ if (index > -1) {
169
+ selectedRows.value.splice(index, 1)
170
+ } else {
171
+ if (props.multiple) {
172
+ selectedRows.value.push(row)
173
+ } else {
174
+ selectedRows.value = [row]
175
+ }
176
+ }
177
+
178
+ emit('selection-change', selectedRows.value)
179
+ }
180
+
181
+ const toggleAll = () => {
182
+ if (isAllSelected.value) {
183
+ selectedRows.value = []
184
+ } else {
185
+ selectedRows.value = [...props.data]
186
+ }
187
+ emit('selection-change', selectedRows.value)
188
+ }
189
+
190
+ const handleRowClick = (row: any) => {
191
+ emit('row-click', row)
192
+ }
193
+
194
+ const isExpanded = (row: any): boolean => {
195
+ return expandedRows.value.has(row[props.rowKey])
196
+ }
197
+
198
+ const toggleExpand = (row: any) => {
199
+ const key = row[props.rowKey]
200
+ if (expandedRows.value.has(key)) {
201
+ expandedRows.value.delete(key)
202
+ } else {
203
+ expandedRows.value.add(key)
204
+ }
205
+ }
206
+
207
+ defineExpose({
208
+ clearSelection: () => {
209
+ selectedRows.value = []
210
+ emit('selection-change', [])
211
+ },
212
+ toggleRowSelection: (row: any) => toggleSelection(row),
213
+ clearSort: () => {
214
+ sortBy.value = ''
215
+ sortOrder.value = 'asc'
216
+ }
217
+ })
218
+ </script>
219
+
220
+ <style scoped>
221
+ .datametria-datatable {
222
+ width: 100%;
223
+ overflow-x: auto;
224
+ }
225
+
226
+ .datametria-datatable__loading {
227
+ padding: 20px;
228
+ text-align: center;
229
+ color: var(--datametria-info-color, #909399);
230
+ }
231
+
232
+ .datametria-datatable__table {
233
+ width: 100%;
234
+ border-collapse: collapse;
235
+ font-size: 14px;
236
+ }
237
+
238
+ .datametria-datatable__header {
239
+ background-color: var(--datametria-bg-color-light, #fafafa);
240
+ }
241
+
242
+ .datametria-datatable__cell {
243
+ padding: 12px;
244
+ text-align: left;
245
+ color: var(--datametria-text-color, #303133);
246
+ }
247
+
248
+ .datametria-datatable__header .datametria-datatable__cell {
249
+ font-weight: 600;
250
+ border-bottom: 1px solid var(--datametria-border-color, #dcdfe6);
251
+ }
252
+
253
+ .datametria-datatable__cell--sortable {
254
+ cursor: pointer;
255
+ user-select: none;
256
+ }
257
+
258
+ .datametria-datatable__cell--sortable:hover {
259
+ background-color: var(--datametria-hover-bg-color, #f5f7fa);
260
+ }
261
+
262
+ .datametria-datatable__sort-icon {
263
+ margin-left: 4px;
264
+ color: var(--datametria-primary-color, #0072ce);
265
+ }
266
+
267
+ .datametria-datatable__cell--checkbox {
268
+ width: 40px;
269
+ text-align: center;
270
+ }
271
+
272
+ .datametria-datatable__cell--expand {
273
+ width: 40px;
274
+ text-align: center;
275
+ }
276
+
277
+ .datametria-datatable__row {
278
+ transition: background-color 0.2s;
279
+ }
280
+
281
+ .datametria-datatable__row:hover {
282
+ background-color: var(--datametria-hover-bg-color, #f5f7fa);
283
+ }
284
+
285
+ .datametria-datatable__row--selected {
286
+ background-color: var(--datametria-primary-light-color, #ecf5ff);
287
+ }
288
+
289
+ .datametria-datatable--stripe .datametria-datatable__row:nth-child(even) {
290
+ background-color: var(--datametria-bg-color-light, #fafafa);
291
+ }
292
+
293
+ .datametria-datatable--border .datametria-datatable__cell {
294
+ border: 1px solid var(--datametria-border-color, #dcdfe6);
295
+ }
296
+
297
+ .datametria-datatable__expand-row {
298
+ background-color: var(--datametria-bg-color-light, #fafafa);
299
+ }
300
+
301
+ .datametria-datatable__expand-row td {
302
+ padding: 20px;
303
+ }
304
+ </style>