forked from rebillar/site-accueil-insa
224 lines
7.7 KiB
JavaScript
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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
})();
|