Newer
Older
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
Segmentation = (function($) {
Thomas Steur
a validé
function preselectFirstMetricMatch(rowNode)
{
var matchValue = $(rowNode).find('.metricMatchBlock option:first').attr('value');
$(rowNode).find('.metricMatchBlock select').val(matchValue);
}
if (!config.target) {
throw new Error("target property must be set in config to segment editor control element");
}
for (var item in config) {
self.editorTemplate = self.editorTemplate.detach();
self.timer = ""; // variable for further use in timing events
self.searchAllowed = true;
Michal Gazdzik
a validé
self.filterTimer = "";
self.filterAllowed = true;
self.availableMatches = [];
self.availableMatches["metric"] = [];
self.availableMatches["metric"]["=="] = self.translations['General_OperationEquals'];
self.availableMatches["metric"]["!="] = self.translations['General_OperationNotEquals'];
self.availableMatches["metric"]["<="] = self.translations['General_OperationAtMost'];
self.availableMatches["metric"][">="] = self.translations['General_OperationAtLeast'];
self.availableMatches["metric"]["<"] = self.translations['General_OperationLessThan'];
self.availableMatches["metric"][">"] = self.translations['General_OperationGreaterThan'];
self.availableMatches["dimension"]["=="] = self.translations['General_OperationIs'];
self.availableMatches["dimension"]["!="] = self.translations['General_OperationIsNot'];
self.availableMatches["dimension"]["=@"] = self.translations['General_OperationContains'];
self.availableMatches["dimension"]["!@"] = self.translations['General_OperationDoesNotContain'];
segmentation.prototype.setAvailableSegments = function (segments) {
this.availableSegments = segments;
};
if($.browser.mozilla) {
return self.currentSegmentStr;
}
return decodeURIComponent(self.currentSegmentStr);
diosmosis
a validé
segmentation.prototype.setSegment = function(segmentStr){
if(!$.browser.mozilla) {
segmentStr = encodeURIComponent(segmentStr);
}
diosmosis
a validé
this.currentSegmentStr = segmentStr;
segmentation.prototype.shortenSegmentName = function(name, length){
Michal Gazdzik
a validé
if(typeof length === "undefined") length = 18;
if(name.length > length) {
return name.slice(0, length).trim() + "...";
diosmosis
a validé
segmentation.prototype.markCurrentSegment = function(){
var current = this.getSegment();
diosmosis
a validé
var segmentationTitle = $(this.content).find(".segmentationTitle");
Thomas Steur
a validé
var currentDecoded = piwikHelper.htmlDecode(current);
var selector = 'div.segmentList ul li[data-definition="'+currentDecoded+'"]';
diosmosis
a validé
var foundItems = $(selector, this.target);
if( foundItems.length > 0) {
var name = $(foundItems).first().find("span.segname").text();
title.text(name);
title.text("Custom Segment");
segmentationTitle.html(title);
diosmosis
a validé
$(this.content).find(".segmentationTitle").text(this.translations['SegmentEditor_DefaultAllVisits']);
var getAndDiv = function(){
if(typeof andDiv === "undefined"){
var andDiv = self.editorTemplate.find("> div.segment-and").clone();
var orDiv = self.editorTemplate.find("> div.segment-or").clone();
Thomas Steur
a validé
var mockedInputSet = self.editorTemplate.find("div.segment-row-inputs").clone();
var clonedInput = mockedInputSet.clone();
preselectFirstMetricMatch(clonedInput);
return clonedInput;
Thomas Steur
a validé
var mockedInputRow = '<div class="segment-row"><a class="segment-close" href="#"></a><div class="segment-row-inputs">'+getMockedInputSet().html()+'</div></div>';
Thomas Steur
a validé
var mockedFormRow = self.editorTemplate.find("div.segment-rows").clone();
$(mockedFormRow).find(".segment-row").append(getMockedInputSet()).after(getAddOrBlockButtonHtml).after(getOrDiv());
var clonedRow = mockedFormRow.clone();
preselectFirstMetricMatch(clonedRow);
return clonedRow;
var getInitialStateRowsHtml = function(){
if(typeof initialStateRows === "undefined"){
var content = self.editorTemplate.find("div.initial-state-rows").html();
var initialStateRows = $(content).clone();
}
return initialStateRows;
var revokeInitialStateRows = function(){
$(self.form).find(".segment-add-row").remove();
$(self.form).find(".segment-and").remove();
Thomas Steur
a validé
var mockedRow = getMockedFormRow();
$(self.form).find(".segment-content > h3").after(mockedRow);
$(self.form).find(".segment-content").append(getAndDiv());
$(self.form).find(".segment-content").append(getAddNewBlockButtonHtml());
doDragDropBindings();
$(self.form).find(".metricList").val(metric).trigger("change");
Thomas Steur
a validé
preselectFirstMetricMatch(mockedRow);
var appendComplexRowHtml = function(block){
var key;
var newRow = getMockedFormRow();
var x = $(newRow).find(".metricMatchBlock select");
$(newRow).find(".metricListBlock select").val(block[0].metric);
$(newRow).find(".metricMatchBlock select").val(block[0].match);
$(newRow).find(".metricValueBlock input").val(block[0].value);
if(block.length > 1) {
$(newRow).find(".segment-add-or").remove();
for(key = 1; key < block.length;key++) {
var newSubRow = $(getMockedInputRowHtml()).clone();
$(newSubRow).find(".metricListBlock select").val(block[key].metric);
$(newSubRow).find(".metricMatchBlock select").val(block[key].match);
$(newSubRow).find(".metricValueBlock input").val(block[key].value);
$(newRow).append(newSubRow).append(getOrDiv());
}
$(newRow).append(getAddOrBlockButtonHtml());
}
$(self.form).find(".segment-content").append(newRow).append(getAndDiv());
var applyInitialStateModification = function(){
$(self.form).find(".segment-add-row").remove();
$(self.form).find(".segment-content").append(getInitialStateRowsHtml());
doDragDropBindings();
var getSegmentFromId = function (id) {
if(self.availableSegments.length > 0) {
for(var i = 0; i < self.availableSegments.length; i++)
if(segment.idsegment == id) {
return segment;
}
}
}
return false;
var html = self.editorTemplate.find("> .listHtml").clone();
var listHtml = '<li data-idsegment="" ' +
+ ' data-definition=""><span class="segname">' + self.translations['SegmentEditor_DefaultAllVisits']
+ ' ' + self.translations['General_DefaultAppended']
+ '</span></li> ';
for(var i = 0; i < self.availableSegments.length; i++)
injClass = 'class="segmentSelected"';
listHtml += '<li data-idsegment="'+segment.idsegment+'" data-definition="'+ (segment.definition).replace(/"/g, '"') +'" '
+ injClass +' title="'+segment.name+'"><span class="segname">'
+ self.shortenSegmentName(segment.name)+'</span>';
if(self.segmentAccess == "write") {
listHtml += '<span class="editSegment" title="'+ self.translations['General_Edit'].toLocaleLowerCase() +'"></span>';
}
listHtml += '</li>';
}
$(html).find(".segmentList > ul").append(listHtml);
if(self.segmentAccess === "write"){
$(html).find(".add_new_segment").html(self.translations['SegmentEditor_AddNewSegment']);
else {
}
}
else
{
$(html).find(".segmentList > ul").append(listHtml);
}
return html;
var html = self.editorTemplate.find("> .segment-element").clone();
var segmentsDropdown = $(html).find(".available_segments_select");
newOption = '<option data-idsegment="" data-definition="" title="'
+ self.translations['SegmentEditor_AddNewSegment']
+ '">' + self.translations['SegmentEditor_AddNewSegment']
+ '</option>';
for(var i = 0; i < self.availableSegments.length; i++)
newOption = '<option data-idsegment="'+segment.idsegment+'" data-definition="'+(segment.definition).replace(/"/g, '"')+'" title="'+segment.name+'">'+self.shortenSegmentName(segment.name)+'</option>';
segmentsDropdown.append(newOption);
}
$(html).find(".segment-content > h3").after(getInitialStateRowsHtml()).show();
return html;
$(".segmentationContainer", self.target).each(function() {
if($(this).closest('.segmentEditorPanel').hasClass("visible"))
var findAndExplodeByMatch = function(metric){
var matches = ["==" , "!=" , "<=", ">=", "=@" , "!@","<",">"];
var newMetric = {};
var minPos = metric.length;
var match, index;
var singleChar = false;
for(var key=0; key < matches.length; key++)
{
match = matches[key];
index = metric.indexOf(match);
if( index != -1){
if(index < minPos){
minPos = index;
singleChar = true;
}
}
}
}
if(minPos < metric.length){
// sth found - explode
if(singleChar == true){
newMetric.metric = metric.substr(0,minPos);
newMetric.match = metric.substr(minPos,1);
newMetric.value = metric.substr(minPos+1);
} else {
newMetric.metric = metric.substr(0,minPos);
newMetric.match = metric.substr(minPos,2);
newMetric.value = metric.substr(minPos+2);
}
// if value is only "" -> change to empty string
if(newMetric.value == '""')
{
newMetric.value = "";
}
}
var parseSegmentStr = function(segmentStr)
{
var blocks;
blocks = segmentStr.split(";");
for(var key in blocks){
blocks[key] = blocks[key].split(",");
for(var innerkey = 0; innerkey < blocks[key].length; innerkey++){
blocks[key][innerkey] = findAndExplodeByMatch(blocks[key][innerkey]);
}
}
return blocks;
$(self.form).find(".segment-content > h3 > span").text(segment.name);
$(self.form).find('.available_segments_select > option[data-idsegment="'+segment.idsegment+'"]').prop("selected",true);
$(self.form).find('.available_segments a.dropList').text(self.shortenSegmentName(segment.name));
if(segment.definition != ""){
revokeInitialStateRows();
var blocks = parseSegmentStr(segment.definition);
for(var key in blocks){
appendComplexRowHtml(blocks[key]);
}
$(self.form).find(".segment-content").append(getAddNewBlockButtonHtml());
}
$(self.form).find(".metricList").each( function(){
$(this).trigger("change", true);
});
doDragDropBindings();
Michal Gazdzik
a validé
var filterSegmentList = function (keyword) {
var curTitle;
clearFilterSegmentList();
$(self.target).find(" .filterNoResults").remove();
$(self.target).find(".segmentList li").each(function () {
curTitle = $(this).prop('title');
$(this).hide();
Michal Gazdzik
a validé
$(this).show();
}
});
if ($(self.target).find(".segmentList li:visible").length == 0) {
$(self.target).find(".segmentList li:first")
.before("<li class=\"filterNoResults grayed\">" + self.translations['General_SearchNoResults'] + "</li>");
}
}
var clearFilterSegmentList = function () {
$(self.target).find(" .filterNoResults").remove();
$(self.target).find(".segmentList li").each(function () {
$(this).show();
});
}
var bindEvents = function () {
self.target.on('click', '.segmentationContainer', function (e) {
if (self.content.closest('.segmentEditorPanel').hasClass("visible")) {
Michal Gazdzik
a validé
if ($(e.target).hasClass("jspDrag") === true
|| $(e.target).hasClass("segmentFilterContainer") === true
|| $(e.target).parents().hasClass("segmentFilterContainer") === true
|| $(e.target).hasClass("filterNoResults")) {
e.stopPropagation();
} else {
self.target.closest('.segmentEditorPanel').removeClass('visible');
} else {
// for each visible segmentationContainer -> trigger click event to close and kill scrollpane - very important !
closeAllOpenLists();
self.target.closest('.segmentEditorPanel').addClass('visible');
Michal Gazdzik
a validé
self.target.find('.segmentFilter').val(self.translations['General_Search']).trigger('keyup');
self.jscroll = self.target.find(".segmentList").jScrollPane({
autoReinitialise: true,
showArrows:true
}).data().jsp;
self.target.on('click', '.editSegment', function(e) {
$(this).closest(".segmentationContainer").trigger("click");
self.target.on("click", ".segmentList li", function (e) {
if ($(e.currentTarget).hasClass("grayed") !== true) {
var segment = {};
segment.idsegment = $(this).attr("data-idsegment");
diosmosis
a validé
self.setSegment(segment.definition);
self.markCurrentSegment();
toggleLoadingMessage(segment.definition.length);
self.target.on('click', '.add_new_segment', function (e) {
closeAllOpenLists();
addForm("new");
doDragDropBindings();
});
self.target.on('change', "select.metricList", function (e, persist) {
if (typeof persist === "undefined") {
persist = false;
}
Thomas Steur
a validé
alterMatchesList(this, true);
doDragDropBindings();
autoSuggestValues(this, persist);
});
Michal Gazdzik
a validé
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
// attach event that will clear segment list filtering input after clicking x
self.target.on('click', ".segmentFilterContainer span", function (e) {
$(e.target).parent().find(".segmentFilter").val(self.translations['General_Search']).trigger('keyup');
});
self.target.on('blur', ".segmentFilter", function (e) {
if ($(e.target).parent().find(".segmentFilter").val() == "") {
$(e.target).parent().find(".segmentFilter").val(self.translations['General_Search'])
}
});
self.target.on('click', ".segmentFilter", function (e) {
if ($(e.target).val() == self.translations['General_Search']) {
$(e.target).val("");
}
});
self.target.on('keyup', ".segmentFilter", function (e) {
var search = $(e.currentTarget).val();
if (search == self.translations['General_Search']) {
search = "";
}
if (search.length >= 2) {
clearTimeout(self.filterTimer);
self.filterAllowed = true;
self.filterTimer = setTimeout(function () {
filterSegmentList(search);
}, 500);
}
else {
self.filterTimer = false;
clearFilterSegmentList();
}
});
//
// segment editor form events
//
self.target.on('click', ".segment-element a:not(.crowdfundingLink)", function (e) {
e.preventDefault();
});
self.target.on('click', "a.editSegmentName", function (e) {
var oldName = $(e.currentTarget).parents("h3").find("span").text();
$(e.currentTarget).parents("h3").find("span").hide();
$(e.currentTarget).hide();
$(e.currentTarget).before('<input class="edit_segment_name" type="text"/>');
$(e.currentTarget).siblings(".edit_segment_name").focus().val(oldName);
});
self.target.on("click", ".segmentName", function(e) {
$(self.form).find("a.editSegmentName").trigger('click');
});
self.target.on('blur', "input.edit_segment_name", function (e) {
var newName = $(this).val();
var segmentNameNode = $(e.currentTarget).parents("h3").find("span");
if(newName.trim()) {
segmentNameNode.text(newName);
} else {
$(this).val(segmentNameNode.text());
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
}
});
self.target.on('click', '.segment-element', function (e) {
e.stopPropagation();
e.preventDefault();
});
self.target.on('change', '.available_segments_select', function (e) {
var option = $(e.currentTarget).find('option:selected');
openEditFormGivenSegment(option);
});
// attach event that shows/hides child elements of each metric category
self.target.on('click', '.segment-nav a.metric_category', function (e) {
$(e.currentTarget).siblings("ul").toggle();
});
self.target.on('click', ".custom_select_search a", function (e) {
$(self.form).find(".segmentSearch").val("").trigger("keyup").val(self.translations['General_Search']);
});
// attach event that will clear search input upon focus if its content is default
self.target.on('focus', '.segmentSearch', function (e) {
var search = $(e.currentTarget).val();
if(search == self.translations['General_Search'])
$(e.currentTarget).val("");
});
// attach event that will set search input value upon blur if its content is not null
self.target.on('blur', '.segmentSearch', function (e) {
var search = $(e.currentTarget).val();
if(search == ""){
clearSearchMetricHighlight();
$(e.currentTarget).val(self.translations['General_Search']);
}
});
// bind search action triggering - only when input text is longer than 2 chars
self.target.on('keyup', '.segmentSearch', function (e) {
var search = $(e.currentTarget).val();
if( search.length >= 2)
{
clearTimeout(self.timer);
self.searchAllowed = true;
self.timer = setTimeout(function(){
searchSegments(search);
}, 500);
}
else{
self.searchAllowed = false;
clearSearchMetricHighlight();
}
});
self.target.on('click', ".delete", function() {
var segmentName = $(self.form).find(".segment-content > h3 > span").text();
var segmentId = $(self.form).find(".available_segments_select option:selected").attr("data-idsegment");
var params = {
"idsegment" : segmentId
};
$('.segment-delete-confirm', self.target).find('#name').text( segmentName );
if(segmentId != ""){
piwikHelper.modalConfirm(self.target.find('.segment-delete-confirm'), {
yes: function(){
self.deleteMethod(params);
}
});
}
});
self.target.on("click", "a.close", function (e) {
$(".segmentListContainer", self.target).show();
closeForm();
});
$("body").on("keyup", function (e) {
if(e.keyCode == "27"){
$(".segmentListContainer", self.target).show();
closeForm();
}
});
//
// segment manipulation events
//
// upon clicking - add new segment block, then bind 'x' action to newly added row
self.target.on('click', ".segment-add-row a", function(event, data){
Thomas Steur
a validé
var mockedRow = getMockedFormRow();
$(self.form).find(".segment-and:last").after(getAndDiv()).after(mockedRow);
if(typeof data !== "undefined"){
$(self.form).find(".metricList:last").val(data);
}
$(self.form).find(".metricList:last").trigger('change');
Thomas Steur
a validé
preselectFirstMetricMatch(mockedRow);
doDragDropBindings();
});
self.target.on("click", ".segment-add-row span", function(event, data){
if(typeof data !== "undefined") {
Thomas Steur
a validé
var mockedRow = getMockedFormRow();
$(self.form).find(".segment-and:last").after(getAndDiv()).after(mockedRow);
preselectFirstMetricMatch(mockedRow);
$(self.form).find(".metricList:last").val(data).trigger('change');
doDragDropBindings();
}
});
// add new OR block
Thomas Steur
a validé
self.target.on("click", ".segment-add-or a", function(event, data){
var parentRows = $(event.currentTarget).parents(".segment-rows");
parentRows.find(".segment-or:last").after(getOrDiv()).after(getMockedInputRowHtml());
if(typeof data !== "undefined"){
Thomas Steur
a validé
parentRows.find(".metricList:last").val(data);
}
Thomas Steur
a validé
parentRows.find(".metricList:last").trigger('change');
var addedRow = parentRows.find('.segment-row:last');
preselectFirstMetricMatch(addedRow);
doDragDropBindings();
});
self.target.on("click", ".segment-close", function (e) {
var target = e.currentTarget;
var rowCnt = $(target).parents(".segment-rows").find(".segment-row").length;
var globalRowCnt = $(self.form).find(".segment-close").length;
if(rowCnt > 1){
$(target).parents(".segment-row").next().remove();
$(target).parents(".segment-row").remove();
}
else if(rowCnt == 1){
$(target).parents(".segment-rows").next().remove();
$(target).parents(".segment-rows").remove();
if(globalRowCnt == 1){
applyInitialStateModification();
}
}
});
// Request auto-suggest values
var autoSuggestValues = function(select, persist) {
var type = $(select).find("option:selected").attr("value");
if(!persist) {
var parents = $(select).parents('.segment-row');
var loadingElement = parents.find(".segment-loading");
loadingElement.show();
var inputElement = parents.find(".metricValueBlock input");
var segmentName = $('option:selected',select).attr('value');
var ajaxHandler = new ajaxHelper();
ajaxHandler.addParams({
module: 'API',
format: 'json',
method: 'API.getSuggestedValuesForSegment',
segmentName: segmentName
Thomas Steur
a validé
ajaxHandler.useRegularCallbackInCaseOfError = true;
Thomas Steur
a validé
ajaxHandler.setTimeout(20000);
ajaxHandler.setErrorCallback(function(response) {
loadingElement.hide();
inputElement.autocomplete({
source: [],
minLength: 0
});
$(inputElement).autocomplete('search', $(inputElement).val());
});
ajaxHandler.setCallback(function(response) {
loadingElement.hide();
Thomas Steur
a validé
if (response && response.result != 'error') {
inputElement.autocomplete({
source: response,
minLength: 0,
select: function(event, ui){
event.preventDefault();
$(inputElement).val(ui.item.value);
}
});
}
inputElement.click(function (e) {
$(inputElement).autocomplete('search', $(inputElement).val());
ajaxHandler.send();
var alterMatchesList = function(select, persist){
var oldMatch;
var type = $(select).find("option:selected").attr("data-type");
var matchSelector = $(select).parents(".segment-input").siblings(".metricMatchBlock").find("select");
if(persist === true){
oldMatch = matchSelector.find("option:selected").val();
} else {
if(type === "dimension" || type === "metric"){
matchSelector.empty();
var optionsHtml = "";
for(var key in self.availableMatches[type]){
optionsHtml += '<option value="'+key+'">'+self.availableMatches[type][key]+'</option>';
}
}
Thomas Steur
a validé
Thomas Steur
a validé
if (matchSelector.find('option[value="' + oldMatch + '"]').length) {
Thomas Steur
a validé
matchSelector.val(oldMatch);
} else {
preselectFirstMetricMatch(matchSelector.parent());
}
var getAddNewBlockButtonHtml = function()
{
if(typeof addNewBlockButton === "undefined")
{
var addNewBlockButton = self.editorTemplate.find("> div.segment-add-row").clone();
if(typeof addOrBlockButton === "undefined") {
var addOrBlockButton = self.editorTemplate.find("div.segment-add-or").clone();
var placeSegmentationFormControls = function(){
doDragDropBindings();
$(self.form).find(".scrollable").jScrollPane({
showArrows: true,
autoReinitialise: true,
verticalArrowPositions: 'os',
horizontalArrowPositions: 'os'
});
function openEditFormGivenSegment(option) {
var segment = {};
segment.idsegment = option.attr("data-idsegment");
var segmentExtra = getSegmentFromId(segment.idsegment);
for(var item in segmentExtra)
{
segment[item] = segmentExtra[item];
}
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
var doDragDropBindings = function(){
$(self.form).find(".segment-nav div > ul > li > ul > li").sortable({
cursor: 'move',
revert: 10,
revertDuration: 0,
snap: false,
helper: 'clone',
appendTo: 'body'
});
$(self.form).find(".metricListBlock").droppable({
hoverClass: "hovered",
drop: function( event, ui ) {
$(this).find("select").val(ui.draggable.parent().attr("data-metric")).trigger("change");
}
});
$(self.form).find(".segment-add-row > div").droppable({
hoverClass: "hovered",
drop: function( event, ui ) {
$(this).find("a").trigger("click", [ui.draggable.parent().attr("data-metric")]);
if($(this).find("a > span").length == 0){
revokeInitialStateRows();
appendSpecifiedRowHtml([ui.draggable.parent().attr("data-metric")]);
}
}
});
$(self.form).find(".segment-add-or > div").droppable({
hoverClass: "hovered",
drop: function( event, ui ) {
$(this).find("a").trigger("click", [ui.draggable.parent().attr("data-metric")]);
}
});
// pre-process search string to normalized form
// ---
// clear all previous search highlights and hide all categories
// to allow further showing only matching ones, while others remain invisible
clearSearchMetricHighlight();
$(self.form).find('.segment-nav div > ul > li').hide();
var curMetric = "";
// 1 - do most obvious selection -> mark whole categories matching search string
// also expand whole category
curStr = normalizeSearchString($(this).find("a.metric_category").text());
if(curStr.indexOf(search) > -1) {
$(this).addClass("searchFound");
$(this).find("ul").show();
$(this).find("li").show();
$(this).show();
}
// 2 - among all unselected categories find metrics which match and mark parent as search result
$(self.form).find(".segment-nav div > ul > li:not(.searchFound)").each(function(){
var parent = this;
$(this).find("li").each( function(){
var curStr = normalizeSearchString($(this).text());
var curMetric = normalizeSearchString($(this).attr("data-metric"));
$(this).hide();
if(curStr.indexOf(search) > -1 || curMetric.indexOf(search) > -1){
$(this).show();
$(parent).find("ul").show();
$(parent).addClass("searchFound").show();
}
});
});
$(self.form).find("div > ul").prepend('<li class="no_results"><a>'+self.translations['General_SearchNoResults']+'</a></li>').show();
}
// check if search allow flag was revoked - then clear all search results
if(self.searchAllowed == false)
{
clearSearchMetricHighlight();
self.searchAllowed = true;
}
var clearSearchMetricHighlight = function(){
$(self.form).find('.no_results').remove();
$(self.form).find('.segment-nav div > ul > li').removeClass("searchFound").show();
$(self.form).find('.segment-nav div > ul > li').removeClass("others").show();
$(self.form).find('.segment-nav div > ul > li > ul > li').show();
$(self.form).find('.segment-nav div > ul > li > ul').hide();
var normalizeSearchString = function(search){
search = search.replace(/^\s+|\s+$/g, ''); // trim
search = search.toLowerCase();
// remove accents, swap ñ for n, etc
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
var to = "aaaaeeeeiiiioooouuuunc------";
for (var i=0, l=from.length ; i<l ; i++) {
search = search.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
search = search.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
.replace(/\s+/g, '_') // collapse whitespace and replace by underscore
.replace(/-+/g, '-'); // collapse dashes
return search;
self.target.find(".segment-element:visible").unbind().remove();
if (typeof self.form !== "undefined") {
closeForm();
}
// remove any remaining forms
self.form = getFormHtml();
self.target.prepend(self.form);
diosmosis
a validé
// if there's enough space to the left & not enough space to the right,
// anchor the form to the right of the selector
if (self.form.width() + self.target.offset().left > $(window).width()
&& self.form.width() < self.target.offset().left + self.target.width()
) {
self.form.addClass('anchorRight');
}
placeSegmentationFormControls();
$(self.form).find('.enable_all_users_select > option[value="'+segment.enable_all_users+'"]').prop("selected",true);
$(self.form).find('.visible_to_website_select > option[value="'+segment.enable_only_idsite+'"]').prop("selected",true);
$(self.form).find('.auto_archive_select > option[value="'+segment.auto_archive+'"]').prop("selected",true);
makeDropList(".enable_all_users" , ".enable_all_users_select");
makeDropList(".visible_to_website" , ".visible_to_website_select");
makeDropList(".auto_archive" , ".auto_archive_select");
makeDropList(".available_segments" , ".available_segments_select");
$(self.form).find(".saveAndApply").bind("click", function (e) {
$(self.form).find('.segment-footer').hover( function() {
$('.segmentFooterNote', self.target).fadeIn();
}, function() {
$('.segmentFooterNote', self.target).fadeOut();
});
if(typeof mode !== "undefined" && mode == "new")
{
$(self.form).find(".editSegmentName").trigger('click');
}
$(".segmentListContainer", self.target).hide();
self.target.closest('.segmentEditorPanel').addClass('editing');
Thomas Steur
a validé
piwikHelper.compileAngularComponents(self.target);
};
var closeForm = function () {
$(self.form).unbind().remove();
self.target.closest('.segmentEditorPanel').removeClass('editing');
var parseForm = function(){
var segmentStr = "";
$(self.form).find(".segment-rows").each( function(){
var subSegmentStr = "";
$(this).find(".segment-row").each( function(){
if(subSegmentStr != ""){
subSegmentStr += ","; // OR operator
}
$(this).find(".segment-row-inputs").each( function(){
var metric = $(this).find(".metricList option:selected").val();
var match = $(this).find(".metricMatchBlock > select option:selected").val();
var value = $(this).find(".segment-input input").val();
subSegmentStr += metric + match + encodeURIComponent(value);
});
});
if(segmentStr != "")
{
segmentStr += ";"; // add AND operator between segment blocks
}
segmentStr += subSegmentStr;
});
return segmentStr
var parseFormAndSave = function(){
var segmentName = $(self.form).find(".segment-content > h3 >span").text();
var segmentStr = parseForm();
var segmentId = $(self.form).find('.available_segments_select > option:selected').attr("data-idsegment");
var user = $(self.form).find(".enable_all_users_select option:selected").val();
var autoArchive = $(self.form).find(".auto_archive_select option:selected").val() || 0;
var params = {
"name": segmentName,
"definition": segmentStr,
"enabledAllUsers": user,
"idSite": $(self.form).find(".visible_to_website_select option:selected").val()
// determine if save or update should be performed
if(segmentId === ""){
self.addMethod(params);
}
else{
jQuery.extend(params, {
"idSegment": segmentId
});
self.updateMethod(params);
}