Skip to content

Commit c6f48f7

Browse files
committed
Merge branch 'master' into next
2 parents 2788e52 + 50becb0 commit c6f48f7

File tree

9 files changed

+59
-17
lines changed

9 files changed

+59
-17
lines changed

api/parts/mgmt/apps.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ appsApi.getAppsDetails = function(params) {
141141
created_at: params.app.created_at || 0,
142142
edited_at: params.app.edited_at || 0,
143143
plugins: params.app.plugins,
144-
last_data: (typeof last !== "undefined" && last.length) ? last[0].lac : 0,
144+
last_data: params.app.last_data,
145+
last_data_users: (typeof last !== "undefined" && last.length) ? last[0].lac : 0,
145146
},
146147
global_admin: global_admins || [],
147148
admin: admins || [],

api/utils/requestProcessor.js

+13
Original file line numberDiff line numberDiff line change
@@ -2506,6 +2506,19 @@ const validateAppForWriteAPI = (params, done, try_times) => {
25062506
params.app = app;
25072507
params.time = common.initTimeObj(params.appTimezone, params.qstring.timestamp);
25082508

2509+
2510+
var time = Date.now().valueOf();
2511+
time = Math.round((time || 0) / 1000);
2512+
if (params.app && (!params.app.last_data || params.app.last_data < time - 60 * 60 * 24)) { //update if more than day passed
2513+
//set new value
2514+
common.db.collection("apps").update({"_id": common.db.ObjectID(params.app._id)}, {"$set": {"last_data": time}}, function(err1) {
2515+
if (err1) {
2516+
console.log("Failed to update apps collection " + err1);
2517+
}
2518+
common.readBatcher.invalidate("apps", {"key": params.app.key}, {}, false); //because we load app by key on incoming requests. so invalidate also by key
2519+
});
2520+
}
2521+
25092522
if (!checksumSaltVerification(params)) {
25102523
return done ? done() : false;
25112524
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -2448,7 +2448,13 @@ window.ManageAppsView = countlyView.extend({
24482448
table += "<tr><td>" + jQuery.i18n.map["management-applications.app-creator"] + "</td><td class='details-value' colspan='2'>" + ((result.app.owner === "" || result.app.owner_id === "") ? jQuery.i18n.map["common.unknown"] : "<a href='#/manage/users/" + result.app.owner_id + "' class='table-link-user green'>" + result.app.owner + "</a>") + "</td></tr>";
24492449
table += "<tr><td>" + jQuery.i18n.map["management-applications.app-created-at"] + "</td><td class='details-value' colspan='2'>" + ((parseInt(result.app.created_at) === 0) ? jQuery.i18n.map["common.unknown"] : countlyCommon.formatTimeAgo(result.app.created_at)) + "</td></tr>";
24502450
table += "<tr><td>" + jQuery.i18n.map["management-applications.app-edited-at"] + "</td><td class='details-value' colspan='2'>" + ((parseInt(result.app.edited_at) === 0) ? jQuery.i18n.map["common.unknown"] : countlyCommon.formatTimeAgo(result.app.edited_at)) + "</td></tr>";
2451-
table += "<tr><td>" + jQuery.i18n.map["management-applications.app-last-data"] + "</td><td class='details-value' colspan='2'>" + ((parseInt(result.app.last_data) === 0) ? jQuery.i18n.map["common.unknown"] : countlyCommon.formatTimeAgo(result.app.last_data)) + "</td></tr>";
2451+
2452+
var ts = result.app.last_data;
2453+
if (Math.round(ts).toString().length === 10) {
2454+
ts *= 1000;
2455+
}
2456+
2457+
table += "<tr><td>" + jQuery.i18n.map["management-applications.app-last-data"] + "</td><td class='details-value' colspan='2'>" + ((parseInt(result.app.last_data) === 0) ? jQuery.i18n.map["common.unknown"] : moment(new Date(ts)).format("ddd, D MMM YYYY")) + "</td></tr>";
24522458
table += "<tr><td rowspan='3'>" + jQuery.i18n.map["management-applications.app-users"] + "</td>";
24532459
table += "<td class='second-header'>" + jQuery.i18n.map["management-applications.global_admins"] + " (" + result.global_admin.length + ")</td><td class='details-value'>" + joinUsers(result.global_admin) + "</td></tr>";
24542460
table += "<tr><td class='second-header'>" + jQuery.i18n.map["management-applications.admins"] + " (" + result.admin.length + ")</td><td class='details-value'>" + joinUsers(result.admin) + "</td></tr>";

plugins/push/api/parts/endpoints.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1207,7 +1207,7 @@ function cachedData(note) {
12071207
return common.returnMessage(params, 403, 'Only app / global admins are allowed to delete');
12081208
}
12091209

1210-
await note.update(common.db, {$bit: {'result.status': {or: N.Status.Deleted}}});
1210+
await note.update(common.db, {$bit: {'result.status': {or: N.Status.Deleted}}}).catch(log.w.bind(log, 'Error during message deletion'));
12111211
api.cache.remove(_id);
12121212
note.result.status |= N.Status.Deleted;
12131213

plugins/push/frontend/public/javascripts/component.push.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ window.component('push', function(push) {
100100
this.sent = m.prop(data.sent);
101101
this.sound = vprop(data.sound, function(v){ return !!v; }, t('pu.po.tab2.extras.sound.invalid'));
102102
this.badge = vprop(data.badge, function(v){ return v === undefined || ((v + '') === (parseInt(v) + '') && parseInt(v) >= 0); }, t('pu.po.tab2.extras.badge.invalid'));
103-
this.url = vprop(data.url, function(v){ return v && URL_REGEXP.test(v); }, t('pu.po.tab2.extras.url.invalid'));
103+
this.url = vprop(data.url, function(v){ return v && URL_REGEXP.test(v) && v[0] !== ' ' && v[v.length - 1] !== ' '; }, t('pu.po.tab2.extras.url.invalid'));
104104
this.data = vprop(typeof data.data === 'object' ? JSON.stringify(data.data) : data.data, function(v){
105105
try {
106106
var o = window.jsonlite.parse(v);
@@ -224,6 +224,9 @@ window.component('push', function(push) {
224224
var prop = m.prop(),
225225
f = function(){
226226
if (arguments.length) {
227+
if (arguments[0]) {
228+
arguments[0] = arguments[0].trim();
229+
}
227230
f.valid = false;
228231
prop(arguments[0]);
229232

@@ -403,9 +406,15 @@ window.component('push', function(push) {
403406
obj.sound = this.sound();
404407
obj.badge = this.badge();
405408
obj.url = this.url();
409+
if (obj.url) {
410+
obj.url = obj.url.trim();
411+
}
406412
obj.source = 'dash';
407413
obj.buttons = parseInt(this.buttons());
408414
obj.media = this.media();
415+
if (obj.media) {
416+
obj.media = obj.media.trim();
417+
}
409418
obj.autoOnEntry = this.autoOnEntry();
410419
obj.autoCancelTrigger = this.autoCancelTrigger();
411420
obj.autoCohorts = this.autoCohorts();

plugins/push/frontend/public/javascripts/component.push.popup.js

+15-4
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,9 @@ window.component('push.popup', function(popup) {
367367
k = (locale || activeLocale()) + (index === undefined ? (push.C.S + key) : (push.C.S + index + push.C.S + key));
368368

369369
if (arguments.length) {
370+
if (v && key === 'l') {
371+
v = v.trim();
372+
}
370373
message.messagePerLocale()[k] = v;
371374
}
372375

@@ -786,10 +789,18 @@ window.component('push.popup', function(popup) {
786789
{ value: true, title: t('pu.po.tab1.trigger-type.entry'), desc: t('pu.po.tab1.cohort-entry-desc') },
787790
{ value: false, title: t('pu.po.tab1.trigger-type.exit'), desc: t('pu.po.tab1.cohort-exit-desc') },
788791
{ value: 'events', title: t('pu.po.tab1.trigger-type.event'), desc: t('pu.po.tab1.cohort-event-desc') },
789-
], value: message.autoOnEntry, onchange: function(){
790-
message.autoEvents([]);
791-
message.autoCohorts([]);
792-
}
792+
], value: message.autoOnEntry, onchange: function(neo, old){
793+
neo = typeof neo === 'boolean';
794+
old = typeof old === 'boolean';
795+
if (neo ^ old) {
796+
message.autoEvents([]);
797+
message.autoCohorts([]);
798+
cohorts.forEach(function(c){ c.selected(false); });
799+
events.forEach(function(c){ c.selected(false); });
800+
this.selectCohorts.value([]);
801+
this.selectEvents.value([]);
802+
}
803+
}.bind(this)
793804
});
794805
this.selectEvents = new C.multiselect.controller({
795806
placeholder: t('pu.po.tab1.select-event-placeholder'),

plugins/push/frontend/public/javascripts/component.radio.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ window.component('radio', function(radio) {
1717
this.value = function(){
1818
if (arguments.length) {
1919
if (opts.onchange) {
20-
opts.onchange(arguments[0]);
20+
opts.onchange(arguments[0], val());
2121
}
2222
val(arguments[0]);
2323
}

plugins/views/frontend/public/heatmap.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
showHeatMap = Countly.passed_data.showHeatMap == false ? false : true,
77
clickMap,
88
scrollMap;
9+
10+
Countly.passed_data.url = Countly.passed_data.url || Countly.url;
911

10-
Countly._internals.loadCSS(Countly.url + "/stylesheets/ionicons/css/ionicons.min.css", function() {
11-
Countly._internals.loadCSS(Countly.url + "/views/stylesheets/heatmap.css", function() {
12+
Countly._internals.loadCSS(Countly.passed_data.url + "/stylesheets/ionicons/css/ionicons.min.css", function() {
13+
Countly._internals.loadCSS(Countly.passed_data.url + "/views/stylesheets/heatmap.css", function() {
1214
document.body.style.position = "relative";
1315
var origtop = document.body.style.top;
1416
var toppx = 59;
@@ -122,7 +124,7 @@
122124

123125
//TOPBAR IMAGE
124126
var img = document.createElement('img');
125-
img.src = Countly.url + "/images/dashboard/countly_logo.svg";
127+
img.src = Countly.passed_data.url + "/images/dashboard/countly_logo.svg";
126128
img.setAttribute('class', 'cly-heatmap-logo');
127129
topbar.appendChild(img);
128130

@@ -509,7 +511,7 @@
509511
period = Countly.passed_data.period || "30days",
510512
dataCache = {};
511513

512-
Countly._internals.loadJS(Countly.url + "/views/javascripts/simpleheat.js", function() {
514+
Countly._internals.loadJS(Countly.passed_data.url + "/views/javascripts/simpleheat.js", function() {
513515
map = simpleheat("cly-heatmap-canvas-map");
514516
return cb(function(eventType, pageWidth, pageHeight, currentDevice, showHeatMap) {
515517
map.resize();
@@ -573,7 +575,7 @@
573575
period = Countly.passed_data.period || "30days",
574576
dataCache = {};
575577

576-
Countly._internals.loadJS(Countly.url + "/views/javascripts/simpleheat.js", function() {
578+
Countly._internals.loadJS(Countly.passed_data.url + "/views/javascripts/simpleheat.js", function() {
577579
map = simpleheat("cly-heatmap-canvas-map");
578580
return cb(function(eventType, pageWidth, pageHeight, currentDevice, showHeatMap) {
579581
map.resize();
@@ -741,10 +743,10 @@
741743
}
742744

743745
if (method === "GET") {
744-
xhr.open('GET', Countly.url + apiPath + "?" + data, true);
746+
xhr.open('GET', Countly.passed_data.url + apiPath + "?" + data, true);
745747
}
746748
else {
747-
xhr.open('POST', Countly.url + apiPath, true);
749+
xhr.open('POST', Countly.passed_data.url + apiPath, true);
748750
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
749751
}
750752
xhr.setRequestHeader("countly-token", Countly._internals.getToken());

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ window.ViewsView = countlyView.extend({
421421
countlyTokenManager.createToken("View heatmap", "/o/actions", true, countlyCommon.ACTIVE_APP_ID, 1800, function(err, token) {
422422
self.token = token && token.result;
423423
if (self.token) {
424-
newWindow.name = "cly:" + JSON.stringify({"token": self.token, "purpose": "heatmap", period: countlyCommon.getPeriodForAjax(), showHeatMap: true, app_key: countlyCommon.ACTIVE_APP_KEY});
424+
newWindow.name = "cly:" + JSON.stringify({"token": self.token, "purpose": "heatmap", period: countlyCommon.getPeriodForAjax(), showHeatMap: true, app_key: countlyCommon.ACTIVE_APP_KEY, url: window.location.protocol + "//" + window.location.host});
425425
newWindow.location.href = url;
426426
}
427427
});

0 commit comments

Comments
 (0)