| |
| |
| |
| |
| |
| |
|
|
| (function ($, require) { |
|
|
| var exports = require('piwik/UI'), |
| DataTable = exports.DataTable, |
| dataTablePrototype = DataTable.prototype; |
|
|
| |
| function getLevelFromClass(style) { |
| if (!style || typeof style == "undefined") return 0; |
|
|
| var currentLevel = 0; |
|
|
| var currentLevelIndex = style.indexOf('level'); |
| if (currentLevelIndex >= 0) { |
| currentLevel = Number(style.slice(currentLevelIndex + 5, currentLevelIndex + 6)); |
| } |
| return currentLevel; |
| } |
|
|
| |
| |
| |
| |
| |
| exports.ActionsDataTable = function (element) { |
| this.parentAttributeParent = ''; |
| this.parentId = ''; |
| this.disabledRowDom = {}; |
|
|
| DataTable.call(this, element); |
| }; |
|
|
| $.extend(exports.ActionsDataTable.prototype, dataTablePrototype, { |
|
|
| |
| bindEventsAndApplyStyle: function (domElem, rows) { |
| var self = this; |
|
|
| self.cleanParams(); |
| self.preBindEventsAndApplyStyleHook(domElem, rows); |
|
|
| if (!rows) { |
| rows = $('tr', domElem); |
| } |
|
|
| self.numberOfSubtables = rows.filter('.subDataTable').click(function () { |
| if (!self.param.filter_pattern_recursive) { |
| |
| |
| |
| self.onClickActionSubDataTable(this); |
| } |
| }).length; |
| self.applyCosmetics(domElem, rows); |
| self.handleColumnHighlighting(domElem); |
| self.handleRowActions(domElem, rows); |
| self.handleLimit(domElem); |
| self.handlePeriod(domElem); |
| self.handleAnnotationsButton(domElem); |
| self.handleExportBox(domElem); |
| self.handleSort(domElem); |
| self.handleOffsetInformation(domElem); |
| if (self.workingDivId != undefined) { |
| var dataTableLoadedProxy = function (response) { |
| self.dataTableLoaded(response, self.workingDivId); |
| }; |
|
|
| self.handleConfigurationBox(domElem, dataTableLoadedProxy); |
| self.handleSearchBox(domElem, dataTableLoadedProxy); |
| } |
|
|
| self.handleColumnDocumentation(domElem); |
| self.handleRelatedReports(domElem); |
| self.handleTriggeredEvents(domElem); |
| self.handleCellTooltips(domElem); |
| self.setFixWidthToMakeEllipsisWork(domElem); |
| self.handleSummaryRow(domElem); |
| self.openSubtableFromLevel0IfOnlyOneSubtableGiven(domElem); |
| self.postBindEventsAndApplyStyleHook(domElem, rows); |
| }, |
|
|
| openSubtableFromLevel0IfOnlyOneSubtableGiven: function (domElem) { |
| var $subtables = domElem.find('.subDataTable'); |
| var hasOnlyOneSubtable = $subtables.length === 1; |
|
|
| if (hasOnlyOneSubtable) { |
| var hasOnlyOneRow = domElem.find('tbody tr.level0').length === 1; |
|
|
| if (hasOnlyOneRow) { |
| var $labels = $subtables.find('.label'); |
| if ($labels.length) { |
| $labels.first().click(); |
| } |
| } |
| } |
| }, |
|
|
| openSubtableFromSubtableIfOnlyOneSubtableGiven: function (domElem) { |
| var hasOnlyOneRow = domElem.length === 1; |
| var hasOnlyOneSubtable = domElem.hasClass('subDataTable'); |
|
|
| if (hasOnlyOneRow && hasOnlyOneSubtable) { |
| |
| var $labels = domElem.find('.label'); |
| if ($labels.length) { |
| $labels.first().click(); |
| } |
| } |
| }, |
|
|
| |
| applyCosmetics: function (domElem, rows) { |
| var self = this; |
| var rowsWithSubtables = rows.filter('.subDataTable'); |
|
|
| rowsWithSubtables.css('font-weight', 'bold'); |
|
|
| $("th:first-child", domElem).addClass('label'); |
| $(rowsWithSubtables) |
| .each(function () { |
| if (self.param.filter_pattern_recursive) { |
| $(this).addClass('expanded'); |
| |
| $(this).attr('title', ''); |
| } |
| }); |
|
|
| var rootRow = rows.first().prev(); |
|
|
| |
| |
| var level = rootRow.length ? getLevelFromClass(rootRow.attr('class')) + 1 : 0; |
|
|
| rows.each(function () { |
| var currentStyle = $(this).attr('class') || ''; |
|
|
| if (currentStyle.indexOf('level') == -1) { |
| $(this).addClass('level' + level); |
| } |
|
|
| |
| |
| |
| $(this).prop('parent', function () { |
| return self.parentAttributeParent + ' ' + self.parentId; |
| }); |
| }); |
|
|
| self.addOddAndEvenClasses(domElem); |
| }, |
|
|
| addOddAndEvenClasses: function(domElem) { |
| |
| }, |
|
|
| handleRowActions: function (domElem, rows) { |
| this.doHandleRowActions(rows); |
| }, |
|
|
| |
| onClickActionSubDataTable: function (domElem) { |
| var self = this; |
|
|
| |
| var idSubTable = $(domElem).attr('id'); |
|
|
| var divIdToReplaceWithSubTable = 'subDataTable_' + idSubTable; |
|
|
| var $insertAfter = $(domElem).nextUntil(':not(.comparePeriod):not(.comparisonRow)').last(); |
| if (!$insertAfter.length) { |
| $insertAfter = $(domElem); |
| } |
|
|
| var NextStyle = $insertAfter.next().attr('class'); |
| var CurrentStyle = $(domElem).attr('class'); |
|
|
| var currentRowLevel = getLevelFromClass(CurrentStyle); |
| var nextRowLevel = getLevelFromClass(NextStyle); |
|
|
| |
| |
| |
| if (currentRowLevel >= nextRowLevel) { |
| |
| $(domElem).off('click'); |
| self.disabledRowDom = $(domElem); |
|
|
| var numberOfColumns = $(domElem).children().length; |
| $insertAfter.after('\ |
| <tr id="' + divIdToReplaceWithSubTable + '" class="cellSubDataTable">\ |
| <td colspan="' + numberOfColumns + '">\ |
| <span class="loadingPiwik" style="display:inline">\ |
| <span class="matomo-loader"><span></span><span></span><span></span></span>\ |
| Loading...\ |
| </span>\ |
| </td>\ |
| </tr>\ |
| '); |
| var savedActionVariable = self.param.action; |
|
|
| |
| var filtersToRestore = self.resetAllFilters(); |
|
|
| |
| this.param['filter_sort_column'] = filtersToRestore['filter_sort_column']; |
| this.param['filter_sort_order'] = filtersToRestore['filter_sort_order']; |
| this.param['enable_filter_excludelowpop'] = filtersToRestore['enable_filter_excludelowpop']; |
|
|
| self.param.idSubtable = idSubTable; |
| self.param.action = self.props.subtable_controller_action; |
|
|
| var extraParams = {}; |
| extraParams.comparisonIdSubtables = self.getComparisonIdSubtables($(domElem)); |
|
|
| self.reloadAjaxDataTable(false, function (resp) { |
| self.actionsSubDataTableLoaded(resp, idSubTable); |
| self.repositionRowActions($(domElem)); |
| }, extraParams); |
| self.param.action = savedActionVariable; |
|
|
| self.restoreAllFilters(filtersToRestore); |
|
|
| delete self.param.idSubtable; |
| } |
| |
| else { |
| var isExpanded = $(domElem).hasClass('subDataTable') && $(domElem).hasClass('expanded'); |
|
|
| $(domElem).siblings().each(function () { |
| var parents = $(this).prop('parent').split(' '); |
| if (parents) { |
| if (parents.indexOf(idSubTable) >= 0 |
| || parents.indexOf('subDataTable_' + idSubTable) >= 0) { |
| if (!isExpanded) { |
| $(this).css('display', '').removeClass('hidden'); |
|
|
| |
| var NextStyle = $(this).next().attr('class'); |
| var CurrentStyle = $(this).attr('class'); |
|
|
| var currentRowLevel = getLevelFromClass(CurrentStyle); |
| var nextRowLevel = getLevelFromClass(NextStyle); |
|
|
| if (currentRowLevel < nextRowLevel) { |
| $(this).addClass('expanded'); |
| } |
| } |
| else { |
| $(this).css('display', 'none').addClass('hidden'); |
| } |
| self.repositionRowActions($(domElem)); |
| } |
| } |
| }); |
|
|
| self.$element.trigger('piwik:actionsSubTableToggled'); |
| } |
|
|
| |
| $(domElem).toggleClass('expanded'); |
| }, |
|
|
| |
| dataTableLoaded: function (response, workingDivId) { |
| var content = $(response); |
| var idToReplace = workingDivId || $(content).attr('id'); |
|
|
| |
| self.parentAttributeParent = ''; |
| self.parentId = ''; |
|
|
| var dataTableSel = $('#' + idToReplace); |
|
|
| |
| var oldReportsElem = $('.datatableRelatedReports', dataTableSel); |
| $('.datatableRelatedReports', content).replaceWith(oldReportsElem); |
|
|
| dataTableSel.replaceWith(content); |
|
|
| content.trigger('piwik:dataTableLoaded'); |
|
|
| piwikHelper.compileVueEntryComponents(content); |
|
|
| piwikHelper.lazyScrollTo(content[0], 400); |
|
|
| return content; |
| }, |
|
|
| |
| actionsSubDataTableLoaded: function (response, idSubTable) { |
| var self = this; |
| var idToReplace = 'subDataTable_' + idSubTable; |
| var root = $('#' + self.workingDivId); |
|
|
| var response = $(response); |
| self.parentAttributeParent = $('tr#' + idToReplace).prev().prop('parent'); |
| self.parentId = idToReplace; |
|
|
| $('tr#' + idToReplace, root).after(response).remove(); |
|
|
| var requiredColumnCount = 0, availableColumnCount = 0; |
|
|
| response.prev().find('td').each(function(){ requiredColumnCount += $(this).attr('colspan') || 1; }); |
| response.find('td').each(function(){ availableColumnCount += $(this).attr('colspan') || 1; }); |
|
|
| var missingColumns = requiredColumnCount - availableColumnCount; |
| for (var i = 0; i < missingColumns; i++) { |
| |
| |
| response.append('<td>-</td>'); |
| } |
|
|
| var re = /subDataTable_(\d+)/; |
| var ok = re.exec(self.parentId); |
| if (ok) { |
| self.parentId = ok[1]; |
| } |
|
|
| |
| self.bindEventsAndApplyStyle($('#' + self.workingDivId), response); |
|
|
| self.$element.trigger('piwik:actionsSubDataTableLoaded'); |
|
|
| |
| self.disabledRowDom.click( |
| function () { |
| self.onClickActionSubDataTable(this) |
| }); |
|
|
| self.openSubtableFromSubtableIfOnlyOneSubtableGiven(response); |
| } |
| }); |
|
|
| })(jQuery, require); |
|
|