Ticket packaging refactor + front test updated
This commit is contained in:
parent
d0fff2135e
commit
a60720d1ed
|
@ -1,11 +1,13 @@
|
||||||
<mg-ajax
|
<vn-crud-model
|
||||||
path="/ticket/api/Tickets/{{index.params.id}}/packages"
|
vn-id="model"
|
||||||
options="mgIndex" actions="$ctrl.getPackages()">
|
url="/ticket/api/TicketPackagings"
|
||||||
</mg-ajax>
|
link="{ticketFk: $ctrl.$stateParams.id}"
|
||||||
|
data="packages" on-data-change="$ctrl.getPackages()">
|
||||||
|
</vn-crud-model>
|
||||||
|
|
||||||
<vn-watcher
|
<vn-watcher
|
||||||
vn-id="watcher"
|
vn-id="watcher"
|
||||||
data="$ctrl.packages"
|
data="packages"
|
||||||
form="form">
|
form="form">
|
||||||
</vn-watcher>
|
</vn-watcher>
|
||||||
|
|
||||||
|
@ -13,28 +15,25 @@
|
||||||
<vn-card pad-large>
|
<vn-card pad-large>
|
||||||
<vn-title>Packages</vn-title>
|
<vn-title>Packages</vn-title>
|
||||||
<vn-one>
|
<vn-one>
|
||||||
<vn-horizontal ng-repeat="package in index.model track by $index">
|
<vn-horizontal ng-repeat="package in packages track by $index">
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete vn-one
|
||||||
margin-large-right
|
|
||||||
vn-focus
|
vn-focus
|
||||||
url="/ticket/api/Packagings/listPackaging"
|
url="/ticket/api/Packagings/listPackaging"
|
||||||
label="Package"
|
label="Package"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="packagingFk"
|
value-field="packagingFk"
|
||||||
where="{or: [{id: {like: '%search%'}}, {name: {like: '%search%'}}]}"
|
where="{or: [{'itemFk': {like: '%search%'}}, {'name': {like: '%search%'}}]}"
|
||||||
field="package.packagingFk">
|
field="package.packagingFk">
|
||||||
<tpl-item>{{id}} : {{name}}</tpl-item>
|
<tpl-item>{{itemFk}} : {{name}}</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
margin-large-right
|
|
||||||
label="Quantity"
|
label="Quantity"
|
||||||
model="package.quantity"
|
model="package.quantity"
|
||||||
rule="TicketPackaging.quantity">
|
rule="TicketPackaging.quantity">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
margin-large-right
|
|
||||||
label="Added"
|
label="Added"
|
||||||
model="package.created | date: 'dd/MM/yyyy'"
|
model="package.created | date: 'dd/MM/yyyy'"
|
||||||
disabled="true"
|
disabled="true"
|
||||||
|
|
|
@ -1,16 +1,17 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
|
|
||||||
class Controller {
|
class Controller {
|
||||||
constructor($http, $scope, $translate, vnApp) {
|
constructor($http, $scope, $stateParams, $translate, vnApp) {
|
||||||
this.$http = $http;
|
this.$http = $http;
|
||||||
this.$ = $scope;
|
this.$scope = $scope;
|
||||||
|
this.$stateParams = $stateParams;
|
||||||
this.$translate = $translate;
|
this.$translate = $translate;
|
||||||
this.vnApp = vnApp;
|
this.vnApp = vnApp;
|
||||||
this.removedPackages = [];
|
this.removedPackages = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
submit() {
|
submit() {
|
||||||
let query = `/ticket/api/TicketPackagings/crudTicketPackaging`;
|
let query = `/ticket/api/TicketPackagings/crud`;
|
||||||
let packagesObj = {
|
let packagesObj = {
|
||||||
delete: this.removedPackages,
|
delete: this.removedPackages,
|
||||||
create: [],
|
create: [],
|
||||||
|
@ -25,14 +26,11 @@ class Controller {
|
||||||
packagesObj.update.push(item);
|
packagesObj.update.push(item);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.$.form.$invalid)
|
this.$scope.watcher.check();
|
||||||
return this.vnApp.showError(this.$translate.instant('Some fields are invalid'));
|
|
||||||
|
|
||||||
if (!this.hasChanges(packagesObj))
|
|
||||||
return this.vnApp.showError(this.$translate.instant('No changes to save'));
|
|
||||||
|
|
||||||
this.$http.post(query, packagesObj).then(res => {
|
this.$http.post(query, packagesObj).then(res => {
|
||||||
this.$.index.accept();
|
this.$scope.watcher.notifySaved();
|
||||||
|
this.$scope.model.refresh();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,14 +52,11 @@ class Controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
getPackages() {
|
getPackages() {
|
||||||
this.packages = this.$.index.model;
|
this.packages = this.$scope.model.data;
|
||||||
this.setOldPackages();
|
this.setOldPackages();
|
||||||
}
|
}
|
||||||
|
|
||||||
setOldPackages() {
|
setOldPackages() {
|
||||||
if (this.oldPackages && !this.$.watcher.dataChanged())
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.oldPackages = [];
|
this.oldPackages = [];
|
||||||
this.removedPackages = [];
|
this.removedPackages = [];
|
||||||
this.packages.forEach(item => {
|
this.packages.forEach(item => {
|
||||||
|
@ -72,16 +67,9 @@ class Controller {
|
||||||
packageEquals(newPackage, oldPackage) {
|
packageEquals(newPackage, oldPackage) {
|
||||||
return newPackage.packagingFk === oldPackage.packagingFk && newPackage.quantity == oldPackage.quantity;
|
return newPackage.packagingFk === oldPackage.packagingFk && newPackage.quantity == oldPackage.quantity;
|
||||||
}
|
}
|
||||||
|
|
||||||
hasChanges(packagesObj) {
|
|
||||||
if (packagesObj.create.length || packagesObj.update.length || packagesObj.delete.length)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$http', '$scope', '$translate', 'vnApp'];
|
Controller.$inject = ['$http', '$scope', '$stateParams', '$translate', 'vnApp'];
|
||||||
|
|
||||||
ngModule.component('vnTicketPackageIndex', {
|
ngModule.component('vnTicketPackageIndex', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
|
|
|
@ -16,10 +16,13 @@ describe('Ticket', () => {
|
||||||
$httpBackend = _$httpBackend_;
|
$httpBackend = _$httpBackend_;
|
||||||
$httpBackend.when('GET', /\/locale\/\w+\/[a-z]{2}\.json/).respond({});
|
$httpBackend.when('GET', /\/locale\/\w+\/[a-z]{2}\.json/).respond({});
|
||||||
$scope = {
|
$scope = {
|
||||||
index: {
|
model: {
|
||||||
accept: function() {}
|
refresh: () => {}
|
||||||
},
|
},
|
||||||
form: {}
|
watcher: {
|
||||||
|
check: () => {},
|
||||||
|
notifySaved: () => {}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
controller = $componentController('vnTicketPackageIndex', {$scope: $scope});
|
controller = $componentController('vnTicketPackageIndex', {$scope: $scope});
|
||||||
}));
|
}));
|
||||||
|
@ -35,8 +38,9 @@ describe('Ticket', () => {
|
||||||
|
|
||||||
describe('submit()', () => {
|
describe('submit()', () => {
|
||||||
it('should perform a post', () => {
|
it('should perform a post', () => {
|
||||||
spyOn(controller.$.index, 'accept');
|
spyOn(controller.$scope.watcher, 'notifySaved');
|
||||||
let query = '/ticket/api/TicketPackagings/crudTicketPackaging';
|
spyOn(controller.$scope.model, 'refresh');
|
||||||
|
|
||||||
controller.removedPackages = [];
|
controller.removedPackages = [];
|
||||||
controller.oldPackages = [];
|
controller.oldPackages = [];
|
||||||
controller.oldPackages[1] = {id: 1, packagingFk: 1, quantity: 5, ticketFk: 1};
|
controller.oldPackages[1] = {id: 1, packagingFk: 1, quantity: 5, ticketFk: 1};
|
||||||
|
@ -45,9 +49,39 @@ describe('Ticket', () => {
|
||||||
{id: 1, packagingFk: 1, quantity: 25, ticketFk: 1}
|
{id: 1, packagingFk: 1, quantity: 25, ticketFk: 1}
|
||||||
];
|
];
|
||||||
|
|
||||||
$httpBackend.expectPOST(query, {delete: [], create: [{quantity: 5, packagingFk: 2, ticketFk: 1}], update: [{id: 1, packagingFk: 1, quantity: 25, ticketFk: 1}]}).respond('ok');
|
let data = {
|
||||||
|
delete: [],
|
||||||
|
create: [{quantity: 5, packagingFk: 2, ticketFk: 1}],
|
||||||
|
update: [{id: 1, packagingFk: 1, quantity: 25, ticketFk: 1}]
|
||||||
|
};
|
||||||
|
|
||||||
|
$httpBackend.when('POST', '/ticket/api/TicketPackagings/crud', data).respond(200);
|
||||||
|
$httpBackend.expect('POST', '/ticket/api/TicketPackagings/crud', data).respond('ok');
|
||||||
controller.submit();
|
controller.submit();
|
||||||
$httpBackend.flush();
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(controller.$scope.model.refresh).toHaveBeenCalledWith();
|
||||||
|
expect(controller.$scope.watcher.notifySaved).toHaveBeenCalledWith();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('packageEquals()', () => {
|
||||||
|
it('should return true if the old package and the new one matches', () => {
|
||||||
|
let oldPackage = {quantity: 5, packagingFk: 2};
|
||||||
|
let newPackage = {quantity: 5, packagingFk: 2};
|
||||||
|
|
||||||
|
let result = controller.packageEquals(oldPackage, newPackage);
|
||||||
|
|
||||||
|
expect(result).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should return false if the old package and the new one doesn't match`, () => {
|
||||||
|
let oldPackage = {quantity: 5, packagingFk: 2};
|
||||||
|
let newPackage = {quantity: 6, packagingFk: 2};
|
||||||
|
|
||||||
|
let result = controller.packageEquals(oldPackage, newPackage);
|
||||||
|
|
||||||
|
expect(result).toBeFalsy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
"Is invalid": "Is invalid",
|
"Is invalid": "Is invalid",
|
||||||
"Quantity cannot be zero": "Quantity cannot be zero",
|
"Quantity cannot be zero": "Quantity cannot be zero",
|
||||||
"Enter an integer different to zero": "Enter an integer different to zero",
|
"Enter an integer different to zero": "Enter an integer different to zero",
|
||||||
"Package cannot be blank": "Package cannot be blank",
|
|
||||||
"The company name must be unique": "The company name must be unique",
|
"The company name must be unique": "The company name must be unique",
|
||||||
"Invalid email": "Invalid email",
|
"Invalid email": "Invalid email",
|
||||||
"The IBAN does not have the correct format": "The IBAN does not have the correct format",
|
"The IBAN does not have the correct format": "The IBAN does not have the correct format",
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
"Is invalid": "Is invalid",
|
"Is invalid": "Is invalid",
|
||||||
"Quantity cannot be zero": "La cantidad no puede ser cero",
|
"Quantity cannot be zero": "La cantidad no puede ser cero",
|
||||||
"Enter an integer different to zero": "Introduce un entero distinto de cero",
|
"Enter an integer different to zero": "Introduce un entero distinto de cero",
|
||||||
"Package cannot be blank": "Embalaje no puede estar en blanco",
|
"The package cannot be blank": "El embalaje no puede estar en blanco",
|
||||||
"The company name must be unique": "La razón social debe ser única",
|
"The company name must be unique": "La razón social debe ser única",
|
||||||
"Invalid email": "Correo electrónico inválido",
|
"Invalid email": "Correo electrónico inválido",
|
||||||
"The IBAN does not have the correct format": "El IBAN no tiene el formato correcto",
|
"The IBAN does not have the correct format": "El IBAN no tiene el formato correcto",
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
module.exports = Self => {
|
|
||||||
Self.installCrudModel('crudTicketPackaging');
|
|
||||||
};
|
|
|
@ -24,11 +24,13 @@ module.exports = Self => {
|
||||||
|
|
||||||
Self.listPackaging = async filter => {
|
Self.listPackaging = async filter => {
|
||||||
let stmt = new ParameterizedSQL(
|
let stmt = new ParameterizedSQL(
|
||||||
`SELECT i.name, i.id, p.id packagingFk
|
`SELECT name, itemFk, packagingFk
|
||||||
FROM item i JOIN packaging p ON i.id = p.itemFk`
|
FROM (SELECT i.name, i.id itemFk, p.id packagingFk
|
||||||
|
FROM item i
|
||||||
|
JOIN packaging p ON i.id = p.itemFk) p`
|
||||||
);
|
);
|
||||||
|
|
||||||
stmt.merge(Self.buildSuffix(filter, 'i'));
|
stmt.merge(Self.buildSuffix(filter));
|
||||||
return Self.rawStmt(stmt);
|
return Self.rawStmt(stmt);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports = function(Self) {
|
module.exports = function(Self) {
|
||||||
require('../methods/packaging/crudTicketPackaging')(Self);
|
|
||||||
|
|
||||||
Self.validateBinded('quantity', validateQuantity, {
|
Self.validateBinded('quantity', validateQuantity, {
|
||||||
message: 'Enter an integer different to zero',
|
message: 'Enter an integer different to zero',
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
|
@ -11,5 +9,5 @@ module.exports = function(Self) {
|
||||||
return !isNaN(quantity) && quantity != 0;
|
return !isNaN(quantity) && quantity != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Self.validatesPresenceOf('packagingFk', {message: 'Package cannot be blank'});
|
Self.validatesPresenceOf('packagingFk', {message: 'The package cannot be blank'});
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue