diff options
author | diosmosis <benaka.moorthi@gmail.com> | 2013-02-21 03:23:10 +0400 |
---|---|---|
committer | diosmosis <benaka.moorthi@gmail.com> | 2013-02-21 03:23:10 +0400 |
commit | f1f29bce4942e0429a98e7dcec6e86dd89853f5c (patch) | |
tree | 13e7b1d8d7b7369944a8861868a53e752e4eca84 /plugins | |
parent | adb9e2e7f271d8f803e92e3ff68e318a2fbea37f (diff) |
Refs #1845, added new admin page where users can create their own custom JavaScript tracking code snippets and image tracking link HTML.
Notes:
* Rewrote Site selector widget JS so multiple site selectors could be used on the same page.
* Added method to ajaxHelper JS class that eases use of bulk request API.
* Allowed section toggler JS in misc.js to be used w/ input elements as well as links.
* Fixed bug in menu ordering code where accessing _hasSubMenu results in uasort behaving incorrectly when menu is already sorted.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/CoreAdminHome/Controller.php | 25 | ||||
-rw-r--r-- | plugins/CoreAdminHome/CoreAdminHome.php | 5 | ||||
-rw-r--r-- | plugins/CoreAdminHome/templates/jsTrackingGenerator.css | 76 | ||||
-rw-r--r-- | plugins/CoreAdminHome/templates/jsTrackingGenerator.js | 364 | ||||
-rw-r--r-- | plugins/CoreAdminHome/templates/jsTrackingGenerator.tpl | 232 | ||||
-rw-r--r-- | plugins/CoreHome/templates/autocomplete.js | 390 | ||||
-rwxr-xr-x | plugins/CoreHome/templates/misc.js | 63 | ||||
-rw-r--r-- | plugins/CoreHome/templates/sites_selection.tpl | 27 | ||||
-rw-r--r-- | plugins/UsersManager/templates/UsersManager.js | 10 | ||||
-rw-r--r-- | plugins/UsersManager/templates/UsersManager.tpl | 8 |
10 files changed, 998 insertions, 202 deletions
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php index 661b01d824..338f3100ec 100644 --- a/plugins/CoreAdminHome/Controller.php +++ b/plugins/CoreAdminHome/Controller.php @@ -115,6 +115,31 @@ class Piwik_CoreAdminHome_Controller extends Piwik_Controller_Admin } /** + * Renders and echo's an admin page that lets users generate custom JavaScript + * tracking code and custom image tracker links. + */ + public function trackingCodeGenerator() + { + $view = Piwik_View::factory('jsTrackingGenerator'); + $this->setBasicVariablesView($view); + $view->topMenu = Piwik_GetTopMenu(); + $view->menu = Piwik_GetAdminMenu(); + + $viewableIdSites = Piwik_SitesManager_API::getInstance()->getSitesIdWithAtLeastViewAccess(); + + $defaultIdSite = reset($viewableIdSites); + $view->idSite = Piwik_Common::getRequestVar('idSite', $defaultIdSite, 'int'); + + $view->defaultReportSiteName = Piwik_Site::getNameFor($view->idSite); + $view->defaultSiteRevenue = Piwik::getCurrency($view->idSite); + + // get currencies for each viewable site + $view->currencySymbols = Piwik_SitesManager_API::getInstance()->getCurrencySymbols(); + + echo $view->render(); + } + + /** * Shows the "Track Visits" checkbox. */ public function optOut() diff --git a/plugins/CoreAdminHome/CoreAdminHome.php b/plugins/CoreAdminHome/CoreAdminHome.php index bc107a5c8d..4abff049f5 100644 --- a/plugins/CoreAdminHome/CoreAdminHome.php +++ b/plugins/CoreAdminHome/CoreAdminHome.php @@ -101,6 +101,11 @@ class Piwik_CoreAdminHome extends Piwik_Plugin array('module' => 'CoreAdminHome', 'action' => 'generalSettings'), Piwik::isUserHasSomeAdminAccess(), $order = 6); + Piwik_AddAdminSubMenu('General_Settings', 'Installation_JsTag', + array('module' => 'CoreAdminHome', 'action' => 'trackingCodeGenerator'), + Piwik::isUserHasSomeAdminAccess(), + $order = 9); + } function purgeOutdatedArchives() diff --git a/plugins/CoreAdminHome/templates/jsTrackingGenerator.css b/plugins/CoreAdminHome/templates/jsTrackingGenerator.css new file mode 100644 index 0000000000..48f2340663 --- /dev/null +++ b/plugins/CoreAdminHome/templates/jsTrackingGenerator.css @@ -0,0 +1,76 @@ +#javascript-output-section textarea,#image-link-output-section textarea { + width:100%; + display: block; + color: #111; + font-family: "courier"; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +#javascript-output-section textarea { + height: 256px; +} + +#image-link-output-section textarea { + height: 128px; +} + +label { + margin-right: .35em; + display:inline-block; +} + +#optional-js-tracking-options>tbody>tr>td,#image-tracking-section>tbody>tr>td { + width:488px; + max-width:488px; +} + +.custom-variable-name,.custom-variable-value { + width:100px; +} + +h3 { + margin-top:0; +} + +.small-form-description { + color:#666; + font-size:1em; + font-style:italic; + margin-left:4em; +} + +.tracking-option-section { + margin-bottom:1.5em; +} + +#javascript-output-section,#image-link-output-section { + padding-top:1em; +} + +#optional-js-tracking-options th,#image-tracking-section th { + text-align:left; +} + +#js-visitor-cv-extra,#js-page-cv-extra,#js-campaign-query-param-extra { + margin-left:1em; +} +#js-visitor-cv-extra td,#js-page-cv-extra td,#js-campaign-query-param-extra td { + vertical-align:middle; +} + +.revenue { + width:32px; +} +.goal-picker { + height:1.2em; +} +.goal-picker select { + width:128px; +} + +#js-campaign-query-param-extra input { + width:72px; +} diff --git a/plugins/CoreAdminHome/templates/jsTrackingGenerator.js b/plugins/CoreAdminHome/templates/jsTrackingGenerator.js new file mode 100644 index 0000000000..46e5a20afe --- /dev/null +++ b/plugins/CoreAdminHome/templates/jsTrackingGenerator.js @@ -0,0 +1,364 @@ +/*! + * Piwik - Web Analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +(function($) { + +$(document).ready(function() { + + var piwikHost = window.location.host; + + // + // utility methods + // + + // returns JavaScript code for tracking custom variables based on an array of + // custom variable name-value pairs (so an array of 2-element arrays) and + // a scope (either 'visit' or 'page') + var getCustomVariableJS = function(customVariables, scope) + { + var result = ''; + for (var i = 0; i != 5; ++i) + { + if (customVariables[i]) + { + var key = customVariables[i][0], + value = customVariables[i][1]; + result += '_paq.push(["setCustomVariable", ' + (i + 1) + ', ' + JSON.stringify(key) + ', ' + + JSON.stringify(value) + ', ' + JSON.stringify(scope) + ']);\n'; + } + } + return result; + }; + + // gets the list of custom variables entered by the user in a custom variable + // section + var getCustomVariables = function (sectionId) + { + var customVariableNames = $('.custom-variable-name', '#' + sectionId), + customVariableValues = $('.custom-variable-value', '#' + sectionId); + + var result = []; + if ($('.section-toggler-link', '#' + sectionId).is(':checked')) + { + for (var i = 0; i != customVariableNames.length; ++i) + { + var name = $(customVariableNames[i]).val(); + + result[i] = null; + if (name) + { + result[i] = [name, $(customVariableValues[i]).val()]; + } + } + } + return result; + }; + + // quickly gets the host + port from a url + var getHostNameFromUrl = function(url) + { + var element = $('<a></a>')[0]; + element.href = url; + return element.hostname; + }; + + // get preloaded server-side data necessary for code generation + var dataElement = $('#js-tracking-generator-data'), + currencySymbols = JSON.parse(dataElement.attr('data-currencies')), + siteUrls = {}, + siteCurrencies = {}, + allGoals = {}, + noneText = $('#image-tracker-goal>option').text(); + + // queries Piwik for needed site info for one site + var getSiteData = function (idSite, sectionSelect, callback) + { + // if data is already loaded, don't do an AJAX request + if (siteUrls[idSite] + && siteCurrencies[idSite] + && typeof allGoals[idSite] !== 'undefined') + { + callback(); + return; + } + + // disable section + $(sectionSelect).find('input,select,textarea').attr('disabled', 'disabled'); + + var ajaxRequest = new ajaxHelper(); + ajaxRequest.setBulkRequests( + // get site info (for currency) + { + module: 'API', + method: 'SitesManager.getSiteFromId', + idSite: idSite + }, + + // get site urls + { + module: 'API', + method: 'SitesManager.getSiteUrlsFromId', + idSite: idSite + }, + + // get site goals + { + module: 'API', + method: 'Goals.getGoals', + idSite: idSite + } + ); + ajaxRequest.setCallback(function (data) { + for (var i = 0; i != data.length; ++i) + { + data[i] = JSON.parse(data[i]); + } + + // set data + var currency = data[0][0].currency || ''; + siteCurrencies[idSite] = currencySymbols[currency.toUpperCase()]; + siteUrls[idSite] = data[1] || []; + allGoals[idSite] = data[2] || []; + + // re-enable controls + $(sectionSelect).find('input,select,textarea').removeAttr('disabled'); + + callback(); + }); + ajaxRequest.setFormat('json'); + ajaxRequest.send(false); + }; + + // resets the select options of a goal select using a site ID + var resetGoalSelectItems = function (idsite, id) + { + var newOptions = '<option value="">' + noneText + '</option>'; + + var goals = allGoals[idsite] || []; + for (var key in goals) + { + var goal = goals[key]; + newOptions += '<option value="' + goal.idgoal + '">' + goal.name + '</option>'; + } + + // set goal select items + $('#' + id).html(newOptions); + + // set currency string + $('#' + id).parent().find('.currency').text(siteCurrencies[idsite]); + }; + + // function that generates JS code + var generateJsCode = function() + { + // get data + var idSite = $('#js-tracker-website .custom_select_main_link').attr('siteid'), + groupPageTitlesByDomain = $('#javascript-tracking-group-by-domain').is(':checked'), + mergeSubdomains = $('#javascript-tracking-all-subdomains').is(':checked'), + mergeAliasUrls = $('#javascript-tracking-all-aliases').is(':checked'), + visitorCustomVariables = getCustomVariables('javascript-tracking-visitor-cv'), + pageCustomVariables = getCustomVariables('javascript-tracking-page-cv'), + customCampaignNameQueryParam = null, + customCampaignKeywordParam = null, + doNotTrack = $('#javascript-tracking-do-not-track').is(':checked'); + + if ($('#custom-campaign-query-params-check').is(':checked')) + { + customCampaignNameQueryParam = $('#custom-campaign-name-query-param').val(); + customCampaignKeywordParam = $('#custom-campaign-keyword-query-param').val(); + } + + // generate JS + var result = '<!-- Piwik -->\n\ +<script type="text/javascript">\n\ +var _paq = _paq || [];\n\ +(function(){ var u=(("https:" == document.location.protocol) ? "https://' + piwikHost + '/" : "http://' + piwikHost + '/");\n\ +_paq.push(["setSiteId", ' + JSON.stringify(idSite) + ']);\n'; + + if (groupPageTitlesByDomain) + { + result += '_paq.push(["setDocumentTitle", document.domain + "/" + document.title]);\n'; + } + + if (mergeSubdomains) + { + var mainHostAllSub = '*.' + getHostNameFromUrl(siteUrls[idSite][0]); + result += '_paq.push(["setCookieDomain", ' + JSON.stringify(mainHostAllSub) + ']);\n'; + } + + if (mergeAliasUrls) + { + var siteHosts = []; + for (var i = 0; i != siteUrls[idSite].length; ++i) + { + siteHosts[i] = '*.' + getHostNameFromUrl(siteUrls[idSite][i]); + } + result += '_paq.push(["setDomains", ' + JSON.stringify(siteHosts) + ']);\n'; + } + + if (visitorCustomVariables.length) + { + result += '// you can set up to 5 custom variables for each visitor\n'; + result += getCustomVariableJS(visitorCustomVariables, 'visit'); + } + + if (pageCustomVariables.length) + { + result += '// you can set up to 5 custom variables for each action (page view, ' + + 'download, click, site search)\n'; + result += getCustomVariableJS(pageCustomVariables, 'page'); + } + + if (customCampaignNameQueryParam) + { + result += '_paq.push(["setCampaignNameKey", ' + JSON.stringify(customCampaignNameQueryParam) + ']);\n'; + } + + if (customCampaignKeywordParam) + { + result += '_paq.push(["setCampaignKeywordKey", ' + JSON.stringify(customCampaignKeywordParam) + ']);\n'; + } + + if (doNotTrack) + { + result += '_paq.push(["setDoNotTrack", true]);\n'; + } + + result += 'var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0];\n\ +g.type="text/javascript"; g.defer=true; g.async=true; g.src=u+"piwik.js";\n\ +s.parentNode.insertBefore(g,s); })();\n\ +</script>\n\ +<!-- End Piwik Code -->'; + + var ta = $('#javascript-text textarea'); + ta.val(result) + }; + + // function that generates image tracker link + var generateImageTrackerLink = function() + { + // get data ( (("https:" == document.location.protocol)?"https://' + piwikHost + '":"http://' + piwikHost + '") ) + var idSite = $('#image-tracker-website .custom_select_main_link').attr('siteid'), + piwikURL = "https:" == document.location.protocol ? "https://" + piwikHost : "http://" + piwikHost, + actionName = $('#image-tracker-action-name').val(), + idGoal = null, + revenue = null; + + if ($('#image-tracking-goal-check').is(':checked')) + { + idGoal = $('#image-tracker-goal').val(); + if (idGoal) + { + revenue = $('#image-tracker-advanced-options .revenue').val(); + } + } + + // generate link HTML + var params = { + idsite: idSite, + rec: 1 + }; + + if (actionName) + { + params.action_name = actionName; + } + + if (idGoal) + { + params.idGoal = idGoal; + if (revenue) + { + params.revenue = revenue; + } + } + + var result = '<!-- Piwik Image Tracker -->\n\ +<img src="' + piwikURL + '/?' + $.param(params) + '" style="border:0" alt="" />\n\ +<!-- End Piwik -->'; + + var ta = $('#image-tracking-link textarea'); + ta.val(result); + }; + + // on image link tracker site change, change available goals + $('#image-tracker-website').bind('piwik:siteSelected', function(e, site) { + getSiteData(site.id, '#image-tracking-code-options', function() { + resetGoalSelectItems(site.id, 'image-tracker-goal'); + generateImageTrackerLink(); + }); + }); + + // on js link tracker site change, change available goals + $('#js-tracker-website').bind('piwik:siteSelected', function(e, site) { + getSiteData(site.id, '#js-code-options', function() { + resetGoalSelectItems(site.id, 'js-tracker-goal'); + + $('.current-site-name', '#javascript-tracking-options').each(function() { + $(this).text(site.name); + }); + + generateJsCode(); + }); + }); + + // on click 'add' link in custom variable section, add a new row, but only + // allow 5 custom variable entry rows + $('.add-custom-variable').click(function(e) { + e.preventDefault(); + + var newRow = '<tr>\ + <td> </td>\ + <td><input type="textbox" class="custom-variable-name"/></td>\ + <td> </td>\ + <td><input type="textbox" class="custom-variable-value"/></td>\ + </tr>', + row = $(this).closest('tr'); + + row.before(newRow); + + // hide add button if max # of custom variables has been reached + // (5 custom variables + 1 row for add new row) + if ($('tr', row.parent()).length == 6) + { + $(this).hide(); + } + + return false; + }); + + // when any input in the JS tracking options section changes, regenerate JS code + $('#optional-js-tracking-options').on('change', 'input', function() { + generateJsCode(); + }); + + // when any input/select in the image tracking options section changes, regenerate + // image tracker link + $('#image-tracking-section').on('change', 'input,select', function() { + generateImageTrackerLink(); + }); + + // on click generated code textareas, select the text so it can be easily copied + $('#javascript-text>textarea,#image-tracking-link>textarea').click(function() { + $(this).select(); + }); + + // initial generation + getSiteData($( + '#js-tracker-website .custom_select_main_link').attr('siteid'), + '#js-code-options,#image-tracking-code-options', + function() { + var imageTrackerSiteId = $('#image-tracker-website .custom_select_main_link').attr('siteid'); + resetGoalSelectItems(imageTrackerSiteId, 'image-tracker-goal'); + + generateJsCode(); + generateImageTrackerLink(); + } + ); +}); + +}(jQuery)); diff --git a/plugins/CoreAdminHome/templates/jsTrackingGenerator.tpl b/plugins/CoreAdminHome/templates/jsTrackingGenerator.tpl new file mode 100644 index 0000000000..4e46cf3ec4 --- /dev/null +++ b/plugins/CoreAdminHome/templates/jsTrackingGenerator.tpl @@ -0,0 +1,232 @@ +{include file="CoreAdminHome/templates/header.tpl"} +<link rel="stylesheet" href="plugins/CoreAdminHome/templates/jsTrackingGenerator.css"></link> +<script type="text/javascript" src="plugins/CoreAdminHome/templates/jsTrackingGenerator.js"></script> + +<div id="js-tracking-generator-data" + data-currencies = "{$currencySymbols|@json_encode|escape:'html'}"/> + +<h2>{'CoreAdminHome_JavaScriptTracking'|translate}</h2> + +<div id="js-code-options" class="adminTable"> + +<p> + {'CoreAdminHome_JSTrackingIntro1'|translate} + <br/><br/> + {'CoreAdminHome_JSTrackingIntro2'|translate:'<a href="http://piwik.org/integrate/">':'</a>'} + <br/><br/> + {'CoreAdminHome_JSTrackingIntro3'|translate:'<a href="#image-tracking-link">':'</a>'} + <br/><br/> + {'CoreAdminHome_JSTrackingIntro4'|translate:'<a target="_blank" href="http://piwik.org/docs/javascript-tracking/">':'</a>'} +</p> + +<div> + {* website *} + <label class="website-label"><strong>{'General_Website'|translate}</strong></label> + {include file="CoreHome/templates/sites_selection.tpl" + siteName=$defaultReportSiteName idSite=$idSite showAllSitesItem=false switchSiteOnSelect=false + siteSelectorId="js-tracker-website"} + + <br/><br/><br/> +</div> + +<table id="optional-js-tracking-options" class="adminTable" style='width:1024px'> +<tr> + <th>{'General_Options'|translate}</th> + <th>{'Mobile_Advanced'|translate} <a href="#" class="section-toggler-link" data-section-id="javascript-advanced-options">({'General_Show_js'|translate})</a></th> +</tr> +<tr> +<td> + {* track across all subdomains *} + <div class="tracking-option-section"> + <input type="checkbox" id="javascript-tracking-all-subdomains"/> + <label for="javascript-tracking-all-subdomains">{'CoreAdminHome_JSTracking_MergeSubdomains'|translate} <span class='current-site-name'>{$defaultReportSiteName}</span></label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_MergeSubdomainsDesc'|translate:'x.domain.com':'y.domain.com'} + </div> + </div> + + {* track across all site aliases *} + <div class="tracking-option-section"> + <input type="checkbox" id="javascript-tracking-all-aliases"/> + <label for="javascript-tracking-all-aliases">{'CoreAdminHome_JSTracking_MergeAliases'|translate} <span class='current-site-name'>{$defaultReportSiteName}</span></label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_MergeAliasesDesc'|translate} + </div> + </div> + + {* group page titles by site domain *} + <div class="tracking-option-section"> + <input type="checkbox" id="javascript-tracking-group-by-domain"/> + <label for="javascript-tracking-group-by-domain">{'CoreAdminHome_JSTracking_GroupPageTitlesByDomain'|translate}</label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_GroupPageTitlesByDomainDesc'|translate} + </div> + </div> +</td> +<td> + <div id="javascript-advanced-options" style="display:none"> + {* visitor custom variable *} + <div class="custom-variable tracking-option-section" id="javascript-tracking-visitor-cv"> + <input class="section-toggler-link" type="checkbox" id="javascript-tracking-visitor-cv-check" data-section-id="js-visitor-cv-extra"/> + <label for="javascript-tracking-visitor-cv-check">{'CoreAdminHome_JSTracking_VisitorCustomVars'|translate}</label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_VisitorCustomVarsDesc'|translate} + </div> + + <table style="display:none" id="js-visitor-cv-extra"> + <tr> + <td><strong>{'General_Name'|translate}</strong></td> + <td><input type="textbox" class="custom-variable-name" placeholder="e.g. Type"/></td> + <td><strong>{'General_Value'|translate}</strong></td> + <td><input type="textbox" class="custom-variable-value" placeholder="e.g. Customer"/></td> + </tr> + <tr> + <td colspan="4" style="text-align:right"> + <a href="#" class="add-custom-variable">{'General_Add'|translate}</a> + </td> + </tr> + </table> + </div> + + {* page view custom variable *} + <div class="custom-variable tracking-option-section" id="javascript-tracking-page-cv"> + <input class="section-toggler-link" type="checkbox" id="javascript-tracking-page-cv-check" data-section-id="js-page-cv-extra"/> + <label for="javascript-tracking-page-cv-check">{'CoreAdminHome_JSTracking_PageCustomVars'|translate}</label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_PageCustomVarsDesc'|translate} + </div> + + <table style="display:none" id="js-page-cv-extra"> + <tr> + <td><strong>{'General_Name'|translate}</strong></td> + <td><input type="textbox" class="custom-variable-name" placeholder="e.g. Category"/></td> + <td><strong>{'General_Value'|translate}</strong></td> + <td><input type="textbox" class="custom-variable-value" placeholder="e.g. White Papers"/></td> + </tr> + <tr> + <td colspan="4" style="text-align:right"> + <a href="#" class="add-custom-variable">{'General_Add'|translate}</a> + </td> + </tr> + </table> + </div> + + {* do not track support *} + <div class="tracking-option-section"> + <input type="checkbox" id="javascript-tracking-do-not-track"/> + <label for="javascript-tracking-do-not-track">{'CoreAdminHome_JSTracking_EnableDoNotTrack'|translate}</label> + + <div class="small-form-description"> + {'CoreAdminHome_JSTracking_EnableDoNotTrackDesc'|translate} + </div> + </div> + + {* custom campaign name/keyword query params *} + <div class="tracking-option-section"> + <input class="section-toggler-link" type="checkbox" id="custom-campaign-query-params-check" data-section-id="js-campaign-query-param-extra"/> + <label for="custom-campaign-query-params-check">{'CoreAdminHome_JSTracking_CustomCampaignQueryParam'|translate}</label> + + <table style="display:none" id="js-campaign-query-param-extra"> + <tr> + <td><strong>{'CoreAdminHome_JSTracking_CampaignNameParam'|translate}</strong></td> + <td><input type="text" id="custom-campaign-name-query-param"/></td> + </tr> + <tr> + <td><strong>{'CoreAdminHome_JSTracking_CampaignKwdParam'|translate}</strong></td> + <td><input type="text" id="custom-campaign-keyword-query-param"/></td> + </tr> + </table> + </div> + </div> +</td> +</tr> +</table> + +</div> + +<div id="javascript-output-section"> + <h3>{'Installation_JsTag'|translate}</h3> + <p class="form-description">{'CoreAdminHome_JSTracking_CodeNote'|translate:"</body>"}</p> + <div id="javascript-text"> + <textarea> </textarea> + </div> + <br/> +</div> + +<h2 id="image-tracking-link">{'CoreAdminHome_ImageTracking'|translate}</h2> + +<div id="image-tracking-code-options" class="adminTable"> + +<p> + {'CoreAdminHome_ImageTrackingIntro1'|translate:"<em><noscript></noscript></em>"} + <br/><br/> + {'CoreAdminHome_ImageTrackingIntro2'|translate:'<a href="http://piwik.org/docs/tracking-api/reference/">':'</a>'} +</p> + +<div> + {* website *} + <label class="website-label"><strong>{'General_Website'|translate}</strong></label> + {include file="CoreHome/templates/sites_selection.tpl" + siteName=$defaultReportSiteName idSite=$idSite showAllSitesItem=false switchSiteOnSelect=false + siteSelectorId="image-tracker-website"} + + <br/><br/><br/> +</div> + +<table id="image-tracking-section" class="adminTable" style='width:1024px;'> +<tr> + <th>{'General_Options'|translate}</th> + <th>{'Mobile_Advanced'|translate} <a href="#" class="section-toggler-link" data-section-id="image-tracker-advanced-options">({'General_Show_js'|translate})</a></th> +</tr> +<tr> +<td> + {* action_name *} + <div class="tracking-option-section"> + <label for="image-tracker-action-name">{'Actions_ColumnPageName'|translate}</label> + <input type="text" id="image-tracker-action-name"/> + </div> +</td> +<td> + <div id="image-tracker-advanced-options" style="display:none"> + {* goal *} + <div class="goal-picker tracking-option-section"> + <input class="section-toggler-link" type="checkbox" id="image-tracking-goal-check" data-section-id="image-goal-picker-extra"/> + <label for="image-tracking-goal-check">{'CoreAdminHome_TrackAGoal'|translate}</label> + + <div style="display:none" id="image-goal-picker-extra"> + <select id="image-tracker-goal"> + <option value="">{'UserCountryMap_None'|translate}</option> + </select> + <span>{'CoreAdminHome_WithOptionalRevenue'|translate}</span> + <span class="currency">{$defaultSiteRevenue}</span> + <input type="text" class="revenue" value=""/> + </div> + </div> + </div> +</td> +</tr> +</table> + +<div id="image-link-output-section" width="560px"> + <h3>{'CoreAdminHome_ImageTrackingLink'|translate}</h3><br/><br/> + <div id="image-tracking-link"> + <textarea> </textarea> + </div> + <br/> +</div> + +</div> + +<h2>{'CoreAdminHome_ImportingServerLogs'|translate}</h2> + +<p> +{'CoreAdminHome_ImportingServerLogsDesc'|translate:'<a href="http://piwik.org/log-analytics/" target="_blank">':'</a>'} +</p> + +{include file="CoreAdminHome/templates/footer.tpl"} + diff --git a/plugins/CoreHome/templates/autocomplete.js b/plugins/CoreHome/templates/autocomplete.js index 8285b5fdb4..52523ae054 100644 --- a/plugins/CoreHome/templates/autocomplete.js +++ b/plugins/CoreHome/templates/autocomplete.js @@ -5,190 +5,246 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ -$('.but').on('click', function(e) +function switchSite(id, name, showAjaxLoading, idCanBeAll) { - if($('#websiteSearch').val() != '') - $('#websiteSearch').autocomplete('search', $('#websiteSearch').val() + '%%%'); - return false; -}); - -function switchSite(id, name, showAjaxLoading) -{ - $('.sites_autocomplete input').val(id); - $('.custom_select_main_link').text(name); - $('.custom_select_main_link').addClass('custom_select_loading'); - broadcast.propagateNewPage('idSite='+id, showAjaxLoading); + if (id == 'all' + && !idCanBeAll) + { + broadcast.propagateNewPage('module=MultiSites&action=index'); + } + else + { + $('.sites_autocomplete input').val(id); + $('.custom_select_main_link').text(name); + $('.custom_select_main_link').addClass('custom_select_loading'); + broadcast.propagateNewPage('idSite='+id, showAjaxLoading); + } return false; } -// global function that is executed when the user selects a new site. -// can be overridden to customize behavior (see UsersManager) -window.autocompleteOnNewSiteSelect = function(siteId, siteName) -{ - if (siteId == 'all') - { - broadcast.propagateNewPage('module=MultiSites&action=index'); - } - else - { - switchSite(siteId, siteName); - } -}; - $(function() { - if($('#websiteSearch').length == 0) - { - return; - } - - $('#websiteSearch').click(function(e) + + var reset = function(selector) { - $(this).val(''); - }); - $('#websiteSearch').keyup(function(e) + $('.websiteSearch', selector).val(''); + $('.custom_select_ul_list', selector).show(); + $(".siteSelect.ui-autocomplete,.reset", selector).hide(); + }; + + // sets up every un-inited site selector widget + piwik.initSiteSelectors = function() { - if(parseInt($(this).val().length) == 0) - { - reset(); - } - }); - $('#websiteSearch').autocomplete({ - minLength: 1, - source: '?module=SitesManager&action=getSitesForAutocompleter', - appendTo: '#custom_select_container', - select: function(event, ui) { - if(piwik.idSite == ui.item.id) + $('.sites_autocomplete').each(function() { + var selector = $(this); + + if (selector.attr('data-inited') == 1) { - $("#sitesSelectionSearch .custom_select_block").toggleClass("custom_select_block_show"); + return; } - else - { - if(ui.item.id > 0) { - // set attributes of selected site display (what shows in the box) - $("#sitesSelectionSearch .custom_select_main_link") - .attr('siteid', ui.item.id) - .text(ui.item.name); - // hide the dropdown - $("#sitesSelectionSearch .custom_select_block").toggleClass("custom_select_block_show"); - // fire the site selected event - window.autocompleteOnNewSiteSelect(ui.item.id, ui.item.name); - } else { - reset(); + + selector.attr('data-inited', 1); + + var websiteSearch = $('.websiteSearch', selector); + + // when the search input is clicked, clear the input + websiteSearch.click(function() { + $(this).val(''); + }); + + // when a key is released over the search input when empty, reset the selector + // + websiteSearch.keyup(function(e) { + if (e.keyCode == 27) + { + $('.custom_select_block', selector).removeClass('custom_select_block_show'); + return false; } - } - return false; - }, - focus: function(event, ui) { - $('#websiteSearch').val(ui.item.name); - return false; - }, - search: function(event, ui) { - $("#reset").show(); - $("#sitesSelectionSearch .custom_select_main_link").addClass("custom_select_loading"); - }, - open: function(event, ui) { - var widthSitesSelection = +$("#sitesSelectionSearch ul").width(); // convert to int - $("#sitesSelectionSearch .custom_select_main_link").removeClass("custom_select_loading"); - if(widthSitesSelection > $('#max_sitename_width').val()) + + if (!$(this).val()) + { + reset(selector); + } + }); + + // setup the autocompleter + websiteSearch.autocomplete({ + minLength: 1, + source: '?module=SitesManager&action=getSitesForAutocompleter', + appendTo: $('.custom_select_container', selector), + select: function(event, ui) { + if (piwik.idSite == ui.item.id) + { + $('.custom_select_block', selector).removeClass('custom_select_block_show'); + } + else + { + if (ui.item.id > 0) + { + // set attributes of selected site display (what shows in the box) + $('.custom_select_main_link', selector) + .attr('siteid', ui.item.id) + .text(ui.item.name); + + // hide the dropdown + $('.custom_select_block', selector).removeClass('custom_select_block_show'); + + // fire the site selected event + selector.trigger('piwik:siteSelected', ui.item); + } + else + { + reset(selector); + } + } + + return false; + }, + focus: function(event, ui) { + $('.websiteSearch', selector).val(ui.item.name); + return false; + }, + search: function(event, ui) { + $('.reset', selector).show(); + $('.custom_select_main_link', selector).addClass('custom_select_loading'); + }, + open: function(event, ui) { + var widthSitesSelection = +$('.custom_select_ul_list', selector).width(); + + $('.custom_select_main_link', selector).removeClass('custom_select_loading'); + + var maxSitenameWidth = $('.max_sitename_width', selector); + if (widthSitesSelection > maxSitenameWidth.val()) + { + maxSitenameWidth.val(widthSitesSelection); + } + else + { + maxSitenameWidth = +maxSitenameWidth.val(); // convert to int + } + + $('.custom_select_ul_list', selector).hide(); + + // customize jquery-ui's autocomplete positioning + var cssToRemove = {float: 'none', position: 'static'}; + $('.siteSelect.ui-autocomplete', selector) + .show().width(widthSitesSelection).css(cssToRemove) + .find('li,a').each(function() { + $(this).css(cssToRemove); + }); + + $('.custom_select_block_show', selector).width(widthSitesSelection); + } + }).data("autocomplete")._renderItem = function (ul, item) { + $(ul).addClass('siteSelect'); + + var idSiteParam = 'idSite=' + item.id, + hash = broadcast.isHashExists() ? broadcast.getHashFromUrl().replace(/idSite=[0-9]+/, idSiteParam) : "", + linkUrl = piwikHelper.getCurrentQueryStringWithParametersModified(idSiteParam) + hash, + link = $("<a></a>").html(item.label).attr('href', linkUrl), + listItem = $('<li></li>'); + + listItem.data("item.autocomplete", item) + .append(link) + .appendTo(ul); + + return listItem; + }; + + // when the reset button is clicked, reset the site selector + $('.reset', selector).click(reset); + + // when mouse button is released on body, check if it is not over the site selector, and if not + // close it + $('body').on('mouseup', function(e) { + var closestSelector = $(e.target).closest('.sites_autocomplete'); + if (closestSelector != selector) + { + reset(selector); + $('.custom_select_block', selector).removeClass('custom_select_block_show'); + } + }); + + // set event handling code for non-jquery-autocomplete parts of widget + if ($('li', selector).length > 1) { - $('#max_sitename_width').val(widthSitesSelection); + // event handler for when site selector is clicked. shows dropdown w/ first X sites + $(".custom_select_main_link", selector).click(function() { + $(".custom_select_block", selector).addClass("custom_select_block_show"); + $('.custom_select_ul_list', selector).show(); + $('.websiteSearch', selector).val('').focus(); + return false; + }); + + $('.custom_select_block', selector).on('mouseenter', function() { + $('.custom_select_ul_list li a', selector).each(function(){ + var hash = broadcast.getHashFromUrl(); + hash = hash ? hash.replace(/idSite=[0-9]+/, 'idSite='+$(this).attr('siteid')) : ""; + + var queryString = piwikHelper.getCurrentQueryStringWithParametersModified( + 'idSite=' + $(this).attr('siteid')); + $(this).attr('href', queryString + hash); + }); + }); + + // change selection. fire's site selector's on select event and modifies the attributes + // of the selected link + $('.custom_select_ul_list li a', selector).each(function() { + $(this).click(function (e) { + var idsite = $(this).attr('siteid'), + name = $(this).text(); + + $(".custom_select_main_link", selector) + .attr('siteid', idsite) + .text(name); + + selector.trigger('piwik:siteSelected', {id: idsite, name: name}); + + // close the dropdown + $(".custom_select_block", selector).removeClass("custom_select_block_show"); + + e.preventDefault(); + }); + }); + + var inlinePaddingWidth = 22, staticPaddingWidth = 34; + if ($(".custom_select_block ul", selector)[0]) + { + var widthSitesSelection = Math.max( + $(".custom_select_block ul", selector).width()+inlinePaddingWidth, + $(".custom_select_main_link", selector).width()+staticPaddingWidth + ); + $(".custom_select_block", selector).css('width', widthSitesSelection); + } } else { - widthSitesSelection = +$('#max_sitename_width').val(); // convert to int + $('.custom_select_main_link', selector).addClass('noselect'); } - $('.custom_select_ul_list').hide(); + // handle multi-sites link click (triggers site selected event w/ id=all) + $('.custom_select_all', selector).click(function () { + $(".custom_select_block", selector).toggleClass("custom_select_block_show"); + + selector.trigger('piwik:siteSelected', {id: 'all', name: $('.custom_select_all>a', selector).text()}); + }); - // customize jquery-ui's autocomplete positioning - var cssToRemove = {float: 'none', position: 'static'}; - $("#siteSelect.ui-autocomplete") - .show().width(widthSitesSelection).css(cssToRemove) - .find('li,a').each(function () { - $(this).css(cssToRemove); - }); + // handle submit button click + $('.but', selector).on('click', function(e) { + if (websiteSearch.val() != '') + { + websiteSearch.autocomplete('search', websiteSearch.val() + '%%%'); + } + return false; + }); - $(".custom_select_block_show").width(widthSitesSelection); - } - }).data("autocomplete")._renderItem = function( ul, item ) { - $(ul).attr('id', 'siteSelect'); - return $( "<li></li>" ) - .data( "item.autocomplete", item ) - .append( $( "<a></a>" ).html( item.label ) - .attr('href', piwikHelper.getCurrentQueryStringWithParametersModified('idSite='+item.id) - + (broadcast.isHashExists() - ? broadcast.getHashFromUrl().replace(/idSite=[0-9]+/, 'idSite='+item.id) - : "" - ) ) ) - .appendTo( ul ); + // if the data-switch-site-on-select attribute is set to 1 on the selector, set + // a default handler for piwik:siteSelected that switches the current site + if (selector.attr('data-switch-site-on-select') == 1) + { + selector.bind('piwik:siteSelected', function (e, site) { + switchSite(site.id, site.name); + }); + } + }); }; - - $('body').on('mouseup',function(e){ - if(!$(e.target).parents('#sitesSelectionSearch').length && !$(e.target).is('#sitesSelectionSearch') && !$(e.target).parents('#siteSelect.ui-autocomplete').length) { - reset(); - $('#sitesSelectionSearch .custom_select_block').removeClass('custom_select_block_show'); - } - }); - - function reset() - { - $('#websiteSearch').val(''); - $('.custom_select_ul_list').show(); - $("#siteSelect.ui-autocomplete").hide(); - $("#reset").hide(); - } - $("#reset").click(reset); - - // set event handling code for non-jquery-autocomplete parts of widget - if($('.custom_select_ul_list li').length > 1) { - // event handler for when site selector is clicked. shows dropdown w/ first X sites - $("#sitesSelectionSearch .custom_select_main_link").click(function(){ - $("#sitesSelectionSearch .custom_select_block").toggleClass("custom_select_block_show"); - $('.custom_select_ul_list').show(); - $('#websiteSearch').val('').focus(); - return false; - }); - $('#sitesSelectionSearch .custom_select_block').on('mouseenter', function(){ - $('.custom_select_ul_list li a').each(function(){ - var hash = broadcast.getHashFromUrl(); - hash = hash ? hash.replace(/idSite=[0-9]+/, 'idSite='+$(this).attr('siteid')) : ""; - - var queryString = piwikHelper.getCurrentQueryStringWithParametersModified( - 'idSite=' + $(this).attr('siteid')); - $(this).attr('href', queryString + hash); - }); - }); - - // change selection. fire's site selector's on select event and modifies the attributes - // of the selected link - $('.custom_select_ul_list li a').each(function(){ - $(this).click(function (e) { - var idsite = $(this).attr('siteid'), name = $(this).text(); - window.autocompleteOnNewSiteSelect(idsite, name); - - $("#sitesSelectionSearch .custom_select_main_link") - .attr('siteid', idsite) - .text(name); - - // close the dropdown - $("#sitesSelectionSearch .custom_select_block").toggleClass("custom_select_block_show"); - - e.preventDefault(); - }); - }); - - var inlinePaddingWidth = 22, staticPaddingWidth = 34; - if($(".custom_select_block ul")[0]){ - var widthSitesSelection = Math.max($(".custom_select_block ul").width()+inlinePaddingWidth, $(".custom_select_main_link").width()+staticPaddingWidth); - $(".custom_select_block").css('width', widthSitesSelection); - } - } else { - $('.custom_select_main_link').addClass('noselect'); - } - - // handle multi-sites link click - $('.custom_select_all').click(function () { - $("#sitesSelectionSearch .custom_select_block").toggleClass("custom_select_block_show"); - window.autocompleteOnNewSiteSelect('all', $('.custom_select_all>a').text()); - }); }); diff --git a/plugins/CoreHome/templates/misc.js b/plugins/CoreHome/templates/misc.js index ab542b802f..04a21a118b 100755 --- a/plugins/CoreHome/templates/misc.js +++ b/plugins/CoreHome/templates/misc.js @@ -56,27 +56,68 @@ $(document).ready(function() { // section toggler behavior // - // when click section toggler link, toggle the visibility of the associated section - $('body').on('click', '.section-toggler-link', function (e) { - e.preventDefault(); + var handleSectionToggle = function (self, showType, doHide) + { + var sectionId = $(self).attr('data-section-id'), + section = $('#' + sectionId), + showText = _pk_translate('General_Show_js'), + hideText = _pk_translate('General_Hide_js'); - var self = this, - sectionId = $(self).attr('data-section-id'), - section = $('#' + sectionId); + if (typeof(doHide) == 'undefined') + { + doHide = section.is(':visible'); + } - if (section.is(':visible')) + if (doHide) { - section.slideUp(function() { $(self).text(_pk_translate('General_Show_js')); }); + var newText = $(self).text().replace(hideText, showText), + afterHide = function() { $(self).text(newText); }; + + if (showType == 'slide') + { + section.slideUp(afterHide); + } + else if (showType == 'inline') + { + section.hide(); + afterHide(); + } + else + { + section.hide(afterHide); + } } else { - $(self).text(_pk_translate('General_Hide_js')); - section.slideDown(); + var newText = $(self).text().replace(showText, hideText); + $(self).text(newText); + + if (showType == 'slide') + { + section.slideDown(); + } + else if (showType == 'inline') + { + section.css('display', 'inline-block'); + } + else + { + section.show(); + } } - + }; + + // when click section toggler link, toggle the visibility of the associated section + $('body').on('click', 'a.section-toggler-link', function (e) { + e.preventDefault(); + handleSectionToggle(this, 'slide'); return false; }); + $('body').on('change', 'input.section-toggler-link', function (e) { + handleSectionToggle(this, 'inline', !$(this).is(':checked')); + }); + // // reports by dimension list behavior // diff --git a/plugins/CoreHome/templates/sites_selection.tpl b/plugins/CoreHome/templates/sites_selection.tpl index 2e0d224daf..c716bea2fb 100644 --- a/plugins/CoreHome/templates/sites_selection.tpl +++ b/plugins/CoreHome/templates/sites_selection.tpl @@ -20,8 +20,9 @@ </a> </div> {/capture} -<div class="sites_autocomplete"> - <div id="sitesSelectionSearch" class="custom_select"> +<div class="sites_autocomplete" {if isset($siteSelectorId)}id="{$siteSelectorId}"{/if} + {if !isset($switchSiteOnSelect) || $switchSiteOnSelect eq true}data-switch-site-on-select="1"{/if}> + <div class="custom_select"> <a href="#" onclick="return false" class="custom_select_main_link" siteid="{if isset($idSite)}{$idSite}{else}{$sites[0].idsite}{/if}">{if isset($siteName)}{$siteName}{else}{$sites[0].name}{/if}</a> @@ -29,7 +30,7 @@ {if isset($allWebsitesLinkLocation) && $allWebsitesLinkLocation eq 'top'} {$sitesSelector_allWebsitesLink} {/if} - <div id="custom_select_container"> + <div class="custom_select_container"> <ul class="custom_select_ul_list" > {foreach from=$sites item=info} <li {if (!isset($showSelectedSite) || $showSelectedSite eq false) && $idSite==$info.idsite} style="display: none"{/if}><a href="#" siteid="{$info.idsite}">{$info.name}</a></li> @@ -40,23 +41,15 @@ {$sitesSelector_allWebsitesLink} {/if} <div class="custom_select_search" {if !$show_autocompleter}style="display:none;"{/if}> - <input type="text" length="15" id="websiteSearch" class="inp"/> - <input type="hidden" class="max_sitename_width" id="max_sitename_width" value="130" /> + <input type="text" length="15" class="websiteSearch inp"/> + <input type="hidden" class="max_sitename_width" value="130" /> <input type="submit" value="Search" class="but"/> - <img title="Clear" id="reset" style="position: relative; top: 4px; left: -44px; cursor: pointer; display: none;" src="plugins/CoreHome/templates/images/reset_search.png"/> + <img title="Clear" class="reset" style="position: relative; top: 4px; left: -44px; cursor: pointer; display: none;" src="plugins/CoreHome/templates/images/reset_search.png"/> </div> </div> </div> {if isset($inputName)}<input type="hidden" name="{$inputName}" value="{if isset($idSite)}{$idSite}{else}{$sites[0].idsite}{/if}"/>{/if} - {if isset($switchSiteOnSelect) && $switchSiteOnSelect eq false} - <script type="text/javascript"> - {literal} - // make sure site is not switched an item is selected - window.autocompleteOnNewSiteSelect = function(id) { - $('.sites_autocomplete input').val(id); - }; - {/literal} - </script> - {/if} </div> - +<script type="text/javascript"> + {literal}$(document).ready(function() { piwik.initSiteSelectors(); });{/literal} +</script> diff --git a/plugins/UsersManager/templates/UsersManager.js b/plugins/UsersManager/templates/UsersManager.js index 6948af6f90..66c2cc8001 100644 --- a/plugins/UsersManager/templates/UsersManager.js +++ b/plugins/UsersManager/templates/UsersManager.js @@ -234,4 +234,14 @@ $(document).ready( function() { $('.updateAccess') .click( bindUpdateAccess ); + + // when a site is selected, reload the page w/o showing the ajax loading element + $('#usersManagerSiteSelect').bind('piwik:siteSelected', function(e, site) { + switchSite( + site.id, + site.name, + false /* do not show main ajax loading animation */, + true /* do not go to all websites dash */ + ); + }); }); diff --git a/plugins/UsersManager/templates/UsersManager.tpl b/plugins/UsersManager/templates/UsersManager.tpl index 9034bbcc9c..88ad149c56 100644 --- a/plugins/UsersManager/templates/UsersManager.tpl +++ b/plugins/UsersManager/templates/UsersManager.tpl @@ -39,14 +39,8 @@ {/capture} {include file="CoreHome/templates/sites_selection.tpl" siteName=$defaultReportSiteName idSite=$idSiteSelected allSitesItemText=$applyAllSitesText - allWebsitesLinkLocation=top} + allWebsitesLinkLocation=top siteSelectorId="usersManagerSiteSelect" switchSiteOnSelect=false} </section> - {literal}<script type="text/javascript"> - window.autocompleteOnNewSiteSelect = function(siteId, siteName) - { - switchSite(siteId, siteName, false /* do not show main ajax loading animation */); - }; - </script>{/literal} </div> {ajaxErrorDiv} |