From a0d50410aa19de2babe937a7010b514f92f727f9 Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 11 Nov 2020 12:34:07 +0100 Subject: [PATCH 01/20] Added section --- .../travel/front/extra-community/index.html | 32 +++++++++++++++++++ modules/travel/front/extra-community/index.js | 8 +++++ .../front/extra-community/locale/es.yml | 1 + .../travel/front/extra-community/style.scss | 25 +++++++++++++++ modules/travel/front/routes.json | 13 +++++++- 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 modules/travel/front/extra-community/index.html create mode 100644 modules/travel/front/extra-community/index.js create mode 100644 modules/travel/front/extra-community/locale/es.yml create mode 100644 modules/travel/front/extra-community/style.scss diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html new file mode 100644 index 000000000..d363f0ce0 --- /dev/null +++ b/modules/travel/front/extra-community/index.html @@ -0,0 +1,32 @@ + + + + +
+ +
{{detail.buyer}}
+
+ + + + Family + Percentage + Dwindle + Total + + + + + {{::waste.family}} + {{::(waste.percentage / 100) | percentage: 2}} + {{::waste.dwindle | currency: 'EUR'}} + {{::waste.total | currency: 'EUR'}} + + + +
+
+
diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js new file mode 100644 index 000000000..685958909 --- /dev/null +++ b/modules/travel/front/extra-community/index.js @@ -0,0 +1,8 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; +import './style.scss'; + +ngModule.vnComponent('vnTravelExtraCommunity', { + template: require('./index.html'), + controller: Section +}); diff --git a/modules/travel/front/extra-community/locale/es.yml b/modules/travel/front/extra-community/locale/es.yml new file mode 100644 index 000000000..aa231d3be --- /dev/null +++ b/modules/travel/front/extra-community/locale/es.yml @@ -0,0 +1 @@ +Family: Familia \ No newline at end of file diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss new file mode 100644 index 000000000..55a6eb2ef --- /dev/null +++ b/modules/travel/front/extra-community/style.scss @@ -0,0 +1,25 @@ +@import "variables"; + +vn-item-waste { + .header { + margin-bottom: 16px; + text-transform: uppercase; + font-size: 1.25rem; + line-height: 1; + padding: 7px; + padding-bottom: 7px; + padding-bottom: 4px; + font-weight: lighter; + background-color: #fde6ca; + border-bottom: 1px solid #f7931e; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + vn-table vn-th.waste-family, + vn-table vn-td.waste-family { + max-width: 64px; + width: 64px + } +} \ No newline at end of file diff --git a/modules/travel/front/routes.json b/modules/travel/front/routes.json index 5fa43fd1d..30792278e 100644 --- a/modules/travel/front/routes.json +++ b/modules/travel/front/routes.json @@ -6,7 +6,8 @@ "dependencies": ["worker", "entry"], "menus": { "main": [ - {"state": "travel.index", "icon": "local_airport"} + {"state": "travel.index", "icon": "local_airport"}, + {"state": "travel.extraCommunity", "icon": "directions_boat"} ], "card": [ {"state": "travel.card.basicData", "icon": "settings"}, @@ -90,6 +91,16 @@ "travel": "$ctrl.travel" }, "acl": ["buyer"] + }, + { + "url": "/extra-community", + "state": "travel.extraCommunity", + "component": "vn-travel-extra-community", + "description": "Extra community", + "acl": ["buyer"], + "params": { + "travel": "$ctrl.travel" + } } ] } \ No newline at end of file From 4acdfd6d4e80659cff5d6a54f167438f85bebca4 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 13 Nov 2020 09:30:40 +0100 Subject: [PATCH 02/20] Th refactor --- db/changes/10250-curfew/00-travelDetail.sql | 94 ++++++++ front/core/components/table/style.scss | 23 +- front/core/components/th/index.html | 4 +- front/core/components/th/index.js | 17 +- front/core/components/th/style.scss | 33 +++ modules/entry/back/models/buy.json | 10 +- .../methods/travel/extraCommunityFilter.js | 227 ++++++++++++++++++ modules/travel/back/models/travel.js | 1 + .../travel/front/extra-community/index.html | 29 ++- .../travel/front/extra-community/style.scss | 2 +- modules/travel/front/index.js | 1 + 11 files changed, 400 insertions(+), 41 deletions(-) create mode 100644 db/changes/10250-curfew/00-travelDetail.sql create mode 100644 front/core/components/th/style.scss create mode 100644 modules/travel/back/methods/travel/extraCommunityFilter.js diff --git a/db/changes/10250-curfew/00-travelDetail.sql b/db/changes/10250-curfew/00-travelDetail.sql new file mode 100644 index 000000000..673044b9e --- /dev/null +++ b/db/changes/10250-curfew/00-travelDetail.sql @@ -0,0 +1,94 @@ +drop procedure `vn2008`.travelDetail; + +create definer = root@`%` procedure `vn2008`.travelDetail__() +BEGIN + + DECLARE vDateFrom DATE DEFAULT TIMESTAMPADD(WEEK,-12,CURDATE()); + + SELECT IFNULL(CONCAT(" ",Entrada),travel) travelAndEntry, + travel, + Entrada, + IsTravel, + Agencia, + ref, + shipment, + OrigenCajas, + landing, + Destino, + Etiquetas, + Notas_Eva, + kg, + loadedKg, + volumeKg, + loadPriority, + Notas, + Carguera + FROM(SELECT + 1 as IsTravel, + tr.id as travel, + NULL as Entrada, + ag.Agencia, + tr.ref, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(c.Etiquetas) as Etiquetas, + NULL as Notas_Eva, + kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + NULL as loadPriority, + NULL as Notas, + pc.Alias as Carguera + FROM travel tr + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + LEFT JOIN Entradas e ON e.travel_id = tr.id + LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + LEFT JOIN Articles a ON a.Id_Article = c.Id_Article + LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id + WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY tr.id + + UNION ALL + + SELECT + 0 as IsTravel, + e.travel_id as travel, + e.Id_Entrada, + p.Proveedor, + e.Referencia, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(Etiquetas) as Etiquetas, + e.Notas_Eva, + NULL as kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + loadPriority, + e.Notas, + pc.Alias as carguera + + FROM Entradas e + JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + JOIN Articles a ON a.Id_Article = c.Id_Article + JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor + JOIN travel tr ON tr.id = e.travel_id + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY e.Id_Entrada + ) sub + ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; + +END; + diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss index 7dd69d89f..8d35c374c 100644 --- a/front/core/components/table/style.scss +++ b/front/core/components/table/style.scss @@ -22,28 +22,7 @@ vn-table { & > * > vn-th[field] { position: relative; overflow: visible; - cursor: pointer; - - &.active > :after { - color: $color-font; - opacity: 1; - } - &.desc > :after { - content: 'arrow_drop_down'; - } - &.asc > :after { - content: 'arrow_drop_up'; - } - & > :after { - font-family: 'Material Icons'; - content: 'arrow_drop_down'; - position: absolute; - color: $color-spacer; - opacity: 0; - } - &:hover > :after { - opacity: 1; - } + cursor: pointer } } & > vn-tbody, diff --git a/front/core/components/th/index.html b/front/core/components/th/index.html index 28d80695d..281c6866c 100644 --- a/front/core/components/th/index.html +++ b/front/core/components/th/index.html @@ -1,3 +1 @@ -
- -
\ No newline at end of file +
\ No newline at end of file diff --git a/front/core/components/th/index.js b/front/core/components/th/index.js index b8260bd74..838431714 100644 --- a/front/core/components/th/index.js +++ b/front/core/components/th/index.js @@ -1,10 +1,19 @@ import ngModule from '../../module'; +import Component from '../../lib/component'; +import './style.scss'; + +export default class Th extends Component { + constructor($element, $, $transclude) { + super($element, $); -export default class Th { - constructor($element) { this._order = 'ASC'; this.column = $element[0]; $element.on('click', () => this.onToggleOrder()); + + $transclude($clone => { + const text = this.$t($clone.text()); // Not updating translations + $element.append(text ? text : $clone); + }); } /** @@ -54,7 +63,6 @@ export default class Th { else this.table.setOrder(this.field, this.order); - this.updateArrow(); this.table.applyOrder(this.field, this.order); @@ -73,10 +81,9 @@ export default class Th { } } -Th.$inject = ['$element']; +Th.$inject = ['$element', '$scope', '$transclude']; ngModule.vnComponent('vnTh', { - template: require('./index.html'), transclude: true, controller: Th, bindings: { diff --git a/front/core/components/th/style.scss b/front/core/components/th/style.scss new file mode 100644 index 000000000..6f575a02e --- /dev/null +++ b/front/core/components/th/style.scss @@ -0,0 +1,33 @@ +@import "effects"; +@import "variables"; + +vn-th { + font-weight: normal; +} + +vn-th[field] { + &.active:after { + color: $color-font; + opacity: 1; + } + &.desc:after { + content: 'arrow_drop_down'; + } + &.asc:after { + content: 'arrow_drop_up'; + } + + &:after { + font-family: 'Material Icons'; + content: 'arrow_drop_down'; + position: absolute; + color: $color-spacer; + font-size: 1.5em; + margin-top: -2px; + opacity: 0 + + } + &:hover:after { + opacity: 1; + } +} \ No newline at end of file diff --git a/modules/entry/back/models/buy.json b/modules/entry/back/models/buy.json index 56f1eef4f..65bf15fa4 100644 --- a/modules/entry/back/models/buy.json +++ b/modules/entry/back/models/buy.json @@ -34,9 +34,6 @@ "stickers": { "type": "number" }, - "packageFk": { - "type": "number" - }, "groupingMode": { "type": "number" }, @@ -68,6 +65,11 @@ "model": "Item", "foreignKey": "itemFk", "required": true - } + }, + "package": { + "type": "belongsTo", + "model": "Packaging", + "foreignKey": "packageFk" + } } } \ No newline at end of file diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js new file mode 100644 index 000000000..5b095328b --- /dev/null +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -0,0 +1,227 @@ + +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; +const buildFilter = require('vn-loopback/util/filter').buildFilter; +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethodCtx('extraCommunityFilter', { + description: 'Find all instances of the model matched by filter from the data source.', + accessType: 'READ', + accepts: [ + { + arg: 'filter', + type: 'Object', + description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', + http: {source: 'query'} + }, { + arg: 'search', + type: 'String', + description: 'Searchs the travel by id', + http: {source: 'query'} + }, { + arg: 'id', + type: 'Integer', + description: 'The travel id', + http: {source: 'query'} + }, { + arg: 'shippedFrom', + type: 'Date', + description: 'The shipped from date filter', + http: {source: 'query'} + }, { + arg: 'shippedTo', + type: 'Date', + description: 'The shipped to date filter', + http: {source: 'query'} + }, { + arg: 'landedFrom', + type: 'Date', + description: 'The landed from date filter', + http: {source: 'query'} + }, { + arg: 'landedTo', + type: 'Date', + description: 'The landed to date filter', + http: {source: 'query'} + }, { + arg: 'agencyFk', + type: 'Number', + description: 'The agencyModeFk id', + http: {source: 'query'} + }, { + arg: 'warehouseOutFk', + type: 'Number', + description: 'The warehouseOutFk filter', + http: {source: 'query'} + }, { + arg: 'warehouseInFk', + type: 'Number', + description: 'The warehouseInFk filter', + http: {source: 'query'} + }, { + arg: 'totalEntries', + type: 'Number', + description: 'The totalEntries filter', + http: {source: 'query'} + }, { + arg: 'ref', + type: 'string', + description: 'The reference' + } + ], + returns: { + type: ['Object'], + root: true + }, + http: { + path: `/extraCommunityFilter`, + verb: 'GET' + } + }); + + Self.extraCommunityFilter = async(ctx, filter) => { + let conn = Self.dataSource.connector; + let where = buildFilter(ctx.args, (param, value) => { + switch (param) { + case 'search': + return /^\d+$/.test(value) + ? {'t.id': value} + : {'t.ref': {like: `%${value}%`}}; + case 'ref': + return {'t.ref': {like: `%${value}%`}}; + case 'shippedFrom': + return {'t.shipped': {gte: value}}; + case 'shippedTo': + return {'t.shipped': {lte: value}}; + case 'landedFrom': + return {'t.landed': {gte: value}}; + case 'landedTo': + return {'t.landed': {lte: value}}; + case 'id': + case 'agencyFk': + case 'warehouseOutFk': + case 'warehouseInFk': + case 'totalEntries': + param = `t.${param}`; + return {[param]: value}; + } + }); + + filter = mergeFilters(ctx.args.filter, {where}); + + let stmts = []; + let stmt; + stmt = new ParameterizedSQL( + `SELECT + tr.id, + tr.ref, + tr.shipped, + tr.landed, + tr.kg, + am.id AS agencyModeFk, + am.name AS agencyModeName, + wo.id AS warehouseOutFk, + wo.name AS warehouseOutName, + w.name AS warehouseInFk, + w.name AS warehouseInName, + SUM(b.stickers) AS stickers, + s.id AS supplierFk, + s.nickname AS supplierNickname + FROM travel tr + LEFT JOIN supplier s ON s.id = tr.cargoSupplierFk + LEFT JOIN entry e ON e.travelFk = tr.id + LEFT JOIN buy b ON b.entryFk = e.id + LEFT JOIN packaging p ON p.id = b.packageFk + LEFT JOIN item i ON i.id = b.itemFk + LEFT JOIN itemType it ON it.id = i.typeFk + JOIN warehouse w ON w.id = tr.warehouseInFk + JOIN warehouse wo ON wo.id = tr.warehouseOutFk + JOIN agencyMode am ON am.id = tr.agencyFk` + ); + + /* cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + pc.Alias as Carguera */ + + // WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + + stmt.merge('GROUP BY tr.id'); + // stmt.merge(conn.makeSuffix(filter)); + const itemsIndex = stmts.push(stmt) - 1; + + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql); + return itemsIndex === 0 ? result : result[itemsIndex]; + + /* + SET @vDateFrom:= TIMESTAMPADD(WEEK,-12,CURDATE()); + + SELECT + 1 as IsTravel, + tr.id as travel, + NULL as Entrada, + ag.Agencia, + tr.ref, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(c.Etiquetas) as Etiquetas, + NULL as Notas_Eva, + kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + NULL as loadPriority, + NULL as Notas, + pc.Alias as Carguera + FROM travel tr + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + LEFT JOIN Entradas e ON e.travel_id = tr.id + LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + LEFT JOIN Articles a ON a.Id_Article = c.Id_Article + LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id + WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY tr.id + + UNION ALL + + SELECT + 0 as IsTravel, + e.travel_id as travel, + e.Id_Entrada, + p.Proveedor, + e.Referencia, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(Etiquetas) as Etiquetas, + e.Notas_Eva, + NULL as kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + loadPriority, + e.Notas, + pc.Alias as carguera + + FROM Entradas e + JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + JOIN Articles a ON a.Id_Article = c.Id_Article + JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor + JOIN travel tr ON tr.id = e.travel_id + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY e.Id_Entrada + ) sub + ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; */ + }; +}; + diff --git a/modules/travel/back/models/travel.js b/modules/travel/back/models/travel.js index b47742c26..b8a1a24b3 100644 --- a/modules/travel/back/models/travel.js +++ b/modules/travel/back/models/travel.js @@ -7,6 +7,7 @@ module.exports = Self => { require('../methods/travel/createThermograph')(Self); require('../methods/travel/deleteThermograph')(Self); require('../methods/travel/updateThermograph')(Self); + require('../methods/travel/extraCommunityFilter')(Self); Self.rewriteDbError(function(err) { if (err.code === 'ER_DUP_ENTRY') diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index d363f0ce0..1007f223a 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,15 +1,32 @@ + url="Travels/extraCommunityFilter" + data="travels"> + + + + -
+
-
{{detail.buyer}}
+ + + + {{travel.id}} + {{travel.supplierNickname}} + + + +
- +
diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss index 55a6eb2ef..5a929908c 100644 --- a/modules/travel/front/extra-community/style.scss +++ b/modules/travel/front/extra-community/style.scss @@ -1,6 +1,6 @@ @import "variables"; -vn-item-waste { +vn-travel-extra-community { .header { margin-bottom: 16px; text-transform: uppercase; diff --git a/modules/travel/front/index.js b/modules/travel/front/index.js index 28ec27693..410cbe219 100644 --- a/modules/travel/front/index.js +++ b/modules/travel/front/index.js @@ -13,3 +13,4 @@ import './thermograph/index/'; import './thermograph/create/'; import './thermograph/edit/'; import './descriptor-popover'; +import './extra-community'; From 0ff931b71b36b0045e641c3ab3ce8cdb50c60101 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 13 Nov 2020 09:31:10 +0100 Subject: [PATCH 03/20] Increased jest workers --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e5f668581..d87695cc4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -65,7 +65,7 @@ pipeline { stage('Frontend') { steps { nodejs('node-lts') { - sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=1' + sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=2' } } } From d17a61d4c1c4d1c79b7e161e870d11ec0bb4174b Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 16 Nov 2020 08:45:20 +0100 Subject: [PATCH 04/20] Version merge --- db/changes/10250-curfew/00-ACL.sql | 11 ++- .../00-claimState.sql | 0 .../00-observationType.sql | 0 .../00-supplierLog.sql | 0 .../00-ticket_beforeUpdate.sql | 0 .../00-ticket_componentPreview.sql | 0 db/changes/10250-curfew/00-travelDetail.sql | 94 ------------------- db/changes/10250-toqueDeQueda/00-ACL.sql | 10 -- 8 files changed, 10 insertions(+), 105 deletions(-) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-claimState.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-observationType.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-supplierLog.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-ticket_beforeUpdate.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-ticket_componentPreview.sql (100%) delete mode 100644 db/changes/10250-curfew/00-travelDetail.sql delete mode 100644 db/changes/10250-toqueDeQueda/00-ACL.sql diff --git a/db/changes/10250-curfew/00-ACL.sql b/db/changes/10250-curfew/00-ACL.sql index 90f673c67..46921e575 100644 --- a/db/changes/10250-curfew/00-ACL.sql +++ b/db/changes/10250-curfew/00-ACL.sql @@ -1,4 +1,13 @@ + +UPDATE `salix`.`ACL` SET `principalId` = 'deliveryBoss' WHERE (`id` = '194'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '97'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '100'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '103'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '202'); + INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Supplier', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Supplier', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); \ No newline at end of file +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Town', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Province', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); \ No newline at end of file diff --git a/db/changes/10250-toqueDeQueda/00-claimState.sql b/db/changes/10250-curfew/00-claimState.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-claimState.sql rename to db/changes/10250-curfew/00-claimState.sql diff --git a/db/changes/10250-toqueDeQueda/00-observationType.sql b/db/changes/10250-curfew/00-observationType.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-observationType.sql rename to db/changes/10250-curfew/00-observationType.sql diff --git a/db/changes/10250-toqueDeQueda/00-supplierLog.sql b/db/changes/10250-curfew/00-supplierLog.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-supplierLog.sql rename to db/changes/10250-curfew/00-supplierLog.sql diff --git a/db/changes/10250-toqueDeQueda/00-ticket_beforeUpdate.sql b/db/changes/10250-curfew/00-ticket_beforeUpdate.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-ticket_beforeUpdate.sql rename to db/changes/10250-curfew/00-ticket_beforeUpdate.sql diff --git a/db/changes/10250-toqueDeQueda/00-ticket_componentPreview.sql b/db/changes/10250-curfew/00-ticket_componentPreview.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-ticket_componentPreview.sql rename to db/changes/10250-curfew/00-ticket_componentPreview.sql diff --git a/db/changes/10250-curfew/00-travelDetail.sql b/db/changes/10250-curfew/00-travelDetail.sql deleted file mode 100644 index 673044b9e..000000000 --- a/db/changes/10250-curfew/00-travelDetail.sql +++ /dev/null @@ -1,94 +0,0 @@ -drop procedure `vn2008`.travelDetail; - -create definer = root@`%` procedure `vn2008`.travelDetail__() -BEGIN - - DECLARE vDateFrom DATE DEFAULT TIMESTAMPADD(WEEK,-12,CURDATE()); - - SELECT IFNULL(CONCAT(" ",Entrada),travel) travelAndEntry, - travel, - Entrada, - IsTravel, - Agencia, - ref, - shipment, - OrigenCajas, - landing, - Destino, - Etiquetas, - Notas_Eva, - kg, - loadedKg, - volumeKg, - loadPriority, - Notas, - Carguera - FROM(SELECT - 1 as IsTravel, - tr.id as travel, - NULL as Entrada, - ag.Agencia, - tr.ref, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(c.Etiquetas) as Etiquetas, - NULL as Notas_Eva, - kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - NULL as loadPriority, - NULL as Notas, - pc.Alias as Carguera - FROM travel tr - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - LEFT JOIN Entradas e ON e.travel_id = tr.id - LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - LEFT JOIN Articles a ON a.Id_Article = c.Id_Article - LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id - WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY tr.id - - UNION ALL - - SELECT - 0 as IsTravel, - e.travel_id as travel, - e.Id_Entrada, - p.Proveedor, - e.Referencia, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(Etiquetas) as Etiquetas, - e.Notas_Eva, - NULL as kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - loadPriority, - e.Notas, - pc.Alias as carguera - - FROM Entradas e - JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - JOIN Articles a ON a.Id_Article = c.Id_Article - JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor - JOIN travel tr ON tr.id = e.travel_id - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY e.Id_Entrada - ) sub - ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; - -END; - diff --git a/db/changes/10250-toqueDeQueda/00-ACL.sql b/db/changes/10250-toqueDeQueda/00-ACL.sql deleted file mode 100644 index 4cdadfd04..000000000 --- a/db/changes/10250-toqueDeQueda/00-ACL.sql +++ /dev/null @@ -1,10 +0,0 @@ -UPDATE `salix`.`ACL` SET `principalId` = 'deliveryBoss' WHERE (`id` = '194'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '97'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '100'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '103'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '202'); - -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Town', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Province', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('supplier', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); From f64a566447f251edc02b7c8d6d27a4ff8f7600a8 Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 20 Nov 2020 12:12:06 +0100 Subject: [PATCH 05/20] route.ticket drag and drop validation --- .../methods/route/specs/ticketToRoute.spec.js | 52 +++++++++++++++++++ .../route/back/methods/route/ticketToRoute.js | 51 ++++++++++++++++++ modules/route/back/models/route.js | 5 +- modules/route/front/tickets/index.js | 6 ++- modules/route/front/tickets/index.spec.js | 4 +- modules/route/front/tickets/locale/es.yml | 3 +- .../methods/zone/specs/deleteZone.spec.js | 5 ++ 7 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 modules/route/back/methods/route/specs/ticketToRoute.spec.js create mode 100644 modules/route/back/methods/route/ticketToRoute.js diff --git a/modules/route/back/methods/route/specs/ticketToRoute.spec.js b/modules/route/back/methods/route/specs/ticketToRoute.spec.js new file mode 100644 index 000000000..86206ab42 --- /dev/null +++ b/modules/route/back/methods/route/specs/ticketToRoute.spec.js @@ -0,0 +1,52 @@ +const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); + +describe('route ticketToRoute()', () => { + const deliveryId = 56; + let originalTicket; + const routeId = 2; + const activeCtx = { + accessToken: {userId: deliveryId}, + }; + + beforeAll(async done => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + + done(); + }); + + afterAll(async done => { + try { + await originalTicket.updateAttribute('routeFk', null); + } catch (error) { + console.error(error); + } + done(); + }); + + it('should add the ticket in a route', async() => { + originalTicket = await app.models.Ticket.findById(14); + + const ticketId = 14; + const result = await app.models.Route.ticketToRoute(ticketId, routeId); + + expect(result.routeFk).toEqual(2); + }); + + it('should throw and error if the ticket is not suitable for the route', async() => { + const ticketId = 23; + let error; + + try { + await app.models.Route.ticketToRoute(ticketId, routeId); + } catch (e) { + error = e.message; + } + + expect(error).toBeDefined(); + expect(error).toEqual('The selected ticket is not suitable for this route'); + }); +}); + diff --git a/modules/route/back/methods/route/ticketToRoute.js b/modules/route/back/methods/route/ticketToRoute.js new file mode 100644 index 000000000..93b270015 --- /dev/null +++ b/modules/route/back/methods/route/ticketToRoute.js @@ -0,0 +1,51 @@ +const UserError = require('vn-loopback/util/user-error'); + +module.exports = Self => { + Self.remoteMethod('ticketToRoute', { + description: 'Check if the ticket can be insert into the route and insert it', + accessType: 'READ', + accepts: [{ + arg: 'ticketId', + type: 'number', + required: true, + description: 'ticketId ', + http: {source: 'path'} + }, + { + arg: 'routeId', + type: 'number', + required: true + }], + returns: { + type: 'object', + root: true + }, + http: { + path: `/:ticketId/ticketToRoute`, + verb: 'PATCH' + } + }); + + Self.ticketToRoute = async(ticketId, routeId) => { + const models = Self.app.models; + + const route = await models.Route.findById(routeId); + const minDate = new Date(route.finished); + minDate.setHours(0, 0, 0, 0); + + const maxDate = new Date(route.finished); + maxDate.setHours(23, 59, 59, 59); + const ticket = await models.Ticket.findOne({ + where: { + id: ticketId, + zoneFk: route.zoneFk, + routeFk: null, + landed: {between: [minDate, maxDate]}, + } + }); + if (!ticket) + throw new UserError('The selected ticket is not suitable for this route'); + + return await ticket.updateAttribute('routeFk', route.id); + }; +}; diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js index 6d93cfe40..cdb51c609 100644 --- a/modules/route/back/models/route.js +++ b/modules/route/back/models/route.js @@ -5,6 +5,7 @@ module.exports = Self => { require('../methods/route/guessPriority')(Self); require('../methods/route/updateVolume')(Self); require('../methods/route/getDeliveryPoint')(Self); + require('../methods/route/ticketToRoute')(Self); Self.validate('kmStart', validateDistance, { message: 'Distance must be lesser than 1000' @@ -17,9 +18,7 @@ module.exports = Self => { function validateDistance(err) { const routeTotalKm = this.kmEnd - this.kmStart; const routeMaxKm = 1000; - if ( routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) + if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) err(); } }; - - diff --git a/modules/route/front/tickets/index.js b/modules/route/front/tickets/index.js index a811d6d88..49ca8d60f 100644 --- a/modules/route/front/tickets/index.js +++ b/modules/route/front/tickets/index.js @@ -162,8 +162,10 @@ class Controller extends Section { } insert(id) { - const params = {routeFk: this.route.id}; - this.$http.patch(`Tickets/${id}`, params).then(() => { + const params = {routeId: this.route.id}; + const query = `Routes/${id}/ticketToRoute`; + + return this.$http.patch(query, params).then(() => { this.vnApp.showSuccess(this.$t('Data saved!')); this.$.model.refresh(); this.card.reload(); diff --git a/modules/route/front/tickets/index.spec.js b/modules/route/front/tickets/index.spec.js index a32b368ba..a1b9229b7 100644 --- a/modules/route/front/tickets/index.spec.js +++ b/modules/route/front/tickets/index.spec.js @@ -309,8 +309,8 @@ describe('Route', () => { jest.spyOn(controller.vnApp, 'showSuccess'); const ticketId = 11; - - $httpBackend.expect('PATCH', `Tickets/11`).respond({id: 11}); + const data = {routeId: 1}; + $httpBackend.expect('PATCH', `Routes/11/ticketToRoute`, data).respond(); controller.insert(ticketId); $httpBackend.flush(); diff --git a/modules/route/front/tickets/locale/es.yml b/modules/route/front/tickets/locale/es.yml index b9892a299..836dfe595 100644 --- a/modules/route/front/tickets/locale/es.yml +++ b/modules/route/front/tickets/locale/es.yml @@ -6,4 +6,5 @@ Delete ticket from route?: ¿Quitar el ticket de la ruta? Sort routes: Ordenar rutas Add ticket: Añadir ticket Tickets to add: Tickets a añadir -Ticket not found: No se ha encontrado el ticket \ No newline at end of file +Ticket not found: No se ha encontrado el ticket +The selected ticket is not suitable for this route: El ticket seleccionado no es apto para esta ruta \ No newline at end of file diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index 8722837af..79d672f38 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -14,6 +14,7 @@ describe('zone deletezone()', () => { let ticketIDs; let originalZoneIncluded; let originalTicketStates; + let originalRoutes; beforeAll(async done => { spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ @@ -27,6 +28,7 @@ describe('zone deletezone()', () => { zoneFk: zoneId } }); + originalRoutes = await app.models.Route.find({where: {zoneFk: zoneId}}); ticketIDs = originalTickets.map(ticket => ticket.id); originalZoneIncluded = await app.models.ZoneIncluded.find({where: {zoneFk: zoneId}}); originalTicketStates = await app.models.TicketState.find({where: { @@ -44,6 +46,9 @@ describe('zone deletezone()', () => { await originalZone.save(); await app.models.ZoneWarehouse.create(originalZoneWarehouses); + for (route of originalRoutes) + await route.updateAttributes({zoneFk: zoneId}); + for (ticket of originalTickets) await ticket.updateAttributes({zoneFk: zoneId}); From 4d91b26537c9b9747df777a1e27bf4c80f31dc9b Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 20 Nov 2020 13:35:01 +0100 Subject: [PATCH 06/20] checkinbox moved to worker --- back/model-config.json | 6 ------ back/models/worker-time-control-params.js | 3 --- .../back/methods/worker-time-control-mail}/checkInbox.js | 4 ++++ modules/worker/back/model-config.json | 6 ++++++ modules/worker/back/models/worker-time-control-mail.js | 3 +++ .../worker/back}/models/worker-time-control-mail.json | 0 .../worker/back}/models/worker-time-control-params.json | 0 7 files changed, 13 insertions(+), 9 deletions(-) delete mode 100644 back/models/worker-time-control-params.js rename {back/methods/imap-time-control => modules/worker/back/methods/worker-time-control-mail}/checkInbox.js (97%) create mode 100644 modules/worker/back/models/worker-time-control-mail.js rename {back => modules/worker/back}/models/worker-time-control-mail.json (100%) rename {back => modules/worker/back}/models/worker-time-control-params.json (100%) diff --git a/back/model-config.json b/back/model-config.json index da9feaa1f..f0032edab 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -76,12 +76,6 @@ }, "UserLog": { "dataSource": "vn" - }, - "WorkerTimeControlParams": { - "dataSource": "vn" - }, - "WorkerTimeControlMail": { - "dataSource": "vn" } } diff --git a/back/models/worker-time-control-params.js b/back/models/worker-time-control-params.js deleted file mode 100644 index c71d4c237..000000000 --- a/back/models/worker-time-control-params.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = Self => { - require('../methods/imap-time-control/checkInbox')(Self); -}; diff --git a/back/methods/imap-time-control/checkInbox.js b/modules/worker/back/methods/worker-time-control-mail/checkInbox.js similarity index 97% rename from back/methods/imap-time-control/checkInbox.js rename to modules/worker/back/methods/worker-time-control-mail/checkInbox.js index 9411b95e5..fa42f8135 100644 --- a/back/methods/imap-time-control/checkInbox.js +++ b/modules/worker/back/methods/worker-time-control-mail/checkInbox.js @@ -35,6 +35,10 @@ module.exports = Self => { imap.once('ready', function() { openInbox(function(err, box) { if (err) throw err; + const totalMessages = box.messages.total; + if (totalMessages == 0) + imap.end(); + let f = imap.seq.fetch('1:*', { bodies: ['HEADER.FIELDS (FROM SUBJECT)', '1'], struct: true diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index 7a498fce7..e35e39721 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -55,6 +55,12 @@ }, "WorkerLog": { "dataSource": "vn" + }, + "WorkerTimeControlParams": { + "dataSource": "vn" + }, + "WorkerTimeControlMail": { + "dataSource": "vn" } } diff --git a/modules/worker/back/models/worker-time-control-mail.js b/modules/worker/back/models/worker-time-control-mail.js new file mode 100644 index 000000000..36f3851b6 --- /dev/null +++ b/modules/worker/back/models/worker-time-control-mail.js @@ -0,0 +1,3 @@ +module.exports = Self => { + require('../methods/worker-time-control-mail/checkInbox')(Self); +}; diff --git a/back/models/worker-time-control-mail.json b/modules/worker/back/models/worker-time-control-mail.json similarity index 100% rename from back/models/worker-time-control-mail.json rename to modules/worker/back/models/worker-time-control-mail.json diff --git a/back/models/worker-time-control-params.json b/modules/worker/back/models/worker-time-control-params.json similarity index 100% rename from back/models/worker-time-control-params.json rename to modules/worker/back/models/worker-time-control-params.json From 7693a1c449a0a6a93599a56cda637ce9a81044db Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 20 Nov 2020 15:05:57 +0100 Subject: [PATCH 07/20] 2569 - Section changes --- back/model-config.json | 3 + back/models/continent.json | 27 +++ db/changes/10250-curfew/03-continent.sql | 20 +++ db/changes/10250-curfew/04-country.sql | 13 ++ db/config.ini | 1 + db/dump/fixtures.sql | 42 ++--- front/core/components/th/index.html | 4 +- front/core/components/th/index.js | 16 +- front/core/components/th/style.scss | 10 +- front/salix/components/descriptor/index.html | 2 +- loopback/server/connectors/vn-mysql.js | 26 +++ .../back/methods/item/specs/getDiary.spec.js | 6 +- .../methods/travel/extraCommunityFilter.js | 162 ++++++++---------- .../travel/specs/extraCommunityFilter.spec.js | 66 +++++++ modules/travel/front/descriptor/locale/es.yml | 4 +- .../extra-community-search-panel/index.html | 91 ++++++++++ .../extra-community-search-panel/index.js | 7 + .../travel/front/extra-community/index.html | 120 +++++++++---- modules/travel/front/extra-community/index.js | 85 ++++++++- .../front/extra-community/index.spec.js | 47 +++++ .../front/extra-community/locale/es.yml | 9 +- .../travel/front/extra-community/style.scss | 40 ++++- modules/travel/front/index.js | 1 + modules/travel/front/routes.json | 2 +- modules/travel/front/summary/locale/es.yml | 4 +- 25 files changed, 635 insertions(+), 173 deletions(-) create mode 100644 back/models/continent.json create mode 100644 db/changes/10250-curfew/03-continent.sql create mode 100644 db/changes/10250-curfew/04-country.sql create mode 100644 modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js create mode 100644 modules/travel/front/extra-community-search-panel/index.html create mode 100644 modules/travel/front/extra-community-search-panel/index.js create mode 100644 modules/travel/front/extra-community/index.spec.js diff --git a/back/model-config.json b/back/model-config.json index da9feaa1f..277f933e1 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -20,6 +20,9 @@ "Container": { "dataSource": "storage" }, + "Continent": { + "dataSource": "vn" + }, "Collection": { "dataSource": "vn" }, diff --git a/back/models/continent.json b/back/models/continent.json new file mode 100644 index 000000000..090bada09 --- /dev/null +++ b/back/models/continent.json @@ -0,0 +1,27 @@ +{ + "name": "Continent", + "base": "VnModel", + "options": { + "mysql": { + "table": "continent" + } + }, + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "code": { + "id": true, + "type": "string" + } + }, + "acls": [{ + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }] +} \ No newline at end of file diff --git a/db/changes/10250-curfew/03-continent.sql b/db/changes/10250-curfew/03-continent.sql new file mode 100644 index 000000000..279a73669 --- /dev/null +++ b/db/changes/10250-curfew/03-continent.sql @@ -0,0 +1,20 @@ +CREATE TABLE `vn`.continent +( + id TINYINT(4) AUTO_INCREMENT, + name VARCHAR(50) NOT NULL, + code VARCHAR(2) NOT NULL COLLATE utf8_general_ci, + CONSTRAINT continent_pk + PRIMARY KEY (id) +) + COMMENT 'World continents'; + +CREATE UNIQUE INDEX continent_name_uindex + ON `vn`.continent (name); + +INSERT IGNORE INTO `vn`.continent (`name`, `code`) + VALUES + ('Asia', 'AS'), + ('América', 'AM'), + ('África', 'AF'), + ('Europa', 'EU'), + ('Oceanía', 'OC'); \ No newline at end of file diff --git a/db/changes/10250-curfew/04-country.sql b/db/changes/10250-curfew/04-country.sql new file mode 100644 index 000000000..e7ffbc67f --- /dev/null +++ b/db/changes/10250-curfew/04-country.sql @@ -0,0 +1,13 @@ +ALTER TABLE `vn`.`country` + ADD COLUMN `continentFk` TINYINT(4) NULL AFTER `ibanLength`, + ADD INDEX `continent_id_fk_idx` (`continentFk` ASC); + +ALTER TABLE `vn`.`country` +ADD CONSTRAINT `continent_id_fk` + FOREIGN KEY (`continentFk`) + REFERENCES `vn`.`continent` (`id`) + ON DELETE NO ACTION + ON UPDATE CASCADE; + +UPDATE `vn`.`country` SET `continentFk` = '2' WHERE (`id` = '11'); +UPDATE `vn`.`country` SET `continentFk` = '2' WHERE (`id` = '13'); diff --git a/db/config.ini b/db/config.ini index 7800cadfd..2caf3c2b9 100644 --- a/db/config.ini +++ b/db/config.ini @@ -3,3 +3,4 @@ host = localhost port = 3306 user = root password = root +default-character-set=utf8 diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 2e00878d2..5503a0f7a 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -92,17 +92,17 @@ INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`, `userFk`,`bossF (109, 'HLK', 'Bruce' , 'Banner', 109, 19, 432978109), (110, 'JJJ', 'Jessica' , 'Jones' , 110, 19, 432978110); -INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`) +INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`) VALUES - (1, 'España', 1, 'ES', 1, 24), - (2, 'Italia', 1, 'IT', 1, 27), - (3, 'Alemania', 1, 'DE', 1, 22), - (4, 'Rumania', 1, 'RO', 1, 24), - (5, 'Holanda', 1, 'NL', 1, 18), - (8, 'Portugal', 1, 'PT', 1, 27), - (13,'Ecuador', 0, 'EC', 1, 24), - (19,'Francia', 1, 'FR', 1, 27), - (30,'Canarias', 1, 'IC', 1, 24); + (1, 'España', 1, 'ES', 1, 24, 4), + (2, 'Italia', 1, 'IT', 1, 27, 4), + (3, 'Alemania', 1, 'DE', 1, 22, 4), + (4, 'Rumania', 1, 'RO', 1, 24, 4), + (5, 'Holanda', 1, 'NL', 1, 18, 4), + (8, 'Portugal', 1, 'PT', 1, 27, 4), + (13,'Ecuador', 0, 'EC', 1, 24, 2), + (19,'Francia', 1, 'FR', 1, 27, 4), + (30,'Canarias', 1, 'IC', 1, 24, 4); INSERT INTO `hedera`.`language` (`code`, `name`, `orgName`, `isActive`) VALUES @@ -118,13 +118,13 @@ INSERT INTO `vn`.`warehouseAlias`(`id`, `name`) (1, 'Main Warehouse'), (2, 'Silla'); -INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`) +INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`, `countryFk`) VALUES - (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2), - (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2), - (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2), - (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2), - (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2); + (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2, 1), + (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2, 13), + (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2, 1), + (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2, 1), + (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2, 1); INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPreparedByPacking`, `code`, `pickingPlacement`, `path`) VALUES @@ -1250,11 +1250,11 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO (1, DATE_ADD(CURDATE(), INTERVAL -2 MONTH), DATE_ADD(CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1), (2, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150, 2000, 'second travel', 2, 2), (3, CURDATE(), CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1), - (4, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 50.00, 500, 'fourth travel', 0, 2), - (5, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 3, 2, 1, 50.00, 500, 'fifth travel', 1, 1), - (6, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 4, 2, 1, 50.00, 500, 'sixth travel', 1, 2), - (7, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 2, 1, 50.00, 500, 'seventh travel', 2, 1), - (8, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 2, 1, 50.00, 500, 'eight travel', 1, 2); + (4, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2), + (5, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1), + (6, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2), + (7, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1), + (8, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2); INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `ref`,`isInventory`, `isRaid`, `notes`, `evaNotes`) VALUES diff --git a/front/core/components/th/index.html b/front/core/components/th/index.html index 281c6866c..28d80695d 100644 --- a/front/core/components/th/index.html +++ b/front/core/components/th/index.html @@ -1 +1,3 @@ -
\ No newline at end of file +
+ +
\ No newline at end of file diff --git a/front/core/components/th/index.js b/front/core/components/th/index.js index 838431714..f815056f6 100644 --- a/front/core/components/th/index.js +++ b/front/core/components/th/index.js @@ -1,19 +1,10 @@ import ngModule from '../../module'; -import Component from '../../lib/component'; -import './style.scss'; - -export default class Th extends Component { - constructor($element, $, $transclude) { - super($element, $); +export default class Th { + constructor($element) { this._order = 'ASC'; this.column = $element[0]; $element.on('click', () => this.onToggleOrder()); - - $transclude($clone => { - const text = this.$t($clone.text()); // Not updating translations - $element.append(text ? text : $clone); - }); } /** @@ -81,9 +72,10 @@ export default class Th extends Component { } } -Th.$inject = ['$element', '$scope', '$transclude']; +Th.$inject = ['$element']; ngModule.vnComponent('vnTh', { + template: require('./index.html'), transclude: true, controller: Th, bindings: { diff --git a/front/core/components/th/style.scss b/front/core/components/th/style.scss index 6f575a02e..4982f8f89 100644 --- a/front/core/components/th/style.scss +++ b/front/core/components/th/style.scss @@ -6,18 +6,18 @@ vn-th { } vn-th[field] { - &.active:after { + &.active > :after { color: $color-font; opacity: 1; } - &.desc:after { + &.desc > :after { content: 'arrow_drop_down'; } - &.asc:after { + &.asc > :after { content: 'arrow_drop_up'; } - &:after { + & > :after { font-family: 'Material Icons'; content: 'arrow_drop_down'; position: absolute; @@ -27,7 +27,7 @@ vn-th[field] { opacity: 0 } - &:hover:after { + &:hover > :after { opacity: 1; } } \ No newline at end of file diff --git a/front/salix/components/descriptor/index.html b/front/salix/components/descriptor/index.html index 39c93006e..9b11c8b7d 100644 --- a/front/salix/components/descriptor/index.html +++ b/front/salix/components/descriptor/index.html @@ -17,7 +17,7 @@ ui-sref="{{::$ctrl.summaryState}}({id: $ctrl.descriptor.id})"> - diff --git a/loopback/server/connectors/vn-mysql.js b/loopback/server/connectors/vn-mysql.js index 5c625be85..4e1345cd6 100644 --- a/loopback/server/connectors/vn-mysql.js +++ b/loopback/server/connectors/vn-mysql.js @@ -84,6 +84,32 @@ class VnMySQL extends MySQL { return wrappedConnector.buildWhere(null, where); } + /** + * Constructs SQL GROUP BY clause from Loopback filter. + * + * @param {Object} group The group by definition + * @return {String} Built SQL group by + */ + makeGroupBy(group) { + if (!group) + return ''; + if (typeof group === 'string') + group = [group]; + + let clauses = []; + + for (let clause of group) { + let sqlGroup = ''; + let t = clause.split(/[\s,]+/); + + sqlGroup += this.escapeName(t[0]); + + clauses.push(sqlGroup); + } + + return `GROUP BY ${clauses.join(', ')}`; + } + /** * Constructs SQL order clause from Loopback filter. * diff --git a/modules/item/back/methods/item/specs/getDiary.spec.js b/modules/item/back/methods/item/specs/getDiary.spec.js index cf9ed9320..2903fc426 100644 --- a/modules/item/back/methods/item/specs/getDiary.spec.js +++ b/modules/item/back/methods/item/specs/getDiary.spec.js @@ -5,10 +5,8 @@ describe('item getBalance()', () => { let params = {where: {itemFk: 1, warehouseFk: 2}}; let result = await app.models.Item.getBalance(params); - expect(result.length).toBe(4); + expect(result.length).toBe(2); expect(result[0].balance).toBe(-100); - expect(result[1].balance).toBe(-110); - expect(result[2].balance).toBe(-110); - expect(result[3].balance).toBe(-210); + expect(result[1].balance).toBe(-200); }); }); diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js index 5b095328b..4a49b4401 100644 --- a/modules/travel/back/methods/travel/extraCommunityFilter.js +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -67,6 +67,10 @@ module.exports = Self => { arg: 'ref', type: 'string', description: 'The reference' + }, { + arg: 'continent', + type: 'string', + description: 'The continent code' } ], returns: { @@ -97,6 +101,8 @@ module.exports = Self => { return {'t.landed': {gte: value}}; case 'landedTo': return {'t.landed': {lte: value}}; + case 'continent': + return {'cnt.code': value}; case 'id': case 'agencyFk': case 'warehouseOutFk': @@ -107,17 +113,21 @@ module.exports = Self => { } }); - filter = mergeFilters(ctx.args.filter, {where}); + filter = mergeFilters(filter, {where}); let stmts = []; let stmt; + stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.travel'); stmt = new ParameterizedSQL( - `SELECT - tr.id, - tr.ref, - tr.shipped, - tr.landed, - tr.kg, + `CREATE TEMPORARY TABLE tmp.travel + (INDEX (id)) + ENGINE = MEMORY + SELECT + t.id, + t.ref, + t.shipped, + t.landed, + t.kg, am.id AS agencyModeFk, am.name AS agencyModeName, wo.id AS warehouseOutFk, @@ -126,102 +136,78 @@ module.exports = Self => { w.name AS warehouseInName, SUM(b.stickers) AS stickers, s.id AS supplierFk, - s.nickname AS supplierNickname - FROM travel tr - LEFT JOIN supplier s ON s.id = tr.cargoSupplierFk - LEFT JOIN entry e ON e.travelFk = tr.id + s.nickname AS cargoSupplierNickname, + CAST(SUM(i.density * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + CAST(SUM(167.5 * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as volumeKg + FROM travel t + LEFT JOIN supplier s ON s.id = t.cargoSupplierFk + LEFT JOIN entry e ON e.travelFk = t.id LEFT JOIN buy b ON b.entryFk = e.id - LEFT JOIN packaging p ON p.id = b.packageFk + LEFT JOIN packaging pkg ON pkg.id = b.packageFk LEFT JOIN item i ON i.id = b.itemFk LEFT JOIN itemType it ON it.id = i.typeFk - JOIN warehouse w ON w.id = tr.warehouseInFk - JOIN warehouse wo ON wo.id = tr.warehouseOutFk - JOIN agencyMode am ON am.id = tr.agencyFk` + JOIN warehouse w ON w.id = t.warehouseInFk + JOIN warehouse wo ON wo.id = t.warehouseOutFk + JOIN country c ON c.id = wo.countryFk + LEFT JOIN continent cnt ON cnt.id = c.continentFk + JOIN agencyMode am ON am.id = t.agencyFk` ); - /* cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - pc.Alias as Carguera */ + stmt.merge(conn.makeWhere(filter.where)); + stmt.merge(conn.makeGroupBy('t.id')); + stmt.merge(conn.makeLimit(filter)); + stmts.push(stmt); - // WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + const travelsIndex = stmts.push('SELECT * FROM tmp.travel') - 1; - stmt.merge('GROUP BY tr.id'); - // stmt.merge(conn.makeSuffix(filter)); - const itemsIndex = stmts.push(stmt) - 1; + stmt = new ParameterizedSQL( + `SELECT + e.id, + e.travelFk, + e.ref, + e.loadPriority, + s.name AS supplierName, + SUM(b.stickers) AS stickers, + e.evaNotes, + e.notes, + CAST(SUM(i.density * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + CAST(SUM(167.5 * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as volumeKg + FROM entry e + JOIN tmp.travel tr ON tr.id = e.travelFk + JOIN buy b ON b.entryFk = e.id + JOIN packaging pkg ON pkg.id = b.packageFk + JOIN item i ON i.id = b.itemFk + JOIN itemType it ON it.id = i.typeFk + JOIN supplier s ON s.id = e.supplierFk` + ); + + stmt.merge(conn.makeGroupBy('e.id')); + stmt.merge(conn.makeOrderBy(filter.order)); + const entriesIndex = stmts.push(stmt) - 1; + + stmts.push(`DROP TEMPORARY TABLE tmp.travel`); const sql = ParameterizedSQL.join(stmts, ';'); const result = await conn.executeStmt(sql); - return itemsIndex === 0 ? result : result[itemsIndex]; - /* - SET @vDateFrom:= TIMESTAMPADD(WEEK,-12,CURDATE()); + const travels = result[travelsIndex]; + const entries = result[entriesIndex]; - SELECT - 1 as IsTravel, - tr.id as travel, - NULL as Entrada, - ag.Agencia, - tr.ref, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(c.Etiquetas) as Etiquetas, - NULL as Notas_Eva, - kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - NULL as loadPriority, - NULL as Notas, - pc.Alias as Carguera - FROM travel tr - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - LEFT JOIN Entradas e ON e.travel_id = tr.id - LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - LEFT JOIN Articles a ON a.Id_Article = c.Id_Article - LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id - WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY tr.id + const travelsMap = new Map(); + for (let travel of travels) + travelsMap.set(travel.id, travel); - UNION ALL + for (let entry of entries) { + const travel = travelsMap.get(entry.travelFk); - SELECT - 0 as IsTravel, - e.travel_id as travel, - e.Id_Entrada, - p.Proveedor, - e.Referencia, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(Etiquetas) as Etiquetas, - e.Notas_Eva, - NULL as kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - loadPriority, - e.Notas, - pc.Alias as carguera + if (travel) { + if (!travel.entries) travel.entries = []; - FROM Entradas e - JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - JOIN Articles a ON a.Id_Article = c.Id_Article - JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor - JOIN travel tr ON tr.id = e.travel_id - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY e.Id_Entrada - ) sub - ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; */ + travel.entries.push(entry); + } + } + + return travels; }; }; diff --git a/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js new file mode 100644 index 000000000..7f42eb5f0 --- /dev/null +++ b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js @@ -0,0 +1,66 @@ +const app = require('vn-loopback/server/server'); + +describe('Travel extraCommunityFilter()', () => { + const filter = { + order: 'landed ASC, shipped ASC, travelFk, loadPriority, agencyModeFk, evaNotes', + }; + it('should return the travel matching "search"', async() => { + const ctx = { + args: { + search: 2 + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + const firstRow = result[0]; + const entries = firstRow.entries; + + expect(result.length).toEqual(1); + expect(firstRow.id).toEqual(2); + expect(entries.length).toEqual(2); + }); + + it('should return the travel matching "search" by ref', async() => { + const ctx = { + args: { + search: 'third' + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + const firstRow = result[0]; + + expect(result.length).toEqual(1); + expect(firstRow.id).toEqual(3); + }); + + it('should return the travel matching "warehouse out"', async() => { + const ctx = { + args: { + warehouseOutFk: 2 + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + + expect(result.length).toEqual(3); + }); + + it('should return the routes matching "landed from" and "landed to"', async() => { + const from = new Date(); + const to = new Date(); + from.setHours(0, 0, 0, 0); + to.setHours(23, 59, 59, 999); + to.setDate(to.getDate() + 14); + const ctx = { + args: { + landedFrom: from, + landedTo: to + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + + expect(result.length).toEqual(1); + }); +}); diff --git a/modules/travel/front/descriptor/locale/es.yml b/modules/travel/front/descriptor/locale/es.yml index 0ae18fdbf..3e6d62735 100644 --- a/modules/travel/front/descriptor/locale/es.yml +++ b/modules/travel/front/descriptor/locale/es.yml @@ -1,6 +1,6 @@ Reference: Referencia -Wh. In: Almacén entrada -Wh. Out: Almacén salida +Wh. In: Alm. entrada +Wh. Out: Alm. salida Shipped: F. envío Landed: F. entrega Total entries: Entradas totales \ No newline at end of file diff --git a/modules/travel/front/extra-community-search-panel/index.html b/modules/travel/front/extra-community-search-panel/index.html new file mode 100644 index 000000000..85a30907a --- /dev/null +++ b/modules/travel/front/extra-community-search-panel/index.html @@ -0,0 +1,91 @@ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/modules/travel/front/extra-community-search-panel/index.js b/modules/travel/front/extra-community-search-panel/index.js new file mode 100644 index 000000000..63d404b4b --- /dev/null +++ b/modules/travel/front/extra-community-search-panel/index.js @@ -0,0 +1,7 @@ +import ngModule from '../module'; +import SearchPanel from 'core/components/searchbar/search-panel'; + +ngModule.vnComponent('vnExtraCommunitySearchPanel', { + template: require('./index.html'), + controller: SearchPanel +}); diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index 1007f223a..e9f11ba0a 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,49 +1,111 @@ + data="travels" + order="landed ASC, shipped ASC, travelFk, loadPriority, agencyModeFk, evaNotes" + limit="20"> - - -
- - - - - {{travel.id}} - {{travel.supplierNickname}} - - - - - - +
+ + + + + diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js index 685958909..bd362f34f 100644 --- a/modules/travel/front/extra-community/index.js +++ b/modules/travel/front/extra-community/index.js @@ -2,7 +2,90 @@ import ngModule from '../module'; import Section from 'salix/components/section'; import './style.scss'; +class Controller extends Section { + constructor($element, $) { + super($element, $); + + const draggable = this.element.querySelector('.travel-list'); + draggable.addEventListener('dragstart', + event => this.dragStart(event)); + draggable.addEventListener('dragend', + event => this.dragEnd(event)); + + this.draggableElement = 'a[draggable]'; + this.droppableElement = 'vn-table[vn-droppable]'; + + const scopeDays = 14; + const landedFrom = new Date(); + landedFrom.setHours(0, 0, 0, 0); + + const landedTo = new Date(); + landedTo.setDate(landedTo.getDate() + scopeDays); + landedTo.setHours(23, 59, 59, 59); + + this.defaultFilter = { + landedFrom: landedFrom, + landedTo: landedTo, + continent: 'AM' + }; + } + + findDraggable($event) { + const target = $event.target; + const draggable = target.closest(this.draggableElement); + + return draggable; + } + + findDroppable($event) { + const target = $event.target; + const droppable = target.closest(this.droppableElement); + + return droppable; + } + + dragStart($event) { + const draggable = this.findDraggable($event); + draggable.classList.add('dragging'); + + const id = draggable.getAttribute('id'); + this.entryId = id; + this.entry = draggable; + } + + dragEnd($event) { + const draggable = this.findDraggable($event); + draggable.classList.remove('dragging'); + this.entryId = null; + this.entry = null; + } + + onDrop($event) { + const model = this.$.model; + const droppable = this.findDroppable($event); + const travelId = droppable.getAttribute('id'); + + const currentDroppable = this.entry.closest(this.droppableElement); + + if (currentDroppable == droppable) return; + + if (this.entryId && travelId) { + const path = `Entries/${this.entryId}`; + this.$http.patch(path, {travelFk: travelId}) + .then(() => model.refresh()) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } + } + + changeReference(travel) { + const params = {ref: travel.ref}; + const endpoint = `Travels/${travel.id}`; + this.$http.patch(endpoint, params) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } +} + ngModule.vnComponent('vnTravelExtraCommunity', { template: require('./index.html'), - controller: Section + controller: Controller }); diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js new file mode 100644 index 000000000..54f5e505f --- /dev/null +++ b/modules/travel/front/extra-community/index.spec.js @@ -0,0 +1,47 @@ +import './index.js'; + +describe('Travel Component vnTravelExtraCommunity', () => { + let controller; + let $httpBackend; + let travel = { + id: 1, + warehouseInFk: 1, + totalEntries: 3, + isDelivered: false + }; + + beforeEach(ngModule('travel')); + + beforeEach(inject(($componentController, _$httpBackend_) => { + $httpBackend = _$httpBackend_; + const $element = angular.element(''); + controller = $componentController('vnTravelExtraCommunity', {$element}); + controller.$.summary = {show: jasmine.createSpy('show')}; + })); + + describe('changeReference()', () => { + it('should make an HTTP query', () => { + jest.spyOn(controller.vnApp, 'showSuccess'); + + const travel = {id: 1, ref: 'New reference'}; + const expectedData = {ref: 'New reference'}; + $httpBackend.expect('PATCH', `Travels/${travel.id}`, expectedData).respond(200); + controller.changeReference(travel); + $httpBackend.flush(); + + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + }); + }); + + xdescribe('changeReference()', () => { + it('should make an HTTP query', () => { + let event = new MouseEvent('click', { + bubbles: true, + cancelable: true + }); + controller.preview(event, travel); + + expect(controller.$.summary.show).toHaveBeenCalledWith(); + }); + }); +}); diff --git a/modules/travel/front/extra-community/locale/es.yml b/modules/travel/front/extra-community/locale/es.yml index aa231d3be..e377a1011 100644 --- a/modules/travel/front/extra-community/locale/es.yml +++ b/modules/travel/front/extra-community/locale/es.yml @@ -1 +1,8 @@ -Family: Familia \ No newline at end of file +Family: Familia +Extra community: Extra comunitarios +Freighter: Transitario +Bl. KG: KG Bloq. +Phy. KG: KG físico +Vol. KG: KG Vol. +Search by travel id or reference: Buscar por id travel o referencia +Continent Out: Continente salida \ No newline at end of file diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss index 5a929908c..e7265781d 100644 --- a/modules/travel/front/extra-community/style.scss +++ b/modules/travel/front/extra-community/style.scss @@ -3,7 +3,6 @@ vn-travel-extra-community { .header { margin-bottom: 16px; - text-transform: uppercase; font-size: 1.25rem; line-height: 1; padding: 7px; @@ -11,15 +10,46 @@ vn-travel-extra-community { padding-bottom: 4px; font-weight: lighter; background-color: #fde6ca; + color: $color-font-light; border-bottom: 1px solid #f7931e; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } - vn-table vn-th.waste-family, - vn-table vn-td.waste-family { - max-width: 64px; - width: 64px + vn-td-editable text { + background-color: transparent; + padding: 0; + border: 0; + border-bottom: 1px dashed $color-active; + border-radius: 0; + color: $color-active + } + + vn-td-editable text:after { + font-family: 'Material Icons'; + content: 'edit'; + position: absolute; + margin-left: 5px; + color: $color-spacer + } + + vn-table[vn-droppable] { + border-radius: 0; + } + + a[draggable] { + transition: all .5s; + cursor: move; + outline: 0; + } + + a[draggable]:hover { + background-color: $color-hover-cd + } + + a[draggable].dragging { + background-color: $color-success-light; + font-weight:bold } } \ No newline at end of file diff --git a/modules/travel/front/index.js b/modules/travel/front/index.js index 410cbe219..60953e9a2 100644 --- a/modules/travel/front/index.js +++ b/modules/travel/front/index.js @@ -14,3 +14,4 @@ import './thermograph/create/'; import './thermograph/edit/'; import './descriptor-popover'; import './extra-community'; +import './extra-community-search-panel'; diff --git a/modules/travel/front/routes.json b/modules/travel/front/routes.json index 30792278e..b2e438c6d 100644 --- a/modules/travel/front/routes.json +++ b/modules/travel/front/routes.json @@ -93,7 +93,7 @@ "acl": ["buyer"] }, { - "url": "/extra-community", + "url": "/extra-community?q", "state": "travel.extraCommunity", "component": "vn-travel-extra-community", "description": "Extra community", diff --git a/modules/travel/front/summary/locale/es.yml b/modules/travel/front/summary/locale/es.yml index 8d2e7e78c..74ddfe03e 100644 --- a/modules/travel/front/summary/locale/es.yml +++ b/modules/travel/front/summary/locale/es.yml @@ -1,6 +1,6 @@ Reference: Referencia -Warehouse In: Almacen entrada -Warehouse Out: Almacen salida +Warehouse In: Almacén entrada +Warehouse Out: Almacén salida Shipped: F. envío Landed: F. entrega Total entries: Entradas totales From 03158f04ae5199fdf43bb46f0f79b4ad66cb20a9 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 08:12:33 +0100 Subject: [PATCH 08/20] Updated front unit tests --- .../back/methods/travel/specs/filter.spec.js | 2 +- modules/travel/front/extra-community/index.js | 4 +- .../front/extra-community/index.spec.js | 112 +++++++++++++++--- 3 files changed, 99 insertions(+), 19 deletions(-) diff --git a/modules/travel/back/methods/travel/specs/filter.spec.js b/modules/travel/back/methods/travel/specs/filter.spec.js index d04b0f093..ababe961e 100644 --- a/modules/travel/back/methods/travel/specs/filter.spec.js +++ b/modules/travel/back/methods/travel/specs/filter.spec.js @@ -38,7 +38,7 @@ describe('Travel filter()', () => { const result = await app.models.Travel.filter(ctx); - expect(result.length).toEqual(8); + expect(result.length).toEqual(3); }); it('should return the travel matching "total entries"', async() => { diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js index bd362f34f..221d6cb0d 100644 --- a/modules/travel/front/extra-community/index.js +++ b/modules/travel/front/extra-community/index.js @@ -48,7 +48,7 @@ class Controller extends Section { const draggable = this.findDraggable($event); draggable.classList.add('dragging'); - const id = draggable.getAttribute('id'); + const id = parseInt(draggable.id); this.entryId = id; this.entry = draggable; } @@ -63,7 +63,7 @@ class Controller extends Section { onDrop($event) { const model = this.$.model; const droppable = this.findDroppable($event); - const travelId = droppable.getAttribute('id'); + const travelId = parseInt(droppable.id); const currentDroppable = this.entry.closest(this.droppableElement); diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js index 54f5e505f..581002f18 100644 --- a/modules/travel/front/extra-community/index.spec.js +++ b/modules/travel/front/extra-community/index.spec.js @@ -3,20 +3,15 @@ import './index.js'; describe('Travel Component vnTravelExtraCommunity', () => { let controller; let $httpBackend; - let travel = { - id: 1, - warehouseInFk: 1, - totalEntries: 3, - isDelivered: false - }; beforeEach(ngModule('travel')); beforeEach(inject(($componentController, _$httpBackend_) => { $httpBackend = _$httpBackend_; - const $element = angular.element(''); + const $element = angular.element('
'); controller = $componentController('vnTravelExtraCommunity', {$element}); - controller.$.summary = {show: jasmine.createSpy('show')}; + controller.$.model = {}; + controller.$.model.refresh = jest.fn(); })); describe('changeReference()', () => { @@ -33,15 +28,100 @@ describe('Travel Component vnTravelExtraCommunity', () => { }); }); - xdescribe('changeReference()', () => { - it('should make an HTTP query', () => { - let event = new MouseEvent('click', { - bubbles: true, - cancelable: true - }); - controller.preview(event, travel); + describe('findDraggable()', () => { + it('should find the draggable element', () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); - expect(controller.$.summary.show).toHaveBeenCalledWith(); + const $event = new Event('dragstart'); + const target = document.createElement('div'); + draggable.appendChild(target); + target.dispatchEvent($event); + + const result = controller.findDraggable($event); + + expect(result).toEqual(draggable); + }); + }); + + describe('findDroppable()', () => { + it('should find the droppable element', () => { + const droppable = document.createElement('vn-table'); + droppable.setAttribute('vn-droppable', true); + + const $event = new Event('drop'); + const target = document.createElement('div'); + droppable.appendChild(target); + target.dispatchEvent($event); + + const result = controller.findDroppable($event); + + expect(result).toEqual(droppable); + }); + }); + + describe('dragStart()', () => { + it(`should add the class "dragging" to the draggable element + and then set the entryId controller property`, () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); + draggable.setAttribute('id', 3); + + jest.spyOn(controller, 'findDraggable').mockReturnValue(draggable); + + const $event = new Event('dragStart'); + controller.dragStart($event); + + const firstClass = draggable.classList[0]; + + expect(firstClass).toEqual('dragging'); + expect(controller.entryId).toEqual(3); + expect(controller.entry).toEqual(draggable); + }); + }); + + fdescribe('dragEnd()', () => { + it(`should remove the class "dragging" from the draggable element + and then set the entryId controller property to null`, () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); + draggable.setAttribute('id', 3); + draggable.classList.add('dragging'); + + jest.spyOn(controller, 'findDraggable').mockReturnValue(draggable); + + const $event = new Event('dragStart'); + controller.dragEnd($event); + + const classList = draggable.classList; + + expect(classList.length).toEqual(0); + expect(controller.entryId).toBeNull(); + expect(controller.entry).toBeNull(); + }); + }); + + describe('onDrop()', () => { + it('should make an HTTP patch query', () => { + const droppable = document.createElement('vn-table'); + droppable.setAttribute('vn-droppable', true); + droppable.setAttribute('id', 1); + + jest.spyOn(controller, 'findDroppable').mockReturnValue(droppable); + + const oldDroppable = document.createElement('vn-table'); + oldDroppable.setAttribute('vn-droppable', true); + const entry = document.createElement('div'); + oldDroppable.appendChild(entry); + + controller.entryId = 3; + controller.entry = entry; + + const $event = new Event('drop'); + const expectedData = {travelFk: 1}; + $httpBackend.expect('PATCH', `Entries/3`, expectedData).respond(200); + controller.onDrop($event); + $httpBackend.flush(); }); }); }); From 3acc943d85a68ff071401e2b6365d4dd48b6e862 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 11:10:16 +0100 Subject: [PATCH 09/20] =?UTF-8?q?2639=20-=20Permisos=20para=20a=C3=B1adir?= =?UTF-8?q?=20greuge=20con=20rol=20claimManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/client/front/greuge/index/index.html | 2 +- modules/client/front/routes.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/client/front/greuge/index/index.html b/modules/client/front/greuge/index/index.html index 463ac6303..73216a9b1 100644 --- a/modules/client/front/greuge/index/index.html +++ b/modules/client/front/greuge/index/index.html @@ -52,7 +52,7 @@ icon="add" ui-sref="client.card.greuge.create" vn-tooltip="New greuge" - vn-acl="salesAssistant" + vn-acl="salesAssistant,claimManager" vn-acl-action="remove" vn-bind="+" fixed-bottom-right> diff --git a/modules/client/front/routes.json b/modules/client/front/routes.json index a3ee4dd86..a2d559645 100644 --- a/modules/client/front/routes.json +++ b/modules/client/front/routes.json @@ -185,7 +185,7 @@ "state": "client.card.greuge.create", "component": "vn-client-greuge-create", "description": "New greuge", - "acl": ["salesAssistant"], + "acl": ["salesAssistant", "claimManager"], "params": { "client": "$ctrl.client" } From 37ac312bd5ac190c74c4d32165f2af6713da3810 Mon Sep 17 00:00:00 2001 From: bernat Date: Mon, 23 Nov 2020 13:05:24 +0100 Subject: [PATCH 10/20] pr changes --- modules/route/back/methods/route/specs/ticketToRoute.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/route/back/methods/route/specs/ticketToRoute.spec.js b/modules/route/back/methods/route/specs/ticketToRoute.spec.js index 86206ab42..83c1d5080 100644 --- a/modules/route/back/methods/route/specs/ticketToRoute.spec.js +++ b/modules/route/back/methods/route/specs/ticketToRoute.spec.js @@ -26,7 +26,7 @@ describe('route ticketToRoute()', () => { done(); }); - it('should add the ticket in a route', async() => { + it('should add the ticket to a route', async() => { originalTicket = await app.models.Ticket.findById(14); const ticketId = 14; From c654e14cfe04476038c849efea202a163c284e57 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 13:41:51 +0100 Subject: [PATCH 11/20] 2611 - Summary go to entity --- front/core/styles/font-family.scss | 2 +- .../styles/fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 94744 bytes .../styles/icons/MaterialIcons-Regular.woff2 | Bin 82512 -> 0 bytes front/salix/components/summary/index.js | 8 ++++ front/salix/components/summary/style.scss | 38 ++++++++++++++++ modules/account/front/locale/es.yml | 1 + modules/account/front/summary/index.html | 10 +++- modules/account/front/summary/index.js | 4 +- modules/claim/front/locale/es.yml | 1 + modules/claim/front/summary/index.html | 10 +++- modules/claim/front/summary/index.js | 4 +- modules/client/front/summary/index.html | 12 ++++- modules/client/front/summary/index.js | 4 +- modules/client/front/summary/locale/es.yml | 1 + modules/entry/front/summary/index.html | 10 +++- modules/entry/front/summary/index.js | 4 +- modules/entry/front/summary/locale/es.yml | 2 + modules/invoiceOut/front/summary/index.html | 10 +++- modules/invoiceOut/front/summary/index.js | 4 +- .../invoiceOut/front/summary/locale/es.yml | 3 +- modules/item/front/summary/index.html | 10 +++- modules/item/front/summary/index.js | 4 +- modules/item/front/summary/locale/es.yml | 3 +- modules/order/front/locale/es.yml | 3 +- modules/order/front/summary/index.html | 6 +++ modules/order/front/summary/index.js | 4 +- modules/order/front/summary/style.scss | 15 ------ modules/route/front/summary/index.html | 10 +++- modules/route/front/summary/index.js | 4 +- modules/route/front/summary/locale/es.yml | 3 +- modules/supplier/front/summary/index.html | 10 +++- modules/supplier/front/summary/index.js | 4 +- modules/supplier/front/summary/locale/es.yml | 3 +- modules/ticket/front/summary/index.html | 6 +-- modules/ticket/front/summary/index.js | 4 +- modules/ticket/front/summary/locale/es.yml | 2 +- modules/ticket/front/summary/style.scss | 43 ++---------------- modules/travel/front/summary/index.html | 10 +++- modules/travel/front/summary/index.js | 4 +- modules/travel/front/summary/locale/es.yml | 1 + modules/worker/front/locale/es.yml | 3 +- modules/worker/front/summary/index.html | 10 +++- modules/worker/front/summary/index.js | 4 +- modules/zone/front/index/index.html | 2 +- modules/zone/front/locale/es.yml | 3 +- modules/zone/front/summary/index.html | 10 +++- modules/zone/front/summary/index.js | 4 +- 47 files changed, 208 insertions(+), 105 deletions(-) create mode 100644 front/core/styles/fonts/MaterialIcons-Regular.woff2 delete mode 100644 front/core/styles/icons/MaterialIcons-Regular.woff2 diff --git a/front/core/styles/font-family.scss b/front/core/styles/font-family.scss index 24d9bbe43..91159c5b4 100644 --- a/front/core/styles/font-family.scss +++ b/front/core/styles/font-family.scss @@ -14,7 +14,7 @@ font-family: 'Material Icons'; font-style: normal; font-weight: 400; - src: url('./icons/MaterialIcons-Regular.woff2') format('woff2'); + src: url(./fonts/MaterialIcons-Regular.woff2) format('woff2'); } .material-icons { diff --git a/front/core/styles/fonts/MaterialIcons-Regular.woff2 b/front/core/styles/fonts/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9d1dfcc70d7c7c0fc78aec9d6a46fb4ca50564f9 GIT binary patch literal 94744 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 literal 0 HcmV?d00001 diff --git a/front/core/styles/icons/MaterialIcons-Regular.woff2 b/front/core/styles/icons/MaterialIcons-Regular.woff2 deleted file mode 100644 index 2b86ebfe6826a4ce14ed3682edb20d4d12a88978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82512 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 .vn-summary { + h5 > a[name="goToSummary"], + h5 * > vn-icon-button[icon="more_vert"] { + display: none + } +} + .summary { margin: 0 auto; max-width: 950px; & > h5 { + display: flex; + justify-content: space-between; + align-items: center; + align-content: center; padding: $spacing-sm; border: none; background: $color-main; @@ -15,6 +27,32 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + + & > a > vn-icon-button[icon="launch"] { + @extend %clickable; + color: $color-font-dark; + display: flex; + min-width: 45px; + height: 45px; + box-sizing: border-box; + align-items: center; + justify-content: center; + + & > vn-icon { + padding: 10px; + } + vn-icon { + font-size: 1.75rem; + } + } + + span { + flex: 1; + } + + vn-button { + flex: none + } } & > vn-horizontal { flex-wrap: wrap; diff --git a/modules/account/front/locale/es.yml b/modules/account/front/locale/es.yml index 02c58a8b0..18e2c06a1 100644 --- a/modules/account/front/locale/es.yml +++ b/modules/account/front/locale/es.yml @@ -8,3 +8,4 @@ Role: Rol Mail aliases: Alias de correo Account not enabled: Cuenta no habilitada Inherited roles: Roles heredados +Go to the user: Ir al usuario \ No newline at end of file diff --git a/modules/account/front/summary/index.html b/modules/account/front/summary/index.html index 7f390f17c..9c96a9703 100644 --- a/modules/account/front/summary/index.html +++ b/modules/account/front/summary/index.html @@ -1,5 +1,13 @@ -

{{summary.nickname}}
+
+ + + + {{summary.id}} - {{summary.nickname}} +

Basic data

diff --git a/modules/account/front/summary/index.js b/modules/account/front/summary/index.js index 31c2d7d69..21be84660 100644 --- a/modules/account/front/summary/index.js +++ b/modules/account/front/summary/index.js @@ -1,7 +1,7 @@ import ngModule from '../module'; -import Component from 'core/lib/component'; +import Summary from 'salix/components/summary'; -class Controller extends Component { +class Controller extends Summary { set user(value) { this._user = value; this.$.summary = null; diff --git a/modules/claim/front/locale/es.yml b/modules/claim/front/locale/es.yml index 5570896c1..dcbb2c484 100644 --- a/modules/claim/front/locale/es.yml +++ b/modules/claim/front/locale/es.yml @@ -16,3 +16,4 @@ Search claim by id or client name: Buscar reclamaciones por identificador o nomb Claim deleted!: Reclamación eliminada! claim: reclamación Photos: Fotos +Go to the claim: Ir a la reclamación diff --git a/modules/claim/front/summary/index.html b/modules/claim/front/summary/index.html index 399a6299b..f4e9c1471 100644 --- a/modules/claim/front/summary/index.html +++ b/modules/claim/front/summary/index.html @@ -3,7 +3,15 @@ data="photos"> -
{{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}}
+
+ + + + {{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}} +
-
{{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}}
+
+ + + + + {{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}} + +

Basic data

diff --git a/modules/client/front/summary/index.js b/modules/client/front/summary/index.js index 5737e2df4..cf5991247 100644 --- a/modules/client/front/summary/index.js +++ b/modules/client/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { $onChanges() { if (!this.client) return; diff --git a/modules/client/front/summary/locale/es.yml b/modules/client/front/summary/locale/es.yml index 24068e4ad..0a101f6ef 100644 --- a/modules/client/front/summary/locale/es.yml +++ b/modules/client/front/summary/locale/es.yml @@ -17,3 +17,4 @@ Verdnatura's maximum risk: Riesgo máximo asumido por Verdnatura Solunion's maximum risk: Riesgo máximo asumido por Solunion Invoices minus payments: Facturas menos recibos Deviated invoices minus payments: Facturas fuera de plazo menos recibos +Go to the client: Ir al cliente diff --git a/modules/entry/front/summary/index.html b/modules/entry/front/summary/index.html index d97adfdd7..6d5387459 100644 --- a/modules/entry/front/summary/index.html +++ b/modules/entry/front/summary/index.html @@ -1,5 +1,13 @@ -
Entry #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}}
+
+ + + + #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}} +
-
{{$ctrl.summary.invoiceOut.ref}} - {{$ctrl.summary.invoiceOut.client.socialName}}
+
+ + + + {{$ctrl.summary.invoiceOut.ref}} - {{$ctrl.summary.invoiceOut.client.socialName}} +
-
{{$ctrl.item.id}} - {{$ctrl.summary.item.name}}
+
+ + + + {{$ctrl.item.id}} - {{$ctrl.summary.item.name}} +
{ this.summary = response.data; diff --git a/modules/item/front/summary/locale/es.yml b/modules/item/front/summary/locale/es.yml index 3324e13d5..28e1e964b 100644 --- a/modules/item/front/summary/locale/es.yml +++ b/modules/item/front/summary/locale/es.yml @@ -1,3 +1,4 @@ Niche: Nichos Barcode: Códigos de barras -Other data: Otros datos \ No newline at end of file +Other data: Otros datos +Go to the item: Ir al artículo \ No newline at end of file diff --git a/modules/order/front/locale/es.yml b/modules/order/front/locale/es.yml index 5ecc1093f..62f711659 100644 --- a/modules/order/front/locale/es.yml +++ b/modules/order/front/locale/es.yml @@ -26,4 +26,5 @@ Confirm lines: Confirmar las lineas Confirm: Confirmar Real hour: Hora real T. Hour: Hora T. -Theoretical hour: Hora Teórica \ No newline at end of file +Theoretical hour: Hora Teórica +Go to the order: Ir al pedido \ No newline at end of file diff --git a/modules/order/front/summary/index.html b/modules/order/front/summary/index.html index e66d1024b..8f78ce460 100644 --- a/modules/order/front/summary/index.html +++ b/modules/order/front/summary/index.html @@ -1,5 +1,11 @@
+ + + Ticket #{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} ({{$ctrl.summary.client.salesPersonFk}}) diff --git a/modules/order/front/summary/index.js b/modules/order/front/summary/index.js index 2ee07872c..cc1df8f5d 100644 --- a/modules/order/front/summary/index.js +++ b/modules/order/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { setSummary() { this.$http.get(`Orders/${this.order.id}/summary`) .then(res => this.summary = res.data); diff --git a/modules/order/front/summary/style.scss b/modules/order/front/summary/style.scss index 63de20fe9..a2537c58f 100644 --- a/modules/order/front/summary/style.scss +++ b/modules/order/front/summary/style.scss @@ -3,21 +3,6 @@ vn-order-summary .summary{ max-width: $width-lg; - h5 { - display: flex; - justify-content: space-between; - align-items: center; - align-content: center; - - - span { - flex: 1; - } - - vn-button { - flex: none - } - } & > vn-horizontal > vn-one { min-width: 160px; diff --git a/modules/route/front/summary/index.html b/modules/route/front/summary/index.html index a6d482a2c..6dd01c8b0 100644 --- a/modules/route/front/summary/index.html +++ b/modules/route/front/summary/index.html @@ -1,5 +1,13 @@ -
{{$ctrl.summary.route.id}} - {{$ctrl.summary.route.description}}
+
+ + + + {{$ctrl.summary.route.id}} - {{$ctrl.summary.route.description}} +
-
{{::$ctrl.summary.name}} - {{::$ctrl.summary.id}}
+
+ + + + {{::$ctrl.summary.name}} - {{::$ctrl.summary.id}} +

Basic data

diff --git a/modules/supplier/front/summary/index.js b/modules/supplier/front/summary/index.js index 2fe289c49..099257848 100644 --- a/modules/supplier/front/summary/index.js +++ b/modules/supplier/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { $onChanges() { if (!this.supplier) return; diff --git a/modules/supplier/front/summary/locale/es.yml b/modules/supplier/front/summary/locale/es.yml index d39d107f8..6afaf857d 100644 --- a/modules/supplier/front/summary/locale/es.yml +++ b/modules/supplier/front/summary/locale/es.yml @@ -5,4 +5,5 @@ Search suppliers by id, name or alias: Busca proveedores por id, nombre o alias Is Farmer: Es agrícola Sage tax type: Tipo de impuesto Sage Sage transaction type: Tipo de transacción Sage -Sage withholding: Retencion Sage \ No newline at end of file +Sage withholding: Retencion Sage +Go to the supplier: Ir al proveedor \ No newline at end of file diff --git a/modules/ticket/front/summary/index.html b/modules/ticket/front/summary/index.html index 5ebfb7638..2faefadf2 100644 --- a/modules/ticket/front/summary/index.html +++ b/modules/ticket/front/summary/index.html @@ -1,10 +1,10 @@
- + name="goToSummary"> + Ticket #{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} diff --git a/modules/ticket/front/summary/index.js b/modules/ticket/front/summary/index.js index 4d8318e32..42e5fcb69 100644 --- a/modules/ticket/front/summary/index.js +++ b/modules/ticket/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { get ticket() { return this._ticket; } diff --git a/modules/ticket/front/summary/locale/es.yml b/modules/ticket/front/summary/locale/es.yml index b9848d2cf..afa06f206 100644 --- a/modules/ticket/front/summary/locale/es.yml +++ b/modules/ticket/front/summary/locale/es.yml @@ -2,4 +2,4 @@ Address phone: Tel. consignatario Address mobile: Móv. consignatario Client phone: Tel. cliente Client mobile: Móv. cliente -Go to ticket summary: Ir a la vista previa del ticket \ No newline at end of file +Go to the ticket: Ir al ticket \ No newline at end of file diff --git a/modules/ticket/front/summary/style.scss b/modules/ticket/front/summary/style.scss index d08bf5f54..613d36f55 100644 --- a/modules/ticket/front/summary/style.scss +++ b/modules/ticket/front/summary/style.scss @@ -2,50 +2,13 @@ @import "./variables"; vn-ticket-card vn-ticket-summary { - a[name="goToTicketSummary"], - vn-ticket-descriptor-menu { + /* vn-ticket-descriptor-menu { display: none - } + } */ } + vn-ticket-summary .summary { max-width: $width-lg; - - h5 { - display: flex; - justify-content: space-between; - align-items: center; - align-content: center; - - & > a > vn-icon-button[icon="open_in_full"] { - display: flex; - min-width: 45px; - height: 45px; - box-sizing: border-box; - align-items: center; - justify-content: center; - } - & > a > vn-icon-button[icon="open_in_full"] { - @extend %clickable; - color: $color-font-dark; - - & > vn-icon { - padding: 10px; - } - vn-icon { - font-size: 1.75rem; - } - } - - - span { - flex: 1; - } - - vn-button { - flex: none - } - } - vn-button { max-height: 27px; button { diff --git a/modules/travel/front/summary/index.html b/modules/travel/front/summary/index.html index 18f1af435..8815c09e2 100644 --- a/modules/travel/front/summary/index.html +++ b/modules/travel/front/summary/index.html @@ -1,5 +1,13 @@ -
{{$ctrl.travelData.id}} - {{$ctrl.travelData.ref}}
+
+ + + + {{$ctrl.travelData.id}} - {{$ctrl.travelData.ref}} +
-
{{worker.firstName}} {{worker.lastName}}
+
+ + + + {{worker.firstName}} {{worker.lastName}} +

Basic data

diff --git a/modules/worker/front/summary/index.js b/modules/worker/front/summary/index.js index adc248ee2..178df81a9 100644 --- a/modules/worker/front/summary/index.js +++ b/modules/worker/front/summary/index.js @@ -1,7 +1,7 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; -class Controller extends Section { +class Controller extends Summary { get worker() { return this._worker; } diff --git a/modules/zone/front/index/index.html b/modules/zone/front/index/index.html index 7f2540cb7..e75561cd0 100644 --- a/modules/zone/front/index/index.html +++ b/modules/zone/front/index/index.html @@ -20,7 +20,7 @@ + class="clickable vn-tr search-result"> {{::zone.id}} {{::zone.name}} {{::zone.agencyMode.name}} diff --git a/modules/zone/front/locale/es.yml b/modules/zone/front/locale/es.yml index 29f984287..c40dc5c20 100644 --- a/modules/zone/front/locale/es.yml +++ b/modules/zone/front/locale/es.yml @@ -30,4 +30,5 @@ Warehouse: Almacén Warehouses: Almacenes Week days: Días de la semana Zones: Zonas -zone: zona \ No newline at end of file +zone: zona +Go to the zone: Ir a la zona \ No newline at end of file diff --git a/modules/zone/front/summary/index.html b/modules/zone/front/summary/index.html index 20f74916e..9247087e6 100644 --- a/modules/zone/front/summary/index.html +++ b/modules/zone/front/summary/index.html @@ -1,5 +1,13 @@ -
#{{$ctrl.summary.id}} - {{$ctrl.summary.name}}
+
+ + + + #{{$ctrl.summary.id}} - {{$ctrl.summary.name}} +
Date: Mon, 23 Nov 2020 14:02:07 +0100 Subject: [PATCH 12/20] Removed commented code --- modules/ticket/front/summary/style.scss | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/ticket/front/summary/style.scss b/modules/ticket/front/summary/style.scss index 613d36f55..e92ff0d42 100644 --- a/modules/ticket/front/summary/style.scss +++ b/modules/ticket/front/summary/style.scss @@ -1,12 +1,6 @@ @import "./effects"; @import "./variables"; -vn-ticket-card vn-ticket-summary { - /* vn-ticket-descriptor-menu { - display: none - } */ -} - vn-ticket-summary .summary { max-width: $width-lg; vn-button { From 52eb39ccdaba85e669060c52b679510058fa294b Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 14:12:43 +0100 Subject: [PATCH 13/20] Removed autoload from crud-model --- modules/travel/front/extra-community/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index e9f11ba0a..84e6fcb85 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,4 +1,4 @@ - Date: Mon, 23 Nov 2020 18:27:32 +0100 Subject: [PATCH 14/20] e2e path for travel extra community + puppeteer v5 --- e2e/helpers/extensions.js | 42 +-- e2e/helpers/selectors.js | 4 + .../10-travel/04_extra_community.spec.js | 33 ++ package-lock.json | 304 ++++++++++++------ package.json | 2 +- 5 files changed, 256 insertions(+), 129 deletions(-) create mode 100644 e2e/paths/10-travel/04_extra_community.spec.js diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index b8a791191..9ff9b7d53 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -155,7 +155,7 @@ let actions = { document.querySelector(selector).scrollIntoViewIfNeeded(); }, selector); await this.waitToClick(selector); - await this.wait('vn-left-menu .expanded'); + await this.waitForSelector('vn-left-menu .expanded'); } await this.evaluate(state => { @@ -175,7 +175,7 @@ let actions = { forceReloadSection: async function(sectionRoute) { await this.waitToClick('vn-icon[icon="desktop_windows"]'); await this.waitToClick('button[response="accept"]'); - await this.wait('vn-card.summary'); + await this.waitForSelector('vn-card.summary'); await this.waitToClick(`vn-left-menu li > a[ui-sref="${sectionRoute}"]`); }, @@ -190,7 +190,7 @@ let actions = { accessToSearchResult: async function(searchValue) { await this.doSearch(searchValue); - await this.waitFor('.vn-descriptor'); + await this.waitForSelector('.vn-descriptor'); }, getProperty: async function(selector, property) { @@ -272,7 +272,7 @@ let actions = { }, focusElement: async function(selector) { - await this.wait(selector); + await this.waitForSelector(selector); return await this.evaluate(selector => { let element = document.querySelector(selector); element.focus(); @@ -285,8 +285,8 @@ let actions = { }, waitImgLoad: async function(selector) { - await this.wait(selector); - return await this.wait(selector => { + await this.waitForSelector(selector); + return await this.waitForFunction(selector => { const imageReady = document.querySelector(selector).complete; return imageReady; }, {}, selector); @@ -305,16 +305,16 @@ let actions = { }, waitForClassNotPresent: async function(selector, className) { - await this.wait(selector); - return await this.wait((selector, className) => { + await this.waitForSelector(selector); + return await this.waitForFunction((selector, className) => { if (!document.querySelector(selector).classList.contains(className)) return true; }, {}, selector, className); }, waitForClassPresent: async function(selector, className) { - await this.wait(selector); - return await this.wait((elementSelector, targetClass) => { + await this.waitForSelector(selector); + return await this.waitForFunction((elementSelector, targetClass) => { if (document.querySelector(elementSelector).classList.contains(targetClass)) return true; }, {}, selector, className); @@ -387,7 +387,7 @@ let actions = { }, waitForEmptyInnerText: async function(selector) { - return await this.wait(selector => { + return await this.waitFunction(selector => { return document.querySelector(selector).innerText == ''; }, selector); }, @@ -395,7 +395,7 @@ let actions = { hideSnackbar: async function() { // Holds up for the snackbar to be visible for a small period of time. if (process.env.E2E_DEBUG) - await this.waitFor(300); + await this.waitForTimeout(300); await this.evaluate(() => { let hideButton = document @@ -403,7 +403,7 @@ let actions = { if (hideButton) return hideButton.click(); }); - await this.waitFor('vn-snackbar .shape.shown', {hidden: true}); + await this.waitForSelector('vn-snackbar .shape.shown', {hidden: true}); }, waitForSnackbar: async function() { @@ -438,7 +438,7 @@ let actions = { const localDate = (new Date(date.getTime() - timeZoneOffset)) .toISOString().substr(0, 10); - await this.wait(selector); + await this.waitForSelector(selector); await this.evaluate((selector, localDate) => { let input = document.querySelector(selector).$ctrl.input; input.value = localDate; @@ -447,7 +447,7 @@ let actions = { }, pickTime: async function(selector, time) { - await this.wait(selector); + await this.waitForSelector(selector); await this.evaluate((selector, time) => { let input = document.querySelector(selector).$ctrl.input; input.value = time; @@ -510,11 +510,11 @@ let actions = { .includes(searchValue.toLowerCase()); }, {}, builtSelector, searchValue); - await this.waitFor('.vn-drop-down', {hidden: true}); + await this.waitForSelector('.vn-drop-down', {hidden: true}); }, checkboxState: async function(selector) { - await this.wait(selector); + await this.waitForSelector(selector); return await this.evaluate(selector => { let checkbox = document.querySelector(selector); switch (checkbox.$ctrl.field) { @@ -537,7 +537,7 @@ let actions = { }, waitForStylePresent: async function(selector, property, value) { - return await this.wait((selector, property, value) => { + return await this.waitForFunction((selector, property, value) => { const element = document.querySelector(selector); return element.style[property] == value; }, {}, selector, property, value); @@ -548,8 +548,8 @@ let actions = { }, waitForWatcherData: async function(selector) { - await this.wait(selector); - await this.wait(selector => { + await this.waitForSelector(selector); + await this.waitForFunction(selector => { let watcher = document.querySelector(selector); let orgData = watcher.$ctrl.orgData; return !angular.equals({}, orgData) && orgData != null; @@ -596,7 +596,7 @@ let actions = { closePopup: async function() { await Promise.all([ this.keyboard.press('Escape'), - this.waitFor('.vn-popup', {hidden: true}), + this.waitForSelector('.vn-popup', {hidden: true}), ]); }, diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index d0d5be5d5..e698669ab 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -823,6 +823,10 @@ export default { anySearchResult: 'vn-travel-index vn-tbody > a', firstSearchResult: 'vn-travel-index vn-tbody > a:nth-child(1)' }, + travelExtraCommunity: { + firstTravelReference: 'vn-travel-extra-community > vn-data-viewer div > vn-tbody > vn-tr > vn-td-editable', + removeContinentFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(3) > vn-icon > i' + }, travelBasicDada: { reference: 'vn-travel-basic-data vn-textfield[ng-model="$ctrl.travel.ref"]', agency: 'vn-travel-basic-data vn-autocomplete[ng-model="$ctrl.travel.agencyModeFk"]', diff --git a/e2e/paths/10-travel/04_extra_community.spec.js b/e2e/paths/10-travel/04_extra_community.spec.js new file mode 100644 index 000000000..bc81c086c --- /dev/null +++ b/e2e/paths/10-travel/04_extra_community.spec.js @@ -0,0 +1,33 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Travel extra community path', () => { + let browser; + let page; + + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('buyer', 'travel'); + await page.accessToSection('travel.extraCommunity'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should edit the travel reference', async() => { + await page.waitToClick(selectors.travelExtraCommunity.removeContinentFilter); + await page.writeOnEditableTD(selectors.travelExtraCommunity.firstTravelReference, 'edited reference'); + }); + + it('should reload the index and confirm the reference was edited', async() => { + await page.accessToSection('travel.index'); + await page.accessToSection('travel.extraCommunity'); + await page.waitToClick(selectors.travelExtraCommunity.removeContinentFilter); + await page.waitForTextInElement(selectors.travelExtraCommunity.firstTravelReference, 'edited reference'); + const reference = await page.getProperty(selectors.travelExtraCommunity.firstTravelReference, 'innerText'); + + expect(reference).toContain('edited reference'); + }); +}); diff --git a/package-lock.json b/package-lock.json index 6e7a9a665..ff4135141 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5264,6 +5264,16 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -5883,7 +5893,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -6854,7 +6864,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -7175,7 +7185,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -7235,7 +7245,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -7366,7 +7376,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -7436,7 +7446,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -7574,7 +7584,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -8546,6 +8556,12 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "devtools-protocol": { + "version": "0.0.818844", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", + "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "dev": true + }, "diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", @@ -8710,7 +8726,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -9857,47 +9873,40 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "ms": "2.1.2" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "pend": "~1.2.0" + "pump": "^3.0.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -9981,6 +9990,15 @@ "bser": "^2.0.0" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "feature-policy": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", @@ -10003,7 +10021,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -11189,7 +11207,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -11226,7 +11244,7 @@ }, "globby": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -13346,7 +13364,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { @@ -13376,7 +13394,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -18776,7 +18794,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -19719,7 +19737,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -19744,7 +19762,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -20193,7 +20211,7 @@ }, "multipipe": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { @@ -21106,7 +21124,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -21122,7 +21140,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -21828,9 +21846,9 @@ } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "prr": { @@ -21914,70 +21932,68 @@ } }, "puppeteer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", - "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", + "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", "dev": true, "requires": { "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^3.0.0", - "mime": "^2.0.3", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "agent-base": "5", + "debug": "4" } }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } }, "ms": { "version": "2.1.2", @@ -21985,14 +22001,44 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } + }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "dev": true } } }, @@ -22306,7 +22352,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -22648,7 +22694,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -22862,7 +22908,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -23078,7 +23124,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -23323,7 +23369,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", @@ -23374,7 +23420,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -23658,7 +23704,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -24763,7 +24809,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -24960,7 +25006,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { "nopt": "~1.0.10" @@ -25042,7 +25088,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -25143,6 +25189,40 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + } + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -26731,7 +26811,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": { @@ -26908,6 +26988,16 @@ "dev": true } } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/package.json b/package.json index c59451466..1a301afb0 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "node-sass": "^4.14.1", "nodemon": "^1.19.4", "plugin-error": "^1.0.1", - "puppeteer": "^2.0.0", + "puppeteer": "^5.5.0", "raw-loader": "^1.0.0", "sass-loader": "^7.3.1", "style-loader": "^0.23.1", From 6b0f1544a443dcfe6b88eda3ea5c9b6827fab050 Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:28:39 +0100 Subject: [PATCH 15/20] wait and waitFor are now deprecated. Test refactor --- e2e/paths/01-login/01_login.spec.js | 4 +- e2e/paths/02-client/01_create_client.spec.js | 4 +- .../02-client/02_edit_basic_data.spec.js | 2 +- .../02-client/03_edit_fiscal_data.spec.js | 6 +-- e2e/paths/02-client/05_add_address.spec.js | 4 +- e2e/paths/02-client/08_add_notes.spec.js | 2 +- .../12_lock_of_verified_data.spec.js | 10 ++-- e2e/paths/02-client/14_balance.spec.js | 6 +-- e2e/paths/02-client/15_user_config.spec.js | 2 +- e2e/paths/02-client/16_web_payment.spec.js | 4 +- e2e/paths/02-client/18_contacts.spec.js | 2 +- e2e/paths/03-worker/05_calendar.spec.js | 54 +++++++++---------- e2e/paths/04-item/02_basic_data.spec.js | 2 +- e2e/paths/04-item/04_tags.spec.js | 2 +- e2e/paths/04-item/08_create_and_clone.spec.js | 2 +- e2e/paths/04-item/09_regularize.spec.js | 6 +-- e2e/paths/04-item/10_index.spec.js | 6 +-- e2e/paths/04-item/11_item_log.spec.js | 4 +- e2e/paths/04-item/12_descriptor.spec.js | 2 +- .../05-ticket/01-sale/02_edit_sale.spec.js | 28 +++++----- e2e/paths/05-ticket/05_tracking_state.spec.js | 4 +- .../05-ticket/06_basic_data_steps.spec.js | 4 +- e2e/paths/05-ticket/09_weekly.spec.js | 6 +-- e2e/paths/05-ticket/10_request.spec.js | 4 +- e2e/paths/05-ticket/12_descriptor.spec.js | 2 +- e2e/paths/05-ticket/13_services.spec.js | 4 +- e2e/paths/05-ticket/14_create_ticket.spec.js | 2 +- e2e/paths/06-claim/01_basic_data.spec.js | 2 +- e2e/paths/06-claim/03_detail.spec.js | 2 +- e2e/paths/06-claim/04_claim_action.spec.js | 2 +- e2e/paths/07-order/01_summary.spec.js | 2 +- e2e/paths/08-route/03_create.spec.js | 2 +- .../09-invoice-out/02_descriptor.spec.js | 10 ++-- .../10-travel/02_basic_data_and_log.spec.js | 2 +- e2e/paths/12-entry/03_latestBuys.spec.js | 2 +- 35 files changed, 101 insertions(+), 101 deletions(-) diff --git a/e2e/paths/01-login/01_login.spec.js b/e2e/paths/01-login/01_login.spec.js index 35bebcff1..7414856da 100644 --- a/e2e/paths/01-login/01_login.spec.js +++ b/e2e/paths/01-login/01_login.spec.js @@ -45,7 +45,7 @@ describe('Login path', async() => { describe('Successful login', async() => { it('should log in and go to home state', async() => { await page.doLogin('employee'); - await page.waitFor('vn-home'); + await page.waitForSelector('vn-home'); const state = await page.getState(); expect(state).toBe('home'); @@ -58,7 +58,7 @@ describe('Login path', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); await page.waitToClick(selectors.globalItems.logoutButton); - await page.waitFor('vn-login'); + await page.waitForSelector('vn-login'); const state = await page.getState(); expect(state).toBe('login'); diff --git a/e2e/paths/02-client/01_create_client.spec.js b/e2e/paths/02-client/01_create_client.spec.js index 8bdc75556..9029910a7 100644 --- a/e2e/paths/02-client/01_create_client.spec.js +++ b/e2e/paths/02-client/01_create_client.spec.js @@ -124,9 +124,9 @@ describe('Client create path', () => { it('should click on the Clients button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.clientsButton); - await page.wait(selectors.clientsIndex.createClientButton); + await page.waitForSelector(selectors.clientsIndex.createClientButton); await page.waitForState('client.index'); }); diff --git a/e2e/paths/02-client/02_edit_basic_data.spec.js b/e2e/paths/02-client/02_edit_basic_data.spec.js index 8cb39520f..6f331fb23 100644 --- a/e2e/paths/02-client/02_edit_basic_data.spec.js +++ b/e2e/paths/02-client/02_edit_basic_data.spec.js @@ -18,7 +18,7 @@ describe('Client Edit basicData path', () => { describe('as employee', () => { it('should not be able to change the salesPerson', async() => { - await page.wait(selectors.clientBasicData.name); + await page.waitForSelector(selectors.clientBasicData.name); const result = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, `${selectors.clientBasicData.salesPerson} input`); diff --git a/e2e/paths/02-client/03_edit_fiscal_data.spec.js b/e2e/paths/02-client/03_edit_fiscal_data.spec.js index a7bf49eb6..da04c813a 100644 --- a/e2e/paths/02-client/03_edit_fiscal_data.spec.js +++ b/e2e/paths/02-client/03_edit_fiscal_data.spec.js @@ -40,7 +40,7 @@ describe('Client Edit fiscalData path', () => { }); it('should not be able to edit the verified data checkbox', async() => { - await page.wait(selectors.clientFiscalData.verifiedDataCheckbox); + await page.waitForSelector(selectors.clientFiscalData.verifiedDataCheckbox); const result = await page.isDisabled(selectors.clientFiscalData.verifiedDataCheckbox); expect(result).toBeTruthy(); @@ -55,7 +55,7 @@ describe('Client Edit fiscalData path', () => { }); it(`should edit the fiscal data but fail as the fiscal id ain't valid`, async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'SMASH'); await page.clearInput(selectors.clientFiscalData.fiscalId); @@ -159,7 +159,7 @@ describe('Client Edit fiscalData path', () => { }); it('should propagate the Equalization tax changes', async() => { - await page.waitFor(1000); + await page.waitForTimeout(1000); await page.waitToClick(selectors.globalItems.acceptButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/02-client/05_add_address.spec.js b/e2e/paths/02-client/05_add_address.spec.js index f2a7050fe..90cbc15a5 100644 --- a/e2e/paths/02-client/05_add_address.spec.js +++ b/e2e/paths/02-client/05_add_address.spec.js @@ -17,7 +17,7 @@ describe('Client Add address path', () => { }); it(`should click on the add new address button to access to the new address form`, async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.clientAddresses.createAddress); await page.waitForState('client.card.address.create'); }); @@ -81,7 +81,7 @@ describe('Client Add address path', () => { }); it(`should confirm the new address exists and it's the default one`, async() => { - await page.waitFor(2000); // needs more than a single second to load the section + await page.waitForTimeout(2000); // needs more than a single second to load the section const result = await page.waitToGetProperty(selectors.clientAddresses.defaultAddress, 'innerText'); expect(result).toContain('320 Park Avenue New York'); diff --git a/e2e/paths/02-client/08_add_notes.spec.js b/e2e/paths/02-client/08_add_notes.spec.js index 82bc14d0b..d0c483a11 100644 --- a/e2e/paths/02-client/08_add_notes.spec.js +++ b/e2e/paths/02-client/08_add_notes.spec.js @@ -26,7 +26,7 @@ describe('Client Add notes path', () => { }); it(`should create a note`, async() => { - await page.waitFor(selectors.clientNotes.note); + await page.waitForSelector(selectors.clientNotes.note); await page.type(`${selectors.clientNotes.note} textarea`, 'Meeting with Black Widow 21st 9am'); await page.waitToClick(selectors.clientNotes.saveButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/02-client/12_lock_of_verified_data.spec.js b/e2e/paths/02-client/12_lock_of_verified_data.spec.js index 817ba7238..701531c76 100644 --- a/e2e/paths/02-client/12_lock_of_verified_data.spec.js +++ b/e2e/paths/02-client/12_lock_of_verified_data.spec.js @@ -18,15 +18,15 @@ describe('Client lock verified data path', () => { describe('as salesPerson', () => { it('should confirm verified data button is disabled for salesPerson', async() => { - await page.wait(200); - await page.wait(selectors.clientFiscalData.verifiedDataCheckbox); + await page.waitForTimeout(200); + await page.waitForSelector(selectors.clientFiscalData.verifiedDataCheckbox); const result = await page.isDisabled(selectors.clientFiscalData.verifiedDataCheckbox); expect(result).toBeTruthy(); }); it('should edit the social name', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'Captain America Civil War'); await page.waitToClick(selectors.clientFiscalData.saveButton); @@ -75,7 +75,7 @@ describe('Client lock verified data path', () => { }); it('should again edit the social name', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'Ant man and the Wasp'); await page.waitToClick(selectors.clientFiscalData.saveButton); @@ -161,7 +161,7 @@ describe('Client lock verified data path', () => { }); it('should confirm the form is enabled for salesPerson', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); const result = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, 'vn-textfield[ng-model="$ctrl.client.socialName"] > div'); diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index bd00af58e..b069a4cfb 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -113,9 +113,9 @@ describe('Client balance path', () => { it('should now click on the Clients button of the top bar menu', async() => { await page.login('employee'); await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.clientsButton); - await page.wait(selectors.clientsIndex.createClientButton); + await page.waitForSelector(selectors.clientsIndex.createClientButton); await page.waitForState('client.index'); }); @@ -125,6 +125,6 @@ describe('Client balance path', () => { }); it('should not be able to click the new payment button as it isnt present', async() => { - await page.waitFor(selectors.clientBalance.newPaymentButton, {hidden: true}); + await page.waitForSelector(selectors.clientBalance.newPaymentButton, {hidden: true}); }); }); diff --git a/e2e/paths/02-client/15_user_config.spec.js b/e2e/paths/02-client/15_user_config.spec.js index 28f2ef29e..0e18c07ad 100644 --- a/e2e/paths/02-client/15_user_config.spec.js +++ b/e2e/paths/02-client/15_user_config.spec.js @@ -52,7 +52,7 @@ describe('User config', () => { it('should open the user config form to check the settings', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); - await page.waitFor(1000); + await page.waitForTimeout(1000); let expectedLocalWarehouse = await page .expectPropertyValue(selectors.globalItems.userLocalWarehouse, 'value', ''); diff --git a/e2e/paths/02-client/16_web_payment.spec.js b/e2e/paths/02-client/16_web_payment.spec.js index 3a4f50e76..24d802e3e 100644 --- a/e2e/paths/02-client/16_web_payment.spec.js +++ b/e2e/paths/02-client/16_web_payment.spec.js @@ -18,7 +18,7 @@ describe('Client web Payment', () => { describe('as employee', () => { it('should not be able to confirm payments', async() => { - await page.waitFor(selectors.webPayment.confirmFirstPaymentButton, {hidden: true}); + await page.waitForSelector(selectors.webPayment.confirmFirstPaymentButton, {hidden: true}); }); }); @@ -31,7 +31,7 @@ describe('Client web Payment', () => { it('should be able to confirm payments', async() => { await page.waitToClick(selectors.webPayment.confirmFirstPaymentButton); - await page.waitFor(selectors.webPayment.firstPaymentConfirmed, {hidden: true}); + await page.waitForSelector(selectors.webPayment.firstPaymentConfirmed, {hidden: true}); }); }); }); diff --git a/e2e/paths/02-client/18_contacts.spec.js b/e2e/paths/02-client/18_contacts.spec.js index c6dd4e406..49d930435 100644 --- a/e2e/paths/02-client/18_contacts.spec.js +++ b/e2e/paths/02-client/18_contacts.spec.js @@ -28,7 +28,7 @@ describe('Client contacts', () => { }); it('should delete de contact', async() => { - await page.waitFor(3000); + await page.waitForTimeout(3000); await page.waitToClick(selectors.clientContacts.deleteFirstPhone); await page.waitToClick(selectors.clientContacts.saveButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/03-worker/05_calendar.spec.js b/e2e/paths/03-worker/05_calendar.spec.js index 7ebc3badb..e82006b3c 100644 --- a/e2e/paths/03-worker/05_calendar.spec.js +++ b/e2e/paths/03-worker/05_calendar.spec.js @@ -26,33 +26,33 @@ describe('Worker calendar path', () => { it('should set two days as holidays on the calendar and check the total holidays increased by 1.5', async() => { await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.absence); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.marchTwentyThird); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfHoliday); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.furlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayTwelfth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayThirteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfFurlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayEighth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); const result = await page.waitToGetProperty(selectors.workerCalendar.totalHolidaysUsed, 'innerText'); @@ -68,33 +68,33 @@ describe('Worker calendar path', () => { }); it('should undo what was done here', async() => { - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.absence); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.marchTwentyThird); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfHoliday); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.furlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayTwelfth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayThirteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfFurlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayEighth); }); @@ -113,9 +113,9 @@ describe('Worker calendar path', () => { }); it('should make a futile attempt to add holidays', async() => { - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); }); @@ -131,7 +131,7 @@ describe('Worker calendar path', () => { await page.autocompleteSearch(selectors.workerCalendar.year, lastYear); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); const result = await page.waitToGetProperty(selectors.workerCalendar.totalHolidaysUsed, 'innerText'); expect(result).toContain(' 0 '); diff --git a/e2e/paths/04-item/02_basic_data.spec.js b/e2e/paths/04-item/02_basic_data.spec.js index 6f664cf9b..a728ac717 100644 --- a/e2e/paths/04-item/02_basic_data.spec.js +++ b/e2e/paths/04-item/02_basic_data.spec.js @@ -46,7 +46,7 @@ describe('Item Edit basic data path', () => { await page.write(selectors.itemBasicData.newIntrastatId, '588420239'); await page.write(selectors.itemBasicData.newIntrastatDescription, 'Tropical Flowers'); await page.waitToClick(selectors.itemBasicData.acceptIntrastatButton); // this popover obscures the rest of the form for aprox 2 seconds - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers'); let newcode = await page.waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); diff --git a/e2e/paths/04-item/04_tags.spec.js b/e2e/paths/04-item/04_tags.spec.js index 39d49cd1e..9f2a8e295 100644 --- a/e2e/paths/04-item/04_tags.spec.js +++ b/e2e/paths/04-item/04_tags.spec.js @@ -31,7 +31,7 @@ describe('Item create tags path', () => { it(`should confirm the fourth row data is the expected one`, async() => { await page.reloadSection('item.card.tags'); - await page.wait('vn-item-tags'); + await page.waitForSelector('vn-item-tags'); let result = await page.waitToGetProperty(selectors.itemTags.fourthTag, 'value'); expect(result).toEqual('Ancho de la base'); diff --git a/e2e/paths/04-item/08_create_and_clone.spec.js b/e2e/paths/04-item/08_create_and_clone.spec.js index ac667d123..938f15e3f 100644 --- a/e2e/paths/04-item/08_create_and_clone.spec.js +++ b/e2e/paths/04-item/08_create_and_clone.spec.js @@ -77,7 +77,7 @@ describe('Item Create/Clone path', () => { xdescribe('clone', () => { it('should return to the items index by clicking the return to items button', async() => { await page.waitToClick(selectors.itemBasicData.goToItemIndexButton); - await page.wait(selectors.itemsIndex.createItemButton); + await page.waitForSelector(selectors.itemsIndex.createItemButton); await page.waitForState('item.index'); }); diff --git a/e2e/paths/04-item/09_regularize.spec.js b/e2e/paths/04-item/09_regularize.spec.js index 0bc2c3acf..97c45643f 100644 --- a/e2e/paths/04-item/09_regularize.spec.js +++ b/e2e/paths/04-item/09_regularize.spec.js @@ -56,7 +56,7 @@ describe('Item regularize path', () => { it('should click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await Promise.all([ page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), page.waitToClick(selectors.globalItems.ticketsButton) @@ -96,7 +96,7 @@ describe('Item regularize path', () => { it('should now click on the Items button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.itemsButton); await page.waitForState('item.index'); }); @@ -119,7 +119,7 @@ describe('Item regularize path', () => { it('should again click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await Promise.all([ page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), page.waitToClick(selectors.globalItems.ticketsButton) diff --git a/e2e/paths/04-item/10_index.spec.js b/e2e/paths/04-item/10_index.spec.js index fb4efb5c8..40c567cac 100644 --- a/e2e/paths/04-item/10_index.spec.js +++ b/e2e/paths/04-item/10_index.spec.js @@ -43,7 +43,7 @@ describe('Item index path', () => { await page.waitToClick(selectors.itemsIndex.firstSearchResult); await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); await page.waitToClick(selectors.globalItems.searchButton); - await page.wait(selectors.itemsIndex.searchResult); + await page.waitForSelector(selectors.itemsIndex.searchResult); await page.waitImgLoad(selectors.itemsIndex.firstItemImage); const imageVisible = await page.isVisible(selectors.itemsIndex.firstItemImageTd); @@ -55,7 +55,7 @@ describe('Item index path', () => { }); it('should mark all unchecked boxes to leave the index as it was', async() => { - await page.waitFor(500); // otherwise the snackbar doesnt appear some times. + await page.waitForTimeout(500); // otherwise the snackbar doesnt appear some times. await page.waitToClick(selectors.itemsIndex.fieldsToShowButton); await page.waitToClick(selectors.itemsIndex.idCheckbox); await page.waitToClick(selectors.itemsIndex.stemsCheckbox); @@ -77,7 +77,7 @@ describe('Item index path', () => { await page.waitToClick(selectors.itemsIndex.firstSearchResult); await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); await page.waitToClick(selectors.globalItems.searchButton); - await page.wait(selectors.itemsIndex.searchResult); + await page.waitForSelector(selectors.itemsIndex.searchResult); const idVisible = await page.isVisible(selectors.itemsIndex.firstItemId); expect(idVisible).toBeTruthy(); diff --git a/e2e/paths/04-item/11_item_log.spec.js b/e2e/paths/04-item/11_item_log.spec.js index c0a047051..2a885fe6f 100644 --- a/e2e/paths/04-item/11_item_log.spec.js +++ b/e2e/paths/04-item/11_item_log.spec.js @@ -39,7 +39,7 @@ describe('Item log path', () => { it('should return to the items index by clicking the return to items button', async() => { await page.waitToClick(selectors.itemBasicData.goToItemIndexButton); - await page.wait(selectors.itemsIndex.createItemButton); + await page.waitForSelector(selectors.itemsIndex.createItemButton); await page.waitForState('item.index'); }); @@ -49,7 +49,7 @@ describe('Item log path', () => { }); it(`should confirm the log is showing 5 entries`, async() => { - await page.wait(selectors.itemLog.anyLineCreated); + await page.waitForSelector(selectors.itemLog.anyLineCreated); const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated); expect(anyLineCreatedCount).toEqual(5); diff --git a/e2e/paths/04-item/12_descriptor.spec.js b/e2e/paths/04-item/12_descriptor.spec.js index 9e0de8479..7c6fa074c 100644 --- a/e2e/paths/04-item/12_descriptor.spec.js +++ b/e2e/paths/04-item/12_descriptor.spec.js @@ -17,7 +17,7 @@ describe('Item descriptor path', () => { }); it('should check the descriptor inactive icon is dark as the item is active', async() => { - await page.wait(selectors.itemDescriptor.inactiveIcon); + await page.waitForSelector(selectors.itemDescriptor.inactiveIcon); await page.waitForClassNotPresent(selectors.itemDescriptor.inactiveIcon, 'bright'); const darkIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index c3403b371..248f38927 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -24,7 +24,7 @@ describe('Ticket Edit sale path', () => { it('should navigate to the tickets index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -128,7 +128,7 @@ describe('Ticket Edit sale path', () => { it('should return to ticket sales section', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); @@ -143,9 +143,9 @@ describe('Ticket Edit sale path', () => { }); it('should remove 1 from the first sale quantity', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketSales.firstSaleQuantityCell); - await page.waitFor(selectors.ticketSales.firstSaleQuantity); + await page.waitForSelector(selectors.ticketSales.firstSaleQuantity); await page.type(selectors.ticketSales.firstSaleQuantity, '9\u000d'); const message = await page.waitForSnackbar(); @@ -154,7 +154,7 @@ describe('Ticket Edit sale path', () => { it('should update the price', async() => { await page.waitToClick(selectors.ticketSales.firstSalePrice); - await page.waitFor(selectors.ticketSales.firstSalePriceInput); + await page.waitForSelector(selectors.ticketSales.firstSalePriceInput); await page.type(selectors.ticketSales.firstSalePriceInput, '5\u000d'); const message = await page.waitForSnackbar(); @@ -175,7 +175,7 @@ describe('Ticket Edit sale path', () => { it('should update the discount', async() => { await page.waitToClick(selectors.ticketSales.firstSaleDiscount); - await page.waitFor(selectors.ticketSales.firstSaleDiscountInput); + await page.waitForSelector(selectors.ticketSales.firstSaleDiscountInput); await page.type(selectors.ticketSales.firstSaleDiscountInput, '50\u000d'); const message = await page.waitForSnackbar(); @@ -205,7 +205,7 @@ describe('Ticket Edit sale path', () => { it('should click on the Claims button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.claimsButton); await page.waitForState('claim.index'); }); @@ -217,7 +217,7 @@ describe('Ticket Edit sale path', () => { it('should click the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -225,16 +225,16 @@ describe('Ticket Edit sale path', () => { it('should search for a ticket then access to the sales section', async() => { await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); - await page.wait(2000); + await page.waitForTimeout(2000); }); it('should select the third sale and delete it', async() => { await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitToClick(selectors.ticketSales.deleteSaleButton); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitToClick(selectors.globalItems.acceptButton); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitForSpinnerLoad(); const message = await page.waitForSnackbar(); @@ -260,7 +260,7 @@ describe('Ticket Edit sale path', () => { }); it('should confirm the transfered line is the correct one', async() => { - await page.wait(selectors.ticketSales.secondSaleText); + await page.waitForSelector(selectors.ticketSales.secondSaleText); const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleText, 'innerText'); expect(result).toContain(`Melee weapon heavy shield`); @@ -279,7 +279,7 @@ describe('Ticket Edit sale path', () => { }); it(`should confirm the original ticket has still three lines`, async() => { - await page.wait(selectors.ticketSales.saleLine); + await page.waitForSelector(selectors.ticketSales.saleLine); const result = await page.countElement(selectors.ticketSales.saleLine); expect(result).toEqual(3); diff --git a/e2e/paths/05-ticket/05_tracking_state.spec.js b/e2e/paths/05-ticket/05_tracking_state.spec.js index 1db0144e5..9c8e6d492 100644 --- a/e2e/paths/05-ticket/05_tracking_state.spec.js +++ b/e2e/paths/05-ticket/05_tracking_state.spec.js @@ -48,13 +48,13 @@ describe('Ticket Create new tracking state path', () => { }); it('should now access to the create state view by clicking the create floating button', async() => { - await page.waitFor('.vn-popup', {hidden: true}); + await page.waitForSelector('.vn-popup', {hidden: true}); await page.waitToClick(selectors.ticketTracking.createStateButton); await page.waitForState('ticket.card.tracking.edit'); }); it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => { - await page.waitFor(1500); + await page.waitForTimeout(1500); await page.autocompleteSearch(selectors.createStateView.state, 'Encajado'); await page.waitToClick(selectors.createStateView.saveStateButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js index f6660ae39..fff6c1264 100644 --- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js +++ b/e2e/paths/05-ticket/06_basic_data_steps.spec.js @@ -34,7 +34,7 @@ describe('Ticket Edit basic data path', () => { it(`should confirm the zone autocomplete is enabled for the role productionBoss`, async() => { await page.waitForSpinnerLoad(); - await page.wait(selectors.ticketBasicData.zone); + await page.waitForSelector(selectors.ticketBasicData.zone); const disabled = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, `${selectors.ticketBasicData.zone} input`); @@ -51,7 +51,7 @@ describe('Ticket Edit basic data path', () => { it(`should edit the ticket agency then check there are no zones for it`, async() => { await page.autocompleteSearch(selectors.ticketBasicData.agency, 'Super-Man delivery'); - await page.waitFor(1000); + await page.waitForTimeout(1000); let emptyZone = await page .expectPropertyValue(selectors.ticketBasicData.zone, 'value', ''); diff --git a/e2e/paths/05-ticket/09_weekly.spec.js b/e2e/paths/05-ticket/09_weekly.spec.js index e1d54e7a4..2392de28f 100644 --- a/e2e/paths/05-ticket/09_weekly.spec.js +++ b/e2e/paths/05-ticket/09_weekly.spec.js @@ -38,7 +38,7 @@ describe('Ticket descriptor path', () => { it('should again click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -52,7 +52,7 @@ describe('Ticket descriptor path', () => { it('should click on the Tickets button of the top bar menu once more', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -73,7 +73,7 @@ describe('Ticket descriptor path', () => { it('should click on the Tickets button of the top bar menu once again', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); diff --git a/e2e/paths/05-ticket/10_request.spec.js b/e2e/paths/05-ticket/10_request.spec.js index 8d9dc6aaa..af73d7081 100644 --- a/e2e/paths/05-ticket/10_request.spec.js +++ b/e2e/paths/05-ticket/10_request.spec.js @@ -18,7 +18,7 @@ describe('Ticket purchase request path', () => { }); it('should add a new request', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketRequests.addRequestButton); await page.write(selectors.ticketRequests.descriptionInput, 'New stuff'); await page.write(selectors.ticketRequests.quantity, '9'); @@ -72,7 +72,7 @@ describe('Ticket purchase request path', () => { it('should check the request was deleted', async() => { await page.reloadSection('ticket.card.request.index'); - await page.wait(selectors.ticketRequests.addRequestButton); + await page.waitForSelector(selectors.ticketRequests.addRequestButton); await page.waitForSelector(selectors.ticketRequests.thirdDescription, {hidden: true}); }); }); diff --git a/e2e/paths/05-ticket/12_descriptor.spec.js b/e2e/paths/05-ticket/12_descriptor.spec.js index c1258f973..c426f7d7f 100644 --- a/e2e/paths/05-ticket/12_descriptor.spec.js +++ b/e2e/paths/05-ticket/12_descriptor.spec.js @@ -92,7 +92,7 @@ describe('Ticket descriptor path', () => { }); await page.waitToClick(selectors.ticketDescriptor.moreMenu); await page.waitToClick(selectors.ticketDescriptor.moreMenuAddStowaway); - await page.wait(selectors.ticketDescriptor.addStowawayDialogFirstTicket); + await page.waitForSelector(selectors.ticketDescriptor.addStowawayDialogFirstTicket); const isVisible = await page.isVisible(selectors.ticketDescriptor.addStowawayDialogFirstTicket); expect(isVisible).toBeTruthy(); diff --git a/e2e/paths/05-ticket/13_services.spec.js b/e2e/paths/05-ticket/13_services.spec.js index 9108f64e4..03e57b588 100644 --- a/e2e/paths/05-ticket/13_services.spec.js +++ b/e2e/paths/05-ticket/13_services.spec.js @@ -22,7 +22,7 @@ describe('Ticket services path', () => { it('should find the add descripton button disabled for this user role', async() => { await page.waitForClassPresent(selectors.ticketService.firstAddServiceTypeButton, 'disabled'); await page.waitToClick(selectors.ticketService.addServiceButton); - await page.wait(selectors.ticketService.firstAddServiceTypeButton); + await page.waitForSelector(selectors.ticketService.firstAddServiceTypeButton); const result = await page.isDisabled(selectors.ticketService.firstAddServiceTypeButton); expect(result).toBe(true); @@ -63,7 +63,7 @@ describe('Ticket services path', () => { it('should click on the add new service type to open the dialog', async() => { await page.waitToClick(selectors.ticketService.firstAddServiceTypeButton); - await page.wait('.vn-dialog.shown'); + await page.waitForSelector('.vn-dialog.shown'); const result = await page.isVisible(selectors.ticketService.newServiceTypeName); expect(result).toBeTruthy(); diff --git a/e2e/paths/05-ticket/14_create_ticket.spec.js b/e2e/paths/05-ticket/14_create_ticket.spec.js index 692354472..4e7d95493 100644 --- a/e2e/paths/05-ticket/14_create_ticket.spec.js +++ b/e2e/paths/05-ticket/14_create_ticket.spec.js @@ -42,7 +42,7 @@ describe('Ticket create path', () => { it('should again open the new ticket form', async() => { await page.waitToClick(selectors.globalItems.returnToModuleIndexButton); - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketsIndex.newTicketButton); await page.waitForState('ticket.create'); }); diff --git a/e2e/paths/06-claim/01_basic_data.spec.js b/e2e/paths/06-claim/01_basic_data.spec.js index efbfd0305..5dfd54c4e 100644 --- a/e2e/paths/06-claim/01_basic_data.spec.js +++ b/e2e/paths/06-claim/01_basic_data.spec.js @@ -45,7 +45,7 @@ describe('Claim edit basic data path', () => { it('should confirm the claim state was edited', async() => { await page.reloadSection('claim.card.basicData'); - await page.wait(selectors.claimBasicData.claimState); + await page.waitForSelector(selectors.claimBasicData.claimState); const result = await page.waitToGetProperty(selectors.claimBasicData.claimState, 'value'); expect(result).toEqual('Gestionado'); diff --git a/e2e/paths/06-claim/03_detail.spec.js b/e2e/paths/06-claim/03_detail.spec.js index 9649d1905..ddcfd9302 100644 --- a/e2e/paths/06-claim/03_detail.spec.js +++ b/e2e/paths/06-claim/03_detail.spec.js @@ -106,7 +106,7 @@ xdescribe('Claim detail', () => { it('should navigate back to claim.detail to confirm the claim contains now two items', async() => { await page.accessToSection('claim.card.detail'); - await page.wait(selectors.claimDetail.claimDetailLine); + await page.waitForSelector(selectors.claimDetail.claimDetailLine); const result = await page.countElement(selectors.claimDetail.claimDetailLine); expect(result).toEqual(2); diff --git a/e2e/paths/06-claim/04_claim_action.spec.js b/e2e/paths/06-claim/04_claim_action.spec.js index c22fe5704..b3fedc9c8 100644 --- a/e2e/paths/06-claim/04_claim_action.spec.js +++ b/e2e/paths/06-claim/04_claim_action.spec.js @@ -27,7 +27,7 @@ describe('Claim action path', () => { it('should import the second importable ticket', async() => { // the animation adding the header element for the claimed total // obscures somehow other elements for about 2 seconds - await page.waitFor(3000); + await page.waitForTimeout(3000); await page.waitToClick(selectors.claimAction.importTicketButton); await page.waitToClick(selectors.claimAction.secondImportableTicket); diff --git a/e2e/paths/07-order/01_summary.spec.js b/e2e/paths/07-order/01_summary.spec.js index f21015c52..1b4776826 100644 --- a/e2e/paths/07-order/01_summary.spec.js +++ b/e2e/paths/07-order/01_summary.spec.js @@ -8,7 +8,7 @@ describe('Order summary path', () => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('employee', 'order'); - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.accessToSearchResult('16'); }); diff --git a/e2e/paths/08-route/03_create.spec.js b/e2e/paths/08-route/03_create.spec.js index ad6fb3991..670f7e17b 100644 --- a/e2e/paths/08-route/03_create.spec.js +++ b/e2e/paths/08-route/03_create.spec.js @@ -17,7 +17,7 @@ describe('Route create path', () => { describe('as employee', () => { it('should click on the add new route button and open the creation form', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.routeIndex.addNewRouteButton); await page.waitForState('route.create'); }); diff --git a/e2e/paths/09-invoice-out/02_descriptor.spec.js b/e2e/paths/09-invoice-out/02_descriptor.spec.js index aff35ac33..8d403e083 100644 --- a/e2e/paths/09-invoice-out/02_descriptor.spec.js +++ b/e2e/paths/09-invoice-out/02_descriptor.spec.js @@ -26,9 +26,9 @@ describe('InvoiceOut descriptor path', () => { it('should navigate to the invoiceOut index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.invoiceOutButton); - await page.wait(selectors.invoiceOutIndex.topbarSearch); + await page.waitForSelector(selectors.invoiceOutIndex.topbarSearch); await page.waitForState('invoiceOut.index'); }); @@ -59,7 +59,7 @@ describe('InvoiceOut descriptor path', () => { it('should navigate to the ticket index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -73,7 +73,7 @@ describe('InvoiceOut descriptor path', () => { it('should now navigate to the invoiceOut index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.invoiceOutButton); await page.waitForState('invoiceOut.index'); }); @@ -126,7 +126,7 @@ describe('InvoiceOut descriptor path', () => { it(`should check the salesPerson role doens't see the book option in the more menu`, async() => { await page.waitToClick(selectors.invoiceOutDescriptor.moreMenu); - await page.wait(selectors.invoiceOutDescriptor.moreMenuShowInvoiceOutPdf); + await page.waitForSelector(selectors.invoiceOutDescriptor.moreMenuShowInvoiceOutPdf); await page.waitForSelector(selectors.invoiceOutDescriptor.moreMenuBookInvoiceOut, {hidden: true}); }); diff --git a/e2e/paths/10-travel/02_basic_data_and_log.spec.js b/e2e/paths/10-travel/02_basic_data_and_log.spec.js index f1253cdd7..9c81e6f63 100644 --- a/e2e/paths/10-travel/02_basic_data_and_log.spec.js +++ b/e2e/paths/10-travel/02_basic_data_and_log.spec.js @@ -43,7 +43,7 @@ describe('Travel basic data path', () => { it('should now edit the whole form then save', async() => { await page.clearInput(selectors.travelBasicDada.reference); await page.write(selectors.travelBasicDada.reference, 'new reference!'); - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.autocompleteSearch(selectors.travelBasicDada.agency, 'Entanglement'); await page.autocompleteSearch(selectors.travelBasicDada.outputWarehouse, 'Warehouse Three'); await page.autocompleteSearch(selectors.travelBasicDada.inputWarehouse, 'Warehouse Four'); diff --git a/e2e/paths/12-entry/03_latestBuys.spec.js b/e2e/paths/12-entry/03_latestBuys.spec.js index 33acdb318..8e9de8158 100644 --- a/e2e/paths/12-entry/03_latestBuys.spec.js +++ b/e2e/paths/12-entry/03_latestBuys.spec.js @@ -17,7 +17,7 @@ describe('Entry lastest buys path', () => { it('should access the latest buys seccion and search not seeing the edit buys button yet', async() => { await page.waitToClick(selectors.entryLatestBuys.latestBuysSectionButton); - await page.waitFor(250); + await page.waitForTimeout(250); await page.waitToClick(selectors.globalItems.searchButton); await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: false}); }); From 551af77fc36227c2c05de47c96971f3dbd296824 Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:35:57 +0100 Subject: [PATCH 16/20] extension refactor --- e2e/helpers/extensions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 9ff9b7d53..6aaee64af 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -267,6 +267,7 @@ let actions = { writeOnEditableTD: async function(selector, text) { let builtSelector = await this.selectorFormater(selector); await this.waitToClick(selector); + await this.waitForSelector(builtSelector, {visible: true}); await this.type(builtSelector, text); await this.keyboard.press('Enter'); }, From 1b4635957434c957fedb5ebb85417003a30e518b Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:42:11 +0100 Subject: [PATCH 17/20] removed focus on describe --- modules/travel/front/extra-community/index.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js index 581002f18..2f510f22f 100644 --- a/modules/travel/front/extra-community/index.spec.js +++ b/modules/travel/front/extra-community/index.spec.js @@ -80,7 +80,7 @@ describe('Travel Component vnTravelExtraCommunity', () => { }); }); - fdescribe('dragEnd()', () => { + describe('dragEnd()', () => { it(`should remove the class "dragging" from the draggable element and then set the entryId controller property to null`, () => { const draggable = document.createElement('a'); From 80bae4de0afdd3534441ab076e41e8f794daa886 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 08:22:54 +0100 Subject: [PATCH 18/20] 2607 - Changed preview icon --- e2e/helpers/extensions.js | 4 ++-- e2e/helpers/selectors.js | 4 ++-- front/salix/components/descriptor/index.html | 2 +- modules/account/front/alias/index/index.html | 2 +- modules/account/front/index/index.html | 2 +- modules/account/front/role/index/index.html | 2 +- modules/account/front/routes.json | 2 +- modules/claim/front/index/index.html | 2 +- modules/client/front/credit-insurance/index/index.html | 2 +- modules/client/front/index/index.html | 2 +- modules/invoiceOut/front/index/index.html | 2 +- modules/item/front/index/index.html | 2 +- modules/order/front/index/index.html | 2 +- modules/route/front/index/index.html | 2 +- modules/supplier/front/index/index.html | 2 +- modules/ticket/front/index/index.html | 2 +- modules/travel/front/index/index.html | 2 +- modules/worker/front/index/index.html | 2 +- modules/zone/front/delivery-days/index.html | 2 +- modules/zone/front/index/index.html | 2 +- package-lock.json | 2 +- 21 files changed, 23 insertions(+), 23 deletions(-) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index b8a791191..2a73bc7f3 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -168,12 +168,12 @@ let actions = { }, reloadSection: async function(state) { - await this.click('vn-icon[icon="desktop_windows"]'); + await this.click('vn-icon[icon="preview"]'); await this.accessToSection(state); }, forceReloadSection: async function(sectionRoute) { - await this.waitToClick('vn-icon[icon="desktop_windows"]'); + await this.waitToClick('vn-icon[icon="preview"]'); await this.waitToClick('button[response="accept"]'); await this.wait('vn-card.summary'); await this.waitToClick(`vn-left-menu li > a[ui-sref="${sectionRoute}"]`); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index d0d5be5d5..888200e05 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -211,7 +211,7 @@ export default { newClassificationStartingDate: 'vn-client-credit-insurance-create vn-date-picker[ng-model="$ctrl.creditClassification.started"]', newInsuranceStartingDate: 'vn-client-credit-insurance-insurance-create vn-date-picker[ng-model="$ctrl.insurance.created"]', endCurrentContract: 'vn-client-credit-insurance-index vn-icon-button[icon="lock"]', - firstContratViewCreditButton: 'vn-client-credit-insurance-index vn-card > vn-horizontal:nth-child(1) vn-icon-button[icon="desktop_windows"]', + firstContratViewCreditButton: 'vn-client-credit-insurance-index vn-card > vn-horizontal:nth-child(1) vn-icon-button[icon="preview"]', addNewCredit: 'vn-client-credit-insurance-insurance-index vn-float-button vn-icon[icon="add"]', saveNewContract: 'vn-client-credit-insurance-create vn-submit', saveNewInsuranceCredit: 'vn-client-credit-insurance-insurance-create button[type="submit"]', @@ -228,7 +228,7 @@ export default { createItemButton: `vn-float-button`, firstSearchResult: 'vn-item-index a:nth-child(1)', searchResult: 'vn-item-index a.vn-tr', - firstResultPreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="desktop_windows"]', + firstResultpreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', searchResultCloneButton: 'vn-item-index .buttons > [icon="icon-clone"]', acceptClonationAlertButton: '.vn-confirm.shown [response="accept"]', closeItemSummaryPreview: '.vn-popup.shown', diff --git a/front/salix/components/descriptor/index.html b/front/salix/components/descriptor/index.html index 39c93006e..f888432ed 100644 --- a/front/salix/components/descriptor/index.html +++ b/front/salix/components/descriptor/index.html @@ -15,7 +15,7 @@ - + + icon="preview"> diff --git a/modules/account/front/index/index.html b/modules/account/front/index/index.html index 3c967250d..09d376c02 100644 --- a/modules/account/front/index/index.html +++ b/modules/account/front/index/index.html @@ -26,7 +26,7 @@ + icon="preview"> diff --git a/modules/account/front/role/index/index.html b/modules/account/front/role/index/index.html index 92cca58d9..c58c395e4 100644 --- a/modules/account/front/role/index/index.html +++ b/modules/account/front/role/index/index.html @@ -21,7 +21,7 @@ + icon="preview"> diff --git a/modules/account/front/routes.json b/modules/account/front/routes.json index 1fecb1332..a13092db6 100644 --- a/modules/account/front/routes.json +++ b/modules/account/front/routes.json @@ -11,7 +11,7 @@ {"state": "account.alias", "icon": "email"}, {"state": "account.accounts", "icon": "accessibility"}, {"state": "account.ldap", "icon": "account_tree"}, - {"state": "account.samba", "icon": "desktop_windows"}, + {"state": "account.samba", "icon": "preview"}, {"state": "account.acl", "icon": "check"}, {"state": "account.connections", "icon": "share"} ], diff --git a/modules/claim/front/index/index.html b/modules/claim/front/index/index.html index 0a2624de0..1688cf7c0 100644 --- a/modules/claim/front/index/index.html +++ b/modules/claim/front/index/index.html @@ -46,7 +46,7 @@ + icon="preview"> diff --git a/modules/client/front/credit-insurance/index/index.html b/modules/client/front/credit-insurance/index/index.html index b3ebb070d..51e425414 100644 --- a/modules/client/front/credit-insurance/index/index.html +++ b/modules/client/front/credit-insurance/index/index.html @@ -42,7 +42,7 @@ - +
diff --git a/modules/client/front/index/index.html b/modules/client/front/index/index.html index abbbe60e5..8ea485a73 100644 --- a/modules/client/front/index/index.html +++ b/modules/client/front/index/index.html @@ -47,7 +47,7 @@ + icon="preview"> diff --git a/modules/invoiceOut/front/index/index.html b/modules/invoiceOut/front/index/index.html index b9049a2a2..2d78f89a6 100644 --- a/modules/invoiceOut/front/index/index.html +++ b/modules/invoiceOut/front/index/index.html @@ -49,7 +49,7 @@ + icon="preview"> diff --git a/modules/item/front/index/index.html b/modules/item/front/index/index.html index 01128ed74..0d4ae61f3 100644 --- a/modules/item/front/index/index.html +++ b/modules/item/front/index/index.html @@ -94,7 +94,7 @@ + icon="preview">
diff --git a/modules/order/front/index/index.html b/modules/order/front/index/index.html index 07667f58f..7ad34a501 100644 --- a/modules/order/front/index/index.html +++ b/modules/order/front/index/index.html @@ -58,7 +58,7 @@ diff --git a/modules/route/front/index/index.html b/modules/route/front/index/index.html index 479662944..66e30d839 100644 --- a/modules/route/front/index/index.html +++ b/modules/route/front/index/index.html @@ -50,7 +50,7 @@ + icon="preview"> diff --git a/modules/supplier/front/index/index.html b/modules/supplier/front/index/index.html index 5afd51066..87e822eea 100644 --- a/modules/supplier/front/index/index.html +++ b/modules/supplier/front/index/index.html @@ -47,7 +47,7 @@ + icon="preview"> diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html index 8872b76d7..fe9e98a15 100644 --- a/modules/ticket/front/index/index.html +++ b/modules/ticket/front/index/index.html @@ -133,7 +133,7 @@ + icon="preview"> diff --git a/modules/travel/front/index/index.html b/modules/travel/front/index/index.html index 96a6e3229..d85b62a4c 100644 --- a/modules/travel/front/index/index.html +++ b/modules/travel/front/index/index.html @@ -52,7 +52,7 @@ + icon="preview"> diff --git a/modules/worker/front/index/index.html b/modules/worker/front/index/index.html index c994e7a7b..98df416b4 100644 --- a/modules/worker/front/index/index.html +++ b/modules/worker/front/index/index.html @@ -35,7 +35,7 @@ + icon="preview"> diff --git a/modules/zone/front/delivery-days/index.html b/modules/zone/front/delivery-days/index.html index 5f83eb05e..61c73c9d6 100644 --- a/modules/zone/front/delivery-days/index.html +++ b/modules/zone/front/delivery-days/index.html @@ -90,7 +90,7 @@ + icon="preview"> diff --git a/modules/zone/front/index/index.html b/modules/zone/front/index/index.html index e75561cd0..89f2bfbf9 100644 --- a/modules/zone/front/index/index.html +++ b/modules/zone/front/index/index.html @@ -38,7 +38,7 @@ + icon="preview"> diff --git a/package-lock.json b/package-lock.json index 6e7a9a665..2fcd0e440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23078,7 +23078,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { From 55061bea07ccf666c478c4883a18e06d2d90cdd3 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 09:06:37 +0100 Subject: [PATCH 19/20] Fixed selector --- e2e/helpers/selectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 888200e05..2471cf200 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -228,7 +228,7 @@ export default { createItemButton: `vn-float-button`, firstSearchResult: 'vn-item-index a:nth-child(1)', searchResult: 'vn-item-index a.vn-tr', - firstResultpreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', + firstResultPreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', searchResultCloneButton: 'vn-item-index .buttons > [icon="icon-clone"]', acceptClonationAlertButton: '.vn-confirm.shown [response="accept"]', closeItemSummaryPreview: '.vn-popup.shown', From cb22112ed4bbc824a55183bc309102b7549dd5e5 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 10:52:30 +0100 Subject: [PATCH 20/20] package update --- package-lock.json | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff4135141..99e20a441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5893,7 +5893,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -6864,7 +6864,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -7185,7 +7185,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -7245,7 +7245,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -7376,7 +7376,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -7446,7 +7446,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -7584,7 +7584,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -8726,7 +8726,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -10021,7 +10021,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -11207,7 +11207,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -11244,7 +11244,7 @@ }, "globby": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -13364,7 +13364,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { @@ -13394,7 +13394,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -18794,7 +18794,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -19737,7 +19737,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -19762,7 +19762,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -20211,7 +20211,7 @@ }, "multipipe": { "version": "0.1.2", - "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { @@ -21124,7 +21124,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -21140,7 +21140,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -22352,7 +22352,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -22694,7 +22694,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -22908,7 +22908,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -23369,7 +23369,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -23420,7 +23420,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -23704,7 +23704,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -24809,7 +24809,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -25006,7 +25006,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", "dev": true, "requires": { "nopt": "~1.0.10" @@ -25088,7 +25088,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -26811,7 +26811,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": {