Skip to content

Commit 8516c8c

Browse files
Merge branch 'next' into SER-1558
2 parents 01a7b21 + 3ae261a commit 8516c8c

File tree

50 files changed

+1972
-471
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1972
-471
lines changed

api/lib/countly.common.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,9 +1533,6 @@ countlyCommon.extractTwoLevelData = function(db, rangeArray, clearFunction, data
15331533
periodObj = countlyCommon.periodObj;
15341534
}
15351535

1536-
if (!rangeArray) {
1537-
return {"chartData": tableData};
1538-
}
15391536
var periodMin = 0,
15401537
periodMax = 0,
15411538
dataObj = {},
@@ -1544,6 +1541,10 @@ countlyCommon.extractTwoLevelData = function(db, rangeArray, clearFunction, data
15441541
propertyFunctions = underscore.pluck(dataProperties, "func"),
15451542
propertyValue = 0;
15461543

1544+
if (!rangeArray) {
1545+
return {"chartData": tableData};
1546+
}
1547+
15471548
if (!periodObj.isSpecialPeriod) {
15481549
periodMin = periodObj.periodMin;
15491550
periodMax = (periodObj.periodMax + 1);

api/parts/data/batcher.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class WriteBatcher {
232232
updateOne: {
233233
filter: {_id: this.data[db][collection][key].id},
234234
update: this.data[db][collection][key].value,
235-
upsert: true
235+
upsert: this.data[db][collection][key].upsert
236236
}
237237
});
238238
}
@@ -340,18 +340,25 @@ class WriteBatcher {
340340
* @param {string} id - id of the document
341341
* @param {object} operation - operation
342342
* @param {string} db - name of the database for which to write data
343+
* @param {object=} options - options for operation ((upsert: false) - if you don't want to upsert document)
343344
*/
344-
add(collection, id, operation, db = "countly") {
345+
add(collection, id, operation, db = "countly", options) {
345346
if (!this.shared || cluster.isMaster) {
346347
if (!this.data[db][collection]) {
347348
this.data[db][collection] = {};
348349
}
349350
if (!this.data[db][collection][id]) {
350-
this.data[db][collection][id] = {id: id, value: operation};
351+
this.data[db][collection][id] = {id: id, value: operation, upsert: true};
352+
if (options && options.upsert === false) {
353+
this.data[db][collection][id].upsert = false;
354+
}
351355
batcherStats.update_queued++;
352356
}
353357
else {
354358
this.data[db][collection][id].value = common.mergeQuery(this.data[db][collection][id].value, operation);
359+
if (options && options.upsert === false) {
360+
this.data[db][collection][id].upsert = this.data[db][collection][id].upsert || false;
361+
}
355362
}
356363
if (!this.process) {
357364
this.flush(db, collection);

frontend/express/public/core/app-management/templates/app-management.html

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,29 @@ <h2 class="bu-mb-4" data-test-id="selected-app-name-title"> {{apps[selectedApp]
202202
@discard="discardForm()"
203203
@save="save(formScope.editedObject)"
204204
:disabled="isSaveDisabled(formScope.editedObject)"
205+
:isModal="true"
205206
>
207+
<template v-slot:main>
208+
<div class="bu-mr-0 bu-is-flex bu-is-justify-content-flex-end bu-is-align-items-center cly-vue-user-selected" style="height: 100%;">
209+
<span class="selected-count-blue bu-pl-1 text-medium">
210+
<span style="background-color:#0166D6; color:white; padding:3px 7px; border-radius:4px;">{{compare(formScope.editedObject,apps[selectedApp]).length}}</span>
211+
<span v-if="compare(formScope.editedObject,apps[selectedApp]).length>1" class="bu-is-lowercase text-medium color-cool-gray-50 bu-pl-1">{{ i18n("common.diff-helper.changes-made") }}</span>
212+
<span v-else class="bu-is-lowercase text-medium color-cool-gray-50 bu-pl-1">{{ i18n("common.diff-helper.changes-made-single") }}</span>
213+
<span v-if="compare(formScope.editedObject,apps[selectedApp]).length>1" class="text-medium color-cool-gray-50">{{ i18n("common.diff-helper.keep") }}</span>
214+
<span v-else class="text-medium color-cool-gray-50">{{ i18n("common.diff-helper.keep-single") }}</span>
215+
</span>
216+
<span class="vertical-divider bu-mr-4 bu-ml-4"></span>
217+
<el-button skin="red" class="bu-mr-2" size="small" type="default" @click="save(formScope.editedObject)">
218+
<i class="cly-io-16 cly-io cly-io-save-disc" style="font-size: larger;"></i>
219+
<span class="bu-ml-1">
220+
{{ i18n('dashboards.save-changes') }}
221+
</span>
222+
</el-button>
223+
<el-button class="x-button" @click="discardForm">
224+
<i class="cly-io-16 cly-io cly-io-x color-cool-gray-50"></i>
225+
</el-button>
226+
</div>
227+
</template>
206228
</cly-diff-helper>
207229
</template>
208230
</cly-form>
@@ -364,17 +386,19 @@ <h3 class="bu-mb-2" v-if="!newApp && hasAppAdminRights">{{i18n('management-appli
364386
</cly-inline-form-field>
365387
</el-collapse-item>
366388
</el-collapse>
367-
<cly-diff-helper :diff="changeKeys" @discard="onDiscard" @save="saveSettings" :disabled="v.invalid" :emitSaveWhenDisabled="true" :isModal=true>
389+
<cly-diff-helper :diff="changeKeys" @discard="onDiscard" @save="saveSettings" :disabled="v.invalid" :emitSaveWhenDisabled="true" :isModal="true">
368390
<template v-slot:main>
369391
<div class="bu-mr-0 bu-is-flex bu-is-justify-content-flex-end bu-is-align-items-center cly-vue-user-selected" style="height: 100%;">
370392
<span class="selected-count-blue bu-pl-1 text-medium">
371393
<span style="background-color:#0166D6; color:white; padding:3px 7px; border-radius:4px;">{{changeKeys.length}}</span>
372-
<span class="bu-is-lowercase text-medium color-cool-gray-50 bu-pl-1">{{ i18n("common.diff-helper.changes-made") }}</span>
373-
<span class="text-medium color-cool-gray-50">{{ i18n("common.diff-helper.keep") }}</span>
394+
<span v-if="changeKeys.length>1" class="bu-is-lowercase text-medium color-cool-gray-50 bu-pl-1">{{ i18n("common.diff-helper.changes-made") }}</span>
395+
<span v-else class="bu-is-lowercase text-medium color-cool-gray-50 bu-pl-1">{{ i18n("common.diff-helper.changes-made-single") }}</span>
396+
<span v-if="changeKeys.length>1" class="text-medium color-cool-gray-50">{{ i18n("common.diff-helper.keep") }}</span>
397+
<span v-else class="text-medium color-cool-gray-50">{{ i18n("common.diff-helper.keep-single") }}</span>
374398
</span>
375399
<span class="vertical-divider bu-mr-4 bu-ml-4"></span>
376400
<el-button skin="red" class="bu-mr-2" size="small" type="default" @click="saveSettings">
377-
<i class="cly-io-16 cly-io cly-io-save" style="font-size: larger;"></i>
401+
<i class="cly-io-16 cly-io cly-io-save-disc" style="font-size: larger;"></i>
378402
<span class="bu-ml-1">
379403
{{ i18n('dashboards.save-changes') }}
380404
</span>

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -779,15 +779,20 @@
779779
dataType: "json",
780780
}, {"disableAutoCatch": true});
781781
},
782-
fetchSelectedEventsData: function(context, period) {
782+
fetchSelectedEventsData: function(context, period, selectedEventName, segmentation) {
783+
let _selectedEventName = selectedEventName ? selectedEventName : context.state.selectedEventName;
784+
let _segmentation = segmentation ?
785+
(segmentation === "segment" ? "" : segmentation) :
786+
(context.state.currentActiveSegmentation === "segment" ? "" : context.state.currentActiveSegmentation);
787+
783788
return CV.$.ajax({
784789
type: "GET",
785790
url: countlyCommon.API_PARTS.data.r,
786791
data: {
787792
"app_id": countlyCommon.ACTIVE_APP_ID,
788793
"method": "events",
789-
"event": context.state.selectedEventName,
790-
"segmentation": context.state.currentActiveSegmentation === "segment" ? "" : context.state.currentActiveSegmentation,
794+
"event": _selectedEventName,
795+
"segmentation": _segmentation,
791796
"period": CountlyHelpers.getPeriodUrlQueryParameter(period),
792797
"preventRequestAbort": true
793798
},

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

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* global countlyVue, countlyGlobal, countlyAllEvents, countlyCommon, CountlyHelpers, CV,app*/
1+
/* global countlyVue, countlyGlobal, countlyAllEvents, countlyDrillMeta, countlyCommon, CountlyHelpers, CV,app */
22
(function() {
33
var EventsTable = countlyVue.views.create({
44
template: CV.T("/core/events/templates/eventsTable.html"),
@@ -145,16 +145,119 @@
145145
}
146146
});
147147

148+
var drillEventDrawer = countlyVue.views.create({
149+
template: CV.T("/core/events/templates/drillEventDrawer.html"),
150+
mixins: [countlyVue.mixins.i18n],
151+
props: {
152+
controls: {
153+
type: Object,
154+
required: true
155+
}
156+
},
157+
data: function() {
158+
return {
159+
segmentValues: [],
160+
availableSegments: [],
161+
omittedSegments: {
162+
label: CV.i18n("events.all.omitted.segments"),
163+
options: [],
164+
}
165+
};
166+
},
167+
computed: {
168+
allEvents: function() {
169+
return this.$store.getters["countlyAllEvents/allEventsList"];
170+
}
171+
},
172+
methods: {
173+
onSubmit: function(doc) {
174+
let URLparams = {
175+
event: doc.selectedEventName,
176+
period: doc.period,
177+
dbFilter: {},
178+
byVal: [],
179+
executed: false
180+
};
181+
if (doc.selectedSegment !== "segment") {
182+
URLparams.dbFilter[`sg.${doc.selectedSegment}`] = { "$in": [] };
183+
if (doc.selectedSegmentValues.length > 0) {
184+
URLparams.dbFilter[`sg.${doc.selectedSegment}`].$in = doc.selectedSegmentValues;
185+
}
186+
}
187+
//Go to drill page
188+
app.navigate("#/drill/" + JSON.stringify(URLparams), true);
189+
},
190+
onCopy: function() {
191+
this.fetchSegments();
192+
this.fetchSegmentValues();
193+
},
194+
onClose: function() {
195+
},
196+
onEventChange: function() {
197+
this.$refs.drawerScope.editedObject.selectedSegment = "segment";
198+
this.fetchSegments();
199+
},
200+
fetchSegments: function() {
201+
var self = this;
202+
203+
this.segmentValues = [];
204+
this.$refs.drawerScope.editedObject.selectedSegmentValues = [];
205+
206+
var { selectedEventName, period, selectedSegment } = this.$refs.drawerScope.editedObject;
207+
countlyAllEvents.service.fetchSelectedEventsData(null, period, selectedEventName, selectedSegment)
208+
.then(function(data) {
209+
const segments = (data && data.meta && data.meta.segments) ? data.meta.segments.slice() : [];
210+
segments.sort();
211+
segments.unshift("segment");
212+
self.availableSegments = segments.map(function(item) {
213+
return {
214+
label: item === "segment" ? CV.i18n("events.all.any.segmentation") : item,
215+
value: item
216+
};
217+
});
218+
});
219+
countlyAllEvents.service.fetchAllEventsData(null, period)
220+
.then(function(data) {
221+
const _omittedSegments = countlyAllEvents.helpers.getOmittedSegments(this.selectedEventName, data) || [];
222+
self.omittedSegments.options = _omittedSegments.length === 0 ? [] : _omittedSegments.map(function(item) {
223+
return {
224+
label: item,
225+
value: item
226+
};
227+
});
228+
});
229+
},
230+
fetchSegmentValues: function() {
231+
this.$refs.drawerScope.editedObject.selectedSegmentValues = [];
232+
var { selectedEventName, selectedSegment } = this.$refs.drawerScope.editedObject;
233+
if (selectedSegment !== "segment") {
234+
var self = this;
235+
var drillMeta = countlyDrillMeta.getContext(selectedEventName);
236+
drillMeta.getBigListMetaData('sg.' + selectedSegment, '', function(filters) {
237+
self.segmentValues = filters.map(function(item) {
238+
return {
239+
label: item,
240+
value: item
241+
};
242+
});
243+
});
244+
}
245+
}
246+
}
247+
});
248+
148249
var AllEventsView = countlyVue.views.create({
149250
template: CV.T("/core/events/templates/allEvents.html"),
150251
components: {
151252
"detail-tables": EventsTable,
253+
"drill-event-drawer": drillEventDrawer
152254
},
153255
mixins: [
154256
countlyVue.container.dataMixin({
155257
'externalLinks': '/analytics/events/links'
156258
}),
157-
countlyVue.mixins.commonFormatters
259+
countlyVue.mixins.commonFormatters,
260+
countlyVue.mixins.hasDrawers("drill-event")
158261
],
159262
methods: {
160263
dateChanged: function() {
@@ -167,6 +270,15 @@
167270
return str.replace(/^&#36;/g, "$").replace(/&#46;/g, '.').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&le;/g, '<=').replace(/&ge;/g, '>=').replace(/&amp;/g, '&');
168271
}
169272
return str;
273+
},
274+
openDrillEventDrawer: function() {
275+
let args = {
276+
"selectedEventName": this.selectedEventName,
277+
"selectedSegment": this.currentActiveSegmentation,
278+
"selectedSegmentValues": [],
279+
"period": countlyCommon.getPeriod(),
280+
};
281+
this.openDrawer("drill-event", args);
170282
}
171283
},
172284
computed: {
@@ -324,6 +436,9 @@
324436
},
325437
isChartLoading: function() {
326438
return this.$store.getters["countlyAllEvents/isChartLoading"];
439+
},
440+
isDrillEnabled: function() {
441+
return CountlyHelpers.isPluginEnabled("drill");
327442
}
328443

329444
},

frontend/express/public/core/events/javascripts/countly.overview.views.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,12 @@
151151
},
152152
change: {
153153
type: String
154-
}
154+
},
155+
testId: {
156+
type: String,
157+
default: 'events-breakdown-horizontal-tile-test-id',
158+
required: false
159+
},
155160
},
156161
template: '<div class="cly-events-breakdown-horizontal-tile bu-column">\
157162
<div class="cly-events-breakdown-horizontal-tile__wrapper">\
@@ -165,8 +170,8 @@
165170
<div class="bu-level-left">\
166171
<div class="bu-level-item">\
167172
<slot name="countValue"></slot>\
168-
<span v-if="trend === \'u\'" class="cly-events-breakdown-horizontal-tile__trend cly-trend-up bu-pl-2"><i class="cly-trend-up-icon ion-android-arrow-up"></i>{{change}}</span>\
169-
<span v-else class="cly-events-breakdown-horizontal-tile__trend cly-trend-down bu-pl-2"><i class="cly-trend-down-icon ion-android-arrow-down"></i>{{change}}</span>\
173+
<span v-if="trend === \'u\'" class="cly-events-breakdown-horizontal-tile__trend cly-trend-up bu-pl-2" :data-test-id="testId + \'-trend-value-label\'"><i class="cly-trend-up-icon ion-android-arrow-up" :data-test-id="testId + \'-trend-icon\'"></i>{{change}}</span>\
174+
<span v-else class="cly-events-breakdown-horizontal-tile__trend cly-trend-down bu-pl-2" :data-test-id="testId + \'-trend-value-label\'"><i class="cly-trend-down-icon ion-android-arrow-down" :data-test-id="testId + \'-trend-icon\'"></i>{{change}}</span>\
170175
</div>\
171176
</div>\
172177
<slot name="totalPercentage">\
@@ -187,7 +192,12 @@
187192
},
188193
change: {
189194
type: String
190-
}
195+
},
196+
testId: {
197+
type: String,
198+
default: 'events-breakdown-horizontal-tile-test-id',
199+
required: false
200+
},
191201
},
192202
template: '<div class="cly-monitor-events-breakdown-horizontal-tile bu-column bu-is-6">\
193203
<div class="cly-monitor-events-breakdown-horizontal-tile__wrapper">\
@@ -201,8 +211,8 @@
201211
<div class="bu-level-left">\
202212
<div class="bu-level-item">\
203213
<slot name="countValue"></slot>\
204-
<span v-if="trend === \'u\'" class="cly-trend-up cly-monitor-events-breakdown-horizontal-tile__trend bu-pl-2"><i class="cly-monitor-events-breakdown-horizontal-tile__arrow fas fa-arrow-circle-up"></i>{{change}}</span>\
205-
<span v-else class="cly-trend-down cly-monitor-events-breakdown-horizontal-tile__trend bu-pl-2"><i class="cly-monitor-events-breakdown-horizontal-tile__arrow fas fa-arrow-circle-down"></i>{{change}}</span>\
214+
<span v-if="trend === \'u\'" class="cly-trend-up cly-monitor-events-breakdown-horizontal-tile__trend bu-pl-2" :data-test-id="testId + \'-trend-value-label\'"><i class="cly-monitor-events-breakdown-horizontal-tile__arrow fas fa-arrow-circle-up" :data-test-id="testId + \'-trend-icon\'"></i>{{change}}</span>\
215+
<span v-else class="cly-trend-down cly-monitor-events-breakdown-horizontal-tile__trend bu-pl-2" :data-test-id="testId + \'-trend-value-label\'"><i class="cly-monitor-events-breakdown-horizontal-tile__arrow fas fa-arrow-circle-down" :data-test-id="testId + \'-trend-icon\'"></i>{{change}}</span>\
206216
</div>\
207217
</div>\
208218
</div>\

0 commit comments

Comments
 (0)