From b353a3ff74ce81555852725242a0134138f57391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Tue, 9 Jul 2024 11:34:26 +0300 Subject: [PATCH 001/381] [SER-1581] Content Builder POC --- Gruntfile.js | 1 + api/utils/countlyFs.js | 5 +- .../countly/vue/components/content.js | 239 ++++++++++++++++++ .../vue/templates/content/content-body.html | 28 ++ .../vue/templates/content/content-header.html | 42 +++ .../vue/templates/content/content.html | 10 + frontend/express/views/dashboard.html | 1 + 7 files changed, 324 insertions(+), 2 deletions(-) create mode 100644 frontend/express/public/javascripts/countly/vue/components/content.js create mode 100644 frontend/express/public/javascripts/countly/vue/templates/content/content-body.html create mode 100644 frontend/express/public/javascripts/countly/vue/templates/content/content-header.html create mode 100644 frontend/express/public/javascripts/countly/vue/templates/content/content.html diff --git a/Gruntfile.js b/Gruntfile.js index 783ccca240e..e2d8055f907 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -144,6 +144,7 @@ module.exports = function(grunt) { 'frontend/express/public/javascripts/countly/vue/components/date.js', 'frontend/express/public/javascripts/countly/vue/components/dropdown.js', 'frontend/express/public/javascripts/countly/vue/components/input.js', + 'frontend/express/public/javascripts/countly/vue/components/content.js', 'frontend/express/public/javascripts/countly/vue/datatable-legacy.js', 'frontend/express/public/javascripts/countly/vue/components/datatable.js', 'frontend/express/public/javascripts/countly/vue/components/dialog.js', diff --git a/api/utils/countlyFs.js b/api/utils/countlyFs.js index 099905ae2fa..95fc6b7411e 100644 --- a/api/utils/countlyFs.js +++ b/api/utils/countlyFs.js @@ -641,10 +641,11 @@ countlyFs.gridfs = {}; bucket.find().toArray() .then((records) => callback( null, - records.map(({ filename, uploadDate, length }) => ({ + records.map(({ filename, uploadDate, length, metadata }) => ({ filename, createdOn: uploadDate, - size: length + size: length, + metadata })) )) .catch((error) => callback(error, null)); diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js new file mode 100644 index 00000000000..20fc7cc97c3 --- /dev/null +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -0,0 +1,239 @@ +/* global Vue, CV */ +(function(countlyVue) { + Vue.component("cly-content-layout", countlyVue.components.create({ + props: { + // meta: { + // type: Object, + // required: true, + // default: function() { + // return {}; + // }, + // validator(prop) { + // return prop.title && prop.version && prop.createdBy; + // } + // } + }, + data: function() { + return { + currentTab: this.meta?.tabs[0]?.value || null, + isActive: false + }; + }, + computed: { + }, + template: CV.T('/javascripts/countly/vue/templates/content/content.html'), + methods: { + } + })); + + Vue.component("cly-content-header", countlyVue.components.create({ + props: { + title: { + type: String, + required: true, + default: null + }, + version: { + type: String, + required: true, + default: null + }, + createdBy: { + type: String, + required: true, + default: null + }, + toggle: { + type: Boolean, + required: false, + default: false + }, + closeButton: { + type: Boolean, + required: false, + default: true + }, + tabs: { + type: Array, + required: false, + default: function() { + return []; + } + }, + status: { + type: String, + required: false, + default: null + }, + saveButtonLabel: { + type: String, + required: false, + default: CV.i18n('common.save') + }, + topDropdownOptions: { + type: Array, + required: false, + default: function() { + return []; + } + }, + hideSaveButton: { + type: Boolean, + required: false, + default: false + } + }, + data: function() { + return { + currentTab: this.tabs[0]?.value || null + }; + }, + watch: { + currentTab: function(newVal) { + this.$emit('tab-change', newVal); + } + }, + methods: { + close: function() { + this.$emit('close'); + }, + save: function() { + this.$emit('save'); + }, + handleCommand: function(event) { + this.$emit('handle-command', event); + } + }, + template: CV.T('/javascripts/countly/vue/templates/content/content-header.html') + })); + + Vue.component("cly-content-body", countlyVue.components.create({ + props: { + currentTab: { + type: String, + required: false, + default: null + }, + hideLeftSidebar: { + type: Boolean, + required: false, + default: false + }, + hideRightSidebar: { + type: Boolean, + required: false, + default: false + }, + collapsible: { + type: Boolean, + required: false, + default: false + } + }, + data: function() { + return { + toggleTransition: 'stdt-slide-right', + isLeftSidebarHidden: this.hideLeftSidebar, + }; + }, + computed: { + }, + template: CV.T('/javascripts/countly/vue/templates/content/content-body.html'), + methods: { + collapseBar: function(position) { + if (position === 'left') { + this.isLeftSidebarHidden = !this.isLeftSidebarHidden; + } + }, + onViewEntered: function() { //? + this.$refs.rootEl.focus(); + } + }, + created: function() { + } + })); + + Vue.component("cly-status-badge", countlyVue.components.create({ + props: { + label: { + type: String, + required: false, + default: 'Status' + }, + color: { + type: String, + required: false, + default: 'gray' + }, + icon: { + type: String, + required: false, + default: 'cly-is cly-is-status' + }, + iconSize: { + type: String, + required: false, + default: '8' + }, + width: { + type: String, + required: false, + default: '55' + }, + height: { + type: String, + required: false, + default: '16' + }, + radius: { + type: String, + required: false, + default: '8' + }, + fontClass: { + type: String, + required: false, + default: 'text-small' + } + }, + data: function() { + return { + colorEnum: { + 'gray': {background: '#E2E4E8', icon: '#81868D'}, + // add more colors when needed + } + }; + }, + computed: { + badgeStyles() { + return { + width: `${this.width}px`, + height: `${this.height}px`, + borderRadius: `${this.radius}px`, + backgroundColor: this.colorEnum[this.color]?.background || this.color, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + padding: '0 8px', + }; + }, + iconStyles() { + return { + color: this.colorEnum[this.color]?.icon || this.color, + fontSize: `${this.iconSize}px`, + marginRight: '4px', + }; + }, + fontStyles() { + return { + color: this.colorEnum[this.color]?.icon || this.color, + }; + } + }, + template: `
+ + {{ label }} +
`, + })); + +}(window.countlyVue = window.countlyVue || {})); diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html new file mode 100644 index 00000000000..e5ae2bf5726 --- /dev/null +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html @@ -0,0 +1,28 @@ +
+ +
+ +
+
+
+

Screens

+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html new file mode 100644 index 00000000000..048896c91fc --- /dev/null +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -0,0 +1,42 @@ +
+
+
+ +
+
+ +
+
+ + +
+
+

{{ title }}

+
+
{{ version }}
+
+
{{ createdBy }}
+
+
+
+
+ +
+
+ +
+ {{ saveButtonLabel }} +
+
+ + + {{ item.label }} + + +
+
+
diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html new file mode 100644 index 00000000000..e89d9760164 --- /dev/null +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -0,0 +1,10 @@ +
+
+ +
+
+ +
+
+ + diff --git a/frontend/express/views/dashboard.html b/frontend/express/views/dashboard.html index d5d693cb2c3..c02a94981d7 100644 --- a/frontend/express/views/dashboard.html +++ b/frontend/express/views/dashboard.html @@ -1798,6 +1798,7 @@

{{this.nam + From e01692bfc7f94c47bb7603f293f9e6c2443a01b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 12 Jul 2024 10:00:16 +0300 Subject: [PATCH 002/381] content builder poc --- .../countly/vue/components/content.js | 2 +- .../vue/templates/content/content-body.html | 17 ++++++++++------- .../countly/vue/templates/content/content.html | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 20fc7cc97c3..72a8edc66c8 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -133,7 +133,7 @@ data: function() { return { toggleTransition: 'stdt-slide-right', - isLeftSidebarHidden: this.hideLeftSidebar, + isLeftSidebarHidden: this.hideLeftSidebar }; }, computed: { diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html index e5ae2bf5726..86053effd81 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html @@ -1,8 +1,8 @@
-
+
-
+

Screens

@@ -18,11 +18,14 @@

Screens

-
+
-
+
\ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html index e89d9760164..eea89793dc2 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -1,8 +1,8 @@ -
+
-
+
From 88b26e0c929799819a923265fd9c59d1a3aaca57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 12 Jul 2024 14:46:49 +0300 Subject: [PATCH 003/381] content-poc z-index issue is fixed --- .../javascripts/countly/vue/templates/content/content.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html index eea89793dc2..e9a456cbf5b 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -1,4 +1,4 @@ -
+
From 556f6bf77a1b445075792374e45c36d26b12b848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Thu, 18 Jul 2024 14:43:17 +0300 Subject: [PATCH 004/381] [SER-1601] Global Component - Full screen editing drawer like component --- .../countly/vue/components/content.js | 242 +++++++++++++++++ .../vue/templates/content/content-body.html | 43 ++- .../vue/templates/content/content-header.html | 44 ++- .../vue/templates/content/content.html | 8 +- .../public/stylesheets/vue/clyvue.scss | 257 ++++++++++++++++++ 5 files changed, 542 insertions(+), 52 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 72a8edc66c8..3f8ac67a241 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -236,4 +236,246 @@
`, })); + Vue.component("cly-content-steps", countlyVue.components.create({ + props: { + header: { + type: String, + required: false, + default: null + }, + }, + data() { + return { + activeSection: ["section"] + }; + }, + methods: { + }, + template: ` +
+
+ + + + + +
+
+ `, + })); + + Vue.component("cly-content-step", countlyVue.components.create({ + props: { + value: { + type: [String, Number, Boolean, Object], + default: null + }, + subHeader: { + type: String, + required: false, + default: null + }, + label: { + type: String, + required: false, + default: null + }, + inputType: { + type: String, + required: false, + default: 'text' + }, + options: { + type: Array, + required: false, + default: () => [] + }, + position: { + type: String, + required: false, + default: 'horizontal' + }, + width: { + type: String, + required: false, + default: null + }, + inputProps: { + type: Object, + required: false, + default: () => ({}) + } + }, + data() { + return { + localValue: this.value, + }; + }, + watch: { + value: function(newValue) { + this.localValue = newValue; + }, + localValue: function(newValue) { + this.$emit('input', newValue); + } + }, + methods: { + updateValue: function(id, newValue) { + this.$set(this.localValues, id, newValue); + this.$emit('input', { ...this.localValues }); + }, + getComponentType: function(type) { + const mapping = { + dropdown: 'el-select', + input: 'el-input', + switch: 'el-switch', + 'color-picker': 'cly-colorpicker', + 'input-number': 'el-input-number', + }; + return mapping[type] || 'div'; + } + }, + created: function() { + }, + template: ` +
+
{{ subHeader }}
+
+
{{ label }}
+ + + + + + +
+
+ `, + })); + + Vue.component("cly-option-swapper", countlyVue.components.BaseComponent.extend({ + mixins: [countlyVue.mixins.i18n], + props: { + value: { + type: [String, Number], + default: null + }, + items: { + type: Array, + default: function() { + return []; + } + }, + activeColorCode: { + type: String, + default: '#0166D6' + }, + width: { + type: String, + default: '100' + } + }, + data: function() { + return { + selectedValue: this.items[0].value || 0 + }; + }, + methods: { + numberChange: function(val) { + this.selectedValue = val; + this.$emit('input', this.selectedValue); + } + }, + created: function() { + this.selectedValue = this.value || this.items[0].value || 0; + }, + template: '
\ +
\ +
\ +
\ + \ + {{ item.text }}\ +
\ +
\ +
\ +
' + })); + + Vue.component("cly-device-selector", countlyVue.components.BaseComponent.extend({ + props: { + value: { + type: String, + default: null + }, + selectedBackground: { + type: String, + default: '#383A3F' + }, + width: { + type: String, + default: '108px' + }, + showDesktop: { + type: Boolean, + default: true + }, + showTablet: { + type: Boolean, + default: true + }, + showMobile: { + type: Boolean, + default: true + } + }, + computed: { + selectedDevice: { + get() { + return this.value; + }, + set(newValue) { + this.$emit('input', newValue); + } + } + }, + template: ` +
+
+ +
+
+ +
+
+ +
+
+ ` + })); }(window.countlyVue = window.countlyVue || {})); diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html index 86053effd81..1956225ac36 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html @@ -1,31 +1,26 @@ -
- -
- -
-
-
-

Screens

- -
-
-
+
+ +
+
+
+

Screens

+ +
+
+
+
-
-
+
+
+
+
- - -
-
+ + +
+
\ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 048896c91fc..cecc8eac8a1 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -1,42 +1,40 @@ -
-
-
- +
+
+
+
-
- +
+
-
+
-
-

{{ title }}

-
-
{{ version }}
-
-
{{ createdBy }}
+
+

{{ title }}

+
+
{{ version }}
+
+
{{ createdBy }}
-
+
-
- -
- {{ saveButtonLabel }} +
+ +
+ {{ saveButtonLabel }}
-
+
- {{ item.label }} + {{ item.label }}
-
+
\ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html index e9a456cbf5b..40fdf24c58c 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -1,10 +1,8 @@ -
-
+
+
-
+
- - diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index 19a9e805ed9..b6589df639c 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4180,4 +4180,261 @@ margin-left: 10px; } } +} + + +.cly-vue-content-builder { + position: absolute; + z-index: 2001; + background-color: white; + // width: 100vw; + width: 100%; + top: 0; + left: 0; + display: flex; + flex-direction: column; + min-height: 100vh; + &__layout-step { + &__component { + .el-input-group__append { + padding: 0 8px !important; + } + } + &__step { + .picker-body--right { + position: absolute !important; + right: 0 !important; + left: auto !important + } + position: relative; + } + &__header { + font-family: Inter; + font-size: 12px; + font-weight: 500; + line-height: 14px; + letter-spacing: 0.5px; + text-align: left; + color: #424243; + margin-bottom: 24px; + } + &__label { + font-family: Inter; + font-size: 13px; + font-weight: 500; + line-height: 16px; + text-align: left; + color: #333C48; + } + &__element { + margin-bottom: 24px; + } + &__sub-header { + font-weight: 500; + } + } + &__layout-steps { + padding: 0 16px; + .el-collapse-item__wrap { + overflow: visible; + } + .el-collapse-item__content { + padding-bottom: 0 !important; + } + background-color: #FFF + } + &__layout-header { + display: flex; + height: 80px; + background-color: #FFFFFF; + align-items: center; + justify-content: space-between; + + &__wrapper { + display: flex; + justify-content: space-between; + align-items: center; + margin-left: 24px; + margin-right: 24px; + height: 80px; + background-color: #FFFFFF; + width: 100%; + } + + &__left { + display: flex; + align-items: center; + width: 350px; + } + + &__icon { + border: 1px solid #d1d1d1; + width: 32px; + height: 32px; + border-radius: 40px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + box-shadow: 0px 1px 2px #D1D1D1; + i { + font-weight: 600; + } + } + + &__toggle { + margin-left: 5px; + margin-right: -8px; + } + + &__info { + margin-left: 24px; + } + + &__info-title { + h4 { + margin: 0; + } + } + + &__info-meta { + display: flex; + font-size: 13px; + } + + &__info-version { + text-decoration: underline; + } + + &__info-separator { + display: flex; + align-items: center; + margin: 0 5px; + i { + font-size: 6px; + } + } + + &__tabs { + width: 350px; + } + + &__actions { + display: flex; + align-items: center; + gap: 16px; + } + } + &__layout-main { + margin: 0px 24px 24px 24px; + border: 1px solid #ECECEC; + border-radius: 8px; + background-color: #FCFCFC; + min-height: calc(100vh - 96px); + + &__body { + display: flex; + justify-content: space-between; + + &__left-sidebar { + width: 230px; + border: 1px solid #ECECEC; + border-radius: 8px; + margin: 8px 0 8px 8px; + min-height: calc(100vh - 96px); + + &__header { + border-bottom: 1px solid #F6F6F6; + padding: 16px; + display: flex; + align-items: center; + justify-content: space-between; + + &__title { + display: flex; + align-items: center; + } + } + } + + &__collapse-button { + padding: 10px; + border: 1px solid rgb(226, 228, 232); + border-radius: 12px; + box-shadow: 1px 1px 1px #E2E4E8; + height: fit-content; + margin-top: 8px; + margin-left: 8px; + cursor: pointer; + + &__icon { + border: 2px solid; + border-radius: 5px; + width: 16px; + height: 17px; + + i { + font-weight: 600; + } + } + } + + &__right-sidebar { + width: 348px; + border: 1px solid rgb(236, 236, 236); + border-radius: 8px; + margin: 8px 8px 8px 8px; + min-height: calc(100vh - 96px); + height: 850px; + overflow-y: auto; + } + } + } + .el-collapse { + border-top: none !important + } +} + +.cly-option-swapper { + display: flex; + justify-content: space-around; + + &__each-box-wrapper { + width: 100%; + } + + &__each { + display: flex; + align-items: center; + justify-content: center; + height: 32px; + border: 1px solid #E2E4E8; + text-align: center; + cursor: pointer; + } + + &__active { + background-color: #0166D6; + border: 1px solid #0166D6; + border-right: 1px solid #0166d6 !important; + } + + &__first { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + } + + &__last { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + } +} + +.cly-vue-device-selector { + background-color: #FFF; + border-radius: 10px; + &__device { + cursor: pointer; + border-radius: 8px; + } } \ No newline at end of file From 9374f350a570212087408fff1086ac597f4ad153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 19 Jul 2024 09:16:21 +0300 Subject: [PATCH 005/381] [SER-1601] fix: colorpicker position glitch on drawer --- .../express/public/stylesheets/vue/clyvue.scss | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index b6589df639c..d21ae70fdb3 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4195,19 +4195,17 @@ flex-direction: column; min-height: 100vh; &__layout-step { + position: relative; + .picker-body--right { + position: absolute !important; + right: 0 !important; + left: auto !important + } &__component { .el-input-group__append { padding: 0 8px !important; } } - &__step { - .picker-body--right { - position: absolute !important; - right: 0 !important; - left: auto !important - } - position: relative; - } &__header { font-family: Inter; font-size: 12px; From d0fe9eeb31da54a92785ecac3c8b20c1781a95f5 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Fri, 19 Jul 2024 15:06:59 +0300 Subject: [PATCH 006/381] hooks insufficient null checks --- plugins/hooks/api/api.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 4c694b25546..84f35800a53 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -284,9 +284,11 @@ plugins.register("/i/hook/save", function(ob) { try { hookConfig = JSON.parse(hookConfig); hookConfig = sanitizeConfig(hookConfig); - if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { - common.returnMessage(params, 400, 'Not enough args'); - return true; + if (hookConfig) { + // Null check for hookConfig + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { + common.returnMessage(params, 400, 'Invalid configuration for effects'); + } } if (hookConfig.effects && !validateEffects(hookConfig.effects)) { @@ -577,8 +579,11 @@ plugins.register("/i/hook/test", function(ob) { hookConfig = sanitizeConfig(hookConfig); const mockData = JSON.parse(params.qstring.mock_data); - if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { - common.returnMessage(params, 403, "hook config invalid"); + if (hookConfig) { + // Null check for hookConfig + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { + common.returnMessage(params, 400, 'Config invalid'); + } } if (hookConfig.effects && !validateEffects(hookConfig.effects)) { From a3e6b992de4d19cce2e4241b967559642f33c6b8 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Fri, 19 Jul 2024 15:13:27 +0300 Subject: [PATCH 007/381] hooks insufficient null checks --- plugins/hooks/api/api.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 84f35800a53..a88ca42f8b7 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -579,6 +579,10 @@ plugins.register("/i/hook/test", function(ob) { hookConfig = sanitizeConfig(hookConfig); const mockData = JSON.parse(params.qstring.mock_data); + if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { + common.returnMessage(params, 403, "hook config invalid"); + } + if (hookConfig) { // Null check for hookConfig if (hookConfig.effects && !validateEffects(hookConfig.effects)) { @@ -586,11 +590,6 @@ plugins.register("/i/hook/test", function(ob) { } } - if (hookConfig.effects && !validateEffects(hookConfig.effects)) { - common.returnMessage(params, 400, 'Config invalid'); - return true; - } - // trigger process log.d(JSON.stringify(hookConfig), "[hook test config]"); const results = []; From 674a9f2819e5cc5cfa68bcfce4ef2731becf4443 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 22 Jul 2024 10:13:21 +0300 Subject: [PATCH 008/381] hooks insufficient null checks test --- plugins/hooks/api/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index a88ca42f8b7..6c2c0ecae01 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -579,7 +579,7 @@ plugins.register("/i/hook/test", function(ob) { hookConfig = sanitizeConfig(hookConfig); const mockData = JSON.parse(params.qstring.mock_data); - if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { + if (!hookConfig || !(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { common.returnMessage(params, 403, "hook config invalid"); } From b7414dd965d83538a60baac56e7313dfb31e043b Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 22 Jul 2024 11:55:07 +0300 Subject: [PATCH 009/381] hooks insufficient null checks test --- plugins/hooks/api/api.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 6c2c0ecae01..1b4ffc9b1c3 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -286,9 +286,9 @@ plugins.register("/i/hook/save", function(ob) { hookConfig = sanitizeConfig(hookConfig); if (hookConfig) { // Null check for hookConfig - if (hookConfig.effects && !validateEffects(hookConfig.effects)) { - common.returnMessage(params, 400, 'Invalid configuration for effects'); - } + if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { + common.returnMessage(params, 400, 'Not enough args'); + return true; } if (hookConfig.effects && !validateEffects(hookConfig.effects)) { From 76d0a56bc25aadabdad5c17521c396e045fe2260 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 22 Jul 2024 11:59:00 +0300 Subject: [PATCH 010/381] hooks insufficient null checks test --- plugins/hooks/api/api.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 1b4ffc9b1c3..62975f9a6d1 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -289,8 +289,9 @@ plugins.register("/i/hook/save", function(ob) { if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { common.returnMessage(params, 400, 'Not enough args'); return true; + } } - + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { common.returnMessage(params, 400, 'Invalid configuration for effects'); return true; From 066d2a5182b88689aede250f86d7aba1e44e2821 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 22 Jul 2024 12:01:07 +0300 Subject: [PATCH 011/381] hooks insufficient null checks test --- plugins/hooks/api/api.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 62975f9a6d1..35f36236402 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -290,8 +290,8 @@ plugins.register("/i/hook/save", function(ob) { common.returnMessage(params, 400, 'Not enough args'); return true; } - } - + + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { common.returnMessage(params, 400, 'Invalid configuration for effects'); return true; @@ -314,6 +314,7 @@ plugins.register("/i/hook/save", function(ob) { } }); } + } hookConfig.createdBy = params.member._id; hookConfig.created_at = new Date().getTime(); return common.db.collection("hooks").insert( From b6ba2fb4f82f32b5038f8f114acce7a89f069ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Thu, 25 Jul 2024 14:33:26 +0300 Subject: [PATCH 012/381] POC of journey builder --- .../countly/vue/components/content.js | 42 ++++++++++++++----- .../vue/templates/content/content-body.html | 8 ++-- .../vue/templates/content/content-header.html | 4 +- .../vue/templates/content/content.html | 7 ++-- .../public/stylesheets/vue/clyvue.scss | 7 ++++ 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 3f8ac67a241..238091a4176 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -2,16 +2,11 @@ (function(countlyVue) { Vue.component("cly-content-layout", countlyVue.components.create({ props: { - // meta: { - // type: Object, - // required: true, - // default: function() { - // return {}; - // }, - // validator(prop) { - // return prop.title && prop.version && prop.createdBy; - // } - // } + backgroundColor: { + type: String, + required: false, + default: null + } }, data: function() { return { @@ -81,6 +76,11 @@ type: Boolean, required: false, default: false + }, + backgroundColor: { + type: String, + required: false, + default: '#fff' } }, data: function() { @@ -125,14 +125,34 @@ default: false }, collapsible: { + type: Boolean, + required: false, + default: true + }, + rightSidebarWidth: { + type: String, + required: false, + default: null + }, + leftSidebarWidth: { + type: String, + required: false, + default: null + }, + hasDashedBackground: { type: Boolean, required: false, default: false + }, + backgroundColor: { + type: String, + required: false, + default: '#fff' } }, data: function() { return { - toggleTransition: 'stdt-slide-right', + toggleTransition: 'stdt-slide-left', isLeftSidebarHidden: this.hideLeftSidebar }; }, diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html index 1956225ac36..091a152eb81 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-body.html @@ -1,4 +1,4 @@ -
+
@@ -6,21 +6,21 @@

Screens

-
+
-
+
-
+
\ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index cecc8eac8a1..8f058d846b1 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -1,4 +1,4 @@ -
+
@@ -22,7 +22,7 @@
- +
diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html index 40fdf24c58c..de9431b03bc 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -1,8 +1,9 @@
-
- +
+ +
-
+
diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index d21ae70fdb3..0c63539a280 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4334,6 +4334,13 @@ display: flex; justify-content: space-between; + &__dashed-bg { + background-color: white; + background-image: radial-gradient(#e0e0e0 1px, transparent 1px), radial-gradient(#e0e0e0 1px, transparent 1px); + background-size: 10px 10px; + background-position: 0 0, 20px 20px; + } + &__left-sidebar { width: 230px; border: 1px solid #ECECEC; From efb72ce2f1ad2ba391d44313fff510f80746a3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Tue, 6 Aug 2024 17:17:42 +0300 Subject: [PATCH 013/381] [SER-1601] Some cosmetic changes --- .../countly/vue/components/content.js | 107 ++++++++++++++---- .../javascripts/countly/vue/components/nav.js | 2 + .../vue/templates/content/content-body.html | 7 +- 3 files changed, 91 insertions(+), 25 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 238091a4176..9eef1cbdd43 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -153,7 +153,23 @@ data: function() { return { toggleTransition: 'stdt-slide-left', - isLeftSidebarHidden: this.hideLeftSidebar + isLeftSidebarHidden: this.hideLeftSidebar, + scrollOps: { + vuescroll: {}, + scrollPanel: { + initialScrollX: false + }, + rail: { + gutterOfSide: "1px", + gutterOfEnds: "15px" + }, + bar: { + background: "#A7AEB8", + size: "6px", + specifyBorderRadius: "3px", + keepShow: false + } + }, }; }, computed: { @@ -328,21 +344,32 @@ }, data() { return { - localValue: this.value, + localValue: this.initializeLocalValue(), }; }, watch: { - value: function(newValue) { - this.localValue = newValue; + value: { + handler: function(newValue) { + this.localValue = this.initializeLocalValue(newValue); + }, + deep: true }, - localValue: function(newValue) { - this.$emit('input', newValue); + localValue: { + handler: function(newValue) { + this.$emit('input', newValue); + }, + deep: true } }, methods: { - updateValue: function(id, newValue) { - this.$set(this.localValues, id, newValue); - this.$emit('input', { ...this.localValues }); + initializeLocalValue(val = this.value) { + if (this.inputType === 'switch') { + return val === true; + } + return val !== undefined ? val : null; + }, + updateValue: function(newValue) { + this.localValue = newValue; }, getComponentType: function(type) { const mapping = { @@ -359,14 +386,14 @@ }, template: `
-
{{ subHeader }}
+
{{ subHeader }}
{{ label }}
\ -
\ -
\ -
\ - \ - {{ item.text }}\ -
\ -
\ -
\ -
' + template: ` +
+
+
+
+ + + + {{ item.text }} + +
+
+
+
+ ` })); Vue.component("cly-device-selector", countlyVue.components.BaseComponent.extend({ diff --git a/frontend/express/public/javascripts/countly/vue/components/nav.js b/frontend/express/public/javascripts/countly/vue/components/nav.js index 9edc7971a7f..c14eca07023 100644 --- a/frontend/express/public/javascripts/countly/vue/components/nav.js +++ b/frontend/express/public/javascripts/countly/vue/components/nav.js @@ -193,6 +193,8 @@
\ Screens

+
+ +
@@ -21,6 +24,8 @@

Screens

- + + +
\ No newline at end of file From 7a111a44071615373da100fd49b9dede83843d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 16 Aug 2024 20:10:40 +0300 Subject: [PATCH 014/381] feature: Added double click to edit header title + some customization props + some color codes for journey triggers --- .../countly/vue/components/content.js | 20 +++++++++++++++++-- .../vue/templates/content/content-header.html | 11 +++++++++- .../stylesheets/styles/base/_colors.scss | 2 ++ .../public/stylesheets/vue/clyvue.scss | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 9eef1cbdd43..1f82713309a 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -85,7 +85,8 @@ }, data: function() { return { - currentTab: this.tabs[0]?.value || null + currentTab: this.tabs[0]?.value || null, + isEditing: false }; }, watch: { @@ -102,6 +103,12 @@ }, handleCommand: function(event) { this.$emit('handle-command', event); + }, + handleDoubleClick: function() { + this.isEditing = true; + }, + finishEditing: function() { + this.isEditing = false; } }, template: CV.T('/javascripts/countly/vue/templates/content/content-header.html') @@ -279,6 +286,11 @@ required: false, default: null }, + collapse: { + type: Boolean, + required: false, + default: true + } }, data() { return { @@ -289,13 +301,17 @@ }, template: `
-
+
+
+
{{ header }}
+ +
`, })); diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 8f058d846b1..7d1e116e8ff 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -13,7 +13,16 @@
-

{{ title }}

+
+

{{ title }}

+ +
{{ version }}
diff --git a/frontend/express/public/stylesheets/styles/base/_colors.scss b/frontend/express/public/stylesheets/styles/base/_colors.scss index 32eb94d11c0..396356628b1 100644 --- a/frontend/express/public/stylesheets/styles/base/_colors.scss +++ b/frontend/express/public/stylesheets/styles/base/_colors.scss @@ -31,9 +31,11 @@ $colors: ( "charts-amber": #F5C900, "charts-orange": #F96300, "charts-magenta": #F34971, + "charts-light-magenta": #FEEDF1, "charts-coral": #FF9382, "charts-violet": #DA6EFC, "charts-purple": #6C47FF, + "charts-light-purple": #F0EDFF, "charts-tan": #CDAD7A, "charts-olive": #AABB5D, "charts-scarlet": #F62404, diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index 0c63539a280..410d31e7959 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4293,6 +4293,9 @@ h4 { margin: 0; } + &__input { + width: 200px; + } } &__info-meta { From 50c5c03877a2e2b6aff8b2397d54ba042b69ab17 Mon Sep 17 00:00:00 2001 From: Gabriel Oliveira Date: Mon, 19 Aug 2024 09:10:13 +0000 Subject: [PATCH 015/381] chore: create symlink for content plugin --- plugins/content | 1 + 1 file changed, 1 insertion(+) create mode 120000 plugins/content diff --git a/plugins/content b/plugins/content new file mode 120000 index 00000000000..ef5b4f9378b --- /dev/null +++ b/plugins/content @@ -0,0 +1 @@ +/opt/countly/plugins/content \ No newline at end of file From 4496dd9a8173ff6393c7f55fd5c5fad81a401e24 Mon Sep 17 00:00:00 2001 From: coskunaydinoglu Date: Fri, 23 Aug 2024 12:46:33 +0300 Subject: [PATCH 016/381] remove symlink --- plugins/content | 1 - 1 file changed, 1 deletion(-) delete mode 120000 plugins/content diff --git a/plugins/content b/plugins/content deleted file mode 120000 index ef5b4f9378b..00000000000 --- a/plugins/content +++ /dev/null @@ -1 +0,0 @@ -/opt/countly/plugins/content \ No newline at end of file From 9bc58a4ddf21f86f3c8cca70764e1486ef7bf781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Mon, 26 Aug 2024 18:45:27 +0300 Subject: [PATCH 017/381] bug-fix: Removed mandatory requirement for version --- .../public/javascripts/countly/vue/components/content.js | 4 ++-- .../countly/vue/templates/content/content-header.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 1f82713309a..c57dc5dbd06 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -30,12 +30,12 @@ }, version: { type: String, - required: true, + required: false, default: null }, createdBy: { type: String, - required: true, + required: false, default: null }, toggle: { diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 7d1e116e8ff..e95df687bd0 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -24,8 +24,8 @@

{{ title }}

/>
-
{{ version }}
-
+
{{ version }}
+
{{ createdBy }}
From 4d9dd00d5d5bff0e7b1a1da85b082428f300ed2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Tue, 27 Aug 2024 17:03:25 +0300 Subject: [PATCH 018/381] bugfix: Editing content title feat: Added prop for disabling save button --- .../countly/vue/components/content.js | 19 +++++++++++++++---- .../vue/templates/content/content-header.html | 6 +++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index c57dc5dbd06..35d8c6d3319 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -23,10 +23,9 @@ Vue.component("cly-content-header", countlyVue.components.create({ props: { - title: { + value: { type: String, - required: true, - default: null + required: true }, version: { type: String, @@ -65,6 +64,11 @@ required: false, default: CV.i18n('common.save') }, + saveButtonDisabled: { + type: Boolean, + required: false, + default: false + }, topDropdownOptions: { type: Array, required: false, @@ -86,10 +90,14 @@ data: function() { return { currentTab: this.tabs[0]?.value || null, - isEditing: false + isEditing: false, + localTitle: this.value }; }, watch: { + value: function(newVal) { + this.localTitle = newVal; + }, currentTab: function(newVal) { this.$emit('tab-change', newVal); } @@ -109,6 +117,9 @@ }, finishEditing: function() { this.isEditing = false; + if (this.localTitle !== this.value) { + this.$emit('input', this.localTitle); + } } }, template: CV.T('/javascripts/countly/vue/templates/content/content-header.html') diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index e95df687bd0..3d64c43b341 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -14,11 +14,11 @@
-

{{ title }}

+

{{ localTitle }}

@@ -36,7 +36,7 @@

{{ title }}

- {{ saveButtonLabel }} + {{ saveButtonLabel }}
From 1454a94de96d41be30abb883890578c04ac3654b Mon Sep 17 00:00:00 2001 From: Gabriel Oliveira Date: Wed, 28 Aug 2024 18:32:15 +0000 Subject: [PATCH 019/381] feat: replicate value change on swapper --- .../public/javascripts/countly/vue/components/content.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 35d8c6d3319..7ebf33f6bca 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -468,6 +468,11 @@ selectedValue: this.items[0].value || 0 }; }, + watch: { + value: function(value) { + this.selectedValue = value; + } + }, methods: { numberChange: function(item) { if (!item.disabled) { From 5f663fd31f7164c6225695355340fcceab3e598c Mon Sep 17 00:00:00 2001 From: John-Weak Date: Thu, 29 Aug 2024 11:17:37 +0530 Subject: [PATCH 020/381] [fix] show input when no value is entered --- .../public/javascripts/countly/vue/components/content.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 7ebf33f6bca..89eacb2b510 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -90,8 +90,8 @@ data: function() { return { currentTab: this.tabs[0]?.value || null, - isEditing: false, - localTitle: this.value + localTitle: this.value, + isEditing: !this.value }; }, watch: { @@ -116,7 +116,9 @@ this.isEditing = true; }, finishEditing: function() { - this.isEditing = false; + if (this.localTitle) { + this.isEditing = false; + } if (this.localTitle !== this.value) { this.$emit('input', this.localTitle); } From 17ca3423e40e47f49c8bdb4c06c08471de3ad0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Thu, 29 Aug 2024 17:12:27 +0300 Subject: [PATCH 021/381] bugfix: topDropdownOptions visibility --- .../countly/vue/templates/content/content-header.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 3d64c43b341..1c2ae20148c 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -38,7 +38,7 @@

{{ localTitle }}

{{ saveButtonLabel }}
-
+
{{ item.label }} From d59513026ad16818368df2369abcf123c06b313e Mon Sep 17 00:00:00 2001 From: Kanwar Ujjaval Singh <4216199+kanwarujjaval@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:54:52 +0530 Subject: [PATCH 022/381] alpha bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8acb0fc35e7..e6ff3325e6b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "countly-server", - "version": "24.5.0", + "version": "24.10.0-alpha", "description": "innovative, real-time, open source mobile analytics application", "keywords": [ "analytics", From c724af40c247262a590aed0d9d113aaa54df02a2 Mon Sep 17 00:00:00 2001 From: Kanwar Ujjaval Singh <4216199+kanwarujjaval@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:52:07 +0530 Subject: [PATCH 023/381] alpha bump --- frontend/express/version.info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/express/version.info.js b/frontend/express/version.info.js index 54255d3afa2..7e9e74be80d 100644 --- a/frontend/express/version.info.js +++ b/frontend/express/version.info.js @@ -1,5 +1,5 @@ var versionInfo = { - version: "24.05.2", + version: "24.10.0-alpha", type: "777a2bf527a18e0fffe22fb5b3e322e68d9c07a6" }; try { From 11383be6a3e22689cfc1d063343088959bd77d36 Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Wed, 4 Sep 2024 21:54:12 +0300 Subject: [PATCH 024/381] journey publish toggle --- .../public/javascripts/countly/vue/components/content.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 89eacb2b510..97ff7ca3a8b 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -91,7 +91,8 @@ return { currentTab: this.tabs[0]?.value || null, localTitle: this.value, - isEditing: !this.value + isEditing: !this.value, + isActive: false }; }, watch: { @@ -103,6 +104,10 @@ } }, methods: { + toggleChanged(newValue) { + this.console.log('toggleChanged'); + this.$emit('toggleChanged', newValue); + }, close: function() { this.$emit('close'); }, From 8ca25eb29b9cb238e2756185b5903176fd4a239d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Thu, 5 Sep 2024 17:11:31 +0300 Subject: [PATCH 025/381] feat: additional file method in fs library bugfix: z-index fix for nested modal after implemented content asset uplader modal into content builder. --- api/utils/countlyFs.js | 61 ++++++++++++++++++- .../public/stylesheets/vue/clyvue.scss | 2 + 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/api/utils/countlyFs.js b/api/utils/countlyFs.js index 95fc6b7411e..b047de5491c 100644 --- a/api/utils/countlyFs.js +++ b/api/utils/countlyFs.js @@ -316,6 +316,64 @@ countlyFs.gridfs = {}; } }; + /** + * Update file fields by ID + * @param {string} category - collection where the file is stored + * @param {string} id - file id + * @param {object} updateFields - fields to update + * @param {function} callback - function called when updating was completed or errored, providing error object as first param + * @example + * countlyFs.gridfs.updateFileById("test", "66d6c2d770434130c03b7dae", { filename: "newname.png", "metadata.tags": "newtag" }, function(err){ + * console.log("Update finished", err); + * }); + */ + ob.updateFileById = function(category, id, updateFields, callback) { + if (!db) { + if (callback) { + callback(new Error("Database connection not available")); + } + return; + } + + const collection = db.collection(category + ".files"); + const setOps = {}; + + for (const [key, value] of Object.entries(updateFields)) { + if (key.startsWith('metadata.')) { + setOps[key] = value; + } + else { + setOps[key] = value; + } + } + + collection.updateOne( + { _id: new db.ObjectID(id) }, + { $set: setOps }, + function(err, result) { + if (err) { + log.e("Error updating file:", err); + if (callback) { + callback(err); + } + return; + } + + if (result.matchedCount === 0) { + if (callback) { + callback(new Error("File not found")); + } + return; + } + + log.d("File updated successfully"); + if (callback) { + callback(null); + } + } + ); + }; + /** * Delete file from shared system * @param {string} category - collection where to store data @@ -641,7 +699,8 @@ countlyFs.gridfs = {}; bucket.find().toArray() .then((records) => callback( null, - records.map(({ filename, uploadDate, length, metadata }) => ({ + records.map(({ _id, filename, uploadDate, length, metadata }) => ({ + _id, filename, createdOn: uploadDate, size: length, diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index 410d31e7959..0e91d35b13a 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4186,6 +4186,8 @@ .cly-vue-content-builder { position: absolute; z-index: 2001; + // z-index: 2006; + // z-index: 9999999; background-color: white; // width: 100vw; width: 100%; From a0f0f298ae0ff06229d5d11b064551cd2fb18a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Mon, 9 Sep 2024 18:00:05 +0300 Subject: [PATCH 026/381] fix: content asset api changes & audit log localizations --- api/utils/countlyFs.js | 14 +++++--------- .../public/localization/systemlogs.properties | 8 +++++++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/api/utils/countlyFs.js b/api/utils/countlyFs.js index b047de5491c..43c1d917167 100644 --- a/api/utils/countlyFs.js +++ b/api/utils/countlyFs.js @@ -339,17 +339,13 @@ countlyFs.gridfs = {}; const setOps = {}; for (const [key, value] of Object.entries(updateFields)) { - if (key.startsWith('metadata.')) { - setOps[key] = value; - } - else { - setOps[key] = value; - } + setOps[key] = value; } - collection.updateOne( + collection.findOneAndUpdate( { _id: new db.ObjectID(id) }, { $set: setOps }, + { returnOriginal: true }, function(err, result) { if (err) { log.e("Error updating file:", err); @@ -359,7 +355,7 @@ countlyFs.gridfs = {}; return; } - if (result.matchedCount === 0) { + if (!result.value) { if (callback) { callback(new Error("File not found")); } @@ -368,7 +364,7 @@ countlyFs.gridfs = {}; log.d("File updated successfully"); if (callback) { - callback(null); + callback(null, result.value); } } ); diff --git a/plugins/systemlogs/frontend/public/localization/systemlogs.properties b/plugins/systemlogs/frontend/public/localization/systemlogs.properties index 92836e9cc46..e7ddd7872fd 100644 --- a/plugins/systemlogs/frontend/public/localization/systemlogs.properties +++ b/plugins/systemlogs/frontend/public/localization/systemlogs.properties @@ -70,4 +70,10 @@ systemlogs.action.populator_template_removed = Populator template removed systemlogs.action.populator_template_edited = Populator template edited systemlogs.action.view_recalculation_finished = View recalculation finished systemlogs.action.view_segments_ommit = View segments ommit -systemlogs.action.view_segments_ommit_complete = View segments ommit complete \ No newline at end of file +systemlogs.action.view_segments_ommit_complete = View segments ommit complete +systemlogs.action.cb-content_asset-updated = Content Builder Asset Updated +systemlogs.action.cb-content_asset-uploaded = Content Builder Asset Uploaded +systemlogs.action.cb-content_asset-deleted = Content Builder Asset Deleted +systemlogs.action.cb-content_block-edit = Content Builder Block Edited +systemlogs.action.cb-content_block-create = Content Builder Block Created +systemlogs.action.cb-content_block-delete = Content Builder Block Deleted \ No newline at end of file From a333d0fbe707742e1800c23d3e851e851d7e2711 Mon Sep 17 00:00:00 2001 From: coskunaydinoglu Date: Tue, 10 Sep 2024 13:53:03 +0300 Subject: [PATCH 027/381] Update frontend/express/public/javascripts/countly/vue/components/content.js Co-authored-by: Gabriel Oliveira Pinto --- .../express/public/javascripts/countly/vue/components/content.js | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 97ff7ca3a8b..167249ecacb 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -105,7 +105,6 @@ }, methods: { toggleChanged(newValue) { - this.console.log('toggleChanged'); this.$emit('toggleChanged', newValue); }, close: function() { From 935ef4518778ede0d35cb5652b16b7773752b6f2 Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Thu, 12 Sep 2024 15:59:56 +0300 Subject: [PATCH 028/381] pop-up cancel --- .../javascripts/countly/vue/components/content.js | 12 ++++++++++-- .../vue/templates/content/content-header.html | 5 +++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index 97ff7ca3a8b..6eb604843aa 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -85,14 +85,22 @@ type: String, required: false, default: '#fff' + }, + isToggleActive: { + type: Boolean, + required: false, + default: false + }, + toggleTooltip: { + type: String, + required: false } }, data: function() { return { currentTab: this.tabs[0]?.value || null, localTitle: this.value, - isEditing: !this.value, - isActive: false + isEditing: !this.value }; }, watch: { diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 1c2ae20148c..02572c2f531 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -8,8 +8,9 @@
+ v-tooltip="toggleTooltip" + :value="isToggleActive" + @change="$emit('switch-toggle', $event)">
From 379d5298e3528a5ba564e4e897b4ce695caa94a7 Mon Sep 17 00:00:00 2001 From: Burak Ekin Date: Mon, 16 Sep 2024 06:34:37 +0000 Subject: [PATCH 029/381] new color is added for journey part --- frontend/express/public/stylesheets/styles/base/_colors.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/express/public/stylesheets/styles/base/_colors.scss b/frontend/express/public/stylesheets/styles/base/_colors.scss index 396356628b1..1cf70775392 100644 --- a/frontend/express/public/stylesheets/styles/base/_colors.scss +++ b/frontend/express/public/stylesheets/styles/base/_colors.scss @@ -41,6 +41,7 @@ $colors: ( "charts-scarlet": #F62404, "charts-pink": #FFB6F5, "charts-teal": #39C0C8, + "charts-light-teal": #EBF9F9, "yellow-100": #E49700, "yellow-70": #FFC760, From ccb57c2520bd58f48ef3ba9e8b7c01db8d2d4142 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 23 Sep 2024 17:00:00 +0300 Subject: [PATCH 030/381] nul checks test commit --- plugins/hooks/api/api.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 35f36236402..5b646ad08d5 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -587,7 +587,8 @@ plugins.register("/i/hook/test", function(ob) { if (hookConfig) { // Null check for hookConfig - if (hookConfig.effects && !validateEffects(hookConfig.effects)) { + const hookConfigEffects = hookConfig.effects; + if (hookConfigEffects && !validateEffects(hookConfigEffects)) { common.returnMessage(params, 400, 'Config invalid'); } } From e7988086da6de9558067dbe9c040ffb0582fddbe Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Mon, 23 Sep 2024 17:08:06 +0300 Subject: [PATCH 031/381] nul checks test commit --- plugins/hooks/api/api.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 5b646ad08d5..7a8ae505d9f 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -587,7 +587,6 @@ plugins.register("/i/hook/test", function(ob) { if (hookConfig) { // Null check for hookConfig - const hookConfigEffects = hookConfig.effects; if (hookConfigEffects && !validateEffects(hookConfigEffects)) { common.returnMessage(params, 400, 'Config invalid'); } @@ -598,15 +597,16 @@ plugins.register("/i/hook/test", function(ob) { const results = []; // build mock data - const trigger = hookConfig.trigger; - hookConfig._id = null; - log.d("[hook test mock data]", mockData); - const obj = { - is_mock: true, - params: mockData, - rule: hookConfig - }; - + if(hookConfig){ + const trigger = hookConfig?.trigger; + hookConfig._id = null; + log.d("[hook test mock data]", mockData); + const obj = { + is_mock: true, + params: mockData, + rule: hookConfig + }; + } log.d("[hook test config data]", obj); const t = new Triggers[trigger.type]({ rules: [hookConfig], From c852609b9b3dc1c4da6ce234f6bac7aca279065c Mon Sep 17 00:00:00 2001 From: Kanwar Ujjaval Singh <4216199+kanwarujjaval@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:08:30 +0530 Subject: [PATCH 032/381] node 20 eslint compat --- .eslintrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index fdd2a9484a6..34de2c4ad15 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -212,7 +212,7 @@ "node": true }, "parserOptions": { - "ecmaVersion": 2020 + "ecmaVersion": 2023 }, "rules": { "no-console": "off", From 54700aed44b543ff33f0e8127dd9bbc45c6c37f2 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Wed, 2 Oct 2024 09:19:50 +0300 Subject: [PATCH 033/381] deepscan new issues --- plugins/hooks/api/api.js | 64 +++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 7a8ae505d9f..5ba9e789966 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -290,31 +290,31 @@ plugins.register("/i/hook/save", function(ob) { common.returnMessage(params, 400, 'Not enough args'); return true; } - - if (hookConfig.effects && !validateEffects(hookConfig.effects)) { - common.returnMessage(params, 400, 'Invalid configuration for effects'); - return true; - } - if (hookConfig._id) { - const id = hookConfig._id; - delete hookConfig._id; - return common.db.collection("hooks").findAndModify( - { _id: common.db.ObjectID(id) }, - {}, - {$set: hookConfig}, - {new: true}, - function(err, result) { - if (!err) { - common.returnOutput(params, result && result.value); - } - else { - common.returnMessage(params, 500, "Failed to save an hook"); - } - }); + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { + common.returnMessage(params, 400, 'Invalid configuration for effects'); + return true; + } + + if (hookConfig._id) { + const id = hookConfig._id; + delete hookConfig._id; + return common.db.collection("hooks").findAndModify( + { _id: common.db.ObjectID(id) }, + {}, + {$set: hookConfig}, + {new: true}, + function(err, result) { + if (!err) { + common.returnOutput(params, result && result.value); + } + else { + common.returnMessage(params, 500, "Failed to save an hook"); + } + }); + } } - } hookConfig.createdBy = params.member._id; hookConfig.created_at = new Date().getTime(); return common.db.collection("hooks").insert( @@ -587,7 +587,7 @@ plugins.register("/i/hook/test", function(ob) { if (hookConfig) { // Null check for hookConfig - if (hookConfigEffects && !validateEffects(hookConfigEffects)) { + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { common.returnMessage(params, 400, 'Config invalid'); } } @@ -597,16 +597,14 @@ plugins.register("/i/hook/test", function(ob) { const results = []; // build mock data - if(hookConfig){ - const trigger = hookConfig?.trigger; - hookConfig._id = null; - log.d("[hook test mock data]", mockData); - const obj = { - is_mock: true, - params: mockData, - rule: hookConfig - }; - } + const trigger = hookConfig?.trigger; + hookConfig._id = null; + log.d("[hook test mock data]", mockData); + const obj = { + is_mock: true, + params: mockData, + rule: hookConfig + }; log.d("[hook test config data]", obj); const t = new Triggers[trigger.type]({ rules: [hookConfig], From 3f2dba8e83b2ffd8d93d15f3a2a305af906c4e15 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Wed, 2 Oct 2024 10:08:45 +0300 Subject: [PATCH 034/381] deepscan new issues --- plugins/hooks/api/api.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 5ba9e789966..530dd6a6458 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -573,32 +573,42 @@ plugins.register("/i/hook/test", function(ob) { let hookConfig = params.qstring.hook_config; if (!hookConfig) { common.returnMessage(params, 400, 'Invalid hookConfig'); - return true; + return; } try { hookConfig = JSON.parse(hookConfig); + if (!hookConfig) { + common.returnMessage(params, 400, 'Parsed hookConfig is invalid'); + return; + } hookConfig = sanitizeConfig(hookConfig); const mockData = JSON.parse(params.qstring.mock_data); - if (!hookConfig || !(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { + if (!(common.validateArgs(hookConfig, CheckHookProperties(hookConfig)))) { common.returnMessage(params, 403, "hook config invalid"); + return; // Add return to exit early } - if (hookConfig) { - // Null check for hookConfig - if (hookConfig.effects && !validateEffects(hookConfig.effects)) { - common.returnMessage(params, 400, 'Config invalid'); - } + // Null check for effects + if (hookConfig.effects && !validateEffects(hookConfig.effects)) { + common.returnMessage(params, 400, 'Config invalid'); + return; // Add return to exit early } + // trigger process log.d(JSON.stringify(hookConfig), "[hook test config]"); const results = []; // build mock data - const trigger = hookConfig?.trigger; + const trigger = hookConfig.trigger; + if (!trigger) { + common.returnMessage(params, 400, 'Trigger is missing'); + return; + } hookConfig._id = null; + log.d("[hook test mock data]", mockData); const obj = { is_mock: true, @@ -610,7 +620,7 @@ plugins.register("/i/hook/test", function(ob) { rules: [hookConfig], }); - // out put trigger result + // output trigger result const triggerResult = await t.process(obj); log.d("[hook trigger test result]", triggerResult); results.push(JSON.parse(JSON.stringify(triggerResult))); From d9f219c5b277b02caeec465c41c2e250fd1feadb Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Wed, 2 Oct 2024 10:29:36 +0300 Subject: [PATCH 035/381] deepscan new issues --- plugins/hooks/api/api.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/hooks/api/api.js b/plugins/hooks/api/api.js index 530dd6a6458..532cedc5d24 100644 --- a/plugins/hooks/api/api.js +++ b/plugins/hooks/api/api.js @@ -315,8 +315,10 @@ plugins.register("/i/hook/save", function(ob) { }); } } - hookConfig.createdBy = params.member._id; - hookConfig.created_at = new Date().getTime(); + if (hookConfig) { + hookConfig.createdBy = params.member._id; // Accessing property now with proper check + hookConfig.created_at = new Date().getTime(); + } return common.db.collection("hooks").insert( hookConfig, function(err, result) { From 403a693ba134ff73e22b9bbb9df8b5750703517d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 4 Oct 2024 14:08:45 +0300 Subject: [PATCH 036/381] merge with content-builder branch --- .../core/date-presets/stylesheets/_main.scss | 95 ------------------- .../templates/preset-management.html | 3 +- .../countly/vue/components/content.js | 95 ++++++++----------- .../countly/vue/components/datatable.js | 14 ++- .../vue/templates/content/content-header.html | 11 ++- .../stylesheets/styles/base/_colors.scss | 3 +- .../stylesheets/styles/blocks/_table.scss | 63 ++++++++++++ .../public/stylesheets/vue/clyvue.scss | 9 +- 8 files changed, 130 insertions(+), 163 deletions(-) diff --git a/frontend/express/public/core/date-presets/stylesheets/_main.scss b/frontend/express/public/core/date-presets/stylesheets/_main.scss index a2457032c00..07c90c49a76 100755 --- a/frontend/express/public/core/date-presets/stylesheets/_main.scss +++ b/frontend/express/public/core/date-presets/stylesheets/_main.scss @@ -1,98 +1,3 @@ - -.preset-table { - - .el-table { - background-color: unset; - - &__body { - border-collapse: separate; - border-spacing: 0 8px; - } - - &__row { - cursor: pointer; - - td { - cursor: pointer; - height: 56px; - border-top: 1px solid #ECECEC !important; - border-bottom: 2px solid #ECECEC !important; - background-color: #FFF !important; - padding: 18px 0px; - - &:first-child { - border-left: 1px solid #ECECEC !important; - border-radius: 4px 0 0 4px !important; - } - - &:last-child { - border-right: 1px solid #ECECEC !important; - border-radius: 0 4px 4px 0 !important; - } - - .cell { - line-height: 20px; - } - - &.drag-icon { - .cell { - text-overflow: unset !important; - } - } - } - } - - // tr:hover { - // td { - // border-top: 1px solid #0166D6 !important; - // border-bottom: 2px solid #0166D6 !important; - // background-color: #FFF !important; - - // &:first-child { - // border-left: 1px solid #0166D6 !important; - // } - - // &:last-child { - // border-right: 1px solid #0166D6 !important; - // } - // } - // } - - // .cly-vue-more-options { - // position: absolute; - // top: calc(50% - 16px); - // right: calc(50% - 20px); - - // .el-select-dropdown { - // //display: block !important; - // } - // } - - .sortable-chosen { - .cly-vue-more-options { - display: none !important; - } - } - - thead { - tr { - background-color: unset !important; - } - } - - th { - background-color: unset !important; - border: none !important; - padding: 0 !important; - color: #81868D !important; - } - - &__fixed-right::before { - height: 0 !important; - } - } -} - .preset-list { display: inline-block; diff --git a/frontend/express/public/core/date-presets/templates/preset-management.html b/frontend/express/public/core/date-presets/templates/preset-management.html index 0b867e380ab..335655c71a9 100755 --- a/frontend/express/public/core/date-presets/templates/preset-management.html +++ b/frontend/express/public/core/date-presets/templates/preset-management.html @@ -8,8 +8,9 @@ - + - - {{ label }} -
`, + template: ` +
+ + {{ label }} +
+ `, })); Vue.component("cly-content-steps", countlyVue.components.create({ @@ -603,4 +588,4 @@
` })); -}(window.countlyVue = window.countlyVue || {})); +}(window.countlyVue = window.countlyVue || {})); \ No newline at end of file diff --git a/frontend/express/public/javascripts/countly/vue/components/datatable.js b/frontend/express/public/javascripts/countly/vue/components/datatable.js index 07309baadec..f2b65f01284 100644 --- a/frontend/express/public/javascripts/countly/vue/components/datatable.js +++ b/frontend/express/public/javascripts/countly/vue/components/datatable.js @@ -109,6 +109,9 @@ }); } var filteredTotal = currentArray.length; + if (this.displayMode === 'list') { + this.controlParams.perPage = currentArray.length; + } if (this.controlParams.perPage < currentArray.length) { var startIndex = (this.controlParams.page - 1) * this.controlParams.perPage, endIndex = startIndex + this.controlParams.perPage; @@ -947,6 +950,13 @@ sortable: { type: Boolean, default: false + }, + displayMode: { + type: String, + default: null, + validator: function(value) { + return ['list', /** add others if needed */].indexOf(value) !== -1; + } } }, data: function() { @@ -1000,7 +1010,9 @@ if (!this.forceLoading && this.dataSource && this.externalStatus === 'silent-pending') { classes.push("silent-loading"); } - + if (this.displayMode) { + classes.push("display-mode--" + this.displayMode); + } return classes; }, sourceRows: function() { diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html index 02572c2f531..ac130e25d76 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content-header.html @@ -6,10 +6,11 @@
-
+
@@ -35,13 +36,13 @@

{{ localTitle }}

- +
- {{ saveButtonLabel }} + {{ saveButtonLabel }}
- + {{ item.label }} diff --git a/frontend/express/public/stylesheets/styles/base/_colors.scss b/frontend/express/public/stylesheets/styles/base/_colors.scss index 1cf70775392..44109c9462b 100644 --- a/frontend/express/public/stylesheets/styles/base/_colors.scss +++ b/frontend/express/public/stylesheets/styles/base/_colors.scss @@ -27,6 +27,7 @@ $colors: ( "cool-gray-05": #FBFDFE, "charts-blue": #017AFF, + "charts-light-turquoise": #EBF9F9, "charts-turquoise": #39C0C8, "charts-amber": #F5C900, "charts-orange": #F96300, @@ -40,8 +41,6 @@ $colors: ( "charts-olive": #AABB5D, "charts-scarlet": #F62404, "charts-pink": #FFB6F5, - "charts-teal": #39C0C8, - "charts-light-teal": #EBF9F9, "yellow-100": #E49700, "yellow-70": #FFC760, diff --git a/frontend/express/public/stylesheets/styles/blocks/_table.scss b/frontend/express/public/stylesheets/styles/blocks/_table.scss index 4beeb3c8e03..5ffa992f884 100644 --- a/frontend/express/public/stylesheets/styles/blocks/_table.scss +++ b/frontend/express/public/stylesheets/styles/blocks/_table.scss @@ -14,6 +14,69 @@ } } + &.display-mode { + &--list { + .el-table { + background-color: unset; + + &__body { + border-collapse: separate; + border-spacing: 0 8px; + } + + &__row { + cursor: pointer; + + td { + cursor: pointer; + height: 56px; + border-top: 1px solid #ECECEC !important; + border-bottom: 2px solid #ECECEC !important; + background-color: #FFF !important; + padding: 18px 0px; + + &:first-child { + border-left: 1px solid #ECECEC !important; + border-radius: 4px 0 0 4px !important; + } + + &:last-child { + border-right: 1px solid #ECECEC !important; + border-radius: 0 4px 4px 0 !important; + } + + .cell { + line-height: 20px; + } + + &.drag-icon { + .cell { + text-overflow: unset !important; + } + } + } + } + + thead { + tr { + background-color: unset !important; + } + } + + th { + background-color: unset !important; + border: none !important; + padding: 0 !important; + color: #81868D !important; + } + + &__fixed-right::before { + height: 0 !important; + } + } + } + } + &__header { height: 56px; border-left: none; diff --git a/frontend/express/public/stylesheets/vue/clyvue.scss b/frontend/express/public/stylesheets/vue/clyvue.scss index 0e91d35b13a..1ff0a6fa38a 100644 --- a/frontend/express/public/stylesheets/vue/clyvue.scss +++ b/frontend/express/public/stylesheets/vue/clyvue.scss @@ -4333,7 +4333,7 @@ border: 1px solid #ECECEC; border-radius: 8px; background-color: #FCFCFC; - min-height: calc(100vh - 96px); + min-height: calc(100vh - 106px); &__body { display: flex; @@ -4351,7 +4351,7 @@ border: 1px solid #ECECEC; border-radius: 8px; margin: 8px 0 8px 8px; - min-height: calc(100vh - 96px); + min-height: calc(100vh - 124px); &__header { border-bottom: 1px solid #F6F6F6; @@ -4394,8 +4394,9 @@ border: 1px solid rgb(236, 236, 236); border-radius: 8px; margin: 8px 8px 8px 8px; - min-height: calc(100vh - 96px); - height: 850px; + // min-height: calc(100vh - 124px); + height: calc(100vh - 124px); + // height: 850px; overflow-y: auto; } } From 9d578e4a8612ce2008ae9062705c3cb4abac9afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Tue, 8 Oct 2024 14:22:46 +0300 Subject: [PATCH 037/381] fix: Color code update --- frontend/express/public/stylesheets/styles/base/_colors.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/express/public/stylesheets/styles/base/_colors.scss b/frontend/express/public/stylesheets/styles/base/_colors.scss index 1cf70775392..d571d5d2f4a 100644 --- a/frontend/express/public/stylesheets/styles/base/_colors.scss +++ b/frontend/express/public/stylesheets/styles/base/_colors.scss @@ -28,6 +28,7 @@ $colors: ( "charts-blue": #017AFF, "charts-turquoise": #39C0C8, + "charts-light-turquoise": #EBF9F9, "charts-amber": #F5C900, "charts-orange": #F96300, "charts-magenta": #F34971, @@ -40,8 +41,6 @@ $colors: ( "charts-olive": #AABB5D, "charts-scarlet": #F62404, "charts-pink": #FFB6F5, - "charts-teal": #39C0C8, - "charts-light-teal": #EBF9F9, "yellow-100": #E49700, "yellow-70": #FFC760, From 8de0640498f0c73b5577745dcc80a20551163474 Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Tue, 8 Oct 2024 15:49:48 +0300 Subject: [PATCH 038/381] fix deepscan issues --- .../public/core/events/javascripts/countly.details.models.js | 2 +- .../public/core/events/javascripts/countly.overview.models.js | 4 ++-- plugins/alerts/frontend/public/javascripts/countly.views.js | 4 ++-- plugins/compare/frontend/public/javascripts/countly.models.js | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/express/public/core/events/javascripts/countly.details.models.js b/frontend/express/public/core/events/javascripts/countly.details.models.js index 13c4af6a146..e81bd33d747 100644 --- a/frontend/express/public/core/events/javascripts/countly.details.models.js +++ b/frontend/express/public/core/events/javascripts/countly.details.models.js @@ -1077,7 +1077,7 @@ .then(function(resp) { if (resp) { context.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); - context.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); + context?.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); } }); } diff --git a/frontend/express/public/core/events/javascripts/countly.overview.models.js b/frontend/express/public/core/events/javascripts/countly.overview.models.js index 1eb01e5ccfa..8937d9a97a0 100644 --- a/frontend/express/public/core/events/javascripts/countly.overview.models.js +++ b/frontend/express/public/core/events/javascripts/countly.overview.models.js @@ -107,9 +107,9 @@ return monitorData; }, getOverviewConfigureList: function(eventsList, groupList) { - var map = eventsList.map || {}; var allEvents = []; if (eventsList && eventsList.list) { + var map = eventsList.map || {}; eventsList.list.forEach(function(item) { if (!map[item] || (map[item] && (map[item].is_visible || map[item].is_visible === undefined))) { var label; @@ -141,9 +141,9 @@ return allEvents; }, getEventMapping: function(eventsList, groupList) { - var map = eventsList.map || {}; var mapping = {}; if (eventsList && eventsList.list) { + var map = eventsList.map || {}; eventsList.list.forEach(function(item) { var obj = { "eventKey": item, diff --git a/plugins/alerts/frontend/public/javascripts/countly.views.js b/plugins/alerts/frontend/public/javascripts/countly.views.js index 3147a38370c..1ba08964aa4 100644 --- a/plugins/alerts/frontend/public/javascripts/countly.views.js +++ b/plugins/alerts/frontend/public/javascripts/countly.views.js @@ -992,10 +992,10 @@ if (newState.alertBy === "email") { - if (newState?.allGroups?.length) { + if (newState.allGroups?.length) { this.selectedRadioButton = "toGroup"; } - if (newState?.alertValues?.length) { + if (newState.alertValues?.length) { this.selectedRadioButton = "specificAddress"; } } diff --git a/plugins/compare/frontend/public/javascripts/countly.models.js b/plugins/compare/frontend/public/javascripts/countly.models.js index b9f3fbc2691..49a3c328a16 100644 --- a/plugins/compare/frontend/public/javascripts/countly.models.js +++ b/plugins/compare/frontend/public/javascripts/countly.models.js @@ -201,9 +201,9 @@ return lineLegend; }, getAllEventsList: function(eventsList, groupList) { - var map = eventsList.map || {}; var allEvents = []; if (eventsList) { + var map = eventsList.map || {}; eventsList.list.forEach(function(item) { if (!map[item] || (map[item] && (map[item].is_visible || map[item].is_visible === undefined))) { var label; @@ -245,9 +245,9 @@ return obj; }, getTableStateMap: function(eventsList, groupList) { - var map = eventsList.map || {}; var allEvents = {}; if (eventsList) { + var map = eventsList.map || {}; eventsList.list.forEach(function(item) { if (!map[item] || (map[item] && (map[item].is_visible || map[item].is_visible === undefined))) { allEvents[countlyCompareEvents.helpers.decode(item)] = true; From 8d1bf553d13d06e4f4ab809edd57ac807c4b59d5 Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Tue, 8 Oct 2024 15:57:40 +0300 Subject: [PATCH 039/381] fix another deepscan problems --- api/parts/data/fetch.js | 7 ++++++- .../core/events/javascripts/countly.details.models.js | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/api/parts/data/fetch.js b/api/parts/data/fetch.js index c94f20bb422..5c1c00c3816 100644 --- a/api/parts/data/fetch.js +++ b/api/parts/data/fetch.js @@ -1326,7 +1326,12 @@ fetch.fetchTimeObj = function(collection, params, isCustomEvent, options) { if (params?.qstring?.event) { output.eventName = params.qstring.event; } - common.returnOutput(params, output); + if (params) { + common.returnOutput(params, output); + } + else { + console.error("Params is null or undefined."); + } }); }; diff --git a/frontend/express/public/core/events/javascripts/countly.details.models.js b/frontend/express/public/core/events/javascripts/countly.details.models.js index e81bd33d747..379ab278a2c 100644 --- a/frontend/express/public/core/events/javascripts/countly.details.models.js +++ b/frontend/express/public/core/events/javascripts/countly.details.models.js @@ -1076,7 +1076,7 @@ countlyAllEvents.service.fetchSelectedEventsOverview(context, period) .then(function(resp) { if (resp) { - context.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); + context?.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); context?.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); } }); From ddbb6f79fd0041247806e1e73ae35b4a289eb5bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 01:46:59 +0000 Subject: [PATCH 040/381] Bump express-session from 1.18.0 to 1.18.1 Bumps [express-session](https://github.com/expressjs/session) from 1.18.0 to 1.18.1. - [Release notes](https://github.com/expressjs/session/releases) - [Changelog](https://github.com/expressjs/session/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/session/compare/v1.18.0...v1.18.1) --- updated-dependencies: - dependency-name: express-session dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 20 +++++--------------- package.json | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6e2992e34f..c553f295c4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "errorhandler": "1.5.1", "express": "4.21.0", "express-rate-limit": "7.4.1", - "express-session": "1.18.0", + "express-session": "1.18.1", "form-data": "^4.0.0", "formidable": "2.1.1", "fs-extra": "11.2.0", @@ -4771,12 +4771,11 @@ } }, "node_modules/express-session": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", - "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", - "license": "MIT", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", + "integrity": "sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==", "dependencies": { - "cookie": "0.6.0", + "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", @@ -4789,15 +4788,6 @@ "node": ">= 0.8.0" } }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express-session/node_modules/cookie-signature": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", diff --git a/package.json b/package.json index fc64d85e593..fd86f9936dc 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "errorhandler": "1.5.1", "express": "4.21.0", "express-rate-limit": "7.4.1", - "express-session": "1.18.0", + "express-session": "1.18.1", "form-data": "^4.0.0", "formidable": "2.1.1", "fs-extra": "11.2.0", From a92bf17f1ad3194a56917682257e4f736512ba1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 01:47:07 +0000 Subject: [PATCH 041/381] Bump form-data from 4.0.0 to 4.0.1 Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/form-data/form-data/releases) - [Commits](https://github.com/form-data/form-data/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: form-data dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6e2992e34f..62a0b6f0d52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5371,10 +5371,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", From be895d10ab00e93ddbc95a60279014f023676556 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 01:47:20 +0000 Subject: [PATCH 042/381] Bump express from 4.21.0 to 4.21.1 Bumps [express](https://github.com/expressjs/express) from 4.21.0 to 4.21.1. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.1) --- updated-dependencies: - dependency-name: express dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 17 ++++++++--------- package.json | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6e2992e34f..cf8a4c6580c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "csvtojson": "2.0.10", "ejs": "3.1.10", "errorhandler": "1.5.1", - "express": "4.21.0", + "express": "4.21.1", "express-rate-limit": "7.4.1", "express-session": "1.18.0", "form-data": "^4.0.0", @@ -4716,16 +4716,16 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -4825,10 +4825,9 @@ "license": "MIT" }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } diff --git a/package.json b/package.json index fc64d85e593..d5575f64415 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "csvtojson": "2.0.10", "ejs": "3.1.10", "errorhandler": "1.5.1", - "express": "4.21.0", + "express": "4.21.1", "express-rate-limit": "7.4.1", "express-session": "1.18.0", "form-data": "^4.0.0", From 3d41c636f2345326a6199aa920ecaa0bd1fe886e Mon Sep 17 00:00:00 2001 From: Gabriel Oliveira Date: Fri, 11 Oct 2024 14:43:33 +0000 Subject: [PATCH 043/381] fix: make transparency control work for color picker --- .../public/javascripts/countly/vue/components/input.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/input.js b/frontend/express/public/javascripts/countly/vue/components/input.js index a5ade26b270..919d016a3f3 100644 --- a/frontend/express/public/javascripts/countly/vue/components/input.js +++ b/frontend/express/public/javascripts/countly/vue/components/input.js @@ -43,7 +43,7 @@ }, methods: { setColor: function(color) { - this.$emit("input", color.hex); + this.$emit("input", color.hex8); }, reset: function() { this.setColor({hex: this.resetValue}); @@ -1358,4 +1358,4 @@
' })); -}(window.countlyVue = window.countlyVue || {})); \ No newline at end of file +}(window.countlyVue = window.countlyVue || {})); From 85d6033271fce8167f362cbc427e16ea91a168bb Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Mon, 14 Oct 2024 14:24:10 +0300 Subject: [PATCH 044/381] create README.md for 2FA --- plugins/two-factor-auth/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 plugins/two-factor-auth/README.md diff --git a/plugins/two-factor-auth/README.md b/plugins/two-factor-auth/README.md new file mode 100644 index 00000000000..fdb06045293 --- /dev/null +++ b/plugins/two-factor-auth/README.md @@ -0,0 +1,18 @@ +# Two Factor Authentication + +The Two-Factor Authentication (2FA) Plugin for Countly enhances account security by adding an additional layer of authentication. It allows users to enable or disable 2FA for their accounts and provides administrative controls for managing 2FA settings for other users. + +## Configuration View: + +Registers labels for 2FA settings to customize the web UI. + +## TwoFAUser Component: + +Manages the 2FA setup modal. +Initializes 2FA settings and handles user interactions for enabling or disabling 2FA. +Sends requests to enable or disable 2FA and handles success and error responses. + +## Registering the Component: + +Registers the TwoFAUser component in the Countly Vue container under the account settings page. +This plugin provides a comprehensive solution for managing 2FA settings within the Countly application, enhancing the security of user accounts by requiring an additional authentication step. \ No newline at end of file From 67cff8c42e45c882a7d61a2b1360029ab5c25ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Mon, 14 Oct 2024 16:02:44 +0300 Subject: [PATCH 045/381] fix: deleted duplicated color code --- frontend/express/public/stylesheets/styles/base/_colors.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/express/public/stylesheets/styles/base/_colors.scss b/frontend/express/public/stylesheets/styles/base/_colors.scss index 21bbb933377..d571d5d2f4a 100644 --- a/frontend/express/public/stylesheets/styles/base/_colors.scss +++ b/frontend/express/public/stylesheets/styles/base/_colors.scss @@ -27,7 +27,6 @@ $colors: ( "cool-gray-05": #FBFDFE, "charts-blue": #017AFF, - "charts-light-turquoise": #EBF9F9, "charts-turquoise": #39C0C8, "charts-light-turquoise": #EBF9F9, "charts-amber": #F5C900, From 9d74749cb896f1a0ffbf3f3abba4dae725f00000 Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 14 Oct 2024 17:19:46 +0000 Subject: [PATCH 046/381] First commit --- ui-tests/cypress/e2e/onboarding/onboarding.cy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index d7f665328dc..bcb7709a768 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -373,9 +373,9 @@ describe('Complete Onboarding', () => { feedbackRatingWidgetsPageHelpers.verifyFullDataPageElements(); navigationHelpers.goToCrashesOverviewPage(); crashesPageHelpers.verifyFullDataPageElements(); - //TODO: Add the cases of the following pages - //navigationHelpers.goToRemoteConfigPage(); + navigationHelpers.goToRemoteConfigPage(); //remoteConfigPageHelpers.verifyFullDataPageElements(); + //TODO: Add the cases of the following pages //navigationHelpers.goToReportManagerPage(); //reportManagerPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToDataManagerPage(); From 65b77a81ca23a112c4628335d0dbf866b52f4efc Mon Sep 17 00:00:00 2001 From: can-angun Date: Wed, 16 Oct 2024 10:53:34 +0000 Subject: [PATCH 047/381] Added remote config full data test cases --- .../public/javascripts/countly.views.js | 23 +-- .../frontend/public/templates/parameters.html | 80 ++++++---- .../cypress/e2e/onboarding/onboarding.cy.js | 2 +- .../cypress/lib/dashboard/crashes/crashes.js | 58 +++---- .../lib/dashboard/feedback/ratings/ratings.js | 18 +-- .../dashboard/remoteConfig/remoteConfig.js | 149 ++++++++++++++++-- .../dashboard/remoteConfig/remoteConfig.js | 65 +++++++- 7 files changed, 301 insertions(+), 94 deletions(-) diff --git a/plugins/remote-config/frontend/public/javascripts/countly.views.js b/plugins/remote-config/frontend/public/javascripts/countly.views.js index 60a9a275afe..f4716092fc5 100644 --- a/plugins/remote-config/frontend/public/javascripts/countly.views.js +++ b/plugins/remote-config/frontend/public/javascripts/countly.views.js @@ -53,25 +53,25 @@ template: ' \ \ \ - \ - \ - \ \ \ \ - \ + \ \ - \ - \ + \ \ \ \ @@ -82,7 +82,12 @@ default: function() { return {}; } - } + }, + testId: { + type: String, + default: 'condition-stats-default-test-id', + required: false + }, }, computed: { isDrillEnabled: function() { @@ -1028,4 +1033,4 @@ this.renderWhenReady(mainView); }); app.addMenu("improve", {code: "remote-config", permission: FEATURE_NAME, pluginName: "remote-config", url: "#/remote-config", text: "sidebar.remote-config", icon: '', priority: 30}); -})(); +})(); \ No newline at end of file diff --git a/plugins/remote-config/frontend/public/templates/parameters.html b/plugins/remote-config/frontend/public/templates/parameters.html index f389ab7945a..efcbeb3a2ee 100644 --- a/plugins/remote-config/frontend/public/templates/parameters.html +++ b/plugins/remote-config/frontend/public/templates/parameters.html @@ -1,10 +1,10 @@
- + @@ -13,20 +13,27 @@
- + @@ -83,10 +85,10 @@ prop="lastModifiedts" column-key="lastModifiedDate" sortable="custom" min-width="275" :label="i18n('data-manager.last-modified')"> @@ -105,28 +107,28 @@ diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index b0a2916a1bd..712ec50570e 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -377,9 +377,9 @@ describe('Complete Onboarding', () => { //remoteConfigPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data navigationHelpers.goToReportManagerPage(); //reportManagerPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data + navigationHelpers.goToDataManagerPage(); + dataManagerEventsPageHelpers.verifyFullDataPageElements(); //TODO: Add the cases of the following pages - //navigationHelpers.goToDataManagerPage(); - //dataManagerEventsPageHelpers.verifyFullDataPageElements(); //dataManagerEventsPageHelpers.clickEventGroupsTab(); //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToDataPopulatorPage(); diff --git a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js index 477c568cedb..100722de77e 100644 --- a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js +++ b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js @@ -1,36 +1,90 @@ -import dataManagerEventsPageElements from "../../../../../support/elements/dashboard/manage/dataManager/events/events"; +import { + eventsPageElements, + eventsDataTableElements +} from "../../../../../support/elements/dashboard/manage/dataManager/events/events"; const verifyStaticElementsOfPage = () => { cy.verifyElement({ - labelElement: dataManagerEventsPageElements.PAGE_TITLE, + labelElement: eventsPageElements.PAGE_TITLE, labelText: "Manage Events", }); cy.verifyElement({ - element: dataManagerEventsPageElements.TAB_EVENTS, + element: eventsPageElements.TAB_EVENTS, elementText: "Events", }); cy.verifyElement({ - element: dataManagerEventsPageElements.TAB_EVENT_GROUPS, + element: eventsPageElements.TAB_EVENT_GROUPS, elementText: "Event Groups", }); + cy.verifyElement({ + element: eventsPageElements.FILTER_PARAMETERS_SELECT, + }); cy.verifyElement({ - element: dataManagerEventsPageElements.FILTER_PARAMETERS_SELECT, + element: eventsDataTableElements().EDIT_COLUMNS_BUTTON, }); cy.verifyElement({ - element: dataManagerEventsPageElements.EDIT_COLUMNS_BUTTON, + element: eventsDataTableElements().EXPORT_AS_BUTTON, }); cy.verifyElement({ - element: dataManagerEventsPageElements.EXPORT_AS_BUTTON, + element: eventsDataTableElements().DATATABLE_SEARCH_INPUT, }); + // cy.verifyElement({ //TODO: data test id is missing + // element: eventsDataTableElements().SELECT_ALL_EVENTS_CHECKBOX, + // }); + cy.verifyElement({ - element: dataManagerEventsPageElements.DATATABLE_SEARCH_INPUT, + isElementVisible: false, + labelElement: eventsDataTableElements().COLUMN_NAME_EVENT_NAME_LABEL, + labelText: "Event Name", + }); + + cy.verifyElement({ + isElementVisible: false, + element: eventsDataTableElements().COLUMN_NAME_EVENT_NAME_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsDataTableElements().COLUMN_NAME_DESCRIPTION_LABEL, + labelText: "Description", + }); + + cy.verifyElement({ + element: eventsDataTableElements().COLUMN_NAME_DESCRIPTION_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsDataTableElements().COLUMN_NAME_CATEGORY_LABEL, + labelText: "Category", + }); + + cy.verifyElement({ + element: eventsDataTableElements().COLUMN_NAME_CATEGORY_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsDataTableElements().COLUMN_NAME_COUNT_LABEL, + labelText: "Count", + }); + + cy.verifyElement({ + element: eventsDataTableElements().COLUMN_NAME_COUNT_SORTABLE_ICON, + }); + + cy.verifyElement({ + isElementVisible: false, + labelElement: eventsDataTableElements().COLUMN_NAME_LAST_MODIFIED_LABEL, + labelText: "Last modıfıed", + }); + + cy.verifyElement({ + element: eventsDataTableElements().COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON, }); }; @@ -38,33 +92,101 @@ const verifyEmptyPageElements = () => { verifyStaticElementsOfPage(); + verifyEventsDataTableElements({ + isEmpty: true + }); +}; + +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(); + + verifyEventsDataTableElements({ + isEmpty: false, + shouldNotEqual: true, + }); +}; + +const verifyEventsDataTableElements = ({ + isEmpty = false, + shouldNotEqual = false, + index = 0, + nameAndDescription = null, + data = null, + status = null, + origin = null, + lastUpdated = null, + duration = null +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: eventsDataTableElements(index).EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsDataTableElements(index).EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: eventsDataTableElements(index).EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + return; + } + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).NAME_AND_DESCRIPTION, + elementText: nameAndDescription, + }); + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).DATA, + elementText: data, + }); + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).STATUS, + elementText: status, + }); + cy.verifyElement({ - element: dataManagerEventsPageElements.EMPTY_DATATABLE_ICON, + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).ORIGIN, + elementText: origin, }); cy.verifyElement({ - labelElement: dataManagerEventsPageElements.EMPTY_DATATABLE_TITLE, - labelText: "...hmm, seems empty here", + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).LAST_UPDATED, + elementText: lastUpdated, }); cy.verifyElement({ - labelElement: dataManagerEventsPageElements.EMPTY_DATATABLE_SUBTITLE, - labelText: "No data found", + shouldNot: shouldNotEqual, + element: eventsDataTableElements(index).DURATION, + elementText: duration, }); }; const clickEventsTab = () => { cy.scrollPageToTop(); - cy.clickElement(dataManagerEventsPageElements.TAB_EVENTS); + cy.clickElement(eventsPageElements.TAB_EVENTS); }; const clickEventGroupsTab = () => { cy.scrollPageToTop(); - cy.clickElement(dataManagerEventsPageElements.TAB_EVENT_GROUPS); + cy.clickElement(eventsPageElements.TAB_EVENT_GROUPS); }; module.exports = { verifyEmptyPageElements, + verifyEventsDataTableElements, + verifyFullDataPageElements, clickEventsTab, clickEventGroupsTab }; \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js index 4552be04249..509a63a7508 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js @@ -1,12 +1,55 @@ -export default { +export const eventsPageElements = { PAGE_TITLE: 'header-title', TAB_EVENTS: 'tab-events-title', TAB_EVENT_GROUPS: 'tab-event-groups-title', - FILTER_PARAMETERS_SELECT: 'cly-multi-select-test-id-pseudo-input-label', - EDIT_COLUMNS_BUTTON: 'cly-datatable-n-test-id-edit-columns-button', - EXPORT_AS_BUTTON: 'cly-datatable-n-test-id-export-as-button', - DATATABLE_SEARCH_INPUT: 'cly-datatable-n-test-id-datatable-search-input', - EMPTY_DATATABLE_ICON: 'cly-datatable-n-test-id-empty-logo', - EMPTY_DATATABLE_TITLE: 'cly-datatable-n-test-id-empty-title', - EMPTY_DATATABLE_SUBTITLE: 'cly-datatable-n-test-id-empty-subtitle' + FILTER_PARAMETERS_SELECT: 'event-category-filters-pseudo-input-label', +}; + +const eventsDataTableElements = (index = 0) => ({ + EDIT_COLUMNS_BUTTON: 'events-edit-columns-button', + EXPORT_AS_BUTTON: 'events-export-as-button', + DATATABLE_SEARCH_INPUT: 'events-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + EMPTY_TABLE_ICON: 'events-empty-logo', + EMPTY_TABLE_TITLE: 'events-empty-title', + EMPTY_TABLE_SUBTITLE: 'events-empty-subtitle', + + SELECT_ALL_EVENTS_CHECKBOX: 'events-select-all-checkbox', //TODO: data test id is missing + COLUMN_NAME_EVENT_NAME_LABEL: 'events-label-event-name', + COLUMN_NAME_EVENT_NAME_SORTABLE_ICON: 'events-sortable-icon-event-name', + COLUMN_NAME_DESCRIPTION_LABEL: 'events-label-description', + COLUMN_NAME_DESCRIPTION_SORTABLE_ICON: 'events-sortable-icon-description', + COLUMN_NAME_CATEGORY_LABEL: 'events-label-category', + COLUMN_NAME_CATEGORY_SORTABLE_ICON: 'events-sortable-icon-category', + COLUMN_NAME_COUNT_LABEL: 'events-label-count', + COLUMN_NAME_COUNT_SORTABLE_ICON: 'events-sortable-icon-count', + COLUMN_NAME_LAST_MODIFIED_LABEL: 'events-label-last-modıfıed', + COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON: 'events-sortable-icon-last-modıfıed', + + //Columns' Rows' Datas Elements + SELECT_EVENT_CHECKBOX: 'datatable-manage-events-events-select-event-checkbox-' + index, //TODO: data test id is missing + EVENT_NAME: 'datatable-manage-events-events-event-name-' + index, + EVENT_NAME_ION_EYE: 'datatable-manage-events-events-ion-eye-' + index, + DESCRIPTION: 'datatable-manage-events-events-description-' + index, + CATEGORY: 'datatable-manage-events-events-category-' + index, + COUNT: 'datatable-manage-events-events-count-' + index, + LAST_MODIFIED: 'datatable-manage-events-events-last-modified-' + index, + + //PAGINATION ELEMENTS + ITEMS_PER_PAGE_LABEL: 'events-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'events-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'events-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'events-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'events-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'events-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'events-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'events-groups-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'events-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'events-views-last-page-arrow-button' +}); + +module.exports = { + eventsPageElements, + eventsDataTableElements }; \ No newline at end of file From 6985b989e131593a1aea66c19ff3d4577df21303 Mon Sep 17 00:00:00 2001 From: can-angun Date: Thu, 17 Oct 2024 20:14:22 +0000 Subject: [PATCH 058/381] Added data manager event groups verify full data page case --- .../public/templates/event-groups.html | 1 + .../public/templates/events-default.html | 2 +- .../cypress/e2e/onboarding/onboarding.cy.js | 5 +- .../manage/dataManager/events/eventGroups.js | 100 +++++++++++++++--- .../manage/dataManager/events/events.js | 2 +- .../manage/dataManager/events/eventGroups.js | 48 +++++++-- .../manage/dataManager/events/events.js | 56 +++++----- 7 files changed, 158 insertions(+), 56 deletions(-) diff --git a/plugins/data-manager/frontend/public/templates/event-groups.html b/plugins/data-manager/frontend/public/templates/event-groups.html index d684cae4ea1..6d47475473c 100644 --- a/plugins/data-manager/frontend/public/templates/event-groups.html +++ b/plugins/data-manager/frontend/public/templates/event-groups.html @@ -2,6 +2,7 @@ { //reportManagerPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data navigationHelpers.goToDataManagerPage(); dataManagerEventsPageHelpers.verifyFullDataPageElements(); + + dataManagerEventsPageHelpers.clickEventGroupsTab(); + //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data //TODO: Add the cases of the following pages - //dataManagerEventsPageHelpers.clickEventGroupsTab(); - //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToDataPopulatorPage(); //dataPopulatorPageHelpers.verifyEmptyPageElementsOfDataPopulatorWithTemplatePage(); // TODO //dataPopulatorPageHelpers.clickPopulateWithEnvironmentTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js index 2f99b332eac..bb14e2abe3a 100644 --- a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js +++ b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js @@ -1,66 +1,132 @@ -import dataManagerEventGroupsPageElements from "../../../../../support/elements/dashboard/manage/dataManager/events/eventGroups"; +import { + eventsGroupsPageElements, + eventsGroupsDataTableElements +} from "../../../../../support/elements/dashboard/manage/dataManager/events/eventGroups"; const verifyStaticElementsOfPage = () => { cy.verifyElement({ - labelElement: dataManagerEventGroupsPageElements.PAGE_TITLE, + labelElement: eventsGroupsPageElements.PAGE_TITLE, labelText: "Manage Events", }); cy.verifyElement({ - element: dataManagerEventGroupsPageElements.TAB_EVENTS, + element: eventsGroupsPageElements.TAB_EVENTS, elementText: "Events", }); cy.verifyElement({ - element: dataManagerEventGroupsPageElements.TAB_EVENT_GROUPS, + element: eventsGroupsPageElements.TAB_EVENT_GROUPS, elementText: "Event Groups", }); + // cy.verifyElement({ //TODO: data test id is missing + // element: eventsGroupsDataTableElements().SELECT_ALL_EVENTS_CHECKBOX, + // }); cy.verifyElement({ - element: dataManagerEventGroupsPageElements.EVENT_GROUP_SELECT, + element: eventsGroupsDataTableElements().EXPORT_AS_BUTTON, }); cy.verifyElement({ - element: dataManagerEventGroupsPageElements.EXPORT_AS_BUTTON, + element: eventsGroupsDataTableElements().DATATABLE_SEARCH_INPUT, }); cy.verifyElement({ - element: dataManagerEventGroupsPageElements.DATATABLE_SEARCH_INPUT, + isElementVisible: false, + labelElement: eventsGroupsDataTableElements().COLUMN_NAME_EVENT_GROUP_NAME_LABEL, + labelText: "Event Group Name", }); -}; + + cy.verifyElement({ + isElementVisible: false, + element: eventsGroupsDataTableElements().COLUMN_NAME_EVENT_GROUP_NAME_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsGroupsDataTableElements().COLUMN_NAME_EVENT_GROUP_DESCRIPTION_LABEL, + labelText: "Event Group Description", + }); + + cy.verifyElement({ + element: eventsGroupsDataTableElements().COLUMN_NAME_EVENT_GROUP_DESCRIPTION_SORTABLE_ICON, + }); +} const verifyEmptyPageElements = () => { verifyStaticElementsOfPage(); - cy.verifyElement({ - element: dataManagerEventGroupsPageElements.EMPTY_DATATABLE_ICON, + verifyEventGroupsDataTableElements({ + isEmpty: true }); +}; + +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(); + + verifyEventGroupsDataTableElements({ + isEmpty: false, + shouldNotEqual: true, + }); +}; + +const verifyEventGroupsDataTableElements = ({ + index = 0, + isEmpty = false, + shouldNotEqual = false, + eventGroupName = null, + eventGroupDescription = null +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: eventsGroupsDataTableElements().EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: eventsGroupsDataTableElements().EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: eventsGroupsDataTableElements().EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + return; + } + + // cy.verifyElement({ //TODO: data test id is missing + // element: eventsGroupsDataTableElements(index).SELECT_EVENT_GROUP_CHECKBOX, + // }); cy.verifyElement({ - labelElement: dataManagerEventGroupsPageElements.EMPTY_DATATABLE_TITLE, - labelText: "...hmm, seems empty here", + shouldNot: shouldNotEqual, + element: eventsGroupsDataTableElements(index).EVENT_GROUP_NAME, + elementText: eventGroupName, }); cy.verifyElement({ - labelElement: dataManagerEventGroupsPageElements.EMPTY_DATATABLE_SUBTITLE, - labelText: "No data found", + shouldNot: shouldNotEqual, + element: eventsGroupsDataTableElements(index).EVENT_GROUP_DESCRIPTION, + elementText: eventGroupDescription, }); }; const clickEventsTab = () => { cy.scrollPageToTop(); - cy.clickElement(dataManagerEventGroupsPageElements.TAB_EVENTS); + cy.clickElement(eventsGroupsPageElements.TAB_EVENTS); }; const clickEventGroupsTab = () => { cy.scrollPageToTop(); - cy.clickElement(dataManagerEventGroupsPageElements.TAB_EVENT_GROUPS); + cy.clickElement(eventsGroupsPageElements.TAB_EVENT_GROUPS); }; module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, clickEventsTab, - clickEventGroupsTab + clickEventGroupsTab, + verifyEventGroupsDataTableElements }; \ No newline at end of file diff --git a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js index 100722de77e..dfde151e0b9 100644 --- a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js +++ b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js @@ -86,7 +86,7 @@ const verifyStaticElementsOfPage = () => { cy.verifyElement({ element: eventsDataTableElements().COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON, }); -}; +} const verifyEmptyPageElements = () => { diff --git a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js index f77fda9ef57..bd1ed86ec87 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js @@ -1,11 +1,45 @@ -export default { +export const eventsGroupsPageElements = { PAGE_TITLE: 'header-title', TAB_EVENTS: 'tab-events-title', TAB_EVENT_GROUPS: 'tab-event-groups-title', - EVENT_GROUP_SELECT: 'event-group-select-input', - EXPORT_AS_BUTTON: 'cly-datatable-n-test-id-export-as-button', - DATATABLE_SEARCH_INPUT: 'cly-datatable-n-test-id-datatable-search-input', - EMPTY_DATATABLE_ICON: 'cly-datatable-n-test-id-empty-logo', - EMPTY_DATATABLE_TITLE: 'cly-datatable-n-test-id-empty-title', - EMPTY_DATATABLE_SUBTITLE: 'cly-datatable-n-test-id-empty-subtitle' + EVENT_GROUP_SELECT: 'event-group-select-input' +}; + +const eventsGroupsDataTableElements = (index = 0) => ({ + EMPTY_TABLE_ICON: 'datatable-event-groups-empty-logo', + EMPTY_TABLE_TITLE: 'datatable-event-groups-empty-title', + EMPTY_TABLE_SUBTITLE: 'datatable-event-groups-empty-subtitle', + + EXPORT_AS_BUTTON: 'datatable-event-groups-export-as-button', + DATATABLE_SEARCH_INPUT: 'datatable-event-groups-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + SELECT_ALL_EVENTS_CHECKBOX: 'datatable-event-groups-select-all-checkbox', //TODO: data test id is missing + COLUMN_NAME_EVENT_GROUP_NAME_LABEL: 'datatable-event-groups-label-event-group-name', + COLUMN_NAME_EVENT_GROUP_NAME_SORTABLE_ICON: 'datatable-event-groups-sortable-icon-event-group-name', + COLUMN_NAME_EVENT_GROUP_DESCRIPTION_LABEL: 'datatable-event-groups-label-event-group-description', + COLUMN_NAME_EVENT_GROUP_DESCRIPTION_SORTABLE_ICON: 'datatable-event-groups-sortable-icon-event-group-description', + + //Columns' Rows' Datas Elements + //TODO: data test id will be added + SELECT_EVENT_GROUP_CHECKBOX: 'datatable-manage-events-event-groups-select-event-group-checkbox-' + index, + EVENT_GROUP_NAME: 'datatable-manage-events-event-groups-event-group-name-' + index, + EVENT_GROUP_DESCRIPTION: 'datatable-manage-events-event-groups-event-group-description-' + index, + + //PAGINATION ELEMENTS + ITEMS_PER_PAGE_LABEL: 'datatable-event-groups-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'datatable-event-groups-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'datatable-event-groups-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'datatable-event-groups-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'datatable-event-groups-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'datatable-event-groups-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'datatable-event-groups-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'datatable-event-groups-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'datatable-event-groups-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'datatable-event-groups-last-page-arrow-button' +}); + +module.exports = { + eventsGroupsPageElements, + eventsGroupsDataTableElements }; \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js index 509a63a7508..693b8232864 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/events.js @@ -6,26 +6,26 @@ export const eventsPageElements = { }; const eventsDataTableElements = (index = 0) => ({ - EDIT_COLUMNS_BUTTON: 'events-edit-columns-button', - EXPORT_AS_BUTTON: 'events-export-as-button', - DATATABLE_SEARCH_INPUT: 'events-datatable-search-input', - TABLE_ROWS: '.el-table__row', + EMPTY_TABLE_ICON: 'datatable-events-empty-logo', + EMPTY_TABLE_TITLE: 'datatable-events-empty-title', + EMPTY_TABLE_SUBTITLE: 'datatable-events-empty-subtitle', - EMPTY_TABLE_ICON: 'events-empty-logo', - EMPTY_TABLE_TITLE: 'events-empty-title', - EMPTY_TABLE_SUBTITLE: 'events-empty-subtitle', + EDIT_COLUMNS_BUTTON: 'datatable-events-edit-columns-button', + EXPORT_AS_BUTTON: 'datatable-events-export-as-button', + DATATABLE_SEARCH_INPUT: 'datatable-events-datatable-search-input', + TABLE_ROWS: '.el-table__row', - SELECT_ALL_EVENTS_CHECKBOX: 'events-select-all-checkbox', //TODO: data test id is missing - COLUMN_NAME_EVENT_NAME_LABEL: 'events-label-event-name', - COLUMN_NAME_EVENT_NAME_SORTABLE_ICON: 'events-sortable-icon-event-name', - COLUMN_NAME_DESCRIPTION_LABEL: 'events-label-description', - COLUMN_NAME_DESCRIPTION_SORTABLE_ICON: 'events-sortable-icon-description', - COLUMN_NAME_CATEGORY_LABEL: 'events-label-category', - COLUMN_NAME_CATEGORY_SORTABLE_ICON: 'events-sortable-icon-category', - COLUMN_NAME_COUNT_LABEL: 'events-label-count', - COLUMN_NAME_COUNT_SORTABLE_ICON: 'events-sortable-icon-count', - COLUMN_NAME_LAST_MODIFIED_LABEL: 'events-label-last-modıfıed', - COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON: 'events-sortable-icon-last-modıfıed', + SELECT_ALL_EVENTS_CHECKBOX: 'datatable-events-select-all-checkbox', //TODO: data test id is missing + COLUMN_NAME_EVENT_NAME_LABEL: 'datatable-events-label-event-name', + COLUMN_NAME_EVENT_NAME_SORTABLE_ICON: 'datatable-events-sortable-icon-event-name', + COLUMN_NAME_DESCRIPTION_LABEL: 'datatable-events-label-description', + COLUMN_NAME_DESCRIPTION_SORTABLE_ICON: 'datatable-events-sortable-icon-description', + COLUMN_NAME_CATEGORY_LABEL: 'datatable-events-label-category', + COLUMN_NAME_CATEGORY_SORTABLE_ICON: 'datatable-events-sortable-icon-category', + COLUMN_NAME_COUNT_LABEL: 'datatable-events-label-count', + COLUMN_NAME_COUNT_SORTABLE_ICON: 'datatable-events-sortable-icon-count', + COLUMN_NAME_LAST_MODIFIED_LABEL: 'datatable-events-label-last-modıfıed', + COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON: 'datatable-events-sortable-icon-last-modıfıed', //Columns' Rows' Datas Elements SELECT_EVENT_CHECKBOX: 'datatable-manage-events-events-select-event-checkbox-' + index, //TODO: data test id is missing @@ -37,16 +37,16 @@ const eventsDataTableElements = (index = 0) => ({ LAST_MODIFIED: 'datatable-manage-events-events-last-modified-' + index, //PAGINATION ELEMENTS - ITEMS_PER_PAGE_LABEL: 'events-items-per-page-label', - PER_PAGE_COUNT_SELECT: 'events-items-per-page-count-select-input-pseudo-input-label', - PER_PAGE_COUNT_SELECT_ICON: 'events-items-per-page-count-select-icon', - PER_PAGE_COUNT_LABEL: 'events-items-per-page-count-select', - PAGE_NUMBER_SELECT: 'events-page-number-select-input-pseudo-input-label', - PAGE_NUMBER_SELECT_ICON: 'events-page-number-select-icon', - FIRST_PAGE_ARROW_BUTTON: 'events-first-page-arrow-button', - PREVIOUS_PAGE_ARROW_BUTTON: 'events-groups-previous-page-arrow-button', - NEXT_PAGE_ARROW_BUTTON: 'events-next-page-arrow-button', - LAST_PAGE_ARROW_BUTTON: 'events-views-last-page-arrow-button' + ITEMS_PER_PAGE_LABEL: 'datatable-events-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'datatable-events-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'datatable-events-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'datatable-events-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'datatable-events-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'datatable-events-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'datatable-events-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'datatable-events-groups-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'datatable-events-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'datatable-events-views-last-page-arrow-button' }); module.exports = { From 7fad3ef94965b057dd18b60559afdec5af5653fd Mon Sep 17 00:00:00 2001 From: can-angun Date: Thu, 17 Oct 2024 20:43:41 +0000 Subject: [PATCH 059/381] Fixed linter fails --- ui-tests/cypress/e2e/onboarding/onboarding.cy.js | 2 +- .../lib/dashboard/manage/dataManager/events/eventGroups.js | 2 +- .../cypress/lib/dashboard/manage/dataManager/events/events.js | 2 +- .../elements/dashboard/manage/dataManager/events/eventGroups.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 4797692e506..0509dba3961 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -380,7 +380,7 @@ describe('Complete Onboarding', () => { navigationHelpers.goToDataManagerPage(); dataManagerEventsPageHelpers.verifyFullDataPageElements(); - dataManagerEventsPageHelpers.clickEventGroupsTab(); + dataManagerEventsPageHelpers.clickEventGroupsTab(); //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data //TODO: Add the cases of the following pages //navigationHelpers.goToDataPopulatorPage(); diff --git a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js index bb14e2abe3a..70c1633bc18 100644 --- a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js +++ b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/eventGroups.js @@ -50,7 +50,7 @@ const verifyStaticElementsOfPage = () => { cy.verifyElement({ element: eventsGroupsDataTableElements().COLUMN_NAME_EVENT_GROUP_DESCRIPTION_SORTABLE_ICON, }); -} +}; const verifyEmptyPageElements = () => { diff --git a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js index dfde151e0b9..100722de77e 100644 --- a/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js +++ b/ui-tests/cypress/lib/dashboard/manage/dataManager/events/events.js @@ -86,7 +86,7 @@ const verifyStaticElementsOfPage = () => { cy.verifyElement({ element: eventsDataTableElements().COLUMN_NAME_LAST_MODIFIED_SORTABLE_ICON, }); -} +}; const verifyEmptyPageElements = () => { diff --git a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js index bd1ed86ec87..c4a0920cdf5 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/dataManager/events/eventGroups.js @@ -22,7 +22,7 @@ const eventsGroupsDataTableElements = (index = 0) => ({ //Columns' Rows' Datas Elements //TODO: data test id will be added - SELECT_EVENT_GROUP_CHECKBOX: 'datatable-manage-events-event-groups-select-event-group-checkbox-' + index, + SELECT_EVENT_GROUP_CHECKBOX: 'datatable-manage-events-event-groups-select-event-group-checkbox-' + index, EVENT_GROUP_NAME: 'datatable-manage-events-event-groups-event-group-name-' + index, EVENT_GROUP_DESCRIPTION: 'datatable-manage-events-event-groups-event-group-description-' + index, From 3047e74320eb5203106d5702cd86bfbf8b543d69 Mon Sep 17 00:00:00 2001 From: can-angun Date: Thu, 17 Oct 2024 22:44:38 +0000 Subject: [PATCH 060/381] Added populator verify pages case --- .../frontend/public/templates/populator.html | 24 +- .../cypress/e2e/onboarding/onboarding.cy.js | 19 +- .../lib/dashboard/manage/populate/populate.js | 505 +++++++++++------- .../dashboard/manage/populate/populate.js | 72 ++- 4 files changed, 396 insertions(+), 224 deletions(-) diff --git a/plugins/populator/frontend/public/templates/populator.html b/plugins/populator/frontend/public/templates/populator.html index fcea9db058e..6258f2e900e 100644 --- a/plugins/populator/frontend/public/templates/populator.html +++ b/plugins/populator/frontend/public/templates/populator.html @@ -116,7 +116,7 @@

- {{ decodeHtml(rowScope.row.name) }} - {{ decodeHtml(rowScope.row.name) }} + {{ decodeHtml(rowScope.row.name) }} + {{ decodeHtml(rowScope.row.name) }}
-
+
{{ rowScope.row.userCount }}
-
+
{{ rowScope.row.eventCount }}
-
+
{{ rowScope.row.viewCount }}
-
+
{{ rowScope.row.sequenceCount }}
-
+
{{ rowScope.row.generatedOn }}
diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 0509dba3961..bbdbdf823f8 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -217,11 +217,11 @@ describe('Complete Onboarding', () => { dataManagerEventsPageHelpers.clickEventGroupsTab(); dataManagerEventGroupsPageHelpers.verifyEmptyPageElements(); navigationHelpers.goToDataPopulatorPage(); - dataPopulatorPageHelpers.verifyEmptyPageElementsOfDataPopulatorWithTemplatePage(); + dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithTemplatePage(); dataPopulatorPageHelpers.clickPopulateWithEnvironmentTab(); - dataPopulatorPageHelpers.verifyEmptyPageElementsOfDataPopulatorWithEnvironmentPage(); + dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithEnvironmentPage(); dataPopulatorPageHelpers.clickTemplatesTab(); - dataPopulatorPageHelpers.verifyEmptyPageElementsOfTemplatesPage(); + dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); navigationHelpers.goToIncomingDataLogsPage(); incomingDataLogsPageHelpers.verifyEmptyPageElements(); navigationHelpers.goToSdkManagerPage(); @@ -379,16 +379,15 @@ describe('Complete Onboarding', () => { //reportManagerPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data navigationHelpers.goToDataManagerPage(); dataManagerEventsPageHelpers.verifyFullDataPageElements(); - dataManagerEventsPageHelpers.clickEventGroupsTab(); //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data + navigationHelpers.goToDataPopulatorPage(); + dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithTemplatePage(); + dataPopulatorPageHelpers.clickPopulateWithEnvironmentTab(); + dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithEnvironmentPage(); + dataPopulatorPageHelpers.clickTemplatesTab(); + dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); //TODO: Add the cases of the following pages - //navigationHelpers.goToDataPopulatorPage(); - //dataPopulatorPageHelpers.verifyEmptyPageElementsOfDataPopulatorWithTemplatePage(); // TODO - //dataPopulatorPageHelpers.clickPopulateWithEnvironmentTab(); - //dataPopulatorPageHelpers.verifyEmptyPageElementsOfDataPopulatorWithEnvironmentPage(); // TODO - //dataPopulatorPageHelpers.clickTemplatesTab(); - //dataPopulatorPageHelpers.verifyEmptyPageElementsOfTemplatesPage(); // TODO //navigationHelpers.goToIncomingDataLogsPage(); //incomingDataLogsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToSdkManagerPage(); diff --git a/ui-tests/cypress/lib/dashboard/manage/populate/populate.js b/ui-tests/cypress/lib/dashboard/manage/populate/populate.js index f302ad72eb2..6274dacb093 100644 --- a/ui-tests/cypress/lib/dashboard/manage/populate/populate.js +++ b/ui-tests/cypress/lib/dashboard/manage/populate/populate.js @@ -1,275 +1,388 @@ -import managePopulatePageElements from "../../../../support/elements/dashboard/manage/populate/populate"; - -const verifyStaticElementsOfDataPopulatorPage = () => { +import { + dataPopulatorPageElements, + populateWithTemplatePageElements, + populateWithEnvironmentPageElements, + popUpElements, + templatesPageElements, + templatesDataTableElements + } from "../../../../support/elements/dashboard/manage/populate/populate"; + + const verifyStaticElementsOfDataPopulatorPage = () => { cy.verifyElement({ - labelElement: managePopulatePageElements.DATA_POPULATOR_PAGE_TITLE, - labelText: "Data Populator", - tooltipElement: managePopulatePageElements.DATA_POPULATOR_PAGE_TITLE_TOOLTIP, - tooltipText: "Populate a Countly app with random data (typically for testing or demonstration)" + labelElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE, + labelText: "Data Populator", + tooltipElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE_TOOLTIP, + tooltipText: "Populate a Countly app with random data (typically for testing or demonstration)" }); - + cy.verifyElement({ - element: managePopulatePageElements.TAB_DATA_POPULATOR, - elementText: "Data Populator", + element: dataPopulatorPageElements.TAB_DATA_POPULATOR, + elementText: "Data Populator", }); - + cy.verifyElement({ - element: managePopulatePageElements.TAB_TEMPLATES, - elementText: "Templates", + element: dataPopulatorPageElements.TAB_TEMPLATES, + elementText: "Templates", }); - + cy.verifyElement({ - element: managePopulatePageElements.TAB_POPULATE_WITH_TEMPLATE, - elementText: "Populate with Template", - + element: dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE, + elementText: "Populate with Template", + }); - + cy.verifyElement({ - element: managePopulatePageElements.TAB_POPULATE_WITH_ENVIRONMENT, - elementText: "Populate with Environment", + element: dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT, + elementText: "Populate with Environment", }); -}; - -const verifyEmptyPageElementsOfDataPopulatorWithTemplatePage = () => { - + } + + const verifyPageElementsOfDataPopulatorWithTemplatePage = () => { + verifyStaticElementsOfDataPopulatorPage(); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_DATA_TEMPLATE_LABEL, - labelText: "Data template", - tooltipElement: managePopulatePageElements.TEMPLATE_DATA_TEMPLATE_TOOLTIP, - tooltipText: "Choose a template for data population. If you can't find a suitable template, you can create a new one from the “Templates” tab above." + labelElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_LABEL, + labelText: "Data template", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_TOOLTIP, + tooltipText: "Choose a template for data population. If you can't find a suitable template, you can create a new one from the “Templates” tab above." }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT, - elementPlaceHolder: "Select a template", + element: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT, + elementPlaceHolder: "Select a template", }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_DATE_RANGE_LABEL, - labelText: "Date range", + labelElement: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_LABEL, + labelText: "Date range", }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATE_DATE_RANGE_SELECT, + element: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT, }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_LABEL, - labelText: "Number of runs", - tooltipElement: managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_TOOLTIP, - tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_LABEL, + labelText: "Number of runs", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_TOOLTIP, + tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL, - labelText: "10" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL, + labelText: "10" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL, - labelText: "50" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL, + labelText: "50" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL, - labelText: "100" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL, + labelText: "100" }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATE_SAVE_ENVIRONMENT_SWITCHBOX, - labelElement: managePopulatePageElements.TEMPLATE_SAVE_ENVIRONMENT_LABEL, - labelText: "Save environment", - tooltipElement: managePopulatePageElements.TEMPLATE_SAVE_ENVIRONMENT_TOOLTIP, - tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." + element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_SWITCHBOX, + labelElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_LABEL, + labelText: "Save environment", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_TOOLTIP, + tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATE_SAVE_ENVIRONMENT_INPUT, - elementPlaceHolder: "Enter an environment name", + element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_INPUT, + elementPlaceHolder: "Enter an environment name", }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON, - elementText: "Generate Demo Data", + element: populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON, + elementText: "Generate Demo Data", }); -}; - -const verifyEmptyPageElementsOfDataPopulatorWithEnvironmentPage = () => { - + } + + const verifyPageElementsOfDataPopulatorWithEnvironmentPage = () => { + verifyStaticElementsOfDataPopulatorPage(); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_LABEL, - labelText: "Environment", - tooltipElement: managePopulatePageElements.ENVIRONMENT_TOOLTIP, - tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_LABEL, + labelText: "Environment", + tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_TOOLTIP, + tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_DATE_RANGE_LABEL, - labelText: "Date range", + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_LABEL, + labelText: "Date range", }); - + cy.verifyElement({ - element: managePopulatePageElements.ENVIRONMENT_DATE_RANGE_SELECT, + element: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_SELECT, }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_NUMBER_OF_RUNS_LABEL, - labelText: "Number of runs", - tooltipElement: managePopulatePageElements.ENVIRONMENT_NUMBER_OF_RUNS_TOOLTIP, - tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_LABEL, + labelText: "Number of runs", + tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_TOOLTIP, + tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_NUMBER_OF_RUNS_10_LABEL, - labelText: "10" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_10_LABEL, + labelText: "10" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_NUMBER_OF_RUNS_50_LABEL, - labelText: "50" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_50_LABEL, + labelText: "50" }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.ENVIRONMENT_NUMBER_OF_RUNS_100_LABEL, - labelText: "100" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_100_LABEL, + labelText: "100" }); - + cy.verifyElement({ - element: managePopulatePageElements.ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON, - elementText: "Generate Demo Data", + element: populateWithEnvironmentPageElements.ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON, + elementText: "Generate Demo Data", }); -}; - -const verifyEmptyPageElementsOfTemplatesPage = () => { - + } + + const verifyPageElementsOfTemplatesPage = () => { + cy.verifyElement({ - element: managePopulatePageElements.TAB_DATA_POPULATOR, - elementText: "Data Populator", + element: dataPopulatorPageElements.TAB_DATA_POPULATOR, + elementText: "Data Populator", }); - + cy.verifyElement({ - element: managePopulatePageElements.TAB_TEMPLATES, - elementText: "Templates", + element: dataPopulatorPageElements.TAB_TEMPLATES, + elementText: "Templates", }); - + cy.verifyElement({ - labelElement: managePopulatePageElements.TEMPLATES_PAGE_TITLE, - labelText: "Templates", - tooltipElement: managePopulatePageElements.TEMPLATES_PAGE_TITLE_TOOLTIP, - tooltipText: "Manage your templates for data population" + labelElement: templatesPageElements.TEMPLATES_PAGE_TITLE, + labelText: "Templates", + tooltipElement: templatesPageElements.TEMPLATES_PAGE_TITLE_TOOLTIP, + tooltipText: "Manage your templates for data population" }); - + cy.verifyElement({ - element: managePopulatePageElements.CREATE_NEW_TEMPLATE_BUTTON, - elementText: "Create New Template", + element: templatesPageElements.CREATE_NEW_TEMPLATE_BUTTON, + elementText: "Create New Template", }); - + cy.verifyElement({ - element: managePopulatePageElements.TEMPLATES_DATATABLE + element: templatesDataTableElements().DATATABLE_SEARCH_INPUT, }); -}; - -const selectDataTemplate = (template) => { - var elementItemSelector = 'el-option-test-id-' + template + '-el-options'; - cy.clickElement(managePopulatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_TEMPLATE_LABEL, + labelText: "Template", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_TEMPLATE_SORTABLE_ICON + }); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_LABEL, + labelText: "Number of Users", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_LABEL, + labelText: "Number of Events", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_VIEWS_LABEL, + labelText: "Views", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_VIEWS_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_SEQUENCES_LABEL, + labelText: "Sequences", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_SEQUENCES_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_LABEL, + labelText: "Generated On", + }); + + cy.verifyElement({ + element: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_SORTABLE_ICON, + }); + + verifyTemplatesDataTable({ + index: 0, + shouldNotEqual: true, + }); + } + + const verifyTemplatesDataTable = ({ + index = 0, + shouldNotEqual = false, + template = null, + numberOfUsers = null, + numberOfEvents = null, + views = null, + sequences = null, + generatedOn = null + }) => { + + cy.verifyElement({ + element: templatesDataTableElements(index).TEMPLATE, + elementText: template, + shouldNotEqual: shouldNotEqual, + }); + + cy.verifyElement({ + element: templatesDataTableElements(index).NUMBER_OF_USERS, + elementText: numberOfUsers, + shouldNotEqual: shouldNotEqual, + }); + + cy.verifyElement({ + element: templatesDataTableElements(index).NUMBER_OF_EVENTS, + elementText: numberOfEvents, + shouldNotEqual: shouldNotEqual, + }); + + cy.verifyElement({ + element: templatesDataTableElements(index).VIEWS, + elementText: views, + shouldNotEqual: shouldNotEqual, + }); + + cy.verifyElement({ + element: templatesDataTableElements(index).SEQUENCES, + elementText: sequences, + shouldNotEqual: shouldNotEqual, + }); + + cy.verifyElement({ + element: templatesDataTableElements(index).GENERATED_ON, + elementText: generatedOn, + shouldNotEqual: shouldNotEqual, + }); + } + + const selectDataTemplate = (template) => { + var elementItemSelector = 'el-option-test-id-' + template + '-el-options' + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT); cy.clickElement(elementItemSelector); -}; - -const selectDateRange = (startDate, endDate) => { - cy.clickElement(managePopulatePageElements.TEMPLATE_DATE_RANGE_SELECT); - cy.typeInput(managePopulatePageElements.TEMPLATE_DATE_RANGE_START_DATE, startDate); - cy.typeInput(managePopulatePageElements.TEMPLATE_DATE_RANGE_END_DATE, endDate); - cy.clickElement(managePopulatePageElements.TEMPLATE_DATE_RANGE_APPLY_BUTTON); -}; - -const clickNumberOfRunsAs10 = () => { - cy.clickElement(managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL); -}; - -const clickNumberOfRunsAs50 = () => { - cy.clickElement(managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL); -}; - -const clickNumberOfRunsAs100 = () => { - cy.clickElement(managePopulatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL); -}; - -const clickGenerateDemoDataButton = () => { - cy.clickElement(managePopulatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON); -}; - -const clickYesPopulateDataButton = () => { - cy.clickElement(managePopulatePageElements.CONFIRM_POP_UP_SAVE_BUTTON); -}; - -const clickNavigateToHomeButton = () => { - cy.clickElement(managePopulatePageElements.SUCCESS_POP_UP_GO_TO_HOME_BUTTON); -}; - -const clickDataPopulatorTab = () => { - cy.clickElement(managePopulatePageElements.TAB_DATA_POPULATOR); -}; - -const clickTemplatesTab = () => { - cy.clickElement(managePopulatePageElements.TAB_TEMPLATES); -}; - -const clickPopulateWithTemplateTab = () => { - cy.clickElement(managePopulatePageElements.TAB_POPULATE_WITH_TEMPLATE); -}; - -const clickPopulateWithEnvironmentTab = () => { - cy.clickElement(managePopulatePageElements.TAB_POPULATE_WITH_ENVIRONMENT); -}; - -const generateData = ({ + } + + const selectDateRange = (startDate, endDate) => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT) + cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_START_DATE, startDate) + cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_END_DATE, endDate) + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_APPLY_BUTTON) + } + + const clickNumberOfRunsAs10 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL) + } + + const clickNumberOfRunsAs50 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL) + } + + const clickNumberOfRunsAs100 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL) + } + + const clickGenerateDemoDataButton = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON) + } + + const clickYesPopulateDataButton = () => { + cy.clickElement(popUpElements.CONFIRM_POP_UP_SAVE_BUTTON) + } + + const clickNavigateToHomeButton = () => { + cy.clickElement(popUpElements.SUCCESS_POP_UP_GO_TO_HOME_BUTTON) + } + + const clickDataPopulatorTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_DATA_POPULATOR) + } + + const clickTemplatesTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_TEMPLATES) + } + + const clickPopulateWithTemplateTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE) + } + + const clickPopulateWithEnvironmentTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT) + } + + const generateData = ({ template = 'bank', startDate, endDate, numberOfRuns -}) => { - selectDataTemplate(template); - + }) => { + selectDataTemplate(template) + if (startDate != null && endDate != null) { - selectDateRange(startDate, endDate); + selectDateRange(startDate, endDate) } - + if (numberOfRuns === '100') { - clickNumberOfRunsAs100(); - } - else if (numberOfRuns === '50') { - clickNumberOfRunsAs50(); - } - else { - clickNumberOfRunsAs10(); + clickNumberOfRunsAs100() + } else if (numberOfRuns === '50') { + clickNumberOfRunsAs50() + } else { + clickNumberOfRunsAs10() } - + clickGenerateDemoDataButton(); clickYesPopulateDataButton(); - + cy - .elementExists(managePopulatePageElements.GENERATING_POP_UP_PROGRESS_BAR) - .then((isExists) => { - if (isExists) { - cy.shouldNotExist(managePopulatePageElements.GENERATING_POP_UP_PROGRESS_BAR); - } - }); - + .elementExists(popUpElements.GENERATING_POP_UP_PROGRESS_BAR) + .then((isExists) => { + if (isExists) { + cy.shouldNotExist(popUpElements.GENERATING_POP_UP_PROGRESS_BAR); + } + }); + clickNavigateToHomeButton(); -}; - -module.exports = { + } + + module.exports = { clickDataPopulatorTab, clickTemplatesTab, clickPopulateWithTemplateTab, clickPopulateWithEnvironmentTab, - verifyEmptyPageElementsOfDataPopulatorWithTemplatePage, - verifyEmptyPageElementsOfDataPopulatorWithEnvironmentPage, - verifyEmptyPageElementsOfTemplatesPage, + verifyPageElementsOfDataPopulatorWithTemplatePage, + verifyPageElementsOfDataPopulatorWithEnvironmentPage, + verifyPageElementsOfTemplatesPage, + verifyTemplatesDataTable, selectDataTemplate, selectDateRange, clickNumberOfRunsAs10, @@ -279,4 +392,4 @@ module.exports = { clickYesPopulateDataButton, clickNavigateToHomeButton, generateData -}; \ No newline at end of file + } \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js b/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js index 803e3dd8970..ff88f2d3903 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js @@ -1,8 +1,11 @@ -export default { +export const dataPopulatorPageElements = { TAB_DATA_POPULATOR: '#tab-data-populator', TAB_TEMPLATES: '#tab-templates', TAB_POPULATE_WITH_TEMPLATE: 'tab-populate-with-template-title', - TAB_POPULATE_WITH_ENVIRONMENT: 'tab-populate-with-environment-title', + TAB_POPULATE_WITH_ENVIRONMENT: 'tab-populate-with-environment-title' +} + +export const populateWithTemplatePageElements = { //Data Populator -> Populate With Template DATA_POPULATOR_PAGE_TITLE: 'data-populator-header-title', DATA_POPULATOR_PAGE_TITLE_TOOLTIP: 'data-populator-header-title-tooltip', @@ -23,8 +26,10 @@ export default { TEMPLATE_SAVE_ENVIRONMENT_LABEL: 'populate-with-template-save-environment-label', TEMPLATE_SAVE_ENVIRONMENT_TOOLTIP: 'populate-with-template-save-environment-tooltip', TEMPLATE_SAVE_ENVIRONMENT_INPUT: 'populate-with-template-save-environment-input', - TEMPLATE_GENERATE_DEMO_DATA_BUTTON: 'populate-with-template-generate-demo-data-button', + TEMPLATE_GENERATE_DEMO_DATA_BUTTON: 'populate-with-template-generate-demo-data-button' +}; +export const populateWithEnvironmentPageElements = { //Data Populator -> Populate With Environment ENVIRONMENT_LABEL: 'populate-with-environment-environment-label', ENVIRONMENT_TOOLTIP: 'populate-with-environment-environment-tooltip', @@ -38,8 +43,10 @@ export default { ENVIRONMENT_NUMBER_OF_RUNS_10_LABEL: 'populate-with-environment-select-number-of-runs-item-10', ENVIRONMENT_NUMBER_OF_RUNS_50_LABEL: 'populate-with-environment-select-number-of-runs-item-50', ENVIRONMENT_NUMBER_OF_RUNS_100_LABEL: 'populate-with-environment-select-number-of-runs-item-100', - ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON: 'populate-with-environment-generate-demo-data-button', + ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON: 'populate-with-environment-generate-demo-data-button' +}; +export const popUpElements = { //Confirm Pop Up CONFIRM_POP_UP_TITLE: 'cly-vue-confirm-dialog-test-id-cly-confirm-dialog-title-label', CONFIRM_POP_UP_SUB_TITLE: 'el-dialog-test-id-el-dialog-content-label', @@ -59,11 +66,64 @@ export default { SUCCESS_POP_UP_TITLE: 'finished-confirm-title', SUCCESS_POP_UP_SUB_TITLE: 'finished-confirm-sub-title', SUCCESS_POP_UP_GO_TO_HOME_BUTTON: 'go-to-homepage-button', - SUCCESS_POP_UP_STAY_IN_POPULATOR_BUTTON: 'stay-in-data-populator-button', + SUCCESS_POP_UP_STAY_IN_POPULATOR_BUTTON: 'stay-in-data-populator-button' +}; +export const templatesPageElements = { //Templates TEMPLATES_PAGE_TITLE: 'templates-header-title', TEMPLATES_PAGE_TITLE_TOOLTIP: 'templates-header-title-tooltip', CREATE_NEW_TEMPLATE_BUTTON: 'create-new-template-button', - TEMPLATES_DATATABLE: 'templates-datatable' }; + +const templatesDataTableElements = (index = 0) => ({ + DATATABLE_SEARCH_INPUT: 'datatable-templates-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + //Columns' Labels + COLUMN_NAME_TEMPLATE_LABEL: 'datatable-templates-label-template', + COLUMN_NAME_TEMPLATE_SORTABLE_ICON: 'datatable-templates-sortable-icon-template', + COLUMN_NAME_NUMBER_OF_USERS_LABEL: 'datatable-templates-label-number-of-users', + COLUMN_NAME_NUMBER_OF_USERS_SORTABLE_ICON: 'datatable-templates-sortable-icon-number-of-users', + COLUMN_NAME_NUMBER_OF_EVENTS_LABEL: 'datatable-templates-label-number-of-events', + COLUMN_NAME_NUMBER_OF_EVENTS_SORTABLE_ICON: 'datatable-templates-sortable-icon-number-of-events', + COLUMN_NAME_VIEWS_LABEL: 'datatable-templates-label-views', + COLUMN_NAME_VIEWS_SORTABLE_ICON: 'datatable-templates-sortable-icon-views', + COLUMN_NAME_SEQUENCES_LABEL: 'datatable-templates-label-sequences', + COLUMN_NAME_SEQUENCES_SORTABLE_ICON: 'datatable-templates-sortable-icon-sequences', + COLUMN_NAME_GENERATED_ON_LABEL: 'datatable-templates-label-generated-on', + COLUMN_NAME_GENERATED_ON_SORTABLE_ICON: 'datatable-templates-sortable-icon-generated-on', + + //Columns' Rows' Datas Elements + TEMPLATE: 'datatable-templates-template-' + index, + NUMBER_OF_USERS: 'datatable-templates-number-of-users-' + index, + NUMBER_OF_EVENTS: 'datatable-templates-number-of-events-' + index, + VIEWS: 'datatable-templates-views-' + index, + SEQUENCES: 'datatable-templates-sequences-' + index, + GENERATED_ON: 'datatable-templates-generated-on-' + index, + MORE_BUTTON: 'datatable-templates-' + index + '-more-option-button', + DUPLICATE_BUTTON: 'datatable-templates-duplicate-button-' + index, + DELETE_BUTTON: 'datatable-templates-delete-button-' + index, + EDIT_BUTTON: 'datatable-templates-edit-button-' + index, + + //Pagination Elements + TEMPLATES_ITEMS_PER_PAGE_LABEL: 'datatable-templates-items-per-page-label', + TEMPLATES_PER_PAGE_COUNT_SELECT: 'datatable-templates-items-per-page-count-select-input-pseudo-input-label', + TEMPLATES_PER_PAGE_COUNT_SELECT_ICON: 'datatable-templates-items-per-page-count-select-icon', + TEMPLATES_PER_PAGE_COUNT_LABEL: 'datatable-templates-items-per-page-count-select', + TEMPLATES_PAGE_NUMBER_SELECT: 'datatable-templates-page-number-select-input-pseudo-input-label', + TEMPLATES_PAGE_NUMBER_SELECT_ICON: 'datatable-templates-page-number-select-icon', + TEMPLATES_FIRST_PAGE_ARROW_BUTTON: 'datatable-templates-first-page-arrow-button', + TEMPLATES_PREVIOUS_PAGE_ARROW_BUTTON: 'datatable-templates-previous-page-arrow-button', + TEMPLATES_NEXT_PAGE_ARROW_BUTTON: 'datatable-templates-next-page-arrow-button', + TEMPLATES_LAST_PAGE_ARROW_BUTTON: 'datatable-templates-last-page-arrow-button' +}); + +module.exports = { + dataPopulatorPageElements, + populateWithTemplatePageElements, + populateWithEnvironmentPageElements, + popUpElements, + templatesPageElements, + templatesDataTableElements +}; \ No newline at end of file From 8031071b5aa1ab489227a2d1256aebba246f1afa Mon Sep 17 00:00:00 2001 From: can-angun Date: Thu, 17 Oct 2024 22:59:44 +0000 Subject: [PATCH 061/381] Fixed linter fails --- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../lib/dashboard/manage/populate/populate.js | 504 +++++++++--------- .../dashboard/manage/populate/populate.js | 2 +- 3 files changed, 256 insertions(+), 254 deletions(-) diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index bbdbdf823f8..d7432f7b637 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -382,11 +382,11 @@ describe('Complete Onboarding', () => { dataManagerEventsPageHelpers.clickEventGroupsTab(); //dataManagerEventGroupsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data navigationHelpers.goToDataPopulatorPage(); - dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithTemplatePage(); + dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithTemplatePage(); dataPopulatorPageHelpers.clickPopulateWithEnvironmentTab(); dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithEnvironmentPage(); dataPopulatorPageHelpers.clickTemplatesTab(); - dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); + dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); //TODO: Add the cases of the following pages //navigationHelpers.goToIncomingDataLogsPage(); //incomingDataLogsPageHelpers.verifyFullDataPageElements(); diff --git a/ui-tests/cypress/lib/dashboard/manage/populate/populate.js b/ui-tests/cypress/lib/dashboard/manage/populate/populate.js index 6274dacb093..59d36a244b4 100644 --- a/ui-tests/cypress/lib/dashboard/manage/populate/populate.js +++ b/ui-tests/cypress/lib/dashboard/manage/populate/populate.js @@ -5,241 +5,241 @@ import { popUpElements, templatesPageElements, templatesDataTableElements - } from "../../../../support/elements/dashboard/manage/populate/populate"; - - const verifyStaticElementsOfDataPopulatorPage = () => { +} from "../../../../support/elements/dashboard/manage/populate/populate"; + +const verifyStaticElementsOfDataPopulatorPage = () => { cy.verifyElement({ - labelElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE, - labelText: "Data Populator", - tooltipElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE_TOOLTIP, - tooltipText: "Populate a Countly app with random data (typically for testing or demonstration)" + labelElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE, + labelText: "Data Populator", + tooltipElement: populateWithTemplatePageElements.DATA_POPULATOR_PAGE_TITLE_TOOLTIP, + tooltipText: "Populate a Countly app with random data (typically for testing or demonstration)" }); - + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_DATA_POPULATOR, - elementText: "Data Populator", + element: dataPopulatorPageElements.TAB_DATA_POPULATOR, + elementText: "Data Populator", }); - + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_TEMPLATES, - elementText: "Templates", + element: dataPopulatorPageElements.TAB_TEMPLATES, + elementText: "Templates", }); - + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE, - elementText: "Populate with Template", - + element: dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE, + elementText: "Populate with Template", + }); - + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT, - elementText: "Populate with Environment", + element: dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT, + elementText: "Populate with Environment", }); - } - - const verifyPageElementsOfDataPopulatorWithTemplatePage = () => { - +}; + +const verifyPageElementsOfDataPopulatorWithTemplatePage = () => { + verifyStaticElementsOfDataPopulatorPage(); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_LABEL, - labelText: "Data template", - tooltipElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_TOOLTIP, - tooltipText: "Choose a template for data population. If you can't find a suitable template, you can create a new one from the “Templates” tab above." + labelElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_LABEL, + labelText: "Data template", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_TOOLTIP, + tooltipText: "Choose a template for data population. If you can't find a suitable template, you can create a new one from the “Templates” tab above." }); - + cy.verifyElement({ - element: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT, - elementPlaceHolder: "Select a template", + element: populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT, + elementPlaceHolder: "Select a template", }); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_LABEL, - labelText: "Date range", + labelElement: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_LABEL, + labelText: "Date range", }); - + cy.verifyElement({ - element: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT, + element: populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT, }); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_LABEL, - labelText: "Number of runs", - tooltipElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_TOOLTIP, - tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_LABEL, + labelText: "Number of runs", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_TOOLTIP, + tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" }); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL, - labelText: "10" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL, + labelText: "10" }); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL, - labelText: "50" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL, + labelText: "50" }); - + cy.verifyElement({ - labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL, - labelText: "100" + labelElement: populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL, + labelText: "100" }); - + cy.verifyElement({ - element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_SWITCHBOX, - labelElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_LABEL, - labelText: "Save environment", - tooltipElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_TOOLTIP, - tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." + element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_SWITCHBOX, + labelElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_LABEL, + labelText: "Save environment", + tooltipElement: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_TOOLTIP, + tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." }); - + cy.verifyElement({ - element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_INPUT, - elementPlaceHolder: "Enter an environment name", + element: populateWithTemplatePageElements.TEMPLATE_SAVE_ENVIRONMENT_INPUT, + elementPlaceHolder: "Enter an environment name", }); - + cy.verifyElement({ - element: populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON, - elementText: "Generate Demo Data", + element: populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON, + elementText: "Generate Demo Data", }); - } - - const verifyPageElementsOfDataPopulatorWithEnvironmentPage = () => { - +}; + +const verifyPageElementsOfDataPopulatorWithEnvironmentPage = () => { + verifyStaticElementsOfDataPopulatorPage(); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_LABEL, - labelText: "Environment", - tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_TOOLTIP, - tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_LABEL, + labelText: "Environment", + tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_TOOLTIP, + tooltipText: "Choose an environment for data population. If no environments are available, initiate the populator with a template first and then save to create an environment. Environments enable you to execute the populator with a consistent user set, ensuring uniform data across multiple runs." }); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_LABEL, - labelText: "Date range", + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_LABEL, + labelText: "Date range", }); - + cy.verifyElement({ - element: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_SELECT, + element: populateWithEnvironmentPageElements.ENVIRONMENT_DATE_RANGE_SELECT, }); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_LABEL, - labelText: "Number of runs", - tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_TOOLTIP, - tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_LABEL, + labelText: "Number of runs", + tooltipElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_TOOLTIP, + tooltipText: "Each run will go through each unique user in the environment/template and will trigger one sequence per user" }); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_10_LABEL, - labelText: "10" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_10_LABEL, + labelText: "10" }); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_50_LABEL, - labelText: "50" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_50_LABEL, + labelText: "50" }); - + cy.verifyElement({ - labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_100_LABEL, - labelText: "100" + labelElement: populateWithEnvironmentPageElements.ENVIRONMENT_NUMBER_OF_RUNS_100_LABEL, + labelText: "100" }); - + cy.verifyElement({ - element: populateWithEnvironmentPageElements.ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON, - elementText: "Generate Demo Data", + element: populateWithEnvironmentPageElements.ENVIRONMENT_GENERATE_DEMO_DATA_BUTTON, + elementText: "Generate Demo Data", }); - } - - const verifyPageElementsOfTemplatesPage = () => { - +}; + +const verifyPageElementsOfTemplatesPage = () => { + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_DATA_POPULATOR, - elementText: "Data Populator", + element: dataPopulatorPageElements.TAB_DATA_POPULATOR, + elementText: "Data Populator", }); - + cy.verifyElement({ - element: dataPopulatorPageElements.TAB_TEMPLATES, - elementText: "Templates", + element: dataPopulatorPageElements.TAB_TEMPLATES, + elementText: "Templates", }); - + cy.verifyElement({ - labelElement: templatesPageElements.TEMPLATES_PAGE_TITLE, - labelText: "Templates", - tooltipElement: templatesPageElements.TEMPLATES_PAGE_TITLE_TOOLTIP, - tooltipText: "Manage your templates for data population" + labelElement: templatesPageElements.TEMPLATES_PAGE_TITLE, + labelText: "Templates", + tooltipElement: templatesPageElements.TEMPLATES_PAGE_TITLE_TOOLTIP, + tooltipText: "Manage your templates for data population" }); - + cy.verifyElement({ - element: templatesPageElements.CREATE_NEW_TEMPLATE_BUTTON, - elementText: "Create New Template", + element: templatesPageElements.CREATE_NEW_TEMPLATE_BUTTON, + elementText: "Create New Template", }); - + cy.verifyElement({ - element: templatesDataTableElements().DATATABLE_SEARCH_INPUT, + element: templatesDataTableElements().DATATABLE_SEARCH_INPUT, }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_TEMPLATE_LABEL, - labelText: "Template", + labelElement: templatesDataTableElements().COLUMN_NAME_TEMPLATE_LABEL, + labelText: "Template", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_TEMPLATE_SORTABLE_ICON + element: templatesDataTableElements().COLUMN_NAME_TEMPLATE_SORTABLE_ICON }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_LABEL, - labelText: "Number of Users", + labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_LABEL, + labelText: "Number of Users", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_SORTABLE_ICON, + element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_USERS_SORTABLE_ICON, }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_LABEL, - labelText: "Number of Events", + labelElement: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_LABEL, + labelText: "Number of Events", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_SORTABLE_ICON, + element: templatesDataTableElements().COLUMN_NAME_NUMBER_OF_EVENTS_SORTABLE_ICON, }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_VIEWS_LABEL, - labelText: "Views", + labelElement: templatesDataTableElements().COLUMN_NAME_VIEWS_LABEL, + labelText: "Views", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_VIEWS_SORTABLE_ICON, + element: templatesDataTableElements().COLUMN_NAME_VIEWS_SORTABLE_ICON, }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_SEQUENCES_LABEL, - labelText: "Sequences", + labelElement: templatesDataTableElements().COLUMN_NAME_SEQUENCES_LABEL, + labelText: "Sequences", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_SEQUENCES_SORTABLE_ICON, + element: templatesDataTableElements().COLUMN_NAME_SEQUENCES_SORTABLE_ICON, }); - + cy.verifyElement({ - labelElement: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_LABEL, - labelText: "Generated On", + labelElement: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_LABEL, + labelText: "Generated On", }); - + cy.verifyElement({ - element: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_SORTABLE_ICON, + element: templatesDataTableElements().COLUMN_NAME_GENERATED_ON_SORTABLE_ICON, }); - + verifyTemplatesDataTable({ - index: 0, - shouldNotEqual: true, + index: 0, + shouldNotEqual: true, }); - } - - const verifyTemplatesDataTable = ({ +}; + +const verifyTemplatesDataTable = ({ index = 0, shouldNotEqual = false, template = null, @@ -248,133 +248,135 @@ import { views = null, sequences = null, generatedOn = null - }) => { - +}) => { + cy.verifyElement({ - element: templatesDataTableElements(index).TEMPLATE, - elementText: template, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).TEMPLATE, + elementText: template, + shouldNotEqual: shouldNotEqual, }); - + cy.verifyElement({ - element: templatesDataTableElements(index).NUMBER_OF_USERS, - elementText: numberOfUsers, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).NUMBER_OF_USERS, + elementText: numberOfUsers, + shouldNotEqual: shouldNotEqual, }); - + cy.verifyElement({ - element: templatesDataTableElements(index).NUMBER_OF_EVENTS, - elementText: numberOfEvents, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).NUMBER_OF_EVENTS, + elementText: numberOfEvents, + shouldNotEqual: shouldNotEqual, }); - + cy.verifyElement({ - element: templatesDataTableElements(index).VIEWS, - elementText: views, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).VIEWS, + elementText: views, + shouldNotEqual: shouldNotEqual, }); - + cy.verifyElement({ - element: templatesDataTableElements(index).SEQUENCES, - elementText: sequences, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).SEQUENCES, + elementText: sequences, + shouldNotEqual: shouldNotEqual, }); - + cy.verifyElement({ - element: templatesDataTableElements(index).GENERATED_ON, - elementText: generatedOn, - shouldNotEqual: shouldNotEqual, + element: templatesDataTableElements(index).GENERATED_ON, + elementText: generatedOn, + shouldNotEqual: shouldNotEqual, }); - } - - const selectDataTemplate = (template) => { - var elementItemSelector = 'el-option-test-id-' + template + '-el-options' +}; + +const selectDataTemplate = (template) => { + var elementItemSelector = 'el-option-test-id-' + template + '-el-options'; cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATA_TEMPLATE_SELECT); cy.clickElement(elementItemSelector); - } - - const selectDateRange = (startDate, endDate) => { - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT) - cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_START_DATE, startDate) - cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_END_DATE, endDate) - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_APPLY_BUTTON) - } - - const clickNumberOfRunsAs10 = () => { - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL) - } - - const clickNumberOfRunsAs50 = () => { - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL) - } - - const clickNumberOfRunsAs100 = () => { - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL) - } - - const clickGenerateDemoDataButton = () => { - cy.clickElement(populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON) - } - - const clickYesPopulateDataButton = () => { - cy.clickElement(popUpElements.CONFIRM_POP_UP_SAVE_BUTTON) - } - - const clickNavigateToHomeButton = () => { - cy.clickElement(popUpElements.SUCCESS_POP_UP_GO_TO_HOME_BUTTON) - } - - const clickDataPopulatorTab = () => { - cy.clickElement(dataPopulatorPageElements.TAB_DATA_POPULATOR) - } - - const clickTemplatesTab = () => { - cy.clickElement(dataPopulatorPageElements.TAB_TEMPLATES) - } - - const clickPopulateWithTemplateTab = () => { - cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE) - } - - const clickPopulateWithEnvironmentTab = () => { - cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT) - } - - const generateData = ({ +}; + +const selectDateRange = (startDate, endDate) => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_SELECT); + cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_START_DATE, startDate); + cy.typeInput(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_END_DATE, endDate); + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_DATE_RANGE_APPLY_BUTTON); +}; + +const clickNumberOfRunsAs10 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_10_LABEL); +}; + +const clickNumberOfRunsAs50 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_50_LABEL); +}; + +const clickNumberOfRunsAs100 = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_NUMBER_OF_RUNS_100_LABEL); +}; + +const clickGenerateDemoDataButton = () => { + cy.clickElement(populateWithTemplatePageElements.TEMPLATE_GENERATE_DEMO_DATA_BUTTON); +}; + +const clickYesPopulateDataButton = () => { + cy.clickElement(popUpElements.CONFIRM_POP_UP_SAVE_BUTTON); +}; + +const clickNavigateToHomeButton = () => { + cy.clickElement(popUpElements.SUCCESS_POP_UP_GO_TO_HOME_BUTTON); +}; + +const clickDataPopulatorTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_DATA_POPULATOR); +}; + +const clickTemplatesTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_TEMPLATES); +}; + +const clickPopulateWithTemplateTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_TEMPLATE); +}; + +const clickPopulateWithEnvironmentTab = () => { + cy.clickElement(dataPopulatorPageElements.TAB_POPULATE_WITH_ENVIRONMENT); +}; + +const generateData = ({ template = 'bank', startDate, endDate, numberOfRuns - }) => { - selectDataTemplate(template) - +}) => { + selectDataTemplate(template); + if (startDate != null && endDate != null) { - selectDateRange(startDate, endDate) + selectDateRange(startDate, endDate); } - + if (numberOfRuns === '100') { - clickNumberOfRunsAs100() - } else if (numberOfRuns === '50') { - clickNumberOfRunsAs50() - } else { - clickNumberOfRunsAs10() + clickNumberOfRunsAs100(); } - + else if (numberOfRuns === '50') { + clickNumberOfRunsAs50(); + } + else { + clickNumberOfRunsAs10(); + } + clickGenerateDemoDataButton(); clickYesPopulateDataButton(); - + cy - .elementExists(popUpElements.GENERATING_POP_UP_PROGRESS_BAR) - .then((isExists) => { - if (isExists) { - cy.shouldNotExist(popUpElements.GENERATING_POP_UP_PROGRESS_BAR); - } - }); - + .elementExists(popUpElements.GENERATING_POP_UP_PROGRESS_BAR) + .then((isExists) => { + if (isExists) { + cy.shouldNotExist(popUpElements.GENERATING_POP_UP_PROGRESS_BAR); + } + }); + clickNavigateToHomeButton(); - } - - module.exports = { +}; + +module.exports = { clickDataPopulatorTab, clickTemplatesTab, clickPopulateWithTemplateTab, @@ -392,4 +394,4 @@ import { clickYesPopulateDataButton, clickNavigateToHomeButton, generateData - } \ No newline at end of file +}; \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js b/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js index ff88f2d3903..f0c8ffd2a29 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/populate/populate.js @@ -3,7 +3,7 @@ export const dataPopulatorPageElements = { TAB_TEMPLATES: '#tab-templates', TAB_POPULATE_WITH_TEMPLATE: 'tab-populate-with-template-title', TAB_POPULATE_WITH_ENVIRONMENT: 'tab-populate-with-environment-title' -} +}; export const populateWithTemplatePageElements = { //Data Populator -> Populate With Template From 87d7160e9e97bb3bd4f5a9d824cb11802400c954 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Fri, 18 Oct 2024 09:43:34 +0300 Subject: [PATCH 062/381] times-of-day readme file --- plugins/times-of-day/README.md | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 plugins/times-of-day/README.md diff --git a/plugins/times-of-day/README.md b/plugins/times-of-day/README.md new file mode 100644 index 00000000000..c612dc2681b --- /dev/null +++ b/plugins/times-of-day/README.md @@ -0,0 +1,56 @@ +# Countly times-of-day plugin + +The Times of Day plugin provides a visual representation of user activity based on local time, offering a scatter plot chart that shows when sessions and events occur across different days of the week. + +## File Structure + +```javascript +times-of-day/ +├── api/ # Backend API logic +│ └── api.js # Main API file handling backend requests and responses +├── frontend/ # Frontend resources +│ ├── public/ # Publicly accessible resources +│ │ ├── images/ # Images used in the plugin +│ │ │ └── times-of-day/ # Folder for times-of-day related images +│ │ │ └── times-of-day.svg # SVG image for times-of-day widget +│ │ ├── javascripts/ # JavaScript files for frontend logic +│ │ │ ├── countly.models.js # Model definitions for data handling +│ │ │ ├── countly.views.component.common.js # Common view component logic +│ │ │ └── countly.views.js # View definitions for rendering +│ ├── localization/ # Localization files for multi-language support +│ ├── stylesheets/ # Stylesheets for styling the plugin +│ │ ├── main.css # Compiled CSS for styling +│ │ ├── main.css.map # Source map for the CSS file +│ │ └── main.scss # Main SCSS stylesheet +│ ├── templates/ # HTML templates for UI components +│ │ ├── times-of-day-widget-drawer.html # Drawer template for the times-of-day widget +│ │ ├── times-of-day-widget.html # Main template for the times-of-day widget +│ │ └── times-of-day.html # Template for times-of-day display +├── app.js # Main application logic for the frontend +├── install.js # Installation script for the plugin +├── package-lock.json # Lock file for Node.js dependencies +├── package.json # Package configuration file for Node.js +├── tests.js # Test scripts for validating functionality +└── uninstall.js # Uninstallation script for removing the plugin +``` + +## Key Features + +- **Visual User Activity Mapping**: TDisplays a scatter plot chart showing when user sessions and events occur throughout the day, providing a clear visual representation of user activity patterns. +- **Data Type Filters**: Allows filtering the data by Sessions, Events, Consent, and Push Actioned, giving flexibility in analyzing different types of user interactions +- **Custom Time Ranges**: Enables selection of different time periods (e.g., All Time, Last 30 Days) to adjust the data view to fit your specific analysis needs. +- **Localized Time Representation**: Displays user activity based on their local time zone, making it easier to track engagement across different regions + +## Installation + +1. Navigate to the directory where the Cognito plugin is located. This could be a relative or absolute path depending on your environment setup: + + ```bash + cd /path/to/your/project/times-of-day + ``` + +2. Install dependencies: + + ```bash + npm install + ``` From d9d939bcc755e40858dea20e4a154c5d0bd5d914 Mon Sep 17 00:00:00 2001 From: can-angun Date: Fri, 18 Oct 2024 07:00:25 +0000 Subject: [PATCH 063/381] Added incoming data logs verify full data page case --- .../frontend/public/templates/logger.html | 3 +- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../lib/dashboard/manage/logger/logger.js | 135 +++++++++++++++--- .../dashboard/manage/logger/logger.js | 54 +++++-- 4 files changed, 162 insertions(+), 34 deletions(-) diff --git a/plugins/logger/frontend/public/templates/logger.html b/plugins/logger/frontend/public/templates/logger.html index ce798cdde47..634712521b1 100644 --- a/plugins/logger/frontend/public/templates/logger.html +++ b/plugins/logger/frontend/public/templates/logger.html @@ -20,6 +20,7 @@ -
+
\ No newline at end of file diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index d7432f7b637..49f73d77289 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -387,9 +387,9 @@ describe('Complete Onboarding', () => { dataPopulatorPageHelpers.verifyPageElementsOfDataPopulatorWithEnvironmentPage(); dataPopulatorPageHelpers.clickTemplatesTab(); dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); + navigationHelpers.goToIncomingDataLogsPage(); + //incomingDataLogsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data //TODO: Add the cases of the following pages - //navigationHelpers.goToIncomingDataLogsPage(); - //incomingDataLogsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToSdkManagerPage(); //sdkManagersPageHelpers.verifyFullDataPageElements(); //sdkManagersPageHelpers.clickRequestStatsTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/logger/logger.js b/ui-tests/cypress/lib/dashboard/manage/logger/logger.js index d7b90b2952e..04b9180a30a 100644 --- a/ui-tests/cypress/lib/dashboard/manage/logger/logger.js +++ b/ui-tests/cypress/lib/dashboard/manage/logger/logger.js @@ -1,58 +1,151 @@ -import incomingDataLogsPageElements from "../../../../support/elements/dashboard/manage/logger/logger"; +import { + loggerPageElements, + logsDataTableElements +} from "../../../../support/elements/dashboard/manage/logger/logger"; -const verifyStaticElementsOfPage = () => { +const verifyStaticElementsOfPage = (isEnabled) => { cy.verifyElement({ - labelElement: incomingDataLogsPageElements.PAGE_TITLE, + labelElement: loggerPageElements.PAGE_TITLE, labelText: "Incoming Data Logs", - tooltipElement: incomingDataLogsPageElements.PAGE_TITLE_TOOLTIP, + tooltipElement: loggerPageElements.PAGE_TITLE_TOOLTIP, tooltipText: "Log requests made to the write API to review and debug incoming data" }); cy.verifyElement({ - labelElement: incomingDataLogsPageElements.PAGE_SUB_TITLE, + labelElement: loggerPageElements.PAGE_SUB_TITLE, labelText: "Only up to last 1000 incoming data logs are stored" }); + if (isEnabled) { + cy.verifyElement({ + labelElement: loggerPageElements.AUTO_REFRESH_IS_LABEL, + labelText: "Auto-refresh is", + element: loggerPageElements.ENABLED_LABEL, + elementText: "Enabled", + tooltipElement: loggerPageElements.AUTO_REFRESH_IS_ENABLED_TOOLTIP, + tooltipText: "Automatically refresh can be adjusted through this switch", + }); + + cy.verifyElement({ + element: loggerPageElements.STOP_AUTO_REFRESH_BUTTON, + elementText: "Stop Auto-refresh", + }); + } else { + cy.verifyElement({ + element: loggerPageElements.ENABLE_AUTO_REFRESH_TOGGLE, + labelElement: loggerPageElements.ENABLE_AUTO_REFRESH_LABEL, + labelText: "Enable Auto-refresh", + tooltipElement: loggerPageElements.ENABLE_AUTO_REFRESH_TOOLTIP, + tooltipText: "Automatically refresh can be adjusted through this switch" + }); + } + cy.verifyElement({ - element: incomingDataLogsPageElements.SELECT_FILTER_COMBOBOX, + element: logsDataTableElements().SELECT_FILTER_COMBOBOX, }); cy.verifyElement({ - element: incomingDataLogsPageElements.EXPORT_AS_BUTTON, + element: logsDataTableElements().EXPORT_AS_BUTTON, }); cy.verifyElement({ - element: incomingDataLogsPageElements.DATATABLE_SEARCH_INPUT, + element: logsDataTableElements().DATATABLE_SEARCH_INPUT, }); -}; -const verifyEmptyPageElements = () => { + cy.verifyElement({ + labelElement: logsDataTableElements().COLUMN_NAME_REQUEST_RECEIVED_LABEL, + labelText: "Request Received", + }); - verifyStaticElementsOfPage(); + cy.verifyElement({ + element: logsDataTableElements().COLUMN_NAME_REQUEST_RECEIVED_SORTABLE_ICON, + }); cy.verifyElement({ - element: incomingDataLogsPageElements.ENABLE_AUTO_REFRESH_TOGGLE, - labelElement: incomingDataLogsPageElements.ENABLE_AUTO_REFRESH_LABEL, - labelText: "Enable Auto-refresh", - tooltipElement: incomingDataLogsPageElements.ENABLE_AUTO_REFRESH_TOOLTIP, - tooltipText: "Automatically refresh can be adjusted through this switch" + labelElement: logsDataTableElements().COLUMN_NAME_DETAILS_LABEL, + labelText: "Details", }); cy.verifyElement({ - element: incomingDataLogsPageElements.EMPTY_TABLE_ICON, + element: logsDataTableElements().COLUMN_NAME_DETAILS_SORTABLE_ICON, }); cy.verifyElement({ - labelElement: incomingDataLogsPageElements.EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + labelElement: logsDataTableElements().COLUMN_NAME_INFORMATION_LABEL, + labelText: "Information", }); cy.verifyElement({ - labelElement: incomingDataLogsPageElements.EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + element: logsDataTableElements().COLUMN_NAME_INFORMATION_SORTABLE_ICON, + }); +} + +const verifyEmptyPageElements = () => { + + verifyStaticElementsOfPage(false); + + verifyLogsDataTable({ + isEmpty: true }); }; +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(false); + + verifyLogsDataTable({ + isEmpty: false, + shouldNotEqual: true, + }); +}; + +const verifyLogsDataTable = ({ + index = 0, + isEmpty = false, + shouldNotEqual = false, + requestReceived = null, + details = null, + information = null +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: logsDataTableElements().EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: logsDataTableElements().EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: logsDataTableElements().EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + return; + } + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: logsDataTableElements(index).REQUEST_RECEIVED, + elementText: requestReceived, + }); + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: logsDataTableElements(index).DETAILS, + elementText: details, + }); + + cy.verifyElement({ + shouldNot: shouldNotEqual, + element: logsDataTableElements(index).INFORMATION, + elementText: information, + }); +} + module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, + verifyLogsDataTable, }; \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js b/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js index 840344160b7..61c53494264 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js @@ -1,20 +1,54 @@ -export default { +export const loggerPageElements = { PAGE_TITLE: 'header-title', PAGE_TITLE_TOOLTIP: 'header-title-tooltip', PAGE_SUB_TITLE: 'manage-logger-subtitle', AUTO_REFRESH_IS_LABEL: 'enable-auto-refresh-auto-refresh-toggle-is-label', - ENABLED_LABEL: 'enable-auto-refresh-auto-refresh-toggle-enabled-label', - AUTO_REFRESH_IS_ENABLED_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-tooltip', - STOP_AUTO_REFRESH_BUTTON: 'enable-auto-refresh-auto-refresh-toggle-button', - ENABLE_AUTO_REFRESH_LABEL: 'enable-auto-refresh-auto-refresh-toggle-disabled-label', + ENABLED_LABEL: 'enable-auto-refresh-auto-refresh-toggle-enabled-label', + AUTO_REFRESH_IS_ENABLED_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-tooltip', + STOP_AUTO_REFRESH_BUTTON: 'enable-auto-refresh-auto-refresh-toggle-button', + ENABLE_AUTO_REFRESH_LABEL:'enable-auto-refresh-auto-refresh-toggle-disabled-label', ENABLE_AUTO_REFRESH_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-disabled-tooltip', ENABLE_AUTO_REFRESH_TOGGLE: 'enable-auto-refresh-auto-refresh-toggle-el-switch-core', +}; +const logsDataTableElements = (index = 0) => ({ SELECT_FILTER_COMBOBOX: 'select-test-id-select-input', - EXPORT_AS_BUTTON: 'cly-datatable-n-test-id-export-as-button', - DATATABLE_SEARCH_INPUT: 'cly-datatable-n-test-id-datatable-search-input', - EMPTY_TABLE_ICON: 'cly-datatable-n-test-id-empty-logo', - EMPTY_TABLE_TITLE: 'cly-datatable-n-test-id-empty-title', - EMPTY_TABLE_SUBTITLE: 'cly-datatable-n-test-id-empty-subtitle' + EXPORT_AS_BUTTON: 'datatable-logs-export-as-button', + DATATABLE_SEARCH_INPUT: 'datatable-logs-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + EMPTY_TABLE_ICON: 'datatable-logs-empty-logo', + EMPTY_TABLE_TITLE: 'datatable-logs-empty-title', + EMPTY_TABLE_SUBTITLE: 'datatable-logs-empty-subtitle', + + COLUMN_NAME_REQUEST_RECEIVED_LABEL: 'datatable-logs-label-request-received', + COLUMN_NAME_REQUEST_RECEIVED_SORTABLE_ICON: 'datatable-logs-sortable-icon-request-received', + COLUMN_NAME_DETAILS_LABEL: 'datatable-logs-label-details', + COLUMN_NAME_DETAILS_SORTABLE_ICON: 'datatable-logs-sortable-icon-details', + COLUMN_NAME_INFORMATION_LABEL: 'datatable-logs-label-information', + COLUMN_NAME_INFORMATION_SORTABLE_ICON: 'datatable-logs-sortable-icon-information', + + //Columns' Rows' Datas Elements + //TODO: Data test id is missing, will be added later + REQUEST_RECEIVED: 'datatable-logs-request-received-' + index, + DETAILS: 'datatable-logs-details-' + index, + INFORMATION: 'datatable-logs-information-' + index, + + //PAGINATION ELEMENTS + ITEMS_PER_PAGE_LABEL: 'report-manager-manually-created-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'report-manager-manually-created-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'report-manager-manually-created-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'report-manager-manually-created-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'report-manager-manually-created-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'report-manager-manually-created-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'report-manager-manually-created-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'report-manager-manually-created-groups-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'report-manager-manually-created-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'report-manager-manually-created-views-last-page-arrow-button' +}); + +module.exports = { + loggerPageElements, + logsDataTableElements }; \ No newline at end of file From 757d6ac7ee544541e9d5242ff7f89293bdfe2ce4 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Fri, 18 Oct 2024 10:16:11 +0300 Subject: [PATCH 064/381] update readme file --- plugins/times-of-day/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/times-of-day/README.md b/plugins/times-of-day/README.md index c612dc2681b..791e73a7901 100644 --- a/plugins/times-of-day/README.md +++ b/plugins/times-of-day/README.md @@ -43,7 +43,7 @@ times-of-day/ ## Installation -1. Navigate to the directory where the Cognito plugin is located. This could be a relative or absolute path depending on your environment setup: +1. Navigate to the directory where the times-of-day plugin is located. This could be a relative or absolute path depending on your environment setup: ```bash cd /path/to/your/project/times-of-day From 8a71d5f80f3fc8c2c0da9bd16e10eed17b1f7719 Mon Sep 17 00:00:00 2001 From: can-angun Date: Fri, 18 Oct 2024 07:34:14 +0000 Subject: [PATCH 065/381] Fixed linter fails --- ui-tests/cypress/lib/dashboard/manage/logger/logger.js | 7 ++++--- .../support/elements/dashboard/manage/logger/logger.js | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/manage/logger/logger.js b/ui-tests/cypress/lib/dashboard/manage/logger/logger.js index 04b9180a30a..a4c5c5063d6 100644 --- a/ui-tests/cypress/lib/dashboard/manage/logger/logger.js +++ b/ui-tests/cypress/lib/dashboard/manage/logger/logger.js @@ -30,7 +30,8 @@ const verifyStaticElementsOfPage = (isEnabled) => { element: loggerPageElements.STOP_AUTO_REFRESH_BUTTON, elementText: "Stop Auto-refresh", }); - } else { + } + else { cy.verifyElement({ element: loggerPageElements.ENABLE_AUTO_REFRESH_TOGGLE, labelElement: loggerPageElements.ENABLE_AUTO_REFRESH_LABEL, @@ -78,7 +79,7 @@ const verifyStaticElementsOfPage = (isEnabled) => { cy.verifyElement({ element: logsDataTableElements().COLUMN_NAME_INFORMATION_SORTABLE_ICON, }); -} +}; const verifyEmptyPageElements = () => { @@ -142,7 +143,7 @@ const verifyLogsDataTable = ({ element: logsDataTableElements(index).INFORMATION, elementText: information, }); -} +}; module.exports = { verifyEmptyPageElements, diff --git a/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js b/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js index 61c53494264..ec77f2aecf7 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/logger/logger.js @@ -4,10 +4,10 @@ export const loggerPageElements = { PAGE_SUB_TITLE: 'manage-logger-subtitle', AUTO_REFRESH_IS_LABEL: 'enable-auto-refresh-auto-refresh-toggle-is-label', - ENABLED_LABEL: 'enable-auto-refresh-auto-refresh-toggle-enabled-label', - AUTO_REFRESH_IS_ENABLED_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-tooltip', - STOP_AUTO_REFRESH_BUTTON: 'enable-auto-refresh-auto-refresh-toggle-button', - ENABLE_AUTO_REFRESH_LABEL:'enable-auto-refresh-auto-refresh-toggle-disabled-label', + ENABLED_LABEL: 'enable-auto-refresh-auto-refresh-toggle-enabled-label', + AUTO_REFRESH_IS_ENABLED_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-tooltip', + STOP_AUTO_REFRESH_BUTTON: 'enable-auto-refresh-auto-refresh-toggle-button', + ENABLE_AUTO_REFRESH_LABEL: 'enable-auto-refresh-auto-refresh-toggle-disabled-label', ENABLE_AUTO_REFRESH_TOOLTIP: 'enable-auto-refresh-auto-refresh-toggle-disabled-tooltip', ENABLE_AUTO_REFRESH_TOGGLE: 'enable-auto-refresh-auto-refresh-toggle-el-switch-core', }; From 8cd79ad5a751256590063b885a528b1615c8b6a8 Mon Sep 17 00:00:00 2001 From: Umut Can Top Date: Fri, 18 Oct 2024 15:39:28 +0300 Subject: [PATCH 066/381] hooks readme file --- plugins/hooks/README.md | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 plugins/hooks/README.md diff --git a/plugins/hooks/README.md b/plugins/hooks/README.md new file mode 100644 index 00000000000..aba2d333b1a --- /dev/null +++ b/plugins/hooks/README.md @@ -0,0 +1,64 @@ +# Countly Hooks Plugin + +The Hooks plugin provides powerful automation for integrating Countly data with external systems. This plugin can trigger external HTTP endpoints based on internal events and incoming data, and send automated email notifications for events like user profile updates or users entering a cohort. Hooks offers a new way to feed external systems with Countly data, enabling real-time interactions and automating workflows. + +## File Structure + +```javascript +hooks/ # Main hooks plugin directory +├── api/ # Backend API logic +│ ├── jobs/ # Job scheduling logic +│ │ └── schedule.js # Handles scheduling tasks +│ └── parts/ # Logic for effects and triggers +│ ├── effects/ # Different types of effects used in hooks +│ │ ├── custom_code.js # Handles custom code execution +│ │ ├── email.js # Manages email-related hooks +│ │ ├── http.js # HTTP requests for hooks +│ │ └── index.js # Effect index for organization +│ └── triggers/ # Triggers for executing hooks +│ ├── api_endpoint.js # API endpoint trigger +│ ├── incoming_data.js # Triggers for incoming data +│ ├── internal_event.js # Internal event trigger +│ ├── scheduled.js # Trigger for scheduled tasks +│ └── index.js # Trigger index file +├── api.js # Main API logic for backend requests +├── testData.js # Sample test data for hooks +├── utils.js # Utility functions for hooks +├── frontend/ # Frontend resources +│ ├── public/ # Publicly accessible files +│ │ ├── javascripts/ # JavaScript for frontend logic +│ │ │ ├── countly.hooks.effects.js # Effect logic for frontend hooks +│ │ │ ├── countly.models.js # Model definitions for hooks +│ │ │ └── countly.views.js # View logic for rendering hooks +│ │ ├── localization/ # Localization files for translations +│ │ ├── stylesheets/ # CSS and SCSS for styling hooks UI +│ │ │ ├── vue-main.css # Compiled CSS for UI +│ │ │ └── vue-main.scss # Source SCSS file for styling +│ │ └── templates/ # HTML templates for UI components +│ │ ├── vue-drawer.html # Drawer UI for hooks +│ │ ├── vue-effects.html # Effects UI template +│ │ ├── vue-hooks-detail-error-table.html # Template for error table +│ │ ├── vue-hooks-detail.html # Detail view of individual hooks +│ │ ├── vue-main.html # Main template for hooks +│ │ └── vue-table.html # Table template for hooks display +│ └── app.js # Main frontend application logic +├── install.js # Installation script for the plugin +├── package-lock.json # Lock file for Node.js dependencies +├── package.json # Package configuration for Node.js +├── tests.js # Test scripts for validating hooks functionality +└── uninstall.js # Uninstallation script for removing the plugin +``` + +## Installation + +1. Navigate to the directory where the Hooks plugin is located. This could be a relative or absolute path depending on your environment setup: + + ```bash + cd /path/to/your/project/hooks + ``` + +2. Install dependencies: + + ```bash + npm install + ``` From db28d38d1f8c5b16bd9e9cf4f6a3837cc231f844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Fri, 18 Oct 2024 15:46:07 +0300 Subject: [PATCH 067/381] Added system log key for creating event from journey engine --- .../frontend/public/localization/systemlogs.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/systemlogs/frontend/public/localization/systemlogs.properties b/plugins/systemlogs/frontend/public/localization/systemlogs.properties index e7ddd7872fd..9a86cd6c9d7 100644 --- a/plugins/systemlogs/frontend/public/localization/systemlogs.properties +++ b/plugins/systemlogs/frontend/public/localization/systemlogs.properties @@ -76,4 +76,5 @@ systemlogs.action.cb-content_asset-uploaded = Content Builder Asset Uploaded systemlogs.action.cb-content_asset-deleted = Content Builder Asset Deleted systemlogs.action.cb-content_block-edit = Content Builder Block Edited systemlogs.action.cb-content_block-create = Content Builder Block Created -systemlogs.action.cb-content_block-delete = Content Builder Block Deleted \ No newline at end of file +systemlogs.action.cb-content_block-delete = Content Builder Block Deleted +systemlogs.action.journey-engine-event-created = Journey Engine Event Created \ No newline at end of file From 5eb696891a300c0dc3a647ba2eb3ac068c07d7ea Mon Sep 17 00:00:00 2001 From: Cihad Tekin Date: Fri, 18 Oct 2024 16:18:10 +0300 Subject: [PATCH 068/381] [core] cache: updated deprecated api of lru-cache, cleaned up mongodb capped collection and change stream related code --- api/api.js | 4 +- api/parts/data/cache.js | 286 ++++------------------------------------ 2 files changed, 28 insertions(+), 262 deletions(-) diff --git a/api/api.js b/api/api.js index 4a0b51eeffc..af5ea02fded 100755 --- a/api/api.js +++ b/api/api.js @@ -265,7 +265,7 @@ plugins.connectToAllDatabases().then(function() { if (cluster.isMaster) { plugins.installMissingPlugins(common.db); common.runners = require('./parts/jobs/runner'); - common.cache = new CacheMaster(common.db); + common.cache = new CacheMaster(); common.cache.start().then(() => { setImmediate(() => { plugins.dispatch('/cache/init', {}); @@ -333,7 +333,7 @@ plugins.connectToAllDatabases().then(function() { console.log("Starting worker", process.pid, "parent:", process.ppid); const taskManager = require('./utils/taskmanager.js'); - common.cache = new CacheWorker(common.db); + common.cache = new CacheWorker(); common.cache.start(); //since process restarted mark running tasks as errored diff --git a/api/parts/data/cache.js b/api/parts/data/cache.js index 181b6f6e121..a2da942aaf1 100644 --- a/api/parts/data/cache.js +++ b/api/parts/data/cache.js @@ -66,7 +66,7 @@ class DataStore { * @return {int} current store size */ get length() { - return this.lru.length; + return this.lru.size; } /** @@ -97,10 +97,10 @@ class DataStore { return data; } else if (!id) { - this.lru.reset(); + this.lru.clear(); } else if (this.read(id) !== null) { - this.lru.del(id.toString()); + this.lru.delete(id.toString()); } } @@ -155,11 +155,9 @@ class CacheWorker { /** * Constructor * - * @param {Mongo} db database instance * @param {Number} size max number of cache groups */ - constructor(db, size = 100) { - this.db = db; + constructor(size = 100) { this.data = new DataStore(size); this.started = false; @@ -317,7 +315,7 @@ class CacheWorker { } /** - * Remove a record from cache and database. + * Remove a record from cache. * * @param {String} group group key * @param {String} id data key @@ -441,7 +439,7 @@ class CacheWorker { /** * Just a handy method which returns an object with partials with given group. - * + * * @param {String} group group name * @return {Object} object with all the {@code CacheWorker} methods without group */ @@ -469,54 +467,18 @@ class CacheWorker { /** * Cache instance for master process: - * - (1) listen for requests from workers; - * - (2) listen for updates from capped collection; - * - send (1) to (2) and vice versa; - * - call group operators to read / write / udpate data from db / whatever. + * - listen for requests from workers; + * - call group operators to read/write/udpate */ class CacheMaster { /** * Constructor * - * @param {Mongo} db database instance * @param {Number} size max number of cache groups */ - constructor(db, size = 100) { + constructor(size = 100) { this.data = new DataStore(size, Number.MAX_SAFE_INTEGER); this.operators = {}; - this.col = new StreamedCollection(db, CENTRAL, doc => { - log.d('collection doc %j', doc); - if (doc.o === OP.READ) { - return; - } - - let store = this.data.read(doc.g); - if (!store) { - log.w(`No store for group ${doc.g}`); - return; - } - if (doc.o === OP.PURGE && !doc.k) { // purgeAll - store.iterate(id => store.write(id, null)); - } - if (doc.o === OP.PURGE || doc.o === OP.REMOVE) { - store.write(doc.k, null); - } - else if (doc.o === OP.WRITE) { - store.write(doc.k, doc.d); - } - else if (doc.o === OP.READ) { - log.w('Reading from collection instruction shouldn\'t happen'); - store.write(doc.k, doc.d); - } - else if (doc.o === OP.UPDATE) { - store.update(doc.k, doc.d); - } - else { - throw new Error('Bad op ' + doc.o + ': ' + JSON.stringify(doc)); - } - this.ipc.send(0, doc); - }); - this.initialized = {}; this.delayed_messages = []; this.ipc = new CentralMaster(CENTRAL, ({o, g, k, d}, reply, from) => { @@ -584,24 +546,19 @@ class CacheMaster { } /** - * Attach to IPC & tailable cursor. + * Attach to IPC * - * @return {Promise} with cursor open result + * @return {Promise} void */ async start() { - log.d('starting master'); this.ipc.attach(); - await this.col.start().then(() => new Promise(res => setTimeout(() => { - log.d('started master'); - res(); - }, 100))); + log.d('started master'); } /** - * Stop cursor. + * Detaches IPC instance */ stop() { - this.col.stop(); this.ipc.detach(); } @@ -652,8 +609,8 @@ class CacheMaster { } /** - * Write data to the cache & db - * + * Write data to the cache + * * @param {String} group group key * @param {String} id data key * @param {Object} data data to store @@ -679,10 +636,8 @@ class CacheMaster { rc = rc.json; } this.data.read(group)[data === null ? 'remove' : 'write'](id, rc); - return this.col.put(OP.WRITE, group, id, rc).then(() => { - this.ipc.send(-from, {o: OP.WRITE, g: group, k: id, d: rc}); - return data === null ? true : rc; - }); + this.ipc.send(-from, {o: OP.WRITE, g: group, k: id, d: rc}); + return data === null ? true : rc; } else { return null; @@ -696,7 +651,7 @@ class CacheMaster { /** * Update data in the cache - * + * * @param {String} group group key * @param {String} id data key * @param {Object} update data to store @@ -715,10 +670,8 @@ class CacheMaster { if (group in this.operators) { return this.operators[group].update(id, update).then(() => { this.data.read(group).update(id, update); - return this.col.put(OP.UPDATE, group, id, update).then(() => { - this.ipc.send(-from, {o: OP.UPDATE, g: group, k: id, d: update}); - return update; - }); + this.ipc.send(-from, {o: OP.UPDATE, g: group, k: id, d: update}); + return update; }); } else { @@ -727,7 +680,7 @@ class CacheMaster { } /** - * Remove a record from cache and database. + * Remove a record from cache. * * @param {String} group group key * @param {String} id data key @@ -747,10 +700,8 @@ class CacheMaster { return this.operators[group].remove(id).then(rc => { if (rc) { this.data.read(group).remove(id); - return this.col.put(OP.WRITE, group, id, null).then(() => { - this.ipc.send(-from, {o: OP.WRITE, g: group, k: id, d: null}); - return true; - }); + this.ipc.send(-from, {o: OP.WRITE, g: group, k: id, d: null}); + return true; } else { return null; @@ -781,9 +732,7 @@ class CacheMaster { this.data.read(group).write(id, null); this.ipc.send(-from, {o: OP.PURGE, g: group, k: id}); - return this.col.put(OP.PURGE, group, id).then(() => { - return true; - }); + return true; } /** @@ -802,9 +751,7 @@ class CacheMaster { let grp = this.data.read(group); grp.iterate(k => grp.write(k, null)); this.ipc.send(-from, {o: OP.PURGE, g: group}); - return this.col.put(OP.PURGE, group).then(() => { - return true; - }); + return true; } /** @@ -869,7 +816,7 @@ class CacheMaster { /** * Just a handy method which returns an object with partials with given group. - * + * * @param {String} group group name * @return {Object} object with all the {@code CacheWorker} methods without group */ @@ -896,187 +843,6 @@ class CacheMaster { } - -/** - * Ensure capped collection exists and return latest document in it to start streaming from. - * - * @param {Mongo} db db object - * @param {String} name collection name - * @param {Number} size collection size - * @return {Promise} resolves to array of [collection, _id of last record] - */ -function createCollection(db, name, size = 1e7) { - return new Promise((resolve, reject) => { - db.createCollection(name, {capped: true, size: size}, (e) => { - if (e && e.codeName !== "NamespaceExists") { - log.e(`Error while creating capped collection ${name}:`, e); - return reject(e); - } - - let col = db.collection(name); - - col.find().sort({_id: -1}).limit(1).toArray((err, arr) => { - if (err) { - log.e(`Error while looking for last record in ${name}:`, err); - return reject(err); - } - if (arr && arr.length) { - log.d('Last change id %s', arr[0]._id); - resolve([col, arr[0]._id]); - } - else { - col.insertOne({first: true}, (error, res) => { - if (error) { - log.e(`Error while looking for last record in ${name}:`, error); - return reject(e); - } - log.d('Inserted first change id %s', res.insertedId); - resolve([col, res.insertedId]); - }); - } - }); - }); - }); -} - -/** - * Class encapsulating a capped collection watching a particular cache modifications. - */ -class StreamedCollection { - /** - * Constructor - * @param {Mongo} db db object - * @param {String} name collection name - * @param {Function} handler a function handling IPC requests - */ - constructor(db, name, handler) { - this.db = db; - this.name = name; - this.handler = handler; - this.inserts = []; - } - - /** - * Start change stream - */ - async start() { - if (this.stream) { - log.w('Stream already started'); - return; - } - - log.i('Starting watcher stream in %d', process.pid); - - try { - let [col, last] = await createCollection(this.db, this.name, 1e7); - - this.col = col; - this.stream = col.find({_id: {$gt: last}}, {tailable: true, awaitData: true, numberOfRetries: -1}).stream(); - - this.stream.on('data', doc => { - if (this.inserts.indexOf(doc._id.toString()) !== -1) { - return this.inserts.splice(this.inserts.indexOf(doc._id.toString()), 1); - } - log.d('new in the collection', doc); - if (doc.d !== undefined && doc.d !== null) { - try { - doc.d = JSON.parse(doc.d); - this.handler(doc); - } - catch (e) { - log.e(e); - } - } - else { - this.handler(doc); - } - }); - - this.stream.on('end', () => { - log.w('Stream ended'); - this.close(); - }); - - this.stream.on('close', () => { - log.d('Stream closed'); - this.stream = undefined; - setImmediate(() => { - if (!this.stopped) { - this.start().catch(e => { - log.e('Cannot start watcher', e); - }); - } - }); - }); - - this.stream.on('error', error => { - log.e('Stream error', error); - this.close(); - }); - - } - catch (e) { - setTimeout(() => { - try { - if (!this.stopped) { - this.start(); - } - } - catch (ignored) { - // ignored - } - }, 1000); - } - } - - /** - * Close change stream - */ - stop() { - this.stopped = true; - this.close(); - } - - /** - * Close change stream - */ - close() { - if (this.stream) { - this.stream.destroy(); - this.stream = undefined; - log.d('Stream closedd'); - } - } - - /** - * Add a record to the collection - * @param {int} o operation type (see OP above) - * @param {String} g group name - * @param {String} k key - document key - * @param {Object} d data - * @return {Promise} resolves to the inserted change document - */ - put(o, g, k, d) { - let doc = { - _id: new this.db.ObjectID(), - o: o, - g: g, - k: k, - d: d ? JSON.stringify(d) : d - }; - log.d('putting to the collection', d); - this.inserts.push(doc._id.toString()); - return new Promise((res, rej) => this.col.insertOne(doc, err => { - if (err) { - this.inserts.splice(this.inserts.indexOf(doc._id.toString()), 1); - rej(err); - } - else { - res(doc); - } - })); - } -} /** * Data class for tests */ From 3a8c08df69a8356c5568e751a25a8ae8f175a66c Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 12:42:53 +0000 Subject: [PATCH 069/381] Added verify sdk stats full data page case --- .../frontend/public/templates/sdk_table.html | 34 +- .../sdk/frontend/public/templates/stats.html | 4 +- .../public/templates/version_table.html | 38 +- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../cypress/lib/dashboard/manage/sdk/stats.js | 357 ++++++++++++++++-- .../elements/dashboard/manage/sdk/stats.js | 141 +++++-- 6 files changed, 510 insertions(+), 68 deletions(-) diff --git a/plugins/sdk/frontend/public/templates/sdk_table.html b/plugins/sdk/frontend/public/templates/sdk_table.html index ed44474986f..527d670a1a9 100644 --- a/plugins/sdk/frontend/public/templates/sdk_table.html +++ b/plugins/sdk/frontend/public/templates/sdk_table.html @@ -1,10 +1,34 @@ - + \ No newline at end of file diff --git a/plugins/sdk/frontend/public/templates/stats.html b/plugins/sdk/frontend/public/templates/stats.html index d0ad678c9f1..8f22bfb27b6 100644 --- a/plugins/sdk/frontend/public/templates/stats.html +++ b/plugins/sdk/frontend/public/templates/stats.html @@ -26,6 +26,7 @@

Stats for

SDK Version D SDK Version D v-for="(item, idx) in sdkVersions">
-
{{i18n('common.table.no-data')}}
+
{{i18n('common.table.no-data')}}
diff --git a/plugins/sdk/frontend/public/templates/version_table.html b/plugins/sdk/frontend/public/templates/version_table.html index 1fa660682d1..f8b8e94288c 100644 --- a/plugins/sdk/frontend/public/templates/version_table.html +++ b/plugins/sdk/frontend/public/templates/version_table.html @@ -1,15 +1,39 @@ - + - + \ No newline at end of file diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 49f73d77289..eb791a1bca0 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -389,9 +389,9 @@ describe('Complete Onboarding', () => { dataPopulatorPageHelpers.verifyPageElementsOfTemplatesPage(); navigationHelpers.goToIncomingDataLogsPage(); //incomingDataLogsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data + navigationHelpers.goToSdkManagerPage(); + sdkManagersPageHelpers.verifyFullDataPageElements(); //TODO: Add the cases of the following pages - //navigationHelpers.goToSdkManagerPage(); - //sdkManagersPageHelpers.verifyFullDataPageElements(); //sdkManagersPageHelpers.clickRequestStatsTab(); //requestStatsPageHelpers.verifyFullDataPageElements(); //requestStatsPageHelpers.clickHealthCheckTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js b/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js index c05523ffe9d..f60c0ec7783 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js @@ -1,4 +1,10 @@ -import sdkStatsPageElements from "../../../../support/elements/dashboard/manage/sdk/stats"; +import { + sdkStatsPageElements, + sdkStatsMetricCardElements, + sdkStatsEChartElements, + sdkStatsSdksDataTableElements, + sdkStatsSdkVersionsDataTableElements +} from "../../../../support/elements/dashboard/manage/sdk/stats"; const verifyStaticElementsOfPage = () => { cy.verifyElement({ @@ -57,87 +63,371 @@ const verifyStaticElementsOfPage = () => { element: sdkStatsPageElements.SDK_VERSION_ADOPTION_FOR_ADOPTION_FOR_AS_TYPE_SELECT, elementText: "percentage", }); -}; -const verifyEmptyPageElements = () => { + clickSDKsTab(); - verifyStaticElementsOfPage(); + cy.verifyElement({ + element: sdkStatsSdksDataTableElements().EXPORT_AS_BUTTON, + }); cy.verifyElement({ - labelElement: sdkStatsPageElements.STATS_FOR_TABLE_NO_DATA_LABEL, - labelText: "No data", + element: sdkStatsSdksDataTableElements().TABLE_SEARCH_INPUT, }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_VERSION_DISTRIBUTION_TABLE_NO_DATA_LABEL, - labelText: "No data", + labelElement: sdkStatsSdksDataTableElements().COLUMN_NAME_SDK_LABEL, + labelText: "SDK", }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_ICON, + element: sdkStatsSdksDataTableElements().COLUMN_NAME_SDK_SORTABLE_ICON, }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_TITLE, - labelText: "...hmm, seems empty here", + labelElement: sdkStatsSdksDataTableElements().COLUMN_NAME_TOTAL_SESSIONS_LABEL, + labelText: "Total Sessions", }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_SUBTITLE, - labelText: "No data found", + element: sdkStatsSdksDataTableElements().COLUMN_NAME_TOTAL_SESSIONS_SORTABLE_ICON, }); - clickSDKsTab(); + cy.verifyElement({ + labelElement: sdkStatsSdksDataTableElements().COLUMN_NAME_TOTAL_USERS_LABEL, + labelText: "Total Users", + }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_TABLE_EXPORT_BUTTON, + element: sdkStatsSdksDataTableElements().COLUMN_NAME_TOTAL_USERS_SORTABLE_ICON, }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_TABLE_SEARCH_INPUT, + labelElement: sdkStatsSdksDataTableElements().COLUMN_NAME_NEW_USERS_LABEL, + labelText: "New Users", }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_EMPTY_TABLE_ICON, + element: sdkStatsSdksDataTableElements().COLUMN_NAME_NEW_USERS_SORTABLE_ICON, }); + clickSdkVersionsTab(); + cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + element: sdkStatsSdkVersionsDataTableElements().VERSION_SELECT, + elementPlaceHolder: "Select", }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + element: sdkStatsSdkVersionsDataTableElements().EXPORT_AS_BUTTON, }); + cy.verifyElement({ + element: sdkStatsSdkVersionsDataTableElements().TABLE_SEARCH_INPUT, + }); - clickSdkVersionsTab(); + cy.verifyElement({ + labelElement: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_PLATFORM_VERSION_LABEL, + labelText: "Platform Version", + }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_VERSIONS_TABLE_SELECT, + element: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_PLATFORM_VERSION_SORTABLE_ICON, }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_VERSIONS_TABLE_EXPORT_BUTTON, + labelElement: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_TOTAL_SESSIONS_LABEL, + labelText: "Total Sessions", }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_VERSIONS_TABLE_SEARCH_INPUT, + element: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_TOTAL_SESSIONS_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_TOTAL_USERS_LABEL, + labelText: "Total Users", + }); + + cy.verifyElement({ + element: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_TOTAL_USERS_SORTABLE_ICON, + }); + + cy.verifyElement({ + labelElement: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_NEW_USERS_LABEL, + labelText: "New Users", + }); + + cy.verifyElement({ + element: sdkStatsSdkVersionsDataTableElements().COLUMN_NAME_NEW_USERS_SORTABLE_ICON, + }); +}; + +const verifyEmptyPageElements = () => { + + verifyStaticElementsOfPage(); + + cy.scrollPageToTop(); + + verifySdkStatsMetricCard({ + isEmpty: true + }); + + verifySdkStatsEChart({ + isEmpty: true + }); + + verifySDKsDataFromTable({ + isEmpty: true + }); + + verifySDKVersionsDataFromTable({ + isEmpty: true + }); +}; + +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(); + + cy.scrollPageToTop(); + + verifySdkStatsMetricCard({ + isEmpty: false, + }); + + verifySdkStatsEChart({ + isEmpty: false + }); + + verifySDKsDataFromTable({ + isEmpty: false + }); + + verifySDKVersionsDataFromTable({ + isEmpty: false + }); +}; + +const verifySdkStatsMetricCard = ({ + index = 0, + isEmpty = false, + sdkName = null, + sdkNumber = null, + sdkPercentage = null, + versionName = null, + versionNumber = null, + versionPercentage = null, +}) => { + + if (isEmpty) { + cy.verifyElement({ + labelElement: sdkStatsMetricCardElements(index).STATS_FOR_TABLE_NO_DATA_LABEL, + labelText: "No data", + }); + + cy.verifyElement({ + labelElement: sdkStatsMetricCardElements(index).SDK_VERSION_DISTRIBUTION_TABLE_NO_DATA_LABEL, + labelText: "No data", + }); + return; + } + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(index).SDK_NAME, + elementText: sdkName, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(index).SDK_NUMBER, + elementText: sdkNumber, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(index).SDK_PERCENTAGE, + elementText: sdkPercentage, + }); + + cy.verifyElement({ + element: sdkStatsMetricCardElements(index).SDK_PROGRESS_CIRCLE, + }); + + for (var i = 0; i < 2; i++) { + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(i).VERSION_NAME, + elementText: versionName, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(i).VERSION_NUMBER, + elementText: versionNumber, + }); + + cy.verifyElement({ + element: sdkStatsMetricCardElements(i).VERSION_DIVIDER, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsMetricCardElements(i).VERSION_PERCENTAGE, + elementText: versionPercentage, + }); + + cy.verifyElement({ + isElementVisible: false, + element: sdkStatsMetricCardElements(i).VERSION_PROGRESS_BAR, + }); + } +}; + +const verifySdkStatsEChart = ({ + isEmpty = false +}) => { + + cy.scrollPageToBottom(); + + if (isEmpty) { + cy.verifyElement({ + element: sdkStatsEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: sdkStatsEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: sdkStatsEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + } + else { + cy.verifyElement({ + element: sdkStatsEChartElements.CHART_SDK_VERSION, + }); + + cy.verifyElement({ + element: sdkStatsEChartElements.VERSION_ICONS, + }); + + cy.verifyElement({ + element: sdkStatsEChartElements.VERSION_NUMBERS, + }); + + cy.verifyElement({ + element: sdkStatsEChartElements.CHART_MORE_BUTTON, + }); + } +}; + +const verifySDKsDataFromTable = ({ + index = 0, + isEmpty = false, + sdkName = null, + totalSessions = null, + totalUsers = null, + newUsers = null, +}) => { + + clickSDKsTab(); + + if (isEmpty) { + + cy.verifyElement({ + element: sdkStatsSdksDataTableElements().EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: sdkStatsSdksDataTableElements().EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: sdkStatsSdksDataTableElements().EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + return; + } + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsSdksDataTableElements(index).SDK, + elementText: sdkName + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsSdksDataTableElements(index).TOTAL_SESSIONS, + elementText: totalSessions + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsSdksDataTableElements(index).TOTAL_USERS, + elementText: totalUsers + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsSdksDataTableElements(index).NEW_USERS, + elementText: newUsers + }); +}; + +const verifySDKVersionsDataFromTable = ({ + index = 0, + isEmpty = false, + platformVersion = null, + totalSessions = null, + totalUsers = null, + newUsers = null, +}) => { + + clickSdkVersionsTab(); + + if (isEmpty) { + + cy.verifyElement({ + element: sdkStatsSdkVersionsDataTableElements().EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: sdkStatsSdkVersionsDataTableElements().EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: sdkStatsSdkVersionsDataTableElements().EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + return; + } + + cy.verifyElement({ + shouldNot: !isEmpty, + element: sdkStatsSdkVersionsDataTableElements(index).PLATFORM_VERSION, + elementText: platformVersion }); cy.verifyElement({ - element: sdkStatsPageElements.SDK_VERSION_EMPTY_TABLE_ICON, + shouldNot: !isEmpty, + element: sdkStatsSdkVersionsDataTableElements(index).TOTAL_SESSIONS, + elementText: totalSessions }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_VERSION_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + shouldNot: !isEmpty, + element: sdkStatsSdkVersionsDataTableElements(index).TOTAL_USERS, + elementText: totalUsers }); cy.verifyElement({ - labelElement: sdkStatsPageElements.SDK_VERSION_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + shouldNot: !isEmpty, + element: sdkStatsSdkVersionsDataTableElements(index).NEW_USERS, + elementText: newUsers }); }; @@ -171,8 +461,13 @@ const clickSdkConfigurationTab = () => { module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, clickSdkStatsTab, clickRequestStatsTab, clickHealthCheckTab, - clickSdkConfigurationTab + clickSdkConfigurationTab, + verifySdkStatsMetricCard, + verifySdkStatsEChart, + verifySDKsDataFromTable, + verifySDKVersionsDataFromTable }; \ No newline at end of file diff --git a/ui-tests/cypress/support/elements/dashboard/manage/sdk/stats.js b/ui-tests/cypress/support/elements/dashboard/manage/sdk/stats.js index d26fadeecf4..86659da0c84 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/sdk/stats.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/sdk/stats.js @@ -1,38 +1,135 @@ -export default { +export const sdkStatsPageElements = { PAGE_TITLE: 'header-title', FILTER_DATE_PICKER: 'cly-datepicker-test-id-pseudo-input-label', STATS_FOR_LABEL: 'sdk-stats-for-label', STATS_FOR_SELECT: 'sdk-stats-for-combobox-select-input-pseudo-input-label', - STATS_FOR_TABLE_NO_DATA_LABEL: 'sdk-stats-for-table-no-data-label', SDK_VERSION_DISTRIBUTION_LABEL: 'sdk-version-distribution-label', - SDK_VERSION_DISTRIBUTION_TABLE_NO_DATA_LABEL: 'sdk-version-distribution-table-no-data-label', SDK_VERSION_ADOPTION_FOR_LABEL: 'stats-sdk-version-adoption-for-label', SDK_VERSION_ADOPTION_FOR_ADOPTION_FOR_SELECT: 'stats-sdk-version-adoption-for-select-input', SDK_VERSION_ADOPTION_FOR_ADOPTION_FOR_AS_LABEL: 'stats-sdk-version-adoption-for-as-label', SDK_VERSION_ADOPTION_FOR_ADOPTION_FOR_AS_TYPE_SELECT: 'stats-sdk-version-adoption-for-as-combobox-select-input-pseudo-input-label', - SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_ICON: 'sdk-version-table-empty-logo', - SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_TITLE: 'sdk-version-table-empty-title', - SDK_VERSION_ADOPTION_FOR_EMPTY_CHART_SUBTITLE: 'sdk-version-table-empty-subtitle', - - TAB_SDK_S: 'tab-sdks-title', - SDK_TABLE_EXPORT_BUTTON: 'table-sdks-export-as-button', - SDK_TABLE_SEARCH_INPUT: 'table-sdks-datatable-search-input', - SDK_EMPTY_TABLE_ICON: 'table-sdks-empty-logo', - SDK_EMPTY_TABLE_TITLE: 'table-sdks-empty-title', - SDK_EMPTY_TABLE_SUBTITLE: 'table-sdks-empty-subtitle', - - TAB_SDK_VERSIONS: 'tab-sdk-versions-title', - SDK_VERSIONS_TABLE_SELECT: 'select-test-id-select-input', - SDK_VERSIONS_TABLE_EXPORT_BUTTON: 'cly-datatable-n-test-id-export-as-button', - SDK_VERSIONS_TABLE_SEARCH_INPUT: 'cly-datatable-n-test-id-datatable-search-input', - SDK_VERSION_EMPTY_TABLE_ICON: 'cly-datatable-n-test-id-empty-logo', - SDK_VERSION_EMPTY_TABLE_TITLE: 'cly-datatable-n-test-id-empty-title', - SDK_VERSION_EMPTY_TABLE_SUBTITLE: 'cly-datatable-n-test-id-empty-subtitle', TAB_SDK_STATS: 'tab-sdk-stats-title', TAB_REQUEST_STATS: 'tab-request-stats-title', TAB_HEALTH_CHECK: 'tab-health-check-title', - TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title' + TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title', + + TAB_SDK_S: 'tab-sdks-title', + TAB_SDK_VERSIONS: 'tab-sdk-versions-title', +}; + +const sdkStatsMetricCardElements = (index = 0) => ({ + STATS_FOR_TABLE_NO_DATA_LABEL: 'sdk-stats-for-table-no-data-label', + + SDK_NAME: 'metric-card-sdk-stats-' + index + '-column-label', + SDK_VALUE: 'metric-card-sdk-stats-' + index + '-column-number', + SDK_PERCENTAGE: 'metric-card-sdk-stats-' + index + '-description', + SDK_PROGRESS_CIRCLE: 'el-progress-metric-card-sdk-stats-' + index + '-column', + + SDK_VERSION_DISTRIBUTION_TABLE_NO_DATA_LABEL: 'sdk-version-distribution-table-no-data-label', + + VERSION_NAME: 'metric-card-column-sdk-version-distribution-' + index + '-name', + VERSION_VALUE: 'metric-card-column-sdk-version-distribution-' + index + '-value', + VERSION_DIVIDER: 'metric-card-column-sdk-version-distribution-' + index + '-divider', + VERSION_PERCENTAGE: 'metric-card-column-sdk-version-distribution-' + index + '-percent', + VERSION_PROGRESS_BAR: 'metric-card-column-sdk-version-distribution-' + index + '-progress-bar', +}); + +export const sdkStatsEChartElements = { + EMPTY_TABLE_ICON: 'sdk-version-table-empty-logo', + EMPTY_TABLE_TITLE: 'sdk-version-table-empty-title', + EMPTY_TABLE_SUBTITLE: 'sdk-version-table-empty-subtitle', + + CHART_SDK_VERSION: 'sdk-version-table-chart', + CHART_MORE_BUTTON: 'sdk-version-table-cly-chart-more-dropdown-more-option-button', + CHART_MORE_DOWNLOAD_ITEM: 'sdk-version-table-cly-chart-more-dropdown-download-option-button', + CHART_MORE_ZOOM_ITEM: 'sdk-version-table-cly-chart-more-dropdown-zoom-option-button', + + VERSION_ICONS: '.cly-vue-chart-legend__s-rectangle', + VERSION_NUMBERS: '.cly-vue-chart-legend__s-title', +}; + +const sdkStatsSdksDataTableElements = (index = 0) => ({ + EMPTY_TABLE_ICON: 'datatable-sdks-empty-logo', + EMPTY_TABLE_TITLE: 'datatable-sdks-empty-title', + EMPTY_TABLE_SUBTITLE: 'datatable-sdks-empty-subtitle', + + EXPORT_AS_BUTTON: 'datatable-sdks-export-as-button', + TABLE_SEARCH_INPUT: 'datatable-sdks-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + COLUMN_NAME_SDK_LABEL: 'datatable-sdks-label-sdk', + COLUMN_NAME_SDK_SORTABLE_ICON: 'datatable-sdks-sortable-icon-sdk', + COLUMN_NAME_TOTAL_SESSIONS_LABEL: 'datatable-sdks-label-total-sessions', + COLUMN_NAME_TOTAL_SESSIONS_SORTABLE_ICON: 'datatable-sdks-sortable-icon-total-sessions', + COLUMN_NAME_TOTAL_USERS_LABEL: 'datatable-sdks-label-total-users', + COLUMN_NAME_TOTAL_USERS_SORTABLE_ICON: 'datatable-sdks-sortable-icon-total-users', + COLUMN_NAME_NEW_USERS_LABEL: 'datatable-sdks-label-new-users', + COLUMN_NAME_NEW_USERS_SORTABLE_ICON: 'datatable-sdks-sortable-icon-new-users', + + //Columns' Rows' Datas Elements + SDK: 'datatable-sdks-sdk-' + index, + TOTAL_SESSIONS: 'datatable-sdks-total-sessions-' + index, + TOTAL_USERS: 'datatable-sdks-total-users-' + index, + NEW_USERS: 'datatable-sdks-new-users-' + index, + + //PAGINATION ELEMENTS + ITEMS_PER_PAGE_LABEL: 'datatable-sdks-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'datatable-sdks-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'datatable-sdks-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'datatable-sdks-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'datatable-sdks-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'datatable-sdks-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'datatable-sdks-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'datatable-sdks-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'datatable-sdks-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'datatable-sdks-views-last-page-arrow-button' +}); + +const sdkStatsSdkVersionsDataTableElements = (index = 0) => ({ + EMPTY_TABLE_ICON: 'datatable-sdk-versions-empty-logo', + EMPTY_TABLE_TITLE: 'datatable-sdk-versions-empty-title', + EMPTY_TABLE_SUBTITLE: 'datatable-sdk-versions-empty-subtitle', + + VERSION_SELECT: 'sdk-version-select-input', + EXPORT_AS_BUTTON: 'datatable-sdk-versions-export-as-button', + TABLE_SEARCH_INPUT: 'datatable-sdk-versions-datatable-search-input', + TABLE_ROWS: '.el-table__row', + + COLUMN_NAME_PLATFORM_VERSION_LABEL: 'datatable-sdk-versions-label-platform-version', + COLUMN_NAME_PLATFORM_VERSION_SORTABLE_ICON: 'datatable-sdk-versions-sortable-icon-platform-version', + COLUMN_NAME_TOTAL_SESSIONS_LABEL: 'datatable-sdk-versions-label-total-sessions', + COLUMN_NAME_TOTAL_SESSIONS_SORTABLE_ICON: 'datatable-sdk-versions-sortable-icon-total-sessions', + COLUMN_NAME_TOTAL_USERS_LABEL: 'datatable-sdk-versions-label-total-users', + COLUMN_NAME_TOTAL_USERS_SORTABLE_ICON: 'datatable-sdk-versions-sortable-icon-total-users', + COLUMN_NAME_NEW_USERS_LABEL: 'datatable-sdk-versions-label-new-users', + COLUMN_NAME_NEW_USERS_SORTABLE_ICON: 'datatable-sdk-versions-sortable-icon-new-users', + + //Columns' Rows' Datas Elements + PLATFORM_VERSION: 'datatable-sdks-sdk-versions-platform-version-' + index, + TOTAL_SESSIONS: 'datatable-sdk-versions-total-sessions-' + index, + TOTAL_USERS: 'datatable-sdk-versions-total-users-' + index, + NEW_USERS: 'datatable-sdk-versions-new-users-' + index, + + //PAGINATION ELEMENTS + ITEMS_PER_PAGE_LABEL: 'datatable-sdk-versions-items-per-page-label', + PER_PAGE_COUNT_SELECT: 'datatable-sdk-versions-items-per-page-count-select-input-pseudo-input-label', + PER_PAGE_COUNT_SELECT_ICON: 'datatable-sdk-versions-items-per-page-count-select-icon', + PER_PAGE_COUNT_LABEL: 'datatable-sdk-versions-items-per-page-count-select', + PAGE_NUMBER_SELECT: 'datatable-sdk-versions-page-number-select-input-pseudo-input-label', + PAGE_NUMBER_SELECT_ICON: 'datatable-sdk-versions-page-number-select-icon', + FIRST_PAGE_ARROW_BUTTON: 'datatable-sdk-versions-first-page-arrow-button', + PREVIOUS_PAGE_ARROW_BUTTON: 'datatable-sdk-versions-previous-page-arrow-button', + NEXT_PAGE_ARROW_BUTTON: 'datatable-sdk-versions-next-page-arrow-button', + LAST_PAGE_ARROW_BUTTON: 'datatable-sdk-versions-views-last-page-arrow-button' +}); + +module.exports = { + sdkStatsPageElements, + sdkStatsMetricCardElements, + sdkStatsEChartElements, + sdkStatsSdksDataTableElements, + sdkStatsSdkVersionsDataTableElements }; \ No newline at end of file From 85bf387a81fa7005c30eb2148cf642198e470bbd Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Mon, 21 Oct 2024 15:43:39 +0300 Subject: [PATCH 070/381] resolve conv --- api/parts/data/fetch.js | 7 +------ .../core/events/javascripts/countly.details.models.js | 6 +++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/api/parts/data/fetch.js b/api/parts/data/fetch.js index 5c1c00c3816..ec1bb3614ad 100644 --- a/api/parts/data/fetch.js +++ b/api/parts/data/fetch.js @@ -1326,12 +1326,7 @@ fetch.fetchTimeObj = function(collection, params, isCustomEvent, options) { if (params?.qstring?.event) { output.eventName = params.qstring.event; } - if (params) { - common.returnOutput(params, output); - } - else { - console.error("Params is null or undefined."); - } + common.returnOutput(params ?? {}, output); }); }; diff --git a/frontend/express/public/core/events/javascripts/countly.details.models.js b/frontend/express/public/core/events/javascripts/countly.details.models.js index 379ab278a2c..9d3d84034f2 100644 --- a/frontend/express/public/core/events/javascripts/countly.details.models.js +++ b/frontend/express/public/core/events/javascripts/countly.details.models.js @@ -1075,9 +1075,9 @@ countlyAllEvents.service.fetchSelectedEventsOverview(context, period) .then(function(resp) { - if (resp) { - context?.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); - context?.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); + if (resp && context) { + context.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); + context.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); } }); } From c3e2f9e8650ff198f1a1fd68dfa441f587636883 Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Mon, 21 Oct 2024 15:54:22 +0300 Subject: [PATCH 071/381] fix --- api/parts/data/fetch.js | 4 ++-- .../public/core/events/javascripts/countly.details.models.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/parts/data/fetch.js b/api/parts/data/fetch.js index ec1bb3614ad..210c277571a 100644 --- a/api/parts/data/fetch.js +++ b/api/parts/data/fetch.js @@ -1323,10 +1323,10 @@ fetch.fetchEvents = function(params) { */ fetch.fetchTimeObj = function(collection, params, isCustomEvent, options) { fetchTimeObj(collection, params, isCustomEvent, options, function(output) { - if (params?.qstring?.event) { + if (params.qstring?.event) { output.eventName = params.qstring.event; } - common.returnOutput(params ?? {}, output); + common.returnOutput(params, output); }); }; diff --git a/frontend/express/public/core/events/javascripts/countly.details.models.js b/frontend/express/public/core/events/javascripts/countly.details.models.js index 9d3d84034f2..e5bf4564360 100644 --- a/frontend/express/public/core/events/javascripts/countly.details.models.js +++ b/frontend/express/public/core/events/javascripts/countly.details.models.js @@ -1075,9 +1075,9 @@ countlyAllEvents.service.fetchSelectedEventsOverview(context, period) .then(function(resp) { - if (resp && context) { + if (resp) { context.commit("setSelectedEventsOverview", countlyAllEvents.helpers.getSelectedEventsOverview(context, resp) || {}); - context.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context || {})); + context.commit("setLegendData", countlyAllEvents.helpers.getLegendData(context)); } }); } From 3f811fd46dd3b87d7a01373bdaa530a70bee8b60 Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 17:14:29 +0000 Subject: [PATCH 072/381] Added verify request stats full data page case --- .../public/templates/request_stats.html | 12 +- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../lib/dashboard/manage/sdk/requestStats.js | 432 +++++++++++++++--- .../dashboard/manage/sdk/requestStats.js | 136 +++++- 4 files changed, 483 insertions(+), 101 deletions(-) diff --git a/plugins/sdk/frontend/public/templates/request_stats.html b/plugins/sdk/frontend/public/templates/request_stats.html index 45884c76d23..6459e4bc797 100644 --- a/plugins/sdk/frontend/public/templates/request_stats.html +++ b/plugins/sdk/frontend/public/templates/request_stats.html @@ -22,7 +22,7 @@
- + - +

Received request breakdown by type as

@@ -55,18 +55,18 @@

R

- +

Canceled request breakdown by reason as

- - + +
- +
\ No newline at end of file diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index eb791a1bca0..3911580ffba 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -391,9 +391,9 @@ describe('Complete Onboarding', () => { //incomingDataLogsPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data navigationHelpers.goToSdkManagerPage(); sdkManagersPageHelpers.verifyFullDataPageElements(); + sdkManagersPageHelpers.clickRequestStatsTab(); + requestStatsPageHelpers.verifyFullDataPageElements(); //TODO: Add the cases of the following pages - //sdkManagersPageHelpers.clickRequestStatsTab(); - //requestStatsPageHelpers.verifyFullDataPageElements(); //requestStatsPageHelpers.clickHealthCheckTab(); //healthCheckPageHelpers.verifyFullDataPageElements(); //healthCheckPageHelpers.clickSdkConfigurationTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js index 1ccfaddcd0e..2e20f31c066 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js @@ -1,4 +1,11 @@ -import requestStatsPageElements from "../../../../support/elements/dashboard/manage/sdk/requestStats"; +import { + requestStatsPageElements, + requestStatsMetricCardElements, + requestsEChartElements, + delaysEChartElements, + receivedRequestEChartElements, + canceledRequestEChartElements +} from "../../../../support/elements/dashboard/manage/sdk/requestStats"; const verifyStaticElementsOfPage = () => { cy.verifyElement({ @@ -33,21 +40,21 @@ const verifyStaticElementsOfPage = () => { }); cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_RECEIVED_LABEL, + labelElement: requestStatsMetricCardElements.REQUESTS_RECEIVED_LABEL, labelText: "Requests Received", - element: requestStatsPageElements.REQUESTS_RECEIVED_TREND_ICON, + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_TREND_ICON, }); cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_CANCELED_LABEL, + labelElement: requestStatsMetricCardElements.REQUESTS_CANCELED_LABEL, labelText: "Requests Canceled", - element: requestStatsPageElements.REQUESTS_CANCELED_TREND_ICON, + element: requestStatsMetricCardElements.REQUESTS_CANCELED_TREND_ICON, }); cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_QUEUED_LABEL, + labelElement: requestStatsMetricCardElements.REQUESTS_QUEUED_LABEL, labelText: "Requests Queued", - element: requestStatsPageElements.REQUESTS_QUEUED_TREND_ICON, + element: requestStatsMetricCardElements.REQUESTS_QUEUED_TREND_ICON, }); cy.scrollPageToCenter(); @@ -67,105 +74,387 @@ const verifyStaticElementsOfPage = () => { element: requestStatsPageElements.CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_TYPE_SELECT, elementText: "percentage", }); -}; +} const verifyEmptyPageElements = () => { verifyStaticElementsOfPage(); - cy.scrollPageToTop(); - - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_RECEIVED_NUMBER, - labelText: "0", + verifyRequestStatsMetricCard({ + isEmpty: true }); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_RECEIVED_VALUE, - labelText: "NA", + verifyRequestsEChart({ + isEmpty: true }); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_CANCELED_NUMBER, - labelText: "0", + verifyDelaysEChart({ + isEmpty: true }); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_CANCELED_VALUE, - labelText: "NA", - }); + cy.scrollPageToBottom(); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_QUEUED_NUMBER, - labelText: "0", + verifyReceivedRequestEChart({ + isEmpty: true }); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_QUEUED_VALUE, - labelText: "NA", + verifyCanceledRequestEChart({ + isEmpty: true }); +}; - cy.verifyElement({ - element: requestStatsPageElements.REQUESTS_EMPTY_TABLE_ICON, - }); +const verifyFullDataPageElements = () => { - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + verifyStaticElementsOfPage(); + + verifyRequestStatsMetricCard({ + isEmpty: false, }); - cy.verifyElement({ - labelElement: requestStatsPageElements.REQUESTS_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + verifyRequestsEChart({ + isEmpty: false }); cy.scrollPageToCenter(); - cy.verifyElement({ - element: requestStatsPageElements.DELAYS_EMPTY_TABLE_ICON, + verifyDelaysEChart({ + isEmpty: false }); - cy.verifyElement({ - labelElement: requestStatsPageElements.DELAYS_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", - }); + cy.scrollPageToBottom(); - cy.verifyElement({ - labelElement: requestStatsPageElements.DELAYS_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + verifyReceivedRequestEChart({ + isEmpty: false }); - cy.verifyElement({ - element: requestStatsPageElements.RECEIVED_REQUEST_EMPTY_TABLE_ICON, + verifyCanceledRequestEChart({ + isEmpty: false }); +}; - cy.verifyElement({ - labelElement: requestStatsPageElements.RECEIVED_REQUEST_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", - }); +const verifyRequestStatsMetricCard = ({ + isEmpty = false, + requestsReceivedNumber = null, + requestsReceivedPercentage = null, - cy.verifyElement({ - labelElement: requestStatsPageElements.RECEIVED_REQUEST_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", - }); + requestsCanceledNumber = null, + requestsCanceledPercentage = null, - cy.scrollPageToBottom(); + requestsQueuedNumber = null, + requestsQueuedPercentage = null - cy.verifyElement({ - element: requestStatsPageElements.CANCELED_REQUEST_EMPTY_TABLE_ICON, - }); +}) => { - cy.verifyElement({ - labelElement: requestStatsPageElements.CANCELED_REQUEST_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", - }); + cy.scrollPageToTop(); - cy.verifyElement({ - labelElement: requestStatsPageElements.CANCELED_REQUEST_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", - }); + if (isEmpty) { + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_NUMBER, + elementText: "0", + }); + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_PERCENTAGE, + elementText: "NA", + }); + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_CANCELED_NUMBER, + elementText: "0", + }); + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_CANCELED_PERCENTAGE, + elementText: "NA", + }); + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_QUEUED_NUMBER, + elementText: "0", + }); + + cy.verifyElement({ + element: requestStatsMetricCardElements.REQUESTS_QUEUED_PERCENTAGE, + elementText: "NA", + }); + + } else { + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_NUMBER, + elementText: requestsReceivedNumber, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_PERCENTAGE, + elementText: requestsReceivedPercentage, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_CANCELED_NUMBER, + elementText: requestsCanceledNumber, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_CANCELED_PERCENTAGE, + elementText: requestsCanceledPercentage, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_QUEUED_NUMBER, + elementText: requestsQueuedNumber, + }); + + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_QUEUED_PERCENTAGE, + elementText: requestsQueuedPercentage, + }); + } }; +const verifyRequestsEChart = ({ + isEmpty = false, +}) => { + + cy.scrollPageToTop(); + + if (isEmpty) { + cy.verifyElement({ + element: requestsEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: requestsEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: requestsEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + } else { + + cy.verifyElement({ + element: requestsEChartElements.SELECT_REQUESTS_CHART_TYPE, + elementPlaceHolder: "Select", + value: "Line", + }); + + cy.verifyElement({ + element: requestsEChartElements.CHART_TYPE_ANNOTATION_BUTTON, + }); + + cy.verifyElement({ + element: requestsEChartElements.CHART_MORE_BUTTON, + }); + + cy.verifyElement({ + element: requestsEChartElements.CHART_REQUESTS, + }); + + cy.verifyElement({ + element: requestsEChartElements.RECEIVED_REQUESTS_ICON, + labelElement: requestsEChartElements.RECEIVED_REQUESTS_LABEL, + labelText: "Received requests", + }); + + cy.verifyElement({ + element: requestsEChartElements.CANCELED_REQUESTS_ICON, + labelElement: requestsEChartElements.CANCELED_REQUESTS_LABEL, + labelText: "Canceled requests", + }); + + cy.verifyElement({ + element: requestsEChartElements.QUEUED_REQUESTS_ICON, + labelElement: requestsEChartElements.QUEUED_REQUESTS_LABEL, + labelText: "Queued requests", + }); + } +} + +const verifyDelaysEChart = ({ + isEmpty = false, +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: delaysEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: delaysEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: delaysEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + } else { + + cy.verifyElement({ + element: delaysEChartElements.SELECT_DELAYS_CHART_TYPE, + elementPlaceHolder: "Select", + value: "Line", + }); + + cy.verifyElement({ + element: delaysEChartElements.CHART_TYPE_ANNOTATION_BUTTON, + }); + + cy.verifyElement({ + element: delaysEChartElements.CHART_MORE_BUTTON, + }); + + cy.verifyElement({ + element: delaysEChartElements.CHART_DELAYS, + }); + + cy.verifyElement({ + element: delaysEChartElements.MINIMUM_DELAY_ICON, + labelElement: delaysEChartElements.MINIMUM_DELAY_LABEL, + labelText: "Minimum Delay", + }); + + cy.verifyElement({ + element: delaysEChartElements.AVERAGE_DELAY_ICON, + labelElement: delaysEChartElements.AVERAGE_DELAY_LABEL, + labelText: "Average Delay", + }); + + cy.verifyElement({ + element: delaysEChartElements.MAXIMUM_DELAY_ICON, + labelElement: delaysEChartElements.MAXIMUM_DELAY_LABEL, + labelText: "Maximum Delay", + }); + } +} + +const verifyReceivedRequestEChart = ({ + isEmpty = false, +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: receivedRequestEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: receivedRequestEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: receivedRequestEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + } else { + + cy.verifyElement({ + element: receivedRequestEChartElements.CHART_RECEIVED_REQUESTS, + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.CHART_MORE_BUTTON, + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.APM_ICON, + labelElement: receivedRequestEChartElements.APM_LABEL, + labelText: "apm", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.BEGIN_SESSION_ICON, + labelElement: receivedRequestEChartElements.BEGIN_SESSION_LABEL, + labelText: "begin_session", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.CONSENT_ICON, + labelElement: receivedRequestEChartElements.CONSENT_LABEL, + labelText: "consent", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.CRASH_ICON, + labelElement: receivedRequestEChartElements.CRASH_LABEL, + labelText: "crash", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.END_SESSION_ICON, + labelElement: receivedRequestEChartElements.END_SESSION_LABEL, + labelText: "end_session", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.EVENTS_ICON, + labelElement: receivedRequestEChartElements.EVENTS_LABEL, + labelText: "events", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.SESSION_DURATION_ICON, + labelElement: receivedRequestEChartElements.SESSION_DURATION_LABEL, + labelText: "session_duration", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.TOKEN_SESSION_ICON, + labelElement: receivedRequestEChartElements.TOKEN_SESSION_LABEL, + labelText: "token_session", + }); + + cy.verifyElement({ + element: receivedRequestEChartElements.USER_DETAILS_ICON, + labelElement: receivedRequestEChartElements.USER_DETAILS_LABEL, + labelText: "user_details", + }); + } +} + +const verifyCanceledRequestEChart = ({ + isEmpty = false, +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: canceledRequestEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: canceledRequestEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: canceledRequestEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + } else { + + //TODO : Data is not being generated with the populator. Need to generate the data + // cy.verifyElement({ + // element: canceledRequestEChartElements.CHART_CANCELED_REQUESTS, + // }); + + // cy.verifyElement({ + // element: canceledRequestEChartElements.CHART_MORE_BUTTON, + // }); + } +} + const clickSdkStatsTab = () => { cy.scrollPageToTop(); cy.clickElement(requestStatsPageElements.TAB_SDK_STATS); @@ -188,6 +477,11 @@ const clickSdkConfigurationTab = () => { module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, + verifyRequestStatsMetricCard, + verifyRequestsEChart, + verifyDelaysEChart, + verifyCanceledRequestEChart, clickSdkStatsTab, clickRequestStatsTab, clickHealthCheckTab, diff --git a/ui-tests/cypress/support/elements/dashboard/manage/sdk/requestStats.js b/ui-tests/cypress/support/elements/dashboard/manage/sdk/requestStats.js index 37e6a3d2e70..7871c823c64 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/sdk/requestStats.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/sdk/requestStats.js @@ -1,46 +1,134 @@ -export default { +export const requestStatsPageElements = { PAGE_TITLE: 'header-title', FILTER_DATE_PICKER: 'cly-datepicker-test-id-pseudo-input-label', + RECEIVED_REQUEST_BREAKDOWN_BY_TYPE_AS_LABEL: 'received-request-breakdown-by-type-as-label', + RECEIVED_REQUEST_BREAKDOWN_BY_TYPE_AS_TYPE_SELECT: 'request-breakdown-type-select-input-pseudo-input-label', + + CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_LABEL: 'canceled-request-breakdown-by-reason-as-label', + CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_TYPE_SELECT: 'canceled-request-select-input-pseudo-input-label', + + CANCELED_REQUEST_EMPTY_TABLE_ICON: 'line-options-canceled-empty-logo', + CANCELED_REQUEST_EMPTY_TABLE_TITLE: 'line-options-canceled-empty-title', + CANCELED_REQUEST_EMPTY_TABLE_SUBTITLE: 'line-options-canceled-empty-subtitle', + + TAB_SDK_STATS: 'tab-sdk-stats-title', + TAB_REQUEST_STATS: 'tab-request-stats-title', + TAB_HEALTH_CHECK: 'tab-health-check-title', + TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title' +}; + +const requestStatsMetricCardElements = { REQUESTS_RECEIVED_LABEL: 'metric-card-requests-received-column-label', REQUESTS_RECEIVED_NUMBER: 'metric-card-requests-received-column-number', REQUESTS_RECEIVED_TREND_ICON: 'cly-radio-trend-icon-requests-received', - REQUESTS_RECEIVED_VALUE: 'metric-card-requests-received-description', + REQUESTS_RECEIVED_PERCENTAGE: 'metric-card-requests-received-description', REQUESTS_CANCELED_LABEL: 'metric-card-requests-canceled-column-label', REQUESTS_CANCELED_NUMBER: 'metric-card-requests-canceled-column-number', REQUESTS_CANCELED_TREND_ICON: 'cly-radio-trend-icon-requests-canceled', - REQUESTS_CANCELED_VALUE: 'metric-card-requests-canceled-description', + REQUESTS_CANCELED_PERCENTAGE: 'metric-card-requests-canceled-description', REQUESTS_QUEUED_LABEL: 'metric-card-requests-queued-column-label', REQUESTS_QUEUED_NUMBER: 'metric-card-requests-queued-column-number', REQUESTS_QUEUED_TREND_ICON: 'cly-radio-trend-icon-requests-queued', - REQUESTS_QUEUED_VALUE: 'metric-card-requests-queued-description', + REQUESTS_QUEUED_PERCENTAGE: 'metric-card-requests-queued-description', +}; - REQUESTS_EMPTY_TABLE_ICON: 'line-options-requests-empty-logo', - REQUESTS_EMPTY_TABLE_TITLE: 'line-options-requests-empty-title', - REQUESTS_EMPTY_TABLE_SUBTITLE: 'line-options-requests-empty-subtitle', +const requestsEChartElements = { + EMPTY_TABLE_ICON: 'requests-empty-logo', + EMPTY_TABLE_TITLE: 'requests-empty-title', + EMPTY_TABLE_SUBTITLE: 'requests-empty-subtitle', - DELAYS_EMPTY_TABLE_ICON: 'line-options-delays-empty-logo', - DELAYS_EMPTY_TABLE_TITLE: 'line-options-delays-empty-title', - DELAYS_EMPTY_TABLE_SUBTITLE: 'line-options-delays-empty-subtitle', + SELECT_REQUESTS_CHART_TYPE: 'requests-header-select-input', + CHART_REQUESTS: 'requests-chart', + CHART_TYPE_ANNOTATION_BUTTON: 'chart-type-annotation-icon', + CHART_MORE_BUTTON: 'requests-header-cly-chart-more-dropdown-more-option-button', - RECEIVED_REQUEST_BREAKDOWN_BY_TYPE_AS_LABEL: 'received-request-breakdown-by-type-as-label', - RECEIVED_REQUEST_BREAKDOWN_BY_TYPE_AS_TYPE_SELECT: 'request-breakdown-type-select-input-pseudo-input-label', - RECEIVED_REQUEST_EMPTY_TABLE_ICON: 'cly-chart-bar-test-id-empty-logo', - RECEIVED_REQUEST_EMPTY_TABLE_TITLE: 'cly-chart-bar-test-id-empty-title', - RECEIVED_REQUEST_EMPTY_TABLE_SUBTITLE: 'cly-chart-bar-test-id-empty-subtitle', + RECEIVED_REQUESTS_ICON: 'requests-legend-received-requests-legend-icon', + RECEIVED_REQUESTS_LABEL: 'requests-legend-received-requests-legend-label', - CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_LABEL: 'canceled-request-breakdown-by-reason-as-label', - CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_TYPE_SELECT: 'canceled-request-reason-select-input-pseudo-input-label', + CANCELED_REQUESTS_ICON: 'requests-legend-canceled-requests-legend-icon', + CANCELED_REQUESTS_LABEL: 'requests-legend-canceled-requests-legend-label', - CANCELED_REQUEST_EMPTY_TABLE_ICON: 'line-options-canceled-empty-logo', - CANCELED_REQUEST_EMPTY_TABLE_TITLE: 'line-options-canceled-empty-title', - CANCELED_REQUEST_EMPTY_TABLE_SUBTITLE: 'line-options-canceled-empty-subtitle', + QUEUED_REQUESTS_ICON: 'requests-legend-queued-requests-legend-icon', + QUEUED_REQUESTS_LABEL: 'requests-legend-queued-requests-legend-label' +}; - TAB_SDK_STATS: 'tab-sdk-stats-title', - TAB_REQUEST_STATS: 'tab-request-stats-title', - TAB_HEALTH_CHECK: 'tab-health-check-title', - TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title' +const delaysEChartElements = { + EMPTY_TABLE_ICON: 'delays-empty-logo', + EMPTY_TABLE_TITLE: 'delays-empty-title', + EMPTY_TABLE_SUBTITLE: 'delays-empty-subtitle', + + SELECT_DELAYS_CHART_TYPE: 'delays-header-select-input', + CHART_TYPE_ANNOTATION_BUTTON: 'chart-type-annotation-button', + CHART_MORE_BUTTON: 'delays-header-cly-chart-more-dropdown-more-option-button', + + CHART_DELAYS: 'delays-chart', + + MINIMUM_DELAY_ICON: 'delays-legend-minimum-delay-legend-icon', + MINIMUM_DELAY_LABEL: 'delays-legend-minimum-delay-legend-label', + + AVERAGE_DELAY_ICON: 'delays-legend-average-delay-legend-icon', + AVERAGE_DELAY_LABEL: 'delays-legend-average-delay-legend-label', + + MAXIMUM_DELAY_ICON: 'delays-legend-maximum-delay-legend-icon', + MAXIMUM_DELAY_LABEL: 'delays-legend-maximum-delay-legend-label', +}; + +const receivedRequestEChartElements = { + EMPTY_TABLE_ICON: 'received-request-empty-logo', + EMPTY_TABLE_TITLE: 'received-request-empty-title', + EMPTY_TABLE_SUBTITLE: 'received-request-empty-subtitle', + + CHART_RECEIVED_REQUESTS: 'received-request-chart', + CHART_MORE_BUTTON: 'received-request-cly-chart-more-dropdown-more-option-button', + + APM_ICON: 'received-request-apm-legend-icon', + APM_LABEL: 'received-request-apm-legend-label', + + BEGIN_SESSION_ICON: 'received-request-begin_session-legend-icon', + BEGIN_SESSION_LABEL: 'received-request-begin_session-legend-label', + + CONSENT_ICON: 'received-request-consent-legend-icon', + CONSENT_LABEL: 'received-request-consent-legend-label', + + CRASH_ICON: 'received-request-crash-legend-icon', + CRASH_LABEL: 'received-request-crash-legend-label', + + END_SESSION_ICON: 'received-request-end_session-legend-icon', + END_SESSION_LABEL: 'received-request-end_session-legend-label', + + EVENTS_ICON: 'received-request-events-legend-icon', + EVENTS_LABEL: 'received-request-events-legend-label', + + SESSION_DURATION_ICON: 'received-request-session_duration-legend-icon', + SESSION_DURATION_LABEL: 'received-request-session_duration-legend-label', + + TOKEN_SESSION_ICON: 'received-request-token_session-legend-icon', + TOKEN_SESSION_LABEL: 'received-request-token_session-legend-label', + + USER_DETAILS_ICON: 'received-request-user_details-legend-icon', + USER_DETAILS_LABEL: 'received-request-user_details-legend-label' +}; + +const canceledRequestEChartElements = { + EMPTY_TABLE_ICON: 'canceled-request-empty-logo', + EMPTY_TABLE_TITLE: 'canceled-request-empty-title', + EMPTY_TABLE_SUBTITLE: 'canceled-request-empty-subtitle', + + CHART_CANCELED_REQUESTS: 'canceled-request-chart', + CHART_MORE_BUTTON: 'canceled-request-cly-chart-more-dropdown-more-option-button', + + //TODO: Data is not being generated with the populator. Need to generate the data +}; + +module.exports = { + requestStatsPageElements, + requestStatsMetricCardElements, + requestsEChartElements, + delaysEChartElements, + receivedRequestEChartElements, + canceledRequestEChartElements }; \ No newline at end of file From d81a3e6d8a11bfe7035fb2375e2cfcaa56c7330b Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 18:28:01 +0000 Subject: [PATCH 073/381] Fixed linter error --- .../lib/dashboard/manage/sdk/requestStats.js | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js index 2e20f31c066..a0d6fe8009b 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js @@ -74,7 +74,7 @@ const verifyStaticElementsOfPage = () => { element: requestStatsPageElements.CANCELED_REQUEST_BREAKDOWN_BY_REASON_AS_TYPE_SELECT, elementText: "percentage", }); -} +}; const verifyEmptyPageElements = () => { @@ -179,7 +179,8 @@ const verifyRequestStatsMetricCard = ({ elementText: "NA", }); - } else { + } + else { cy.verifyElement({ shouldNot: !isEmpty, element: requestStatsMetricCardElements.REQUESTS_RECEIVED_NUMBER, @@ -239,7 +240,8 @@ const verifyRequestsEChart = ({ labelText: "No data found", }); - } else { + } + else { cy.verifyElement({ element: requestsEChartElements.SELECT_REQUESTS_CHART_TYPE, @@ -277,7 +279,7 @@ const verifyRequestsEChart = ({ labelText: "Queued requests", }); } -} +}; const verifyDelaysEChart = ({ isEmpty = false, @@ -298,7 +300,8 @@ const verifyDelaysEChart = ({ labelText: "No data found", }); - } else { + } + else { cy.verifyElement({ element: delaysEChartElements.SELECT_DELAYS_CHART_TYPE, @@ -336,7 +339,7 @@ const verifyDelaysEChart = ({ labelText: "Maximum Delay", }); } -} +}; const verifyReceivedRequestEChart = ({ isEmpty = false, @@ -357,7 +360,8 @@ const verifyReceivedRequestEChart = ({ labelText: "No data found", }); - } else { + } + else { cy.verifyElement({ element: receivedRequestEChartElements.CHART_RECEIVED_REQUESTS, @@ -421,7 +425,7 @@ const verifyReceivedRequestEChart = ({ labelText: "user_details", }); } -} +}; const verifyCanceledRequestEChart = ({ isEmpty = false, @@ -442,7 +446,8 @@ const verifyCanceledRequestEChart = ({ labelText: "No data found", }); - } else { + } + else { //TODO : Data is not being generated with the populator. Need to generate the data // cy.verifyElement({ @@ -453,7 +458,7 @@ const verifyCanceledRequestEChart = ({ // element: canceledRequestEChartElements.CHART_MORE_BUTTON, // }); } -} +}; const clickSdkStatsTab = () => { cy.scrollPageToTop(); From b3a3710b036a1cbc52049e83bee1c3ac201f173c Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 19:47:15 +0000 Subject: [PATCH 074/381] Added health check verify full data page case --- .../public/templates/health_checks.html | 6 +- .../cypress/e2e/onboarding/onboarding.cy.js | 5 +- .../lib/dashboard/manage/sdk/healthCheck.js | 256 +++++++++++++++--- .../cypress/lib/dashboard/manage/sdk/stats.js | 27 +- .../dashboard/manage/sdk/healthCheck.js | 84 ++++-- 5 files changed, 302 insertions(+), 76 deletions(-) diff --git a/plugins/sdk/frontend/public/templates/health_checks.html b/plugins/sdk/frontend/public/templates/health_checks.html index 55e0afeda3e..78e8c1e452c 100644 --- a/plugins/sdk/frontend/public/templates/health_checks.html +++ b/plugins/sdk/frontend/public/templates/health_checks.html @@ -22,7 +22,7 @@ - +

Health check breakdown by status as

@@ -33,7 +33,7 @@

Hea

- +

Health check breakdown by errors as

@@ -44,7 +44,7 @@

Hea

- + \ No newline at end of file diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 3911580ffba..8f4bc803ee2 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -393,9 +393,10 @@ describe('Complete Onboarding', () => { sdkManagersPageHelpers.verifyFullDataPageElements(); sdkManagersPageHelpers.clickRequestStatsTab(); requestStatsPageHelpers.verifyFullDataPageElements(); + + requestStatsPageHelpers.clickHealthCheckTab(); + //healthCheckPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data //TODO: Add the cases of the following pages - //requestStatsPageHelpers.clickHealthCheckTab(); - //healthCheckPageHelpers.verifyFullDataPageElements(); //healthCheckPageHelpers.clickSdkConfigurationTab(); //sdkConfigurationsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToComplianceHubMetricsPage(); diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/healthCheck.js b/ui-tests/cypress/lib/dashboard/manage/sdk/healthCheck.js index 2f8b7225f5a..0c88d572521 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/healthCheck.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/healthCheck.js @@ -1,4 +1,11 @@ -import healthCheckPageElements from "../../../../support/elements/dashboard/manage/sdk/healthCheck"; +import { + healthCheckPageElements, + healthCheckMetricCardElements, + hcsEChartElements, + statusCodesEChartElements, + errorMessagesEChartElements +} from "../../../../support/elements/dashboard/manage/sdk/healthCheck"; + const verifyStaticElementsOfPage = () => { cy.verifyElement({ @@ -33,21 +40,21 @@ const verifyStaticElementsOfPage = () => { }); cy.verifyElement({ - labelElement: healthCheckPageElements.HEALTH_CHECK_RECEIVED_LABEL, + labelElement: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_LABEL, labelText: "Health Checks Received", - element: healthCheckPageElements.HEALTH_CHECK_RECEIVED_RECEIVED_TREND_ICON, + element: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_RECEIVED_TREND_ICON, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_ERROR_LOGS_LABEL, + labelElement: healthCheckMetricCardElements.SDK_ERROR_LOGS_LABEL, labelText: "SDK Error Logs", - element: healthCheckPageElements.SDK_ERROR_LOGS_TREND_ICON, + element: healthCheckMetricCardElements.SDK_ERROR_LOGS_TREND_ICON, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_WARN_LOGS_LABEL, + labelElement: healthCheckMetricCardElements.SDK_WARN_LOGS_LABEL, labelText: "SDK Warn Logs", - element: healthCheckPageElements.SDK_WARN_LOGS_TREND_ICON, + element: healthCheckMetricCardElements.SDK_WARN_LOGS_TREND_ICON, }); cy.scrollPageToCenter(); @@ -75,80 +82,252 @@ const verifyEmptyPageElements = () => { cy.scrollPageToTop(); + verifyHealthCheckMetricCard({ + isEmpty: true, + }); + + cy.scrollPageToCenter(); + + verifyHcsEChart({ + isEmpty: true, + }); + + cy.scrollPageToBottom(); + + verifyStatusCodesEChart({ + isEmpty: true, + }); +}; + +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(); + + cy.scrollPageToTop(); + + verifyHealthCheckMetricCard({ + isEmpty: false, + }); + + cy.scrollPageToCenter(); + + verifyHcsEChart({ + isEmpty: false, + }); + + cy.scrollPageToBottom(); + + verifyStatusCodesEChart({ + isEmpty: false, + }); +}; + +const verifyHealthCheckMetricCard = ({ + isEmpty = false, + healthCheckReceivedNumber = null, + healthCheckReceivedPercentage = null, + sdkErrorLogsNumber = null, + sdkErrorLogsPercentage = null, + sdkWarnLogsNumber = null, + sdkWarnLogsPercentage = null +}) => { + + if (isEmpty) { + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_RECEIVED_NUMBER, + labelText: "0", + }); + + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_RECEIVED_PERCENTAGE, + labelText: "NA", + }); + + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.SDK_ERROR_LOGS_NUMBER, + labelText: "0", + }); + + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.SDK_ERROR_LOGS_PERCENTAGE, + labelText: "NA", + }); + + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.SDK_WARN_LOGS_NUMBER, + labelText: "0", + }); + + cy.verifyElement({ + labelElement: healthCheckMetricCardElements.SDK_WARN_LOGS_PERCENTAGE, + labelText: "NA", + }); + + return; + } + cy.verifyElement({ - labelElement: healthCheckPageElements.HEALTH_CHECK_RECEIVED_RECEIVED_NUMBER, - labelText: "0", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_RECEIVED_NUMBER, + elementText: healthCheckReceivedNumber, }); cy.verifyElement({ - labelElement: healthCheckPageElements.HEALTH_CHECK_RECEIVED_RECEIVED_VALUE, - labelText: "NA", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.HEALTH_CHECK_RECEIVED_RECEIVED_PERCENTAGE, + elementText: healthCheckReceivedPercentage, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_ERROR_LOGS_NUMBER, - labelText: "0", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.SDK_ERROR_LOGS_NUMBER, + elementText: sdkErrorLogsNumber, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_ERROR_LOGS_VALUE, - labelText: "NA", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.SDK_ERROR_LOGS_PERCENTAGE, + elementText: sdkErrorLogsPercentage, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_WARN_LOGS_NUMBER, - labelText: "0", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.SDK_WARN_LOGS_NUMBER, + elementText: sdkWarnLogsNumber, }); cy.verifyElement({ - labelElement: healthCheckPageElements.SDK_WARN_LOGS_VALUE, - labelText: "NA", + shouldNot: !isEmpty, + element: healthCheckMetricCardElements.SDK_WARN_LOGS_PERCENTAGE, + elementText: sdkWarnLogsPercentage, }); +}; + +const verifyHcsEChart = ({ + isEmpty = false, +}) => { + if (isEmpty) { + cy.verifyElement({ + element: hcsEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: hcsEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: hcsEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + return; + } cy.verifyElement({ - element: healthCheckPageElements.HEALTH_CHECK_EMPTY_TABLE_ICON, + element: hcsEChartElements.SELECT_HCS_CHART_TYPE, }); cy.verifyElement({ - labelElement: healthCheckPageElements.HEALTH_CHECK_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + element: hcsEChartElements.CHART_HCS, }); cy.verifyElement({ - labelElement: healthCheckPageElements.HEALTH_CHECK_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + element: hcsEChartElements.CHART_TYPE_ANNOTATION_BUTTON, }); - cy.scrollPageToCenter(); + cy.verifyElement({ + element: hcsEChartElements.CHART_MORE_BUTTON, + }); cy.verifyElement({ - element: healthCheckPageElements.STATUS_EMPTY_TABLE_ICON, + element: hcsEChartElements.RECEIVED_HEALTH_CHECKS_ICON, + labelElement: hcsEChartElements.RECEIVED_HEALTH_CHECKS_LABEL, + labelText: "Received Health Checks" }); cy.verifyElement({ - labelElement: healthCheckPageElements.STATUS_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + element: hcsEChartElements.ERROR_LOGS_ICON, + labelElement: hcsEChartElements.ERROR_LOGS_LABEL, + labelText: "Error Logs" }); cy.verifyElement({ - labelElement: healthCheckPageElements.STATUS_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + element: hcsEChartElements.WARNING_LOGS_ICON, + labelElement: hcsEChartElements.WARNING_LOGS_LABEL, + labelText: "Warning Logs" }); +}; - cy.scrollPageToBottom(); +const verifyStatusCodesEChart = ({ + isEmpty = false, +}) => { + if (isEmpty) { + cy.verifyElement({ + element: statusCodesEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: statusCodesEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: statusCodesEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + return; + } + + cy.verifyElement({ + element: statusCodesEChartElements.CHART_STATUS_CODES, + }); + + cy.verifyElement({ + element: statusCodesEChartElements.CHART_MORE_BUTTON, + }); + + cy.verifyElement({ + element: statusCodesEChartElements.STATUS_CODE_MIN_1_ICON, + labelElement: statusCodesEChartElements.STATUS_CODE_MIN_1_LABEL, + labelText: "-1" + }); +}; + +const verifyErrorMessagesEChart = ({ + isEmpty = false, +}) => { + if (isEmpty) { + cy.verifyElement({ + element: errorMessagesEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: errorMessagesEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: errorMessagesEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + return; + } cy.verifyElement({ - element: healthCheckPageElements.ERROR_MESSAGES_EMPTY_TABLE_ICON, + element: errorMessagesEChartElements.CHART_ERROR_MESSAGES, }); cy.verifyElement({ - labelElement: healthCheckPageElements.ERROR_MESSAGES_EMPTY_TABLE_TITLE, - labelText: "...hmm, seems empty here", + element: errorMessagesEChartElements.CHART_MORE_BUTTON, }); cy.verifyElement({ - labelElement: healthCheckPageElements.ERROR_MESSAGES_EMPTY_TABLE_SUBTITLE, - labelText: "No data found", + element: errorMessagesEChartElements.APP_DOES_NOT_EXIST_ICON, + labelElement: errorMessagesEChartElements.APP_DOES_NOT_EXIST_LABEL, + labelText: "App does not exist" }); }; @@ -174,6 +353,11 @@ const clickSdkConfigurationTab = () => { module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, + verifyHealthCheckMetricCard, + verifyHcsEChart, + verifyStatusCodesEChart, + verifyErrorMessagesEChart, clickSdkStatsTab, clickRequestStatsTab, clickHealthCheckTab, diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js b/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js index f60c0ec7783..3e0c4fcf9d5 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/stats.js @@ -303,24 +303,23 @@ const verifySdkStatsEChart = ({ labelElement: sdkStatsEChartElements.EMPTY_TABLE_SUBTITLE, labelText: "No data found", }); + return; } - else { - cy.verifyElement({ - element: sdkStatsEChartElements.CHART_SDK_VERSION, - }); + cy.verifyElement({ + element: sdkStatsEChartElements.CHART_SDK_VERSION, + }); - cy.verifyElement({ - element: sdkStatsEChartElements.VERSION_ICONS, - }); + cy.verifyElement({ + element: sdkStatsEChartElements.VERSION_ICONS, + }); - cy.verifyElement({ - element: sdkStatsEChartElements.VERSION_NUMBERS, - }); + cy.verifyElement({ + element: sdkStatsEChartElements.VERSION_NUMBERS, + }); - cy.verifyElement({ - element: sdkStatsEChartElements.CHART_MORE_BUTTON, - }); - } + cy.verifyElement({ + element: sdkStatsEChartElements.CHART_MORE_BUTTON, + }); }; const verifySDKsDataFromTable = ({ diff --git a/ui-tests/cypress/support/elements/dashboard/manage/sdk/healthCheck.js b/ui-tests/cypress/support/elements/dashboard/manage/sdk/healthCheck.js index a9348561677..79ec2ddf20a 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/sdk/healthCheck.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/sdk/healthCheck.js @@ -1,42 +1,84 @@ -export default { +export const healthCheckPageElements = { PAGE_TITLE: 'header-title', FILTER_DATE_PICKER: 'cly-datepicker-test-id-pseudo-input-label', + HEALTH_CHECK_BREAKDOWN_BY_STATUS_AS_LABEL: 'health-check-breakdown-by-status-as-label', + HEALTH_CHECK_BREAKDOWN_BY_STATUS_AS_TYPE_SELECT: 'health-check-breakdown-by-status-as-select-input-pseudo-input-label', + + HEALTH_CHECK_BREAKDOWN_BY_ERRORS_AS_LABEL: 'health-check-breakdown-by-errors-as-label', + HEALTH_CHECK_BREAKDOWN_BY_ERRORS_AS_TYPE_SELECT: 'health-check-breakdown-by-errors-as-select-input-pseudo-input-label', + + TAB_SDK_STATS: 'tab-sdk-stats-title', + TAB_REQUEST_STATS: 'tab-request-stats-title', + TAB_HEALTH_CHECK: 'tab-health-check-title', + TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title' +}; + +const healthCheckMetricCardElements = { HEALTH_CHECK_RECEIVED_LABEL: 'metric-card-health-checks-received-column-label', HEALTH_CHECK_RECEIVED_RECEIVED_NUMBER: 'metric-card-health-checks-received-column-number', HEALTH_CHECK_RECEIVED_RECEIVED_TREND_ICON: 'cly-radio-trend-icon-health-checks-received', - HEALTH_CHECK_RECEIVED_RECEIVED_VALUE: 'metric-card-health-checks-received-description', + HEALTH_CHECK_RECEIVED_RECEIVED_PERCENTAGE: 'metric-card-health-checks-received-description', SDK_ERROR_LOGS_LABEL: 'metric-card-sdk-error-logs-column-label', SDK_ERROR_LOGS_NUMBER: 'metric-card-sdk-error-logs-column-number', SDK_ERROR_LOGS_TREND_ICON: 'cly-radio-trend-icon-sdk-error-logs', - SDK_ERROR_LOGS_VALUE: 'metric-card-sdk-error-logs-description', + SDK_ERROR_LOGS_PERCENTAGE: 'metric-card-sdk-error-logs-description', SDK_WARN_LOGS_LABEL: 'metric-card-sdk-warn-logs-column-label', SDK_WARN_LOGS_NUMBER: 'metric-card-sdk-warn-logs-column-number', SDK_WARN_LOGS_TREND_ICON: 'cly-radio-trend-icon-sdk-warn-logs', - SDK_WARN_LOGS_VALUE: 'metric-card-sdk-warn-logs-description', + SDK_WARN_LOGS_PERCENTAGE: 'metric-card-sdk-warn-logs-description' +}; - HEALTH_CHECK_EMPTY_TABLE_ICON: 'line-options-hcs-empty-logo', - HEALTH_CHECK_EMPTY_TABLE_TITLE: 'line-options-hcs-empty-title', - HEALTH_CHECK_EMPTY_TABLE_SUBTITLE: 'line-options-hcs-empty-subtitle', +const hcsEChartElements = { + EMPTY_TABLE_ICON: 'hcs-empty-logo', + EMPTY_TABLE_TITLE: 'hcs-empty-title', + EMPTY_TABLE_SUBTITLE: 'hcs-empty-subtitle', - HEALTH_CHECK_BREAKDOWN_BY_STATUS_AS_LABEL: 'health-check-breakdown-by-status-as-label', - HEALTH_CHECK_BREAKDOWN_BY_STATUS_AS_TYPE_SELECT: 'health-check-breakdown-by-status-as-select-input-pseudo-input-label', + SELECT_HCS_CHART_TYPE: 'hcs-header-select-input', + CHART_HCS: 'hcs-chart', + CHART_TYPE_ANNOTATION_BUTTON: 'chart-type-annotation-icon', + CHART_MORE_BUTTON: 'hcs-header-cly-chart-more-dropdown-more-option-button', - STATUS_EMPTY_TABLE_ICON: 'line-options-status-codes-empty-logo', - STATUS_EMPTY_TABLE_TITLE: 'line-options-status-codes-empty-title', - STATUS_EMPTY_TABLE_SUBTITLE: 'line-options-status-codes-empty-subtitle', + RECEIVED_HEALTH_CHECKS_ICON: 'hcs-legend-received-health-checks-legend-icon', + RECEIVED_HEALTH_CHECKS_LABEL: 'hcs-legend-received-health-checks-legend-label', - HEALTH_CHECK_BREAKDOWN_BY_ERRORS_AS_LABEL: 'health-check-breakdown-by-errors-as-label', - HEALTH_CHECK_BREAKDOWN_BY_ERRORS_AS_TYPE_SELECT: 'health-check-breakdown-by-errors-as-select-input-pseudo-input-label', + ERROR_LOGS_ICON: 'hcs-legend-error-logs-legend-icon', + ERROR_LOGS_LABEL: 'hcs-legend-error-logs-legend-label', - ERROR_MESSAGES_EMPTY_TABLE_ICON: 'line-options-error-messages-empty-logo', - ERROR_MESSAGES_EMPTY_TABLE_TITLE: 'line-options-error-messages-empty-title', - ERROR_MESSAGES_EMPTY_TABLE_SUBTITLE: 'line-options-error-messages-empty-subtitle', + WARNING_LOGS_ICON: 'hcs-legend-warning-logs-legend-icon', + WARNING_LOGS_LABEL: 'hcs-legend-warning-logs-legend-label' +}; - TAB_SDK_STATS: 'tab-sdk-stats-title', - TAB_REQUEST_STATS: 'tab-request-stats-title', - TAB_HEALTH_CHECK: 'tab-health-check-title', - TAB_SDK_CONFIGURATION: 'tab-sdk-configuration-title' +const statusCodesEChartElements = { + EMPTY_TABLE_ICON: 'status-codes-empty-logo', + EMPTY_TABLE_TITLE: 'status-codes-empty-title', + EMPTY_TABLE_SUBTITLE: 'status-codes-empty-subtitle', + + CHART_STATUS_CODES: 'status-codes-chart', + CHART_MORE_BUTTON: 'status-codes-header-cly-chart-more-dropdown-more-option-button', + + STATUS_CODE_MIN_1_ICON: 'line-options-status-codes--1-legend-icon', + STATUS_CODE_MIN_1_LABEL: 'line-options-status-codes--1-legend-label' +}; + +const errorMessagesEChartElements = { + EMPTY_TABLE_ICON: 'error-messages-empty-logo', + EMPTY_TABLE_TITLE: 'error-messages-empty-title', + EMPTY_TABLE_SUBTITLE: 'error-messages-empty-subtitle', + + CHART_ERROR_MESSAGES: 'error-messages-chart', + CHART_MORE_BUTTON: 'error-messages-header-cly-chart-more-dropdown-more-option-button', + + APP_DOES_NOT_EXIST_ICON: 'line-options-error-messages-app-does-not-exist-legend-icon', + APP_DOES_NOT_EXIST_LABEL: 'line-options-error-messages-app-does-not-exist-legend-label' +}; + +module.exports = { + healthCheckPageElements, + healthCheckMetricCardElements, + hcsEChartElements, + statusCodesEChartElements, + errorMessagesEChartElements }; \ No newline at end of file From 33a969b883a36a340ecbab347fbb9eac426b9ad3 Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 20:16:59 +0000 Subject: [PATCH 075/381] Added sdk fulld ata page verify case --- .../cypress/e2e/onboarding/onboarding.cy.js | 7 +- .../dashboard/manage/sdk/configurations.js | 31 +- .../lib/dashboard/manage/sdk/requestStats.js | 317 +++++++++--------- 3 files changed, 182 insertions(+), 173 deletions(-) diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 8f4bc803ee2..74aefb93f9a 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -231,7 +231,7 @@ describe('Complete Onboarding', () => { requestStatsPageHelpers.clickHealthCheckTab(); healthCheckPageHelpers.verifyEmptyPageElements(); healthCheckPageHelpers.clickSdkConfigurationTab(); - sdkConfigurationsPageHelpers.verifyEmptyPageElements(); + sdkConfigurationsPageHelpers.verifyPageElements({}); navigationHelpers.goToComplianceHubMetricsPage(); complianceHubMetricsPageHelpers.verifyEmptyPageElements(); complianceHubMetricsPageHelpers.clickUsersTab(); @@ -393,12 +393,11 @@ describe('Complete Onboarding', () => { sdkManagersPageHelpers.verifyFullDataPageElements(); sdkManagersPageHelpers.clickRequestStatsTab(); requestStatsPageHelpers.verifyFullDataPageElements(); - requestStatsPageHelpers.clickHealthCheckTab(); //healthCheckPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data + healthCheckPageHelpers.clickSdkConfigurationTab(); + sdkConfigurationsPageHelpers.verifyPageElements({}); //TODO: Add the cases of the following pages - //healthCheckPageHelpers.clickSdkConfigurationTab(); - //sdkConfigurationsPageHelpers.verifyFullDataPageElements(); //navigationHelpers.goToComplianceHubMetricsPage(); //complianceHubMetricsPageHelpers.verifyFullDataPageElements(); //complianceHubMetricsPageHelpers.clickUsersTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/configurations.js b/ui-tests/cypress/lib/dashboard/manage/sdk/configurations.js index ec91460c844..ec8d69d24c9 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/configurations.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/configurations.js @@ -1,6 +1,26 @@ import sdkConfiguratonsPageElements from "../../../../support/elements/dashboard/manage/sdk/configurations"; const verifyStaticElementsOfPage = () => { + cy.verifyElement({ + element: sdkConfiguratonsPageElements.TAB_SDK_STATS, + elementText: "SDK Stats", + }); + + cy.verifyElement({ + element: sdkConfiguratonsPageElements.TAB_REQUEST_STATS, + elementText: "Request Stats", + }); + + cy.verifyElement({ + element: sdkConfiguratonsPageElements.TAB_HEALTH_CHECK, + elementText: "Health Check", + }); + + cy.verifyElement({ + element: sdkConfiguratonsPageElements.TAB_SDK_CONFIGURATION, + elementText: "SDK Configuration", + }); + cy.verifyElement({ labelElement: sdkConfiguratonsPageElements.PAGE_TITLE, labelText: "SDK Configuration (Experimental)", @@ -34,18 +54,21 @@ const verifyStaticElementsOfPage = () => { }); }; -const verifyEmptyPageElements = () => { +const verifyPageElements = ({ + isSdkTrackingEnabled = true, + isSdkNetworkingEnabled = true +}) => { verifyStaticElementsOfPage(); cy.verifyElement({ element: sdkConfiguratonsPageElements.SDK_TRACKING_SWITCH, - isChecked: true + isChecked: isSdkTrackingEnabled }); cy.verifyElement({ element: sdkConfiguratonsPageElements.SDK_NETWORKINF_SWITCH, - isChecked: true + isChecked: isSdkNetworkingEnabled }); }; @@ -70,7 +93,7 @@ const clickSdkConfigurationTab = () => { }; module.exports = { - verifyEmptyPageElements, + verifyPageElements, clickSdkStatsTab, clickRequestStatsTab, clickHealthCheckTab, diff --git a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js index a0d6fe8009b..ae3904eeba7 100644 --- a/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js +++ b/ui-tests/cypress/lib/dashboard/manage/sdk/requestStats.js @@ -178,45 +178,43 @@ const verifyRequestStatsMetricCard = ({ element: requestStatsMetricCardElements.REQUESTS_QUEUED_PERCENTAGE, elementText: "NA", }); - + return; } - else { - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_RECEIVED_NUMBER, - elementText: requestsReceivedNumber, - }); + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_NUMBER, + elementText: requestsReceivedNumber, + }); - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_RECEIVED_PERCENTAGE, - elementText: requestsReceivedPercentage, - }); + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_RECEIVED_PERCENTAGE, + elementText: requestsReceivedPercentage, + }); - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_CANCELED_NUMBER, - elementText: requestsCanceledNumber, - }); + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_CANCELED_NUMBER, + elementText: requestsCanceledNumber, + }); - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_CANCELED_PERCENTAGE, - elementText: requestsCanceledPercentage, - }); + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_CANCELED_PERCENTAGE, + elementText: requestsCanceledPercentage, + }); - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_QUEUED_NUMBER, - elementText: requestsQueuedNumber, - }); + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_QUEUED_NUMBER, + elementText: requestsQueuedNumber, + }); - cy.verifyElement({ - shouldNot: !isEmpty, - element: requestStatsMetricCardElements.REQUESTS_QUEUED_PERCENTAGE, - elementText: requestsQueuedPercentage, - }); - } + cy.verifyElement({ + shouldNot: !isEmpty, + element: requestStatsMetricCardElements.REQUESTS_QUEUED_PERCENTAGE, + elementText: requestsQueuedPercentage, + }); }; const verifyRequestsEChart = ({ @@ -239,46 +237,43 @@ const verifyRequestsEChart = ({ labelElement: requestsEChartElements.EMPTY_TABLE_SUBTITLE, labelText: "No data found", }); - + return; } - else { - - cy.verifyElement({ - element: requestsEChartElements.SELECT_REQUESTS_CHART_TYPE, - elementPlaceHolder: "Select", - value: "Line", - }); + cy.verifyElement({ + element: requestsEChartElements.SELECT_REQUESTS_CHART_TYPE, + elementPlaceHolder: "Select", + value: "Line", + }); - cy.verifyElement({ - element: requestsEChartElements.CHART_TYPE_ANNOTATION_BUTTON, - }); + cy.verifyElement({ + element: requestsEChartElements.CHART_TYPE_ANNOTATION_BUTTON, + }); - cy.verifyElement({ - element: requestsEChartElements.CHART_MORE_BUTTON, - }); + cy.verifyElement({ + element: requestsEChartElements.CHART_MORE_BUTTON, + }); - cy.verifyElement({ - element: requestsEChartElements.CHART_REQUESTS, - }); + cy.verifyElement({ + element: requestsEChartElements.CHART_REQUESTS, + }); - cy.verifyElement({ - element: requestsEChartElements.RECEIVED_REQUESTS_ICON, - labelElement: requestsEChartElements.RECEIVED_REQUESTS_LABEL, - labelText: "Received requests", - }); + cy.verifyElement({ + element: requestsEChartElements.RECEIVED_REQUESTS_ICON, + labelElement: requestsEChartElements.RECEIVED_REQUESTS_LABEL, + labelText: "Received requests", + }); - cy.verifyElement({ - element: requestsEChartElements.CANCELED_REQUESTS_ICON, - labelElement: requestsEChartElements.CANCELED_REQUESTS_LABEL, - labelText: "Canceled requests", - }); + cy.verifyElement({ + element: requestsEChartElements.CANCELED_REQUESTS_ICON, + labelElement: requestsEChartElements.CANCELED_REQUESTS_LABEL, + labelText: "Canceled requests", + }); - cy.verifyElement({ - element: requestsEChartElements.QUEUED_REQUESTS_ICON, - labelElement: requestsEChartElements.QUEUED_REQUESTS_LABEL, - labelText: "Queued requests", - }); - } + cy.verifyElement({ + element: requestsEChartElements.QUEUED_REQUESTS_ICON, + labelElement: requestsEChartElements.QUEUED_REQUESTS_LABEL, + labelText: "Queued requests", + }); }; const verifyDelaysEChart = ({ @@ -299,46 +294,43 @@ const verifyDelaysEChart = ({ labelElement: delaysEChartElements.EMPTY_TABLE_SUBTITLE, labelText: "No data found", }); - + return; } - else { - - cy.verifyElement({ - element: delaysEChartElements.SELECT_DELAYS_CHART_TYPE, - elementPlaceHolder: "Select", - value: "Line", - }); + cy.verifyElement({ + element: delaysEChartElements.SELECT_DELAYS_CHART_TYPE, + elementPlaceHolder: "Select", + value: "Line", + }); - cy.verifyElement({ - element: delaysEChartElements.CHART_TYPE_ANNOTATION_BUTTON, - }); + cy.verifyElement({ + element: delaysEChartElements.CHART_TYPE_ANNOTATION_BUTTON, + }); - cy.verifyElement({ - element: delaysEChartElements.CHART_MORE_BUTTON, - }); + cy.verifyElement({ + element: delaysEChartElements.CHART_MORE_BUTTON, + }); - cy.verifyElement({ - element: delaysEChartElements.CHART_DELAYS, - }); + cy.verifyElement({ + element: delaysEChartElements.CHART_DELAYS, + }); - cy.verifyElement({ - element: delaysEChartElements.MINIMUM_DELAY_ICON, - labelElement: delaysEChartElements.MINIMUM_DELAY_LABEL, - labelText: "Minimum Delay", - }); + cy.verifyElement({ + element: delaysEChartElements.MINIMUM_DELAY_ICON, + labelElement: delaysEChartElements.MINIMUM_DELAY_LABEL, + labelText: "Minimum Delay", + }); - cy.verifyElement({ - element: delaysEChartElements.AVERAGE_DELAY_ICON, - labelElement: delaysEChartElements.AVERAGE_DELAY_LABEL, - labelText: "Average Delay", - }); + cy.verifyElement({ + element: delaysEChartElements.AVERAGE_DELAY_ICON, + labelElement: delaysEChartElements.AVERAGE_DELAY_LABEL, + labelText: "Average Delay", + }); - cy.verifyElement({ - element: delaysEChartElements.MAXIMUM_DELAY_ICON, - labelElement: delaysEChartElements.MAXIMUM_DELAY_LABEL, - labelText: "Maximum Delay", - }); - } + cy.verifyElement({ + element: delaysEChartElements.MAXIMUM_DELAY_ICON, + labelElement: delaysEChartElements.MAXIMUM_DELAY_LABEL, + labelText: "Maximum Delay", + }); }; const verifyReceivedRequestEChart = ({ @@ -359,72 +351,70 @@ const verifyReceivedRequestEChart = ({ labelElement: receivedRequestEChartElements.EMPTY_TABLE_SUBTITLE, labelText: "No data found", }); - + return; } - else { - cy.verifyElement({ - element: receivedRequestEChartElements.CHART_RECEIVED_REQUESTS, - }); + cy.verifyElement({ + element: receivedRequestEChartElements.CHART_RECEIVED_REQUESTS, + }); - cy.verifyElement({ - element: receivedRequestEChartElements.CHART_MORE_BUTTON, - }); + cy.verifyElement({ + element: receivedRequestEChartElements.CHART_MORE_BUTTON, + }); - cy.verifyElement({ - element: receivedRequestEChartElements.APM_ICON, - labelElement: receivedRequestEChartElements.APM_LABEL, - labelText: "apm", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.APM_ICON, + labelElement: receivedRequestEChartElements.APM_LABEL, + labelText: "apm", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.BEGIN_SESSION_ICON, - labelElement: receivedRequestEChartElements.BEGIN_SESSION_LABEL, - labelText: "begin_session", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.BEGIN_SESSION_ICON, + labelElement: receivedRequestEChartElements.BEGIN_SESSION_LABEL, + labelText: "begin_session", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.CONSENT_ICON, - labelElement: receivedRequestEChartElements.CONSENT_LABEL, - labelText: "consent", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.CONSENT_ICON, + labelElement: receivedRequestEChartElements.CONSENT_LABEL, + labelText: "consent", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.CRASH_ICON, - labelElement: receivedRequestEChartElements.CRASH_LABEL, - labelText: "crash", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.CRASH_ICON, + labelElement: receivedRequestEChartElements.CRASH_LABEL, + labelText: "crash", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.END_SESSION_ICON, - labelElement: receivedRequestEChartElements.END_SESSION_LABEL, - labelText: "end_session", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.END_SESSION_ICON, + labelElement: receivedRequestEChartElements.END_SESSION_LABEL, + labelText: "end_session", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.EVENTS_ICON, - labelElement: receivedRequestEChartElements.EVENTS_LABEL, - labelText: "events", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.EVENTS_ICON, + labelElement: receivedRequestEChartElements.EVENTS_LABEL, + labelText: "events", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.SESSION_DURATION_ICON, - labelElement: receivedRequestEChartElements.SESSION_DURATION_LABEL, - labelText: "session_duration", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.SESSION_DURATION_ICON, + labelElement: receivedRequestEChartElements.SESSION_DURATION_LABEL, + labelText: "session_duration", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.TOKEN_SESSION_ICON, - labelElement: receivedRequestEChartElements.TOKEN_SESSION_LABEL, - labelText: "token_session", - }); + cy.verifyElement({ + element: receivedRequestEChartElements.TOKEN_SESSION_ICON, + labelElement: receivedRequestEChartElements.TOKEN_SESSION_LABEL, + labelText: "token_session", + }); - cy.verifyElement({ - element: receivedRequestEChartElements.USER_DETAILS_ICON, - labelElement: receivedRequestEChartElements.USER_DETAILS_LABEL, - labelText: "user_details", - }); - } + cy.verifyElement({ + element: receivedRequestEChartElements.USER_DETAILS_ICON, + labelElement: receivedRequestEChartElements.USER_DETAILS_LABEL, + labelText: "user_details", + }); }; const verifyCanceledRequestEChart = ({ @@ -445,19 +435,16 @@ const verifyCanceledRequestEChart = ({ labelElement: canceledRequestEChartElements.EMPTY_TABLE_SUBTITLE, labelText: "No data found", }); - - } - else { - - //TODO : Data is not being generated with the populator. Need to generate the data - // cy.verifyElement({ - // element: canceledRequestEChartElements.CHART_CANCELED_REQUESTS, - // }); - - // cy.verifyElement({ - // element: canceledRequestEChartElements.CHART_MORE_BUTTON, - // }); + return; } + //TODO : Data is not being generated with the populator. Need to generate the data + // cy.verifyElement({ + // element: canceledRequestEChartElements.CHART_CANCELED_REQUESTS, + // }); + + // cy.verifyElement({ + // element: canceledRequestEChartElements.CHART_MORE_BUTTON, + // }); }; const clickSdkStatsTab = () => { From fb9a7d44f9ecbaa9c398df4fc1d93cb8d36030c3 Mon Sep 17 00:00:00 2001 From: can-angun Date: Mon, 21 Oct 2024 22:32:03 +0000 Subject: [PATCH 076/381] Added metrics verfiy full data page case --- .../frontend/public/templates/metrics.html | 114 ++++----- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../dashboard/manage/compliance/metrics.js | 236 ++++++++++++++---- .../dashboard/manage/compliance/metrics.js | 69 +++-- 4 files changed, 303 insertions(+), 120 deletions(-) diff --git a/plugins/compliance-hub/frontend/public/templates/metrics.html b/plugins/compliance-hub/frontend/public/templates/metrics.html index 16385e17078..7e662313bbc 100644 --- a/plugins/compliance-hub/frontend/public/templates/metrics.html +++ b/plugins/compliance-hub/frontend/public/templates/metrics.html @@ -1,67 +1,67 @@ - -
-
- Consent Requests for - - -
-
- - -
+ +
+
+ Consent Requests for + +
- - +
+ + +
+
+ + - -
-
-
+ +
+
+
+
+

{{userDatalegend.label}}

+ +
+
+
{{formatTableNumber(userDatalegend.value)}}
+
+ + +
{{userDatalegend.percentage}}
+
+
+
+ + +
+
+
-

{{userDatalegend.label}}

+

{{purgeDatalegend.label}}

-
{{formatTableNumber(userDatalegend.value)}}
-
- - -
{{userDatalegend.percentage}}
+
{{formatTableNumber(purgeDatalegend.value)}}
+
+ + +
{{purgeDatalegend.percentage}}
- - -
-
-
-
-

{{purgeDatalegend.label}}

- -
-
-
{{formatTableNumber(purgeDatalegend.value)}}
-
- - -
{{purgeDatalegend.percentage}}
-
-
-
- - -
+ +
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js index 74aefb93f9a..26a91cbe7ab 100644 --- a/ui-tests/cypress/e2e/onboarding/onboarding.cy.js +++ b/ui-tests/cypress/e2e/onboarding/onboarding.cy.js @@ -397,9 +397,9 @@ describe('Complete Onboarding', () => { //healthCheckPageHelpers.verifyFullDataPageElements(); //TODO: Data is not being generated with the populator. Need to generate the data healthCheckPageHelpers.clickSdkConfigurationTab(); sdkConfigurationsPageHelpers.verifyPageElements({}); + navigationHelpers.goToComplianceHubMetricsPage(); + complianceHubMetricsPageHelpers.verifyFullDataPageElements(); //TODO: Add the cases of the following pages - //navigationHelpers.goToComplianceHubMetricsPage(); - //complianceHubMetricsPageHelpers.verifyFullDataPageElements(); //complianceHubMetricsPageHelpers.clickUsersTab(); //complianceHubUsersPageHelpers.verifyFullDataPageElements(); //complianceHubUsersPageHelpers.clickConsentHistoryTab(); diff --git a/ui-tests/cypress/lib/dashboard/manage/compliance/metrics.js b/ui-tests/cypress/lib/dashboard/manage/compliance/metrics.js index 09d4d079851..dce76f10ebf 100644 --- a/ui-tests/cypress/lib/dashboard/manage/compliance/metrics.js +++ b/ui-tests/cypress/lib/dashboard/manage/compliance/metrics.js @@ -1,54 +1,58 @@ -import complianceMetricsPageElements from "../../../../support/elements/dashboard/manage/compliance/metrics"; +import { + metricsPageElements, + consentRequestsEChartElements, + userDataExportsEChartElements, + userDataPurgesEChartElements +} from "../../../../support/elements/dashboard/manage/compliance/metrics"; const verifyStaticElementsOfPage = () => { cy.verifyElement({ - labelElement: complianceMetricsPageElements.PAGE_TITLE, + labelElement: metricsPageElements.PAGE_TITLE, labelText: "Compliance Hub", }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.CONSENT_REQUESTS_FOR_LABEL, + labelElement: metricsPageElements.CONSENT_REQUESTS_FOR_LABEL, labelText: "Consent Requests for", - element: complianceMetricsPageElements.CONSENT_REQUESTS_FILTER_SELECT, + element: metricsPageElements.CONSENT_REQUESTS_FILTER_SELECT, elementText: "Sessions", }); cy.verifyElement({ - element: complianceMetricsPageElements.FILTER_DATE_PICKER, + element: metricsPageElements.FILTER_DATE_PICKER, }); cy.scrollPageToBottom(); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_EXPORTS_LABEL, + labelElement: metricsPageElements.USER_DATA_EXPORTS_LABEL, labelText: "User data exports", - element: complianceMetricsPageElements.USER_DATA_EXPORTS_TREND_ICON, + element: userDataExportsEChartElements.USER_DATA_EXPORTS_TREND_ICON, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_PURGES_LABEL, + labelElement: metricsPageElements.USER_DATA_PURGES_LABEL, labelText: "User data purges", - element: complianceMetricsPageElements.USER_DATA_PURGES_TREND_ICON, + element: userDataPurgesEChartElements.USER_DATA_PURGES_TREND_ICON, }); - cy.verifyElement({ - element: complianceMetricsPageElements.TAB_METRICS, + element: metricsPageElements.TAB_METRICS, elementText: "Metrics", }); cy.verifyElement({ - element: complianceMetricsPageElements.TAB_USERS, + element: metricsPageElements.TAB_USERS, elementText: "Users", }); cy.verifyElement({ - element: complianceMetricsPageElements.TAB_CONSENT_HISTORY, + element: metricsPageElements.TAB_CONSENT_HISTORY, elementText: "Consent History", }); cy.verifyElement({ - element: complianceMetricsPageElements.TAB_EXPORT_PURGE_HISTORY, + element: metricsPageElements.TAB_EXPORT_PURGE_HISTORY, elementText: "Export/Purge History", }); }; @@ -57,95 +61,241 @@ const verifyEmptyPageElements = () => { verifyStaticElementsOfPage(); - cy.scrollPageToTop(); + verifyConsentRequestsEChart({ + isEmpty: true, + }); + + verifyUserDataExportsEChart({ + isEmpty: true, + }); + + verifyUserDataPurgesEChart({ + isEmpty: true, + }); +}; + +const verifyFullDataPageElements = () => { + + verifyStaticElementsOfPage(); + + verifyConsentRequestsEChart({ + isEmpty: false, + }); + + verifyUserDataExportsEChart({ + isEmpty: false, + }); + + verifyUserDataPurgesEChart({ + isEmpty: false, + }); +}; + +const verifyConsentRequestsEChart = ({ + isEmpty = false, + optInValue = null, + optInPercentage = null, + optOutValue = null, + optOutPercentage = null, +}) => { + + if (isEmpty) { + cy.verifyElement({ + element: consentRequestsEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: consentRequestsEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: consentRequestsEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + return; + } cy.verifyElement({ - element: complianceMetricsPageElements.CONSENT_EMPTY_CHART_ICON, + element: consentRequestsEChartElements.CHART_CONSENT_REQUESTS, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.CONSENT_EMPTY_CHART_TITLE, - labelText: "...hmm, seems empty here", + element: consentRequestsEChartElements.CHART_TYPE_ANNOTATION_BUTTON, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.CONSENT_EMPTY_CHART_SUBTITLE, - labelText: "No data found", + element: consentRequestsEChartElements.OPT_IN_ICON, + labelElement: consentRequestsEChartElements.OPT_IN_LABEL, + labelText: "Opt in", }); - cy.scrollPageToBottom(); + cy.verifyElement({ + shouldNot: !isEmpty, + element: consentRequestsEChartElements.OPT_IN_VALUE, + elementText: optInValue, + }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_EXPORTS_NUMBER, - labelText: "0", + element: consentRequestsEChartElements.OPT_IN_TREND_ICON, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_EXPORTS_PERCENTAGE, - labelText: "NA", + shouldNot: !isEmpty, + element: consentRequestsEChartElements.OPT_IN_PERCENTAGE, + elementText: optInPercentage, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_PURGES_NUMBER, - labelText: "0", + element: consentRequestsEChartElements.OPT_OUT_ICON, + labelElement: consentRequestsEChartElements.OPT_OUT_LABEL, + labelText: "Opt out", }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_PURGES_VALUE, - labelText: "NA", + shouldNot: !isEmpty, + element: consentRequestsEChartElements.OPT_OUT_VALUE, + elementText: optOutValue, }); cy.verifyElement({ - element: complianceMetricsPageElements.USER_DATA_EXPORTS_TABLE_ICON, + element: consentRequestsEChartElements.OPT_OUT_TREND_ICON, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_EXPORTS_TABLE_TITLE, - labelText: "...hmm, seems empty here", + shouldNot: !isEmpty, + element: consentRequestsEChartElements.OPT_OUT_PERCENTAGE, + elementText: optOutPercentage, }); +}; + +const verifyUserDataExportsEChart = ({ + isEmpty = false, + exportsValue = null, + exportsPercentage = null, +}) => { + if (isEmpty) { + cy.verifyElement({ + element: userDataExportsEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: userDataExportsEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: userDataExportsEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + cy.verifyElement({ + labelElement: userDataExportsEChartElements.USER_DATA_EXPORTS_NUMBER, + labelText: "0", + }); + + cy.verifyElement({ + labelElement: userDataExportsEChartElements.USER_DATA_EXPORTS_PERCENTAGE, + labelText: "NA", + }); + + return; + } + //TODO: Data is not being generated with the populator. Need to generate the data + // cy.verifyElement({ + // element: userDataExportsEChartElements.CHART_USER_DATA_EXPORTS, + // }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_EXPORTS_TABLE_SUBTITLE, - labelText: "No data found", + shouldNot: !isEmpty, + element: userDataExportsEChartElements.USER_DATA_EXPORTS_NUMBER, + elementText: exportsValue, }); cy.verifyElement({ - element: complianceMetricsPageElements.USER_DATA_PURGES_TABLE_ICON, + shouldNot: !isEmpty, + element: userDataExportsEChartElements.USER_DATA_EXPORTS_PERCENTAGE, + elementText: exportsPercentage, }); +}; + +const verifyUserDataPurgesEChart = ({ + isEmpty = false, + purgesValue = null, + purgesPercentage = null, +}) => { + if (isEmpty) { + cy.verifyElement({ + element: userDataPurgesEChartElements.EMPTY_TABLE_ICON, + }); + + cy.verifyElement({ + labelElement: userDataPurgesEChartElements.EMPTY_TABLE_TITLE, + labelText: "...hmm, seems empty here", + }); + + cy.verifyElement({ + labelElement: userDataPurgesEChartElements.EMPTY_TABLE_SUBTITLE, + labelText: "No data found", + }); + + cy.verifyElement({ + labelElement: userDataPurgesEChartElements.USER_DATA_PURGES_NUMBER, + labelText: "0", + }); + + cy.verifyElement({ + labelElement: userDataPurgesEChartElements.USER_DATA_PURGES_PERCENTAGE, + labelText: "NA", + }); + + return; + } + //TODO: Data is not being generated with the populator. Need to generate the data + // cy.verifyElement({ + // element: userDataPurgesEChartElements.CHART_USER_DATA_PURGES, + // }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_PURGES_TABLE_TITLE, - labelText: "...hmm, seems empty here", + shouldNot: !isEmpty, + element: userDataPurgesEChartElements.USER_DATA_PURGES_NUMBER, + elementText: purgesValue, }); cy.verifyElement({ - labelElement: complianceMetricsPageElements.USER_DATA_PURGES_TABLE_SUBTITLE, - labelText: "No data found", + shouldNot: !isEmpty, + element: userDataPurgesEChartElements.USER_DATA_PURGES_PERCENTAGE, + elementText: purgesPercentage, }); }; const clickMetricsTab = () => { cy.scrollPageToTop(); - cy.clickElement(complianceMetricsPageElements.TAB_METRICS); + cy.clickElement(metricsPageElements.TAB_METRICS); }; const clickUsersTab = () => { cy.scrollPageToTop(); - cy.clickElement(complianceMetricsPageElements.TAB_USERS); + cy.clickElement(metricsPageElements.TAB_USERS); }; const clickConsentHistoryTab = () => { cy.scrollPageToTop(); - cy.clickElement(complianceMetricsPageElements.TAB_CONSENT_HISTORY); + cy.clickElement(metricsPageElements.TAB_CONSENT_HISTORY); }; const clickExportPurgeHistoryTab = () => { cy.scrollPageToTop(); - cy.clickElement(complianceMetricsPageElements.TAB_EXPORT_PURGE_HISTORY); + cy.clickElement(metricsPageElements.TAB_EXPORT_PURGE_HISTORY); }; module.exports = { verifyEmptyPageElements, + verifyFullDataPageElements, + verifyConsentRequestsEChart, + verifyUserDataExportsEChart, + verifyUserDataPurgesEChart, clickMetricsTab, clickUsersTab, clickConsentHistoryTab, diff --git a/ui-tests/cypress/support/elements/dashboard/manage/compliance/metrics.js b/ui-tests/cypress/support/elements/dashboard/manage/compliance/metrics.js index 68577d7749c..347823683c3 100644 --- a/ui-tests/cypress/support/elements/dashboard/manage/compliance/metrics.js +++ b/ui-tests/cypress/support/elements/dashboard/manage/compliance/metrics.js @@ -1,33 +1,66 @@ -export default { +export const metricsPageElements = { PAGE_TITLE: 'header-title', CONSENT_REQUESTS_FOR_LABEL: 'consent-requests-for-label', CONSENT_REQUESTS_FILTER_SELECT: 'consent-requests-for-combobox-pseudo-input-label', FILTER_DATE_PICKER: 'cly-datepicker-test-id-pseudo-input-label', - CONSENT_EMPTY_CHART_ICON: 'consent-dp-chart-empty-logo', - CONSENT_EMPTY_CHART_TITLE: 'consent-dp-chart-empty-title', - CONSENT_EMPTY_CHART_SUBTITLE: 'consent-dp-chart-empty-subtitle', - USER_DATA_EXPORTS_LABEL: 'user-data-exports-title-label', + USER_DATA_PURGES_LABEL: 'user-data-purges-title-label', + + TAB_METRICS: 'tab-metrics-title', + TAB_USERS: 'tab-users-title', + TAB_CONSENT_HISTORY: 'tab-consent-history-title', + TAB_EXPORT_PURGE_HISTORY: 'tab-export/purge-history-title' +}; + +export const consentRequestsEChartElements = { + EMPTY_TABLE_ICON: 'consent-requests-empty-logo', + EMPTY_TABLE_TITLE: 'consent-requests-empty-title', + EMPTY_TABLE_SUBTITLE: 'consent-requests-empty-subtitle', + + CHART_CONSENT_REQUESTS: 'consent-requests-chart', + CHART_TYPE_ANNOTATION_BUTTON: 'chart-type-annotation-button', + + OPT_IN_ICON: 'consent-requests-legend-opt-in-icon', + OPT_IN_LABEL: 'consent-requests-legend-opt-in-label', + OPT_IN_VALUE: 'consent-requests-legend-opt-in-value', + OPT_IN_TREND_ICON: 'consent-requests-legend-opt-in-trend-icon', + OPT_IN_PERCENTAGE: 'consent-requests-legend-opt-in-percentage', + + OPT_OUT_ICON: 'consent-requests-legend-opt-out-icon', + OPT_OUT_LABEL: 'consent-requests-legend-opt-out-label', + OPT_OUT_VALUE: 'consent-requests-legend-opt-out-value', + OPT_OUT_TREND_ICON: 'consent-requests-legend-opt-out-trend-icon', + OPT_OUT_PERCENTAGE: 'consent-requests-legend-opt-out-percentage' +}; + +export const userDataExportsEChartElements = { + EMPTY_TABLE_ICON: 'user-data-exports-empty-logo', + EMPTY_TABLE_TITLE: 'user-data-exports-empty-title', + EMPTY_TABLE_SUBTITLE: 'user-data-exports-empty-subtitle', + + CHART_USER_DATA_EXPORTS: 'user-data-exports-chart', + USER_DATA_EXPORTS_NUMBER: 'user-data-exports-value', USER_DATA_EXPORTS_TREND_ICON: 'user-data-exports-arrow-icon', USER_DATA_EXPORTS_PERCENTAGE: 'user-data-exports-percentage', +}; - USER_DATA_EXPORTS_TABLE_ICON: 'export-dp-chart-empty-logo', - USER_DATA_EXPORTS_TABLE_TITLE: 'export-dp-chart-empty-title', - USER_DATA_EXPORTS_TABLE_SUBTITLE: 'export-dp-chart-empty-subtitle', +export const userDataPurgesEChartElements = { + EMPTY_TABLE_ICON: 'user-data-purges-empty-logo', + EMPTY_TABLE_TITLE: 'user-data-purges-empty-title', + EMPTY_TABLE_SUBTITLE: 'user-data-purges-empty-subtitle', + + CHART_USER_DATA_PURGES: 'user-data-purges-chart', - USER_DATA_PURGES_LABEL: 'user-data-purges-title-label', USER_DATA_PURGES_NUMBER: 'user-data-purges-value', USER_DATA_PURGES_TREND_ICON: 'user-data-purges-arrow-icon', - USER_DATA_PURGES_VALUE: 'user-data-purges-percentage', + USER_DATA_PURGES_PERCENTAGE: 'user-data-purges-percentage', +}; - USER_DATA_PURGES_TABLE_ICON: 'purge-dp-chart-empty-logo', - USER_DATA_PURGES_TABLE_TITLE: 'purge-dp-chart-empty-title', - USER_DATA_PURGES_TABLE_SUBTITLE: 'purge-dp-chart-empty-subtitle', - - TAB_METRICS: 'tab-metrics-title', - TAB_USERS: 'tab-users-title', - TAB_CONSENT_HISTORY: 'tab-consent-history-title', - TAB_EXPORT_PURGE_HISTORY: 'tab-export/purge-history-title' +module.exports = { + metricsPageElements, + consentRequestsEChartElements, + userDataExportsEChartElements, + userDataPurgesEChartElements }; \ No newline at end of file From 289af9c564ef9be3b4e846a97705bacda2a79e0a Mon Sep 17 00:00:00 2001 From: Yavuz Yilmaz Date: Tue, 22 Oct 2024 09:58:03 +0300 Subject: [PATCH 077/381] fixed --- frontend/express/public/javascripts/countly/countly.auth.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/express/public/javascripts/countly/countly.auth.js b/frontend/express/public/javascripts/countly/countly.auth.js index f544478410a..725c9aa2163 100644 --- a/frontend/express/public/javascripts/countly/countly.auth.js +++ b/frontend/express/public/javascripts/countly/countly.auth.js @@ -39,7 +39,7 @@ } if (!member.global_admin) { - var isPermissionObjectExistForAccessType = (typeof member.permission[accessType] === "object" && typeof member.permission[accessType][app_id] === "object"); + var isPermissionObjectExistForAccessType = (member.permission && typeof member.permission[accessType] === "object" && typeof member.permission[accessType][app_id] === "object"); var memberHasAllFlag = member.permission && member.permission[accessType] && member.permission[accessType][app_id] && member.permission[accessType][app_id].all; var memberHasAllowedFlag = false; @@ -96,7 +96,7 @@ return false; } if (!member.global_admin) { - var isPermissionObjectExistForRead = (typeof member.permission.r === "object" && typeof member.permission.r[app_id] === "object"); + var isPermissionObjectExistForRead = (member.permission && typeof member.permission.r === "object" && typeof member.permission.r[app_id] === "object"); // TODO: make here better. create helper method for these checks var memberHasAllFlag = member.permission && member.permission.r && member.permission.r[app_id] && member.permission.r[app_id].all; var memberHasAllowedFlag = false; From 9b9b2184a252391c798e274c386b277bc682924f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=B1nar=20Gen=C3=A7?= Date: Tue, 22 Oct 2024 14:54:28 +0300 Subject: [PATCH 078/381] feat: Added dynamics class on content-layout --- .../javascripts/countly/vue/components/content.js | 13 ++++++++----- .../countly/vue/templates/content/content.html | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/express/public/javascripts/countly/vue/components/content.js b/frontend/express/public/javascripts/countly/vue/components/content.js index a055ca445f6..6513f2bbb82 100644 --- a/frontend/express/public/javascripts/countly/vue/components/content.js +++ b/frontend/express/public/javascripts/countly/vue/components/content.js @@ -2,6 +2,11 @@ (function(countlyVue) { Vue.component("cly-content-layout", countlyVue.components.create({ props: { + popperClass: { + type: String, + required: false, + default: null + }, backgroundColor: { type: String, required: false, @@ -15,6 +20,9 @@ }; }, computed: { + containerClass() { + return this.popperClass || 'cly-vue-content-builder__layout-main'; + } }, template: CV.T('/javascripts/countly/vue/templates/content/content.html'), methods: { @@ -148,11 +156,6 @@ Vue.component("cly-content-body", countlyVue.components.create({ props: { - currentTab: { - type: String, - required: false, - default: null - }, hideLeftSidebar: { type: Boolean, required: false, diff --git a/frontend/express/public/javascripts/countly/vue/templates/content/content.html b/frontend/express/public/javascripts/countly/vue/templates/content/content.html index de9431b03bc..e34f95d3b9b 100644 --- a/frontend/express/public/javascripts/countly/vue/templates/content/content.html +++ b/frontend/express/public/javascripts/countly/vue/templates/content/content.html @@ -3,7 +3,7 @@
-
+
From 3473d5a72725df0764431fcd3b1b0025933b9633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20=C3=9Cstere?= Date: Tue, 22 Oct 2024 12:24:32 +0000 Subject: [PATCH 079/381] Crashes delete confirm dialog changes --- .../public/javascripts/countly.views.js | 73 ++++++++++++------- .../public/localization/crashes.properties | 7 ++ .../frontend/public/templates/overview.html | 20 ++++- 3 files changed, 71 insertions(+), 29 deletions(-) diff --git a/plugins/crashes/frontend/public/javascripts/countly.views.js b/plugins/crashes/frontend/public/javascripts/countly.views.js index 58f60fb34ed..e1167cc1951 100644 --- a/plugins/crashes/frontend/public/javascripts/countly.views.js +++ b/plugins/crashes/frontend/public/javascripts/countly.views.js @@ -451,7 +451,9 @@ formatDate: function(row, col, cell) { return moment(cell * 1000).format("lll"); }, - hasDrillPermission: countlyAuth.validateRead('drill') + hasDrillPermission: countlyAuth.validateRead('drill'), + showDeleteDialog: false, + selectedGroups: [], }; }, computed: { @@ -552,6 +554,16 @@ }, loading: function() { return this.$store.getters["countlyCrashes/overview/loading"]; + }, + confirmDialogTitle: function() { + var title = "crashes.confirm-action-title"; + title = this.selectedGroups.length > 1 ? title + "-plural" : title; + return CV.i18n(title); + }, + confirmDialogText: function() { + var text = "crashes.groups-confirm-delete"; + text = this.selectedGroups.length > 1 ? text + "-plural" : text; + return CV.i18n(text, this.selectedGroups.length); } }, methods: { @@ -575,7 +587,9 @@ }, handleSelectionChange: function(selectedRows, force = false) { var self = this; + this.selectedGroups = []; this.$data.selectedCrashgroups = selectedRows.map(function(row) { + self.selectedGroups.push(row.name); return row._id; }); if (force) { @@ -605,33 +619,30 @@ promise = this.$store.dispatch("countlyCrashes/overview/setSelectedAsShown", this.$data.selectedCrashgroups); } else if (state === "delete") { - CountlyHelpers.confirm(jQuery.i18n.prop("crashes.confirm-delete", 1), "red", function(result) { - if (result) { - self.$store.dispatch("countlyCrashes/overview/setSelectedAsDeleted", self.$data.selectedCrashgroups) - .then(function(response) { - if (Array.isArray(response.result)) { - var itemList = response.result.reduce(function(acc, curr) { - acc += "
  • " + curr + "
  • "; - return acc; - }, ""); - CountlyHelpers.alert("
      " + itemList + "
    ", "red", { title: CV.i18n("crashes.alert-fails") }); - } - else { - CountlyHelpers.notify({ - title: jQuery.i18n.map["systemlogs.action.crash_deleted"], - message: jQuery.i18n.map["systemlogs.action.crash_deleted"] - }); - } - }).finally(function() { - // Reset selection if command is delete or hide - // if (["delete", "hide"].includes(state)) { - self.selectedCrashgroups = []; - self.$refs.dataTable.$refs.elTable.clearSelection(); - // } + self.$store.dispatch("countlyCrashes/overview/setSelectedAsDeleted", self.$data.selectedCrashgroups) + .then(function(response) { + if (Array.isArray(response.result)) { + var itemList = response.result.reduce(function(acc, curr) { + acc += "
  • " + curr + "
  • "; + return acc; + }, ""); + CountlyHelpers.alert("
      " + itemList + "
    ", "red", { title: CV.i18n("crashes.alert-fails") }); + } + else { + CountlyHelpers.notify({ + title: jQuery.i18n.map["systemlogs.action.crash_deleted"], + message: jQuery.i18n.map["systemlogs.action.crash_group_deleted"] }); - } - }); - + } + }).finally(function() { + // Reset selection if command is delete or hide + // if (["delete", "hide"].includes(state)) { + self.selectedCrashgroups = []; + self.$refs.dataTable.$refs.elTable.clearSelection(); + self.closeDeleteForm(); + self.refresh(); + // } + }); } if (typeof promise !== "undefined") { @@ -676,7 +687,13 @@ }, unpatchSelectedGroups: function() { this.handleSelectionChange([], true); - } + }, + toggleDeleteDialog: function() { + this.showDeleteDialog = true; + }, + closeDeleteForm: function() { + this.showDeleteDialog = false; + }, }, beforeCreate: function() { var query = {}; diff --git a/plugins/crashes/frontend/public/localization/crashes.properties b/plugins/crashes/frontend/public/localization/crashes.properties index aa8ae840157..2624b050610 100644 --- a/plugins/crashes/frontend/public/localization/crashes.properties +++ b/plugins/crashes/frontend/public/localization/crashes.properties @@ -136,6 +136,10 @@ crashes.confirm-action-hide = Are you sure you want to hide {0} item(s) crashes.confirm-action-show = Are you sure you want to unhide {0} item(s) crashes.confirm-action-resolving = Are you sure you want to move {0} item(s) to resolving state? +crashes.confirm-action-title = Delete Crash Group +crashes.confirm-action-title-plural = Delete Crash Groups +crashes.yes-delete = Yes, delete group +crashes.do-continue = Do you want to continue? crashes.stacktrace = Stacktrace crashes.download-stacktrace = Download stacktrace @@ -177,6 +181,8 @@ crashes.help-free-users= Number of users who have not experienced a crash for th crashes.help-free-sessions = Number of sessions during which the selected crash did not occur in the selected time period, expressed as a percentage of the total number of sessions within that time period. crashes.help-crash-fatality = Number of fatal crashes, expressed as a percentage of the total number of crashes that have occurred. +crashes.groups-confirm-delete= You are about to delete the crash group +crashes.groups-confirm-delete-plural= You are about to delete {0} crash groups crashes.report_limit = Amount of reports displayed crashes.total_overall=OVERALL crashes.fatal_crash_count=Fatal Crash Count @@ -221,6 +227,7 @@ systemlogs.action.crash_added_comment = Crash Added Comment systemlogs.action.crash_edited_comment = Crash Edited Comment systemlogs.action.crash_deleted_comment = Crash Deleted Comment systemlogs.action.crash_deleted = Crash Deleted +systemlogs.action.crash_group_deleted = Crash group’s data has been deleted. internal-events.[CLY]_crash = Crash crashes.show-binary-images = Show binary images crashes.binary-images = Binary Images diff --git a/plugins/crashes/frontend/public/templates/overview.html b/plugins/crashes/frontend/public/templates/overview.html index 8592c30e240..8519c709e1c 100644 --- a/plugins/crashes/frontend/public/templates/overview.html +++ b/plugins/crashes/frontend/public/templates/overview.html @@ -77,7 +77,7 @@ {{ i18n('crashes.action-hide') }} - + {{ i18n('crashes.action-delete') }} @@ -89,6 +89,24 @@
    + + + From 1c709a79d10c25a4d0dd028f017e15f93e4b4bc1 Mon Sep 17 00:00:00 2001 From: can-angun Date: Tue, 22 Oct 2024 13:26:05 +0000 Subject: [PATCH 080/381] Added compliance users verify full data page case --- .../frontend/public/templates/user.html | 43 +++-- .../cypress/e2e/onboarding/onboarding.cy.js | 4 +- .../lib/dashboard/manage/compliance/users.js | 166 +++++++++++++++--- .../dashboard/manage/compliance/users.js | 57 +++++- 4 files changed, 223 insertions(+), 47 deletions(-) diff --git a/plugins/compliance-hub/frontend/public/templates/user.html b/plugins/compliance-hub/frontend/public/templates/user.html index a8a9a3bc892..ea020bb1f7c 100644 --- a/plugins/compliance-hub/frontend/public/templates/user.html +++ b/plugins/compliance-hub/frontend/public/templates/user.html @@ -1,30 +1,40 @@ - +

    \ + \ #\ \ + \ {{i18n("remote-config.condition")}}\ \ + \ {{i18n("remote-config.percentage")}}\
    1
    {{i18n("remote-config.default-value")}}{{defaultValue.value}}
    {{defaultValue.percentage}}%
    {{i18n("remote-config.percent.of.total")}}
    1
    {{i18n("remote-config.default-value")}}{{defaultValue.value}}
    {{defaultValue.percentage}}%
    {{i18n("remote-config.percent.of.total")}}
    {{i+2}}
    \ +
    {{i+2}}
    \
    {{condition.name}}{{condition.value}}
    {{condition.name}}{{condition.value}}
    \ -
    {{condition.percentage}}%
    {{i18n("remote-config.percent.of.total")}}
    \ +
    {{condition.percentage}}%
    {{i18n("remote-config.percent.of.total")}}
    \