Skip to content

Commit 01e8653

Browse files
Merge pull request #3201 from Countly/feat/export_file_name_datatable
[SER-78]custom file name for export functionality in the datatable
2 parents 2fef553 + df717d2 commit 01e8653

File tree

4 files changed

+47
-24
lines changed

4 files changed

+47
-24
lines changed

frontend/express/public/javascripts/countly/vue/components/datatable.js

+25-18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* global jQuery, Vue, _, CV, countlyCommon, countlyGlobal, CountlyHelpers, moment, countlyTaskManager, _merge */
1+
/* global jQuery, Vue, _, CV, countlyCommon, countlyGlobal, CountlyHelpers, countlyTaskManager, _merge */
22

33
(function(countlyVue, $) {
44

@@ -588,6 +588,11 @@
588588
type: Boolean,
589589
default: true,
590590
required: false
591+
},
592+
customExportFileName: {
593+
type: Boolean,
594+
default: true,
595+
required: false
591596
}
592597
},
593598
data: function() {
@@ -599,7 +604,8 @@
599604
{'name': '.JSON', value: 'json'},
600605
{'name': '.XLSX', value: 'xlsx'}
601606
],
602-
searchQuery: ''
607+
searchQuery: '',
608+
exportFileName: this.getDefaultFileName(),
603609
};
604610
},
605611
methods: {
@@ -608,20 +614,20 @@
608614
type: this.selectedExportType
609615
});
610616
},
611-
getDefaultFileName: function(params) {
612-
var name = "countly";
613-
if (params.title) {
614-
name = params.title.replace(/[\r\n]+/g, "");
615-
}
616-
if (params.timeDependent) {
617-
//include export range
618-
name += "_for_" + countlyCommon.getDateRange();
617+
getDefaultFileName: function() {
618+
var siteName = countlyGlobal.countlyTitle;
619+
var sectionName = "";
620+
var selectedMenuItem = this.$store.getters["countlySidebar/getSelectedMenuItem"];
621+
if (selectedMenuItem && selectedMenuItem.item && selectedMenuItem.item.title) {
622+
sectionName = this.i18n(selectedMenuItem.item.title);
619623
}
620-
else {
621-
//include export date
622-
name += "_on_" + moment().format("DD-MMM-YYYY");
624+
var appName = "";
625+
if (this.$store.getters["countlyCommon/getActiveApp"]) {
626+
appName = this.$store.getters["countlyCommon/getActiveApp"].name;
623627
}
624-
return (name.charAt(0).toUpperCase() + name.slice(1).toLowerCase());
628+
var date = countlyCommon.getDateRange();
629+
630+
return siteName + " " + appName + " " + sectionName + " " + date;
625631
},
626632
getLocalExportContent: function() {
627633
if (this.exportFormat) {
@@ -630,7 +636,6 @@
630636
return this.rows;
631637
},
632638
initiateExport: function(params) {
633-
634639
var formData = null,
635640
url = null;
636641

@@ -666,7 +671,7 @@
666671
type: params.type,
667672
path: path,
668673
prop: "aaData",
669-
filename: this.getDefaultFileName(params),
674+
filename: this.exportFileName,
670675
api_key: countlyGlobal.member.api_key
671676
};
672677
}
@@ -675,10 +680,13 @@
675680
formData = {
676681
type: params.type,
677682
data: JSON.stringify(this.getLocalExportContent()),
678-
filename: this.getDefaultFileName(params),
683+
filename: this.exportFileName,
679684
api_key: countlyGlobal.member.api_key
680685
};
681686
}
687+
if (!formData.filename) {
688+
formData.filename = this.exportFileName;
689+
}
682690

683691
if (formData.url === "/o/export/requestQuery") {
684692
if (Array.isArray(formData.prop)) {
@@ -714,7 +722,6 @@
714722
}
715723
else {
716724
var form = $('<form method="POST" action="' + url + '">');
717-
718725
$.each(formData, function(k, v) {
719726
if (CountlyHelpers.isJSON(v)) {
720727
form.append($('<textarea style="visibility:hidden;position:absolute;display:none;" name="' + k + '">' + v + '</textarea>'));

frontend/express/public/javascripts/countly/vue/templates/datatable.html

+12-6
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@
3434
<template>
3535
<div class="bu-mx-4 bu-mt-4">
3636
<p class="bu-mb-4 color-cool-gray-100">{{i18n('export.export-as')}}</p>
37-
<el-radio-group
38-
class="bu-mb-5"
39-
v-model="selectedExportType">
40-
<el-radio-button v-for="exportType in availableExportTypes" :key="exportType.value" :label="exportType.value" style="width: 99px; display: inline-grid;">{{exportType.name}}</el-radio-button>
41-
</el-radio-group>
37+
<div class="cly-vue-eldatatable__export--radio-button bu-mb-5">
38+
<el-radio-group v-model="selectedExportType">
39+
<el-radio-button v-for="exportType in availableExportTypes" :key="exportType.value" :label="exportType.value">{{exportType.name}}</el-radio-button>
40+
</el-radio-group>
41+
</div>
4242
</div>
4343
<div v-if="exportColumnSelection" class="cly-vue-eldatatable__export--extended">
4444
<div class="bu-mx-4 bu-mb-3">
@@ -74,8 +74,14 @@
7474
:options.sync="getMatching(availableDynamicCols)">
7575
</cly-checklistbox>
7676
</div>
77-
<slot name="export-config"></slot>
7877
</div>
78+
<div v-if="customExportFileName" :class="{'cly-vue-eldatatable__export--fileExport': exportColumnSelection}">
79+
<div class="bu-my-4 bu-mx-4">
80+
<p class="bu-mb-1 text-medium"> {{i18n('export.file-name')}} </p>
81+
<el-input v-model="exportFileName"></el-input>
82+
</div>
83+
</div>
84+
<slot name="export-config"></slot>
7985
<div class="bu-mx-4 bu-mb-4">
8086
<el-button size="medium" @click="onExportClick" type="success" style="width: 100%">{{i18n('export.export')}}</el-button>
8187
</div>

frontend/express/public/localization/dashboard/dashboard.properties

+1
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@ export.export-started = Export file is being generated. When ready you will see
717717
export.export-failed = Error upon attempting to export table data.
718718
export.export-finished = Export completed.
719719
export.export-finished-click = Click to download exported file.
720+
export.file-name = File name
720721

721722
#management-applications
722723
management-applications.title = Application Management

frontend/express/public/stylesheets/styles/blocks/_table.scss

+9
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@
4343
opacity: 0.12;
4444
}
4545
}
46+
&--fileExport {
47+
border-top: 1px solid #E2E4E8;
48+
}
49+
&--radio-button {
50+
.el-radio-button {
51+
width: 99px;
52+
display: inline-grid;
53+
}
54+
}
4655
&--search {
4756
input[type=text] {
4857
background-color: #F6F6F6;

0 commit comments

Comments
 (0)