Merge branch 'dev' into 2517-clientBalanceCompensaciones
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Javi Gallego 2020-12-16 08:34:54 +01:00
commit 2bb9125eee
186 changed files with 4609 additions and 2681 deletions

2
Jenkinsfile vendored
View File

@ -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'
}
}
}

View File

@ -8,7 +8,7 @@ Salix is also the scientific name of a beautifull tree! :)
Required applications.
* Node.js = 12.17.0 LTS
* Node.js = 14.15.1 LTS
* Docker
You will need to install globally the following items.

View File

@ -20,6 +20,9 @@
"Container": {
"dataSource": "storage"
},
"Continent": {
"dataSource": "vn"
},
"Collection": {
"dataSource": "vn"
},
@ -76,12 +79,6 @@
},
"UserLog": {
"dataSource": "vn"
},
"WorkerTimeControlParams": {
"dataSource": "vn"
},
"WorkerTimeControlMail": {
"dataSource": "vn"
}
}

View File

@ -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"
}]
}

View File

@ -1,3 +0,0 @@
module.exports = Self => {
require('../methods/imap-time-control/checkInbox')(Self);
};

View File

@ -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');

View File

@ -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');

View File

@ -3,3 +3,4 @@ host = localhost
port = 3306
user = root
password = root
default-character-set=utf8

File diff suppressed because one or more lines are too long

View File

@ -92,17 +92,24 @@ 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`.`currency`(`id`, `code`, `name`, `ratio`)
VALUES
(1, 'EUR', 'Euro', 1),
(2, 'USD', 'Dollar USA', 1.4),
(3, 'GBP', 'Libra', 1),
(4, 'JPY', 'Yen Japones', 1);
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 +125,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
@ -150,13 +157,6 @@ INSERT INTO `vn`.`accountingType`(`id`, `description`, `receiptDescription`, `co
(5, 'Miscellaneous', '', NULL),
(7, 'Compensation', '', 'compensation');
INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`)
VALUES
(1, 'EUR', 'Euro', 1),
(2, 'USD', 'Dollar USA', 1.4),
(3, 'GBP', 'Libra', 1),
(4, 'JPY', 'Yen Japones', 1);
INSERT INTO `vn`.`bank`(`id`, `bank`, `account`, `cash`, `entityFk`, `isActive`, `currencyFk`)
VALUES
(1, 'Pay on receipt', '0000000000', 3, 0, 1, 1),
@ -1252,11 +1252,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

File diff suppressed because it is too large Load Diff

View File

@ -69,6 +69,8 @@ TABLES=(
imageCollection
tpvError
tpvResponse
imageCollectionSize
)
dump_tables ${TABLES[@]}

View File

@ -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 => {
@ -168,14 +168,14 @@ 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.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) {
@ -267,12 +267,13 @@ 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');
},
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 +286,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 +306,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 +388,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 +396,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 +404,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 +439,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 +448,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 +511,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 +538,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 +549,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 +597,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}),
]);
},

View File

@ -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',
@ -636,7 +636,7 @@ export default {
orderSummary: {
id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span',
alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span',
consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(3) span',
consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span',
subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)',
vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)',
total: 'vn-order-summary vn-one.taxes > p:nth-child(3)',
@ -663,7 +663,7 @@ export default {
client: 'vn-autocomplete[label="Client"]',
address: 'vn-autocomplete[label="Address"]',
agency: 'vn-autocomplete[label="Agency"]',
observation: 'vn-textarea[label="Observation"]',
observation: 'vn-textarea[label="Notes"]',
saveButton: `button[type=submit]`,
acceptButton: '.vn-confirm.shown button[response="accept"]'
},
@ -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"]',

View File

@ -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');

View File

@ -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');
});

View File

@ -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`);

View File

@ -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();

View File

@ -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');

View File

@ -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();

View File

@ -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');

View File

@ -114,9 +114,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');
});
@ -126,6 +126,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});
});
});

View File

@ -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', '');

View File

@ -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});
});
});
});

View File

@ -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();

View File

@ -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 ');

View File

@ -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');

View File

@ -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');

View File

@ -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');
});

View File

@ -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)

View File

@ -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();

View File

@ -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);

View File

@ -16,14 +16,6 @@ describe('Item descriptor path', () => {
await browser.close();
});
it('should check the descriptor inactive icon is dark as the item is active', async() => {
await page.wait(selectors.itemDescriptor.inactiveIcon);
await page.waitForClassNotPresent(selectors.itemDescriptor.inactiveIcon, 'bright');
const darkIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon);
expect(darkIcon).toBeTruthy();
});
it('should set the item to inactive', async() => {
await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
@ -32,12 +24,11 @@ describe('Item descriptor path', () => {
expect(message.text).toContain('Data saved!');
});
it('should reload the section and check the inactive icon is bright', async() => {
it('should reload the section and check the inactive icon is visible', async() => {
await page.reloadSection('item.card.basicData');
await page.waitForClassPresent(selectors.itemDescriptor.inactiveIcon, 'bright');
const brightIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon);
const visibleIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon);
expect(brightIcon).toBeTruthy();
expect(visibleIcon).toBeTruthy();
});
it('should set the item back to active', async() => {

View File

@ -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);
@ -397,6 +397,5 @@ describe('Ticket Edit sale path', () => {
it(`should check the ticket is deleted`, async() => {
await page.waitForSelector(selectors.ticketDescriptor.isDeletedIcon);
await page.waitForClassPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright');
});
});

View File

@ -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();

View File

@ -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', '');

View File

@ -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');
});

View File

@ -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});
});
});

View File

@ -56,7 +56,7 @@ describe('Ticket descriptor path', () => {
await page.write(selectors.ticketsIndex.topbarSearch, '18');
await page.waitToClick(selectors.globalItems.searchButton);
await page.waitForState('ticket.card.summary');
await page.waitForClassPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright');
await page.isVisible(selectors.ticketDescriptor.isDeletedIcon);
const result = await page.waitToGetProperty(selectors.ticketsIndex.searchResultDate, 'innerText');
expect(result).toContain(2000);
@ -73,10 +73,6 @@ describe('Ticket descriptor path', () => {
expect(message.text).toContain('Data saved!');
});
it('should make sure the ticketDeleted icon is no longer bright', async() => {
await page.waitForClassNotPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright');
});
});
describe('Add stowaway', () => {
@ -92,7 +88,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();

View File

@ -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();

View File

@ -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');
});

View File

@ -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');

View File

@ -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);

View File

@ -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);

View File

@ -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');
});

View File

@ -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');
});

View File

@ -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});
});

View File

@ -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');

View File

@ -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');
});
});

View File

@ -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});
});

View File

@ -6,4 +6,11 @@ vn-label-value > section {
color: $color-font-secondary;
font-size: 1.2rem
}
}
vn-label-value[no-ellipsize] > section,
vn-label-value.no-ellipsize > section {
text-overflow: '';
white-space: normal;
overflow: auto;
}

View File

@ -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,

View File

@ -54,7 +54,6 @@ export default class Th {
else
this.table.setOrder(this.field, this.order);
this.updateArrow();
this.table.applyOrder(this.field, this.order);

View File

@ -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;
}
}

View File

@ -50,7 +50,7 @@ export function directive($state, $window) {
link: function($scope, $element, $attrs) {
const data = $scope.$eval($attrs.vnAnchor);
$element.on('click', event => {
if (ctrlPressed)
if (ctrlPressed || data.target == '_blank')
openNewTab($state, $window, event, data);
else
changeState($state, event, data);

View File

@ -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 {

Binary file not shown.

View File

@ -22,10 +22,18 @@
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-invoiceIn:before {
content: "\e960";
color: #5f5f5f;
}
.icon-invoiceOut:before {
content: "\e961";
color: #5f5f5f;
}
.icon-supplier:before {
content: "\e936";
}
.icon-latestBuys:before {
.icon-latestBuy:before {
content: "\e95f";
}
.icon-zone:before {
@ -99,6 +107,7 @@
}
.icon-invoices:before {
content: "\e91c";
color: #5f5f5f;
}
.icon-pets:before {
content: "\e94e";
@ -295,9 +304,6 @@
.icon-stowaway:before {
content: "\e92c";
}
.icon-supplier:before {
content: "\e936";
}
.icon-tags:before {
content: "\e937";
}

View File

@ -35,7 +35,7 @@
<glyph unicode="&#xe919;" glyph-name="grid" d="M0 704h256v256h-256v-256zM384-64h256v256h-256v-256zM0-64h256v256h-256v-256zM0 320h256v256h-256v-256zM384 320h256v256h-256v-256zM768 960v-256h256v256h-256zM384 704h256v256h-256v-256zM768 320h256v256h-256v-256zM768-64h256v256h-256v-256z" />
<glyph unicode="&#xe91a;" glyph-name="history" d="M554.667 934.4c-260.267 0-469.333-209.067-469.333-469.333h-85.333l136.533-209.067 140.8 209.067h-85.333c0 200.533 162.133 362.667 362.667 362.667s362.667-162.133 362.667-362.667-162.133-362.667-362.667-362.667c-98.133 0-192 42.667-251.733 106.667l-72.533-72.533c85.333-85.333 200.533-136.533 332.8-136.533 260.267 0 465.067 209.067 465.067 465.067s-217.6 469.333-473.6 469.333zM503.467 674.133v-260.267l221.867-132.267 34.133 64-179.2 106.667v221.867h-76.8z" />
<glyph unicode="&#xe91b;" glyph-name="disabled" d="M98.133 174.933v17.067c0 76.8 81.067 128 179.2 162.133l-179.2-179.2zM247.467 42.667h678.4v149.333c0 110.933-183.467 179.2-328.533 200.533l-349.867-349.867zM686.933 763.733c-38.4 55.467-102.4 89.6-174.933 89.6-115.2 0-209.067-89.6-209.067-204.8 0-68.267 38.4-132.267 98.133-170.667l285.867 285.867zM0-4.267l59.733-59.733 964.267 964.267-59.733 59.733-964.267-964.267z" />
<glyph unicode="&#xe91c;" glyph-name="invoices" d="M345.6 174.933h-89.6v102.4h81.067c4.267 34.133 8.533 68.267 21.333 102.4h-102.4v102.4h162.133c34.133 42.667 72.533 76.8 119.467 102.4h-281.6v102.4h520.533v-55.467c4.267 0 12.8 0 17.067 0 42.667 0 85.333-4.267 128-17.067v243.2c0 55.467-46.933 102.4-102.4 102.4h-622.933c-55.467 0-102.4-46.933-102.4-102.4v-819.2c0-55.467 46.933-102.4 102.4-102.4h302.933c-81.067 55.467-136.533 140.8-153.6 238.933zM942.933 119.467l85.333-81.067c-25.6-34.133-59.733-59.733-102.4-76.8s-85.333-25.6-136.533-25.6c-46.933 0-93.867 8.533-132.267 25.6s-76.8 42.667-106.667 72.533c-29.867 29.867-51.2 68.267-64 110.933h-93.867v68.267h81.067c0 4.267 0 12.8 0 21.333s0 17.067 0 21.333h-81.067v68.267h93.867c12.8 42.667 34.133 76.8 64 110.933 29.867 29.867 64 55.467 106.667 72.533s85.333 25.6 132.267 25.6c51.2 0 93.867-8.533 136.533-25.6s76.8-42.667 102.4-76.8l-85.333-81.067c-38.4 46.933-89.6 68.267-145.067 68.267-38.4 0-68.267-8.533-98.133-25.6s-51.2-38.4-68.267-68.267h209.067v-68.267h-230.4c0-4.267 0-12.8 0-21.333s0-17.067 0-21.333h230.4v-68.267h-209.067c17.067-29.867 38.4-51.2 68.267-68.267s59.733-25.6 98.133-25.6c55.467 0 102.4 21.333 145.067 68.267z" />
<glyph unicode="&#xe91c;" glyph-name="invoices" d="M320 576h341.333c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-341.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM320 469.333h341.333c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-341.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM320 358.4h128c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-128c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM917.333 960h-682.667c-59.733 0-106.667-46.933-106.667-106.667v-682.667c0-12.8 8.533-21.333 21.333-21.333s21.333 8.533 21.333 21.333v682.667c0 34.133 29.867 64 64 64h597.333c-12.8-17.067-21.333-38.4-21.333-64v-810.667c0-34.133-29.867-64-64-64s-64 29.867-64 64v42.667c0 12.8-8.533 21.333-21.333 21.333h-640c-12.8 0-21.333-8.533-21.333-21.333v-42.667c0-59.733 46.933-106.667 106.667-106.667h640c59.733 0 106.667 46.933 106.667 106.667v810.667c0 34.133 29.867 64 64 64s64-29.867 64-64v-42.667h-64c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h85.333c12.8 0 21.333 8.533 21.333 21.333v64c0 59.733-46.933 106.667-106.667 106.667zM42.667 42.667v21.333h597.333v-21.333c0-25.6 8.533-46.933 21.333-64h-554.667c-34.133 0-64 29.867-64 64zM657.067 247.467c-12.8-8.533-25.6-12.8-42.667-12.8-12.8 0-25.6 4.267-38.4 12.8-8.533 4.267-12.8 12.8-21.333 21.333h64c4.267 0 8.533 4.267 12.8 4.267 0 0 4.267 4.267 4.267 12.8 0 4.267 0 8.533-4.267 12.8 0 0-4.267 4.267-12.8 4.267h-72.533c0 0 0 0 0 4.267 0 0 0 4.267 0 4.267h89.6c4.267 0 8.533 4.267 12.8 4.267 4.267 4.267 4.267 8.533 4.267 12.8s0 8.533-4.267 12.8c0 0-4.267 4.267-12.8 4.267h-76.8c4.267 8.533 12.8 12.8 17.067 21.333 12.8 8.533 21.333 12.8 34.133 12.8 8.533 0 17.067 0 21.333-4.267s12.8-4.267 17.067-8.533c4.267-4.267 12.8-4.267 17.067-4.267 0 0 4.267 4.267 4.267 4.267s4.267 4.267 4.267 4.267c0 4.267 4.267 4.267 4.267 8.533s0 8.533-4.267 12.8c-8.533 8.533-17.067 12.8-29.867 17.067-17.067-4.267-46.933-4.267-72.533-17.067-12.8-4.267-25.6-12.8-34.133-25.6-8.533-8.533-12.8-21.333-17.067-29.867h-17.067c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h8.533c0 0 0-4.267 0-4.267s0 0 0-4.267h-8.533c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h12.8c4.267-12.8 8.533-21.333 17.067-34.133s21.333-21.333 34.133-25.6c12.8-4.267 25.6-8.533 42.667-8.533 25.6 0 46.933 8.533 64 21.333 8.533 8.533 8.533 12.8 8.533 21.333 0 4.267 0 8.533-4.267 12.8-8.533 4.267-12.8 4.267-21.333 0z" />
<glyph unicode="&#xe91d;" glyph-name="languaje" d="M512 960c-281.6 0-512-230.4-512-512s230.4-512 512-512c281.6 0 512 230.4 512 512s-230.4 512-512 512zM866.133 652.8h-149.333c-17.067 64-38.4 123.733-72.533 183.467 93.867-34.133 174.933-98.133 221.867-183.467zM512 857.6c42.667-59.733 76.8-128 98.133-204.8h-196.267c21.333 72.533 55.467 140.8 98.133 204.8zM115.2 345.6c-8.533 34.133-12.8 68.267-12.8 102.4s4.267 68.267 12.8 102.4h174.933c-4.267-34.133-8.533-68.267-8.533-102.4s4.267-68.267 8.533-102.4h-174.933zM157.867 243.2h149.333c17.067-64 38.4-123.733 72.533-183.467-93.867 34.133-174.933 98.133-221.867 183.467zM307.2 652.8h-149.333c51.2 85.333 128 149.333 221.867 183.467-29.867-59.733-55.467-119.467-72.533-183.467zM512 38.4c-42.667 59.733-76.8 128-98.133 204.8h196.267c-21.333-72.533-55.467-140.8-98.133-204.8zM631.467 345.6h-238.933c-4.267 34.133-8.533 68.267-8.533 102.4s4.267 68.267 8.533 102.4h238.933c4.267-34.133 8.533-68.267 8.533-102.4s-4.267-68.267-8.533-102.4zM644.267 59.733c29.867 55.467 55.467 119.467 72.533 183.467h149.333c-46.933-85.333-128-149.333-221.867-183.467zM733.867 345.6c4.267 34.133 8.533 68.267 8.533 102.4s-4.267 68.267-8.533 102.4h174.933c8.533-34.133 12.8-68.267 12.8-102.4s-4.267-68.267-12.8-102.4h-174.933z" />
<glyph unicode="&#xe91e;" glyph-name="lines" d="M0 814.933h1024v-149.333h-1024v149.333zM0 524.8h1024v-149.333h-1024v149.333zM0 230.4h1024v-149.333h-1024v149.333z" />
<glyph unicode="&#xe91f;" glyph-name="logout" d="M405.333 243.2l81.067-81.067 281.6 285.867-285.867 285.867-76.8-81.067 145.067-149.333h-550.4v-115.2h550.4l-145.067-145.067zM908.8 960h-793.6c-64 0-115.2-51.2-115.2-115.2v-226.133h115.2v226.133h797.867v-797.867h-797.867v230.4h-115.2v-226.133c0-64 51.2-115.2 115.2-115.2h797.867c64 0 115.2 51.2 115.2 115.2v793.6c-4.267 64-55.467 115.2-119.467 115.2z" />
@ -61,7 +61,7 @@
<glyph unicode="&#xe933;" glyph-name="solclaim" d="M1024 917.333v-938.667h-938.667v68.267h234.667v51.2h38.4c8.533-4.267 17.067-4.267 29.867-4.267h298.667c42.667 0 76.8 34.133 76.8 76.8 0 0 0 0 0 0 29.867 12.8 46.933 38.4 46.933 72.533 0 0 0 0 0 0 29.867 12.8 46.933 38.4 46.933 72.533s-21.333 59.733-46.933 72.533c0 0 0 0 0 0 0 42.667-34.133 76.8-76.8 76.8h-106.667c21.333 21.333 29.867 55.467 17.067 89.6-12.8 25.6-38.4 42.667-68.267 42.667-12.8 0-21.333-4.267-34.133-8.533l-217.6-98.133v29.867h-238.933v396.8h362.667v-209.067h209.067v209.067h366.933zM0 89.6h281.6v51.2h89.6c4.267-4.267 12.8-4.267 17.067-4.267h298.667c21.333 0 34.133 12.8 34.133 34.133s-12.8 34.133-34.133 34.133h-136.533v12.8h183.467c21.333 0 34.133 12.8 34.133 29.867 0 21.333-12.8 29.867-34.133 29.867h-179.2v12.8h234.667c21.333 0 34.133 8.533 34.133 29.867s-12.8 29.867-34.133 29.867h-230.4v12.8h183.467c21.333 0 29.867 12.8 29.867 34.133s-12.8 34.133-34.133 34.133h-230.4l93.867 64c12.8 8.533 21.333 29.867 12.8 46.933s-29.867 25.6-51.2 17.067l-251.733-119.467c-4.267 0-4.267-4.267-8.533-4.267-4.267-4.267-8.533-8.533-12.8-12.8h-8.533v55.467h-281.6v-388.267z" />
<glyph unicode="&#xe934;" glyph-name="solunion" d="M759.467 870.4v-136.533h-601.6c0 0-128-341.333 106.667-341.333s469.333 0 469.333 0 34.133 0 34.133-34.133-8.533-98.133-8.533-98.133h-541.867c0 0-247.467 29.867-204.8 320 0 0 8.533 140.8 72.533 298.667 0 0 21.333-8.533 85.333-8.533h588.8zM853.333 25.6c64 0 85.333-8.533 85.333-8.533 64 153.6 72.533 298.667 72.533 298.667 42.667 290.133-204.8 320-204.8 320h-541.867c0 0-8.533-64-8.533-98.133s34.133-34.133 34.133-34.133 238.933 0 469.333 0 106.667-341.333 106.667-341.333h-601.6v-136.533h588.8z" />
<glyph unicode="&#xe935;" glyph-name="splur" d="M640 960l145.067-145.067-183.467-183.467 89.6-89.6 183.467 183.467 149.333-149.333v384h-384zM384 960h-384v-384l145.067 145.067 302.933-302.933v-482.133h128v537.6l-337.067 341.333 145.067 145.067z" />
<glyph unicode="&#xe936;" glyph-name="supplier" d="M608 755.2c0-113.108-90.259-204.8-201.6-204.8s-201.6 91.692-201.6 204.8c0 113.108 90.259 204.8 201.6 204.8s201.6-91.692 201.6-204.8zM534.4 342.4c-9.6 0-19.2 3.2-28.8 9.6-16 9.6-25.6 25.6-28.8 41.6l-12.8 54.4c-3.2 19.2 0 35.2 9.6 51.2-25.6 3.2-51.2 6.4-73.6 6.4-128-6.4-400-73.6-400-211.2v-144h582.4l-48 192zM832 192l-51.2-12.8-16 64-57.6-16 35.2-134.4c22.4-3.2 41.6-16 54.4-35.2l163.2 41.6-44.8 176-38.4-12.8-60.8-6.4 16-64zM758.4 256l51.2 12.8 60.8 16-38.4 153.6-38.4-6.4 16-54.4-41.6-9.6-16 54.4-89.6-22.4 38.4-156.8 57.6 12.8zM1014.4 108.8l-227.2-57.6c-12.8 19.2-35.2 35.2-60.8 38.4l-92.8 364.8c-3.2 16-19.2 22.4-35.2 19.2l-70.4-16 12.8-54.4 41.6 12.8 83.2-342.4c-19.2-16-25.6-35.2-25.6-57.6 0-41.6 35.2-76.8 76.8-76.8 38.4 0 70.4 25.6 73.6 60.8l227.2 57.6-3.2 51.2z" />
<glyph unicode="&#xe936;" glyph-name="supplier" d="M797.867 405.333l98.133 34.133 21.333-59.733-98.133-34.133-21.333 59.733zM1019.733 341.333c-4.267-8.533-8.533-12.8-17.067-17.067l-332.8-119.467c4.267-4.267 8.533-12.8 12.8-17.067l277.333 102.4 21.333-59.733-277.333-102.4c0-8.533 4.267-12.8 4.267-21.333 0-85.333-68.267-157.867-157.867-157.867-85.333 0-157.867 68.267-157.867 157.867 0 55.467 29.867 106.667 72.533 132.267l-217.6 610.133c-8.533 25.6-38.4 42.667-68.267 29.867l-157.867-55.467-21.333 59.733 157.867 59.733c59.733 17.067 123.733-12.8 149.333-72.533l221.867-614.4c8.533 0 12.8 0 21.333 4.267l-119.467 332.8c-4.267 17.067 4.267 34.133 17.067 38.4l136.533 51.2c0 0 0 0 0 0l115.2 42.667c0 0 0 0 0 0l136.533 51.2c8.533 4.267 17.067 4.267 25.6 0s12.8-8.533 17.067-17.067l145.067-396.8c0-4.267 0-12.8-4.267-21.333zM695.467 657.067l-59.733-21.333 8.533-21.333 59.733 21.333-8.533 21.333zM644.267 106.667c0 51.2-42.667 93.867-93.867 93.867s-93.867-42.667-93.867-93.867c0-51.2 42.667-93.867 93.867-93.867s93.867 38.4 93.867 93.867zM951.467 371.2l-119.467 332.8-76.8-29.867 17.067-51.2c4.267-8.533 4.267-17.067 0-25.6s-8.533-12.8-17.067-17.067l-115.2-42.667c-4.267 0-8.533 0-12.8 0-12.8 0-25.6 8.533-29.867 21.333l-17.067 51.2-76.8-29.867 119.467-332.8 328.533 123.733z" />
<glyph unicode="&#xe937;" glyph-name="tags" d="M729.6 960c-42.667 0-89.6 0-132.267 0-21.333 0-38.4-8.533-51.2-21.333-140.8-140.8-281.6-281.6-422.4-422.4-25.6-25.6-25.6-51.2 0-76.8 93.867-93.867 187.733-187.733 281.6-281.6 25.6-25.6 51.2-25.6 76.8 0 140.8 140.8 281.6 281.6 422.4 422.4 17.067 12.8 21.333 29.867 21.333 51.2 0 93.867 0 183.467 0 277.333 0 34.133-17.067 51.2-51.2 51.2-51.2 0-98.133 0-145.067 0zM682.667 763.733c0 25.6 17.067 46.933 42.667 46.933s46.933-21.333 46.933-46.933c0-25.6-21.333-46.933-46.933-46.933-21.333 0-42.667 21.333-42.667 46.933zM878.933 482.133c4.267-12.8 0-21.333-8.533-29.867-34.133-51.2-64-98.133-98.133-149.333-76.8-115.2-153.6-234.667-230.4-349.867-12.8-17.067-21.333-21.333-38.4-8.533-115.2 76.8-226.133 149.333-337.067 226.133-17.067 8.533-17.067 21.333-8.533 38.4 12.8 21.333 29.867 46.933 42.667 68.267 8.533 12.8 8.533 12.8 17.067 0 55.467-55.467 115.2-115.2 170.667-170.667 8.533-8.533 17.067-17.067 29.867-21.333 29.867-12.8 55.467-4.267 76.8 21.333 123.733 123.733 247.467 247.467 371.2 371.2 4.267 4.267 4.267 8.533 8.533 12.8 0-8.533 0-8.533 4.267-8.533z" />
<glyph unicode="&#xe938;" glyph-name="tax" d="M448 192c0 174.933 145.067 320 320 320 76.8 0 145.067-25.6 196.267-68.267v324.267c4.267 51.2-38.4 98.133-93.867 98.133h-204.8c-21.333 55.467-72.533 93.867-136.533 93.867s-115.2-38.4-136.533-98.133h-209.067c-55.467 0-98.133-42.667-98.133-93.867v-674.133c0-51.2 42.667-98.133 98.133-98.133h332.8c-42.667 55.467-68.267 123.733-68.267 196.267zM529.067 861.867c29.867 0 46.933-21.333 46.933-46.933 0-29.867-25.6-46.933-46.933-46.933-29.867 0-46.933 21.333-46.933 46.933-4.267 29.867 17.067 46.933 46.933 46.933zM708.267 247.467c-8.533 0-12.8 4.267-17.067 8.533s-8.533 8.533-8.533 17.067v17.067c0 8.533 0 12.8 4.267 17.067s8.533 8.533 17.067 8.533c8.533 0 12.8-4.267 17.067-8.533s4.267-12.8 4.267-17.067v-12.8c4.267-21.333-4.267-29.867-17.067-29.867zM870.4 132.267c4.267-4.267 4.267-12.8 4.267-17.067v-21.333c0-12.8-8.533-21.333-21.333-21.333-8.533 0-12.8 4.267-17.067 8.533s-8.533 12.8-8.533 17.067v17.067c0 8.533 4.267 12.8 8.533 17.067s8.533 8.533 17.067 8.533c8.533 0 12.8-4.267 17.067-8.533zM768 448c-140.8 0-256-115.2-256-256s115.2-256 256-256 256 115.2 256 256-115.2 256-256 256zM635.733 273.067v17.067c0 21.333 4.267 34.133 17.067 46.933s29.867 17.067 51.2 17.067c21.333 0 38.4-4.267 51.2-17.067s17.067-29.867 17.067-46.933v-17.067c0-21.333-4.267-34.133-17.067-46.933s-29.867-17.067-51.2-17.067c-21.333 0-38.4 4.267-51.2 17.067-8.533 12.8-17.067 29.867-17.067 46.933zM721.067 59.733l-34.133 17.067 153.6 243.2 34.133-17.067-153.6-243.2zM925.867 98.133c0-21.333-4.267-34.133-17.067-46.933s-29.867-17.067-51.2-17.067c-21.333 0-38.4 4.267-51.2 17.067s-21.333 25.6-21.333 46.933v17.067c0 21.333 4.267 34.133 17.067 46.933s29.867 17.067 51.2 17.067c21.333 0 38.4-4.267 51.2-17.067s17.067-29.867 17.067-46.933v-17.067z" />
<glyph unicode="&#xe939;" glyph-name="ticket" d="M200.533 311.467c12.8 38.4 25.6 76.8 38.4 115.2 8.533 25.6 17.067 55.467 29.867 81.067 29.867 81.067 55.467 166.4 85.333 247.467 21.333 55.467 38.4 110.933 59.733 166.4 4.267 12.8 8.533 21.333 12.8 34.133 0 4.267 4.267 4.267 8.533 4.267 59.733-12.8 115.2-21.333 174.933-34.133 81.067-17.067 157.867-34.133 238.933-46.933 55.467-12.8 110.933-21.333 170.667-34.133 4.267-4.267 4.267-4.267 4.267-12.8-29.867-89.6-59.733-179.2-89.6-264.533-21.333-64-42.667-128-64-187.733-25.6-68.267-46.933-140.8-76.8-209.067-17.067-51.2-38.4-98.133-59.733-145.067-12.8-25.6-25.6-51.2-46.933-68.267-17.067-17.067-34.133-21.333-59.733-12.8-59.733 17.067-93.867 59.733-106.667 119.467-4.267 25.6-8.533 51.2-8.533 76.8 0 12.8 0 25.6 0 38.4s-8.533 21.333-17.067 25.6c-76.8 29.867-153.6 64-234.667 93.867-25.6 0-42.667 4.267-59.733 12.8zM554.667 550.4c-17.067 0-29.867-4.267-29.867-17.067-4.267-12.8 4.267-25.6 17.067-29.867 59.733-21.333 123.733-42.667 183.467-59.733 12.8-4.267 25.6 0 29.867 8.533 8.533 17.067 4.267 29.867-12.8 38.4-46.933 17.067-98.133 34.133-145.067 46.933-17.067 4.267-34.133 8.533-42.667 12.8zM477.867 375.467c-4.267 0-8.533 0-12.8-4.267-8.533-4.267-12.8-12.8-12.8-21.333 0-12.8 8.533-21.333 21.333-25.6 59.733-21.333 119.467-38.4 183.467-59.733 17.067-4.267 29.867 0 34.133 12.8s-4.267 25.6-17.067 29.867c-42.667 12.8-85.333 29.867-132.267 42.667-25.6 12.8-46.933 21.333-64 25.6zM806.4 631.467c21.333 0 29.867 4.267 34.133 21.333 4.267 8.533-8.533 21.333-21.333 25.6-21.333 4.267-42.667 12.8-68.267 17.067-38.4 12.8-76.8 21.333-119.467 34.133-17.067 4.267-34.133-8.533-29.867-25.6 0-12.8 12.8-17.067 25.6-21.333 42.667-12.8 89.6-25.6 132.267-38.4 17.067-4.267 34.133-8.533 46.933-12.8zM516.267 746.667c0 12.8-12.8 25.6-25.6 25.6-17.067 0-25.6-8.533-25.6-21.333s12.8-25.6 29.867-25.6c12.8-4.267 21.333 4.267 21.333 21.333zM426.667 541.867c12.8 0 25.6 8.533 25.6 21.333s-12.8 25.6-25.6 25.6c-17.067 0-29.867-8.533-25.6-21.333-4.267-12.8 4.267-25.6 25.6-25.6zM354.133 422.4c-17.067 0-25.6-8.533-25.6-25.6s12.8-25.6 29.867-25.6c12.8 0 25.6 8.533 25.6 21.333-4.267 17.067-17.067 29.867-29.867 29.867zM4.267 341.333c25.6-12.8 55.467-21.333 81.067-34.133 59.733-25.6 119.467-46.933 174.933-72.533 51.2-21.333 102.4-42.667 157.867-64 8.533-4.267 17.067-8.533 25.6-12.8s12.8-8.533 12.8-17.067c0-42.667 4.267-89.6 21.333-128 8.533-17.067 17.067-38.4 25.6-55.467-12.8 4.267-29.867 8.533-42.667 17.067-46.933 17.067-93.867 38.4-145.067 55.467-42.667 17.067-85.333 38.4-128 55.467-29.867 12.8-59.733 25.6-89.6 38.4s-55.467 38.4-72.533 64c-21.333 42.667-25.6 85.333-25.6 132.267 0 4.267 4.267 12.8 4.267 21.333z" />
@ -103,6 +103,8 @@
<glyph unicode="&#xe95d;" glyph-name="zone" d="M243.2 448c-12.8 17.067-25.6 34.133-38.4 51.2-34.133 46.933-68.267 98.133-89.6 153.6-17.067 34.133-25.6 72.533-17.067 110.933 8.533 51.2 38.4 89.6 85.333 110.933 59.733 25.6 132.267 8.533 174.933-34.133 34.133-38.4 42.667-81.067 34.133-132.267-8.533-46.933-29.867-85.333-51.2-123.733-29.867-46.933-59.733-89.6-89.6-132.267-4.267 0-4.267 0-8.533-4.267zM247.467 823.467c-46.933 0-89.6-38.4-89.6-89.6 0-46.933 38.4-89.6 85.333-89.6s89.6 38.4 89.6 85.333c0 55.467-38.4 93.867-85.333 93.867zM490.667 379.733l-17.067 25.6 12.8 8.533-34.133 183.467c0 0 0 8.533-8.533 8.533l-42.667 4.267c0 0-68.267-110.933-157.867-217.6 4.267 4.267-93.867 110.933-132.267 187.733l-110.933-51.2c0 0-4.267 0-4.267-8.533l25.6-145.067 34.133-21.333-8.533-21.333-17.067 8.533 59.733-332.8 213.333 102.4 238.933-21.333-51.2 290.133zM149.333 285.867c-12.8 4.267-29.867 12.8-42.667 17.067 4.267 8.533 4.267 17.067 8.533 21.333 17.067 0 29.867-4.267 42.667-12.8-4.267-8.533-4.267-17.067-8.533-25.6zM256 268.8c-17.067 0-34.133 4.267-46.933 4.267 0 8.533 4.267 17.067 4.267 25.6 12.8 0 29.867-4.267 42.667-4.267 0-8.533 0-17.067 0-25.6zM315.733 277.333c-4.267 8.533-4.267 12.8-8.533 21.333 17.067 8.533 29.867 17.067 42.667 21.333 4.267-8.533 8.533-12.8 8.533-21.333-12.8-8.533-25.6-12.8-42.667-21.333zM405.333 328.533c-4.267 8.533-8.533 12.8-12.8 21.333 12.8 8.533 25.6 17.067 38.4 25.6 4.267-4.267 8.533-12.8 12.8-21.333-8.533-8.533-21.333-17.067-38.4-25.6zM972.8 460.8l-29.867 25.6 12.8 21.333 12.8-8.533-34.133 187.733c0 0 0 8.533-8.533 8.533l-226.133 17.067-209.067-93.867c0 0-8.533-4.267-4.267-12.8l29.867-170.667 21.333-12.8-17.067-17.067 55.467-307.2 213.333 102.4 234.667-21.333-51.2 281.6zM580.267 465.067c-4.267 4.267-8.533 12.8-12.8 17.067 12.8 12.8 21.333 21.333 29.867 34.133 4.267-4.267 12.8-12.8 17.067-17.067-12.8-8.533-25.6-21.333-34.133-34.133zM657.067 541.867c-4.267 4.267-8.533 12.8-12.8 21.333 12.8 8.533 25.6 17.067 38.4 25.6 8.533-8.533 12.8-17.067 12.8-21.333-12.8-8.533-25.6-17.067-38.4-25.6zM797.867 571.733c-12.8 4.267-25.6 4.267-42.667 4.267 0 8.533 0 17.067 0 25.6 17.067 0 34.133 0 51.2-4.267-4.267-8.533-4.267-17.067-8.533-25.6zM891.733 520.533c-12.8 8.533-25.6 17.067-38.4 25.6 4.267 8.533 8.533 12.8 12.8 21.333 12.8-8.533 25.6-17.067 38.4-25.6-4.267-8.533-8.533-12.8-12.8-21.333z" />
<glyph unicode="&#xe95e;" glyph-name="inventory" d="M273.067 226.133c4.267 0 8.533 4.267 8.533 8.533v85.333h98.133v-221.867h-217.6v221.867h98.133v-81.067c0-8.533 8.533-12.8 12.8-12.8zM512 226.133c4.267 0 8.533 4.267 8.533 8.533v85.333h98.133v-221.867h-217.6v221.867h98.133v-81.067c0-8.533 8.533-12.8 12.8-12.8zM750.933 226.133c4.267 0 8.533 4.267 8.533 8.533v85.333h98.133v-221.867h-217.6v221.867h98.133v-81.067c4.267-8.533 8.533-12.8 12.8-12.8zM644.267 780.8h98.133v-81.067c0-4.267 4.267-8.533 8.533-8.533s8.533 4.267 8.533 8.533v81.067h98.133v-221.867h-217.6v221.867h4.267zM401.067 780.8h98.133v-81.067c0-4.267 4.267-8.533 8.533-8.533s8.533 4.267 8.533 8.533v81.067h98.133v-221.867h-213.333v221.867zM162.133 780.8h98.133v-81.067c0-4.267 4.267-8.533 8.533-8.533s8.533 4.267 8.533 8.533v81.067h98.133v-221.867h-213.333v221.867zM153.6 537.6h780.8v-38.4h-844.8v38.4zM68.267-42.667h-42.667v981.333h42.667v-908.8zM89.6 38.4v38.4h844.8v-38.4zM998.4-42.667h-42.667v981.333h42.667z" />
<glyph unicode="&#xe95f;" glyph-name="latestBuy" d="M183.467 750.933h712.533v-38.4h-768v38.4zM89.6 64c8.533 0 12.8 0 21.333-4.267v900.267h-42.667v-900.267c8.533 4.267 12.8 4.267 21.333 4.267zM955.733 512v448h-42.667v-413.867c17.067-12.8 29.867-21.333 42.667-34.133zM145.067-8.533c0-30.633-24.833-55.467-55.467-55.467s-55.467 24.833-55.467 55.467c0 30.633 24.833 55.467 55.467 55.467s55.467-24.833 55.467-55.467zM418.133 426.667h-290.133v-38.4h273.067c4.267 17.067 8.533 29.867 17.067 38.4zM392.533 106.667h-264.533v-38.4h281.6c-8.533 12.8-12.8 25.6-17.067 38.4zM725.333 247.467c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333c12.8 0 21.333 8.533 21.333 21.333 0 8.533-12.8 21.333-21.333 21.333zM721.067 541.867c-166.4 0-298.667-136.533-298.667-302.933s132.267-302.933 298.667-302.933c166.4 0 298.667 136.533 298.667 302.933 0 170.667-132.267 302.933-298.667 302.933zM725.333 34.133c-98.133 0-174.933 72.533-187.733 162.133h-34.133l51.2 64 59.733-64h-38.4c8.533-68.267 72.533-123.733 149.333-123.733 81.067 0 149.333 64 149.333 145.067s-68.267 145.067-149.333 145.067c-68.267 0-128-46.933-145.067-110.933l-21.333 29.867-17.067-12.8c8.533 29.867 25.6 55.467 46.933 76.8l-25.6 21.333c-4.267 4.267-4.267 12.8 0 17.067l12.8 12.8c4.267 4.267 12.8 4.267 17.067 0l25.6-25.6c21.333 12.8 51.2 25.6 76.8 25.6v29.867h-8.533c-8.533 0-12.8 4.267-12.8 12.8v17.067c0 8.533 4.267 12.8 12.8 12.8h59.733c8.533 0 12.8-4.267 12.8-12.8v-17.067c0-8.533-4.267-12.8-12.8-12.8h-8.533v-21.333c29.867-4.267 55.467-12.8 81.067-29.867l34.133 29.867c4.267 4.267 12.8 4.267 17.067 0l12.8-12.8c4.267-4.267 4.267-12.8 0-17.067l-25.6-25.6c29.867-34.133 51.2-76.8 51.2-128 4.267-102.4-81.067-187.733-183.467-187.733zM772.267 226.133c0-25.6-21.333-46.933-46.933-46.933s-46.933 21.333-46.933 46.933c0 25.6 21.333 46.933 46.933 46.933 8.533 0 17.067-4.267 21.333-4.267l46.933 46.933 21.333-21.333-46.933-46.933c4.267-4.267 4.267-12.8 4.267-21.333z" />
<glyph unicode="&#xe960;" glyph-name="invoiceIn" d="M320 358.4h128c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-128c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM832 396.8c-8.533 0-12.8 0-21.333 4.267v-358.4c0-34.133-29.867-64-64-64s-64 29.867-64 64v42.667c0 12.8-8.533 21.333-21.333 21.333h-640c-12.8 0-21.333-8.533-21.333-21.333v-42.667c0-59.733 46.933-106.667 106.667-106.667h640c59.733 0 106.667 46.933 106.667 106.667v358.4c-8.533 0-12.8-4.267-21.333-4.267zM128-21.333h-21.333c-34.133 0-64 29.867-64 64v21.333h597.333v-21.333c0-25.6 8.533-46.933 21.333-64h-533.333zM149.333 149.333c12.8 0 21.333 8.533 21.333 21.333v682.667c0 34.133 29.867 64 64 64h597.333c-12.8-17.067-21.333-38.4-21.333-64v-68.267c8.533 0 12.8 4.267 21.333 4.267s12.8 0 21.333-4.267v68.267c0 34.133 29.867 64 64 64s64-29.867 64-64v-42.667h-64c-12.8 0-21.333-8.533-21.333-21.333 0-4.267 4.267-12.8 4.267-12.8 4.267 0 8.533-4.267 12.8-8.533 0 0 0 0 0 0h85.333c17.067 0 25.6 8.533 25.6 21.333v64c0 59.733-46.933 106.667-106.667 106.667h-682.667c-59.733 0-106.667-46.933-106.667-106.667v-682.667c0-12.8 8.533-21.333 21.333-21.333zM614.4 366.933c8.533 0 17.067 0 21.333-4.267s12.8-4.267 17.067-8.533c4.267-4.267 12.8-4.267 17.067-4.267 0 0 4.267 4.267 4.267 4.267s4.267 4.267 4.267 4.267c0 4.267 4.267 4.267 4.267 8.533s0 8.533-4.267 12.8c-8.533 8.533-17.067 12.8-29.867 17.067-21.333 8.533-51.2 8.533-76.8-4.267-12.8-4.267-25.6-12.8-34.133-25.6-8.533-8.533-12.8-21.333-17.067-29.867h-17.067c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h8.533c0 0 0-4.267 0-4.267s0 0 0-4.267h-8.533c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h12.8c4.267-12.8 8.533-21.333 17.067-34.133s21.333-21.333 34.133-25.6c12.8-4.267 25.6-8.533 42.667-8.533 25.6 0 46.933 8.533 64 21.333 8.533 8.533 8.533 12.8 8.533 21.333 0 4.267 0 8.533-4.267 12.8s-12.8 8.533-21.333 0c-12.8-8.533-25.6-12.8-42.667-12.8-12.8 0-25.6 4.267-38.4 12.8-8.533 4.267-12.8 12.8-21.333 21.333h64c4.267 0 8.533 4.267 12.8 4.267 0 0 4.267 4.267 4.267 12.8 0 4.267 0 8.533-4.267 12.8 0 0-4.267 4.267-12.8 4.267h-72.533c0 0 0 0 0 4.267 0 0 0 4.267 0 4.267h89.6c4.267 0 8.533 4.267 12.8 4.267 4.267 4.267 4.267 8.533 4.267 12.8s0 8.533-4.267 12.8c0 0-4.267 4.267-12.8 4.267h-76.8c4.267 8.533 12.8 12.8 17.067 21.333 12.8-4.267 25.6 0 38.4 0zM635.733 593.067c0 8.533 0 17.067 4.267 25.6h-320c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h320c0 4.267-4.267 12.8-4.267 17.067zM657.067 512h-337.067c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h341.333c8.533 0 12.8 4.267 17.067 8.533-8.533 8.533-17.067 21.333-21.333 34.133zM832 746.667c-85.333 0-153.6-68.267-153.6-153.6s68.267-153.6 153.6-153.6 153.6 68.267 153.6 153.6c0 85.333-68.267 153.6-153.6 153.6zM921.6 576h-81.067v-42.667c0-8.533-4.267-12.8-12.8-8.533l-98.133 55.467c-8.533 4.267-8.533 12.8 0 17.067l98.133 55.467c8.533 4.267 12.8 0 12.8-8.533v-42.667h81.067c8.533 0 17.067-8.533 17.067-17.067 0 0-4.267-8.533-17.067-8.533z" />
<glyph unicode="&#xe961;" glyph-name="invoiceOut" d="M320 358.4h128c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-128c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM832 396.8c-8.533 0-12.8 0-21.333 4.267v-358.4c0-34.133-29.867-64-64-64s-64 29.867-64 64v42.667c0 12.8-8.533 21.333-21.333 21.333h-640c-12.8 0-21.333-8.533-21.333-21.333v-42.667c0-59.733 46.933-106.667 106.667-106.667h640c59.733 0 106.667 46.933 106.667 106.667v358.4c-8.533 0-12.8-4.267-21.333-4.267zM128-21.333h-21.333c-34.133 0-64 29.867-64 64v21.333h597.333v-21.333c0-25.6 8.533-46.933 21.333-64h-533.333zM149.333 149.333c12.8 0 21.333 8.533 21.333 21.333v682.667c0 34.133 29.867 64 64 64h597.333c-12.8-17.067-21.333-38.4-21.333-64v-68.267c8.533 0 12.8 4.267 21.333 4.267s12.8 0 21.333-4.267v68.267c0 34.133 29.867 64 64 64s64-29.867 64-64v-42.667h-64c-12.8 0-21.333-8.533-21.333-21.333 0-4.267 4.267-12.8 4.267-12.8 4.267 0 8.533-4.267 12.8-8.533 0 0 0 0 0 0h85.333c17.067 0 25.6 8.533 25.6 21.333v64c0 59.733-46.933 106.667-106.667 106.667h-682.667c-59.733 0-106.667-46.933-106.667-106.667v-682.667c0-12.8 8.533-21.333 21.333-21.333zM614.4 366.933c8.533 0 17.067 0 21.333-4.267s12.8-4.267 17.067-8.533c4.267-4.267 12.8-4.267 17.067-4.267 0 0 4.267 4.267 4.267 4.267s4.267 4.267 4.267 4.267c0 4.267 4.267 4.267 4.267 8.533s0 8.533-4.267 12.8c-8.533 8.533-17.067 12.8-29.867 17.067-21.333 8.533-51.2 8.533-76.8-4.267-12.8-4.267-25.6-12.8-34.133-25.6-8.533-8.533-12.8-21.333-17.067-29.867h-17.067c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h8.533c0 0 0-4.267 0-4.267s0 0 0-4.267h-8.533c-4.267 0-8.533 0-12.8-4.267s-4.267-8.533-4.267-12.8c0-4.267 0-8.533 4.267-12.8s8.533-4.267 12.8-4.267h12.8c4.267-12.8 8.533-21.333 17.067-34.133s21.333-21.333 34.133-25.6c12.8-4.267 25.6-8.533 42.667-8.533 25.6 0 46.933 8.533 64 21.333 8.533 8.533 8.533 12.8 8.533 21.333 0 4.267 0 8.533-4.267 12.8s-12.8 8.533-21.333 0c-12.8-8.533-25.6-12.8-42.667-12.8-12.8 0-25.6 4.267-38.4 12.8-8.533 4.267-12.8 12.8-21.333 21.333h64c4.267 0 8.533 4.267 12.8 4.267 0 0 4.267 4.267 4.267 12.8 0 4.267 0 8.533-4.267 12.8 0 0-4.267 4.267-12.8 4.267h-72.533c0 0 0 0 0 4.267 0 0 0 4.267 0 4.267h89.6c4.267 0 8.533 4.267 12.8 4.267 4.267 4.267 4.267 8.533 4.267 12.8s0 8.533-4.267 12.8c0 0-4.267 4.267-12.8 4.267h-76.8c4.267 8.533 12.8 12.8 17.067 21.333 12.8-4.267 25.6 0 38.4 0zM635.733 593.067c0 8.533 0 17.067 4.267 25.6h-320c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h320c0 4.267-4.267 12.8-4.267 17.067zM657.067 512h-337.067c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h341.333c8.533 0 12.8 4.267 17.067 8.533-8.533 8.533-17.067 21.333-21.333 34.133zM832 746.667c-85.333 0-153.6-68.267-153.6-153.6s68.267-153.6 153.6-153.6 153.6 68.267 153.6 153.6c0 85.333-68.267 153.6-153.6 153.6zM934.4 584.533l-98.133-55.467c-8.533-4.267-12.8 0-12.8 8.533v38.4h-81.067c-12.8 0-17.067 8.533-17.067 17.067s8.533 17.067 17.067 17.067h81.067v42.667c0 8.533 4.267 12.8 12.8 8.533l98.133-55.467c8.533-8.533 8.533-17.067 0-21.333z" />
<glyph unicode="&#xe968;" glyph-name="wiki" d="M793.6 733.867c0 0 4.267 0 4.267 0l76.8 12.8v-42.667c0-34.133-21.333-68.267-46.933-72.533 0 0-4.267 0-4.267 0l-76.8-12.8v42.667c0 34.133 21.333 64 46.933 72.533zM742.4 597.333l38.4 4.267c12.8 0 25.6-12.8 25.6-29.867v-21.333l-38.4-4.267c-12.8 0-25.6 12.8-25.6 29.867v21.333zM618.667 699.733l68.267 8.533c25.6 4.267 42.667-21.333 42.667-55.467v-38.4l-68.267-8.533c-25.6-4.267-42.667 21.333-42.667 55.467v38.4zM665.6 588.8c4.267 0 4.267 0 0 0l59.733 4.267v-29.867c0-25.6-17.067-46.933-34.133-55.467 0 0-4.267 0-4.267 0l-55.467-8.533v29.867c4.267 29.867 17.067 51.2 34.133 59.733zM443.733 648.533c0 0-4.267 0-4.267 0-119.467 85.333-273.067 46.933-277.333 46.933s-8.533 0-12.8 8.533c0 4.267 0 8.533 8.533 12.8 0 0 42.667 12.8 98.133 8.533 51.2 0 128-12.8 196.267-59.733 4.267-4.267 4.267-8.533 4.267-12.8-4.267-4.267-8.533-4.267-12.8-4.267zM443.733 512c0 0-4.267 0-4.267 0-119.467 85.333-273.067 46.933-277.333 46.933s-8.533 0-12.8 8.533c0 4.267 0 8.533 8.533 12.8 0 0 42.667 12.8 98.133 8.533 51.2 0 128-12.8 196.267-59.733 4.267-4.267 4.267-8.533 4.267-12.8-4.267 0-8.533-4.267-12.8-4.267zM443.733 379.733c0 0-4.267 0-4.267 0-119.467 85.333-273.067 46.933-277.333 46.933s-8.533 0-12.8 8.533c0 4.267 0 8.533 8.533 12.8 0 0 42.667 12.8 98.133 8.533 51.2 0 128-12.8 196.267-59.733 4.267-4.267 4.267-8.533 4.267-12.8-4.267 0-8.533-4.267-12.8-4.267zM443.733 247.467c0 0-4.267 0-4.267 0-119.467 85.333-273.067 46.933-277.333 46.933s-8.533 0-12.8 8.533c0 4.267 0 8.533 8.533 12.8 0 0 42.667 12.8 98.133 8.533 51.2 0 128-12.8 196.267-59.733 4.267-4.267 4.267-8.533 4.267-12.8-4.267 0-8.533-4.267-12.8-4.267zM588.8 379.733c-4.267 0-4.267 0-8.533 4.267s0 8.533 4.267 12.8c68.267 46.933 140.8 59.733 196.267 59.733s93.867-8.533 98.133-8.533c4.267 0 8.533-8.533 8.533-12.8s-8.533-8.533-12.8-8.533v0c0 0-153.6 38.4-277.333-46.933-4.267 4.267-4.267 0-8.533 0zM588.8 247.467c-4.267 0-4.267 0-8.533 4.267s0 8.533 4.267 12.8c68.267 46.933 140.8 59.733 196.267 59.733s93.867-8.533 98.133-8.533c4.267 0 8.533-8.533 8.533-12.8s-8.533-8.533-12.8-8.533v0c0 0-153.6 38.4-277.333-46.933-4.267 4.267-4.267 0-8.533 0zM985.6 738.133v64l-8.533 4.267c-4.267 0-81.067 29.867-179.2 29.867-106.667 0-200.533-34.133-277.333-98.133-76.8 64-170.667 98.133-277.333 98.133-102.4 0-174.933-29.867-179.2-29.867l-12.8-4.267v-59.733c-34.133-4.267-51.2-17.067-51.2-34.133v-614.4h452.267c17.067-12.8 38.4-21.333 64-21.333s46.933 8.533 64 21.333h443.733v614.4c0 17.067-17.067 25.6-38.4 29.867v0zM512 145.067c-38.4 17.067-166.4 64-298.667 64-51.2 0-98.133-8.533-136.533-21.333v597.333c21.333 8.533 85.333 25.6 162.133 25.6 98.133 0 183.467-29.867 256-89.6v-358.4l17.067 17.067v-234.667zM955.733 183.467c-42.667 17.067-89.6 25.6-140.8 25.6-128 0-251.733-51.2-290.133-64v238.933l17.067-17.067v349.867c68.267 59.733 153.6 89.6 256 89.6 76.8 0 136.533-17.067 162.133-25.6v-597.333z" />
<glyph unicode="&#xe96c;" glyph-name="attach" d="M960 866.133c-42.667 42.667-98.133 64-157.867 64s-115.2-21.333-157.867-64l-593.067-593.067c-34.133-34.133-55.467-85.333-51.2-136.533 0-42.667 17.067-81.067 46.933-110.933 34.133-38.4 81.067-59.733 132.267-59.733 46.933 0 93.867 17.067 128 51.2l541.867 546.133c25.6 25.6 42.667 64 42.667 98.133s-12.8 68.267-38.4 93.867c-25.6 25.6-59.733 38.4-98.133 38.4-34.133 0-72.533-17.067-98.133-42.667l-354.133-354.133c-4.267 0-4.267-4.267-4.267-12.8s4.267-12.8 8.533-17.067 25.6-8.533 34.133 0l354.133 354.133c12.8 17.067 38.4 25.6 59.733 25.6 25.6 0 51.2-12.8 68.267-34.133 8.533-12.8 17.067-25.6 17.067-42.667 4.267-25.6-4.267-55.467-25.6-72.533l-541.867-541.867c-25.6-25.6-55.467-38.4-93.867-38.4-34.133 0-68.267 12.8-93.867 38.4s-38.4 59.733-38.4 93.867c0 34.133 12.8 68.267 38.4 93.867l588.8 584.533c34.133 34.133 76.8 51.2 123.733 51.2s89.6-17.067 123.733-51.2c34.133-34.133 51.2-76.8 51.2-123.733s-17.067-89.6-51.2-123.733l-401.067-401.067c-4.267-4.267-8.533-12.8-8.533-17.067 0-8.533 4.267-12.8 8.533-17.067 8.533-8.533 25.6-8.533 34.133 0l401.067 401.067c89.6 89.6 89.6 230.4 4.267 320z" />
<glyph unicode="&#xe96d;" glyph-name="zone2" d="M98.133 17.067c-4.267 29.867-12.8 64-17.067 93.867-17.067 98.133-34.133 192-51.2 290.133-12.8 46.933-21.333 98.133-29.867 149.333 0 4.267 0 8.533 4.267 8.533 42.667 21.333 85.333 42.667 128 59.733 0 0 0 0 4.267 0 4.267-8.533 8.533-12.8 12.8-21.333-21.333-8.533-42.667-21.333-64-29.867-17.067-8.533-34.133-17.067-51.2-21.333-4.267 0-4.267-4.267-4.267-8.533 8.533-42.667 17.067-85.333 25.6-132.267 0-4.267 4.267-4.267 4.267-8.533 8.533-4.267 17.067-8.533 25.6-17.067 0-4.267-4.267-12.8-8.533-17.067-4.267 4.267-12.8 4.267-17.067 8.533 17.067-102.4 38.4-209.067 55.467-311.467 17.067 8.533 29.867 12.8 42.667 21.333 51.2 25.6 102.4 51.2 153.6 72.533 4.267 0 8.533 0 17.067 0 68.267-4.267 136.533-12.8 204.8-17.067 0 0 4.267 0 8.533 0-4.267 17.067-4.267 34.133-8.533 51.2-12.8 68.267-25.6 136.533-38.4 204.8 0 8.533-4.267 17.067-12.8 25.6-4.267 4.267-4.267 8.533-8.533 12.8 12.8 4.267 8.533 17.067 8.533 25.6-8.533 51.2-17.067 106.667-29.867 157.867 0 4.267 0 4.267-8.533 4.267-17.067 0-38.4 4.267-55.467 4.267 4.267 8.533 8.533 17.067 12.8 21.333 0 0 4.267 4.267 8.533 4.267 17.067 0 34.133-4.267 46.933-4.267 4.267 0 8.533 0 12.8 0 68.267 29.867 132.267 64 200.533 93.867 4.267 4.267 8.533 8.533 12.8 8.533 68.267-4.267 136.533-8.533 204.8-17.067 8.533 0 17.067 0 29.867-4.267 4.267 0 8.533-4.267 8.533-8.533 12.8-64 25.6-132.267 34.133-196.267 17.067-102.4 38.4-204.8 55.467-311.467 0-8.533 4.267-17.067 4.267-25.6-17.067 0-34.133 4.267-51.2 4.267-42.667 4.267-89.6 8.533-132.267 12.8-17.067 0-38.4 4.267-55.467 4.267-4.267 0-12.8 0-17.067-4.267-68.267-29.867-132.267-64-200.533-93.867 0 0-4.267 0-8.533 0-76.8 8.533-149.333 12.8-226.133 21.333-4.267 0-8.533 0-12.8 0-72.533-34.133-140.8-68.267-213.333-102.4 0-4.267 0-8.533-4.267-8.533zM989.867 217.6c0 4.267 0 4.267 0 8.533-8.533 34.133-12.8 72.533-21.333 106.667-8.533 46.933-17.067 89.6-25.6 136.533 0 8.533-4.267 12.8-8.533 17.067-8.533 4.267-12.8 12.8-21.333 17.067 4.267 8.533 8.533 12.8 12.8 17.067 4.267-4.267 8.533-4.267 12.8-8.533-4.267 12.8-4.267 21.333-4.267 34.133-8.533 46.933-17.067 93.867-25.6 145.067 0 4.267-4.267 8.533-8.533 8.533-68.267 4.267-136.533 12.8-209.067 17.067-4.267 0-8.533 0-12.8-4.267-64-29.867-123.733-59.733-187.733-85.333-4.267-4.267-8.533-4.267-4.267-12.8 4.267-29.867 12.8-64 17.067-93.867 4.267-21.333 8.533-42.667 12.8-59.733 12.8-4.267 12.8-12.8 21.333-21.333-12.8-4.267-12.8-12.8-12.8-25.6 12.8-68.267 25.6-132.267 38.4-200.533 4.267-25.6 8.533-51.2 12.8-76.8 4.267 0 4.267 0 8.533 4.267 59.733 29.867 119.467 59.733 183.467 89.6-4.267 4.267 0 4.267 4.267 4.267 51.2-4.267 106.667-8.533 157.867-12.8 21.333 0 38.4-4.267 59.733-4.267zM260.267 469.333c-12.8 17.067-25.6 34.133-38.4 46.933-29.867 46.933-59.733 93.867-85.333 145.067-12.8 29.867-21.333 64-17.067 102.4 8.533 51.2 34.133 85.333 81.067 102.4 55.467 21.333 123.733 8.533 162.133-34.133 34.133-34.133 42.667-76.8 34.133-123.733-8.533-42.667-25.6-76.8-46.933-115.2-25.6-42.667-55.467-81.067-85.333-123.733 0 4.267-4.267 0-4.267 0zM260.267 819.2c-46.933 0-81.067-34.133-81.067-81.067s38.4-81.067 81.067-81.067c46.933 0 81.067 38.4 85.333 81.067 0 42.667-38.4 81.067-85.333 81.067zM358.4 349.867c4.267-8.533 4.267-12.8 8.533-21.333-12.8-4.267-25.6-12.8-38.4-17.067-4.267 8.533-4.267 12.8-8.533 21.333 12.8 4.267 25.6 12.8 38.4 17.067zM226.133 302.933c0 8.533 4.267 17.067 4.267 21.333 12.8 0 25.6-4.267 38.4-4.267 0-8.533 0-12.8 0-25.6-12.8 8.533-29.867 8.533-42.667 8.533zM413.867 354.133c-4.267 8.533-8.533 12.8-12.8 21.333 12.8 8.533 21.333 17.067 34.133 25.6 4.267-4.267 8.533-12.8 12.8-17.067-12.8-12.8-21.333-21.333-34.133-29.867zM179.2 341.333c-4.267-8.533-4.267-12.8-8.533-21.333-12.8 4.267-25.6 8.533-38.4 17.067 4.267 8.533 4.267 12.8 8.533 21.333 12.8-8.533 25.6-12.8 38.4-17.067zM682.667 580.267c-12.8-8.533-21.333-17.067-34.133-21.333-4.267 4.267-8.533 12.8-12.8 17.067 12.8 8.533 25.6 17.067 38.4 25.6 4.267-8.533 4.267-17.067 8.533-21.333zM878.933 558.933c-4.267-8.533-8.533-12.8-12.8-21.333-12.8 8.533-25.6 17.067-34.133 21.333 4.267 8.533 8.533 12.8 8.533 21.333 12.8-8.533 25.6-17.067 38.4-21.333zM571.733 486.4c-4.267 4.267-8.533 12.8-12.8 17.067 8.533 8.533 21.333 21.333 29.867 29.867 4.267-4.267 8.533-12.8 12.8-17.067-8.533-8.533-17.067-21.333-29.867-29.867zM785.067 610.133c-4.267-8.533-4.267-17.067-8.533-21.333-12.8 0-25.6 4.267-38.4 4.267 0 8.533 0 12.8 0 21.333 17.067 0 29.867-4.267 46.933-4.267z" />

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

@ -15,9 +15,9 @@
<a
translate-attr="{title: 'Preview'}"
ui-sref="{{::$ctrl.summaryState}}({id: $ctrl.descriptor.id})">
<vn-icon icon="desktop_windows"></vn-icon>
<vn-icon icon="preview"></vn-icon>
</a>
<vn-icon-button ng-if="$ctrl.$transclude.isSlotFilled('menu')"
<vn-icon-button ng-if="!$ctrl.$transclude.isSlotFilled('dotMenu')"
ng-class="::{invisible: !$ctrl.$transclude.isSlotFilled('menu')}"
icon="more_vert"
vn-popover="menu">

View File

@ -71,13 +71,9 @@ vn-descriptor-content {
& > vn-icon {
padding: $spacing-xs $spacing-sm;
color: $color-marginal;
font-size: 1.5rem;
&.bright {
color: $color-main;
opacity: 1;
}
color: $color-main;
opacity: 1;
}
}
& > .quicklinks {

View File

@ -1 +1,9 @@
import ngModule from '../../module';
import Section from '../section';
import './style.scss';
export default class Summary extends Section {}
ngModule.vnComponent('vnSummary', {
controller: Summary
});

View File

@ -1,10 +1,22 @@
@import "./effects";
@import "./variables";
ui-view > .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;

View File

@ -1,206 +0,0 @@
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,
// Stop running tests after `n` failures
// bail: 0,
// Respect "browser" field in package.json when resolving modules
// browser: false,
// The directory where Jest should store its cached dependency information
// cacheDirectory: "/private/var/folders/_b/2qg94x6n3kd0h_71bp2426wm0000gn/T/jest_dx",
// Automatically clear mock calls and instances between every test
// clearMocks: true,
// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: false,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: null,
// The directory where Jest should output its coverage files
coverageDirectory: 'coverage',
// An array of regexp pattern strings used to skip coverage collection
coveragePathIgnorePatterns: [
'/node_modules/',
'.spec.js'
],
// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: null,
// A path to a custom dependency extractor
// dependencyExtractor: null,
// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: null,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: null,
// A set of global variables that need to be available in all test environments
// globals: {},
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
// maxWorkers: "50%",
// An array of directory names to be searched recursively up from the requiring module's location
moduleDirectories: [
`front`,
`modules`,
`front/node_modules`,
`node_modules`,
`print`
],
// An array of file extensions your modules use
moduleFileExtensions: [
'js',
// "json",
// "jsx",
// "ts",
// "tsx",
// "node"
],
// A map from regular expressions to module names that allow to stub out resources with a single module
moduleNameMapper: {
'\\.(css|scss)$': 'identity-obj-proxy',
'\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/fileMock.js',
},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// Activates notifications for test results
// notify: false,
// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
// preset: null,
// Run tests from one or more projects
// projects: null,
// Use this configuration option to add custom reporters to Jest
// reporters: undefined,
// Automatically reset mock state between every test
// resetMocks: false,
// Reset the module registry before running each individual test
// resetModules: false,
// A path to a custom resolver
// resolver: null,
// Automatically restore mock state between every test
// restoreMocks: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: null,
// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
setupFilesAfterEnv: [
'./jest-front.js'
],
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// The test environment that will be used for testing
// testEnvironment: 'node',
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
testMatch: [
'**/front/**/*.spec.js',
'**/print/**/*.spec.js',
// 'loopback/**/*.spec.js',
// 'modules/*/back/**/*.spec.js'
// "**/__tests__/**/*.[jt]s?(x)",
// "**/?(*.)+(spec|test).[tj]s?(x)"
],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "/node_modules/"
// ],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: null,
// This option allows use of a custom test runner
// testRunner: "jasmine2",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
testURL: 'http://localhost',
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",
// A map from regular expressions to paths to transformers
transform: {
'^.+\\.js?$': 'babel-jest',
'^.+\\.html$': 'html-loader-jest'
},
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// '/node_modules/'
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// Indicates whether each individual test should be reported during the run
verbose: false,
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Whether to use watchman for file crawling
// watchman: true,
};

51
jest.front.config.js Normal file
View File

@ -0,0 +1,51 @@
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
name: 'front end',
displayName: {
name: 'Front end',
color: 'cyan',
},
testEnvironment: 'jsdom',
setupFilesAfterEnv: [
'./jest-front.js'
],
testMatch: [
'**/front/**/*.spec.js',
'**/print/**/*.spec.js',
'loopback/**/*.spec.js',
'modules/*/back/**/*.spec.js'
],
testPathIgnorePatterns: [
'/node_modules/'
],
coveragePathIgnorePatterns: [
'/node_modules/',
'.spec.js'
],
moduleDirectories: [
`front`,
`modules`,
`front/node_modules`,
`node_modules`,
`print`
],
moduleFileExtensions: [
'js',
],
moduleNameMapper: {
'\\.(css|scss)$': 'identity-obj-proxy',
'\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/fileMock.js',
},
testURL: 'http://localhost',
verbose: false,
errorOnDeprecated: true,
restoreMocks: true,
timers: 'real',
transform: {
'^.+\\.js?$': 'babel-jest',
'^.+\\.html$': 'html-loader-jest'
},
};

View File

@ -162,5 +162,6 @@
"You need to fill sage information before you check verified data": "Debes rellenar la información de sage antes de marcar datos comprobados",
"ASSIGN_ZONE_FIRST": "Asigna una zona primero",
"Amount cannot be zero": "El importe no puede ser cero",
"Company has to be official": "Empresa inválida"
"Company has to be official": "Empresa inválida",
"You can not select this payment method without a registered bankery account": "No se puede utilizar este método de pago si no has registrado una cuenta bancaria"
}

View File

@ -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.
*

View File

@ -5,7 +5,6 @@
*/
exports.translateValues = async(instance, changes) => {
const models = instance.app.models;
function getRelation(instance, property) {
const relations = instance.definition.settings.relations;
for (let relationName in relations) {
@ -38,12 +37,18 @@ exports.translateValues = async(instance, changes) => {
for (let property in properties) {
const relation = getRelation(instance, property);
const value = properties[property];
let finalValue = value;
if (relation) {
let fieldsToShow = ['alias', 'name', 'code', 'description'];
const log = instance.definition.settings.log;
if (log && log.showField)
fieldsToShow = log.showField;
const model = relation.model;
const row = await models[model].findById(value, {
fields: ['alias', 'name', 'code', 'description']
fields: fieldsToShow
});
const newValue = getValue(row);
if (newValue) finalValue = newValue;

View File

@ -20,7 +20,7 @@
<vn-icon-button
vn-click-stop="$ctrl.preview(alias)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-item-section>
</a>

View File

@ -78,12 +78,12 @@
<vn-icon
vn-tooltip="User deactivated"
icon="icon-disabled"
ng-class="{bright: !$ctrl.user.active}">
ng-if="!$ctrl.user.active">
</vn-icon>
<vn-icon
vn-tooltip="Account enabled"
icon="contact_mail"
ng-class="{bright: $ctrl.hasAccount}">
ng-if="$ctrl.hasAccount">
</vn-icon>
</div>
</slot-body>

View File

@ -26,7 +26,7 @@
<vn-icon-button
vn-click-stop="$ctrl.preview(user)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-item-section>
</a>

View File

@ -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

View File

@ -21,7 +21,7 @@
<vn-icon-button
vn-click-stop="$ctrl.preview(role)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-item-section>
</a>

View File

@ -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"}
],

View File

@ -1,5 +1,13 @@
<vn-card class="summary">
<h5>{{summary.nickname}}</h5>
<h5>
<a ng-if="::summary.id"
vn-tooltip="Go to the user"
ui-sref="account.card.summary({id: {{::summary.id}}})"
name="goToSummary">
<vn-icon-button icon="launch"></vn-icon-button>
</a>
<span>{{summary.id}} - {{summary.nickname}}</span>
</h5>
<vn-horizontal class="vn-pa-md">
<vn-one>
<h4 translate>Basic data</h4>

View File

@ -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;

View File

@ -46,7 +46,7 @@
<vn-icon-button
vn-click-stop="$ctrl.preview(claim)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-td>
</a>

View File

@ -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

View File

@ -3,7 +3,15 @@
data="photos">
</vn-crud-model>
<vn-card class="summary">
<h5>{{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}}</h5>
<h5>
<a ng-if="::$ctrl.summary.claim.id"
vn-tooltip="Go to the claim"
ui-sref="claim.card.summary({id: {{::$ctrl.summary.claim.id}}})"
name="goToSummary">
<vn-icon-button icon="launch"></vn-icon-button>
</a>
<span>{{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}}</span>
</h5>
<vn-horizontal>
<vn-one>
<vn-label-value

View File

@ -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 {
constructor($element, $, vnFile) {
super($element, $);
this.vnFile = vnFile;

View File

@ -7,7 +7,7 @@ describe('Client activeWorkersWithRole', () => {
let isSalesPerson = await app.models.Account.hasRole(result[0].id, 'salesPerson');
expect(result.length).toEqual(17);
expect(result.length).toEqual(19);
expect(isSalesPerson).toBeTruthy();
});
@ -17,7 +17,7 @@ describe('Client activeWorkersWithRole', () => {
let isBuyer = await app.models.Account.hasRole(result[0].id, 'buyer');
expect(result.length).toEqual(16);
expect(result.length).toEqual(17);
expect(isBuyer).toBeTruthy();
});
});

View File

@ -7,6 +7,6 @@ describe('Client get', () => {
expect(result.id).toEqual(101);
expect(result.name).toEqual('Bruce Wayne');
expect(result.debt).toEqual(889.38);
expect(result.debt).toEqual(887.38);
});
});

View File

@ -4,7 +4,7 @@ describe('client getDebt()', () => {
it('should return the client debt', async() => {
let result = await app.models.Client.getDebt(101);
expect(result.debt).toEqual(889.38);
expect(result.debt).toEqual(887.38);
});
});

View File

@ -6,7 +6,7 @@ describe('Client listWorkers', () => {
.then(result => {
let amountOfEmployees = Object.keys(result).length;
expect(amountOfEmployees).toEqual(53);
expect(amountOfEmployees).toEqual(54);
done();
})
.catch(done.fail);

View File

@ -17,7 +17,7 @@ describe('client summary()', () => {
it('should return a summary object containing debt', async() => {
let result = await app.models.Client.summary(101);
expect(result.debt.debt).toEqual(889.38);
expect(result.debt.debt).toEqual(887.38);
});
it('should return a summary object containing averageInvoiced', async() => {

View File

@ -42,7 +42,7 @@
</vn-horizontal>
</vn-vertical>
<a vn-auto ui-sref="client.card.creditInsurance.insurance.index({classificationId: {{classification.id}}})">
<vn-icon-button icon="desktop_windows" vn-tooltip="View credits"></vn-icon-button>
<vn-icon-button icon="preview" vn-tooltip="View credits"></vn-icon-button>
</a>
</vn-horizontal>
</vn-one>

View File

@ -47,27 +47,27 @@
<vn-icon
vn-tooltip="Client inactive"
icon="icon-disabled"
ng-class="{bright: $ctrl.client.isActive == false}">
ng-if="$ctrl.client.isActive == false">
</vn-icon>
<vn-icon
vn-tooltip="Client frozen"
icon="icon-frozen"
ng-class="{bright: $ctrl.client.isFreezed == true}">
ng-if="$ctrl.client.isFreezed == true">
</vn-icon>
<vn-icon
vn-tooltip="Web Account inactive"
icon="icon-noweb"
ng-class="{bright: $ctrl.client.account.active == false}">
ng-if="$ctrl.client.account.active == false">
</vn-icon>
<vn-icon
vn-tooltip="Client has debt"
icon="icon-risk"
ng-class="{bright: $ctrl.client.debt > $ctrl.client.credit}">
ng-if="$ctrl.client.debt > $ctrl.client.credit">
</vn-icon>
<vn-icon
vn-tooltip="Client not checked"
icon="icon-no036"
ng-class="{bright: $ctrl.client.isTaxDataChecked == false}">
ng-if="$ctrl.client.isTaxDataChecked == false">
</vn-icon>
</div>
<div class="quicklinks">

View File

@ -47,7 +47,7 @@
<vn-icon-button
ng-click="$ctrl.openSummary(client, $event)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-item-section>
</a>

View File

@ -1,5 +1,15 @@
<vn-card class="summary">
<h5>{{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}}</h5>
<h5>
<a ng-if="::$ctrl.summary.id"
vn-tooltip="Go to the client"
ui-sref="client.card.summary({id: {{::$ctrl.summary.id}}})"
name="goToSummary">
<vn-icon-button icon="launch"></vn-icon-button>
</a>
<span>
{{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}}
</span>
</h5>
<vn-horizontal>
<vn-one>
<h4 translate>Basic data</h4>
@ -18,7 +28,7 @@
<vn-label-value label="Mobile"
value="{{$ctrl.summary.mobile}}">
</vn-label-value>
<vn-label-value label="Email" ellipsize="false"
<vn-label-value label="Email" no-ellipsize
value="{{$ctrl.summary.email}}">
</vn-label-value>
<vn-label-value label="Sales person">
@ -40,9 +50,6 @@
<vn-label-value label="NIF / CIF"
value="{{$ctrl.summary.fi}}">
</vn-label-value>
<vn-label-value label="Street" ellipsize="false"
value="{{$ctrl.summary.street}}">
</vn-label-value>
<vn-label-value label="City"
value="{{$ctrl.summary.city}}">
</vn-label-value>
@ -55,6 +62,9 @@
<vn-label-value label="Country"
value="{{$ctrl.summary.country.country}}">
</vn-label-value>
<vn-label-value label="Street" no-ellipsize
value="{{$ctrl.summary.street}}">
</vn-label-value>
</vn-one>
<vn-one>
<h4 translate>Fiscal data</h4>
@ -130,12 +140,12 @@
<vn-label-value label="Name"
value="{{$ctrl.summary.defaultAddress.nickname}}">
</vn-label-value>
<vn-label-value label="Street" ellipsize="false"
value="{{$ctrl.summary.defaultAddress.street}}">
</vn-label-value>
<vn-label-value label="City"
value="{{$ctrl.summary.defaultAddress.city}}">
</vn-label-value>
<vn-label-value label="Street" no-ellipsize
value="{{$ctrl.summary.defaultAddress.street}}">
</vn-label-value>
</vn-one>
<vn-one>
<h4 translate>Web access</h4>

View File

@ -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;

View File

@ -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

View File

@ -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"
}
}
}

View File

@ -24,12 +24,12 @@
<vn-icon
vn-tooltip="Is inventory entry"
icon="icon-inventory"
ng-class="{bright: $ctrl.entry.isInventory}">
ng-if="$ctrl.entry.isInventory">
</vn-icon>
<vn-icon
vn-tooltip="Is virtual entry"
icon="icon-net"
ng-class="{bright: $ctrl.entry.isRaid}">
ng-if="$ctrl.entry.isRaid">
</vn-icon>
</div>
<div class="quicklinks">

View File

@ -1,5 +1,13 @@
<vn-card class="summary">
<h5><span translate>Entry</span> #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}}</h5>
<h5>
<a ng-if="::$ctrl.entryData.id"
vn-tooltip="Go to the entry"
ui-sref="entry.card.summary({id: {{::$ctrl.entryData.id}}})"
name="goToSummary">
<vn-icon-button icon="launch"></vn-icon-button>
</a>
<span> #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}}</span>
</h5>
<vn-horizontal>
<vn-one>
<vn-label-value label="Commission"

View File

@ -1,8 +1,8 @@
import ngModule from '../module';
import './style.scss';
import Section from 'salix/components/section';
import Summary from 'salix/components/summary';
class Controller extends Section {
class Controller extends Summary {
get entry() {
return this._entry;
}

View File

@ -7,3 +7,5 @@ Item type: Tipo
Minimum price: Precio mínimo
Buys: Compras
Travel: Envio
Go to the entry: Ir a la entrada

View File

@ -49,7 +49,7 @@
<vn-icon-button
vn-click-stop="$ctrl.preview(invoiceOut)"
vn-tooltip="Preview"
icon="desktop_windows">
icon="preview">
</vn-icon-button>
</vn-td>
</a>

Some files were not shown because too many files have changed in this diff Show More