Skip to content

Commit 822c2f4

Browse files
authored
Merge pull request #87 from HC200ok/extract-props
Optimize: extract props from dataTable component
2 parents 9c64720 + c813ede commit 822c2f4

File tree

6 files changed

+164
-158
lines changed

6 files changed

+164
-158
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"author": "HC200ok",
44
"description": "A customizable and easy-to-use data table component made with Vue.js 3.x.",
55
"private": false,
6-
"version": "1.4.2",
6+
"version": "1.4.5",
77
"types": "./types/main.d.ts",
88
"license": "MIT",
99
"files": [

src/components/DataTable.vue

Lines changed: 6 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -240,168 +240,22 @@ import useRows from '../hooks/useRows';
240240
import useServerOptions from '../hooks/useServerOptions';
241241
import useTotalItems from '../hooks/useTotalItems';
242242
243-
import type {
244-
SortType, Header, Item, ServerOptions, FilterOption,
245-
HeaderItemClassNameFunction, BodyItemClassNameFunction, BodyRowClassNameFunction,
246-
} from '../types/main';
247-
243+
import type { Header, Item } from '../types/main';
248244
import type { HeaderForRender } from '../types/internal';
249245
250246
// eslint-disable-next-line import/extensions
251247
import { generateColumnContent } from '../utils';
248+
import withOptionalProps from '../withOptionalProps';
252249
253250
const props = defineProps({
254-
alternating: {
255-
type: Boolean,
256-
default: false,
257-
},
258-
buttonsPagination: {
259-
type: Boolean,
260-
default: false,
261-
},
262-
checkboxColumnWidth: {
263-
type: Number,
264-
default: null,
265-
},
266-
emptyMessage: {
267-
type: String,
268-
default: 'No Available Data',
269-
},
270-
expandColumnWidth: {
271-
type: Number,
272-
default: 36,
273-
},
274-
filterOptions: {
275-
type: Array as PropType<FilterOption[]>,
276-
default: null,
277-
},
278-
fixedExpand: {
279-
type: Boolean,
280-
default: false,
281-
},
282-
fixedHeader: {
283-
type: Boolean,
284-
default: true,
285-
},
286-
fixedCheckbox: {
287-
type: Boolean,
288-
default: false,
289-
},
290-
fixedIndex: {
291-
type: Boolean,
292-
default: false,
293-
},
294-
headers: {
295-
type: Array as PropType<Header[]>,
296-
required: true,
297-
},
298-
hideFooter: {
299-
type: Boolean,
300-
default: false,
301-
},
302-
hideRowsPerPage: {
303-
type: Boolean,
304-
default: false,
305-
},
306-
hideHeader: {
307-
type: Boolean,
308-
default: false,
309-
},
310-
indexColumnWidth: {
311-
type: Number,
312-
default: 60,
313-
},
251+
...withOptionalProps,
314252
items: {
315253
type: Array as PropType<Item[]>,
316254
required: true,
317255
},
318-
itemsSelected: {
319-
type: Array as PropType<Item[]> | null,
320-
default: null,
321-
},
322-
loading: {
323-
type: Boolean,
324-
deault: false,
325-
},
326-
rowsPerPage: {
327-
type: Number,
328-
default: 25,
329-
},
330-
rowsItems: {
331-
type: Array as PropType<number[]>,
332-
default: () => [25, 50, 100],
333-
},
334-
rowsPerPageMessage: {
335-
type: String,
336-
default: 'rows per page:',
337-
},
338-
searchField: {
339-
type: String,
340-
default: '',
341-
},
342-
searchValue: {
343-
type: String,
344-
default: '',
345-
},
346-
serverOptions: {
347-
type: Object as PropType<ServerOptions> | null,
348-
default: null,
349-
},
350-
serverItemsLength: {
351-
type: Number,
352-
default: 0,
353-
},
354-
showIndex: {
355-
type: Boolean,
356-
default: false,
357-
},
358-
sortBy: {
359-
type: String,
360-
default: '',
361-
},
362-
sortType: {
363-
type: String as PropType<SortType>,
364-
default: 'asc',
365-
},
366-
tableHeight: {
367-
type: Number,
368-
default: null,
369-
},
370-
themeColor: {
371-
type: String,
372-
default: '#42b883',
373-
},
374-
tableClassName: {
375-
type: String,
376-
default: '',
377-
},
378-
headerClassName: {
379-
type: String,
380-
default: '',
381-
},
382-
headerItemClassName: {
383-
type: [Function, String] as PropType<HeaderItemClassNameFunction | string>,
384-
default: '',
385-
},
386-
bodyRowClassName: {
387-
type: [Function, String] as PropType<BodyRowClassNameFunction | string>,
388-
default: '',
389-
},
390-
bodyItemClassName: {
391-
type: [Function, String] as PropType<BodyItemClassNameFunction | string>,
392-
default: '',
393-
},
394-
noHover: {
395-
type: Boolean,
396-
default: false,
397-
},
398-
borderCell: {
399-
type: Boolean,
400-
default: false,
401-
},
402-
mustSort: {
403-
type: Boolean,
404-
default: false,
256+
headers: {
257+
type: Array as PropType<Header[]>,
258+
required: true,
405259
},
406260
});
407261

src/modes/Client.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@
8787
import {
8888
computed, ref, reactive, toRefs,
8989
} from 'vue';
90-
import {
91-
Header, Item, FilterOption, clickRowArgument, HeaderItemClassNameFunction, BodyItemClassNameFunction, BodyRowClassNameFunction,
90+
import type {
91+
Header, Item, FilterOption, ClickRowArgument, HeaderItemClassNameFunction, BodyItemClassNameFunction, BodyRowClassNameFunction,
9292
} from '../types/main';
9393
import DataTable from '../components/DataTable.vue';
9494
import { mockClientNestedItems, mockClientItems, mockDuplicateClientNestedItems } from '../mock';
@@ -132,7 +132,7 @@ const headers: Header[] = [
132132
133133
const itemsSelected = ref<Item[]>([items.value[14]]);
134134
135-
const showItem = (item: clickRowArgument) => {
135+
const showItem = (item: ClickRowArgument) => {
136136
console.log('item');
137137
console.log(JSON.stringify(item));
138138
};

src/types/main.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export type ServerOptions = {
3737
sortType?: SortType
3838
}
3939

40-
export type clickRowArgument = Item & {
40+
export type ClickRowArgument = Item & {
4141
isSelected?: boolean
4242
indexInCurrentPage?: number
4343
}

src/withOptionalProps.ts

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import { PropType } from 'vue';
2+
import type {
3+
SortType, Item, ServerOptions, FilterOption,
4+
HeaderItemClassNameFunction, BodyItemClassNameFunction, BodyRowClassNameFunction,
5+
} from './types/main';
6+
7+
export default {
8+
alternating: {
9+
type: Boolean,
10+
default: false,
11+
},
12+
buttonsPagination: {
13+
type: Boolean,
14+
default: false,
15+
},
16+
checkboxColumnWidth: {
17+
type: Number,
18+
default: null,
19+
},
20+
emptyMessage: {
21+
type: String,
22+
default: 'No Available Data',
23+
},
24+
expandColumnWidth: {
25+
type: Number,
26+
default: 36,
27+
},
28+
filterOptions: {
29+
type: Array as PropType<FilterOption[]>,
30+
default: null,
31+
},
32+
fixedExpand: {
33+
type: Boolean,
34+
default: false,
35+
},
36+
fixedHeader: {
37+
type: Boolean,
38+
default: true,
39+
},
40+
fixedCheckbox: {
41+
type: Boolean,
42+
default: false,
43+
},
44+
fixedIndex: {
45+
type: Boolean,
46+
default: false,
47+
},
48+
hideFooter: {
49+
type: Boolean,
50+
default: false,
51+
},
52+
hideRowsPerPage: {
53+
type: Boolean,
54+
default: false,
55+
},
56+
hideHeader: {
57+
type: Boolean,
58+
default: false,
59+
},
60+
indexColumnWidth: {
61+
type: Number,
62+
default: 60,
63+
},
64+
itemsSelected: {
65+
type: Array as PropType<Item[]> | null,
66+
default: null,
67+
},
68+
loading: {
69+
type: Boolean,
70+
deault: false,
71+
},
72+
rowsPerPage: {
73+
type: Number,
74+
default: 25,
75+
},
76+
rowsItems: {
77+
type: Array as PropType<number[]>,
78+
default: () => [25, 50, 100],
79+
},
80+
rowsPerPageMessage: {
81+
type: String,
82+
default: 'rows per page:',
83+
},
84+
searchField: {
85+
type: String,
86+
default: '',
87+
},
88+
searchValue: {
89+
type: String,
90+
default: '',
91+
},
92+
serverOptions: {
93+
type: Object as PropType<ServerOptions> | null,
94+
default: null,
95+
},
96+
serverItemsLength: {
97+
type: Number,
98+
default: 0,
99+
},
100+
showIndex: {
101+
type: Boolean,
102+
default: false,
103+
},
104+
sortBy: {
105+
type: String,
106+
default: '',
107+
},
108+
sortType: {
109+
type: String as PropType<SortType>,
110+
default: 'asc',
111+
},
112+
tableHeight: {
113+
type: Number,
114+
default: null,
115+
},
116+
themeColor: {
117+
type: String,
118+
default: '#42b883',
119+
},
120+
tableClassName: {
121+
type: String,
122+
default: '',
123+
},
124+
headerClassName: {
125+
type: String,
126+
default: '',
127+
},
128+
headerItemClassName: {
129+
type: [Function, String] as PropType<HeaderItemClassNameFunction | string>,
130+
default: '',
131+
},
132+
bodyRowClassName: {
133+
type: [Function, String] as PropType<BodyRowClassNameFunction | string>,
134+
default: '',
135+
},
136+
bodyItemClassName: {
137+
type: [Function, String] as PropType<BodyItemClassNameFunction | string>,
138+
default: '',
139+
},
140+
noHover: {
141+
type: Boolean,
142+
default: false,
143+
},
144+
borderCell: {
145+
type: Boolean,
146+
default: false,
147+
},
148+
mustSort: {
149+
type: Boolean,
150+
default: false,
151+
},
152+
}

types/main.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export type ServerOptions = {
3737
sortType?: SortType
3838
}
3939

40-
export type clickRowArgument = Item & {
40+
export type ClickRowArgument = Item & {
4141
isSelected?: boolean
4242
indexInCurrentPage?: number
4343
}

0 commit comments

Comments
 (0)