From 2f1e5b4fb46df8a654c4af09c9659a0de7b16071 Mon Sep 17 00:00:00 2001 From: Juan Date: Tue, 22 May 2018 11:44:24 +0200 Subject: [PATCH] #82 Non-generated files removed from generated directory, vnTooltip refactor --- .../client/src/address-edit/address-edit.html | 2 - client/client/src/addresses/addresses.html | 26 +- .../credit-classification-list.html | 8 +- .../credit-insurance-list.html | 2 +- client/client/src/descriptor/descriptor.html | 5 - .../components/step-control/step-control.html | 3 +- .../src/components/textfield/textfield.html | 3 +- client/core/src/components/tooltip/style.css | 60 --- client/core/src/components/tooltip/style.scss | 23 ++ .../core/src/components/tooltip/tooltip.html | 3 + client/core/src/components/tooltip/tooltip.js | 367 +++++++++++------- client/core/src/directives/dialog.js | 2 +- .../core/src/directives/no-image.png | Bin client/core/src/directives/on-error-src.js | 14 +- client/item/src/barcode/barcode.html | 3 +- client/item/src/niche/niche.html | 3 +- client/item/src/tags/tags.html | 2 - .../src/locator-table/locator-table.html | 111 +++--- .../production-table/production-table.html | 41 +- .../ticket/src/note/ticket-observation.html | 3 +- client/ticket/src/package/index/package.html | 2 - client/ticket/src/sale/sale.html | 3 +- services/nginx/.gitignore | 4 +- services/nginx/static/images/icon_client.png | Bin 13350 -> 0 bytes services/nginx/static/images/icon_item.png | Bin 3006 -> 0 bytes .../nginx/static/images/icon_production.png | Bin 8068 -> 0 bytes .../static/templates/tooltip.locator.tpl.html | 14 - .../static/templates/tooltip.routes.tpl.html | 14 - 28 files changed, 382 insertions(+), 336 deletions(-) delete mode 100644 client/core/src/components/tooltip/style.css create mode 100644 client/core/src/components/tooltip/style.scss create mode 100644 client/core/src/components/tooltip/tooltip.html rename services/nginx/static/images/no-image200x200.png => client/core/src/directives/no-image.png (100%) delete mode 100644 services/nginx/static/images/icon_client.png delete mode 100644 services/nginx/static/images/icon_item.png delete mode 100644 services/nginx/static/images/icon_production.png delete mode 100644 services/nginx/static/templates/tooltip.locator.tpl.html delete mode 100644 services/nginx/static/templates/tooltip.routes.tpl.html diff --git a/client/client/src/address-edit/address-edit.html b/client/client/src/address-edit/address-edit.html index ab464f6a9..dc7218e8e 100644 --- a/client/client/src/address-edit/address-edit.html +++ b/client/client/src/address-edit/address-edit.html @@ -87,7 +87,6 @@ pointer medium-grey vn-tooltip="Remove note" - tooltip-position = "left" icon="remove_circle_outline" ng-click="$ctrl.removeObservation($index)"> @@ -99,7 +98,6 @@ pointer vn-bind="+" vn-tooltip="Add note" - tooltip-position = "right" icon="add_circle" ng-if="observationsTypes.model.length > $ctrl.observations.length" ng-click="$ctrl.addObservation()"> diff --git a/client/client/src/addresses/addresses.html b/client/client/src/addresses/addresses.html index bac2f70c8..e6a1d1b5b 100644 --- a/client/client/src/addresses/addresses.html +++ b/client/client/src/addresses/addresses.html @@ -7,16 +7,24 @@ ng-class="{'bg-dark-item': address.isDefaultAddress,'bg-opacity-item': !address.isActive && !address.isDefaultAddress}"> - star - star_border - + star + + + star_border + + star_border + vn-tooltip="Set as default" + ng-click="$ctrl.setDefault(address)"> + star_border +
{{::address.nickname}}
diff --git a/client/client/src/credit-classification-list/credit-classification-list.html b/client/client/src/credit-classification-list/credit-classification-list.html index 378bb051d..28fbe7634 100644 --- a/client/client/src/credit-classification-list/credit-classification-list.html +++ b/client/client/src/credit-classification-list/credit-classification-list.html @@ -7,8 +7,7 @@ lock_outline @@ -35,7 +34,7 @@
- + @@ -43,8 +42,7 @@ --> + fixed-bottom-right vn-tooltip="New classification" vn-bind="+" ng-if="!$ctrl.isClosed"> \ No newline at end of file diff --git a/client/client/src/descriptor/descriptor.html b/client/client/src/descriptor/descriptor.html index 7e76550df..183255921 100644 --- a/client/client/src/descriptor/descriptor.html +++ b/client/client/src/descriptor/descriptor.html @@ -29,31 +29,26 @@ diff --git a/client/core/src/components/step-control/step-control.html b/client/core/src/components/step-control/step-control.html index 356584bc3..0ca358676 100644 --- a/client/core/src/components/step-control/step-control.html +++ b/client/core/src/components/step-control/step-control.html @@ -2,8 +2,7 @@
diff --git a/client/core/src/components/textfield/textfield.html b/client/core/src/components/textfield/textfield.html index 97501ae8a..fe69149a3 100644 --- a/client/core/src/components/textfield/textfield.html +++ b/client/core/src/components/textfield/textfield.html @@ -16,8 +16,7 @@
+ vn-tooltip="{{$ctrl.info}}"> info_outline .arrow { + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-color: transparent; + } +} diff --git a/client/core/src/components/tooltip/tooltip.html b/client/core/src/components/tooltip/tooltip.html new file mode 100644 index 000000000..e2c9e19ce --- /dev/null +++ b/client/core/src/components/tooltip/tooltip.html @@ -0,0 +1,3 @@ +
+
+
\ No newline at end of file diff --git a/client/core/src/components/tooltip/tooltip.js b/client/core/src/components/tooltip/tooltip.js index 052e30267..a907f03e7 100644 --- a/client/core/src/components/tooltip/tooltip.js +++ b/client/core/src/components/tooltip/tooltip.js @@ -1,159 +1,250 @@ import ngModule from '../../module'; -import './style.css'; +import Component from '../../lib/component'; +import './style.scss'; -tooltip.$inject = ['$document', '$compile', '$interpolate', '$sce', '$templateCache', '$http', '$q']; -function tooltip($document, $compile, $interpolate, $sce, $templateCache, $http, $q) { - var promise; +let positions = ['left', 'right', 'up', 'down']; - function _getTemplate(tooltipTemplateUrl) { - var template = $templateCache.get(tooltipTemplateUrl); - if (typeof template === 'undefined') { - template = $http.get(tooltipTemplateUrl).then(function onGetTemplateSuccess(response) { - if (promise) { - promise.resolve(response.data); - } - promise = undefined; - return response.data; - }); - $templateCache.put(tooltipTemplateUrl, template); - } - return template; +/** + * A simple tooltip. + * + * @property {String} position The relative position to the parent + */ +export default class Tooltip extends Component { + constructor($element, $scope, $timeout) { + super($element, $scope); + this.$timeout = $timeout; + $element.addClass('vn-tooltip mdl-shadow--4dp'); + this.position = 'down'; } - function getTemplate(tooltipTemplateUrl) { - var _promise = $q.defer(); - var template = _getTemplate(tooltipTemplateUrl); - if (template) { - _promise.resolve(template); + /** + * Shows the tooltip. + * + * @param {HTMLElement} parent The parent element + */ + show(parent) { + this.parent = parent; + this.$element.addClass('show'); + this.relocate(); + this.relocateTimeout = this.$timeout(() => this.relocate(), 200); + } + + /** + * Hides the tooltip. + */ + hide() { + this.$element.removeClass('show'); + + if (this.relocateTimeout) { + this.$timeout.cancel(this.relocateTimeout); + this.relocateTimeout = null; + } + } + + /** + * Repositions the tooltip acording to it's own size and parent location. + */ + relocate() { + let axis; + let position = this.position; + + if (positions.indexOf(position) == -1) + position = 'down'; + + switch (position) { + case 'right': + case 'left': + axis = 'x'; + break; + default: + axis = 'y'; + } + + let arrowSize = 10; + let tipMargin = arrowSize; + let rect = this.parent.getBoundingClientRect(); + let tipRect = this.element.getBoundingClientRect(); + + let tipComputed = this.window.getComputedStyle(this.element, null); + let bgColor = tipComputed.getPropertyValue('background-color'); + + let min = tipMargin; + let maxTop = window.innerHeight - tipRect.height - tipMargin; + let maxLeft = window.innerWidth - tipRect.width - tipMargin; + + // Coordinates + + let top; + let left; + + function calcCoords() { + top = rect.top; + left = rect.left; + + if (axis == 'x') + top += rect.height / 2 - tipRect.height / 2; + else + left += rect.width / 2 - tipRect.width / 2; + + switch (position) { + case 'right': + left += arrowSize + rect.width; + break; + case 'left': + left -= arrowSize + tipRect.width; + break; + case 'up': + top -= arrowSize + tipRect.height; + break; + default: + top += arrowSize + rect.height; + } + } + calcCoords(); + + let axisOverflow = + axis == 'x' && (left < min || left > maxLeft) || + axis == 'y' && (top < min || top > maxTop); + + function switchPosition(position) { + switch (position) { + case 'right': + return 'left'; + case 'left': + return 'right'; + case 'up': + return 'down'; + default: + return 'up'; + } + } + + if (axisOverflow) { + position = switchPosition(position); + calcCoords(); + } + + // Overflow + + function range(coord, min, max) { + return Math.min(Math.max(coord, min), max); + } + + if (axis == 'x') + top = range(top, min, maxTop); + else + left = range(left, min, maxLeft); + + let style = this.element.style; + style.top = `${top}px`; + style.left = `${left}px`; + + // Arrow position + + if (this.arrow) + this.element.removeChild(this.arrow); + + let arrow = document.createElement('div'); + arrow.className = 'arrow'; + arrow.style.borderWidth = `${arrowSize}px`; + + let arrowStyle = arrow.style; + + if (axis == 'x') { + let arrowTop = (rect.top + rect.height / 2) - top - arrowSize; + arrowStyle.top = `${arrowTop}px`; } else { - promise = _promise; + let arrowLeft = (rect.left + rect.width / 2) - left - arrowSize; + arrowStyle.left = `${arrowLeft}px`; } - return _promise.promise; + + let arrowCoord = `${-tipMargin}px`; + + switch (position) { + case 'right': + arrowStyle.left = arrowCoord; + arrowStyle.borderRightColor = bgColor; + arrowStyle.borderLeftWidth = 0; + break; + case 'left': + arrowStyle.right = arrowCoord; + arrowStyle.borderLeftColor = bgColor; + arrowStyle.borderRightWidth = 0; + break; + case 'up': + arrowStyle.bottom = arrowCoord; + arrowStyle.borderTopColor = bgColor; + arrowStyle.borderBottomWidth = 0; + break; + default: + arrowStyle.top = arrowCoord; + arrowStyle.borderBottomColor = bgColor; + arrowStyle.borderTopWidth = 0; + } + + this.element.appendChild(arrow); + this.arrow = arrow; } + $destroy() { + this.hide(); + } +} +Tooltip.$inject = ['$element', '$scope', '$timeout']; + +ngModule.component('vnTooltip', { + template: require('./tooltip.html'), + controller: Tooltip, + transclude: true, + bindings: { + position: '@?' + } +}); + +directive.$inject = ['$document', '$compile', '$templateRequest']; +export function directive($document, $compile, $templateRequest) { return { restrict: 'A', - priority: -1, - link: function($scope, element, attrs) { - let tipHtml = '
{{::text}}
'; - let tip; - let tipClassName = 'tooltip'; - let tipActiveClassName = 'tooltip-show'; - let scope = $scope.$new(); + link: function($scope, $element, $attrs) { + let tooltip; + let $tooltip; + let $tooltipScope; - scope.tipClass = [tipClassName]; - scope.text = attrs.vnTooltip || ''; - - if (attrs.tooltipHtml) { - scope.isHtmlContent = true; - scope.htmlContent = $sce.trustAsHtml(attrs.tooltipHtml); - _compileTip(); - } else if (attrs.tooltipTemplate) { - getTemplate(attrs.tooltipTemplate).then(template => { - scope.isHtmlContent = true; - scope.htmlContent = $sce.trustAsHtml($interpolate(template)(scope)); - _compileTip(); - }); + if ($attrs.tooltipId) { + let tooltipKey = kebabToCamel($attrs.tooltipId); + tooltip = $scope[tooltipKey]; + if (!(tooltip instanceof Tooltip)) + throw new Error(`vnTooltip id should reference a tooltip instance`); } else { - scope.isHtmlContent = false; - scope.htmlContent = null; - _compileTip(); + $tooltipScope = $scope.$new(); + $tooltipScope.text = $attrs.vnTooltip; + let template = `{{::text}}`; + $tooltip = $compile(template)($tooltipScope); + $document.find('body').append($tooltip); + tooltip = $tooltip[0].$ctrl; } - if (attrs.tooltipPosition) { - scope.tipClass.push('tooltip-' + attrs.tooltipPosition); - } else { - scope.tipClass.push('tooltip-down'); - } + if ($attrs.tooltipPosition) + tooltip.position = $attrs.tooltipPosition; - function _compileTip() { - tip = $compile(tipHtml)(scope); - $document.find('body').append(tip); - _bindEvents(); - } + $element[0].title = ''; + $element.on('mouseover', function(event) { + if (event.defaultPrevented) return; + event.preventDefault(); + tooltip.show($element[0]); + }); + $element.on('mouseout', function() { + tooltip.hide(); + }); + $element.on('$destroy', function() { + tooltip.hide(); - function _bindEvents() { - element.bind('mouseover', function(e) { - _showTooltip(e); - }); - - element.on('mouseout', function() { - _hideTooltip(); - }); - - tip.on('mouseover', function(e) { - _showTooltip(e); - }); - - tip.on('mouseout', function() { - _hideTooltip(); - }); - - element.on('$destroy', function() { - tip.remove(); - scope.$destroy(); - }); - } - - function _calculatePosition(e) { - let pos = element[0].getBoundingClientRect(); - let tipPos = tip[0].getBoundingClientRect(); - let offset = {top: 0, left: 0}; - let tipWidth = tipPos.width || tipPos.right - tipPos.left; - let tipHeight = tipPos.height || tipPos.bottom - tipPos.top; - let elWidth = pos.width || pos.right - pos.left; - let elHeight = pos.height || pos.bottom - pos.top; - let tipOffset = 10; - - if (tip.hasClass('tooltip-right')) { - offset.top = pos.top - (tipHeight / 2) + (elHeight / 2); - offset.left = pos.right + tipOffset; - } else if (tip.hasClass('tooltip-left')) { - offset.top = pos.top - (tipHeight / 2) + (elHeight / 2); - offset.left = pos.left - tipWidth - tipOffset; - } else if (tip.hasClass('tooltip-down')) { - offset.top = pos.top + elHeight + tipOffset; - offset.left = pos.left - (tipWidth / 2) + (elWidth / 2); - } else { - offset.top = pos.top - tipHeight - tipOffset; - offset.left = pos.left - (tipWidth / 2) + (elWidth / 2); + if ($tooltip) { + $tooltip.remove(); + $tooltipScope.$destroy(); } - // outsides - if (offset.left + tipPos.width > window.innerWidth) { // right outside - let diffLeft = (offset.left + tipPos.width) - window.innerWidth; - offset.left -= diffLeft + 10; - - let arrow = tip[0].querySelector('.tooltip-arrow'); - if (arrow) { - angular.element(arrow).css('margin-left', diffLeft + 'px'); - } - } else if (offset.left < 10) { // left outside - offset.left = 10; - let arrow = tip[0].querySelector('.tooltip-arrow'); - if (arrow) { - angular.element(arrow).css('margin-left', '10px'); - } - } - if (offset.top > window.innerHeight) { // down outside - offset.top = pos.top - tipHeight - tipOffset; - } else if (offset.top < 10) { // top outside - offset.top = pos.top + elHeight + tipOffset; - } - - tip.css('top', offset.top + 'px'); - tip.css('left', offset.left + 'px'); - } - - function _showTooltip(e) { - tip.addClass(tipActiveClassName); - _calculatePosition(e); - } - - function _hideTooltip() { - tip.removeClass(tipActiveClassName); - } + }); } }; } - -ngModule.directive('vnTooltip', tooltip); +ngModule.directive('vnTooltip', directive); diff --git a/client/core/src/directives/dialog.js b/client/core/src/directives/dialog.js index 7e51a8e9e..fcbbebd97 100644 --- a/client/core/src/directives/dialog.js +++ b/client/core/src/directives/dialog.js @@ -8,7 +8,7 @@ import {kebabToCamel} from '../lib/string'; * * @return {Object} The directive */ -export function directive() { +export default function directive() { return { restrict: 'A', link: function($scope, $element, $attrs) { diff --git a/services/nginx/static/images/no-image200x200.png b/client/core/src/directives/no-image.png similarity index 100% rename from services/nginx/static/images/no-image200x200.png rename to client/core/src/directives/no-image.png diff --git a/client/core/src/directives/on-error-src.js b/client/core/src/directives/on-error-src.js index 1462063d6..094064aad 100644 --- a/client/core/src/directives/on-error-src.js +++ b/client/core/src/directives/on-error-src.js @@ -1,14 +1,20 @@ import ngModule from '../module'; +import noImage from './no-image.png'; -function onErrorSrc() { +/** + * Sets a default image when there is an error loading + * the original image. + * + * @return {Object} The directive + */ +export default function onErrorSrc() { return { restrict: 'A', link: (scope, element, attrs) => { - let imgError = '/static/images/no-image200x200.png'; + let imgError = noImage; element.bind('error', function() { - if (attrs.src != imgError) { + if (attrs.src != imgError) attrs.$set('src', imgError); - } }); } }; diff --git a/client/item/src/barcode/barcode.html b/client/item/src/barcode/barcode.html index 20d00d9af..ad9ec7f4c 100644 --- a/client/item/src/barcode/barcode.html +++ b/client/item/src/barcode/barcode.html @@ -15,7 +15,6 @@ pointer medium-grey vn-tooltip="Remove barcode" - tooltip-position="left" icon="remove_circle_outline" ng-click="$ctrl.removeBarcode($index)"> @@ -25,7 +24,7 @@ vn-acl="buyer, replenisher" vn-tooltip="Add barcode" vn-bind="+" - tooltip-position="right" icon="add_circle" + icon="add_circle" ng-click="$ctrl.addBarcode()"> diff --git a/client/item/src/niche/niche.html b/client/item/src/niche/niche.html index d21220f2c..f432498c3 100644 --- a/client/item/src/niche/niche.html +++ b/client/item/src/niche/niche.html @@ -40,7 +40,6 @@ pointer medium-grey vn-tooltip="Remove niche" - tooltip-position="left" icon="remove_circle_outline" ng-click="$ctrl.removeNiche($index)"> @@ -50,7 +49,7 @@ vn-acl="buyer, replenisher" vn-tooltip="Add niche" vn-bind="+" - tooltip-position="right" icon="add_circle" + icon="add_circle" ng-click="$ctrl.addNiche()"> diff --git a/client/item/src/tags/tags.html b/client/item/src/tags/tags.html index 19a2f3eae..f8fe5fa50 100644 --- a/client/item/src/tags/tags.html +++ b/client/item/src/tags/tags.html @@ -53,7 +53,6 @@ pointer medium-grey vn-tooltip="Remove tag" - tooltip-position="left" icon="remove_circle_outline" ng-click="$ctrl.removeItemTag($index)"> @@ -62,7 +61,6 @@ diff --git a/client/locator/src/locator-table/locator-table.html b/client/locator/src/locator-table/locator-table.html index 79fbcce45..2e211bf54 100644 --- a/client/locator/src/locator-table/locator-table.html +++ b/client/locator/src/locator-table/locator-table.html @@ -1,60 +1,55 @@ - - - - - - - - - - - - - - - - - - - - {{::route.zoneFk}} - {{::route.postalcode}} - {{::route.order}} - {{::route.preparado}} - {{::route.entrada}} - {{::route.ticket}} - {{::route.routeFk}} - {{::route.alias}} - {{::route.bultos}} - {{::route.m3}} - - - - - - - - Address: {{::route.address}} - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + {{::route.zoneFk}} + {{::route.postalcode}} + {{::route.order}} + {{::route.preparado}} + {{::route.entrada}} + {{::route.ticket}} + {{::route.routeFk}} + {{::route.alias}} + {{::route.bultos}} + {{::route.m3}} + + + + + + + + Address: {{::route.address}} + + + + + + + + + \ No newline at end of file diff --git a/client/production/src/production-table/production-table.html b/client/production/src/production-table/production-table.html index e87410722..524f0b38d 100644 --- a/client/production/src/production-table/production-table.html +++ b/client/production/src/production-table/production-table.html @@ -2,7 +2,11 @@ - + + @@ -19,7 +23,12 @@ - + + @@ -35,7 +44,27 @@ {{::ticket.m3}} {{::ticket.boxes}} - + + + + + + Town + Province + Client ID + Worker + + + {{::ticket.city | ucwords}} + {{::ticket.province | ucwords}} + {{::ticket.client | ucwords}} + {{::ticket.worker | ucwords}} + + + @@ -57,7 +86,7 @@ - - - + + + \ No newline at end of file diff --git a/client/ticket/src/note/ticket-observation.html b/client/ticket/src/note/ticket-observation.html index e3c09e80a..d42a46e17 100644 --- a/client/ticket/src/note/ticket-observation.html +++ b/client/ticket/src/note/ticket-observation.html @@ -40,7 +40,6 @@ pointer medium-grey vn-tooltip="Remove note" - tooltip-position="left" icon="remove_circle_outline" ng-click="$ctrl.removeObservation($index)"> @@ -50,7 +49,7 @@ diff --git a/client/ticket/src/package/index/package.html b/client/ticket/src/package/index/package.html index 7116c81ed..785eeb3b2 100644 --- a/client/ticket/src/package/index/package.html +++ b/client/ticket/src/package/index/package.html @@ -44,7 +44,6 @@ pointer medium-grey vn-tooltip="Remove package" - tooltip-position = "left" icon="remove_circle_outline" ng-click="$ctrl.removePackage($index)"> @@ -55,7 +54,6 @@ diff --git a/client/ticket/src/sale/sale.html b/client/ticket/src/sale/sale.html index 245509ce8..548adb42f 100644 --- a/client/ticket/src/sale/sale.html +++ b/client/ticket/src/sale/sale.html @@ -18,8 +18,7 @@ diff --git a/services/nginx/.gitignore b/services/nginx/.gitignore index c68eb0b10..185616dcd 100644 --- a/services/nginx/.gitignore +++ b/services/nginx/.gitignore @@ -1,4 +1,2 @@ static/* -temp/* -!static/templates -!static/images \ No newline at end of file +temp/* \ No newline at end of file diff --git a/services/nginx/static/images/icon_client.png b/services/nginx/static/images/icon_client.png deleted file mode 100644 index 8858ec7ae4e062f0e0bdea16eca97c420ef4c98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13350 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

cW;V5JD^07ddEQF=nsXbjRbc; zlHp^6{qU4~t;v(+JdM-j`>F;W3{%Fk^cLay$*HTW?U!k0WK)yRiVat{>;SGku94ZZ&ZN(h-BI z)X*i>g02oyO{A>V`PrFFYHCsP{QXmxM~6NuoYR9~?FhzS+&P%GJ!Yp;mG-Gg3i7+Q zg?3+-16c_V89r6oZ-Wf1{(k4->l&gPk(^u{36d>HS<9shNvY|POxKqiGOJZ+3S*Tr zIQ(I!lvSUC$R@46?{iA0Nvx(e+PwIL5(s3asY9}3UF!0d%KpqnrxRNMgA87CnR=HM z6r@I%WKwtETXW0rT;m<%+MkUB&wYi!F~mjrdt{nOPF?h_ZgJ=KC8G&SksQI&x}=|} zFFcbc7{~)h6`@Mp=@X`1zCOCRVpr6fnp?YWzSa3zJ^H=x{I0+ptrV<^|NHNMy#yqz zdFDWF!7I`0-%c!_@nZB*VYg$dvAFT+&mU}N{@Ewj{a!Z--rPTb;X?gP(eU>^EiOnnGJ{?0&~MhZjrLuv&Df|Q zuM(^sQJI>{tKI^zlMu=o5Axd9^%xpc&WFHR%KrFaAi%4HrkH|b~Yy8vJQIKLo+$=?kk zs&)JtDH2;0RZmaGp=lgM|RC(^J zX~CMic1Pnix!JFKDzoCx(WevNk5AmXd^f}D?+g3q!Q;7@TrXK2J>mPffJ#N-3wB$^ zJgaDH@Q`JTCXErv+gmolW8;`f8yk#sYfaq9J6JggeRP-Rr@e@vR;!ZFcNiusUa21M z$D?p&W6F_*m&wVta^$A7f(ceua>`>D_zqgNgyf~4vls;15GGMk4dSjSCCQPs$hzk| z0dOjOHLReZ0F$waxuz6hbE)HR^_#>}KSk0IC7|~CuV`VOGs0~)0Spf_TcSZ?9GO-k( zv;A(uEoby4kFnLVKy0N+@-~&_ey_ji%4gH)lCVvw3fJYE7(_{t7m<&xPY%0|3d0^H zc(-muI8ysz4DR2#M%7%IaZZelO5(Nhl-QH~Pm(iIqhE_@a0K2oRwWb}f+aC!#Fq~g| zR<-5zmEOBPn07>5I*Csa$Qq>h#KsS^ZnrCJ)h5U#&#l4}LW?K@D`$!zQ|2J`)OdB^ zukdT%{Yu@D5s0nG}ht%heAIStw)WBSRc$_0-hz#|okt~wwxpW)sroL%vS7~X9}4Cme43zG55dWnuG%|%1CP5dn;Aeg>NNphV= zZxLS{;SLdaAHGTn8I_=qu-9%!-0RNvURBGrcgaD(EE#Lml*;uOdHFpA+svKZ zYuTY(IbftPw%GL_%+w~tligZol6g5FQ|J5l&EeDlc-*u*M@_XXCc_zKk{cU8%<(V5 z&>Mu9-#6#XQsP)A(ef2X)Pdx6Y6NLbI+smtKnpd^^Ij2kU^OORQ1Z$*CQx}Czl}!c zc$;&@Tulgj;49A8bj4%b)H{OjpYnxr^YA`^{VR7zr`370_)Z8)G3Uk_wn+d4c_A8; zBw>mSsgR}!5RbL2<1)9p?R17zMK<8JJQY{vcuV?ml@UP!?gc+*5hNoYAe*1~rxHbu ziG4m#cM^b8g4En#&SA?H;FW_X7l#CXP10Ni2VG~%XRG3DYD%87Y%rq9$cubQXNV@U zis$>IjQ#>(=7hu?L%ZV)F!mFd+kFzoPgoa)==8S$kB5lNzF6GSNb~T^wZAy?? z3nwnU_xq!3_1D;r=SgapJ2@+QP82?CsKdt^K;Eh9ZXSCCLjF)>@ZDBUx4r6v!|Tr_ zS(*mfB+*(Ek1_#Duc$=Cl7%P&VmyliQ{J)tZ!4;!J`5TSQ}m7Q`cgqOV{oE`N~4Q! z8e-CO`CQTudcUeOWgM%xsrRD=GZ;X+5MPhj_riuG+L2Hp0i?mTe_y7^nv(bI@bR65 z@T;w$?$3YkF-I?-`f<9n7NB|(IT1kS|}Eg+tZ+H z!jCIhVYM+l?gww4PW#t!PYM-XkdklP9u!`$ifNu6qORk!$c^Irz9#Fs5|$vqDZr9s zqE$}P3Ob|2yVphWy`_PT4;5ck#l9$fTDI?`YZ9&WgfbGE@F7o{@;FBF6C&Lal)%m5Bbb?y2ml2#5+9JEcN%3Y0G*L-u!7$d!gX`IFBrx zV8smV>}n2}im>9g!`Ow$$6KUB|MM^f;4%MM;cDSbjyb+$SeoS>r}Zx*>uvj*=X6r- z^JxZj;jvUS*C}ttsznZl4p-~q@-D+lEoU7Hfc0%<=0Hh3kHxe+p(^waENLyo_cXuB zX6~%2*rglIzZ+%7nb|)5-g5sw7fvJI3pC+|SdzKkJda}UPj&jI|M7V>;ob-GuGqt1 zSL6_=($2~431{mASWIODdI3I5(Re~6ZO%YTy{=>1aHUaFNoP2mjr=oMO%v-xfCE)Z z@42-l)KF7*>BgS90AzCOQOWXWS(4?gX#k+`qGyqyNjKEkoiAvgezh&N-y1JPr2Mbc z%Ej%~UtCzsBM;=|m*%o}D!r#^<1Nmu_xM;TggWI{H99&etUc3vDd3%tuJ4g4c`4i7OD>3_@YR#*i*Oez0 z=4jMT*99m!V5@+)WBiFSMoXUm`>rMF7ITwy39I-WR`mc=N3MEZiyyk8yx*<_(KFpq*g54B=dzBfs zqa`YBH#2B8S>BDWYkv{xw<SA;iS?t#H4*{POM4h%ltkP->wtT5OuAZ*sRTu2LqWRgrEjG8Mp$5+i{ z==lzsmU;j!X0!~Ewd>lBg#KZ*%-?oEq^0sRB#ArexsPcv^$!ysbAd3jx3Co zy1@yhD$(}Oy{=CmQhTs#H$L(e^*vBW}GN$b+x;Elb$7=?V_;>S4_GF|eMeQ;k@ICMo8}=aCgJUTf zDKnk$3K|c}w;^Un_dd$?sbjDH?ttQz3L{jh*e+S?Vewe{m?|_6=ZmY)rn^w z`9?wCb}p4IG>P0J_Szk8|C|%VDo*eHh>xxSv@Y(m-FZRfQL$;z^D)|%+HckVyPVEA z^#QN4fTVx(rJq`u$yt(Xg*db>i=(zw(ddu9T*6&J>r{Q*?=-rW&q2ps-3ZJYc-=J* zmoAWbjK}DZUWe)R(X$a{igY+2~+5d5Ox2BoL z{lzkxeAbrH9+|l38)7F6xQm3-J%mO=+DyUk~57)jyB;?aVU?zO_Q;0iyjKO;^_N=t%rluje~Svp?^YeS4h&V z6q=3>%5L>QOO&Q@(B7@hO-lH=sPfhFdG4(pk5FxrMPEJZOkC;=Grr-Xn76OH87@ib zGN@VVhcm^uWJWD*D5wi`arc*`jmHqDP~jm?&XgwMgy7X&3$qFlE_4;>#VZ&GDfB5J zDT@V%`Lm6K(qgo5M*Y`^!meao;8dGNf2+mV?fA}NKh8O&jugqIq}nHS z5D1nASmZBu&%eJH>4OFh#@m4m44D1Qclzo})3ju2$-hzm`1M%J#7K+rb|h4`>Xe3T zhV*d9|MCy!(btVZ{`v+xW26gi|7Xen0RDI4zashnYYZ2sYYB(G{2U6#|B*y$T(byw j|L?#5jiu-93@4;NfA*)dmY9&)-VK0)P_$cK~hxL_AbXuDY0$rTPZIspYd@ z0C*smIp?8ca#bNEUG|WdnT=lWQVK=z-4+ z$FGSn+lCf!MFJlN3z*XElF2nuUA3Yxf=R5W0M?$LgEg0Dx+*6fbYie7=R}OI552%H zK6XwnQK!egq3fA^=wiy2OX{K2-~y!{S~YZmP0pWHgf$-N_=?FDp03IaGeD`UGGzuh zgylS~&|?WExRf+CaxKUbm>%SqYl1P6?6^XYB?A$jHCICyl*7Da^GG^qF`|Vi$ckN5 z=&=WSIVPdUreL`;0KW(DQ^WBqhq|iE%di6QszQ&Y^ujQ?M!*ulp8)*AaQp}Cf}4L} zH_qg0B9Q+I;8!(2A3|(Nmoui~7W+kY)?5x<$wLETNiE}hZ0Uxq*p)$#g_+tTgb3j$ z6+&!9cWi|andkQ!2_f=|d)Npek`SJo?{3jHeQ%2p*7{{aJ$7T!V@oDiealnOXZm=<>tNI1d}EH;+A?N~LnfEYS&{7x zuY()S5>fjY6^<|#k>oH9@L?omg5PLn zRqKHD*pehbTiw$4q$i{6D(~jLrpd`*A(EjtXqe(i$JiIET?9xndEFNs^jOzP&yxOL zr>o8|LXnfPcK?{-NTC-;TanB8x`Q5TS`pgRj6p4GSBxMdO-}IS@YVTa>P#tXo2ea@+1J)`Vo5K%MlcFg0ViB~oYbpsJ5gn_{JI zDaVm~jB@u8l4;^9F9G}qz+V9T3s0Ld+!KkH@Tgdck2|h&=;KJC7e_ONWa{GQ0DcSL zm!;6c*hTGvBA2SibaAAyqTDV+GHvi@?CY(13ExX7ZLp6cm6wu+igLRQ$(*;)WB;a? z?sxF3T4HeID(jYV94Yj^hdG+3_I!yziok_daMu(^nnG&NuL1lM6GDj9oU7tUA*S}o zRG7a5_>9Trj~eYoQL6+T&d+43n!LOOP&?$z_Kwl{y*dAqVYp znOuHi43|3za@}CO%!Ck-5A1R$MXot^!9`gwg7K7GlL%#u=@#VzZ;UXvhcPVp$b)N$ z6~W2@$O*wGLH~+eWx|hz$>j>k6vQmU?@&aHaEtOX;D4Me!Y=cG!Q^s^0vsP>aydkb za4Xv|xdOlm34YdNp5vo{ul*Hvf!G3^^~sjY0p{3me&D4fCYKW&ll98^kutelAyS0@ zoF6Zf%LSGQx0EFd`aqD-zd3mG1Y0gg$V+aM!Q|>458x<2yG4gk#Xiq2*>X9VRVLun z9wwJV#6&QT@K1zXnTIpCgRVw1CCw!tqTJEUV9V7zbFx6Nw1h2tr272 zici}CB6%E$8z_)PFkI04QGWDUBkoDcW zMCWDbBIVFUEnT(7(^h=IhkYLNzEAE-&{y@LmU^s@emiT@4;Rd%Cs?Ao#qlj1_jz<3 zM3v+zHxE$tSlfO(Wox!1a zP25$+(6=~NLkpwzc^q@$+SG?yLiXF~vj1?ai2kXC779FV#ixcA&M(LS@cQjsawn}la;K8$qKv090(`LygM|CR91*TXGC2-AU(_^_sk0p*ZS8CB! ztI&1TA!x2H)BJnVI5w-%M01T5E@8JgLg*rfJ+&wAL61cUAQfgP9D?O4>mQk=Iy2~> z75!`*ST4EC#+0!jzc)Li!9Fx{sTO8M0^bz6NbzA7tBG6*eb>zJUDr6!#_)$)6LmvV z{w}-3V+w&(?Oy(z$aj!s2oBY9l~Kp~sGA>d8(KXuxegmrk6pI>`zpQ0Y_f!BP-!R5(wOr`gxMemi-CIN!yYV_T;49PVxhQY`-NqaC`P+h2)zwr_n2% z1edeu{=hL?t~KT}yPwg~Z&7}9*=qUnUz-nDe!s?Jd(l(t;2671{?6cV?vw5(+9T*` zl~UEM=)GN$tgs*m&z=$>`z+zzi=PFK0QZJBJ%FBgZRSrjSl(PCd3;;CL4OYiwdO>G zn{?l>3I)esOEGYCc>_8Y;A~wKEJCvA42xm#-8X4-vc;&TkUwiM$a z+FJ;>`8if?gfRqat4-scAT%7S@pw3HUQIDg{m%uPywDD}GKE7<7J$8~zDIn^LHZnr z_o!5l&&)k?0GvnoZxf}z!zV=eed%@P)H2~TJ|YrqttI4at1#yzp%nNGJ~ zD6He9@QCK=zLh`4s1ABD$QQb%`V5*70BE+rS;KCZoSKS!(bTyNIIu_Q|9#wH&_9_tUryJQ;M1GAoNRqxhA;VTuS2X+dis5Z8Cg+&?-sTTklYiKgs6|f)kUU_#dB?=dfOHs3GjS zfuhmZ$JFQ3nk86b{?n3jfK)>3PPe)iog?$bDnd^iY3RhyXk<&4bMkbbk~(5@)Q!T= zNZsL|J@!M}3-?ukTS17)^L3)xMvmUMT9)DuSUV#0(dk;U87B{iRYm7k@&!T0v~$0a zI|nt@`AIg=sE*x|Hd$Vxjr*}Mr`R7msLU$)EjMQi4k>x_dL`BU1dSNW)nnZYyvxr% zZWNC%hm8pnQoH@LDE#0;&*HO#iUu*pj7TecBAof@@wu9744#{OhgLh{x zq$@u(;cjzH*5++>@&*a-et28qGQTj~{CQM(9>ph=eLygZ>)1GNKIs8G-u-q%1u_nR z#oQyDg35;0KFTj--OYNx0o!ATMiR2PDK&f<;t5yYB!46QYPV+d+h+5cH-GJOFp^-l zCW6A@ZF&-yo?Ho~Oi@v%Juw!YG^u#n0IV66wXH5!P!)K{Bq!MY`9=BO-d=n z9NtLpo4MoW*s!J}1jP|eQe#X2aF0|YW5SKaO;P`lonPj#zjShGh^!`1-N)uFsmbpQUyvX zds`6tY;;M_AP;V;y8Hq96c?$aD^Mqj)rH=y@sD%UmD`?BIB(!)_GmU2e4IKF);k8FeT!R*KOTz13wh zGnGqoWo87S4alAM@}?9nVAkRy2@5M1WJ>O%k~GZ@_4afUjWE6+2yGpS?-i|0on8Ztct1WSsqin4FN+HB5dLsI6O}gWJDsG3=+0xVJ)xO+3&F z@rfMS(bRV+HmCblAbbJ6^in);xG~S={txZnG0Lze4!FmhP*B~=tC0t-PrG#}W^myL zXjNGvbi~t;^jhlEiU+juNg#X0M8qqPR#rWy^}kWtJgX0@DU6eoXG8lZaJc(MR5m zr!i4xekmGCsoZ={g@O^$=o*nQb1f-3mX`zEe-RIO<-k{(QGkDthemaCAnhSG$d zRwwVlxF0fnbif%`rb-aTLlWoStdxCd=$xPye2QMP3T4RYWsz*K(^bh<`Nf`qd$&?X z=*V=Y>JA;XM^ev!nd@b2^(+t5b`~U<@ORC*WW4zX|3Da8SEf(br_x70jW5TUcr8OT zu);z&c<6{dQW&iyA4L8UHLty;9T5o}=UBp&m+1_HiQVgKLZgI)h1HmIbJcXu$LoY% z*5;sN!W{7hRyk3fpGY+NG8wbXkokGomL0%laG-#W0_sn4{6vvJ1=HqYsmtRHq)$ diff --git a/services/nginx/static/templates/tooltip.locator.tpl.html b/services/nginx/static/templates/tooltip.locator.tpl.html deleted file mode 100644 index be0877ab8..000000000 --- a/services/nginx/static/templates/tooltip.locator.tpl.html +++ /dev/null @@ -1,14 +0,0 @@ - - - Town - Province - Client ID - Worker - - - {{::ticket.city | ucwords}} - {{::ticket.province | ucwords}} - {{::ticket.client | ucwords}} - {{::ticket.worker | ucwords}} - - \ No newline at end of file diff --git a/services/nginx/static/templates/tooltip.routes.tpl.html b/services/nginx/static/templates/tooltip.routes.tpl.html deleted file mode 100644 index 71e8be8d0..000000000 --- a/services/nginx/static/templates/tooltip.routes.tpl.html +++ /dev/null @@ -1,14 +0,0 @@ - - - PoblaciĆ³n - Provincia - ID_Cliente - Comercial - - - {{::ticket.city | ucwords}} - {{::ticket.province | ucwords}} - {{::ticket.client | ucwords}} - {{::ticket.worker | ucwords}} - - \ No newline at end of file