diff options
author | Ben <ben.burgess@innocraft.com> | 2022-05-25 04:25:04 +0300 |
---|---|---|
committer | Ben <ben.burgess@innocraft.com> | 2022-05-25 04:25:04 +0300 |
commit | 7a3865b02d6c4511db639d61f6de7e9c216fa675 (patch) | |
tree | f73b884c3ce969fba97b391d5652ea0a308d6b7d /plugins/Goals/vue | |
parent | 276ed587372cd76f44e51f9a98462c45f1eb8f5c (diff) | |
parent | 53c00a78caf96d24dd8f7f74dc8fd74268b312b1 (diff) |
Merge branch '4.x-dev' into lockaltlockalt
Diffstat (limited to 'plugins/Goals/vue')
-rw-r--r-- | plugins/Goals/vue/dist/Goals.umd.js | 1216 | ||||
-rw-r--r-- | plugins/Goals/vue/dist/Goals.umd.min.js | 27 | ||||
-rw-r--r-- | plugins/Goals/vue/dist/umd.metadata.json | 6 | ||||
-rw-r--r-- | plugins/Goals/vue/src/Goal.ts | 24 | ||||
-rw-r--r-- | plugins/Goals/vue/src/GoalPageLink/GoalPageLink.adapter.ts | 30 | ||||
-rw-r--r-- | plugins/Goals/vue/src/GoalPageLink/GoalPageLink.ts | 69 | ||||
-rw-r--r-- | plugins/Goals/vue/src/ManageGoals/ManageGoals.adapter.ts | 64 | ||||
-rw-r--r-- | plugins/Goals/vue/src/ManageGoals/ManageGoals.store.ts | 24 | ||||
-rw-r--r-- | plugins/Goals/vue/src/ManageGoals/ManageGoals.vue | 840 | ||||
-rw-r--r-- | plugins/Goals/vue/src/ManageGoals/PiwikApiMock.ts | 38 | ||||
-rw-r--r-- | plugins/Goals/vue/src/index.ts | 14 |
11 files changed, 2352 insertions, 0 deletions
diff --git a/plugins/Goals/vue/dist/Goals.umd.js b/plugins/Goals/vue/dist/Goals.umd.js new file mode 100644 index 0000000000..c76055a528 --- /dev/null +++ b/plugins/Goals/vue/dist/Goals.umd.js @@ -0,0 +1,1216 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("CoreHome"), require("vue"), require("CorePluginsAdmin")); + else if(typeof define === 'function' && define.amd) + define(["CoreHome", , "CorePluginsAdmin"], factory); + else if(typeof exports === 'object') + exports["Goals"] = factory(require("CoreHome"), require("vue"), require("CorePluginsAdmin")); + else + root["Goals"] = factory(root["CoreHome"], root["Vue"], root["CorePluginsAdmin"]); +})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__19dc__, __WEBPACK_EXTERNAL_MODULE__8bbf__, __WEBPACK_EXTERNAL_MODULE_a5a2__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "plugins/Goals/vue/dist/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "fae3"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "19dc": +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__19dc__; + +/***/ }), + +/***/ "8bbf": +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__8bbf__; + +/***/ }), + +/***/ "a5a2": +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_a5a2__; + +/***/ }), + +/***/ "fae3": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, "GoalPageLink", function() { return /* reexport */ GoalPageLink_GoalPageLink; }); +__webpack_require__.d(__webpack_exports__, "ManageGoals", function() { return /* reexport */ ManageGoals; }); +__webpack_require__.d(__webpack_exports__, "ManageGoalsStore", function() { return /* reexport */ ManageGoals_store; }); +__webpack_require__.d(__webpack_exports__, "PiwikApiMock", function() { return /* reexport */ PiwikApiMock; }); + +// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js +// This file is imported into lib/wc client bundles. + +if (typeof window !== 'undefined') { + var currentScript = window.document.currentScript + if (false) { var getCurrentScript; } + + var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/) + if (src) { + __webpack_require__.p = src[1] // eslint-disable-line + } +} + +// Indicate to webpack that this file can be concatenated +/* harmony default export */ var setPublicPath = (null); + +// EXTERNAL MODULE: external "CoreHome" +var external_CoreHome_ = __webpack_require__("19dc"); + +// CONCATENATED MODULE: ./plugins/Goals/vue/src/GoalPageLink/GoalPageLink.ts +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +var _window = window, + GoalPageLink_$ = _window.$; // usage v-goal-page-link="{ idGoal: 5 }" + +var GoalPageLink = { + mounted: function mounted(el, binding) { + if (!external_CoreHome_["Matomo"].helper.isAngularRenderingThePage()) { + return; + } + + var title = GoalPageLink_$(el).text(); + var link = GoalPageLink_$('<a></a>'); + link.text(title); + link.attr('title', Object(external_CoreHome_["translate"])('Goals_ClickToViewThisGoal')); + link.click(function (e) { + e.preventDefault(); + external_CoreHome_["MatomoUrl"].updateHash(Object.assign(Object.assign({}, external_CoreHome_["MatomoUrl"].hashParsed.value), {}, { + category: 'Goals_Goals', + subcategory: binding.value.idGoal + })); + }); + GoalPageLink_$(el).html(link[0]); + } +}; +/* harmony default export */ var GoalPageLink_GoalPageLink = (GoalPageLink); // manually handle occurrence of goal-page-link on datatable html attributes since dataTable.js is +// not managed by vue. +// eslint-disable-next-line @typescript-eslint/no-explicit-any + +external_CoreHome_["Matomo"].on('Matomo.processDynamicHtml', function ($element) { + $element.find('[goal-page-link]').each(function (i, e) { + if (GoalPageLink_$(e).attr('goal-page-link-handled')) { + return; + } + + var idGoal = GoalPageLink_$(e).attr('goal-page-link'); + + if (idGoal) { + GoalPageLink.mounted(e, { + instance: null, + value: { + idGoal: idGoal + }, + oldValue: null, + modifiers: {}, + dir: {} + }); + } + + GoalPageLink_$(e).attr('goal-page-link-handled', '1'); + }); +}); +// CONCATENATED MODULE: ./plugins/Goals/vue/src/GoalPageLink/GoalPageLink.adapter.ts +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +function piwikGoalPageLink() { + return { + restrict: 'A', + link: function piwikGoalPageLinkLink(scope, element, attrs) { + var binding = { + instance: null, + value: { + idGoal: attrs.piwikGoalPageLink + }, + oldValue: null, + modifiers: {}, + dir: {} + }; + GoalPageLink_GoalPageLink.mounted(element[0], binding); + } + }; +} +window.angular.module('piwikApp').directive('piwikGoalPageLink', piwikGoalPageLink); +// EXTERNAL MODULE: external {"commonjs":"vue","commonjs2":"vue","root":"Vue"} +var external_commonjs_vue_commonjs2_vue_root_Vue_ = __webpack_require__("8bbf"); + +// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/@vue/cli-plugin-babel/node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/templateLoader.js??ref--6!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/Goals/vue/src/ManageGoals/ManageGoals.vue?vue&type=template&id=6e40977d + +var _hoisted_1 = { + class: "manageGoals" +}; +var _hoisted_2 = { + id: "entityEditContainer", + feature: "true", + class: "managegoals" +}; +var _hoisted_3 = { + class: "contentHelp" +}; +var _hoisted_4 = ["innerHTML"]; +var _hoisted_5 = { + key: 0 +}; + +var _hoisted_6 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_7 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_8 = ["innerHTML"]; +var _hoisted_9 = { + class: "first" +}; +var _hoisted_10 = { + key: 1 +}; +var _hoisted_11 = { + key: 2 +}; +var _hoisted_12 = { + key: 0 +}; +var _hoisted_13 = { + colspan: "8" +}; + +var _hoisted_14 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_15 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_16 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_17 = ["id"]; +var _hoisted_18 = { + class: "first" +}; +var _hoisted_19 = { + class: "matchAttribute" +}; +var _hoisted_20 = { + key: 0 +}; +var _hoisted_21 = { + key: 1 +}; + +var _hoisted_22 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_23 = ["innerHTML"]; +var _hoisted_24 = { + key: 1, + style: { + "padding-top": "2px" + } +}; +var _hoisted_25 = ["onClick", "title"]; + +var _hoisted_26 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "icon-edit" +}, null, -1); + +var _hoisted_27 = [_hoisted_26]; +var _hoisted_28 = { + key: 2, + style: { + "padding-top": "2px" + } +}; +var _hoisted_29 = ["onClick", "title"]; + +var _hoisted_30 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "icon-delete" +}, null, -1); + +var _hoisted_31 = [_hoisted_30]; +var _hoisted_32 = { + key: 0, + class: "tableActionBar" +}; + +var _hoisted_33 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + class: "icon-add" +}, null, -1); + +var _hoisted_34 = { + class: "ui-confirm", + ref: "confirm" +}; +var _hoisted_35 = ["value"]; +var _hoisted_36 = ["value"]; +var _hoisted_37 = { + class: "addEditGoal" +}; +var _hoisted_38 = ["innerHTML"]; +var _hoisted_39 = { + class: "row goalIsTriggeredWhen" +}; +var _hoisted_40 = { + class: "col s12" +}; +var _hoisted_41 = { + class: "row" +}; +var _hoisted_42 = { + class: "col s12 m6 goalTriggerType" +}; +var _hoisted_43 = { + class: "col s12 m6" +}; +var _hoisted_44 = ["innerHTML"]; +var _hoisted_45 = { + class: "row whereTheMatchAttrbiute" +}; +var _hoisted_46 = { + class: "col s12" +}; +var _hoisted_47 = { + class: "row" +}; +var _hoisted_48 = { + class: "col s12 m6 l4" +}; +var _hoisted_49 = { + key: 0, + class: "col s12 m6 l4" +}; +var _hoisted_50 = { + key: 1, + class: "col s12 m6 l4" +}; +var _hoisted_51 = { + class: "col s12 m6 l4" +}; +var _hoisted_52 = { + id: "examples_pattern", + class: "col s12" +}; + +var _hoisted_53 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_54 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_55 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_56 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_57 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_58 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_59 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_60 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("br", null, null, -1); + +var _hoisted_61 = { + ref: "endedittable" +}; + +var _hoisted_62 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + type: "hidden", + name: "goalIdUpdate", + value: "" +}, null, -1); + +var _hoisted_63 = { + key: 0 +}; +var _hoisted_64 = ["innerHTML"]; + +var _hoisted_65 = /*#__PURE__*/Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("a", { + id: "bottom" +}, null, -1); + +function render(_ctx, _cache, $props, $setup, $data, $options) { + var _ctx$goalToDelete; + + var _component_ActivityIndicator = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ActivityIndicator"); + + var _component_ContentBlock = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("ContentBlock"); + + var _component_Field = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Field"); + + var _component_Alert = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("Alert"); + + var _component_SaveButton = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveComponent"])("SaveButton"); + + var _directive_content_table = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("content-table"); + + var _directive_form = Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDirective"])("form"); + + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_1, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_2, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ContentBlock, { + "content-title": _ctx.translate('Goals_ManageGoals') + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ActivityIndicator, { + loading: _ctx.isLoading + }, null, 8, ["loading"]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_3, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: _ctx.$sanitize(_ctx.learnMoreAboutGoalTracking) + }, null, 8, _hoisted_4), !_ctx.ecommerceEnabled ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", _hoisted_5, [_hoisted_6, _hoisted_7, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Optional')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Ecommerce')) + ": ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: _ctx.$sanitize(_ctx.youCanEnableEcommerceReports) + }, null, 8, _hoisted_8)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("table", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("thead", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tr", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", _hoisted_9, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Id')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_GoalName')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Description')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_GoalIsTriggeredWhen')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("th", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ColumnRevenue')), 1), _ctx.beforeGoalListActionsHeadComponent ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDynamicComponent"])(_ctx.beforeGoalListActionsHeadComponent), { + key: 0 + })) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userCanEditGoals ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", _hoisted_10, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Edit')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userCanEditGoals ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("th", _hoisted_11, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_Delete')), 1)) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("tbody", null, [!Object.keys(_ctx.goals || {}).length ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", _hoisted_12, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_13, [_hoisted_14, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_ThereIsNoGoalToManage', _ctx.siteName)) + " ", 1), _hoisted_15, _hoisted_16])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])(external_commonjs_vue_commonjs2_vue_root_Vue_["Fragment"], null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["renderList"])(_ctx.goals || [], function (goal) { + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("tr", { + id: goal.idgoal, + key: goal.idgoal + }, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", _hoisted_18, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(goal.idgoal), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(goal.name), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(goal.description), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", _hoisted_19, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.goalMatchAttributeTranslations[goal.match_attribute] || goal.match_attribute), 1), goal.match_attribute === 'visit_duration' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", _hoisted_20, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.lcfirst(_ctx.translate('General_OperationGreaterThan'))) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Intl_NMinutes', goal.pattern)), 1)) : !!goal.pattern_type ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("span", _hoisted_21, [_hoisted_22, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Pattern')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(goal.pattern_type) + ": " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(goal.pattern), 1)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("td", { + class: "center", + innerHTML: _ctx.$sanitize(goal.revenue === 0 || goal.revenue === '0' ? '-' : goal.revenue_pretty) + }, null, 8, _hoisted_23), _ctx.beforeGoalListActionsBodyComponent[goal.idgoal] ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDynamicComponent"])(_ctx.beforeGoalListActionsBodyComponent[goal.idgoal]), { + key: 0 + })) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userCanEditGoals ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_24, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("button", { + onClick: function onClick($event) { + return _ctx.editGoal(goal.idgoal); + }, + class: "table-action", + title: _ctx.translate('General_Edit') + }, _hoisted_27, 8, _hoisted_25)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.userCanEditGoals ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("td", _hoisted_28, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("button", { + onClick: function onClick($event) { + return _ctx.deleteGoal(goal.idgoal); + }, + class: "table-action", + title: _ctx.translate('General_Delete') + }, _hoisted_31, 8, _hoisted_29)])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 8, _hoisted_17); + }), 128))])], 512), [[_directive_content_table]]), _ctx.userCanEditGoals && !_ctx.onlyShowAddNewGoal ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_32, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("button", { + id: "add-goal", + onClick: _cache[0] || (_cache[0] = function ($event) { + return _ctx.createGoal(); + }) + }, [_hoisted_33, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_AddNewGoal')), 1)])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]; + }), + _: 1 + }, 8, ["content-title"])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.showGoalList]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_34, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h2", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_DeleteGoalConfirm', "\"".concat((_ctx$goalToDelete = _ctx.goalToDelete) === null || _ctx$goalToDelete === void 0 ? void 0 : _ctx$goalToDelete.name, "\""))), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + role: "yes", + type: "button", + value: _ctx.translate('General_Yes') + }, null, 8, _hoisted_35), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("input", { + role: "no", + type: "button", + value: _ctx.translate('General_No') + }, null, 8, _hoisted_36)], 512)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], !_ctx.onlyShowAddNewGoal]]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_37, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_ContentBlock, { + "content-title": _ctx.goal.idgoal ? _ctx.translate('Goals_UpdateGoal') : _ctx.translate('Goals_AddNewGoal') + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { + innerHTML: _ctx.$sanitize(_ctx.addNewGoalIntro) + }, null, 8, _hoisted_38), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "text", + name: "goal_name", + modelValue: _ctx.goal.name, + "onUpdate:modelValue": _cache[1] || (_cache[1] = function ($event) { + return _ctx.goal.name = $event; + }), + maxlength: 50, + title: _ctx.translate('Goals_GoalName') + }, null, 8, ["modelValue", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "text", + name: "goal_description", + modelValue: _ctx.goal.description, + "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) { + return _ctx.goal.description = $event; + }), + maxlength: 255, + title: _ctx.translate('General_Description') + }, null, 8, ["modelValue", "title"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_39, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_40, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_GoalIsTriggered')), 1)])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_41, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_42, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "select", + name: "trigger_type", + "model-value": _ctx.triggerType, + "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) { + _ctx.triggerType = $event; + + _ctx.changedTriggerType(); + }), + "full-width": true, + options: _ctx.goalTriggerTypeOptions + }, null, 8, ["model-value", "options"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_43, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Alert, { + severity: "info" + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", { + innerHTML: _ctx.$sanitize(_ctx.whereVisitedPageManuallyCallsJsTrackerText) + }, null, 8, _hoisted_44)]; + }), + _: 1 + }, 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.triggerType === 'manually']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "radio", + name: "match_attribute", + "full-width": true, + "model-value": _ctx.goal.match_attribute, + "onUpdate:modelValue": _cache[4] || (_cache[4] = function ($event) { + _ctx.goal.match_attribute = $event; + + _ctx.initPatternType(); + }), + options: _ctx.goalMatchAttributeOptions + }, null, 8, ["model-value", "options"]), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.triggerType !== 'manually']])])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_45, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", _hoisted_46, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_WhereThe')) + " ", 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_URL')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'url']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_PageTitle')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'title']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Filename')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'file']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_ExternalWebsiteUrl')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'external_website']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_VisitDuration')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'visit_duration']])])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.triggerType !== 'manually']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_47, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_48, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "select", + name: "event_type", + modelValue: _ctx.eventType, + "onUpdate:modelValue": _cache[5] || (_cache[5] = function ($event) { + return _ctx.eventType = $event; + }), + "full-width": true, + options: _ctx.eventTypeOptions + }, null, 8, ["modelValue", "options"])])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'event']]), !_ctx.isMatchAttributeNumeric ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_49, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "select", + name: "pattern_type", + modelValue: _ctx.goal.pattern_type, + "onUpdate:modelValue": _cache[6] || (_cache[6] = function ($event) { + return _ctx.goal.pattern_type = $event; + }), + "full-width": true, + options: _ctx.patternTypeOptions + }, null, 8, ["modelValue", "options"])])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), _ctx.isMatchAttributeNumeric ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_50, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "select", + name: "pattern_type", + modelValue: _ctx.goal.pattern_type, + "onUpdate:modelValue": _cache[7] || (_cache[7] = function ($event) { + return _ctx.goal.pattern_type = $event; + }), + "full-width": true, + options: _ctx.numericComparisonTypeOptions + }, null, 8, ["modelValue", "options"])])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_51, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "text", + name: "pattern", + modelValue: _ctx.goal.pattern, + "onUpdate:modelValue": _cache[8] || (_cache[8] = function ($event) { + return _ctx.goal.pattern = $event; + }), + maxlength: 255, + title: _ctx.patternFieldLabel, + "full-width": true + }, null, 8, ["modelValue", "title"])])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_52, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Alert, { + severity: "info" + }, { + default: Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withCtx"])(function () { + return [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Contains', "'checkout/confirmation'")) + " ", 1), _hoisted_53, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_IsExactly', "'http://example.com/thank-you.html'")) + " ", 1), _hoisted_54, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_MatchesExpression', "'(.*)\\\/demo\\\/(.*)'")), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'url']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Contains', "'Order confirmation'")), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'title']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Contains', "'files/brochure.pdf'")) + " ", 1), _hoisted_55, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_IsExactly', "'http://example.com/files/brochure.pdf'")) + " ", 1), _hoisted_56, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_MatchesExpression', "'(.*)\\\.zip'")), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'file']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Contains', "'amazon.com'")) + " ", 1), _hoisted_57, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_IsExactly', "'http://mypartner.com/landing.html'")) + " ", 1), _hoisted_58, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.matchesExpressionExternal), 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'external_website']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Contains', "'video'")) + " ", 1), _hoisted_59, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(" " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_IsExactly', "'click'")) + " ", 1), _hoisted_60, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createTextVNode"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_MatchesExpression', "'(.*)_banner'")) + "\" ", 1)], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'event']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("span", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('General_ForExampleShort')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_AtLeastMinutes', '5', '0.5')), 513), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'visit_duration']])]; + }), + _: 1 + })])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.triggerType !== 'manually']]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "checkbox", + name: "case_sensitive", + modelValue: _ctx.goal.case_sensitive, + "onUpdate:modelValue": _cache[9] || (_cache[9] = function ($event) { + return _ctx.goal.case_sensitive = $event; + }), + title: _ctx.caseSensitiveTitle + }, null, 8, ["modelValue", "title"]), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.triggerType !== 'manually' && !_ctx.isMatchAttributeNumeric]])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [_ctx.goal.match_attribute !== 'visit_duration' ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(_component_Field, { + key: 0, + uicontrol: "radio", + name: "allow_multiple", + "model-value": _ctx.goal.allow_multiple ? 1 : 0, + "onUpdate:modelValue": _cache[10] || (_cache[10] = function ($event) { + return _ctx.goal.allow_multiple = $event; + }), + options: _ctx.allowMultipleOptions, + introduction: _ctx.translate('Goals_AllowMultipleConversionsPerVisit'), + "inline-help": _ctx.translate('Goals_HelpOneConversionPerVisit') + }, null, 8, ["model-value", "options", "introduction", "inline-help"])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("h3", null, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_GoalRevenue')) + " " + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["toDisplayString"])(_ctx.translate('Goals_Optional')), 1), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "number", + name: "revenue", + modelValue: _ctx.goal.revenue, + "onUpdate:modelValue": _cache[11] || (_cache[11] = function ($event) { + return _ctx.goal.revenue = $event; + }), + placeholder: _ctx.translate('Goals_DefaultRevenueLabel'), + "inline-help": _ctx.translate('Goals_DefaultRevenueHelp') + }, null, 8, ["modelValue", "placeholder", "inline-help"])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", null, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_Field, { + uicontrol: "checkbox", + name: "use_event_value", + modelValue: _ctx.goal.event_value_as_revenue, + "onUpdate:modelValue": _cache[12] || (_cache[12] = function ($event) { + return _ctx.goal.event_value_as_revenue = $event; + }), + title: _ctx.translate('Goals_UseEventValueAsRevenue'), + "inline-help": _ctx.useEventValueAsRevenueHelp + }, null, 8, ["modelValue", "title", "inline-help"]), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.goal.match_attribute === 'event']])]), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", _hoisted_61, [_ctx.endEditTableComponent ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createBlock"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["resolveDynamicComponent"])(_ctx.endEditTableComponent), { + key: 0 + })) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 512), _hoisted_62, Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createVNode"])(_component_SaveButton, { + saving: _ctx.isLoading, + onConfirm: _cache[13] || (_cache[13] = function ($event) { + return _ctx.save(); + }), + value: _ctx.submitText + }, null, 8, ["saving", "value"]), !_ctx.onlyShowAddNewGoal ? (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["openBlock"])(), Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementBlock"])("div", _hoisted_63, [Object(external_commonjs_vue_commonjs2_vue_root_Vue_["withDirectives"])(Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createElementVNode"])("div", { + class: "entityCancel", + onClick: _cache[14] || (_cache[14] = function ($event) { + return _ctx.showListOfReports(); + }), + innerHTML: _ctx.$sanitize(_ctx.cancelText) + }, null, 8, _hoisted_64), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.showEditGoal]])])) : Object(external_commonjs_vue_commonjs2_vue_root_Vue_["createCommentVNode"])("", true)], 512), [[_directive_form]])]; + }), + _: 1 + }, 8, ["content-title"])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.showEditGoal]])], 512), [[external_commonjs_vue_commonjs2_vue_root_Vue_["vShow"], _ctx.userCanEditGoals]]), _hoisted_65]); +} +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/ManageGoals.vue?vue&type=template&id=6e40977d + +// EXTERNAL MODULE: external "CorePluginsAdmin" +var external_CorePluginsAdmin_ = __webpack_require__("a5a2"); + +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/PiwikApiMock.ts +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/*! +* Matomo - free/libre analytics platform +* +* @link https://matomo.org +* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +*/ +// the piwikApi angularjs service is passed in some frontend events to allow plugins to modify +// a request before it is sent. for the time being in Vue we use this mock, which has the same +// API as the piwikApi service, to modify the input used with AjaxHelper. this provides BC +// with for plugins that haven't been converted. +// +// should be removed in Matomo 5. +var PiwikApiMock = /*#__PURE__*/function () { + function PiwikApiMock(parameters, options) { + _classCallCheck(this, PiwikApiMock); + + _defineProperty(this, "parameters", void 0); + + _defineProperty(this, "options", void 0); + + this.parameters = parameters; + this.options = options; + } + + _createClass(PiwikApiMock, [{ + key: "addParams", + value: function addParams(params) { + Object.assign(this.parameters, params); + } + }, { + key: "withTokenInUrl", + value: function withTokenInUrl() { + this.options.withTokenInUrl = true; + } + }, { + key: "reset", + value: function reset() { + var _this = this; + + Object.keys(this.parameters).forEach(function (name) { + delete _this.parameters[name]; + }); + delete this.options.postParams; + } + }, { + key: "addPostParams", + value: function addPostParams(params) { + this.options.postParams = Object.assign(Object.assign({}, this.options.postParams), params); + } + }]); + + return PiwikApiMock; +}(); + + +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/ManageGoals.store.ts +function ManageGoals_store_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function ManageGoals_store_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function ManageGoals_store_createClass(Constructor, protoProps, staticProps) { if (protoProps) ManageGoals_store_defineProperties(Constructor.prototype, protoProps); if (staticProps) ManageGoals_store_defineProperties(Constructor, staticProps); return Constructor; } + +function ManageGoals_store_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + + +var ManageGoals_store_ManageGoalsStore = /*#__PURE__*/function () { + function ManageGoalsStore() { + var _this = this; + + ManageGoals_store_classCallCheck(this, ManageGoalsStore); + + ManageGoals_store_defineProperty(this, "privateState", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["reactive"])({})); + + ManageGoals_store_defineProperty(this, "idGoal", Object(external_commonjs_vue_commonjs2_vue_root_Vue_["computed"])(function () { + return _this.privateState.idGoal; + })); + } + + ManageGoals_store_createClass(ManageGoalsStore, [{ + key: "setIdGoalShown", + value: function setIdGoalShown(idGoal) { + this.privateState.idGoal = idGoal; + } + }]); + + return ManageGoalsStore; +}(); + +/* harmony default export */ var ManageGoals_store = (new ManageGoals_store_ManageGoalsStore()); +// CONCATENATED MODULE: ./node_modules/@vue/cli-plugin-typescript/node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-typescript/node_modules/ts-loader??ref--14-2!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist??ref--0-1!./plugins/Goals/vue/src/ManageGoals/ManageGoals.vue?vue&type=script&lang=ts + + + + + +/* harmony default export */ var ManageGoalsvue_type_script_lang_ts = (Object(external_commonjs_vue_commonjs2_vue_root_Vue_["defineComponent"])({ + inheritAttrs: false, + props: { + onlyShowAddNewGoal: Boolean, + userCanEditGoals: Boolean, + ecommerceEnabled: Boolean, + goals: { + type: Object, + required: true + }, + addNewGoalIntro: String, + goalTriggerTypeOptions: Object, + goalMatchAttributeOptions: Array, + eventTypeOptions: Array, + patternTypeOptions: Array, + numericComparisonTypeOptions: Array, + allowMultipleOptions: Array, + showAddGoal: Boolean, + showGoal: Number, + beforeGoalListActionsBody: Object, + endEditTable: String, + beforeGoalListActionsHead: String + }, + data: function data() { + return { + showEditGoal: false, + showGoalList: true, + goal: {}, + isLoading: false, + eventType: 'event_category', + triggerType: 'visitors', + apiMethod: '', + submitText: '', + goalToDelete: null, + addEditTableComponent: false + }; + }, + components: { + SaveButton: external_CorePluginsAdmin_["SaveButton"], + ContentBlock: external_CoreHome_["ContentBlock"], + ActivityIndicator: external_CoreHome_["ActivityIndicator"], + Field: external_CorePluginsAdmin_["Field"], + Alert: external_CoreHome_["Alert"] + }, + directives: { + ContentTable: external_CoreHome_["ContentTable"], + Form: external_CorePluginsAdmin_["Form"] + }, + created: function created() { + ManageGoals_store.setIdGoalShown(this.showGoal); + }, + unmounted: function unmounted() { + ManageGoals_store.setIdGoalShown(undefined); + }, + mounted: function mounted() { + var _this = this; + + if (this.showAddGoal) { + this.createGoal(); + } else if (this.showGoal) { + this.editGoal(this.showGoal); + } else { + this.showListOfReports(); + } // this component can be used in multiple places, one where + // Matomo.helper.compileAngularComponents() is already called, one where it's not. + // to make sure this function is only applied once to the slot data, we explicitly do not + // add it to vue, then on the next update, add it and call compileAngularComponents() + + + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["nextTick"])(function () { + _this.addEditTableComponent = true; + Object(external_commonjs_vue_commonjs2_vue_root_Vue_["nextTick"])(function () { + var el = _this.$refs.endedittable; + var scope = external_CoreHome_["Matomo"].helper.getAngularDependency('$rootScope').$new(true); + $(el).data('scope', scope); + external_CoreHome_["Matomo"].helper.compileAngularComponents(el, { + scope: scope + }); + }); + }); + }, + beforeUnmount: function beforeUnmount() { + var el = this.$refs.endedittable; + $(el).data('scope').$destroy(); + }, + methods: { + scrollToTop: function scrollToTop() { + setTimeout(function () { + external_CoreHome_["Matomo"].helper.lazyScrollTo('.pageWrap', 200); + }); + }, + initGoalForm: function initGoalForm(goalMethodAPI, submitText, goalName, description, matchAttribute, pattern, patternType, caseSensitive, revenue, allowMultiple, useEventValueAsRevenue, goalId) { + external_CoreHome_["Matomo"].postEvent('Goals.beforeInitGoalForm', goalMethodAPI, goalId); + this.apiMethod = goalMethodAPI; + this.goal = {}; + this.goal.name = goalName; + this.goal.description = description; + var actualMatchAttribute = matchAttribute; + + if (actualMatchAttribute === 'manually') { + this.triggerType = 'manually'; + actualMatchAttribute = 'url'; + } else { + this.triggerType = 'visitors'; + } + + if (actualMatchAttribute.indexOf('event') === 0) { + this.eventType = actualMatchAttribute; + actualMatchAttribute = 'event'; + } else { + this.eventType = 'event_category'; + } + + this.goal.match_attribute = actualMatchAttribute; + this.goal.allow_multiple = allowMultiple; + this.goal.pattern_type = patternType; + this.goal.pattern = pattern; + this.goal.case_sensitive = caseSensitive; + this.goal.revenue = revenue; + this.goal.event_value_as_revenue = useEventValueAsRevenue; + this.submitText = submitText; + this.goal.idgoal = goalId; + }, + showListOfReports: function showListOfReports() { + external_CoreHome_["Matomo"].postEvent('Goals.cancelForm'); + this.showGoalList = true; + this.showEditGoal = false; + this.scrollToTop(); + }, + showAddEditForm: function showAddEditForm() { + this.showGoalList = false; + this.showEditGoal = true; + }, + createGoal: function createGoal() { + var parameters = { + isAllowed: true + }; + external_CoreHome_["Matomo"].postEvent('Goals.initAddGoal', parameters); + + if (parameters && !parameters.isAllowed) { + return; + } + + this.showAddEditForm(); + this.initGoalForm('Goals.addGoal', Object(external_CoreHome_["translate"])('Goals_AddGoal'), '', '', 'url', '', 'contains', false, 0, false, false, 0); + this.scrollToTop(); + }, + editGoal: function editGoal(goalId) { + this.showAddEditForm(); + var goal = this.goals["".concat(goalId)]; + this.initGoalForm('Goals.updateGoal', Object(external_CoreHome_["translate"])('Goals_UpdateGoal'), goal.name, goal.description, goal.match_attribute, goal.pattern, goal.pattern_type, !!goal.case_sensitive && goal.case_sensitive !== '0', parseInt("".concat(goal.revenue), 10), !!goal.allow_multiple && goal.allow_multiple !== '0', !!goal.event_value_as_revenue && goal.event_value_as_revenue !== '0', goalId); + this.scrollToTop(); + }, + deleteGoal: function deleteGoal(goalId) { + var _this2 = this; + + this.goalToDelete = this.goals["".concat(goalId)]; + external_CoreHome_["Matomo"].helper.modalConfirm(this.$refs.confirm, { + yes: function yes() { + _this2.isLoading = true; + external_CoreHome_["AjaxHelper"].fetch({ + idGoal: goalId, + method: 'Goals.deleteGoal' + }).then(function () { + window.location.reload(); + }).finally(function () { + _this2.isLoading = false; + }); + } + }); + }, + save: function save() { + var _this3 = this; + + var parameters = {}; // TODO: test removal of encoding, should be handled by ajax request + + parameters.name = this.goal.name; + parameters.description = this.goal.description; + + if (this.isManuallyTriggered) { + parameters.matchAttribute = 'manually'; + parameters.patternType = 'regex'; + parameters.pattern = '.*'; + parameters.caseSensitive = 0; + } else { + parameters.matchAttribute = this.goal.match_attribute; + + if (parameters.matchAttribute === 'event') { + parameters.matchAttribute = this.eventType; + } + + parameters.patternType = this.goal.pattern_type; + parameters.pattern = this.goal.pattern; + parameters.caseSensitive = this.goal.case_sensitive ? 1 : 0; + } + + parameters.revenue = this.goal.revenue || 0; + parameters.allowMultipleConversionsPerVisit = this.goal.allow_multiple ? 1 : 0; + parameters.useEventValueAsRevenue = this.goal.event_value_as_revenue ? 1 : 0; + parameters.idGoal = this.goal.idgoal; + parameters.method = this.apiMethod; + var isCreate = parameters.method === 'Goals.addGoal'; + var isUpdate = parameters.method === 'Goals.updateGoal'; + var options = {}; + var piwikApiMock = new PiwikApiMock(parameters, options); + + if (isUpdate) { + external_CoreHome_["Matomo"].postEvent('Goals.beforeUpdateGoal', parameters, piwikApiMock); + } else if (isCreate) { + external_CoreHome_["Matomo"].postEvent('Goals.beforeAddGoal', parameters, piwikApiMock); + } + + if (parameters !== null && parameters !== void 0 && parameters.cancelRequest) { + return; + } + + this.isLoading = true; + external_CoreHome_["AjaxHelper"].fetch(parameters, options).then(function () { + var subcategory = external_CoreHome_["MatomoUrl"].parsed.value.subcategory; + + if (subcategory === 'Goals_AddNewGoal' && external_CoreHome_["Matomo"].helper.isAngularRenderingThePage()) { + // when adding a goal for the first time we need to load manage goals page afterwards + external_CoreHome_["ReportingMenuStore"].reloadMenuItems().then(function () { + external_CoreHome_["MatomoUrl"].updateHash(Object.assign(Object.assign({}, external_CoreHome_["MatomoUrl"].hashParsed.value), {}, { + subcategory: 'Goals_ManageGoals' + })); + _this3.isLoading = false; + }); + } else { + window.location.reload(); + } + }).catch(function () { + _this3.scrollToTop(); + + _this3.isLoading = false; + }); + }, + changedTriggerType: function changedTriggerType() { + if (!this.isManuallyTriggered && !this.goal.pattern_type) { + this.goal.pattern_type = 'contains'; + } + }, + initPatternType: function initPatternType() { + if (this.isMatchAttributeNumeric) { + this.goal.pattern_type = 'greater_than'; + } else { + this.goal.pattern_type = 'contains'; + } + }, + lcfirst: function lcfirst(s) { + return "".concat(s.slice(0, 1).toLowerCase()).concat(s.slice(1)); + }, + ucfirst: function ucfirst(s) { + return "".concat(s.slice(0, 1).toUpperCase()).concat(s.slice(1)); + } + }, + computed: { + learnMoreAboutGoalTracking: function learnMoreAboutGoalTracking() { + return Object(external_CoreHome_["translate"])('Goals_LearnMoreAboutGoalTrackingDocumentation', '<a target="_blank" rel="noreferrer noopener" ' + 'href="https://matomo.org/docs/tracking-goals-web-analytics/">', '</a>'); + }, + youCanEnableEcommerceReports: function youCanEnableEcommerceReports() { + var link = external_CoreHome_["MatomoUrl"].stringify(Object.assign(Object.assign({}, external_CoreHome_["MatomoUrl"].urlParsed.value), {}, { + module: 'SitesManager', + action: 'index' + })); + var ecommerceReportsText = '<a href="https://matomo.org/docs/ecommerce-analytics/" ' + "rel=\"noreferrer noopener\" target=\"_blank\">".concat(Object(external_CoreHome_["translate"])('Goals_EcommerceReports'), "</a>"); + var websiteManageText = "<a href='".concat(link, "'>").concat(Object(external_CoreHome_["translate"])('SitesManager_WebsitesManagement'), "</a>"); + return Object(external_CoreHome_["translate"])('Goals_YouCanEnableEcommerceReports', ecommerceReportsText, websiteManageText); + }, + siteName: function siteName() { + return external_CoreHome_["Matomo"].helper.htmlDecode(external_CoreHome_["Matomo"].siteName); + }, + whereVisitedPageManuallyCallsJsTrackerText: function whereVisitedPageManuallyCallsJsTrackerText() { + var link = 'https://developer.matomo.org/guides/tracking-javascript-guide#manually-trigger-goal-conversions'; + return Object(external_CoreHome_["translate"])('Goals_WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore', "<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"".concat(link, "\">"), '</a>'); + }, + caseSensitiveTitle: function caseSensitiveTitle() { + return "".concat(Object(external_CoreHome_["translate"])('Goals_CaseSensitive'), " ").concat(Object(external_CoreHome_["translate"])('Goals_Optional')); + }, + useEventValueAsRevenueHelp: function useEventValueAsRevenueHelp() { + return "".concat(Object(external_CoreHome_["translate"])('Goals_EventValueAsRevenueHelp'), " <br/><br/> ").concat(Object(external_CoreHome_["translate"])('Goals_EventValueAsRevenueHelp2')); + }, + cancelText: function cancelText() { + return Object(external_CoreHome_["translate"])('General_OrCancel', '<a class=\'entityCancelLink\'>', '</a>'); + }, + isMatchAttributeNumeric: function isMatchAttributeNumeric() { + return ['visit_duration'].indexOf(this.goal.match_attribute) > -1; + }, + patternFieldLabel: function patternFieldLabel() { + return this.goal.match_attribute === 'visit_duration' ? Object(external_CoreHome_["translate"])('Goals_TimeInMinutes') : Object(external_CoreHome_["translate"])('Goals_Pattern'); + }, + goalMatchAttributeTranslations: function goalMatchAttributeTranslations() { + return { + manually: Object(external_CoreHome_["translate"])('Goals_ManuallyTriggeredUsingJavascriptFunction'), + file: Object(external_CoreHome_["translate"])('Goals_Download'), + url: Object(external_CoreHome_["translate"])('Goals_VisitUrl'), + title: Object(external_CoreHome_["translate"])('Goals_VisitPageTitle'), + external_website: Object(external_CoreHome_["translate"])('Goals_ClickOutlink'), + event_action: "".concat(Object(external_CoreHome_["translate"])('Goals_SendEvent'), " (").concat(Object(external_CoreHome_["translate"])('Events_EventAction'), ")"), + event_category: "".concat(Object(external_CoreHome_["translate"])('Goals_SendEvent'), " (").concat(Object(external_CoreHome_["translate"])('Events_EventCategory'), ")"), + event_name: "".concat(Object(external_CoreHome_["translate"])('Goals_SendEvent'), " (").concat(Object(external_CoreHome_["translate"])('Events_EventName'), ")"), + visit_duration: "".concat(this.ucfirst(Object(external_CoreHome_["translate"])('Goals_VisitDuration'))) + }; + }, + beforeGoalListActionsBodyComponent: function beforeGoalListActionsBodyComponent() { + var _this4 = this; + + if (!this.beforeGoalListActionsBody) { + return {}; + } + + var componentsByIdGoal = {}; + Object.values(this.goals).forEach(function (g) { + var template = _this4.beforeGoalListActionsBody[g.idgoal]; + + if (!template) { + return; + } + + componentsByIdGoal[g.idgoal] = { + template: template + }; + }); + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["markRaw"])(componentsByIdGoal); + }, + endEditTableComponent: function endEditTableComponent() { + if (!this.endEditTable || !this.addEditTableComponent) { + return null; + } + + var endedittable = this.$refs.endedittable; + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["markRaw"])({ + template: this.endEditTable, + mounted: function mounted() { + external_CoreHome_["Matomo"].helper.compileVueEntryComponents(endedittable); + }, + beforeUnmount: function beforeUnmount() { + external_CoreHome_["Matomo"].helper.destroyVueComponent(endedittable); + } + }); + }, + beforeGoalListActionsHeadComponent: function beforeGoalListActionsHeadComponent() { + if (!this.beforeGoalListActionsHead) { + return null; + } + + return Object(external_commonjs_vue_commonjs2_vue_root_Vue_["markRaw"])({ + template: this.beforeGoalListActionsHead + }); + }, + isManuallyTriggered: function isManuallyTriggered() { + return this.triggerType === 'manually'; + }, + matchesExpressionExternal: function matchesExpressionExternal() { + var url = "'http://www.amazon.com\\/(.*)\\/yourAffiliateId'"; + return Object(external_CoreHome_["translate"])('Goals_MatchesExpression', url); + } + } +})); +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/ManageGoals.vue?vue&type=script&lang=ts + +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/ManageGoals.vue + + + +ManageGoalsvue_type_script_lang_ts.render = render + +/* harmony default export */ var ManageGoals = (ManageGoalsvue_type_script_lang_ts); +// CONCATENATED MODULE: ./plugins/Goals/vue/src/ManageGoals/ManageGoals.adapter.ts +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + + +/* harmony default export */ var ManageGoals_adapter = (Object(external_CoreHome_["createAngularJsAdapter"])({ + component: ManageGoals, + directiveName: 'piwikManageGoals', + scope: { + userCanEditGoals: { + angularJsBind: '<' + }, + onlyShowAddNewGoal: { + angularJsBind: '<' + }, + ecommerceEnabled: { + angularJsBind: '<' + }, + goals: { + angularJsBind: '<' + }, + showGoal: { + angularJsBind: '<' + }, + showAddGoal: { + angularJsBind: '<' + }, + addNewGoalIntro: { + angularJsBind: '<' + }, + goalTriggerTypeOptions: { + angularJsBind: '<' + }, + goalMatchAttributeOptions: { + angularJsBind: '<' + }, + eventTypeOptions: { + angularJsBind: '<' + }, + patternTypeOptions: { + angularJsBind: '<' + }, + numericComparisonTypeOptions: { + angularJsBind: '<' + }, + allowMultipleOptions: { + angularJsBind: '<' + }, + beforeGoalListActionsBody: { + angularJsBind: '<' + }, + endEditTable: { + angularJsBind: '<' + }, + beforeGoalListActionsHead: { + angularJsBind: '<' + } + } +})); +// CONCATENATED MODULE: ./plugins/Goals/vue/src/index.ts +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +*/ + + + + + + +// CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib-no-default.js + + + + +/***/ }) + +/******/ }); +}); +//# sourceMappingURL=Goals.umd.js.map
\ No newline at end of file diff --git a/plugins/Goals/vue/dist/Goals.umd.min.js b/plugins/Goals/vue/dist/Goals.umd.min.js new file mode 100644 index 0000000000..f325b1d324 --- /dev/null +++ b/plugins/Goals/vue/dist/Goals.umd.min.js @@ -0,0 +1,27 @@ +(function(e,t){"object"===typeof exports&&"object"===typeof module?module.exports=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):"function"===typeof define&&define.amd?define(["CoreHome",,"CorePluginsAdmin"],t):"object"===typeof exports?exports["Goals"]=t(require("CoreHome"),require("vue"),require("CorePluginsAdmin")):e["Goals"]=t(e["CoreHome"],e["Vue"],e["CorePluginsAdmin"])})("undefined"!==typeof self?self:this,(function(e,t,a){return function(e){var t={};function a(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,a),o.l=!0,o.exports}return a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)a.d(n,o,function(t){return e[t]}.bind(null,o));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="plugins/Goals/vue/dist/",a(a.s="fae3")}({"19dc":function(t,a){t.exports=e},"8bbf":function(e,a){e.exports=t},a5a2:function(e,t){e.exports=a},fae3:function(e,t,a){"use strict";if(a.r(t),a.d(t,"GoalPageLink",(function(){return s})),a.d(t,"ManageGoals",(function(){return Pe})),a.d(t,"ManageGoalsStore",(function(){return Be})),a.d(t,"PiwikApiMock",(function(){return ke})),"undefined"!==typeof window){var n=window.document.currentScript,o=n&&n.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);o&&(a.p=o[1])}var l=a("19dc"),r=window,i=r.$,c={mounted:function(e,t){if(l["Matomo"].helper.isAngularRenderingThePage()){var a=i(e).text(),n=i("<a></a>");n.text(a),n.attr("title",Object(l["translate"])("Goals_ClickToViewThisGoal")),n.click((function(e){e.preventDefault(),l["MatomoUrl"].updateHash(Object.assign(Object.assign({},l["MatomoUrl"].hashParsed.value),{},{category:"Goals_Goals",subcategory:t.value.idGoal}))})),i(e).html(n[0])}}},s=c; +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +function u(){return{restrict:"A",link:function(e,t,a){var n={instance:null,value:{idGoal:a.piwikGoalPageLink},oldValue:null,modifiers:{},dir:{}};s.mounted(t[0],n)}}}l["Matomo"].on("Matomo.processDynamicHtml",(function(e){e.find("[goal-page-link]").each((function(e,t){if(!i(t).attr("goal-page-link-handled")){var a=i(t).attr("goal-page-link");a&&c.mounted(t,{instance:null,value:{idGoal:a},oldValue:null,modifiers:{},dir:{}}),i(t).attr("goal-page-link-handled","1")}}))})),window.angular.module("piwikApp").directive("piwikGoalPageLink",u);var d=a("8bbf"),b={class:"manageGoals"},p={id:"entityEditContainer",feature:"true",class:"managegoals"},m={class:"contentHelp"},O=["innerHTML"],h={key:0},j=Object(d["createElementVNode"])("br",null,null,-1),g=Object(d["createElementVNode"])("br",null,null,-1),v=["innerHTML"],f={class:"first"},y={key:1},G={key:2},_={key:0},E={colspan:"8"},V=Object(d["createElementVNode"])("br",null,null,-1),N=Object(d["createElementVNode"])("br",null,null,-1),w=Object(d["createElementVNode"])("br",null,null,-1),T=["id"],S={class:"first"},k={class:"matchAttribute"},D={key:0},C={key:1},x=Object(d["createElementVNode"])("br",null,null,-1),A=["innerHTML"],M={key:1,style:{"padding-top":"2px"}},B=["onClick","title"],L=Object(d["createElementVNode"])("span",{class:"icon-edit"},null,-1),P=[L],H={key:2,style:{"padding-top":"2px"}},U=["onClick","title"],F=Object(d["createElementVNode"])("span",{class:"icon-delete"},null,-1),I=[F],R={key:0,class:"tableActionBar"},J=Object(d["createElementVNode"])("span",{class:"icon-add"},null,-1),z={class:"ui-confirm",ref:"confirm"},q=["value"],W=["value"],Y={class:"addEditGoal"},K=["innerHTML"],Q={class:"row goalIsTriggeredWhen"},X={class:"col s12"},Z={class:"row"},ee={class:"col s12 m6 goalTriggerType"},te={class:"col s12 m6"},ae=["innerHTML"],ne={class:"row whereTheMatchAttrbiute"},oe={class:"col s12"},le={class:"row"},re={class:"col s12 m6 l4"},ie={key:0,class:"col s12 m6 l4"},ce={key:1,class:"col s12 m6 l4"},se={class:"col s12 m6 l4"},ue={id:"examples_pattern",class:"col s12"},de=Object(d["createElementVNode"])("br",null,null,-1),be=Object(d["createElementVNode"])("br",null,null,-1),pe=Object(d["createElementVNode"])("br",null,null,-1),me=Object(d["createElementVNode"])("br",null,null,-1),Oe=Object(d["createElementVNode"])("br",null,null,-1),he=Object(d["createElementVNode"])("br",null,null,-1),je=Object(d["createElementVNode"])("br",null,null,-1),ge=Object(d["createElementVNode"])("br",null,null,-1),ve={ref:"endedittable"},fe=Object(d["createElementVNode"])("input",{type:"hidden",name:"goalIdUpdate",value:""},null,-1),ye={key:0},Ge=["innerHTML"],_e=Object(d["createElementVNode"])("a",{id:"bottom"},null,-1);function Ee(e,t,a,n,o,l){var r,i=Object(d["resolveComponent"])("ActivityIndicator"),c=Object(d["resolveComponent"])("ContentBlock"),s=Object(d["resolveComponent"])("Field"),u=Object(d["resolveComponent"])("Alert"),L=Object(d["resolveComponent"])("SaveButton"),F=Object(d["resolveDirective"])("content-table"),$=Object(d["resolveDirective"])("form");return Object(d["openBlock"])(),Object(d["createElementBlock"])("div",b,[Object(d["withDirectives"])(Object(d["createElementVNode"])("div",null,[Object(d["withDirectives"])(Object(d["createElementVNode"])("div",p,[Object(d["createVNode"])(c,{"content-title":e.translate("Goals_ManageGoals")},{default:Object(d["withCtx"])((function(){return[Object(d["createVNode"])(i,{loading:e.isLoading},null,8,["loading"]),Object(d["createElementVNode"])("div",m,[Object(d["createElementVNode"])("span",{innerHTML:e.$sanitize(e.learnMoreAboutGoalTracking)},null,8,O),e.ecommerceEnabled?Object(d["createCommentVNode"])("",!0):(Object(d["openBlock"])(),Object(d["createElementBlock"])("span",h,[j,g,Object(d["createTextVNode"])(" "+Object(d["toDisplayString"])(e.translate("Goals_Optional"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Ecommerce"))+": ",1),Object(d["createElementVNode"])("span",{innerHTML:e.$sanitize(e.youCanEnableEcommerceReports)},null,8,v)]))]),Object(d["withDirectives"])(Object(d["createElementVNode"])("table",null,[Object(d["createElementVNode"])("thead",null,[Object(d["createElementVNode"])("tr",null,[Object(d["createElementVNode"])("th",f,Object(d["toDisplayString"])(e.translate("General_Id")),1),Object(d["createElementVNode"])("th",null,Object(d["toDisplayString"])(e.translate("Goals_GoalName")),1),Object(d["createElementVNode"])("th",null,Object(d["toDisplayString"])(e.translate("General_Description")),1),Object(d["createElementVNode"])("th",null,Object(d["toDisplayString"])(e.translate("Goals_GoalIsTriggeredWhen")),1),Object(d["createElementVNode"])("th",null,Object(d["toDisplayString"])(e.translate("General_ColumnRevenue")),1),e.beforeGoalListActionsHeadComponent?(Object(d["openBlock"])(),Object(d["createBlock"])(Object(d["resolveDynamicComponent"])(e.beforeGoalListActionsHeadComponent),{key:0})):Object(d["createCommentVNode"])("",!0),e.userCanEditGoals?(Object(d["openBlock"])(),Object(d["createElementBlock"])("th",y,Object(d["toDisplayString"])(e.translate("General_Edit")),1)):Object(d["createCommentVNode"])("",!0),e.userCanEditGoals?(Object(d["openBlock"])(),Object(d["createElementBlock"])("th",G,Object(d["toDisplayString"])(e.translate("General_Delete")),1)):Object(d["createCommentVNode"])("",!0)])]),Object(d["createElementVNode"])("tbody",null,[Object.keys(e.goals||{}).length?Object(d["createCommentVNode"])("",!0):(Object(d["openBlock"])(),Object(d["createElementBlock"])("tr",_,[Object(d["createElementVNode"])("td",E,[V,Object(d["createTextVNode"])(" "+Object(d["toDisplayString"])(e.translate("Goals_ThereIsNoGoalToManage",e.siteName))+" ",1),N,w])])),(Object(d["openBlock"])(!0),Object(d["createElementBlock"])(d["Fragment"],null,Object(d["renderList"])(e.goals||[],(function(t){return Object(d["openBlock"])(),Object(d["createElementBlock"])("tr",{id:t.idgoal,key:t.idgoal},[Object(d["createElementVNode"])("td",S,Object(d["toDisplayString"])(t.idgoal),1),Object(d["createElementVNode"])("td",null,Object(d["toDisplayString"])(t.name),1),Object(d["createElementVNode"])("td",null,Object(d["toDisplayString"])(t.description),1),Object(d["createElementVNode"])("td",null,[Object(d["createElementVNode"])("span",k,Object(d["toDisplayString"])(e.goalMatchAttributeTranslations[t.match_attribute]||t.match_attribute),1),"visit_duration"===t.match_attribute?(Object(d["openBlock"])(),Object(d["createElementBlock"])("span",D,Object(d["toDisplayString"])(e.lcfirst(e.translate("General_OperationGreaterThan")))+" "+Object(d["toDisplayString"])(e.translate("Intl_NMinutes",t.pattern)),1)):t.pattern_type?(Object(d["openBlock"])(),Object(d["createElementBlock"])("span",C,[x,Object(d["createTextVNode"])(" "+Object(d["toDisplayString"])(e.translate("Goals_Pattern"))+" "+Object(d["toDisplayString"])(t.pattern_type)+": "+Object(d["toDisplayString"])(t.pattern),1)])):Object(d["createCommentVNode"])("",!0)]),Object(d["createElementVNode"])("td",{class:"center",innerHTML:e.$sanitize(0===t.revenue||"0"===t.revenue?"-":t.revenue_pretty)},null,8,A),e.beforeGoalListActionsBodyComponent[t.idgoal]?(Object(d["openBlock"])(),Object(d["createBlock"])(Object(d["resolveDynamicComponent"])(e.beforeGoalListActionsBodyComponent[t.idgoal]),{key:0})):Object(d["createCommentVNode"])("",!0),e.userCanEditGoals?(Object(d["openBlock"])(),Object(d["createElementBlock"])("td",M,[Object(d["createElementVNode"])("button",{onClick:function(a){return e.editGoal(t.idgoal)},class:"table-action",title:e.translate("General_Edit")},P,8,B)])):Object(d["createCommentVNode"])("",!0),e.userCanEditGoals?(Object(d["openBlock"])(),Object(d["createElementBlock"])("td",H,[Object(d["createElementVNode"])("button",{onClick:function(a){return e.deleteGoal(t.idgoal)},class:"table-action",title:e.translate("General_Delete")},I,8,U)])):Object(d["createCommentVNode"])("",!0)],8,T)})),128))])],512),[[F]]),e.userCanEditGoals&&!e.onlyShowAddNewGoal?(Object(d["openBlock"])(),Object(d["createElementBlock"])("div",R,[Object(d["createElementVNode"])("button",{id:"add-goal",onClick:t[0]||(t[0]=function(t){return e.createGoal()})},[J,Object(d["createTextVNode"])(" "+Object(d["toDisplayString"])(e.translate("Goals_AddNewGoal")),1)])])):Object(d["createCommentVNode"])("",!0)]})),_:1},8,["content-title"])],512),[[d["vShow"],e.showGoalList]]),Object(d["createElementVNode"])("div",z,[Object(d["createElementVNode"])("h2",null,Object(d["toDisplayString"])(e.translate("Goals_DeleteGoalConfirm",'"'.concat(null===(r=e.goalToDelete)||void 0===r?void 0:r.name,'"'))),1),Object(d["createElementVNode"])("input",{role:"yes",type:"button",value:e.translate("General_Yes")},null,8,q),Object(d["createElementVNode"])("input",{role:"no",type:"button",value:e.translate("General_No")},null,8,W)],512)],512),[[d["vShow"],!e.onlyShowAddNewGoal]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("div",null,[Object(d["withDirectives"])(Object(d["createElementVNode"])("div",Y,[Object(d["createVNode"])(c,{"content-title":e.goal.idgoal?e.translate("Goals_UpdateGoal"):e.translate("Goals_AddNewGoal")},{default:Object(d["withCtx"])((function(){return[Object(d["createElementVNode"])("div",{innerHTML:e.$sanitize(e.addNewGoalIntro)},null,8,K),Object(d["withDirectives"])(Object(d["createElementVNode"])("div",null,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"text",name:"goal_name",modelValue:e.goal.name,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.goal.name=t}),maxlength:50,title:e.translate("Goals_GoalName")},null,8,["modelValue","title"])]),Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"text",name:"goal_description",modelValue:e.goal.description,"onUpdate:modelValue":t[2]||(t[2]=function(t){return e.goal.description=t}),maxlength:255,title:e.translate("General_Description")},null,8,["modelValue","title"])]),Object(d["createElementVNode"])("div",Q,[Object(d["createElementVNode"])("div",X,[Object(d["createElementVNode"])("h3",null,Object(d["toDisplayString"])(e.translate("Goals_GoalIsTriggered")),1)])]),Object(d["createElementVNode"])("div",Z,[Object(d["createElementVNode"])("div",ee,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"select",name:"trigger_type","model-value":e.triggerType,"onUpdate:modelValue":t[3]||(t[3]=function(t){e.triggerType=t,e.changedTriggerType()}),"full-width":!0,options:e.goalTriggerTypeOptions},null,8,["model-value","options"])])]),Object(d["createElementVNode"])("div",te,[Object(d["withDirectives"])(Object(d["createVNode"])(u,{severity:"info"},{default:Object(d["withCtx"])((function(){return[Object(d["createElementVNode"])("span",{innerHTML:e.$sanitize(e.whereVisitedPageManuallyCallsJsTrackerText)},null,8,ae)]})),_:1},512),[[d["vShow"],"manually"===e.triggerType]]),Object(d["createElementVNode"])("div",null,[Object(d["withDirectives"])(Object(d["createVNode"])(s,{uicontrol:"radio",name:"match_attribute","full-width":!0,"model-value":e.goal.match_attribute,"onUpdate:modelValue":t[4]||(t[4]=function(t){e.goal.match_attribute=t,e.initPatternType()}),options:e.goalMatchAttributeOptions},null,8,["model-value","options"]),[[d["vShow"],"manually"!==e.triggerType]])])])]),Object(d["withDirectives"])(Object(d["createElementVNode"])("div",ne,[Object(d["createElementVNode"])("h3",oe,[Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("Goals_WhereThe"))+" ",1),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("Goals_URL")),513),[[d["vShow"],"url"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("Goals_PageTitle")),513),[[d["vShow"],"title"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("Goals_Filename")),513),[[d["vShow"],"file"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("Goals_ExternalWebsiteUrl")),513),[[d["vShow"],"external_website"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("Goals_VisitDuration")),513),[[d["vShow"],"visit_duration"===e.goal.match_attribute]])])],512),[[d["vShow"],"manually"!==e.triggerType]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("div",le,[Object(d["withDirectives"])(Object(d["createElementVNode"])("div",re,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"select",name:"event_type",modelValue:e.eventType,"onUpdate:modelValue":t[5]||(t[5]=function(t){return e.eventType=t}),"full-width":!0,options:e.eventTypeOptions},null,8,["modelValue","options"])])],512),[[d["vShow"],"event"===e.goal.match_attribute]]),e.isMatchAttributeNumeric?Object(d["createCommentVNode"])("",!0):(Object(d["openBlock"])(),Object(d["createElementBlock"])("div",ie,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"select",name:"pattern_type",modelValue:e.goal.pattern_type,"onUpdate:modelValue":t[6]||(t[6]=function(t){return e.goal.pattern_type=t}),"full-width":!0,options:e.patternTypeOptions},null,8,["modelValue","options"])])])),e.isMatchAttributeNumeric?(Object(d["openBlock"])(),Object(d["createElementBlock"])("div",ce,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"select",name:"pattern_type",modelValue:e.goal.pattern_type,"onUpdate:modelValue":t[7]||(t[7]=function(t){return e.goal.pattern_type=t}),"full-width":!0,options:e.numericComparisonTypeOptions},null,8,["modelValue","options"])])])):Object(d["createCommentVNode"])("",!0),Object(d["createElementVNode"])("div",se,[Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"text",name:"pattern",modelValue:e.goal.pattern,"onUpdate:modelValue":t[8]||(t[8]=function(t){return e.goal.pattern=t}),maxlength:255,title:e.patternFieldLabel,"full-width":!0},null,8,["modelValue","title"])])]),Object(d["createElementVNode"])("div",ue,[Object(d["createVNode"])(u,{severity:"info"},{default:Object(d["withCtx"])((function(){return[Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,[Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Contains","'checkout/confirmation'"))+" ",1),de,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_IsExactly","'http://example.com/thank-you.html'"))+" ",1),be,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_MatchesExpression","'(.*)\\/demo\\/(.*)'")),1)],512),[[d["vShow"],"url"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Contains","'Order confirmation'")),513),[[d["vShow"],"title"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,[Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Contains","'files/brochure.pdf'"))+" ",1),pe,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_IsExactly","'http://example.com/files/brochure.pdf'"))+" ",1),me,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_MatchesExpression","'(.*)\\.zip'")),1)],512),[[d["vShow"],"file"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,[Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Contains","'amazon.com'"))+" ",1),Oe,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_IsExactly","'http://mypartner.com/landing.html'"))+" ",1),he,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.matchesExpressionExternal),1)],512),[[d["vShow"],"external_website"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,[Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Contains","'video'"))+" ",1),je,Object(d["createTextVNode"])(" "+Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_IsExactly","'click'"))+" ",1),ge,Object(d["createTextVNode"])(Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_MatchesExpression","'(.*)_banner'"))+'" ',1)],512),[[d["vShow"],"event"===e.goal.match_attribute]]),Object(d["withDirectives"])(Object(d["createElementVNode"])("span",null,Object(d["toDisplayString"])(e.translate("General_ForExampleShort"))+" "+Object(d["toDisplayString"])(e.translate("Goals_AtLeastMinutes","5","0.5")),513),[[d["vShow"],"visit_duration"===e.goal.match_attribute]])]})),_:1})])],512),[[d["vShow"],"manually"!==e.triggerType]]),Object(d["createElementVNode"])("div",null,[Object(d["withDirectives"])(Object(d["createVNode"])(s,{uicontrol:"checkbox",name:"case_sensitive",modelValue:e.goal.case_sensitive,"onUpdate:modelValue":t[9]||(t[9]=function(t){return e.goal.case_sensitive=t}),title:e.caseSensitiveTitle},null,8,["modelValue","title"]),[[d["vShow"],"manually"!==e.triggerType&&!e.isMatchAttributeNumeric]])]),Object(d["createElementVNode"])("div",null,["visit_duration"!==e.goal.match_attribute?(Object(d["openBlock"])(),Object(d["createBlock"])(s,{key:0,uicontrol:"radio",name:"allow_multiple","model-value":e.goal.allow_multiple?1:0,"onUpdate:modelValue":t[10]||(t[10]=function(t){return e.goal.allow_multiple=t}),options:e.allowMultipleOptions,introduction:e.translate("Goals_AllowMultipleConversionsPerVisit"),"inline-help":e.translate("Goals_HelpOneConversionPerVisit")},null,8,["model-value","options","introduction","inline-help"])):Object(d["createCommentVNode"])("",!0)]),Object(d["createElementVNode"])("h3",null,Object(d["toDisplayString"])(e.translate("Goals_GoalRevenue"))+" "+Object(d["toDisplayString"])(e.translate("Goals_Optional")),1),Object(d["createElementVNode"])("div",null,[Object(d["createVNode"])(s,{uicontrol:"number",name:"revenue",modelValue:e.goal.revenue,"onUpdate:modelValue":t[11]||(t[11]=function(t){return e.goal.revenue=t}),placeholder:e.translate("Goals_DefaultRevenueLabel"),"inline-help":e.translate("Goals_DefaultRevenueHelp")},null,8,["modelValue","placeholder","inline-help"])]),Object(d["createElementVNode"])("div",null,[Object(d["withDirectives"])(Object(d["createVNode"])(s,{uicontrol:"checkbox",name:"use_event_value",modelValue:e.goal.event_value_as_revenue,"onUpdate:modelValue":t[12]||(t[12]=function(t){return e.goal.event_value_as_revenue=t}),title:e.translate("Goals_UseEventValueAsRevenue"),"inline-help":e.useEventValueAsRevenueHelp},null,8,["modelValue","title","inline-help"]),[[d["vShow"],"event"===e.goal.match_attribute]])]),Object(d["createElementVNode"])("div",ve,[e.endEditTableComponent?(Object(d["openBlock"])(),Object(d["createBlock"])(Object(d["resolveDynamicComponent"])(e.endEditTableComponent),{key:0})):Object(d["createCommentVNode"])("",!0)],512),fe,Object(d["createVNode"])(L,{saving:e.isLoading,onConfirm:t[13]||(t[13]=function(t){return e.save()}),value:e.submitText},null,8,["saving","value"]),e.onlyShowAddNewGoal?Object(d["createCommentVNode"])("",!0):(Object(d["openBlock"])(),Object(d["createElementBlock"])("div",ye,[Object(d["withDirectives"])(Object(d["createElementVNode"])("div",{class:"entityCancel",onClick:t[14]||(t[14]=function(t){return e.showListOfReports()}),innerHTML:e.$sanitize(e.cancelText)},null,8,Ge),[[d["vShow"],e.showEditGoal]])]))],512),[[$]])]})),_:1},8,["content-title"])],512),[[d["vShow"],e.showEditGoal]])],512),[[d["vShow"],e.userCanEditGoals]]),_e])}var Ve=a("a5a2");function Ne(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function we(e,t){for(var a=0;a<t.length;a++){var n=t[a];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function Te(e,t,a){return t&&we(e.prototype,t),a&&we(e,a),e}function Se(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e} +/*! +* Matomo - free/libre analytics platform +* +* @link https://matomo.org +* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +*/var ke=function(){function e(t,a){Ne(this,e),Se(this,"parameters",void 0),Se(this,"options",void 0),this.parameters=t,this.options=a}return Te(e,[{key:"addParams",value:function(e){Object.assign(this.parameters,e)}},{key:"withTokenInUrl",value:function(){this.options.withTokenInUrl=!0}},{key:"reset",value:function(){var e=this;Object.keys(this.parameters).forEach((function(t){delete e.parameters[t]})),delete this.options.postParams}},{key:"addPostParams",value:function(e){this.options.postParams=Object.assign(Object.assign({},this.options.postParams),e)}}]),e}();function De(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ce(e,t){for(var a=0;a<t.length;a++){var n=t[a];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function xe(e,t,a){return t&&Ce(e.prototype,t),a&&Ce(e,a),e}function Ae(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e} +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */var Me=function(){function e(){var t=this;De(this,e),Ae(this,"privateState",Object(d["reactive"])({})),Ae(this,"idGoal",Object(d["computed"])((function(){return t.privateState.idGoal})))}return xe(e,[{key:"setIdGoalShown",value:function(e){this.privateState.idGoal=e}}]),e}(),Be=new Me,Le=Object(d["defineComponent"])({inheritAttrs:!1,props:{onlyShowAddNewGoal:Boolean,userCanEditGoals:Boolean,ecommerceEnabled:Boolean,goals:{type:Object,required:!0},addNewGoalIntro:String,goalTriggerTypeOptions:Object,goalMatchAttributeOptions:Array,eventTypeOptions:Array,patternTypeOptions:Array,numericComparisonTypeOptions:Array,allowMultipleOptions:Array,showAddGoal:Boolean,showGoal:Number,beforeGoalListActionsBody:Object,endEditTable:String,beforeGoalListActionsHead:String},data:function(){return{showEditGoal:!1,showGoalList:!0,goal:{},isLoading:!1,eventType:"event_category",triggerType:"visitors",apiMethod:"",submitText:"",goalToDelete:null,addEditTableComponent:!1}},components:{SaveButton:Ve["SaveButton"],ContentBlock:l["ContentBlock"],ActivityIndicator:l["ActivityIndicator"],Field:Ve["Field"],Alert:l["Alert"]},directives:{ContentTable:l["ContentTable"],Form:Ve["Form"]},created:function(){Be.setIdGoalShown(this.showGoal)},unmounted:function(){Be.setIdGoalShown(void 0)},mounted:function(){var e=this;this.showAddGoal?this.createGoal():this.showGoal?this.editGoal(this.showGoal):this.showListOfReports(),Object(d["nextTick"])((function(){e.addEditTableComponent=!0,Object(d["nextTick"])((function(){var t=e.$refs.endedittable,a=l["Matomo"].helper.getAngularDependency("$rootScope").$new(!0);$(t).data("scope",a),l["Matomo"].helper.compileAngularComponents(t,{scope:a})}))}))},beforeUnmount:function(){var e=this.$refs.endedittable;$(e).data("scope").$destroy()},methods:{scrollToTop:function(){setTimeout((function(){l["Matomo"].helper.lazyScrollTo(".pageWrap",200)}))},initGoalForm:function(e,t,a,n,o,r,i,c,s,u,d,b){l["Matomo"].postEvent("Goals.beforeInitGoalForm",e,b),this.apiMethod=e,this.goal={},this.goal.name=a,this.goal.description=n;var p=o;"manually"===p?(this.triggerType="manually",p="url"):this.triggerType="visitors",0===p.indexOf("event")?(this.eventType=p,p="event"):this.eventType="event_category",this.goal.match_attribute=p,this.goal.allow_multiple=u,this.goal.pattern_type=i,this.goal.pattern=r,this.goal.case_sensitive=c,this.goal.revenue=s,this.goal.event_value_as_revenue=d,this.submitText=t,this.goal.idgoal=b},showListOfReports:function(){l["Matomo"].postEvent("Goals.cancelForm"),this.showGoalList=!0,this.showEditGoal=!1,this.scrollToTop()},showAddEditForm:function(){this.showGoalList=!1,this.showEditGoal=!0},createGoal:function(){var e={isAllowed:!0};l["Matomo"].postEvent("Goals.initAddGoal",e),e&&!e.isAllowed||(this.showAddEditForm(),this.initGoalForm("Goals.addGoal",Object(l["translate"])("Goals_AddGoal"),"","","url","","contains",!1,0,!1,!1,0),this.scrollToTop())},editGoal:function(e){this.showAddEditForm();var t=this.goals["".concat(e)];this.initGoalForm("Goals.updateGoal",Object(l["translate"])("Goals_UpdateGoal"),t.name,t.description,t.match_attribute,t.pattern,t.pattern_type,!!t.case_sensitive&&"0"!==t.case_sensitive,parseInt("".concat(t.revenue),10),!!t.allow_multiple&&"0"!==t.allow_multiple,!!t.event_value_as_revenue&&"0"!==t.event_value_as_revenue,e),this.scrollToTop()},deleteGoal:function(e){var t=this;this.goalToDelete=this.goals["".concat(e)],l["Matomo"].helper.modalConfirm(this.$refs.confirm,{yes:function(){t.isLoading=!0,l["AjaxHelper"].fetch({idGoal:e,method:"Goals.deleteGoal"}).then((function(){window.location.reload()})).finally((function(){t.isLoading=!1}))}})},save:function(){var e=this,t={};t.name=this.goal.name,t.description=this.goal.description,this.isManuallyTriggered?(t.matchAttribute="manually",t.patternType="regex",t.pattern=".*",t.caseSensitive=0):(t.matchAttribute=this.goal.match_attribute,"event"===t.matchAttribute&&(t.matchAttribute=this.eventType),t.patternType=this.goal.pattern_type,t.pattern=this.goal.pattern,t.caseSensitive=this.goal.case_sensitive?1:0),t.revenue=this.goal.revenue||0,t.allowMultipleConversionsPerVisit=this.goal.allow_multiple?1:0,t.useEventValueAsRevenue=this.goal.event_value_as_revenue?1:0,t.idGoal=this.goal.idgoal,t.method=this.apiMethod;var a="Goals.addGoal"===t.method,n="Goals.updateGoal"===t.method,o={},r=new ke(t,o);n?l["Matomo"].postEvent("Goals.beforeUpdateGoal",t,r):a&&l["Matomo"].postEvent("Goals.beforeAddGoal",t,r),null!==t&&void 0!==t&&t.cancelRequest||(this.isLoading=!0,l["AjaxHelper"].fetch(t,o).then((function(){var t=l["MatomoUrl"].parsed.value.subcategory;"Goals_AddNewGoal"===t&&l["Matomo"].helper.isAngularRenderingThePage()?l["ReportingMenuStore"].reloadMenuItems().then((function(){l["MatomoUrl"].updateHash(Object.assign(Object.assign({},l["MatomoUrl"].hashParsed.value),{},{subcategory:"Goals_ManageGoals"})),e.isLoading=!1})):window.location.reload()})).catch((function(){e.scrollToTop(),e.isLoading=!1})))},changedTriggerType:function(){this.isManuallyTriggered||this.goal.pattern_type||(this.goal.pattern_type="contains")},initPatternType:function(){this.isMatchAttributeNumeric?this.goal.pattern_type="greater_than":this.goal.pattern_type="contains"},lcfirst:function(e){return"".concat(e.slice(0,1).toLowerCase()).concat(e.slice(1))},ucfirst:function(e){return"".concat(e.slice(0,1).toUpperCase()).concat(e.slice(1))}},computed:{learnMoreAboutGoalTracking:function(){return Object(l["translate"])("Goals_LearnMoreAboutGoalTrackingDocumentation",'<a target="_blank" rel="noreferrer noopener" href="https://matomo.org/docs/tracking-goals-web-analytics/">',"</a>")},youCanEnableEcommerceReports:function(){var e=l["MatomoUrl"].stringify(Object.assign(Object.assign({},l["MatomoUrl"].urlParsed.value),{},{module:"SitesManager",action:"index"})),t='<a href="https://matomo.org/docs/ecommerce-analytics/" '+'rel="noreferrer noopener" target="_blank">'.concat(Object(l["translate"])("Goals_EcommerceReports"),"</a>"),a="<a href='".concat(e,"'>").concat(Object(l["translate"])("SitesManager_WebsitesManagement"),"</a>");return Object(l["translate"])("Goals_YouCanEnableEcommerceReports",t,a)},siteName:function(){return l["Matomo"].helper.htmlDecode(l["Matomo"].siteName)},whereVisitedPageManuallyCallsJsTrackerText:function(){var e="https://developer.matomo.org/guides/tracking-javascript-guide#manually-trigger-goal-conversions";return Object(l["translate"])("Goals_WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore",'<a target="_blank" rel="noreferrer noopener" href="'.concat(e,'">'),"</a>")},caseSensitiveTitle:function(){return"".concat(Object(l["translate"])("Goals_CaseSensitive")," ").concat(Object(l["translate"])("Goals_Optional"))},useEventValueAsRevenueHelp:function(){return"".concat(Object(l["translate"])("Goals_EventValueAsRevenueHelp")," <br/><br/> ").concat(Object(l["translate"])("Goals_EventValueAsRevenueHelp2"))},cancelText:function(){return Object(l["translate"])("General_OrCancel","<a class='entityCancelLink'>","</a>")},isMatchAttributeNumeric:function(){return["visit_duration"].indexOf(this.goal.match_attribute)>-1},patternFieldLabel:function(){return"visit_duration"===this.goal.match_attribute?Object(l["translate"])("Goals_TimeInMinutes"):Object(l["translate"])("Goals_Pattern")},goalMatchAttributeTranslations:function(){return{manually:Object(l["translate"])("Goals_ManuallyTriggeredUsingJavascriptFunction"),file:Object(l["translate"])("Goals_Download"),url:Object(l["translate"])("Goals_VisitUrl"),title:Object(l["translate"])("Goals_VisitPageTitle"),external_website:Object(l["translate"])("Goals_ClickOutlink"),event_action:"".concat(Object(l["translate"])("Goals_SendEvent")," (").concat(Object(l["translate"])("Events_EventAction"),")"),event_category:"".concat(Object(l["translate"])("Goals_SendEvent")," (").concat(Object(l["translate"])("Events_EventCategory"),")"),event_name:"".concat(Object(l["translate"])("Goals_SendEvent")," (").concat(Object(l["translate"])("Events_EventName"),")"),visit_duration:"".concat(this.ucfirst(Object(l["translate"])("Goals_VisitDuration")))}},beforeGoalListActionsBodyComponent:function(){var e=this;if(!this.beforeGoalListActionsBody)return{};var t={};return Object.values(this.goals).forEach((function(a){var n=e.beforeGoalListActionsBody[a.idgoal];n&&(t[a.idgoal]={template:n})})),Object(d["markRaw"])(t)},endEditTableComponent:function(){if(!this.endEditTable||!this.addEditTableComponent)return null;var e=this.$refs.endedittable;return Object(d["markRaw"])({template:this.endEditTable,mounted:function(){l["Matomo"].helper.compileVueEntryComponents(e)},beforeUnmount:function(){l["Matomo"].helper.destroyVueComponent(e)}})},beforeGoalListActionsHeadComponent:function(){return this.beforeGoalListActionsHead?Object(d["markRaw"])({template:this.beforeGoalListActionsHead}):null},isManuallyTriggered:function(){return"manually"===this.triggerType},matchesExpressionExternal:function(){var e="'http://www.amazon.com\\/(.*)\\/yourAffiliateId'";return Object(l["translate"])("Goals_MatchesExpression",e)}}});Le.render=Ee;var Pe=Le; +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */Object(l["createAngularJsAdapter"])({component:Pe,directiveName:"piwikManageGoals",scope:{userCanEditGoals:{angularJsBind:"<"},onlyShowAddNewGoal:{angularJsBind:"<"},ecommerceEnabled:{angularJsBind:"<"},goals:{angularJsBind:"<"},showGoal:{angularJsBind:"<"},showAddGoal:{angularJsBind:"<"},addNewGoalIntro:{angularJsBind:"<"},goalTriggerTypeOptions:{angularJsBind:"<"},goalMatchAttributeOptions:{angularJsBind:"<"},eventTypeOptions:{angularJsBind:"<"},patternTypeOptions:{angularJsBind:"<"},numericComparisonTypeOptions:{angularJsBind:"<"},allowMultipleOptions:{angularJsBind:"<"},beforeGoalListActionsBody:{angularJsBind:"<"},endEditTable:{angularJsBind:"<"},beforeGoalListActionsHead:{angularJsBind:"<"}}})}})})); +//# sourceMappingURL=Goals.umd.min.js.map
\ No newline at end of file diff --git a/plugins/Goals/vue/dist/umd.metadata.json b/plugins/Goals/vue/dist/umd.metadata.json new file mode 100644 index 0000000000..dce4477a3c --- /dev/null +++ b/plugins/Goals/vue/dist/umd.metadata.json @@ -0,0 +1,6 @@ +{ + "dependsOn": [ + "CoreHome", + "CorePluginsAdmin" + ] +}
\ No newline at end of file diff --git a/plugins/Goals/vue/src/Goal.ts b/plugins/Goals/vue/src/Goal.ts new file mode 100644 index 0000000000..7609ea75ee --- /dev/null +++ b/plugins/Goals/vue/src/Goal.ts @@ -0,0 +1,24 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +interface Goal { + idgoal: string|number; + name: string; + allow_multiple: string|number|boolean; + case_sensitive: string|number|boolean; + deleted: string|number|boolean; + description: string; + event_value_as_revenue: string|number|boolean; + idsite: string|number; + match_attribute: string; + pattern: string; + pattern_type: string; + revenue: string|number; + revenue_pretty?: string; +} + +export default Goal; diff --git a/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.adapter.ts b/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.adapter.ts new file mode 100644 index 0000000000..5966c7f3c1 --- /dev/null +++ b/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.adapter.ts @@ -0,0 +1,30 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +import { IAttributes, IDirective, IScope } from 'angular'; +import GoalPageLink from './GoalPageLink'; + +export default function piwikGoalPageLink(): IDirective { + return { + restrict: 'A', + link: function piwikGoalPageLinkLink(scope: IScope, element: JQuery, attrs: IAttributes) { + const binding = { + instance: null, + value: { + idGoal: attrs.piwikGoalPageLink, + }, + oldValue: null, + modifiers: {}, + dir: {}, + }; + + GoalPageLink.mounted(element[0], binding); + }, + }; +} + +window.angular.module('piwikApp').directive('piwikGoalPageLink', piwikGoalPageLink); diff --git a/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.ts b/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.ts new file mode 100644 index 0000000000..c4a62da735 --- /dev/null +++ b/plugins/Goals/vue/src/GoalPageLink/GoalPageLink.ts @@ -0,0 +1,69 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +import { DirectiveBinding } from 'vue'; +import { Matomo, translate, MatomoUrl } from 'CoreHome'; + +interface GoalPageLinkArgs { + idGoal: string|number; +} + +const { $ } = window; + +// usage v-goal-page-link="{ idGoal: 5 }" +const GoalPageLink = { + mounted(el: HTMLElement, binding: DirectiveBinding<GoalPageLinkArgs>): void { + if (!Matomo.helper.isAngularRenderingThePage()) { + return; + } + + const title = $(el).text(); + + const link = $('<a></a>'); + link.text(title); + link.attr('title', translate('Goals_ClickToViewThisGoal')); + link.click((e) => { + e.preventDefault(); + + MatomoUrl.updateHash({ + ...MatomoUrl.hashParsed.value, + category: 'Goals_Goals', + subcategory: binding.value.idGoal, + }); + }); + + $(el).html(link[0]); + }, +}; + +export default GoalPageLink; + +// manually handle occurrence of goal-page-link on datatable html attributes since dataTable.js is +// not managed by vue. +// eslint-disable-next-line @typescript-eslint/no-explicit-any +Matomo.on('Matomo.processDynamicHtml', ($element: JQuery) => { + $element.find('[goal-page-link]').each((i, e) => { + if ($(e).attr('goal-page-link-handled')) { + return; + } + + const idGoal = $(e).attr('goal-page-link'); + if (idGoal) { + GoalPageLink.mounted(e, { + instance: null, + value: { + idGoal, + }, + oldValue: null, + modifiers: {}, + dir: {}, + }); + } + + $(e).attr('goal-page-link-handled', '1'); + }); +}); diff --git a/plugins/Goals/vue/src/ManageGoals/ManageGoals.adapter.ts b/plugins/Goals/vue/src/ManageGoals/ManageGoals.adapter.ts new file mode 100644 index 0000000000..72237788a8 --- /dev/null +++ b/plugins/Goals/vue/src/ManageGoals/ManageGoals.adapter.ts @@ -0,0 +1,64 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +import { createAngularJsAdapter } from 'CoreHome'; +import ManageGoals from './ManageGoals.vue'; + +export default createAngularJsAdapter({ + component: ManageGoals, + directiveName: 'piwikManageGoals', + scope: { + userCanEditGoals: { + angularJsBind: '<', + }, + onlyShowAddNewGoal: { + angularJsBind: '<', + }, + ecommerceEnabled: { + angularJsBind: '<', + }, + goals: { + angularJsBind: '<', + }, + showGoal: { + angularJsBind: '<', + }, + showAddGoal: { + angularJsBind: '<', + }, + addNewGoalIntro: { + angularJsBind: '<', + }, + goalTriggerTypeOptions: { + angularJsBind: '<', + }, + goalMatchAttributeOptions: { + angularJsBind: '<', + }, + eventTypeOptions: { + angularJsBind: '<', + }, + patternTypeOptions: { + angularJsBind: '<', + }, + numericComparisonTypeOptions: { + angularJsBind: '<', + }, + allowMultipleOptions: { + angularJsBind: '<', + }, + beforeGoalListActionsBody: { + angularJsBind: '<', + }, + endEditTable: { + angularJsBind: '<', + }, + beforeGoalListActionsHead: { + angularJsBind: '<', + }, + }, +}); diff --git a/plugins/Goals/vue/src/ManageGoals/ManageGoals.store.ts b/plugins/Goals/vue/src/ManageGoals/ManageGoals.store.ts new file mode 100644 index 0000000000..d6c09809b4 --- /dev/null +++ b/plugins/Goals/vue/src/ManageGoals/ManageGoals.store.ts @@ -0,0 +1,24 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +import { computed, reactive } from 'vue'; + +interface ManageGoalsStoreState { + idGoal?: number; +} + +class ManageGoalsStore { + private privateState = reactive<ManageGoalsStoreState>({}); + + readonly idGoal = computed(() => this.privateState.idGoal); + + setIdGoalShown(idGoal?: number) { + this.privateState.idGoal = idGoal; + } +} + +export default new ManageGoalsStore(); diff --git a/plugins/Goals/vue/src/ManageGoals/ManageGoals.vue b/plugins/Goals/vue/src/ManageGoals/ManageGoals.vue new file mode 100644 index 0000000000..0e155fd934 --- /dev/null +++ b/plugins/Goals/vue/src/ManageGoals/ManageGoals.vue @@ -0,0 +1,840 @@ +<!-- + Matomo - free/libre analytics platform + @link https://matomo.org + @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +--> + +<template> + <div class="manageGoals"> + <!-- v-show required until funnels/multiattribution are using vue and not angularjs --> + <div v-show="!onlyShowAddNewGoal"> + <div + id='entityEditContainer' + feature="true" + v-show="showGoalList" + class="managegoals" + > + <ContentBlock :content-title="translate('Goals_ManageGoals')"> + <ActivityIndicator :loading="isLoading"/> + + <div class="contentHelp"> + <span v-html="$sanitize(learnMoreAboutGoalTracking)"/> + <span v-if="!ecommerceEnabled"> + <br /><br/> + + {{ translate('Goals_Optional') }} {{ translate('Goals_Ecommerce') }}: + <span v-html="$sanitize(youCanEnableEcommerceReports)"/> + </span> + </div> + + <table v-content-table> + <thead> + <tr> + <th class="first">{{ translate('General_Id') }}</th> + <th>{{ translate('Goals_GoalName') }}</th> + <th>{{ translate('General_Description') }}</th> + <th>{{ translate('Goals_GoalIsTriggeredWhen') }}</th> + <th>{{ translate('General_ColumnRevenue') }}</th> + + <component + v-if="beforeGoalListActionsHeadComponent" + :is="beforeGoalListActionsHeadComponent" + ></component> + + <th v-if="userCanEditGoals">{{ translate('General_Edit') }}</th> + <th v-if="userCanEditGoals">{{ translate('General_Delete') }}</th> + </tr> + </thead> + <tbody> + <tr v-if="!Object.keys(goals || {}).length"> + <td colspan='8'> + <br/> + {{ translate('Goals_ThereIsNoGoalToManage', siteName) }} + <br/><br/> + </td> + </tr> + <tr v-for="goal in goals || []" :id="goal.idgoal" :key="goal.idgoal"> + <td class="first">{{ goal.idgoal }}</td> + <td>{{ goal.name }}</td> + <td>{{ goal.description }}</td> + <td> + <span class='matchAttribute'> + {{ goalMatchAttributeTranslations[goal.match_attribute] + || goal.match_attribute }} + </span> + <span v-if="goal.match_attribute === 'visit_duration'"> + {{ lcfirst(translate('General_OperationGreaterThan')) }} + {{ translate('Intl_NMinutes', goal.pattern) }} + </span> + <span v-else-if="!!goal.pattern_type"> + <br/> + {{ translate('Goals_Pattern') }} {{ goal.pattern_type }}: {{ goal.pattern }} + </span> + </td> + <td + class="center" + v-html="$sanitize( + goal.revenue === 0 || goal.revenue === '0' ? '-' : goal.revenue_pretty, + )" + > + </td> + + <component + v-if="beforeGoalListActionsBodyComponent[goal.idgoal]" + :is="beforeGoalListActionsBodyComponent[goal.idgoal]" + ></component> + + <td v-if="userCanEditGoals" style="padding-top:2px"> + <button + @click="editGoal(goal.idgoal)" + class="table-action" + :title="translate('General_Edit')" + > + <span class="icon-edit"></span> + </button> + </td> + <td v-if="userCanEditGoals" style="padding-top:2px"> + <button + @click="deleteGoal(goal.idgoal)" + class="table-action" + :title="translate('General_Delete')" + > + <span class="icon-delete"></span> + </button> + </td> + </tr> + </tbody> + </table> + + <div class="tableActionBar" v-if="userCanEditGoals && !onlyShowAddNewGoal"> + <button id="add-goal" @click="createGoal()"> + <span class="icon-add"></span> + {{ translate('Goals_AddNewGoal') }} + </button> + </div> + </ContentBlock> + </div> + + <div class="ui-confirm" ref="confirm"> + <h2>{{ translate('Goals_DeleteGoalConfirm', `"${goalToDelete?.name}"`) }}</h2> + <input role="yes" type="button" :value="translate('General_Yes')"/> + <input role="no" type="button" :value="translate('General_No')"/> + </div> + </div> + + <!-- v-show required until funnels/multiattribution are using vue and not angularjs --> + <div v-show="userCanEditGoals"> + <div class="addEditGoal" v-show="showEditGoal"> + <ContentBlock + :content-title="goal.idgoal + ? translate('Goals_UpdateGoal') + : translate('Goals_AddNewGoal')" + > + <div v-html="$sanitize(addNewGoalIntro)"></div> + + <div v-form> + <div> + <Field + uicontrol="text" + name="goal_name" + v-model="goal.name" + :maxlength="50" + :title="translate('Goals_GoalName')"> + </Field> + </div> + + <div> + <Field + uicontrol="text" + name="goal_description" + v-model="goal.description" + :maxlength="255" + :title="translate('General_Description')" + /> + </div> + + <div class="row goalIsTriggeredWhen"> + <div class="col s12"> + <h3>{{ translate('Goals_GoalIsTriggered') }}</h3> + </div> + </div> + + <div class="row"> + <div class="col s12 m6 goalTriggerType"> + <div> + <Field + uicontrol="select" name="trigger_type" + :model-value="triggerType" + @update:model-value="triggerType = $event; changedTriggerType()" + :full-width="true" + :options="goalTriggerTypeOptions" + /> + </div> + </div> + <div class="col s12 m6"> + <Alert severity="info" v-show="triggerType === 'manually'"> + <span v-html="$sanitize(whereVisitedPageManuallyCallsJsTrackerText)"></span> + </Alert> + + <div> + <Field + uicontrol="radio" + name="match_attribute" + v-show="triggerType !== 'manually'" + :full-width="true" + :model-value="goal.match_attribute" + @update:model-value="goal.match_attribute = $event; initPatternType()" + :options="goalMatchAttributeOptions" + /> + </div> + </div> + </div> + + <div class="row whereTheMatchAttrbiute" v-show="triggerType !== 'manually'"> + <h3 class="col s12">{{ translate('Goals_WhereThe') }} + <span v-show="goal.match_attribute === 'url'"> + {{ translate('Goals_URL') }} + </span> + <span v-show="goal.match_attribute === 'title'"> + {{ translate('Goals_PageTitle') }} + </span> + <span v-show="goal.match_attribute === 'file'"> + {{ translate('Goals_Filename') }} + </span> + <span v-show="goal.match_attribute === 'external_website'"> + {{ translate('Goals_ExternalWebsiteUrl') }} + </span> + <span v-show="goal.match_attribute === 'visit_duration'"> + {{ translate('Goals_VisitDuration') }} + </span> + </h3> + </div> + + <div class="row" v-show="triggerType !== 'manually'"> + <div class="col s12 m6 l4" + v-show="goal.match_attribute === 'event'"> + <div> + <Field + uicontrol="select" name="event_type" + v-model="eventType" + :full-width="true" + :options="eventTypeOptions" + /> + </div> + </div> + + <div class="col s12 m6 l4" v-if="!isMatchAttributeNumeric"> + <div> + <Field + uicontrol="select" + name="pattern_type" + v-model="goal.pattern_type" + :full-width="true" + :options="patternTypeOptions" + /> + </div> + </div> + + <div class="col s12 m6 l4" v-if="isMatchAttributeNumeric"> + <div> + <Field + uicontrol="select" name="pattern_type" + v-model="goal.pattern_type" + :full-width="true" + :options="numericComparisonTypeOptions" + /> + </div> + </div> + + <div class="col s12 m6 l4"> + <div> + <Field + uicontrol="text" name="pattern" + v-model="goal.pattern" + :maxlength="255" + :title="patternFieldLabel" + :full-width="true" + /> + </div> + </div> + + <div id="examples_pattern" class="col s12"> + <Alert severity="info"> + <span v-show="goal.match_attribute === 'url'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_Contains', "'checkout/confirmation'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_IsExactly', "'http://example.com/thank-you.html'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_MatchesExpression', "'(.*)\\\/demo\\\/(.*)'") }} + </span> + <span v-show="goal.match_attribute === 'title'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_Contains', "'Order confirmation'") }} + </span> + <span v-show="goal.match_attribute === 'file'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_Contains', "'files/brochure.pdf'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_IsExactly', "'http://example.com/files/brochure.pdf'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_MatchesExpression', "'(.*)\\\.zip'") }} + </span> + <span v-show="goal.match_attribute === 'external_website'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_Contains', "'amazon.com'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_IsExactly', "'http://mypartner.com/landing.html'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ matchesExpressionExternal }} + </span> + <span v-show="goal.match_attribute === 'event'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_Contains', "'video'") }} + <br /> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_IsExactly', "'click'") }} + <br />{{ translate('General_ForExampleShort') }} + {{ translate('Goals_MatchesExpression', "'(.*)_banner'") }}" + </span> + <span v-show="goal.match_attribute === 'visit_duration'"> + {{ translate('General_ForExampleShort') }} + {{ translate('Goals_AtLeastMinutes', '5', '0.5') }} + </span> + </Alert> + </div> + </div> + + <div> + <Field + uicontrol="checkbox" + name="case_sensitive" + v-model="goal.case_sensitive" + v-show="triggerType !== 'manually' && !isMatchAttributeNumeric" + :title="caseSensitiveTitle" + /> + </div> + + <div> + <Field + uicontrol="radio" + name="allow_multiple" + :model-value="goal.allow_multiple ? 1 : 0" + @update:model-value="goal.allow_multiple = $event" + v-if="goal.match_attribute !== 'visit_duration'" + :options="allowMultipleOptions" + :introduction="translate('Goals_AllowMultipleConversionsPerVisit')" + :inline-help="translate('Goals_HelpOneConversionPerVisit')" + /> + </div> + + <h3>{{ translate('Goals_GoalRevenue') }} {{ translate('Goals_Optional') }}</h3> + + <div> + <Field + uicontrol="number" + name="revenue" + v-model="goal.revenue" + :placeholder="translate('Goals_DefaultRevenueLabel')" + :inline-help="translate('Goals_DefaultRevenueHelp')" + /> + </div> + + <div> + <Field + uicontrol="checkbox" + name="use_event_value" + v-model="goal.event_value_as_revenue" + :title="translate('Goals_UseEventValueAsRevenue')" + v-show="goal.match_attribute === 'event'" + :inline-help="useEventValueAsRevenueHelp" + /> + </div> + + <div ref="endedittable"> + <component :is="endEditTableComponent" v-if="endEditTableComponent"/> + </div> + + <input type="hidden" name="goalIdUpdate" value=""/> + + <SaveButton + :saving="isLoading" + @confirm="save()" + :value="submitText" + /> + + <div v-if="!onlyShowAddNewGoal"> + <div + class='entityCancel' + v-show="showEditGoal" + @click="showListOfReports()" + v-html="$sanitize(cancelText)" + > + </div> + </div> + </div> + </ContentBlock> + </div> + </div> + + <a id='bottom'></a> + </div> +</template> + +<script lang="ts"> +import { IScope } from 'angular'; +import { defineComponent, markRaw, nextTick } from 'vue'; +import { + Matomo, + AjaxHelper, + AjaxOptions, + translate, + ContentBlock, + ActivityIndicator, + MatomoUrl, + ContentTable, + Alert, + ReportingMenuStore, +} from 'CoreHome'; +import { + Form, + Field, + SaveButton, +} from 'CorePluginsAdmin'; +import Goal from '../Goal'; +import PiwikApiMock from './PiwikApiMock'; +import ManageGoalsStore from './ManageGoals.store'; + +interface ManageGoalsState { + showEditGoal: boolean; + showGoalList: boolean; + goal: Goal; + isLoading: boolean; + eventType: string; + triggerType: string; + apiMethod: string; + submitText: string; + goalToDelete: Goal|null; + addEditTableComponent: boolean; +} + +export default defineComponent({ + inheritAttrs: false, + props: { + onlyShowAddNewGoal: Boolean, + userCanEditGoals: Boolean, + ecommerceEnabled: Boolean, + goals: { + type: Object, + required: true, + }, + addNewGoalIntro: String, + goalTriggerTypeOptions: Object, + goalMatchAttributeOptions: Array, + eventTypeOptions: Array, + patternTypeOptions: Array, + numericComparisonTypeOptions: Array, + allowMultipleOptions: Array, + showAddGoal: Boolean, + showGoal: Number, + beforeGoalListActionsBody: Object, + endEditTable: String, + beforeGoalListActionsHead: String, + }, + data(): ManageGoalsState { + return { + showEditGoal: false, + showGoalList: true, + goal: {} as unknown as Goal, + isLoading: false, + eventType: 'event_category', + triggerType: 'visitors', + apiMethod: '', + submitText: '', + goalToDelete: null, + addEditTableComponent: false, + }; + }, + components: { + SaveButton, + ContentBlock, + ActivityIndicator, + Field, + Alert, + }, + directives: { + ContentTable, + Form, + }, + created() { + ManageGoalsStore.setIdGoalShown(this.showGoal); + }, + unmounted() { + ManageGoalsStore.setIdGoalShown(undefined); + }, + mounted() { + if (this.showAddGoal) { + this.createGoal(); + } else if (this.showGoal) { + this.editGoal(this.showGoal); + } else { + this.showListOfReports(); + } + + // this component can be used in multiple places, one where + // Matomo.helper.compileAngularComponents() is already called, one where it's not. + // to make sure this function is only applied once to the slot data, we explicitly do not + // add it to vue, then on the next update, add it and call compileAngularComponents() + nextTick(() => { + this.addEditTableComponent = true; + + nextTick(() => { + const el = this.$refs.endedittable as HTMLElement; + const scope = Matomo.helper.getAngularDependency('$rootScope').$new(true); + $(el).data('scope', scope); + Matomo.helper.compileAngularComponents(el, { scope }); + }); + }); + }, + beforeUnmount() { + const el = this.$refs.endedittable as HTMLElement; + ($(el).data('scope') as IScope).$destroy(); + }, + methods: { + scrollToTop() { + setTimeout(() => { + Matomo.helper.lazyScrollTo('.pageWrap', 200); + }); + }, + initGoalForm( + goalMethodAPI: string, + submitText: string, + goalName: string, + description: string, + matchAttribute: string, + pattern: string, + patternType: string, + caseSensitive: boolean, + revenue: number, + allowMultiple: boolean, + useEventValueAsRevenue: boolean, + goalId: string|number, + ) { + Matomo.postEvent('Goals.beforeInitGoalForm', goalMethodAPI, goalId); + + this.apiMethod = goalMethodAPI; + + this.goal = {} as unknown as Goal; + this.goal.name = goalName; + this.goal.description = description; + + let actualMatchAttribute = matchAttribute; + if (actualMatchAttribute === 'manually') { + this.triggerType = 'manually'; + actualMatchAttribute = 'url'; + } else { + this.triggerType = 'visitors'; + } + + if (actualMatchAttribute.indexOf('event') === 0) { + this.eventType = actualMatchAttribute; + actualMatchAttribute = 'event'; + } else { + this.eventType = 'event_category'; + } + + this.goal.match_attribute = actualMatchAttribute; + this.goal.allow_multiple = allowMultiple; + this.goal.pattern_type = patternType; + this.goal.pattern = pattern; + this.goal.case_sensitive = caseSensitive; + this.goal.revenue = revenue; + this.goal.event_value_as_revenue = useEventValueAsRevenue; + this.submitText = submitText; + this.goal.idgoal = goalId; + }, + showListOfReports() { + Matomo.postEvent('Goals.cancelForm'); + this.showGoalList = true; + this.showEditGoal = false; + this.scrollToTop(); + }, + showAddEditForm() { + this.showGoalList = false; + this.showEditGoal = true; + }, + createGoal() { + const parameters = { + isAllowed: true, + }; + Matomo.postEvent('Goals.initAddGoal', parameters); + + if (parameters && !parameters.isAllowed) { + return; + } + + this.showAddEditForm(); + this.initGoalForm( + 'Goals.addGoal', + translate('Goals_AddGoal'), + '', + '', + 'url', + '', + 'contains', + false, + 0, + false, + false, + 0, + ); + this.scrollToTop(); + }, + editGoal(goalId: string|number) { + this.showAddEditForm(); + const goal = this.goals[`${goalId}`] as Goal; + this.initGoalForm( + 'Goals.updateGoal', + translate('Goals_UpdateGoal'), + goal.name, + goal.description, + goal.match_attribute, + goal.pattern, + goal.pattern_type, + !!goal.case_sensitive && goal.case_sensitive !== '0', + parseInt(`${goal.revenue}`, 10), + !!goal.allow_multiple && goal.allow_multiple !== '0', + !!goal.event_value_as_revenue && goal.event_value_as_revenue !== '0', + goalId, + ); + this.scrollToTop(); + }, + deleteGoal(goalId: string|number) { + this.goalToDelete = this.goals[`${goalId}`]; + Matomo.helper.modalConfirm((this.$refs.confirm as HTMLElement), { + yes: () => { + this.isLoading = true; + + AjaxHelper.fetch({ + idGoal: goalId, + method: 'Goals.deleteGoal', + }).then(() => { + window.location.reload(); + }).finally(() => { + this.isLoading = false; + }); + }, + }); + }, + save() { + const parameters: QueryParameters = {}; + // TODO: test removal of encoding, should be handled by ajax request + parameters.name = this.goal.name; + parameters.description = this.goal.description; + + if (this.isManuallyTriggered) { + parameters.matchAttribute = 'manually'; + parameters.patternType = 'regex'; + parameters.pattern = '.*'; + parameters.caseSensitive = 0; + } else { + parameters.matchAttribute = this.goal.match_attribute; + + if (parameters.matchAttribute === 'event') { + parameters.matchAttribute = this.eventType; + } + + parameters.patternType = this.goal.pattern_type; + parameters.pattern = this.goal.pattern; + parameters.caseSensitive = this.goal.case_sensitive ? 1 : 0; + } + parameters.revenue = this.goal.revenue || 0; + parameters.allowMultipleConversionsPerVisit = this.goal.allow_multiple ? 1 : 0; + parameters.useEventValueAsRevenue = this.goal.event_value_as_revenue ? 1 : 0; + + parameters.idGoal = this.goal.idgoal; + parameters.method = this.apiMethod; + + const isCreate = parameters.method === 'Goals.addGoal'; + const isUpdate = parameters.method === 'Goals.updateGoal'; + + const options: AjaxOptions = {}; + + const piwikApiMock = new PiwikApiMock(parameters, options); + if (isUpdate) { + Matomo.postEvent('Goals.beforeUpdateGoal', parameters, piwikApiMock); + } else if (isCreate) { + Matomo.postEvent('Goals.beforeAddGoal', parameters, piwikApiMock); + } + + if (parameters?.cancelRequest) { + return; + } + + this.isLoading = true; + + AjaxHelper.fetch(parameters, options).then(() => { + const subcategory = MatomoUrl.parsed.value.subcategory as string; + if (subcategory === 'Goals_AddNewGoal' + && Matomo.helper.isAngularRenderingThePage() + ) { + // when adding a goal for the first time we need to load manage goals page afterwards + ReportingMenuStore.reloadMenuItems().then(() => { + MatomoUrl.updateHash({ + ...MatomoUrl.hashParsed.value, + subcategory: 'Goals_ManageGoals', + }); + + this.isLoading = false; + }); + } else { + window.location.reload(); + } + }).catch(() => { + this.scrollToTop(); + this.isLoading = false; + }); + }, + changedTriggerType() { + if (!this.isManuallyTriggered && !this.goal.pattern_type) { + this.goal.pattern_type = 'contains'; + } + }, + initPatternType() { + if (this.isMatchAttributeNumeric) { + this.goal.pattern_type = 'greater_than'; + } else { + this.goal.pattern_type = 'contains'; + } + }, + lcfirst(s: string) { + return `${s.slice(0, 1).toLowerCase()}${s.slice(1)}`; + }, + ucfirst(s: string) { + return `${s.slice(0, 1).toUpperCase()}${s.slice(1)}`; + }, + }, + computed: { + learnMoreAboutGoalTracking() { + return translate( + 'Goals_LearnMoreAboutGoalTrackingDocumentation', + '<a target="_blank" rel="noreferrer noopener" ' + + 'href="https://matomo.org/docs/tracking-goals-web-analytics/">', + '</a>', + ); + }, + youCanEnableEcommerceReports() { + const link = MatomoUrl.stringify({ + ...MatomoUrl.urlParsed.value, + module: 'SitesManager', + action: 'index', + }); + + const ecommerceReportsText = '<a href="https://matomo.org/docs/ecommerce-analytics/" ' + + `rel="noreferrer noopener" target="_blank">${translate('Goals_EcommerceReports')}</a>`; + const websiteManageText = `<a href='${link}'>${translate('SitesManager_WebsitesManagement')}</a>`; + + return translate( + 'Goals_YouCanEnableEcommerceReports', + ecommerceReportsText, + websiteManageText, + ); + }, + siteName() { + return Matomo.helper.htmlDecode(Matomo.siteName); + }, + whereVisitedPageManuallyCallsJsTrackerText() { + const link = 'https://developer.matomo.org/guides/tracking-javascript-guide#manually-trigger-goal-conversions'; + return translate( + 'Goals_WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore', + `<a target="_blank" rel="noreferrer noopener" href="${link}">`, + '</a>', + ); + }, + caseSensitiveTitle() { + return `${translate('Goals_CaseSensitive')} ${translate('Goals_Optional')}`; + }, + useEventValueAsRevenueHelp() { + return `${translate('Goals_EventValueAsRevenueHelp')} <br/><br/> ${translate('Goals_EventValueAsRevenueHelp2')}`; + }, + cancelText() { + return translate( + 'General_OrCancel', + '<a class=\'entityCancelLink\'>', + '</a>', + ); + }, + isMatchAttributeNumeric() { + return ['visit_duration'].indexOf(this.goal.match_attribute) > -1; + }, + patternFieldLabel() { + return this.goal.match_attribute === 'visit_duration' + ? translate('Goals_TimeInMinutes') + : translate('Goals_Pattern'); + }, + goalMatchAttributeTranslations() { + return { + manually: translate('Goals_ManuallyTriggeredUsingJavascriptFunction'), + file: translate('Goals_Download'), + url: translate('Goals_VisitUrl'), + title: translate('Goals_VisitPageTitle'), + external_website: translate('Goals_ClickOutlink'), + event_action: `${translate('Goals_SendEvent')} (${translate('Events_EventAction')})`, + event_category: `${translate('Goals_SendEvent')} (${translate('Events_EventCategory')})`, + event_name: `${translate('Goals_SendEvent')} (${translate('Events_EventName')})`, + visit_duration: `${this.ucfirst(translate('Goals_VisitDuration'))}`, + }; + }, + beforeGoalListActionsBodyComponent() { + if (!this.beforeGoalListActionsBody) { + return {}; + } + + const componentsByIdGoal: Record<string, unknown> = {}; + Object.values(this.goals as Record<string, Goal>).forEach((g) => { + const template = this.beforeGoalListActionsBody![g.idgoal]; + if (!template) { + return; + } + + componentsByIdGoal[g.idgoal] = { + template, + }; + }); + return markRaw(componentsByIdGoal); + }, + endEditTableComponent() { + if (!this.endEditTable || !this.addEditTableComponent) { + return null; + } + + const endedittable = this.$refs.endedittable as HTMLElement; + return markRaw({ + template: this.endEditTable, + mounted() { + Matomo.helper.compileVueEntryComponents(endedittable); + }, + beforeUnmount() { + Matomo.helper.destroyVueComponent(endedittable); + }, + }); + }, + beforeGoalListActionsHeadComponent() { + if (!this.beforeGoalListActionsHead) { + return null; + } + + return markRaw({ + template: this.beforeGoalListActionsHead, + }); + }, + isManuallyTriggered() { + return this.triggerType === 'manually'; + }, + matchesExpressionExternal() { + const url = "'http://www.amazon.com\\/(.*)\\/yourAffiliateId'"; + return translate('Goals_MatchesExpression', url); + }, + }, +}); +</script> diff --git a/plugins/Goals/vue/src/ManageGoals/PiwikApiMock.ts b/plugins/Goals/vue/src/ManageGoals/PiwikApiMock.ts new file mode 100644 index 0000000000..9745fe3543 --- /dev/null +++ b/plugins/Goals/vue/src/ManageGoals/PiwikApiMock.ts @@ -0,0 +1,38 @@ +/*! +* Matomo - free/libre analytics platform +* +* @link https://matomo.org +* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +*/ + +import { AjaxOptions } from 'CoreHome'; + +// the piwikApi angularjs service is passed in some frontend events to allow plugins to modify +// a request before it is sent. for the time being in Vue we use this mock, which has the same +// API as the piwikApi service, to modify the input used with AjaxHelper. this provides BC +// with for plugins that haven't been converted. +// +// should be removed in Matomo 5. +export default class PiwikApiMock { + constructor(private parameters: QueryParameters, private options: AjaxOptions) {} + + addParams(params: QueryParameters): void { + Object.assign(this.parameters, params); + } + + withTokenInUrl(): void { + this.options.withTokenInUrl = true; + } + + reset(): void { + Object.keys(this.parameters).forEach((name) => { + delete this.parameters[name]; + }); + + delete this.options.postParams; + } + + addPostParams(params: QueryParameters): void { + this.options.postParams = { ...this.options.postParams, ...params }; + } +} diff --git a/plugins/Goals/vue/src/index.ts b/plugins/Goals/vue/src/index.ts new file mode 100644 index 0000000000..651bab3779 --- /dev/null +++ b/plugins/Goals/vue/src/index.ts @@ -0,0 +1,14 @@ +/*! + * Matomo - free/libre analytics platform + * + * @link https://matomo.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later +*/ + +import './GoalPageLink/GoalPageLink.adapter'; +import './ManageGoals/ManageGoals.adapter'; + +export { default as GoalPageLink } from './GoalPageLink/GoalPageLink.ts'; +export { default as ManageGoals } from './ManageGoals/ManageGoals.vue'; +export { default as ManageGoalsStore } from './ManageGoals/ManageGoals.store'; +export { default as PiwikApiMock } from './ManageGoals/PiwikApiMock'; |