@alaarab/ogrid-vue-vuetify 2.0.9 → 2.0.11
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.
- package/dist/esm/ColumnHeaderFilter/ColumnHeaderFilter.js +17 -7
- package/dist/esm/ColumnHeaderMenu/ColumnHeaderMenu.js +56 -32
- package/dist/esm/DataGridTable/DataGridTable.css +51 -0
- package/dist/esm/DataGridTable/DataGridTable.js +29 -10
- package/dist/types/ColumnHeaderMenu/ColumnHeaderMenu.d.ts +76 -1
- package/dist/types/DataGridTable/DataGridTable.d.ts +1 -0
- package/package.json +7 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent, h } from 'vue';
|
|
2
|
-
import { VBtn, VIcon, VMenu, VTooltip } from 'vuetify/components';
|
|
2
|
+
import { VBtn, VIcon, VMenu, VTooltip, VCard } from 'vuetify/components';
|
|
3
3
|
import { useColumnHeaderFilterState, } from '@alaarab/ogrid-vue';
|
|
4
4
|
import { TextFilterPopover } from './TextFilterPopover';
|
|
5
5
|
import { MultiSelectFilterPopover } from './MultiSelectFilterPopover';
|
|
@@ -9,6 +9,7 @@ const _VBtn = VBtn;
|
|
|
9
9
|
const _VIcon = VIcon;
|
|
10
10
|
const _VMenu = VMenu;
|
|
11
11
|
const _VTooltip = VTooltip;
|
|
12
|
+
const _VCard = VCard;
|
|
12
13
|
export const ColumnHeaderFilter = defineComponent({
|
|
13
14
|
name: 'ColumnHeaderFilter',
|
|
14
15
|
props: {
|
|
@@ -145,11 +146,14 @@ export const ColumnHeaderFilter = defineComponent({
|
|
|
145
146
|
h(_VBtn, {
|
|
146
147
|
icon: true,
|
|
147
148
|
size: 'x-small',
|
|
148
|
-
variant: 'text',
|
|
149
|
-
color: props.isSorted ? 'primary' :
|
|
149
|
+
variant: props.isSorted ? 'tonal' : 'text',
|
|
150
|
+
color: props.isSorted ? 'primary' : 'default',
|
|
150
151
|
'aria-label': `Sort by ${props.columnName}`,
|
|
151
152
|
title: props.isSorted ? (props.isSortedDescending ? 'Sorted descending' : 'Sorted ascending') : 'Sort',
|
|
152
153
|
onClick: state.handlers.handleSortClick,
|
|
154
|
+
style: {
|
|
155
|
+
opacity: props.isSorted ? '1' : '0.7',
|
|
156
|
+
},
|
|
153
157
|
}, () => h(_VIcon, { size: '16' }, () => props.isSorted
|
|
154
158
|
? (props.isSortedDescending ? 'mdi-arrow-down' : 'mdi-arrow-up')
|
|
155
159
|
: 'mdi-swap-vertical')),
|
|
@@ -167,10 +171,13 @@ export const ColumnHeaderFilter = defineComponent({
|
|
|
167
171
|
...menuProps,
|
|
168
172
|
icon: true,
|
|
169
173
|
size: 'x-small',
|
|
170
|
-
variant: 'text',
|
|
171
|
-
color: state.hasActiveFilter.value || state.isFilterOpen.value ? 'primary' :
|
|
174
|
+
variant: (state.hasActiveFilter.value || state.isFilterOpen.value) ? 'tonal' : 'text',
|
|
175
|
+
color: (state.hasActiveFilter.value || state.isFilterOpen.value) ? 'primary' : 'default',
|
|
172
176
|
'aria-label': `Filter ${props.columnName}`,
|
|
173
177
|
title: `Filter ${props.columnName}`,
|
|
178
|
+
style: {
|
|
179
|
+
opacity: (state.hasActiveFilter.value || state.isFilterOpen.value) ? '1' : '0.7',
|
|
180
|
+
},
|
|
174
181
|
}, () => h(_VIcon, { size: '16' }, () => 'mdi-filter-variant')),
|
|
175
182
|
...(state.hasActiveFilter.value ? [
|
|
176
183
|
h('div', {
|
|
@@ -182,20 +189,23 @@ export const ColumnHeaderFilter = defineComponent({
|
|
|
182
189
|
height: '6px',
|
|
183
190
|
borderRadius: '50%',
|
|
184
191
|
backgroundColor: 'rgb(var(--v-theme-primary))',
|
|
192
|
+
zIndex: '1',
|
|
185
193
|
},
|
|
186
194
|
}),
|
|
187
195
|
] : []),
|
|
188
196
|
]),
|
|
189
|
-
default: () => h(
|
|
197
|
+
default: () => h(_VCard, {
|
|
198
|
+
elevation: 8,
|
|
190
199
|
ref: (el) => { state.popoverRef.value = el; },
|
|
191
200
|
onClick: (e) => e.stopPropagation(),
|
|
192
|
-
}, [
|
|
201
|
+
}, () => [
|
|
193
202
|
h('div', {
|
|
194
203
|
style: {
|
|
195
204
|
borderBottom: '1px solid rgba(0,0,0,0.12)',
|
|
196
205
|
padding: '8px 12px',
|
|
197
206
|
fontWeight: '600',
|
|
198
207
|
fontSize: '0.875rem',
|
|
208
|
+
backgroundColor: '#fff',
|
|
199
209
|
},
|
|
200
210
|
}, `Filter: ${props.columnName}`),
|
|
201
211
|
renderPopoverContent(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineComponent, h } from 'vue';
|
|
2
|
-
import { VMenu, VList, VListItem } from 'vuetify/components';
|
|
3
|
-
import {
|
|
1
|
+
import { defineComponent, h, computed } from 'vue';
|
|
2
|
+
import { VMenu, VList, VListItem, VDivider } from 'vuetify/components';
|
|
3
|
+
import { getColumnHeaderMenuItems } from '@alaarab/ogrid-vue';
|
|
4
4
|
export const ColumnHeaderMenu = defineComponent({
|
|
5
5
|
name: 'ColumnHeaderMenu',
|
|
6
6
|
props: {
|
|
@@ -10,9 +10,17 @@ export const ColumnHeaderMenu = defineComponent({
|
|
|
10
10
|
onPinLeft: { type: Function, required: true },
|
|
11
11
|
onPinRight: { type: Function, required: true },
|
|
12
12
|
onUnpin: { type: Function, required: true },
|
|
13
|
+
onSortAsc: { type: Function, required: true },
|
|
14
|
+
onSortDesc: { type: Function, required: true },
|
|
15
|
+
onClearSort: { type: Function, required: true },
|
|
16
|
+
onAutosizeThis: { type: Function, required: true },
|
|
17
|
+
onAutosizeAll: { type: Function, required: true },
|
|
13
18
|
canPinLeft: { type: Boolean, required: true },
|
|
14
19
|
canPinRight: { type: Boolean, required: true },
|
|
15
20
|
canUnpin: { type: Boolean, required: true },
|
|
21
|
+
currentSort: { type: String, default: null },
|
|
22
|
+
isSortable: { type: Boolean, default: true },
|
|
23
|
+
isResizable: { type: Boolean, default: true },
|
|
16
24
|
},
|
|
17
25
|
setup(props) {
|
|
18
26
|
const handleOpenChange = (open) => {
|
|
@@ -20,36 +28,52 @@ export const ColumnHeaderMenu = defineComponent({
|
|
|
20
28
|
props.onClose();
|
|
21
29
|
}
|
|
22
30
|
};
|
|
23
|
-
const items =
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
const items = computed(() => getColumnHeaderMenuItems({
|
|
32
|
+
canPinLeft: props.canPinLeft,
|
|
33
|
+
canPinRight: props.canPinRight,
|
|
34
|
+
canUnpin: props.canUnpin,
|
|
35
|
+
currentSort: props.currentSort,
|
|
36
|
+
isSortable: props.isSortable,
|
|
37
|
+
isResizable: props.isResizable,
|
|
38
|
+
}));
|
|
39
|
+
const handlers = {
|
|
40
|
+
pinLeft: props.onPinLeft,
|
|
41
|
+
pinRight: props.onPinRight,
|
|
42
|
+
unpin: props.onUnpin,
|
|
43
|
+
sortAsc: props.onSortAsc,
|
|
44
|
+
sortDesc: props.onSortDesc,
|
|
45
|
+
clearSort: props.onClearSort,
|
|
46
|
+
autosizeThis: props.onAutosizeThis,
|
|
47
|
+
autosizeAll: props.onAutosizeAll,
|
|
32
48
|
};
|
|
33
|
-
const getHandler = (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
const getHandler = (itemId) => handlers[itemId] || (() => { });
|
|
50
|
+
return () => {
|
|
51
|
+
// If no anchor element or menu is closed, don't render
|
|
52
|
+
if (!props.anchorElement)
|
|
53
|
+
return null;
|
|
54
|
+
return h(VMenu, {
|
|
55
|
+
modelValue: props.isOpen,
|
|
56
|
+
'onUpdate:modelValue': handleOpenChange,
|
|
57
|
+
location: 'bottom start',
|
|
58
|
+
// Use target prop instead of activator for programmatic positioning
|
|
59
|
+
target: props.anchorElement,
|
|
60
|
+
}, {
|
|
61
|
+
default: () => h(VList, { density: 'compact', 'aria-label': 'Column options' }, () => {
|
|
62
|
+
const children = [];
|
|
63
|
+
items.value.forEach((item, index) => {
|
|
64
|
+
// Add divider before item if needed (but not at the start)
|
|
65
|
+
if (item.divider && index > 0) {
|
|
66
|
+
children.push(h(VDivider, { key: `divider-${item.id}` }));
|
|
67
|
+
}
|
|
68
|
+
children.push(h(VListItem, {
|
|
69
|
+
key: item.id,
|
|
70
|
+
disabled: item.disabled,
|
|
71
|
+
onClick: () => { getHandler(item.id)(); },
|
|
72
|
+
}, () => item.label));
|
|
73
|
+
});
|
|
74
|
+
return children;
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
41
77
|
};
|
|
42
|
-
return () => h(VMenu, {
|
|
43
|
-
modelValue: props.isOpen,
|
|
44
|
-
'onUpdate:modelValue': handleOpenChange,
|
|
45
|
-
activator: props.anchorElement || undefined,
|
|
46
|
-
location: 'bottom start',
|
|
47
|
-
}, {
|
|
48
|
-
default: () => h(VList, { density: 'compact', 'aria-label': 'Column options' }, () => items.map((item, index) => h(VListItem, {
|
|
49
|
-
key: item.id,
|
|
50
|
-
disabled: getDisabled(index),
|
|
51
|
-
onClick: () => { getHandler(index)(); },
|
|
52
|
-
}, () => item.label))),
|
|
53
|
-
});
|
|
54
78
|
},
|
|
55
79
|
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* OGrid Vue Vuetify – DataGridTable styles */
|
|
2
|
+
|
|
3
|
+
/* Remove focus outline from scrollable wrapper (keyboard nav is handled via cell outlines) */
|
|
4
|
+
[role="region"][tabindex="0"] {
|
|
5
|
+
outline: none !important;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Cell selection highlighting - matches React implementation */
|
|
9
|
+
.ogrid-cell-in-range {
|
|
10
|
+
background: var(--ogrid-bg-range, rgba(33, 115, 70, 0.12)) !important;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Cut range highlighting */
|
|
14
|
+
.ogrid-cell-cut {
|
|
15
|
+
background: var(--ogrid-bg-hover, rgba(0, 0, 0, 0.04)) !important;
|
|
16
|
+
opacity: 0.7;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Drag-range highlight applied via DOM attributes during drag (bypasses Vue for performance) */
|
|
20
|
+
[data-drag-range] {
|
|
21
|
+
background: var(--ogrid-bg-range, rgba(33, 115, 70, 0.12)) !important;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Anchor cell during drag: white/transparent background (like Excel) */
|
|
25
|
+
[data-drag-anchor] {
|
|
26
|
+
background: var(--ogrid-bg, #fff) !important;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Accessibility: Focus visible styles */
|
|
30
|
+
.v-table th:focus-visible,
|
|
31
|
+
.v-table td:focus-visible {
|
|
32
|
+
outline: 2px solid rgb(var(--v-theme-primary));
|
|
33
|
+
outline-offset: -2px;
|
|
34
|
+
z-index: 11;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.v-btn:focus-visible {
|
|
38
|
+
outline: 2px solid rgb(var(--v-theme-primary));
|
|
39
|
+
outline-offset: 2px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.v-checkbox:focus-visible {
|
|
43
|
+
outline: 2px solid rgb(var(--v-theme-primary));
|
|
44
|
+
outline-offset: 2px;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.ogrid-cell-content:focus-visible {
|
|
48
|
+
outline: 2px solid rgb(var(--v-theme-primary));
|
|
49
|
+
outline-offset: -2px;
|
|
50
|
+
z-index: 3;
|
|
51
|
+
}
|
|
@@ -5,6 +5,7 @@ import { ColumnHeaderFilter } from '../ColumnHeaderFilter';
|
|
|
5
5
|
import { ColumnHeaderMenu } from '../ColumnHeaderMenu/ColumnHeaderMenu';
|
|
6
6
|
import { InlineCellEditor } from './InlineCellEditor';
|
|
7
7
|
import { GridContextMenu } from './GridContextMenu';
|
|
8
|
+
import './DataGridTable.css';
|
|
8
9
|
const NOOP = () => { };
|
|
9
10
|
export const DataGridTable = defineComponent({
|
|
10
11
|
name: 'DataGridTable',
|
|
@@ -147,18 +148,20 @@ export const DataGridTable = defineComponent({
|
|
|
147
148
|
cellInlineStyle.position = 'relative';
|
|
148
149
|
cellInlineStyle.overflow = 'visible';
|
|
149
150
|
}
|
|
151
|
+
// Apply range/cut highlighting via CSS classes + data attributes for proper precedence
|
|
152
|
+
let highlightClass = '';
|
|
150
153
|
if (descriptor.isInRange) {
|
|
151
|
-
|
|
154
|
+
highlightClass = 'ogrid-cell-in-range';
|
|
152
155
|
}
|
|
153
156
|
if (descriptor.isInCutRange) {
|
|
154
|
-
|
|
155
|
-
cellInlineStyle.opacity = '0.7';
|
|
157
|
+
highlightClass = 'ogrid-cell-cut';
|
|
156
158
|
}
|
|
157
159
|
const styledContent = cellStyle
|
|
158
160
|
? h('span', { style: cellStyle }, content)
|
|
159
161
|
: content;
|
|
160
162
|
return h('div', {
|
|
161
163
|
...interactionProps,
|
|
164
|
+
class: highlightClass || undefined,
|
|
162
165
|
style: cellInlineStyle,
|
|
163
166
|
}, [
|
|
164
167
|
styledContent,
|
|
@@ -183,6 +186,13 @@ export const DataGridTable = defineComponent({
|
|
|
183
186
|
] : []),
|
|
184
187
|
]);
|
|
185
188
|
};
|
|
189
|
+
// Compute pinning offsets
|
|
190
|
+
const columnWidthsMap = {};
|
|
191
|
+
visibleCols.forEach((col) => {
|
|
192
|
+
columnWidthsMap[col.columnId] = getColumnWidth(col);
|
|
193
|
+
});
|
|
194
|
+
const leftOffsets = pinning.computeLeftOffsets(visibleCols, columnWidthsMap, DEFAULT_MIN_COLUMN_WIDTH, hasCheckboxCol, CHECKBOX_COLUMN_WIDTH);
|
|
195
|
+
const rightOffsets = pinning.computeRightOffsets(visibleCols, columnWidthsMap, DEFAULT_MIN_COLUMN_WIDTH);
|
|
186
196
|
// Build column layouts
|
|
187
197
|
const columnLayouts = visibleCols.map((col, colIdx) => {
|
|
188
198
|
const isFreezeCol = freezeCols != null && freezeCols >= 1 && colIdx < freezeCols;
|
|
@@ -196,14 +206,14 @@ export const DataGridTable = defineComponent({
|
|
|
196
206
|
};
|
|
197
207
|
if (isPinnedLeft || (isFreezeCol && colIdx === 0)) {
|
|
198
208
|
tdStyle.position = 'sticky';
|
|
199
|
-
tdStyle.left =
|
|
209
|
+
tdStyle.left = `${leftOffsets[col.columnId] ?? 0}px`;
|
|
200
210
|
tdStyle.zIndex = '6';
|
|
201
211
|
tdStyle.backgroundColor = '#fff';
|
|
202
212
|
tdStyle.willChange = 'transform';
|
|
203
213
|
}
|
|
204
214
|
else if (isPinnedRight) {
|
|
205
215
|
tdStyle.position = 'sticky';
|
|
206
|
-
tdStyle.right =
|
|
216
|
+
tdStyle.right = `${rightOffsets[col.columnId] ?? 0}px`;
|
|
207
217
|
tdStyle.zIndex = '6';
|
|
208
218
|
tdStyle.backgroundColor = '#fff';
|
|
209
219
|
tdStyle.willChange = 'transform';
|
|
@@ -215,12 +225,14 @@ export const DataGridTable = defineComponent({
|
|
|
215
225
|
const isFreezeCol = freezeCols != null && freezeCols >= 1 && colIdx < freezeCols;
|
|
216
226
|
const isPinnedLeft = col.pinned === 'left';
|
|
217
227
|
const isPinnedRight = col.pinned === 'right';
|
|
218
|
-
const base = { fontWeight: '600', position: '
|
|
228
|
+
const base = { fontWeight: '600', position: 'sticky', top: '0', backgroundColor: 'rgba(0,0,0,0.04)', zIndex: '8' };
|
|
219
229
|
if (isPinnedLeft || (isFreezeCol && colIdx === 0)) {
|
|
220
|
-
|
|
230
|
+
const leftOffset = leftOffsets[col.columnId] ?? 0;
|
|
231
|
+
return { ...base, position: 'sticky', left: `${leftOffset}px`, top: '0', zIndex: '10', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
|
|
221
232
|
}
|
|
222
233
|
if (isPinnedRight) {
|
|
223
|
-
|
|
234
|
+
const rightOffset = rightOffsets[col.columnId] ?? 0;
|
|
235
|
+
return { ...base, position: 'sticky', right: `${rightOffset}px`, top: '0', zIndex: '10', backgroundColor: 'rgba(0,0,0,0.04)', willChange: 'transform' };
|
|
224
236
|
}
|
|
225
237
|
return base;
|
|
226
238
|
};
|
|
@@ -278,7 +290,6 @@ export const DataGridTable = defineComponent({
|
|
|
278
290
|
style: {
|
|
279
291
|
width: '100%',
|
|
280
292
|
borderCollapse: 'collapse',
|
|
281
|
-
overflow: 'hidden',
|
|
282
293
|
minWidth: `${minTableWidth}px`,
|
|
283
294
|
fontSize: '0.875rem',
|
|
284
295
|
},
|
|
@@ -286,7 +297,7 @@ export const DataGridTable = defineComponent({
|
|
|
286
297
|
'data-freeze-cols': freezeCols != null && freezeCols >= 1 ? freezeCols : undefined,
|
|
287
298
|
}, [
|
|
288
299
|
// Header
|
|
289
|
-
h('thead', { style: {
|
|
300
|
+
h('thead', { style: { zIndex: '8', backgroundColor: 'rgba(0,0,0,0.04)' } }, headerRows.map((row, rowIdx) => h('tr', { key: rowIdx, style: { backgroundColor: 'rgba(0,0,0,0.04)' } }, [
|
|
290
301
|
// Checkbox header cell (last leaf row only)
|
|
291
302
|
...(rowIdx === headerRows.length - 1 && hasCheckboxCol ? [
|
|
292
303
|
h('th', {
|
|
@@ -539,9 +550,17 @@ export const DataGridTable = defineComponent({
|
|
|
539
550
|
onPinLeft: headerMenu.handlePinLeft,
|
|
540
551
|
onPinRight: headerMenu.handlePinRight,
|
|
541
552
|
onUnpin: headerMenu.handleUnpin,
|
|
553
|
+
onSortAsc: headerMenu.handleSortAsc,
|
|
554
|
+
onSortDesc: headerMenu.handleSortDesc,
|
|
555
|
+
onClearSort: headerMenu.handleClearSort,
|
|
556
|
+
onAutosizeThis: headerMenu.handleAutosizeThis,
|
|
557
|
+
onAutosizeAll: headerMenu.handleAutosizeAll,
|
|
542
558
|
canPinLeft: headerMenu.canPinLeft,
|
|
543
559
|
canPinRight: headerMenu.canPinRight,
|
|
544
560
|
canUnpin: headerMenu.canUnpin,
|
|
561
|
+
currentSort: headerMenu.currentSort,
|
|
562
|
+
isSortable: headerMenu.isSortable,
|
|
563
|
+
isResizable: headerMenu.isResizable,
|
|
545
564
|
}),
|
|
546
565
|
// Status bar
|
|
547
566
|
...(statusBarConfig ? [
|
|
@@ -6,9 +6,17 @@ export interface ColumnHeaderMenuProps {
|
|
|
6
6
|
onPinLeft: () => void;
|
|
7
7
|
onPinRight: () => void;
|
|
8
8
|
onUnpin: () => void;
|
|
9
|
+
onSortAsc: () => void;
|
|
10
|
+
onSortDesc: () => void;
|
|
11
|
+
onClearSort: () => void;
|
|
12
|
+
onAutosizeThis: () => void;
|
|
13
|
+
onAutosizeAll: () => void;
|
|
9
14
|
canPinLeft: boolean;
|
|
10
15
|
canPinRight: boolean;
|
|
11
16
|
canUnpin: boolean;
|
|
17
|
+
currentSort: 'asc' | 'desc' | null;
|
|
18
|
+
isSortable: boolean;
|
|
19
|
+
isResizable: boolean;
|
|
12
20
|
}
|
|
13
21
|
export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
14
22
|
isOpen: {
|
|
@@ -35,6 +43,26 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
|
|
|
35
43
|
type: PropType<() => void>;
|
|
36
44
|
required: true;
|
|
37
45
|
};
|
|
46
|
+
onSortAsc: {
|
|
47
|
+
type: PropType<() => void>;
|
|
48
|
+
required: true;
|
|
49
|
+
};
|
|
50
|
+
onSortDesc: {
|
|
51
|
+
type: PropType<() => void>;
|
|
52
|
+
required: true;
|
|
53
|
+
};
|
|
54
|
+
onClearSort: {
|
|
55
|
+
type: PropType<() => void>;
|
|
56
|
+
required: true;
|
|
57
|
+
};
|
|
58
|
+
onAutosizeThis: {
|
|
59
|
+
type: PropType<() => void>;
|
|
60
|
+
required: true;
|
|
61
|
+
};
|
|
62
|
+
onAutosizeAll: {
|
|
63
|
+
type: PropType<() => void>;
|
|
64
|
+
required: true;
|
|
65
|
+
};
|
|
38
66
|
canPinLeft: {
|
|
39
67
|
type: BooleanConstructor;
|
|
40
68
|
required: true;
|
|
@@ -47,9 +75,21 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
|
|
|
47
75
|
type: BooleanConstructor;
|
|
48
76
|
required: true;
|
|
49
77
|
};
|
|
78
|
+
currentSort: {
|
|
79
|
+
type: PropType<"asc" | "desc" | null>;
|
|
80
|
+
default: null;
|
|
81
|
+
};
|
|
82
|
+
isSortable: {
|
|
83
|
+
type: BooleanConstructor;
|
|
84
|
+
default: boolean;
|
|
85
|
+
};
|
|
86
|
+
isResizable: {
|
|
87
|
+
type: BooleanConstructor;
|
|
88
|
+
default: boolean;
|
|
89
|
+
};
|
|
50
90
|
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
51
91
|
[key: string]: any;
|
|
52
|
-
}
|
|
92
|
+
}> | null, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
53
93
|
isOpen: {
|
|
54
94
|
type: BooleanConstructor;
|
|
55
95
|
required: true;
|
|
@@ -74,6 +114,26 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
|
|
|
74
114
|
type: PropType<() => void>;
|
|
75
115
|
required: true;
|
|
76
116
|
};
|
|
117
|
+
onSortAsc: {
|
|
118
|
+
type: PropType<() => void>;
|
|
119
|
+
required: true;
|
|
120
|
+
};
|
|
121
|
+
onSortDesc: {
|
|
122
|
+
type: PropType<() => void>;
|
|
123
|
+
required: true;
|
|
124
|
+
};
|
|
125
|
+
onClearSort: {
|
|
126
|
+
type: PropType<() => void>;
|
|
127
|
+
required: true;
|
|
128
|
+
};
|
|
129
|
+
onAutosizeThis: {
|
|
130
|
+
type: PropType<() => void>;
|
|
131
|
+
required: true;
|
|
132
|
+
};
|
|
133
|
+
onAutosizeAll: {
|
|
134
|
+
type: PropType<() => void>;
|
|
135
|
+
required: true;
|
|
136
|
+
};
|
|
77
137
|
canPinLeft: {
|
|
78
138
|
type: BooleanConstructor;
|
|
79
139
|
required: true;
|
|
@@ -86,6 +146,21 @@ export declare const ColumnHeaderMenu: import("vue").DefineComponent<import("vue
|
|
|
86
146
|
type: BooleanConstructor;
|
|
87
147
|
required: true;
|
|
88
148
|
};
|
|
149
|
+
currentSort: {
|
|
150
|
+
type: PropType<"asc" | "desc" | null>;
|
|
151
|
+
default: null;
|
|
152
|
+
};
|
|
153
|
+
isSortable: {
|
|
154
|
+
type: BooleanConstructor;
|
|
155
|
+
default: boolean;
|
|
156
|
+
};
|
|
157
|
+
isResizable: {
|
|
158
|
+
type: BooleanConstructor;
|
|
159
|
+
default: boolean;
|
|
160
|
+
};
|
|
89
161
|
}>> & Readonly<{}>, {
|
|
90
162
|
anchorElement: HTMLElement | null;
|
|
163
|
+
currentSort: "asc" | "desc" | null;
|
|
164
|
+
isSortable: boolean;
|
|
165
|
+
isResizable: boolean;
|
|
91
166
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type PropType, type VNode } from 'vue';
|
|
2
2
|
import { type IOGridDataGridProps } from '@alaarab/ogrid-vue';
|
|
3
|
+
import './DataGridTable.css';
|
|
3
4
|
export declare const DataGridTable: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
4
5
|
gridProps: {
|
|
5
6
|
type: PropType<IOGridDataGridProps<unknown>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alaarab/ogrid-vue-vuetify",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.11",
|
|
4
4
|
"description": "OGrid Vuetify – Vuetify-based data grid with sorting, filtering, pagination, column chooser, and CSV export.",
|
|
5
5
|
"main": "dist/esm/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "rimraf dist && tsc -p tsconfig.build.json",
|
|
16
|
+
"build": "rimraf dist && tsc -p tsconfig.build.json && node scripts/copy-css.js",
|
|
17
17
|
"test": "jest --passWithNoTests",
|
|
18
18
|
"storybook": "storybook dev -p 6011 --no-open",
|
|
19
19
|
"build-storybook": "storybook build"
|
|
@@ -37,13 +37,14 @@
|
|
|
37
37
|
"node": ">=18"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@alaarab/ogrid-vue": "2.0.
|
|
40
|
+
"@alaarab/ogrid-vue": "2.0.11"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"vue": "^3.3.0",
|
|
44
44
|
"vuetify": "^3.0.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
+
"@mdi/font": "^7.4.47",
|
|
47
48
|
"@storybook/vue3-vite": "^10.2.8",
|
|
48
49
|
"@vitejs/plugin-vue": "^6.0.4",
|
|
49
50
|
"storybook": "^10.2.8",
|
|
@@ -53,7 +54,9 @@
|
|
|
53
54
|
"vue": "^3.5.28",
|
|
54
55
|
"vuetify": "^3.11.8"
|
|
55
56
|
},
|
|
56
|
-
"sideEffects":
|
|
57
|
+
"sideEffects": [
|
|
58
|
+
"**/*.css"
|
|
59
|
+
],
|
|
57
60
|
"publishConfig": {
|
|
58
61
|
"access": "public"
|
|
59
62
|
}
|