site-accueil-insa/matomo/plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js

224 lines
7.7 KiB
JavaScript

/*!
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
(function () {
angular.module('piwikApp').controller('SegmentGeneratorController', SegmentGeneratorController);
SegmentGeneratorController.$inject = ['$scope', 'piwik', 'piwikApi', 'segmentGeneratorModel', '$filter', '$timeout'];
function SegmentGeneratorController($scope, piwik, piwikApi, segmentGeneratorModel, $filter, $timeout) {
var translate = $filter('translate');
var self = this;
var firstSegment = '';
var firstMatch = '';
this.conditions = [];
this.model = segmentGeneratorModel;
this.segments = {};
this.matches = {
metric: [
{key: '==', value: translate('General_OperationEquals')},
{key: '!=', value: translate('General_OperationNotEquals')},
{key: '<=', value: translate('General_OperationAtMost')},
{key: '>=', value: translate('General_OperationAtLeast')},
{key: '<', value: translate('General_OperationLessThan')},
{key: '>', value: translate('General_OperationGreaterThan')}
],
dimension: [
{key: '==', value: translate('General_OperationIs')},
{key: '!=', value: translate('General_OperationIsNot')},
{key: '=@', value: translate('General_OperationContains')},
{key: '!@', value: translate('General_OperationDoesNotContain')},
{key: '=^', value: translate('General_OperationStartsWith')},
{key: '=$', value: translate('General_OperationEndsWith')}
],
};
this.matches[''] = this.matches.dimension;
this.andConditionLabel = '';
this.addNewAndCondition = function () {
var condition = {orConditions: []};
this.addAndCondition(condition);
this.addNewOrCondition(condition);
return condition;
};
this.addAndCondition = function (condition) {
this.andConditionLabel = translate('SegmentEditor_OperatorAND');
this.conditions.push(condition);
this.updateSegmentDefinition();
}
this.addNewOrCondition = function (condition) {
var orCondition = {
segment: firstSegment,
matches: firstMatch,
value: ''
};
this.addOrCondition(condition, orCondition);
};
this.addOrCondition = function (condition, orCondition) {
orCondition.isLoading = false;
orCondition.id = generateUniqueId();
condition.orConditions.push(orCondition);
this.updateSegmentDefinition();
$timeout(function () {
self.updateAutocomplete(orCondition);
});
};
this.updateAutocomplete = function (orCondition) {
orCondition.isLoading = true;
this.updateSegmentDefinition();
var inputElement = $('.orCondId' + orCondition.id + " .metricValueBlock input");
inputElement.autocomplete({
source: [],
minLength: 0
});
var resolved = false;
var promise = piwikApi.fetch({
module: 'API',
format: 'json',
method: 'API.getSuggestedValuesForSegment',
segmentName: orCondition.segment
}, {createErrorNotification: false});
promise.then(function(response) {
orCondition.isLoading = false;
resolved = true;
var inputElement = $('.orCondId' + orCondition.id + " .metricValueBlock input");
if (response && response.result != 'error') {
inputElement.autocomplete({
source: response,
minLength: 0,
select: function(event, ui){
event.preventDefault();
orCondition.value = ui.item.value;
self.updateSegmentDefinition();
$timeout(function () {
$scope.$apply();
});
}
});
}
inputElement.off('click');
inputElement.click(function (e) {
$(inputElement).autocomplete('search', orCondition.value);
});
}, function(response) {
resolved = true;
orCondition.isLoading = false;
var inputElement = $('.orCondId' + orCondition.id + " .metricValueBlock input");
inputElement.autocomplete({
source: [],
minLength: 0
});
$(inputElement).autocomplete('search', orCondition.value);
});
$timeout(function () {
if (!resolved) {
promise.abort();
}
}, 20000);
};
this.removeOrCondition = function (condition, orCondition) {
var index = condition.orConditions.indexOf(orCondition);
if (index > -1) {
condition.orConditions.splice(index, 1);
}
if (condition.orConditions.length === 0) {
var index = self.conditions.indexOf(condition);
if (index > -1) {
self.conditions.splice(index, 1);
}
if (self.conditions.length === 0) {
self.andConditionLabel = '';
}
}
this.updateSegmentDefinition();
};
this.getSegmentString = function () {
};
this.updateSegmentDefinition = function () {
$scope.segmentDefinition = this.getSegmentString();
};
if ($scope.segmentDefinition) {
this.setSegmentString($scope.segmentDefinition);
}
$scope.$watch('idsite', function (newValue, oldValue) {
if (newValue != oldValue) {
reloadSegments(newValue, $scope.visitSegmentsOnly);
}
});
reloadSegments($scope.idsite, $scope.visitSegmentsOnly);
function reloadSegments(idsite, visitSegmentsOnly) {
segmentGeneratorModel.loadSegments(idsite, visitSegmentsOnly).then(function (segments) {
self.segmentList = [];
var groups = {};
angular.forEach(segments, function (segment) {
if (!segment.category) {
segment.category = 'Others';
}
if (!firstSegment) {
firstSegment = segment.segment;
if (segment.type && self.matches[segment.type]) {
firstMatch = self.matches[segment.type][0].key;
} else {
firstMatch = self.matches[''][0].key
}
}
self.segments[segment.segment] = segment;
var segmentData = {group: segment.category, key: segment.segment, value: segment.name};
if ('acceptedValues' in segment && segment.acceptedValues) {
segmentData.tooltip = stripTags(segment.acceptedValues);
}
self.segmentList.push(segmentData);
});
if ($scope.addInitialCondition && self.conditions.length === 0) {
self.addNewAndCondition();
}
});
}
}
})();