Skip to content

Commit fb7fff6

Browse files
authored
Merge branch 'master' into ar2rsawseen/master2
2 parents 8e2ae4d + 9ece661 commit fb7fff6

File tree

30 files changed

+2633
-804
lines changed

30 files changed

+2633
-804
lines changed

.github/workflows/main.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,13 @@ jobs:
278278
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O /tmp/chrome.deb
279279
apt install -y /tmp/chrome.deb
280280
281+
- name: Install Sharp dependencies for image processing
282+
shell: bash
283+
run: |
284+
export DEBIAN_FRONTEND=noninteractive
285+
apt-get update -y
286+
apt-get install -y libvips-dev
287+
281288
- name: Copy code
282289
shell: bash
283290
run: cp -rf ./* /opt/countly
@@ -331,6 +338,6 @@ jobs:
331338
working-directory: /opt/countly/ui-tests/cypress
332339
run: |
333340
ARTIFACT_ARCHIVE_NAME="$(date '+%Y%m%d-%H.%M')_${GITHUB_REPOSITORY#*/}_CI#${{ github.run_number }}_${{ matrix.test_type }}.tar.gz"
334-
mkdir -p screenshots videos
335-
tar zcvf "$ARTIFACT_ARCHIVE_NAME" screenshots videos
341+
mkdir -p screenshots videos downloads
342+
tar zcvf "$ARTIFACT_ARCHIVE_NAME" screenshots videos downloads
336343
curl -o /tmp/uploader.log -u "${{ secrets.BOX_UPLOAD_AUTH }}" ${{ secrets.BOX_UPLOAD_PATH }} -T "$ARTIFACT_ARCHIVE_NAME"

CHANGELOG.md

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,40 @@
1-
## Version 25.03.xx
1+
## Version 25.03.28
2+
Fixes:
3+
- [alerts] Add alert interval validation in the frontend
4+
- [events] Correctly navigate to event groupmin events menu
5+
6+
Enterprise Fixes:
7+
- [applications] Ensure application management list reorders after create/update
8+
- [concurrent_users] Fix email check for alert
9+
- [dashboards] Keep dashboard sidebar sorted alphabetically after additions
10+
- [data-manager] Correctly show last triggered for events if data masking is enabled
11+
12+
## Version 25.03.27
13+
Fixes:
14+
- [core-vis] Fix chart legend click event
15+
- [push] Fixed the options of the request being made during mime detection
16+
- [views] Fix view name that is displayed in view table
17+
- [data-manager] Fix last modified data for event and segment
18+
19+
Enterprise Fixes:
20+
- [concurrent_users] Fix alert threshold comparison
21+
- [dashboards] Add setting to disable public dashboards
22+
- [surveys] Handle multiple survey submission from same user based on survey visibility
23+
- [users] Display user property limits in user profiles when exceeded
24+
- [users] Set correct users widget table rows amount according to selected setting
25+
26+
## Version 25.03.26
227
Fixes:
328
- [push] Fixed timeout setting
429
- [security] Fixed injection possibility on res.expose
530

31+
Enterprise Fixes:
32+
- [data-manager] Fixed bug when merging events with ampersand symbol in the name
33+
- [groups] Add logs for user updates
34+
- [nps] Sort widgets by internal name and search by name or internal name
35+
- [surveys] Change question map log to debug log
36+
- [surveys] Sort widgets by internal name and search by name or internal name
37+
638
Dependencies:
739
- Bump axios from 1.12.2 to 1.13.1 in /plugins/cognito
840
- Bump csvtojson from 1.1.12 to 2.0.14
@@ -23,7 +55,7 @@ Fixes:
2355
Enterprise Fixes:
2456
- [ab-testing] Add script for fixing variant cohort
2557
- [groups] Fix user permission update after updating user group permission
26-
58+
- [funnels] Fixed delete confirmation using correct button copy
2759

2860
## Version 25.03.24
2961
Fixes:

api/parts/data/fetch.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ fetch.fetchEventGroups = function(params) {
137137
fetch.fetchMergedEventGroups = function(params) {
138138
const { qstring: { event } } = params;
139139
fetch.getMergedEventGroups(params, event, {}, function(result) {
140+
result = result || {};
141+
result.eventName = params.qstring.event;
140142
common.returnOutput(params, result);
141143
});
142144
};

bin/scripts/export-data/setting_limits_and_real_values.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ const DEFAULT_LIMITS = {
1919
view_name_limit: 128,
2020
view_segment_limit: 100,
2121
view_segment_value_limit: 10,
22-
//custom_prop_limit: 20,
23-
custom_property_limit: 20,
22+
custom_prop_limit: 20,
23+
//custom_property_limit: 20,
2424
custom_prop_value_limit: 50,
2525
};
2626
Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) {
@@ -56,8 +56,8 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
5656
view_name_limit: pluginsCollectionPlugins?.views?.view_name_limit || DEFAULT_LIMITS.view_name_limit,
5757
view_segment_limit: pluginsCollectionPlugins?.views?.segment_limit || DEFAULT_LIMITS.view_segment_limit,
5858
view_segment_value_limit: pluginsCollectionPlugins?.views?.segment_value_limit || DEFAULT_LIMITS.view_segment_value_limit,
59-
//custom_prop_limit: pluginsCollectionPlugins?.users?.custom_prop_limit || DEFAULT_LIMITS.custom_prop_limit,
60-
custom_property_limit: pluginsCollectionPlugins?.drill?.custom_property_limit || DEFAULT_LIMITS.custom_property_limit,
59+
custom_prop_limit: pluginsCollectionPlugins?.users?.custom_prop_limit || DEFAULT_LIMITS.custom_prop_limit,
60+
//custom_property_limit: pluginsCollectionPlugins?.drill?.custom_property_limit || DEFAULT_LIMITS.custom_property_limit,
6161
custom_prop_value_limit: pluginsCollectionPlugins?.users?.custom_set_limit || DEFAULT_LIMITS.custom_prop_value_limit,
6262
};
6363
// GETTING REAL DATA PER APP
@@ -247,10 +247,10 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
247247
});
248248
app_results['View Segments Unique Values'] = {"default": defaultVal, "set": currentVal, "real": realVal};
249249
// USER PROPERTIES
250-
//defaultVal = DEFAULT_LIMITS.custom_prop_limit;
251-
//currentVal = CURRENT_LIMITS.custom_prop_limit;
252-
defaultVal = DEFAULT_LIMITS.custom_property_limit;
253-
currentVal = CURRENT_LIMITS.custom_property_limit;
250+
defaultVal = DEFAULT_LIMITS.custom_prop_limit;
251+
currentVal = CURRENT_LIMITS.custom_prop_limit;
252+
//defaultVal = DEFAULT_LIMITS.custom_property_limit;
253+
//currentVal = CURRENT_LIMITS.custom_property_limit;
254254
realVal = customPropsPerApp && customPropsPerApp[0]?.customPropertiesCount || 0;
255255
app_results['Max user custom properties'] = {"default": defaultVal, "set": currentVal, "real": realVal};
256256
// VALUES IN AN ARRAY FOR ONE USER PROPERTY

countly-community

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit f772bcd2c0e918dcf337ef3d978efbaa986bd882

frontend/express/public/core/app-management/javascripts/countly.views.js

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,12 @@
5959
value: id
6060
};
6161
});
62-
if (countlyGlobal.member.appSortList) {
63-
appList = this.sortBy(appList, countlyGlobal.member.appSortList);
62+
var sortList = (countlyGlobal.member && countlyGlobal.member.appSortList) || [];
63+
if (sortList.length) {
64+
appList = this.sortBy(appList, sortList);
6465
}
6566
else {
66-
appList.sort(function(a, b) {
67-
return a.label > b.label && 1 || -1;
68-
});
67+
appList.sort(this.sortAppOptionsAlphabetically);
6968
}
7069
var app_id = this.$route.params.app_id || countlyCommon.ACTIVE_APP_ID;
7170
return {
@@ -340,6 +339,56 @@
340339
}
341340
}
342341
},
342+
getAppListItemId: function(option) {
343+
if (!option) {
344+
return "";
345+
}
346+
347+
return (option._id || option.value || option.id || option.app_id || "") + "";
348+
},
349+
sortAppOptionsAlphabetically: function(optionA, optionB) {
350+
var labelA = (optionA.label || "").toLowerCase();
351+
var labelB = (optionB.label || "").toLowerCase();
352+
353+
if (labelA < labelB) {
354+
return -1;
355+
}
356+
357+
if (labelA > labelB) {
358+
return 1;
359+
}
360+
361+
var valueA = (optionA.value || "").toLowerCase();
362+
var valueB = (optionB.value || "").toLowerCase();
363+
364+
if (valueA < valueB) {
365+
return -1;
366+
}
367+
368+
if (valueA > valueB) {
369+
return 1;
370+
}
371+
372+
return 0;
373+
},
374+
applyAppListOrdering: function() {
375+
if (!Array.isArray(this.appList)) {
376+
return;
377+
}
378+
379+
var sortList = (countlyGlobal.member && countlyGlobal.member.appSortList) || [];
380+
var currentList = this.appList.slice();
381+
var orderedList;
382+
383+
if (sortList.length) {
384+
orderedList = this.sortBy(currentList, sortList);
385+
}
386+
else {
387+
orderedList = currentList.sort(this.sortAppOptionsAlphabetically);
388+
}
389+
390+
this.appList = orderedList;
391+
},
343392
sortBy: function(arrayToSort, sortList) {
344393
if (!sortList.length) {
345394
return arrayToSort;
@@ -349,9 +398,10 @@
349398
retArr = [];
350399
var i;
351400
for (i = 0; i < arrayToSort.length; i++) {
352-
var objId = arrayToSort[i]._id + "";
353-
if (sortList.indexOf(objId) !== -1) {
354-
tmpArr[sortList.indexOf(objId)] = arrayToSort[i];
401+
var objId = this.getAppListItemId(arrayToSort[i]);
402+
var desiredIndex = sortList.indexOf(objId);
403+
if (desiredIndex !== -1) {
404+
tmpArr[desiredIndex] = arrayToSort[i];
355405
}
356406
}
357407

@@ -392,6 +442,7 @@
392442
value: data._id + "",
393443
label: data.name
394444
});
445+
self.applyAppListOrdering();
395446
self.$store.dispatch("countlyCommon/addToAllApps", data);
396447
self.$store.dispatch("countlyCommon/updateActiveApp", data._id + "");
397448
countlyCommon.setActiveApp(data._id);
@@ -459,6 +510,7 @@
459510
break;
460511
}
461512
}
513+
self.applyAppListOrdering();
462514
self.discardForm();
463515
CountlyHelpers.notify({
464516
title: jQuery.i18n.map["configs.changed"],

frontend/express/public/core/events/javascripts/countly.details.models.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,13 @@
902902
res.list = res.list.map(eventName => countlyCommon.unescapeHtml(eventName));
903903
}
904904
context.commit("setAllEventsData", res);
905-
if ((!context.state.selectedEventName) || (res.map && res.map[context.state.selectedEventName] && !res.map[context.state.selectedEventName].is_visible) || (res.list && res.list.indexOf(context.state.selectedEventName) === -1)) {
905+
var is_group = false;
906+
if (context.state.selectedEventName && context.state.selectedEventName.startsWith('[CLY]_group')) {
907+
is_group = true;
908+
}
909+
if ((!context.state.selectedEventName) ||
910+
(res.map && res.map[context.state.selectedEventName] && !res.map[context.state.selectedEventName].is_visible) ||
911+
(res.list && res.list.indexOf(context.state.selectedEventName) === -1 && context.state && !is_group)) {
906912
var appId = countlyCommon.ACTIVE_APP_ID;
907913
var eventKeyForStorage = {};
908914
var eventKey = res.list[0];

0 commit comments

Comments
 (0)