From 1b90fc686779ea750f051192626b5729aa9bd71f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 01:32:50 +0000 Subject: [PATCH 01/41] Bump mongodb from 6.17.0 to 6.18.0 Bumps [mongodb](https://github.com/mongodb/node-mongodb-native) from 6.17.0 to 6.18.0. - [Release notes](https://github.com/mongodb/node-mongodb-native/releases) - [Changelog](https://github.com/mongodb/node-mongodb-native/blob/main/HISTORY.md) - [Commits](https://github.com/mongodb/node-mongodb-native/compare/v6.17.0...v6.18.0) --- updated-dependencies: - dependency-name: mongodb dependency-version: 6.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb676d5c182..9640f7eb663 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "method-override": "3.0.0", "moment": "2.30.1", "moment-timezone": "0.6.0", - "mongodb": "6.17.0", + "mongodb": "6.18.0", "nginx-conf": "2.1.0", "nodemailer": "7.0.5", "object-hash": "3.0.0", @@ -9528,9 +9528,9 @@ } }, "node_modules/mongodb": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", - "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz", + "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", diff --git a/package.json b/package.json index eeaadca6484..7b23295ab62 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "method-override": "3.0.0", "moment": "2.30.1", "moment-timezone": "0.6.0", - "mongodb": "6.17.0", + "mongodb": "6.18.0", "nginx-conf": "2.1.0", "nodemailer": "7.0.5", "object-hash": "3.0.0", From b2e5df2d2803cb271d3f8a043234393ede49cdb2 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Wed, 23 Jul 2025 10:51:41 +0700 Subject: [PATCH 02/41] [core] Update app version log --- api/parts/data/usage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/parts/data/usage.js b/api/parts/data/usage.js index ce3b2a847d3..0b03e0599de 100644 --- a/api/parts/data/usage.js +++ b/api/parts/data/usage.js @@ -1121,7 +1121,7 @@ plugins.register("/sdk/user_properties", async function(ob) { userProps.av_build = versionComponents.build; } else { - log.w("Invalid app version format: %s", params.qstring.metrics._app_version); + log.d("App version %s is not a valid semantic version. It cannot be separated into semantic version parts", params.qstring.metrics._app_version); userProps.av_major = null; userProps.av_minor = null; userProps.av_patch = null; From 1190d1a1490c64844942d72d3fcd1e0d1b90dd47 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Wed, 23 Jul 2025 11:04:17 +0700 Subject: [PATCH 03/41] [populator] Update get version to generate valid semantic version --- .../frontend/public/javascripts/countly.models.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/populator/frontend/public/javascripts/countly.models.js b/plugins/populator/frontend/public/javascripts/countly.models.js index ae043b6efeb..6b1e0484ada 100644 --- a/plugins/populator/frontend/public/javascripts/countly.models.js +++ b/plugins/populator/frontend/public/javascripts/countly.models.js @@ -337,9 +337,13 @@ d = moment(seed); } } - var year = trimYear ? d.format('YY')[1] : d.format('YY'); + + var year = d.format('YY'); + if (trimYear || year[0] === '0') { + year = d.format('YY')[1]; + } var day = parseInt(d.format('DD')[0], 10) === 3 ? 2 : d.format('DD')[0]; - return year + "." + d.format('MM') + "." + day; + return year + '.' + d.format('M') + '.' + day; } /** * @@ -2944,4 +2948,4 @@ }; countlyPopulator.defaultTemplates = defaultTemplates; -}(window.countlyPopulator = window.countlyPopulator || {})); \ No newline at end of file +}(window.countlyPopulator = window.countlyPopulator || {})); From 9a618f2c936a64442a46f2f8b74906eda2c3d20e Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Wed, 23 Jul 2025 11:42:06 +0700 Subject: [PATCH 04/41] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c159c68e2b6..a0161871dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Fixes: - [crashes] Fix free session and free user calculation - [dashboards] Delete associated widgets and reports when a dashboard is removed - [star-rating] Fix widget close post message +- [core] Adjust level and update content of app version log +- [populator] Update getVersion to generate valid semantic version Enterprise Fixes: - [crash_symbolication] Remove auto symbolication setting From 67e0e08b2f5e35ec8d2b313cd20bdff4823650a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 01:58:43 +0000 Subject: [PATCH 05/41] Bump puppeteer from 24.14.0 to 24.15.0 Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 24.14.0 to 24.15.0. - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.14.0...puppeteer-v24.15.0) --- updated-dependencies: - dependency-name: puppeteer dependency-version: 24.15.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index bb676d5c182..bbe7b56aea0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3629,9 +3629,9 @@ } }, "node_modules/chromium-bidi": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.1.1.tgz", - "integrity": "sha512-L2BKQ0rSLADgbPMIdDh3wnYHs3EiUiMay2Sq0CTolheaADmWIf6Pe+T9LJRcnh5rcMz0U7MVk0cQVvKsGRMa1g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.2.0.tgz", + "integrity": "sha512-gREyhyBstermK+0RbcJLbFhcQctg92AGgDe/h/taMJEOLRdtSswBAO9KmvltFSQWgM2LrwWu5SIuEUbdm3JsyQ==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -11103,17 +11103,17 @@ } }, "node_modules/puppeteer": { - "version": "24.14.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.14.0.tgz", - "integrity": "sha512-GB7suRDkp9pUnxpNGAORICQCtw11KFbg6U2iJXVTflzJLK5D1qzq8xOOmLgN/QnDBpDMdpn96ri52XkuN83Giw==", + "version": "24.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.15.0.tgz", + "integrity": "sha512-HPSOTw+DFsU/5s2TUUWEum9WjFbyjmvFDuGHtj2X4YUz2AzOzvKMkT3+A3FR+E+ZefiX/h3kyLyXzWJWx/eMLQ==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.6", - "chromium-bidi": "7.1.1", + "chromium-bidi": "7.2.0", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1464554", - "puppeteer-core": "24.14.0", + "puppeteer-core": "24.15.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -11124,13 +11124,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.14.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.14.0.tgz", - "integrity": "sha512-NO9XpCl+i8oB0zJp81iPhzMo2QK8/JTj4ramSvTpGCo9CPCNo4AZ8qVOGpSgXzlcOfOT3VHOkzTfPo08GOE5jA==", + "version": "24.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.15.0.tgz", + "integrity": "sha512-2iy0iBeWbNyhgiCGd/wvGrDSo73emNFjSxYOcyAqYiagkYt5q4cPfVXaVDKBsukgc2fIIfLAalBZlaxldxdDYg==", "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.10.6", - "chromium-bidi": "7.1.1", + "chromium-bidi": "7.2.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1464554", "typed-query-selector": "^2.12.0", From 008fa056bcd63635cff263f8d08ebf5916bddc5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 11:12:44 +0000 Subject: [PATCH 06/41] Bump supertest from 7.1.3 to 7.1.4 Bumps [supertest](https://github.com/ladjs/supertest) from 7.1.3 to 7.1.4. - [Release notes](https://github.com/ladjs/supertest/releases) - [Commits](https://github.com/ladjs/supertest/compare/v7.1.3...v7.1.4) --- updated-dependencies: - dependency-name: supertest dependency-version: 7.1.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 35 +++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index bbe7b56aea0..285a8c5e418 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,7 +83,7 @@ "mocha": "10.8.2", "nyc": "17.1.0", "should": "13.2.3", - "supertest": "7.1.3", + "supertest": "7.1.4", "typescript": "^5.8.2" } }, @@ -3931,6 +3931,7 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -4071,7 +4072,8 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", @@ -5500,7 +5502,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", @@ -12449,20 +12452,21 @@ } }, "node_modules/superagent": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.2.tgz", - "integrity": "sha512-vWMq11OwWCC84pQaFPzF/VO3BrjkCeewuvJgt1jfV0499Z1QSAWN4EqfMM5WlFDDX9/oP8JjlDKpblrmEoyu4Q==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", + "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", "dev": true, + "license": "MIT", "dependencies": { - "component-emitter": "^1.3.0", + "component-emitter": "^1.3.1", "cookiejar": "^2.1.4", - "debug": "^4.3.4", + "debug": "^4.3.7", "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "formidable": "^3.5.4", "methods": "^1.1.2", "mime": "2.6.0", - "qs": "^6.11.0" + "qs": "^6.11.2" }, "engines": { "node": ">=14.18.0" @@ -12473,6 +12477,7 @@ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, + "license": "MIT", "dependencies": { "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", @@ -12490,6 +12495,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -12498,13 +12504,14 @@ } }, "node_modules/supertest": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.3.tgz", - "integrity": "sha512-ORY0gPa6ojmg/C74P/bDoS21WL6FMXq5I8mawkEz30/zkwdu0gOeqstFy316vHG6OKxqQ+IbGneRemHI8WraEw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", + "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", "dev": true, + "license": "MIT", "dependencies": { "methods": "^1.1.2", - "superagent": "^10.2.2" + "superagent": "^10.2.3" }, "engines": { "node": ">=14.18.0" diff --git a/package.json b/package.json index eeaadca6484..aae32e85f36 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "mocha": "10.8.2", "nyc": "17.1.0", "should": "13.2.3", - "supertest": "7.1.3", + "supertest": "7.1.4", "typescript": "^5.8.2" }, "dependencies": { From c4358144bbc7fc8dd26f7b22aed7bd54c3f9f743 Mon Sep 17 00:00:00 2001 From: Cookiezaurs <> Date: Thu, 24 Jul 2025 14:28:46 +0300 Subject: [PATCH 07/41] [core] Use correct rights validation for loyality --- api/utils/requestProcessor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/utils/requestProcessor.js b/api/utils/requestProcessor.js index 6a6450f00cc..707eca00467 100644 --- a/api/utils/requestProcessor.js +++ b/api/utils/requestProcessor.js @@ -1567,7 +1567,7 @@ const processRequest = (params) => { common.returnMessage(params, 400, 'Missing parameter "app_id"'); return false; } - validateUserForMgmtReadAPI(countlyApi.mgmt.appUsers.loyalty, params); + validateUserForRead(params, countlyApi.mgmt.appUsers.loyalty); break; } /** From bc17315095c1a4f2e12580ef029f01a9aee01b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Thu, 24 Jul 2025 14:39:58 +0300 Subject: [PATCH 08/41] feat: Add configuration warning tags to settings UI --- CHANGELOG.md | 5 + .../public/javascripts/countly.models.js | 234 ++++++++++++++++++ .../public/javascripts/countly.views.js | 11 + .../public/localization/plugins.properties | 7 + .../public/templates/configurations.html | 24 +- 5 files changed, 279 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f7f92601f6..c242dcdcc0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## Version 25.03.XX + +Features: +- [plugins] Add configuration warning tags to settings UI + ## Version 25.03.11 Fixes: - [core] Fix mongo connection url parsing diff --git a/plugins/plugins/frontend/public/javascripts/countly.models.js b/plugins/plugins/frontend/public/javascripts/countly.models.js index 0b8bf80a186..ea8626df8c0 100644 --- a/plugins/plugins/frontend/public/javascripts/countly.models.js +++ b/plugins/plugins/frontend/public/javascripts/countly.models.js @@ -7,6 +7,7 @@ var _userConfigsData = {}; var _themeList = []; var _graph = {}; + var _configWarnings = null; //Public Methods countlyPlugins.initialize = function() { @@ -307,4 +308,237 @@ }); }; + // Warning types and their associated colors + var WARNING_TYPES = { + DATA_INGESTION: 'dataIngestion', + UI_FILTERING: 'uiFiltering', + SERVER_PERFORMANCE: 'serverPerformance' + // SECURITY_IMPACT: 'securityImpact' // for the 2nd phase + }; + + // Tooltip color mappings + var TOOLTIP_COLORS = { + dataIngestion: "color-yellow-100", + uiFiltering: "color-blue-100", + serverPerformance: "color-red-100" + }; + + /** + * Helper function to create warning objects + * @param {string} type - Warning type + * @param {string} textKey - Warning text key + * @returns {Object} Warning object with type and text + */ + function createWarning(type, textKey) { + return { + type: type, + text: textKey + }; + } + + // Predefined warning combinations + var WARNING_COMBINATIONS = { + DATA_INGESTION: [ + createWarning(WARNING_TYPES.DATA_INGESTION, "configs.tooltip.data-ingestion-warning") + ], + UI_FILTERING: [ + createWarning(WARNING_TYPES.UI_FILTERING, "configs.tooltip.ui-filtering-warning") + ], + SERVER_PERFORMANCE: [ + createWarning(WARNING_TYPES.SERVER_PERFORMANCE, "configs.tooltip.server-performance-warning") + ] + }; + + /** + * Initialize configuration warnings + * @returns {Object} Configuration warnings map + */ + function initializeConfigWarnings() { + if (_configWarnings !== null) { + return _configWarnings; + } + + var configWarnings = { + // API Core Configurations + "api.trim_trailing_ending_spaces": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.event_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.event_segmentation_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.event_segmentation_value_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.metric_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.session_duration_limit": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.array_list_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.city_data": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "api.country_data": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + // Logging Configurations + "logs.default": WARNING_COMBINATIONS.UI_FILTERING, + + // Plugin-specific Configurations + "attribution.segment_value_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "crashes.report_limit": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "crashes.max_custom_field_keys": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "crashes.smart_regexes": WARNING_COMBINATIONS.UI_FILTERING, + + "drill.list_limit": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "drill.custom_property_limit": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "drill.projection_limit": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "drill.big_list_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "flows.maxDepth": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "flows.nodesCn": [ + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "hooks.requestLimit": [ + ...WARNING_COMBINATIONS.DATA_INGESTION + ], + + "logger.limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "logger.state": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "remote-config.conditions_per_paramaeters": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "remote-config.maximum_allowed_parameters": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "sources.sources_length_limit": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "users.custom_prop_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "users.custom_set_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "views.segment_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "views.segment_value_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "views.view_limit": [ + ...WARNING_COMBINATIONS.SERVER_PERFORMANCE, + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "views.view_name_limit": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + + "data-manager.globalValidationAction": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "data-manager.segmentLevelValidationAction": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ], + "data-manager.enableDataMasking": [ + ...WARNING_COMBINATIONS.DATA_INGESTION, + ...WARNING_COMBINATIONS.UI_FILTERING + ] + }; + + _configWarnings = configWarnings; + return _configWarnings; + } + + countlyPlugins.getConfigWarnings = function(configGroup, key) { + var warnings = initializeConfigWarnings(); + var mapKey = configGroup + "." + key; + return warnings[mapKey] || []; + }; + + countlyPlugins.getTooltipColors = function() { + return TOOLTIP_COLORS; + }; + + countlyPlugins.getTooltipLabel = function(type) { + var labels = { + dataIngestion: CV.i18n('configs.tooltip.data-ingestion'), + uiFiltering: CV.i18n('configs.tooltip.ui-filtering'), + serverPerformance: CV.i18n('configs.tooltip.server-performance') + }; + return labels[type] || 'Unknown Type'; + }; + }(window.countlyPlugins = window.countlyPlugins || {}, jQuery)); diff --git a/plugins/plugins/frontend/public/javascripts/countly.views.js b/plugins/plugins/frontend/public/javascripts/countly.views.js index 9c01f0da1f8..2fd7c244b1e 100644 --- a/plugins/plugins/frontend/public/javascripts/countly.views.js +++ b/plugins/plugins/frontend/public/javascripts/countly.views.js @@ -534,6 +534,17 @@ getConfigType: function(id) { return this.coreDefaults.includes(id) ? "Core" : "Plugins"; }, + getWarningTags(configGroup, key) { + var warnings = countlyPlugins.getConfigWarnings(configGroup, key); + var tooltipColors = countlyPlugins.getTooltipColors(); + return warnings.map(function(warning) { + return { + tooltipText: CV.i18n(warning.text), + color: tooltipColors[warning.type], + label: countlyPlugins.getTooltipLabel(warning.type) + }; + }); + }, checkIfOverwritten: function(id, ns) { ns = ns || this.selectedConfig; var configsData = countlyPlugins.getConfigsData(); diff --git a/plugins/plugins/frontend/public/localization/plugins.properties b/plugins/plugins/frontend/public/localization/plugins.properties index 227e38e26ef..e128a5254fb 100644 --- a/plugins/plugins/frontend/public/localization/plugins.properties +++ b/plugins/plugins/frontend/public/localization/plugins.properties @@ -243,5 +243,12 @@ configs.help.push-proxyuser = (if needed) Username for proxy server HTTP Basic a configs.help.push-proxypass = (if needed) Password for proxy server HTTP Basic authentication configs.help.push-proxyunauthorized = (if needed) Allow self signed certificates without CA installed +configs.tooltip.server-performance-warning = Adjusting this value may impact system performance +configs.tooltip.data-ingestion-warning = Adjusting this value may affect data processing +configs.tooltip.ui-filtering-warning = Adjusting this value controls how much data is shown in the UI +configs.tooltip.data-ingestion = Data Processing +configs.tooltip.ui-filtering = UI Display +configs.tooltip.server-performance = Performance Impact + systemlogs.action.change_configs = Setting Changed systemlogs.action.change_plugins = Plugins Changed diff --git a/plugins/plugins/frontend/public/templates/configurations.html b/plugins/plugins/frontend/public/templates/configurations.html index e0c933ceb65..420f7c52b23 100755 --- a/plugins/plugins/frontend/public/templates/configurations.html +++ b/plugins/plugins/frontend/public/templates/configurations.html @@ -51,8 +51,28 @@

-

{{getLabelName(key)}}

-

+
+
+ + {{ tag.label }} +
+
+
+
+ {{ getLabelName(key) }} +
+
+

From 7ed607978efc4c00c01e0184b6ce118211560a13 Mon Sep 17 00:00:00 2001 From: Anna Sosina Date: Thu, 24 Jul 2025 15:19:02 +0300 Subject: [PATCH 09/41] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f7f92601f6..f5e6265ba94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Version 25.03.XX +Fixes: +-[core] Use correct rights validation for loyality + ## Version 25.03.11 Fixes: - [core] Fix mongo connection url parsing From 8fe3209c9dee5e86bb6bb8c24b319253267f8330 Mon Sep 17 00:00:00 2001 From: Anna Sosina Date: Thu, 24 Jul 2025 15:20:58 +0300 Subject: [PATCH 10/41] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5e6265ba94..25a64e8a6ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## Version 25.03.XX Fixes: --[core] Use correct rights validation for loyality +- [core] Use correct rights validation for loyality ## Version 25.03.11 Fixes: From 7d468154588dca3dc09ef6831461ae9a0057c559 Mon Sep 17 00:00:00 2001 From: Meghana M R <86944692+mrmeghana@users.noreply.github.com> Date: Thu, 24 Jul 2025 18:00:59 +0530 Subject: [PATCH 11/41] Update setting_limits_and_real_values.js modified it to query in events_data and also made some improvements --- .../setting_limits_and_real_values.js | 67 ++++--------------- 1 file changed, 12 insertions(+), 55 deletions(-) diff --git a/bin/scripts/export-data/setting_limits_and_real_values.js b/bin/scripts/export-data/setting_limits_and_real_values.js index 116e97c1744..a6bb00b15c6 100644 --- a/bin/scripts/export-data/setting_limits_and_real_values.js +++ b/bin/scripts/export-data/setting_limits_and_real_values.js @@ -4,7 +4,6 @@ * Path: $(countly dir)/bin/scripts/export-data * Command: node setting_limits_and_real_values.js */ - const fs = require('fs'); const crypto = require('crypto'); const common = require('../../../api/utils/common.js'); @@ -20,10 +19,10 @@ const DEFAULT_LIMITS = { view_name_limit: 128, view_segment_limit: 100, view_segment_value_limit: 10, - custom_prop_limit: 20, + //custom_prop_limit: 20, + custom_property_limit:20, custom_prop_value_limit: 50, }; - Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { console.log("Connected to databases..."); common.db = countlyDb; @@ -36,21 +35,17 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" else { // WRITE START OF ARRAY WriteStream.write('[\n', 'utf8'); - // GETTING DATA FOR SET LIMITS FOR EVENTS, VIEWS, AND CUSTOM PROPERTIES var pluginsCollectionPlugins = await countlyDb.collection("plugins").findOne({"_id": 'plugins'}); - // LOOP APPS FOR EACH REQUIREMENT for (let i = 0; i < apps.length; i++) { var app = apps[i]; console.log(i + 1, ") Processing app:", app.name); - try { var app_results = { "App Name": app.name }, defaultVal, realVal, currentVal; - // SETTING UP CURRENT SET LIMITS PER APP var appsCollectionPerApp = await countlyDb.collection("apps").findOne({"_id": common.db.ObjectID(app._id)}); var CURRENT_LIMITS = { @@ -61,10 +56,10 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" view_name_limit: pluginsCollectionPlugins?.views?.view_name_limit || DEFAULT_LIMITS.view_name_limit, view_segment_limit: pluginsCollectionPlugins?.views?.segment_limit || DEFAULT_LIMITS.view_segment_limit, view_segment_value_limit: pluginsCollectionPlugins?.views?.segment_value_limit || DEFAULT_LIMITS.view_segment_value_limit, - custom_prop_limit: pluginsCollectionPlugins?.users?.custom_prop_limit || DEFAULT_LIMITS.custom_prop_limit, + //custom_prop_limit: pluginsCollectionPlugins?.users?.custom_prop_limit || DEFAULT_LIMITS.custom_prop_limit, + custom_property_limit: pluginsCollectionPlugins?.drill?.custom_property_limit || DEFAULT_LIMITS.custom_property_limit, custom_prop_value_limit: pluginsCollectionPlugins?.users?.custom_set_limit || DEFAULT_LIMITS.custom_prop_value_limit, }; - // GETTING REAL DATA PER APP var eventsCollectionPerApp = await countlyDb.collection("events").findOne({"_id": common.db.ObjectID(app._id)}); var viewsCountsPerApp = await countlyDb.collection("app_viewsmeta" + app._id).countDocuments(); @@ -140,22 +135,15 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" catch (err) { console.log("Mongodb operation failed for app: ", app.name, err); } - // EVENT KEYS defaultVal = DEFAULT_LIMITS.event_limit; - currentVal = CURRENT_LIMITS.event_limit; - let realEvents = eventsCollectionPerApp?.list || []; realVal = realEvents.length; - app_results['Event Keys'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // SEGMENTS IN ONE EVENT defaultVal = DEFAULT_LIMITS.event_segment_limit; - currentVal = CURRENT_LIMITS.event_segment_limit; - let eventSegments = eventsCollectionPerApp && eventsCollectionPerApp.segments || {}; realVal = Object.entries(eventSegments) .sort((a, b) => b[1].length - a[1].length) @@ -163,23 +151,18 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" acc[key] = value.length; return acc; }, {}); - app_results['Event Segments'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // UNIQUE EVENT SEGMENT VALUES FOR 1 SEGMENT defaultVal = DEFAULT_LIMITS.event_segment_value_limit; - currentVal = CURRENT_LIMITS.event_segment_value_limit; - realVal = {}; await Promise.all(realEvents.map(async(event) => { var shortEventName = common.fixEventKey(event); - var eventCollectionName = "events" + crypto.createHash('sha1').update(shortEventName + app._id).digest('hex'); - + var hash = crypto.createHash('sha1').update(shortEventName + app._id).digest('hex'); + var eventCollectionName = "events_data"; try { var regexes = [ - "^no-segment_2023:0.*", - "^no-segment_2024:0.*" + "^"+app._id+"_"+hash+"_no-segment_2025:0.*" ]; var eventsSegmentsValues = await countlyDb.collection(eventCollectionName).aggregate([ { @@ -218,7 +201,6 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } } ]).toArray(); - // Use reduce to transform array eventsSegmentsValues = eventsSegmentsValues.reduce((acc, item) => { const key = item.meta_v2.k; @@ -228,7 +210,6 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" acc[key] += item.meta_v2.v; return acc; }, {}); - if (Object.keys(eventsSegmentsValues).length > 0) { realVal[event] = eventsSegmentsValues; } @@ -238,41 +219,26 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } })); app_results['Unique Event Segment Values'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // UNIQUE VIEV NAMES defaultVal = DEFAULT_LIMITS.view_limit; - currentVal = CURRENT_LIMITS.view_limit; - realVal = viewsCountsPerApp; - app_results['Unique View Names'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // VIEW NAME LENGTH LIMIT defaultVal = DEFAULT_LIMITS.view_name_limit; - currentVal = CURRENT_LIMITS.view_name_limit; - realVal = {longestViewName: "", longestViewLength: 0}; realVal.longestViewName = viewsCollectionPerApp && viewsCollectionPerApp[0] && viewsCollectionPerApp[0]?.view; realVal.longestViewLength = viewsCollectionPerApp && viewsCollectionPerApp[0] && viewsCollectionPerApp[0]?.max_length; - app_results['View Name Length Limit'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // SEGMENTS IN ONE VIEW defaultVal = DEFAULT_LIMITS.view_segment_limit; - currentVal = CURRENT_LIMITS.view_segment_limit; - realVal = viewsSegmentsPerApp && viewsSegmentsPerApp[0]?.numberOfSegments || 0; - app_results['View Segments'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // VIEW SEGMENT'S UNIQUE VALUES defaultVal = DEFAULT_LIMITS.view_segment_value_limit; - currentVal = CURRENT_LIMITS.view_segment_value_limit; - realVal = viewsSegmentsPerApp && viewsSegmentsPerApp[0]?.segments || 0; Object.keys(realVal).forEach(key => { if (realVal[key] === 0) { @@ -280,23 +246,18 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } }); app_results['View Segments Unique Values'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // USER PROPERTIES - defaultVal = DEFAULT_LIMITS.custom_prop_limit; - - currentVal = CURRENT_LIMITS.custom_prop_limit; - + //defaultVal = DEFAULT_LIMITS.custom_prop_limit; + //currentVal = CURRENT_LIMITS.custom_prop_limit; + defaultVal = DEFAULT_LIMITS.custom_property_limit; + currentVal = CURRENT_LIMITS.custom_property_limit; realVal = customPropsPerApp && customPropsPerApp[0]?.customPropertiesCount || 0; - app_results['Custom User Properties'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - + app_results['Max user custom properties'] = {"default": defaultVal, "set": currentVal, "real": realVal}; // VALUES IN AN ARRAY FOR ONE USER PROPERTY defaultVal = DEFAULT_LIMITS.custom_prop_value_limit; - currentVal = CURRENT_LIMITS.custom_prop_value_limit; - realVal = valueFieldCounts || undefined; app_results['Values In Array For One User Property'] = {"default": defaultVal, "set": currentVal, "real": realVal}; - // WRITE RESULTS PER APP TO FILE WriteStream.write(JSON.stringify(app_results, null, 2), 'utf8'); if (i + 1 < apps.length) { @@ -315,7 +276,6 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" finally { close(); } - async function getAppList(options) { var query = {}; if (app_list && app_list.length > 0) { @@ -325,7 +285,6 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" } query = {_id: {$in: listed}}; } - try { let apps = await options.db.collection("apps").find(query).toArray(); return apps; @@ -334,9 +293,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" console.log("Error getting apps: ", err); return []; } - } - function close(err) { if (err) { console.log("Error: ", err); From cd152d35c91872d0b7bceca523d392600a304bc3 Mon Sep 17 00:00:00 2001 From: Meghana M R <86944692+mrmeghana@users.noreply.github.com> Date: Thu, 24 Jul 2025 18:18:47 +0530 Subject: [PATCH 12/41] Update setting_limits_and_real_values.js eslinted --- bin/scripts/export-data/setting_limits_and_real_values.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/scripts/export-data/setting_limits_and_real_values.js b/bin/scripts/export-data/setting_limits_and_real_values.js index a6bb00b15c6..7cbb0e0bfa3 100644 --- a/bin/scripts/export-data/setting_limits_and_real_values.js +++ b/bin/scripts/export-data/setting_limits_and_real_values.js @@ -20,7 +20,7 @@ const DEFAULT_LIMITS = { view_segment_limit: 100, view_segment_value_limit: 10, //custom_prop_limit: 20, - custom_property_limit:20, + custom_property_limit: 20, custom_prop_value_limit: 50, }; Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("countly_drill")]).then(async function([countlyDb, drillDb]) { @@ -162,7 +162,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection(" var eventCollectionName = "events_data"; try { var regexes = [ - "^"+app._id+"_"+hash+"_no-segment_2025:0.*" + "^" + app._id + "_" + hash + "_no-segment_2025:0.*" ]; var eventsSegmentsValues = await countlyDb.collection(eventCollectionName).aggregate([ { From f8baa9a604cb1fd21c2688ab0eb0541dbddb324f Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Fri, 25 Jul 2025 08:21:52 +0700 Subject: [PATCH 13/41] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25a64e8a6ad..bce68e17011 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Fixes: - [core] Use correct rights validation for loyality +Enterprise Fixes: +- [license] Display notification for non global admin user + ## Version 25.03.11 Fixes: - [core] Fix mongo connection url parsing From 6bbd1a746caa8de269e91655f8433b8a0e934ad9 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Thu, 24 Jul 2025 13:41:25 +0700 Subject: [PATCH 14/41] [crashes] Fix crash-free session stat in home widget --- plugins/crashes/frontend/public/javascripts/countly.views.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/crashes/frontend/public/javascripts/countly.views.js b/plugins/crashes/frontend/public/javascripts/countly.views.js index 2f32ce9f589..dcfded97912 100644 --- a/plugins/crashes/frontend/public/javascripts/countly.views.js +++ b/plugins/crashes/frontend/public/javascripts/countly.views.js @@ -1338,7 +1338,7 @@ {"name": CV.i18n('crashes.unique'), "info": CV.i18n('crashes.home.unique'), "prop": "cru", "r": true}, {"name": CV.i18n('crashes.total-per-session'), "info": CV.i18n('crashes.home.per-session'), "prop": "cr-session", "r": true}, {"name": CV.i18n('crashes.free-users'), "info": CV.i18n('crashes.help-free-users'), "prop": "crau", "p": true}, - {"name": CV.i18n('crashes.free-sessions'), "info": CV.i18n('crashes.help-free-sessions'), "prop": "crses", "p": true} + {"name": CV.i18n('crashes.free-sessions'), "info": CV.i18n('crashes.help-free-sessions'), "prop": "crinv", "p": true} ]; for (var k = 0; k < getUs.length; k++) { From 98d8df9a7de10b2b83c55405532a2005ea847559 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Thu, 24 Jul 2025 18:40:25 +0700 Subject: [PATCH 15/41] [crashes] Set crash-free user and session to na when there's no data --- .../public/javascripts/countly.models.js | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/plugins/crashes/frontend/public/javascripts/countly.models.js b/plugins/crashes/frontend/public/javascripts/countly.models.js index 52a14407986..2560840cedf 100644 --- a/plugins/crashes/frontend/public/javascripts/countly.models.js +++ b/plugins/crashes/frontend/public/javascripts/countly.models.js @@ -152,7 +152,10 @@ function transformAppVersion(inpVersion) { * @param {bool} isPercent - Flag to just format the metric's total values as percentages. */ function populateMetric(metric, isPercent) { - if (dashboard[metric].total !== 0 && dashboard[metric]["prev-total"] !== 0) { + if (dashboard[metric].total === 'NA' || dashboard[metric]['prev-total'] === 'NA') { + dashboard[metric].change = 'NA'; + } + else if (dashboard[metric].total !== 0 && dashboard[metric]["prev-total"] !== 0) { if (isPercent) { dashboard[metric].change = (dashboard[metric].total - dashboard[metric]["prev-total"]).toFixed(1) + "%"; } @@ -182,7 +185,9 @@ function transformAppVersion(inpVersion) { if (isPercent && ["crses", "crnfses", "crfses", "crau", "craunf", "crauf", 'crinv', 'crfinv', 'crnfinv', 'crauinv', 'craufinv', 'craunfinv'].includes(metric)) { ["total", "prev-total"].forEach(function(prop) { - dashboard[metric][prop] = dashboard[metric][prop].toFixed(2) + '%'; + if (dashboard[metric][prop] !== 'NA') { + dashboard[metric][prop] = dashboard[metric][prop].toFixed(2) + '%'; + } }); } } @@ -219,7 +224,7 @@ function transformAppVersion(inpVersion) { } // derive user count from whole users - if (dashboard.crau[prop] > dashboard.cr_u[prop] && 'users' in state.rawData) { + if (dashboard.crau[prop] > dashboard.cr_u[prop] && 'users' in state.rawData && wholeUsers.total > 0) { dashboard.crauf[prop] = dashboard.cr_u[prop] * ((wholeUsers.fatal / wholeUsers.total) - (dashboard.crf[prop] / dashboard.cr_s[prop])); dashboard.craunf[prop] = dashboard.cr_u[prop] * ((wholeUsers.nonfatal / wholeUsers.total) - (dashboard.crnf[prop] / dashboard.cr_s[prop])); dashboard.crau[prop] = dashboard.crauf[prop] + dashboard.craunf[prop]; @@ -234,9 +239,14 @@ function transformAppVersion(inpVersion) { populateMetric(metric); }); - ["crau", "craunf", "crauf"].forEach(function(name) { - ["total", "prev-total"].forEach(function(prop) { - dashboard[name][prop] = Math.min(100, (dashboard.cr_u[prop] === 0 || dashboard[name][prop] === 0) ? 100 : (Math.abs(dashboard.cr_u[prop] - dashboard[name][prop]) / dashboard.cr_u[prop] * 100)); + ['crau', 'craunf', 'crauf'].forEach(function(name) { + ['total', 'prev-total'].forEach(function(prop) { + if (dashboard.cr_u[prop] === 0 || !Number.isFinite(dashboard[name][prop])) { + dashboard[name][prop] = 'NA'; + } + else { + dashboard[name][prop] = Math.abs(dashboard.cr_u[prop] - dashboard[name][prop]) / dashboard.cr_u[prop] * 100; + } }); populateMetric(name, true); }); @@ -264,17 +274,13 @@ function transformAppVersion(inpVersion) { }); ['crinv', 'crfinv', 'crnfinv'].forEach(function(name) { - ["total", "prev-total"].forEach(function(prop) { - var propValue = 0; - + ['total', 'prev-total'].forEach(function(prop) { if (dashboard.cr_s[prop] === 0) { - propValue = 100; + dashboard[name][prop] = 'NA'; } else { - propValue = dashboard[name][prop] / dashboard.cr_s[prop] * 100; + dashboard[name][prop] = dashboard[name][prop] / dashboard.cr_s[prop] * 100; } - - dashboard[name][prop] = Math.min(100, propValue); }); populateMetric(name, true); }); From 3b12c2680e992ead5a4d1544e7fc4eb8021448b5 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Fri, 25 Jul 2025 08:19:52 +0700 Subject: [PATCH 16/41] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25a64e8a6ad..880d194ace8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ ## Version 25.03.XX Fixes: - [core] Use correct rights validation for loyality +- [crashes] Fix free session for home widget +- [crashes] Use na for free session and free user when there's no data + ## Version 25.03.11 Fixes: From ea873673939fc206010b9c072c187afb7084a004 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Fri, 25 Jul 2025 13:13:43 +0700 Subject: [PATCH 17/41] [crashes] Add estimation flag to crash user stats --- plugins/crashes/frontend/public/javascripts/countly.models.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/crashes/frontend/public/javascripts/countly.models.js b/plugins/crashes/frontend/public/javascripts/countly.models.js index 2560840cedf..66c471caaee 100644 --- a/plugins/crashes/frontend/public/javascripts/countly.models.js +++ b/plugins/crashes/frontend/public/javascripts/countly.models.js @@ -226,8 +226,11 @@ function transformAppVersion(inpVersion) { // derive user count from whole users if (dashboard.crau[prop] > dashboard.cr_u[prop] && 'users' in state.rawData && wholeUsers.total > 0) { dashboard.crauf[prop] = dashboard.cr_u[prop] * ((wholeUsers.fatal / wholeUsers.total) - (dashboard.crf[prop] / dashboard.cr_s[prop])); + dashboard.crauf.isEstimate = true; dashboard.craunf[prop] = dashboard.cr_u[prop] * ((wholeUsers.nonfatal / wholeUsers.total) - (dashboard.crnf[prop] / dashboard.cr_s[prop])); + dashboard.craunf.isEstimate = true; dashboard.crau[prop] = dashboard.crauf[prop] + dashboard.craunf[prop]; + dashboard.crau.isEstimate = true; } dashboard.crinv[prop] = Math.max(0, dashboard.cr_s[prop] - dashboard.cr[prop]); From a6cddb496bee5144828435193fe6e1f71b7c544f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 25 Jul 2025 11:28:04 +0300 Subject: [PATCH 18/41] feat: Add sidebar footer label setting to white labeling --- CHANGELOG.md | 1 + frontend/express/app.js | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 532ffcd2fdd..b3f9b1f51a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Features: - [plugins] Add configuration warning tags to settings UI +- [white-labeling] Add sidebar footer label setting to white labeling Fixes: - [core] Use correct rights validation for loyality diff --git a/frontend/express/app.js b/frontend/express/app.js index 194ccd85ff6..3fbfed6ba74 100644 --- a/frontend/express/app.js +++ b/frontend/express/app.js @@ -422,6 +422,14 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ app.loadThemeFiles(curTheme); app.dashboard_headers = plugins.getConfig("security").dashboard_additional_headers; + var overriddenCountlyNamedType = COUNTLY_NAMED_TYPE; + var whiteLabelingConfig = plugins.getConfig("white-labeling"); + if (whiteLabelingConfig && whiteLabelingConfig.footerLabel && whiteLabelingConfig.footerLabel.length) { + overriddenCountlyNamedType = whiteLabelingConfig.footerLabel + " v" + COUNTLY_VERSION; + } + + COUNTLY_NAMED_TYPE = overriddenCountlyNamedType; + if (typeof plugins.getConfig('frontend').countly_tracking !== 'boolean' && plugins.isPluginEnabled('tracker')) { plugins.updateConfigs(countlyDb, 'frontend', { countly_tracking: true }); } @@ -929,6 +937,12 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ licenseNotification, licenseError; var isLocked = false; configs.export_limit = plugins.getConfig("api").export_limit; + + var currentWhiteLabelingConfig = plugins.getConfig("white-labeling"); + var overriddenCountlyNamedType = COUNTLY_NAMED_TYPE; + if (currentWhiteLabelingConfig && currentWhiteLabelingConfig.footerLabel && currentWhiteLabelingConfig.footerLabel.length) { + overriddenCountlyNamedType = currentWhiteLabelingConfig.footerLabel + " v" + COUNTLY_VERSION; + } app.loadThemeFiles(configs.theme, async function(theme) { if (configs._user.theme) { res.cookie("theme", configs.theme); @@ -1004,7 +1018,7 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ licenseError, ssr: serverSideRendering, timezones: timezones, - countlyTypeName: COUNTLY_NAMED_TYPE, + countlyTypeName: overriddenCountlyNamedType, countlyTypeTrack: COUNTLY_TRACK_TYPE, countlyTypeCE: COUNTLY_TYPE_CE, countly_tracking, @@ -1037,7 +1051,7 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ countlyVersion: req.countly.version, countlyType: COUNTLY_TYPE_CE, countlyTrial: COUNTLY_TRIAL, - countlyTypeName: COUNTLY_NAMED_TYPE, + countlyTypeName: overriddenCountlyNamedType, feedbackLink: COUNTLY_FEEDBACK_LINK, documentationLink: COUNTLY_DOCUMENTATION_LINK, helpCenterLink: COUNTLY_HELPCENTER_LINK, From a7ecb1e92e102a1c9def6b4e3cd163f10da4f52a Mon Sep 17 00:00:00 2001 From: Anna Sosina Date: Fri, 25 Jul 2025 12:14:51 +0300 Subject: [PATCH 19/41] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9e38dc114c..eea624ff9b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ Fixes: - [crashes] Fix free session for home widget - [crashes] Use na for free session and free user when there's no data +Enterprise Fixes: +- [ldap] Error handling in ldap plugin on search error ## Version 25.03.11 Fixes: From fb92627685b67b0d1e68eb1250e8ebbb8ad4370a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 25 Jul 2025 15:20:05 +0300 Subject: [PATCH 20/41] fix: [plugins] Design change for warning tags --- .../public/javascripts/countly.models.js | 6 +-- .../public/javascripts/countly.views.js | 3 +- .../public/localization/plugins.properties | 4 +- .../frontend/public/stylesheets/main.scss | 20 ++++++++++ .../public/templates/configurations.html | 39 +++++++++++-------- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/plugins/plugins/frontend/public/javascripts/countly.models.js b/plugins/plugins/frontend/public/javascripts/countly.models.js index ea8626df8c0..feffedd6b0a 100644 --- a/plugins/plugins/frontend/public/javascripts/countly.models.js +++ b/plugins/plugins/frontend/public/javascripts/countly.models.js @@ -318,9 +318,9 @@ // Tooltip color mappings var TOOLTIP_COLORS = { - dataIngestion: "color-yellow-100", - uiFiltering: "color-blue-100", - serverPerformance: "color-red-100" + dataIngestion: { bgColor: '#FCF5E5', textColor: '#E49700' }, + serverPerformance: { bgColor: '#FBECE5', textColor: '#D23F00' }, + uiFiltering: { bgColor: '#E1EFFF', textColor: '#0166D6' } }; /** diff --git a/plugins/plugins/frontend/public/javascripts/countly.views.js b/plugins/plugins/frontend/public/javascripts/countly.views.js index 2fd7c244b1e..27bae3d1761 100644 --- a/plugins/plugins/frontend/public/javascripts/countly.views.js +++ b/plugins/plugins/frontend/public/javascripts/countly.views.js @@ -540,7 +540,8 @@ return warnings.map(function(warning) { return { tooltipText: CV.i18n(warning.text), - color: tooltipColors[warning.type], + bgColor: tooltipColors[warning.type].bgColor, + textColor: tooltipColors[warning.type].textColor, label: countlyPlugins.getTooltipLabel(warning.type) }; }); diff --git a/plugins/plugins/frontend/public/localization/plugins.properties b/plugins/plugins/frontend/public/localization/plugins.properties index e128a5254fb..eb10290d9c6 100644 --- a/plugins/plugins/frontend/public/localization/plugins.properties +++ b/plugins/plugins/frontend/public/localization/plugins.properties @@ -247,8 +247,8 @@ configs.tooltip.server-performance-warning = Adjusting this value may impact sys configs.tooltip.data-ingestion-warning = Adjusting this value may affect data processing configs.tooltip.ui-filtering-warning = Adjusting this value controls how much data is shown in the UI configs.tooltip.data-ingestion = Data Processing -configs.tooltip.ui-filtering = UI Display -configs.tooltip.server-performance = Performance Impact +configs.tooltip.ui-filtering = Interface +configs.tooltip.server-performance = Performance systemlogs.action.change_configs = Setting Changed systemlogs.action.change_plugins = Plugins Changed diff --git a/plugins/plugins/frontend/public/stylesheets/main.scss b/plugins/plugins/frontend/public/stylesheets/main.scss index 808c8c2a2bd..df5c9b43d8b 100644 --- a/plugins/plugins/frontend/public/stylesheets/main.scss +++ b/plugins/plugins/frontend/public/stylesheets/main.scss @@ -73,6 +73,26 @@ } } +.config-section { + &__header { + width: max-content; + } +} + +.configuration-warning-container { + border-radius: 4px; + display: flex; + height: 20px; + width: auto; + + &__text { + font-size: 10px; + font-weight: 500; + margin: 4px 6px; + text-transform: uppercase; + } +} + .apikey { .el-input { width: 320px; diff --git a/plugins/plugins/frontend/public/templates/configurations.html b/plugins/plugins/frontend/public/templates/configurations.html index 420f7c52b23..d17d74bb252 100755 --- a/plugins/plugins/frontend/public/templates/configurations.html +++ b/plugins/plugins/frontend/public/templates/configurations.html @@ -51,26 +51,31 @@

-
-
- - {{ tag.label }} -
-
-
+
{{ getLabelName(key) }}
+
+
+
+ + {{ tag.label }} + +
+
+

From 42822fc0540de67e2b8d8badbb37407c9bd71a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 25 Jul 2025 15:23:07 +0300 Subject: [PATCH 21/41] fix: Removed version info when using white-labeling --- frontend/express/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/express/app.js b/frontend/express/app.js index 3fbfed6ba74..482b7d91ce1 100644 --- a/frontend/express/app.js +++ b/frontend/express/app.js @@ -425,7 +425,7 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ var overriddenCountlyNamedType = COUNTLY_NAMED_TYPE; var whiteLabelingConfig = plugins.getConfig("white-labeling"); if (whiteLabelingConfig && whiteLabelingConfig.footerLabel && whiteLabelingConfig.footerLabel.length) { - overriddenCountlyNamedType = whiteLabelingConfig.footerLabel + " v" + COUNTLY_VERSION; + overriddenCountlyNamedType = whiteLabelingConfig.footerLabel; } COUNTLY_NAMED_TYPE = overriddenCountlyNamedType; @@ -941,7 +941,7 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_ var currentWhiteLabelingConfig = plugins.getConfig("white-labeling"); var overriddenCountlyNamedType = COUNTLY_NAMED_TYPE; if (currentWhiteLabelingConfig && currentWhiteLabelingConfig.footerLabel && currentWhiteLabelingConfig.footerLabel.length) { - overriddenCountlyNamedType = currentWhiteLabelingConfig.footerLabel + " v" + COUNTLY_VERSION; + overriddenCountlyNamedType = currentWhiteLabelingConfig.footerLabel; } app.loadThemeFiles(configs.theme, async function(theme) { if (configs._user.theme) { From 3f0560ec6fecfb61ef930f5974258afe9c352f68 Mon Sep 17 00:00:00 2001 From: Arturs Sosins Date: Sun, 27 Jul 2025 14:57:23 +0300 Subject: [PATCH 22/41] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f7f92601f6..41fc32a47de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## Version 25.03.x + +Dependencies: +- Bump puppeteer from 24.14.0 to 24.15.0 +- Bump mongodb from 6.17.0 to 6.18.0 +- Bump supertest from 7.1.3 to 7.1.4 + ## Version 25.03.11 Fixes: - [core] Fix mongo connection url parsing From 2c0d280e1ab5c93407663426c1b4306fc8b5d1ce Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Sun, 27 Jul 2025 23:15:39 +0700 Subject: [PATCH 23/41] [crashes] Fix trend and change calculation --- .../crashes/frontend/public/javascripts/countly.models.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/crashes/frontend/public/javascripts/countly.models.js b/plugins/crashes/frontend/public/javascripts/countly.models.js index 66c471caaee..058f6f11aac 100644 --- a/plugins/crashes/frontend/public/javascripts/countly.models.js +++ b/plugins/crashes/frontend/public/javascripts/countly.models.js @@ -169,12 +169,18 @@ function transformAppVersion(inpVersion) { else if (dashboard[metric].total !== 0 && dashboard[metric]["prev-total"] === 0) { dashboard[metric].change = "∞"; } + else if (dashboard[metric].total === dashboard[metric]["prev-total"]) { + dashboard[metric].change = "0"; + } if (dashboard[metric].total === dashboard[metric]["prev-total"]) { dashboard[metric].trend = "n"; } else { - dashboard[metric].trend = dashboard[metric].total >= dashboard[metric]["prev-total"] ? "u" : "d"; + var totl = dashboard[metric].total === 'NA' ? -1 : dashboard[metric].total; + var prevTotl = dashboard[metric]['prev-total'] === 'NA' ? -1 : dashboard[metric]['prev-total']; + + dashboard[metric].trend = totl >= prevTotl ? 'u' : 'd'; } if (metric in derivations) { From db3f60c19c19de961c2d94ccd910eb0054324280 Mon Sep 17 00:00:00 2001 From: Danu Widatama Date: Mon, 28 Jul 2025 11:58:55 +0700 Subject: [PATCH 24/41] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8df16010d5c..95ee76deb89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Fixes: - [core] Use correct rights validation for loyality - [crashes] Fix free session for home widget - [crashes] Use na for free session and free user when there's no data +- [crashes] Fix trend and change calculation for crash stats Enterprise Fixes: - [ldap] Error handling in ldap plugin on search error From 17219fa1bb5f63698ea1419f7cd4536fb4e77e49 Mon Sep 17 00:00:00 2001 From: Can Angun <39311746+can-angun@users.noreply.github.com> Date: Mon, 28 Jul 2025 09:23:56 +0300 Subject: [PATCH 25/41] Update crashes.js --- ui-tests/cypress/lib/dashboard/crashes/crashes.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/crashes/crashes.js b/ui-tests/cypress/lib/dashboard/crashes/crashes.js index 4c925411fe5..ea66add556e 100644 --- a/ui-tests/cypress/lib/dashboard/crashes/crashes.js +++ b/ui-tests/cypress/lib/dashboard/crashes/crashes.js @@ -563,7 +563,7 @@ const verifyCrashStatisticsEChartElements = ({ cy.verifyElement({ labelElement: crashStatisticsEChartElements.TOTAL_OCCURENCES_CHANGE_VALUE_LABEL, - labelText: "NA", + labelText: "0", }); cy.verifyElement({ @@ -573,7 +573,7 @@ const verifyCrashStatisticsEChartElements = ({ cy.verifyElement({ labelElement: crashStatisticsEChartElements.TOTAL_OCCURENCES_CHANGE_VALUE_LABEL, - labelText: "NA", + labelText: "0", }); cy.verifyElement({ @@ -583,22 +583,22 @@ const verifyCrashStatisticsEChartElements = ({ cy.verifyElement({ labelElement: crashStatisticsEChartElements.CRASH_FREE_USERS_NUMBER_LABEL, - labelText: "100.00%", + labelText: "NA", }); cy.verifyElement({ labelElement: crashStatisticsEChartElements.CRASH_FREE_USERS_CHANGE_VALUE_LABEL, - labelText: "0.0%", + labelText: "NA", }); cy.verifyElement({ labelElement: crashStatisticsEChartElements.CRASH_FREE_SESSIONS_NUMBER_LABEL, - labelText: "100.00%", + labelText: "NA", }); cy.verifyElement({ labelElement: crashStatisticsEChartElements.CRASH_FREE_SESSIONS_CHANGE_VALUE_LABEL, - labelText: "0.0%", + labelText: "NA", }); return; } @@ -686,4 +686,4 @@ module.exports = { verifyCrashGroupsDataFromTable, verifyCrashStatisticsMetricCard, verifyCrashStatisticsEChartElements -}; \ No newline at end of file +}; From 6d88fcae88cb207e231d5f8449503f3e63ad15f1 Mon Sep 17 00:00:00 2001 From: Can Angun <39311746+can-angun@users.noreply.github.com> Date: Mon, 28 Jul 2025 09:32:15 +0300 Subject: [PATCH 26/41] Updated home page crash value verifies --- ui-tests/cypress/lib/dashboard/home/home.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/home/home.js b/ui-tests/cypress/lib/dashboard/home/home.js index c77f4e8dff0..83a9cd9a7c9 100644 --- a/ui-tests/cypress/lib/dashboard/home/home.js +++ b/ui-tests/cypress/lib/dashboard/home/home.js @@ -484,7 +484,7 @@ const verifyEmptyPageElements = () => { cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.TOTAL_CRASHES_TREND_VALUE, - elementText: "NA", + elementText: "0", }); cy.verifyElement({ @@ -498,7 +498,7 @@ const verifyEmptyPageElements = () => { cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.UNIQUE_CRASHES_TREND_VALUE, - elementText: "NA", + elementText: "0", }); cy.verifyElement({ @@ -512,7 +512,7 @@ const verifyEmptyPageElements = () => { cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.CRASH_FREE_USERS_NUMBER, - elementText: "100.00%", + elementText: "NA", }); cy.verifyElement({ @@ -521,12 +521,12 @@ const verifyEmptyPageElements = () => { cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.CRASH_FREE_USERS_TREND_VALUE, - elementText: "0.0%", + elementText: "NA", }); cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.CRASH_FREE_SESSIONS_NUMBER, - elementText: "100.00%", + elementText: "NA", }); cy.verifyElement({ @@ -535,7 +535,7 @@ const verifyEmptyPageElements = () => { cy.verifyElement({ element: homePageElements.CRASH_STATISTICS.CRASH_FREE_SESSIONS_TREND_VALUE, - elementText: "0.0%", + elementText: "NA", }); }; @@ -806,4 +806,4 @@ const verifyFullDataPageElements = () => { module.exports = { verifyEmptyPageElements, verifyFullDataPageElements -}; \ No newline at end of file +}; From 0e33f56165c2833c0d29e064d38b5684063fc3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Mon, 28 Jul 2025 11:00:41 +0300 Subject: [PATCH 27/41] fix: ui test fixing for warning tags added to settings --- .../plugins/frontend/public/templates/configurations.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/plugins/frontend/public/templates/configurations.html b/plugins/plugins/frontend/public/templates/configurations.html index d17d74bb252..49250590e55 100755 --- a/plugins/plugins/frontend/public/templates/configurations.html +++ b/plugins/plugins/frontend/public/templates/configurations.html @@ -51,11 +51,13 @@

-
+
- {{ getLabelName(key) }} + {{ getLabelName(key) }}
-
+
Date: Mon, 28 Jul 2025 12:41:24 +0000 Subject: [PATCH 28/41] Updated scroll page location --- .../lib/dashboard/manage/configurations/configurations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js index 558de3b930d..6e2429a48ae 100644 --- a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js +++ b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js @@ -179,13 +179,13 @@ const verifyPageElements = () => { attrText: "100" }); + cy.scrollPageToCenter(); + cy.verifyElement({ labelElement: configurationsListBoxElements({subFeature: SETTINGS.API.DATA_LIMITS.EVENT_SEGMENTATION_VALUE_LIMIT}).SELECTED_SUBFEATURE_TITLE, labelText: "Max unique values in each segmentation", }); - cy.scrollPageToCenter(); - cy.verifyElement({ labelElement: configurationsListBoxElements({subFeature: SETTINGS.API.DATA_LIMITS.EVENT_SEGMENTATION_VALUE_LIMIT}).SELECTED_SUBFEATURE_DESCRIPTION, labelText: "Maximum number of unique values in each segmentation. Increasing this number may affect your server performance.", From 5aa588b7743c7a0f4132c098b220f1775863b25d Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 28 Jul 2025 12:46:00 +0000 Subject: [PATCH 29/41] Fixed linter error --- .../lib/dashboard/manage/configurations/configurations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js index 6e2429a48ae..d2a9f7d4480 100644 --- a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js +++ b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js @@ -180,7 +180,7 @@ const verifyPageElements = () => { }); cy.scrollPageToCenter(); - + cy.verifyElement({ labelElement: configurationsListBoxElements({subFeature: SETTINGS.API.DATA_LIMITS.EVENT_SEGMENTATION_VALUE_LIMIT}).SELECTED_SUBFEATURE_TITLE, labelText: "Max unique values in each segmentation", From edad261ac0fa43a9d2789c66de5b56a5783f1dce Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 28 Jul 2025 13:17:14 +0000 Subject: [PATCH 30/41] Updated ensureScrollable is true --- ui-tests/cypress/support/commands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-tests/cypress/support/commands.js b/ui-tests/cypress/support/commands.js index 6ba29f6080a..72cd75c9ac6 100644 --- a/ui-tests/cypress/support/commands.js +++ b/ui-tests/cypress/support/commands.js @@ -215,7 +215,7 @@ Cypress.Commands.add("scrollPageToTop", (element = '.main-view', index = 0) => { }); Cypress.Commands.add("scrollPageToCenter", (element = '.main-view', index = 0) => { - cy.get(element).eq(index).scrollTo('center', { ensureScrollable: false }); + cy.get(element).eq(index).scrollTo('center', { ensureScrollable: true }); }); Cypress.Commands.add("scrollDataTableToRight", (element = '.el-table__body-wrapper', index = 0) => { From 352bfa02ba715c6c701b98352defc32430cf098f Mon Sep 17 00:00:00 2001 From: can-angun Date: Tue, 29 Jul 2025 08:56:57 +0000 Subject: [PATCH 31/41] Updated ensureScrollable as false for scroll --- ui-tests/cypress/support/commands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-tests/cypress/support/commands.js b/ui-tests/cypress/support/commands.js index 72cd75c9ac6..6ba29f6080a 100644 --- a/ui-tests/cypress/support/commands.js +++ b/ui-tests/cypress/support/commands.js @@ -215,7 +215,7 @@ Cypress.Commands.add("scrollPageToTop", (element = '.main-view', index = 0) => { }); Cypress.Commands.add("scrollPageToCenter", (element = '.main-view', index = 0) => { - cy.get(element).eq(index).scrollTo('center', { ensureScrollable: true }); + cy.get(element).eq(index).scrollTo('center', { ensureScrollable: false }); }); Cypress.Commands.add("scrollDataTableToRight", (element = '.el-table__body-wrapper', index = 0) => { From b5784bffbe0f984ddf606d7c365393200d46896c Mon Sep 17 00:00:00 2001 From: Cookiezaurs <> Date: Tue, 29 Jul 2025 12:45:34 +0300 Subject: [PATCH 32/41] [push] Show segmentation, geo and cohorts related components in push drawer on editing draft. --- plugins/push/frontend/public/javascripts/countly.views.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/push/frontend/public/javascripts/countly.views.js b/plugins/push/frontend/public/javascripts/countly.views.js index 3988912e029..fc28b17ebf4 100644 --- a/plugins/push/frontend/public/javascripts/countly.views.js +++ b/plugins/push/frontend/public/javascripts/countly.views.js @@ -1122,6 +1122,10 @@ this.setIsLoading(true); countlyPushNotification.service.fetchById(this.id) .then(function(response) { + //Set default settings + response.isEe = (typeof countlySegmentation !== 'undefined'); + response.isGeo = (typeof countlyLocationTargetComponent !== 'undefined'); + response.isCohorts = (typeof countlyCohorts !== 'undefined'); self.setPushNotificationUnderEdit(response); if (self.userCommand === self.UserCommandEnum.DUPLICATE) { self.setId(null); From a708942c078d0d946fc0bcb8cb94ed19787c59ac Mon Sep 17 00:00:00 2001 From: can-angun Date: Tue, 29 Jul 2025 10:32:17 +0000 Subject: [PATCH 33/41] Added scrollPageSlightly method --- .../lib/dashboard/manage/configurations/configurations.js | 1 + ui-tests/cypress/support/commands.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js index d2a9f7d4480..e4bfa575779 100644 --- a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js +++ b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js @@ -179,6 +179,7 @@ const verifyPageElements = () => { attrText: "100" }); + cy.scrollPageSlightly(); cy.scrollPageToCenter(); cy.verifyElement({ diff --git a/ui-tests/cypress/support/commands.js b/ui-tests/cypress/support/commands.js index 6ba29f6080a..1ef288461f6 100644 --- a/ui-tests/cypress/support/commands.js +++ b/ui-tests/cypress/support/commands.js @@ -226,6 +226,13 @@ Cypress.Commands.add("scrollDataTableToLeft", (element = '.el-table__body-wrappe cy.get(element).eq(index).scrollTo('left', { ensureScrollable: false }); }); +Cypress.Commands.add("scrollPageSlightly", (element = '.main-view', index = 0, offset = 100) => { + cy.get(element) + .eq(index) + .scrollTo('top', { ensureScrollable: false }) + .scrollTo(0, offset, { ensureScrollable: false }); // x=0, y=offset +}); + Cypress.Commands.add('verifyElement', ({ labelElement, labelText, From 67c5b31de152fc15b0b9fd9d2af0b58fb806e55f Mon Sep 17 00:00:00 2001 From: can-angun Date: Tue, 29 Jul 2025 11:40:52 +0000 Subject: [PATCH 34/41] Updated scroll page methods location --- .../lib/dashboard/manage/configurations/configurations.js | 1 - ui-tests/cypress/support/commands.js | 7 ------- 2 files changed, 8 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js index e4bfa575779..d2a9f7d4480 100644 --- a/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js +++ b/ui-tests/cypress/lib/dashboard/manage/configurations/configurations.js @@ -179,7 +179,6 @@ const verifyPageElements = () => { attrText: "100" }); - cy.scrollPageSlightly(); cy.scrollPageToCenter(); cy.verifyElement({ diff --git a/ui-tests/cypress/support/commands.js b/ui-tests/cypress/support/commands.js index 1ef288461f6..6ba29f6080a 100644 --- a/ui-tests/cypress/support/commands.js +++ b/ui-tests/cypress/support/commands.js @@ -226,13 +226,6 @@ Cypress.Commands.add("scrollDataTableToLeft", (element = '.el-table__body-wrappe cy.get(element).eq(index).scrollTo('left', { ensureScrollable: false }); }); -Cypress.Commands.add("scrollPageSlightly", (element = '.main-view', index = 0, offset = 100) => { - cy.get(element) - .eq(index) - .scrollTo('top', { ensureScrollable: false }) - .scrollTo(0, offset, { ensureScrollable: false }); // x=0, y=offset -}); - Cypress.Commands.add('verifyElement', ({ labelElement, labelText, From 9ed60703feb8e814d207c17763ce3b768198cea9 Mon Sep 17 00:00:00 2001 From: Cookiezaurs <> Date: Tue, 29 Jul 2025 15:30:52 +0300 Subject: [PATCH 35/41] [core] handle switching to report manager for table --- .../public/javascripts/countly/vue/data/vuex.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/data/vuex.js b/frontend/express/public/javascripts/countly/vue/data/vuex.js index 6809cd60631..72248ebc465 100644 --- a/frontend/express/public/javascripts/countly/vue/data/vuex.js +++ b/frontend/express/public/javascripts/countly/vue/data/vuex.js @@ -274,14 +274,23 @@ options.onOverrideResponse(context, res); } var convertedResponse = _dataTableAdapters.toStandardResponse(res, requestOptions); - if (!Object.prototype.hasOwnProperty.call(convertedResponse, "echo") || - convertedResponse.echo >= context.state[echoField]) { - if (typeof options.onReady === 'function') { - convertedResponse.rows = options.onReady(context, convertedResponse.rows); + if (res.task_id) { + if (typeof options.onTask === 'function') { + options.onTask(context, res.task_id); } context.commit(_capitalized("set", resourceName), convertedResponse); context.commit(_capitalized("set", lastSuccessfulRequestKey), requestOptions); } + else { + if (!Object.prototype.hasOwnProperty.call(convertedResponse, "echo") || + convertedResponse.echo >= context.state[echoField]) { + if (typeof options.onReady === 'function') { + convertedResponse.rows = options.onReady(context, convertedResponse.rows); + } + context.commit(_capitalized("set", resourceName), convertedResponse); + context.commit(_capitalized("set", lastSuccessfulRequestKey), requestOptions); + } + } }) .catch(function(err) { if (typeof options.onError === 'function') { From 3c0b77514404d22074ed5b5fc5ce633141f9bdba Mon Sep 17 00:00:00 2001 From: Cookiezaurs <> Date: Tue, 29 Jul 2025 15:33:42 +0300 Subject: [PATCH 36/41] Updated changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45798ad9650..1dcfb11987b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,11 @@ Fixes: - [crashes] Fix free session for home widget - [crashes] Use na for free session and free user when there's no data - [crashes] Fix trend and change calculation for crash stats +- [push] Show segmentation, geo and cohorts related components in push drawer on editing draft. Enterprise Fixes: - [ldap] Error handling in ldap plugin on search error +- [users] Load table data from report if user table calculation goes to report manager Dependencies: - Bump puppeteer from 24.14.0 to 24.15.0 From 98e1de0f154adf7c5c49c28e6c63bde196b709f1 Mon Sep 17 00:00:00 2001 From: Gabriel Oliveira Pinto Date: Wed, 30 Jul 2025 10:17:24 +0100 Subject: [PATCH 37/41] Update CHANGELOG.md --- CHANGELOG.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29e619106c3..9bcc5b0c4e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,4 @@ -## Version 25.03.XX - +## Version 25.03.12 Features: - [plugins] Add configuration warning tags to settings UI - [white-labeling] Add sidebar footer label setting to white labeling @@ -7,9 +6,9 @@ Features: Fixes: - [core] Use correct rights validation for loyality - [crashes] Fix free session for home widget -- [crashes] Use na for free session and free user when there's no data - [crashes] Fix trend and change calculation for crash stats -- [push] Show segmentation, geo and cohorts related components in push drawer on editing draft. +- [crashes] Use na for free session and free user when there's no data +- [push] Show segmentation, geo and cohorts related components in push drawer on editing draft. Enterprise Fixes: - [ldap] Error handling in ldap plugin on search error @@ -17,8 +16,8 @@ Enterprise Fixes: - [users] Load table data from report if user table calculation goes to report manager Dependencies: -- Bump puppeteer from 24.14.0 to 24.15.0 - Bump mongodb from 6.17.0 to 6.18.0 +- Bump puppeteer from 24.14.0 to 24.15.0 - Bump supertest from 7.1.3 to 7.1.4 From a8e645ebd608abd9ff319d24a84652278cf2501e Mon Sep 17 00:00:00 2001 From: Arturs Sosins Date: Wed, 30 Jul 2025 12:44:44 +0300 Subject: [PATCH 38/41] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3f4ad6978b4..adf90099e4d 100644 --- a/README.md +++ b/README.md @@ -116,3 +116,7 @@ If you like Countly, why not use one of our badges and give a link back to us? Countly - Product Analytics Countly - Product Analytics + +## 💚 Thanks + +This project is tested with BrowserStack. From 052ae13913c6d65bce961e2e8b32428a55898f09 Mon Sep 17 00:00:00 2001 From: Arturs Sosins Date: Wed, 30 Jul 2025 13:06:35 +0300 Subject: [PATCH 39/41] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index adf90099e4d..ec8fc54241d 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,10 @@ If you like Countly, why not use one of our badges and give a link back to us? Countly - Product Analytics + +## License +This project is licensed under **AGPL v3** with modified Section 7., see the [LICENSE](LICENSE) file for more details. + ## 💚 Thanks This project is tested with BrowserStack. From d671f8808e2212ef658dbe09dc39e3ca82ae986d Mon Sep 17 00:00:00 2001 From: Arturs Sosins Date: Wed, 30 Jul 2025 13:47:02 +0300 Subject: [PATCH 40/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec8fc54241d..0ea8dc3416a 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ If you like Countly, why not use one of our badges and give a link back to us? ## License -This project is licensed under **AGPL v3** with modified Section 7., see the [LICENSE](LICENSE) file for more details. +This project is licensed under **AGPL-3.0** with modified Section 7., see the [LICENSE](LICENSE) file for more details. ## 💚 Thanks From 868c50569efaba2ead234957a447e0675fc92f9b Mon Sep 17 00:00:00 2001 From: Arturs Sosins Date: Wed, 30 Jul 2025 13:47:49 +0300 Subject: [PATCH 41/41] Update and rename LICENSE to LICENSE.md --- LICENSE => LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename LICENSE => LICENSE.md (92%) diff --git a/LICENSE b/LICENSE.md similarity index 92% rename from LICENSE rename to LICENSE.md index 1901e4fc150..0bf57dc9a67 100644 --- a/LICENSE +++ b/LICENSE.md @@ -3,7 +3,7 @@ Countly Product Analytics - Countly Lite License © Countly, https://count.ly -Countly is provided under AGPL v3 with modified Section 7. In accordance +Countly is provided under AGPL-3.0 with modified Section 7. In accordance with Section 7 of the AGPL, the Works included in this package or repository (excluding 3rd party Software), are subject to the following additional terms: