Skip to content

Commit 6781ebe

Browse files
committed
export to excel
1 parent 76582ee commit 6781ebe

File tree

8 files changed

+168
-106
lines changed

8 files changed

+168
-106
lines changed

src/crud/components/ChildrenTable.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
</template>
5757

5858
<v-tooltip left>
59-
<v-btn class="white--text" fab small color="green darken-4" @click="exportToExcel()" slot="activator">
59+
<v-btn class="white--text" fab small color="green darken-4" @click="exportToExcel()" slot="activator" :loading="excelLoading">
6060
<v-icon>save_alt</v-icon>
6161
</v-btn>
6262
<span>{{ $t('global.datatable.buttons.copyToExcel') }}</span>
@@ -155,6 +155,7 @@ import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
155155
export default {
156156
mixins: [ClientSideFilteringMixin, HelperMixin],
157157
props: {
158+
title: String,
158159
fieldsInfo: Array,
159160
deleteMode: {
160161
type: String,
@@ -217,12 +218,17 @@ export default {
217218
}
218219
},
219220
computed: {
221+
...mapState(['page']),
222+
...mapState("crud", ["prefix", "path"]),
220223
tableFields() {
221224
return this.fieldsInfo.filter(field => field.table != false && field.type != 'divider');
222225
},
223226
items() {
224227
return this.tableData;
225228
},
229+
excelName() {
230+
return this.$t('global.routes.' + this.page) + ' - ' + this.title
231+
}
226232
},
227233
methods: {
228234
...mapMutations("crud", [

src/crud/components/DataTableClientSide.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
</template>
7171

7272
<v-tooltip left>
73-
<v-btn class="white--text" fab small color="green darken-4" @click="exportToExcel()" slot="activator">
73+
<v-btn class="white--text" fab small color="green darken-4" @click="exportToExcel()" slot="activator" :loading="excelLoading">
7474
<v-icon>save_alt</v-icon>
7575
</v-btn>
7676
<span>{{ $t('global.datatable.buttons.copyToExcel') }}</span>

src/crud/components/DataTableServerSide.vue

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@
5050
</span>
5151
</template>
5252

53+
<v-tooltip left>
54+
<v-btn class="white--text" fab small color="green darken-4" @click="exportToExcel()" slot="activator" :loading="excelLoading">
55+
<v-icon>save_alt</v-icon>
56+
</v-btn>
57+
<span>{{ $t('global.datatable.buttons.copyToExcel') }}</span>
58+
</v-tooltip>
59+
5360
</v-flex>
5461

5562
</v-layout>
@@ -97,9 +104,11 @@
97104
</template>
98105

99106
<script>
107+
import Vue from 'vue'
100108
import MainMixin from "../mixins/datatable-main.js";
101109
import HelperMixin from "../mixins/datatable-helper.js";
102110
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
111+
import { getItemsList } from '@/helpers/functions.js'
103112
104113
export default {
105114
mixins: [MainMixin, HelperMixin],
@@ -135,7 +144,8 @@ export default {
135144
filterColumns: this.filterColumns,
136145
selectedStatuses: this.selectedStatuses,
137146
deleteMode: this.deleteMode,
138-
activeColumnName: this.activeColumnName
147+
activeColumnName: this.activeColumnName,
148+
mode: 'paginate'
139149
};
140150
},
141151
},
@@ -187,6 +197,43 @@ export default {
187197
}
188198
}, 500)
189199
},
200+
exportToExcel() {
201+
this.excelLoading = true
202+
let headers = this.cleanHeaders.map(header => header.text)
203+
let params = {}
204+
for(let key in this.params){
205+
params[key] = this.params[key]
206+
}
207+
params.mode = 'all'
208+
let filteredItems
209+
Vue.http.post(this.prefix + '/' + this.path + '/search', params)
210+
.then((response) => {
211+
let items = response.body
212+
filteredItems = items.map(obj => {
213+
return getItemsList(obj, this.tableFields, this.meta, this.primaryKey, this.customButtons, this.activeColumnName)
214+
})
215+
let data = filteredItems.map(item => {
216+
let row = []
217+
for(let header of this.cleanHeaders){
218+
row.push(item[header.value])
219+
}
220+
return row
221+
})
222+
import('@/vendor/Export2Excel').then(excel => {
223+
this.excelLoading = false
224+
excel.export_json_to_excel({
225+
header: headers,
226+
data: data,
227+
filename: this.excelName,
228+
autoWidth: true,
229+
bookType: 'xlsx'
230+
})
231+
})
232+
}), error => {
233+
this.excelLoading = false
234+
commit('alertError', error.statusText, { root: true })
235+
}
236+
}
190237
}
191238
};
192239
</script>

src/crud/mixins/child.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77

88
export default {
99
props: {
10+
title: String,
1011
path: String,
1112
childItemName: String,
1213
fkName: String,
@@ -27,7 +28,8 @@ export default {
2728
computed: {
2829
...mapState('crud', [
2930
'childItems',
30-
'itemIdColumn'
31+
'itemIdColumn',
32+
'childTitle'
3133
]),
3234
...mapGetters('crud', [
3335
'item',
@@ -49,6 +51,7 @@ export default {
4951
'resetChild',
5052
'editChildDialog',
5153
'createChildDialog',
54+
'setChildTitle'
5255
]),
5356
...mapActions('crud', [
5457
"getItemDetails",
Lines changed: 102 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,114 @@
11

22
export default {
3-
created() {
4-
this.filterColumns = this.tableFields.map(field => {
5-
let item = {};
6-
item.mode = 'like'
7-
item.text = field.text;
8-
item.name = field.name.toLowerCase();
9-
item.column = field.column
10-
item.value = ''
11-
return item;
12-
});
13-
},
14-
watch: {
15-
selectedStatuses(val) {
16-
this.pagination.page = 1
17-
},
3+
created() {
4+
this.filterColumns = this.tableFields.map(field => {
5+
let item = {};
6+
item.mode = 'like'
7+
item.text = field.text;
8+
item.name = field.name.toLowerCase();
9+
item.column = field.column
10+
item.value = ''
11+
return item;
12+
});
13+
},
14+
watch: {
15+
selectedStatuses(val) {
16+
this.pagination.page = 1
1817
},
19-
computed: {
20-
filteredItems() {
21-
22-
let items = ['soft', 'both'].includes(this.deleteMode)
23-
? this.items.filter(item =>
24-
this.selectedStatuses.includes(parseInt(item.meta.active))
25-
)
26-
: this.items;
27-
28-
let filterColumns = this.filterColumns
29-
items = items.filter(item => {
30-
let found = true;
31-
for (let i = 0; i < filterColumns.length; i++) {
32-
if(filterColumns[i].value != ''){
33-
found = false;
34-
let colName = filterColumns[i].name
35-
let field = item[colName];
36-
if (typeof field === "string" || field instanceof String || typeof field === "number") {
37-
field = field.toString().toLowerCase();
38-
switch (filterColumns[i].mode) {
39-
case 'like':
40-
if (field.includes(filterColumns[i].value)) {
41-
found = true;
42-
}
43-
break;
44-
case 'equals':
45-
if (field == filterColumns[i].value) {
46-
found = true;
47-
}
48-
break;
49-
case 'list':
50-
let tmpList = filterColumns[i].value.split(';')
51-
if (tmpList.includes(field)) {
52-
found = true;
53-
}
18+
},
19+
computed: {
20+
filteredItems() {
21+
22+
let items = ['soft', 'both'].includes(this.deleteMode)
23+
? this.items.filter(item =>
24+
this.selectedStatuses.includes(parseInt(item.meta.active))
25+
)
26+
: this.items;
27+
28+
let filterColumns = this.filterColumns
29+
items = items.filter(item => {
30+
let found = true;
31+
for (let i = 0; i < filterColumns.length; i++) {
32+
if(filterColumns[i].value != ''){
33+
found = false;
34+
let colName = filterColumns[i].name
35+
let field = item[colName];
36+
if (typeof field === "string" || field instanceof String || typeof field === "number") {
37+
field = field.toString().toLowerCase();
38+
switch (filterColumns[i].mode) {
39+
case 'like':
40+
if (field.includes(filterColumns[i].value)) {
41+
found = true;
42+
}
43+
break;
44+
case 'equals':
45+
if (field == filterColumns[i].value) {
46+
found = true;
47+
}
48+
break;
49+
case 'list':
50+
let tmpList = filterColumns[i].value.split(';')
51+
if (tmpList.includes(field)) {
52+
found = true;
53+
}
54+
break;
55+
default:
5456
break;
55-
default:
56-
break;
57-
}
5857
}
59-
if (!found) break;
6058
}
59+
if (!found) break;
6160
}
62-
return found;
63-
});
64-
65-
let phrases = this.search == "" ? [] : this.search.toLowerCase().split(" ");
66-
items = items.filter(item => {
67-
let found = true;
68-
for (let i = 0; i < phrases.length; i++) {
69-
found = false;
70-
for (let key in item) {
71-
let field = item[key];
72-
if (
73-
typeof field === "string" ||
74-
field instanceof String ||
75-
typeof field === "number"
76-
) {
77-
field = field.toString().toLowerCase();
78-
if (field.includes(phrases[i])) {
79-
found = true;
80-
}
61+
}
62+
return found;
63+
});
64+
65+
let phrases = this.search == "" ? [] : this.search.toLowerCase().split(" ");
66+
items = items.filter(item => {
67+
let found = true;
68+
for (let i = 0; i < phrases.length; i++) {
69+
found = false;
70+
for (let key in item) {
71+
let field = item[key];
72+
if (
73+
typeof field === "string" ||
74+
field instanceof String ||
75+
typeof field === "number"
76+
) {
77+
field = field.toString().toLowerCase();
78+
if (field.includes(phrases[i])) {
79+
found = true;
8180
}
8281
}
83-
if (!found) break;
84-
}
85-
return found;
86-
});
87-
88-
return items;
89-
}
90-
},
91-
methods: {
92-
exportToExcel() {
93-
let headers = this.cleanHeaders.map(header => header.text)
94-
let data = this.filteredItems.map(item => {
95-
let row = []
96-
for(let header of this.cleanHeaders){
97-
row.push(item[header.value])
9882
}
99-
return row
100-
})
101-
import('@/vendor/Export2Excel').then(excel => {
102-
excel.export_json_to_excel({
103-
header: headers,
104-
data: data,
105-
filename: 'excel-list',
106-
autoWidth: true,
107-
bookType: 'xlsx'
108-
})
83+
if (!found) break;
84+
}
85+
return found;
86+
});
87+
88+
return items;
89+
}
90+
},
91+
methods: {
92+
exportToExcel() {
93+
this.excelLoading = true
94+
let headers = this.cleanHeaders.map(header => header.text)
95+
let data = this.filteredItems.map(item => {
96+
let row = []
97+
for(let header of this.cleanHeaders){
98+
row.push(item[header.value])
99+
}
100+
return row
101+
})
102+
import('@/vendor/Export2Excel').then(excel => {
103+
this.excelLoading = false
104+
excel.export_json_to_excel({
105+
header: headers,
106+
data: data,
107+
filename: this.excelName,
108+
autoWidth: true,
109+
bookType: 'xlsx'
109110
})
110-
}
111+
})
111112
}
112-
};
113+
}
114+
};

src/crud/mixins/datatable-helper.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default {
1111
tmp: "",
1212
search: "",
1313
pagination: {},
14+
excelLoading: false
1415
};
1516
},
1617
computed: {

src/crud/mixins/datatable-main.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default {
2828
};
2929
},
3030
computed: {
31-
...mapState(["filesPath"]),
31+
...mapState(["filesPath", 'page']),
3232
...mapState("crud", ["prefix", "path"]),
3333
...mapGetters("crud", ["itemsList"]),
3434
selectedIds() {
@@ -37,6 +37,9 @@ export default {
3737
items() {
3838
return this.itemsList(this.tableFields, this.meta, this.primaryKey, this.customButtons, this.activeColumnName);
3939
},
40+
excelName() {
41+
return this.$t('global.routes.' + this.page)
42+
}
4043
},
4144
methods: {
4245
...mapMutations(["alertError"]),

0 commit comments

Comments
 (0)