Skip to content
This repository was archived by the owner on Apr 30, 2024. It is now read-only.

Commit 15d06bb

Browse files
caredevArkaitz
andauthored
Global config & column classes (#101)
* Global config & column classes * Global config & per column classes * Global config & column classes * Added lodash defaultsDeep dependency * Global config & column classes * Global config & column classes * Fixed Generic Object Injection Sink * Code formatting * Object injection sink in classes.push() Co-authored-by: Arkaitz <arkaitz.felices@beautycare.es>
1 parent 2de49ce commit 15d06bb

File tree

6 files changed

+118
-33
lines changed

6 files changed

+118
-33
lines changed

.editorconfig

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# top-most EditorConfig file
2+
root = true
3+
4+
# Unix-style newlines with a newline ending every file
5+
[*]
6+
end_of_line = lf
7+
insert_final_newline = true
8+
9+
# Matches multiple files with brace expansion notation
10+
# Set default charset
11+
[*.{js,py}]
12+
charset = utf-8
13+
14+
# 4 space indentation
15+
[*.js,*.vue ]
16+
indent_style = space
17+
indent_size = 4
18+
19+
# Tab indentation (no size specified)
20+
[Makefile]
21+
indent_style = tab
22+
23+
# Indentation override for all JS under lib directory
24+
[lib/**.js]
25+
indent_style = space
26+
indent_size = 4
27+
28+
# Matches the exact files either package.json or .travis.yml
29+
[{package.json,.travis.yml}]
30+
indent_style = space
31+
indent_size = 2

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"axios": "^0.18.1",
2828
"laravel-vue-pagination": "^2.3.0",
2929
"lodash.debounce": "^4.0.8",
30+
"lodash.defaultsdeep": "^4.6.1",
3031
"vue": "^2.6.10"
3132
},
3233
"devDependencies": {
@@ -74,7 +75,8 @@
7475
"vuex-persistedstate": "^2.5.4"
7576
},
7677
"files": [
77-
"dist/*"
78+
"dist/*",
79+
"src/*"
7880
],
7981
"eslintConfig": {
8082
"root": true,

src/components/DataTable.vue

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
:columns="columns"
2121
:dir="tableProps.dir"
2222
:sortOrders="sortOrders"
23-
:table-classes="classes.table"
24-
:table-head-classes="classes['th']"
25-
:table-header-classes="classes['t-head']"
26-
:table-row-classes="classes['t-head-tr']"
27-
:table-container-classes="classes['table-container']">
23+
:table-classes="computedClasses.table"
24+
:table-head-classes="computedClasses['th']"
25+
:table-header-classes="computedClasses['t-head']"
26+
:table-row-classes="computedClasses['t-head-tr']"
27+
:table-container-classes="computedClasses['table-container']">
2828
<!-- Table Header -->
2929
<template
3030
slot="header"
@@ -46,17 +46,17 @@
4646
<template slot="body" v-else>
4747
<tbody
4848
v-if="columns"
49-
:class="classes['t-body']"
49+
:class="computedClasses['t-body']"
5050
class="laravel-vue-datatable-tbody">
5151
<tr
5252
:key="item.id"
53-
:class="classes['t-body-tr']"
53+
:class="computedClasses['t-body-tr']"
5454
v-for="(item, rowIndex) in tableData.data"
5555
@click="$emit('row-clicked', item)"
5656
class="laravel-vue-datatable-tbody-tr">
5757
<td
5858
:key="column.name"
59-
:class="classes.td"
59+
:class="bodyCellClasses(column)"
6060
v-for="(column, columnIndex) in columns"
6161
class="laravel-vue-datatable-td">
6262
<laravel-vue-data-table-cell
@@ -102,6 +102,7 @@
102102
import axios from 'axios';
103103
import VueTable from './Table.vue';
104104
import UrlFilters from '../mixins/UrlFilters';
105+
import MergeClasses from "../mixins/MergeClasses";
105106
import DataTableCell from './DataTableCell.vue';
106107
import DataTableFilters from './DataTableFilters.vue';
107108
@@ -113,8 +114,26 @@ export default {
113114
this.getData(this.url, this.getRequestPayload);
114115
}
115116
117+
const defaults = require("lodash.defaultsdeep");
118+
this.computedClasses = defaults(this.classes,(window.LaravelVueDatatable || {}).classes || {},
119+
{
120+
"table-container": {
121+
"table-responsive": true
122+
},
123+
table: {
124+
table: true,
125+
"table-striped": true,
126+
border: true
127+
},
128+
"t-head": {},
129+
"t-body": {},
130+
td: {},
131+
th: {}
132+
}
133+
);
134+
116135
if (this.theme == "dark") {
117-
this.classes['table']['table-dark'] = true;
136+
this.computedClasses['table']['table-dark'] = true;
118137
}
119138
120139
let debounce = require('lodash.debounce');
@@ -126,7 +145,7 @@ export default {
126145
this.sortOrders[column.name] = -1;
127146
});
128147
},
129-
mixins: [UrlFilters],
148+
mixins: [UrlFilters, MergeClasses],
130149
watch: {
131150
url: {
132151
handler: function(newUrl) {
@@ -173,6 +192,7 @@ export default {
173192
filters: this.filters,
174193
length: this.perPage[0],
175194
},
195+
computedClasses: {},
176196
};
177197
},
178198
methods: {
@@ -240,6 +260,11 @@ export default {
240260
this.getData();
241261
}
242262
},
263+
bodyCellClasses(column) {
264+
return this.mergeClasses(
265+
typeof column.columnClasses === "object" && column.columnClasses["!override"] ? {} : this.computedClasses.td,
266+
column.columnClasses || {}, (column.columnClasses || {}).td || {});
267+
}
243268
},
244269
components: {
245270
'laravel-vue-table': VueTable,
@@ -339,32 +364,19 @@ export default {
339364
},
340365
classes: {
341366
type: Object,
342-
default: () => ({
343-
"table-container": {
344-
"table-responsive": true,
345-
},
346-
"table": {
347-
"table": true,
348-
"table-striped": true,
349-
"border": true,
350-
},
351-
"t-head": {},
352-
"t-body": {},
353-
"td": {},
354-
"th": {},
355-
}),
367+
default: () => ({}),
356368
},
357369
headers: {
358370
type: Object,
359371
default: () => ({})
360372
},
361373
translate: {
362374
type: Object,
363-
default: () => ({
375+
default: () => Object.assign({}, {
364376
nextButton: 'Next',
365377
previousButton: 'Previous',
366378
placeholderSearch: 'Search Table',
367-
})
379+
}, (window.LaravelVueDatatable || {}).translate || {})
368380
}
369381
},
370382
}

src/components/DataTableTh.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@
3737
</template>
3838

3939
<script>
40+
import MergeClasses from "../mixins/MergeClasses";
41+
4042
export default {
43+
mixins: [MergeClasses],
4144
data() {
4245
return {
4346
currentSort: '',
@@ -59,9 +62,12 @@ export default {
5962
},
6063
methods: {
6164
headerClasses(column) {
62-
let classes = this.classes;
63-
classes['table-header-sorting'] = column.orderable;
64-
return classes;
65+
return this.mergeClasses(
66+
typeof column.columnClasses === "object" && column.columnClasses["!override"] ? {} : this.classes,
67+
{"table-header-sorting": column.orderable},
68+
column.columnClasses || {},
69+
(column.columnClasses || {}).th || {}
70+
);
6571
},
6672
sort(column) {
6773
this.setCurrentColumnSort(column.name);

src/components/Table.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
<script>
2828
2929
import LaravelVueDataTableTh from './DataTableTh';
30+
import MergeClasses from "../mixins/MergeClasses";
3031
3132
export default {
33+
mixins: [MergeClasses],
3234
components: {
3335
LaravelVueDataTableTh
3436
},
@@ -68,9 +70,11 @@ export default {
6870
},
6971
methods: {
7072
headerClasses(column) {
71-
let classes = this.tableHeadClasses;
72-
classes['table-header-sorting'] = column.orderable;
73-
return classes;
73+
return this.mergeClasses(
74+
this.tableHeadClasses,
75+
{"table-header-sorting": column.orderable},
76+
(column.columnClasses || {}).thead || {}
77+
);
7478
},
7579
sort(column) {
7680
this.$emit('sort', column.name, column.columnName);

src/mixins/MergeClasses.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export default {
2+
methods: {
3+
mergeClasses(...classlists) {
4+
const classes = [];
5+
6+
for (let classlist in classlists) {
7+
if (classlists.hasOwnProperty(classlist)) {
8+
let list = classlists[`${classlist}`];
9+
10+
if (typeof list === "string") {
11+
classes.push(list);
12+
} else if (Array.isArray(list)) {
13+
classes.push(...list);
14+
} else if (typeof list === "object") {
15+
for (let cls in list) {
16+
if (list.hasOwnProperty(cls) &&
17+
typeof list[`${cls}`] !== "object" &&
18+
list[`${cls}`] &&
19+
cls !== "!override") {
20+
classes.push(`${cls}`);
21+
}
22+
}
23+
}
24+
}
25+
}
26+
27+
return [...new Set(classes)].join(" ");
28+
}
29+
}
30+
};

0 commit comments

Comments
 (0)