Skip to content

Commit fe52515

Browse files
committed
Merge branch 'next' into feature/new-eslint-rules
# Conflicts: # frontend/express/public/stylesheets/main.css # plugins/push/frontend/public/stylesheets/main.css
2 parents fe9e3dd + c143cd8 commit fe52515

File tree

24 files changed

+3219
-5000
lines changed

24 files changed

+3219
-5000
lines changed

api/lib/countly.common.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function getPeriodObject() {
105105
}
106106
catch (SyntaxError) {
107107
console.log("period JSON parse failed");
108-
_period = "month";
108+
_period = "30days";
109109
}
110110
}
111111

@@ -1858,7 +1858,7 @@ countlyCommon.decode = function(str) {
18581858
* @param {(string|string[]|number[])} defaultPeriod - default period value in case it's not supplied in the params
18591859
* @returns {module:api/lib/countly.common.periodObj} period object
18601860
*/
1861-
countlyCommon.getPeriodObj = function(params, defaultPeriod = "month") {
1861+
countlyCommon.getPeriodObj = function(params, defaultPeriod = "30days") {
18621862
let appTimezone = params.appTimezone || (params.app && params.app.timezone);
18631863

18641864
params.qstring.period = params.qstring.period || defaultPeriod;

bin/docker/postinstall.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ else
2828
fi
2929
done <<< "$a"
3030

31-
(cd /opt/countly && npx grunt dist-all && npm prune --production && npm cache clean --force)
31+
(cd /opt/countly && npx grunt dist-all)
3232

3333
fi

frontend/express/public/javascripts/countly/countly.helpers.js

+125-8
Original file line numberDiff line numberDiff line change
@@ -707,27 +707,52 @@
707707
return false;
708708
}
709709
};
710+
/** function to show selected column count in export dialog
711+
* @param {object} dialog - dialog
712+
*/
713+
function show_selected_column_count(dialog) {
710714

715+
var allSelected = dialog.find('.export-all-columns.fa-check-square');
716+
717+
718+
var boxesCn = dialog.find('.columns-wrapper .checkbox-line');
719+
if (boxesCn) {
720+
boxesCn = boxesCn.length;
721+
}
722+
var selectedCn = dialog.find('.columns-wrapper .fa-check-square');
723+
if (selectedCn) {
724+
selectedCn = selectedCn.length;
725+
}
726+
if (allSelected.length === 0 && selectedCn !== boxesCn) {
727+
dialog.find(".export-columns-selector p:first").html(jQuery.i18n.map["export.columns-to-export"] + "<span>" + jQuery.i18n.prop("export.export-columns-selected-count", selectedCn, boxesCn) + "</span>");
728+
}
729+
else {
730+
dialog.find(".export-columns-selector p:first span").text("");
731+
}
732+
}
711733
/**
712734
* Displays database export dialog
713735
* @param {number} count - total count of documents to export
714736
* @param {object} data - data for export query to use when constructing url
715737
* @param {boolean} asDialog - open it as dialog
716738
* @param {boolean} exportByAPI - export from api request, export from db when set to false
739+
* @param {boolean} instance - optional. Reference to table to get correct colum names(only if there is need to select columns to export) There must be changes made in table settings to allow it. (table.addColumnExportSelector = true and each column must have columnsSelectorIndex value as field in db)
717740
* @returns {object} jQuery object reference to dialog
718741
* @example
719742
* var dialog = CountlyHelpers.export(300000);
720743
* //later when done
721744
* CountlyHelpers.removeDialog(dialog);
722745
*/
723-
CountlyHelpers.export = function(count, data, asDialog, exportByAPI) {
724-
var hardLimit = countlyGlobal.config.export_limit;
725-
var pages = Math.ceil(count / hardLimit);
746+
CountlyHelpers.export = function(count, data, asDialog, exportByAPI, instance) {
747+
//var hardLimit = countlyGlobal.config.export_limit;
748+
//var pages = Math.ceil(count / hardLimit);
726749
var dialog = $("#cly-export").clone();
727750
var type = "csv";
728-
var page = 0;
751+
//var page = 0;
752+
var tableCols;
753+
729754
dialog.removeAttr("id");
730-
dialog.find(".details").text(jQuery.i18n.prop("export.export-number", (count + "").replace(/(\d)(?=(\d{3})+$)/g, '$1 '), pages));
755+
/*dialog.find(".details").text(jQuery.i18n.prop("export.export-number", (count + "").replace(/(\d)(?=(\d{3})+$)/g, '$1 '), pages));
731756
if (count <= hardLimit) {
732757
dialog.find(".cly-select").hide();
733758
}
@@ -737,32 +762,124 @@
737762
dialog.find(".select-items > div").append('<div data-value="' + i + '" class="segmentation-option item">' + ((i * hardLimit + 1) + "").replace(/(\d)(?=(\d{3})+$)/g, '$1 ') + ' - ' + (Math.min((i + 1) * hardLimit, count) + "").replace(/(\d)(?=(\d{3})+$)/g, '$1 ') + " " + jQuery.i18n.map["export.documents"] + '</div>');
738763
}
739764
dialog.find(".export-data").addClass("disabled");
765+
}*/
766+
767+
var str = "";
768+
if (instance && instance.addColumnExportSelector && instance.fnSettings) {
769+
tableCols = instance.fnSettings().aoColumns || [];
770+
}
771+
772+
if (tableCols && Array.isArray(tableCols) && tableCols.length > 0) {
773+
var disabled = ""; //left in case want to add disabled column feature
774+
var myClass = "";
775+
var myClass2 = "";
776+
for (var colIndex = 0; colIndex < tableCols.length; colIndex++) {
777+
if (tableCols[colIndex].columnSelectorIndex) {
778+
var colName = tableCols[colIndex].columnSelectorIndex;
779+
myClass = 'fa-check-square';
780+
myClass2 = "";
781+
782+
783+
if (tableCols[colIndex].bVisible === true) {
784+
//selectedC++;
785+
}
786+
else {
787+
myClass = 'fa-square-o';
788+
myClass2 = ' not-checked';
789+
}
790+
str += "<div class='checkbox-line' data-selectorname='" + colName + "' data-index='" + colIndex + "' class='" + myClass2 + disabled + "'><div><a data-index='" + colName + "' class='fa check-green check-header " + myClass + disabled + " data-table-toggle-column'></a></div>" + tableCols[colIndex].sTitle + "</div>";
791+
}
792+
}
793+
dialog.find(".export-columns-selector .columns-wrapper").html(str);
794+
dialog.find(".export-columns-selector").css("display", "block");
795+
796+
797+
dialog.find('.columns-wrapper').slimScroll({
798+
height: '100%',
799+
start: 'top',
800+
wheelStep: 10,
801+
position: 'right',
802+
disableFadeOut: true
803+
});
804+
805+
$(".data-table-column-selector").on("click", function(e) {
806+
e.stopPropagation();
807+
});
808+
809+
dialog.find(".export-columns-selector").on("click", ".checkbox-line", function() {
810+
var checkbox = $(this).find("a").first();
811+
var isChecked = $(checkbox).hasClass("fa-check-square");//is now checked
812+
813+
if (isChecked) {
814+
$(checkbox).addClass("fa-square-o");
815+
$(checkbox).removeClass("fa-check-square");
816+
if ($(checkbox).hasClass("export-all-columns")) {
817+
dialog.find(".export-columns-selector").removeClass("hide-column-selectors");
818+
}
819+
}
820+
else {
821+
$(checkbox).removeClass("fa-square-o");
822+
$(checkbox).addClass("fa-check-square");
823+
if ($(checkbox).hasClass("export-all-columns")) {
824+
dialog.find(".export-columns-selector").addClass("hide-column-selectors");
825+
}
826+
}
827+
show_selected_column_count(dialog);
828+
});
829+
show_selected_column_count(dialog);
830+
}
831+
else {
832+
dialog.find(".export-columns-selector .columns-wrapper").html("");
833+
dialog.find(".export-columns-selector").css("display", "none");
740834
}
835+
741836
dialog.find(".button").click(function() {
742837
dialog.find(".button-selector .button").removeClass("selected");
743838
dialog.find(".button-selector .button").removeClass("active");
744839
$(this).addClass("selected");
745840
$(this).addClass("active");
746841
type = $(this).attr("id").replace("export-", "");
747842
});
748-
dialog.find(".segmentation-option").on("click", function() {
843+
/*dialog.find(".segmentation-option").on("click", function() {
749844
page = $(this).data("value");
750845
dialog.find(".export-data").removeClass("disabled");
751-
});
846+
});*/
752847
dialog.find(".export-data").click(function() {
753848
if ($(this).hasClass("disabled")) {
754849
return;
755850
}
756851
data.type = type;
757-
if (page !== -1) {
852+
data.limit = "";
853+
data.skip = 0;
854+
/*if (page !== -1) {
758855
data.limit = hardLimit;
759856
data.skip = page * hardLimit;
760857
}
761858
else {
762859
data.limit = "";
763860
data.skip = 0;
861+
}*/
862+
863+
delete data.projection;
864+
if (dialog.find(".export-columns-selector")) {
865+
if (dialog.find(".export-all-columns").hasClass("fa-check-square")) {
866+
//export all columns no need for projections
867+
}
868+
else {
869+
var projection = {};
870+
var checked = dialog.find('.columns-wrapper .fa-check-square');
871+
for (var kz = 0; kz < checked.length; kz++) {
872+
projection[$(checked[kz]).data("index")] = true;
873+
}
874+
875+
if (instance && instance.fixProjectionParams) {
876+
projection = instance.fixProjectionParams(projection);
877+
}
878+
data.projection = JSON.stringify(projection);
879+
}
764880
}
765881

882+
766883
var url = countlyCommon.API_URL + (exportByAPI ? "/o/export/request" : "/o/export/db");
767884
var form = $('<form method="POST" action="' + url + '">');
768885
$.each(data, function(k, v) {

frontend/express/public/javascripts/countly/countly.template.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -3034,21 +3034,26 @@ var AppRouter = Backbone.Router.extend({
30343034

30353035
if (exportAPIData || exportQueryData) {
30363036
//create export dialog
3037+
var position = 'right middle';
3038+
if (oSettings.oInstance && oSettings.oInstance.addColumnExportSelector === true) {
3039+
position = 'right top';
3040+
}
3041+
30373042
exportDrop = new CountlyDrop({
30383043
target: tableWrapper.find('.save-table-data')[0],
30393044
content: "",
3040-
position: 'right middle',
3045+
position: position,
30413046
classes: "server-export",
30423047
constrainToScrollParent: false,
30433048
remove: true,
30443049
openOn: "click"
30453050
});
30463051
exportDrop.on("open", function() {
30473052
if (exportAPIData) {
3048-
$(".server-export .countly-drop-content").empty().append(CountlyHelpers.export(oSettings._iRecordsDisplay, app[exportView].getExportAPI(oSettings.sTableId), null, true).removeClass("dialog"));
3053+
$(".server-export .countly-drop-content").empty().append(CountlyHelpers.export(oSettings._iRecordsDisplay, app[exportView].getExportAPI(oSettings.sTableId), null, true, oSettings.oInstance).removeClass("dialog"));
30493054
}
30503055
else if (exportQueryData) {
3051-
$(".server-export .countly-drop-content").empty().append(CountlyHelpers.export(oSettings._iRecordsDisplay, app[exportView].getExportQuery(oSettings.sTableId)).removeClass("dialog"));
3056+
$(".server-export .countly-drop-content").empty().append(CountlyHelpers.export(oSettings._iRecordsDisplay, app[exportView].getExportQuery(oSettings.sTableId), null, null, oSettings.oInstance).removeClass("dialog"));
30523057
}
30533058
exportDrop.position();
30543059
});

frontend/express/public/javascripts/countly/countly.views.js

+12
Original file line numberDiff line numberDiff line change
@@ -4211,6 +4211,7 @@ window.EventsBlueprintView = countlyView.extend({
42114211
countlyEvent.setActiveEvent(previousEvent);
42124212
}
42134213
this.template = Handlebars.compile($("#template-events-blueprint").html());
4214+
this.textLimit = 100;
42144215
},
42154216
pageScript: function() {
42164217
var self = this;
@@ -4400,6 +4401,10 @@ window.EventsBlueprintView = countlyView.extend({
44004401
if (eventName === "") {
44014402
eventName = event;
44024403
}
4404+
4405+
if (eventName.length > self.textLimit) {
4406+
eventName = eventName.substr(0, self.textLimit) + "...";
4407+
}
44034408
CountlyHelpers.confirm(jQuery.i18n.prop("events.general.want-delete-this", "<b>" + eventName + "</b>"), "popStyleGreen", function(result) {
44044409
if (!result) {
44054410
return true;
@@ -4623,8 +4628,15 @@ window.EventsBlueprintView = countlyView.extend({
46234628
else if (selected === "delete") {
46244629
var title = jQuery.i18n.map["events.general.want-delete-title"];
46254630
var msg = jQuery.i18n.prop("events.general.want-delete", "<b>" + nameList.join(", ") + "</b>");
4631+
if (nameList.join(", ").length > self.textLimit) {
4632+
var mz = jQuery.i18n.prop("events.delete.multiple-events", nameList.length);
4633+
msg = jQuery.i18n.prop("events.general.want-delete", "<b>" + mz + "</b>");
4634+
}
46264635
var yes_but = jQuery.i18n.map["events.general.yes-delete-events"];
46274636
if (changeList.length === 1) {
4637+
if (nameList[0].length > self.textLimit) {
4638+
nameList[0] = nameList[0].substr(0, self.textLimit) + "...";
4639+
}
46284640
msg = jQuery.i18n.prop("events.general.want-delete-this", "<b>" + nameList.join(", ") + "</b>");
46294641
title = jQuery.i18n.map["events.general.want-delete-this-title"];
46304642
yes_but = jQuery.i18n.map["events.general.yes-delete-event"];

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ events.edit.display-duration-description = A display name for the optional durat
442442
events.no-event = There are no events tracked for this application\!
443443
events.delete-confirm = You are about to delete all data associated with event "{0}". Do you want to continue?
444444
events.delete-confirm-many = You are about to delete all data associated with these events. Do you want to continue?
445+
events.delete.multiple-events = {0} events
445446
events.edit.omit-event-segments = Omit event segments
446447
events.edit.omit-event-segments-description = Choose which segments of this custom event to omit. Omitted segments will not be saved in the future and past data for these segments will be purged immediately after you save these settings.
447448
events.edit.omit-event-segments-description-drill = Data for these segments will still be stored in Drill.
@@ -475,7 +476,10 @@ export.export-as = Export as
475476
export.export-number = Total of {0} items divided into {1} export file(s)
476477
export.select = Select file to export
477478
export.export = Export
479+
export.columns-to-export = Columns to export
480+
export.export-all-columns = Export all columns
478481
export.documents = documents
482+
export.export-columns-selected-count = {0}/{1} selected
479483

480484
#management-applications
481485
management-applications.title = APPS
@@ -582,8 +586,8 @@ management-users.create-user = Create User
582586
management-users.delete-user = Delete User
583587
management-users.edit = Click to edit
584588
management-users.close = Click to close
585-
management-users.password-change-confirm = You have changed {0}\\''s password. Do you want a notification email to be sent?
586-
management-users.delete-confirm = You are about to delete {0}\\''s account. Do you want to continue?
589+
management-users.password-change-confirm = You have changed {0}\''s password. Do you want a notification email to be sent?
590+
management-users.delete-confirm = You are about to delete {0}\''s account. Do you want to continue?
587591
management-users.delete-confirm-title = Delete user?
588592
management-users.yes-delete-user = Yes, delete user
589593
management-users.email.invalid = invalid email

0 commit comments

Comments
 (0)