Merge branch 'dev' into 3752-claim_action
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
a47c0dbaea
|
@ -28,7 +28,7 @@ module.exports = Self => {
|
|||
const args = ctx.args;
|
||||
const models = Self.app.models;
|
||||
|
||||
const sale = await models.Sale.findById(args.saleId,);
|
||||
const sale = await models.Sale.findById(args.saleId);
|
||||
return await sale.updateAttribute('quantity', args.quantity);
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1133,7 +1133,7 @@ export default {
|
|||
entryLatestBuys: {
|
||||
firstBuy: 'vn-entry-latest-buys tbody > tr:nth-child(1)',
|
||||
allBuysCheckBox: 'vn-entry-latest-buys thead vn-check',
|
||||
secondBuyCheckBox: 'vn-entry-latest-buys tbody tr:nth-child(2) vn-check[ng-model="buy.$checked"]',
|
||||
secondBuyCheckBox: 'vn-entry-latest-buys tbody tr:nth-child(2) vn-check[ng-model="buy.checked"]',
|
||||
editBuysButton: 'vn-entry-latest-buys vn-button[icon="edit"]',
|
||||
fieldAutocomplete: 'vn-autocomplete[ng-model="$ctrl.editedColumn.field"]',
|
||||
newValueInput: 'vn-textfield[ng-model="$ctrl.editedColumn.newValue"]',
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
SelectAllRows: Select the {{rows}} row(s)
|
|
@ -0,0 +1,3 @@
|
|||
SelectAllRows: Seleccionar las {{rows}} fila(s)
|
||||
All: Se han seleccionado
|
||||
row(s) have been selected.: fila(s).
|
|
@ -2,4 +2,23 @@
|
|||
ng-model="$ctrl.checked"
|
||||
indeterminate="$ctrl.isIndeterminate"
|
||||
translate-attr="{title: 'Check all'}">
|
||||
</vn-check>
|
||||
</vn-check>
|
||||
<vn-icon-button
|
||||
class="vn-pl-none"
|
||||
ng-if="$ctrl.checked && $ctrl.checkDummyEnabled"
|
||||
icon="expand_more"
|
||||
vn-popover="menu"
|
||||
ng-click="$ctrl.countRows()">
|
||||
</vn-icon-button>
|
||||
<vn-menu vn-id="menu">
|
||||
<vn-list>
|
||||
<span translate>All</span>
|
||||
<span class="bold">
|
||||
{{$ctrl.rows}}
|
||||
</span>
|
||||
<span translate>row(s) have been selected.</span>
|
||||
<span class="bold link" ng-click="$ctrl.checkDummy()">
|
||||
{{$ctrl.allRowsText}}
|
||||
</span>
|
||||
</vn-list>
|
||||
</vn-menu>
|
|
@ -106,6 +106,9 @@ export default class MultiCheck extends FormInput {
|
|||
|
||||
this.toggle();
|
||||
this.emit('change', value);
|
||||
|
||||
if (!value)
|
||||
this.checkedDummyCount = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -132,12 +135,43 @@ export default class MultiCheck extends FormInput {
|
|||
areAllUnchecked() {
|
||||
if (!this.model || !this.model.data) return;
|
||||
|
||||
this.checkedDummyCount = null;
|
||||
const data = this.model.data;
|
||||
return data.every(item => {
|
||||
return item[this.checkField] === false;
|
||||
});
|
||||
}
|
||||
|
||||
countRows() {
|
||||
if (!this.model || !this.model.data) return;
|
||||
|
||||
const data = this.model.data;
|
||||
const modelParams = this.model.userParams;
|
||||
const params = {
|
||||
filter: {
|
||||
modelParams: modelParams,
|
||||
limit: null
|
||||
}
|
||||
};
|
||||
|
||||
this.rows = data.length;
|
||||
|
||||
this.$http.get(this.model.url, {params})
|
||||
.then(res => {
|
||||
this.allRowsCount = res.data.length;
|
||||
this.allRowsText = this.$t('SelectAllRows', {
|
||||
rows: this.allRowsCount
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
checkDummy() {
|
||||
if (this.checkedDummyCount)
|
||||
return this.checkedDummyCount = null;
|
||||
|
||||
this.checkedDummyCount = this.allRowsCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles checked property on
|
||||
* all instances
|
||||
|
@ -158,7 +192,9 @@ ngModule.vnComponent('vnMultiCheck', {
|
|||
checkField: '@?',
|
||||
checkAll: '=?',
|
||||
checked: '=?',
|
||||
disabled: '<?'
|
||||
disabled: '<?',
|
||||
checkDummyEnabled: '<?',
|
||||
checkedDummyCount: '=?'
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -4,10 +4,14 @@ import crudModel from 'core/mocks/crud-model';
|
|||
describe('Component vnMultiCheck', () => {
|
||||
let controller;
|
||||
let $element;
|
||||
let $httpBackend;
|
||||
let $httpParamSerializer;
|
||||
|
||||
beforeEach(ngModule('vnCore'));
|
||||
|
||||
beforeEach(inject($componentController => {
|
||||
beforeEach(inject(($componentController, _$httpBackend_, _$httpParamSerializer_) => {
|
||||
$httpBackend = _$httpBackend_;
|
||||
$httpParamSerializer = _$httpParamSerializer_;
|
||||
$element = angular.element(`<div class="shown"></div>`);
|
||||
controller = $componentController('vnMultiCheck', {$element: $element});
|
||||
controller._model = crudModel;
|
||||
|
@ -26,6 +30,14 @@ describe('Component vnMultiCheck', () => {
|
|||
expect(controller._checked).toEqual(crudModel);
|
||||
expect(controller.toggle).toHaveBeenCalledWith();
|
||||
});
|
||||
|
||||
it(`should set checkedDummyCount to null`, () => {
|
||||
jest.spyOn(controller, 'toggle');
|
||||
controller.checkedDummyCount = 12;
|
||||
controller.checked = null;
|
||||
|
||||
expect(controller.checkedDummyCount).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('toggle()', () => {
|
||||
|
@ -132,4 +144,50 @@ describe('Component vnMultiCheck', () => {
|
|||
expect(thirdRow.checked).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('countRows()', () => {
|
||||
it(`should count visible rows and all rows of model`, () => {
|
||||
controller.model.url = 'modelUrl/filter';
|
||||
const data = controller.model.data;
|
||||
const filter = {
|
||||
limit: null
|
||||
};
|
||||
const serializedParams = $httpParamSerializer({filter});
|
||||
|
||||
const response = [
|
||||
{id: 1, name: 'My item 1'},
|
||||
{id: 2, name: 'My item 2'},
|
||||
{id: 3, name: 'My item 3'},
|
||||
{id: 4, name: 'My item 4'},
|
||||
{id: 5, name: 'My item 5'},
|
||||
{id: 6, name: 'My item 6'}
|
||||
];
|
||||
|
||||
controller.countRows();
|
||||
$httpBackend.expectGET(`modelUrl/filter?${serializedParams}`).respond(response);
|
||||
$httpBackend.flush();
|
||||
|
||||
expect(controller.rows).toEqual(data.length);
|
||||
expect(controller.allRowsCount).toEqual(response.length);
|
||||
expect(controller.allRowsCount).toBeGreaterThan(controller.rows);
|
||||
});
|
||||
});
|
||||
|
||||
describe('checkDummy()', () => {
|
||||
const allRows = 1234;
|
||||
it(`should set the checked dummy count to all rows count if there was no count yet`, () => {
|
||||
controller.checkedDummyCount = null;
|
||||
controller.allRowsCount = allRows;
|
||||
controller.checkDummy();
|
||||
|
||||
expect(controller.checkedDummyCount).toEqual(controller.allRowsCount);
|
||||
});
|
||||
|
||||
it(`should remove the dummy count if there was an existing one`, () => {
|
||||
controller.checkedDummyCount = allRows;
|
||||
controller.checkDummy();
|
||||
|
||||
expect(controller.checkedDummyCount).toBeNull();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,17 @@
|
|||
@import "variables";
|
||||
vn-multi-check {
|
||||
.vn-check {
|
||||
margin-bottom: 12px
|
||||
}
|
||||
|
||||
vn-list{
|
||||
padding: 50px;
|
||||
}
|
||||
vn-menu{
|
||||
padding: 50px;
|
||||
}
|
||||
|
||||
}
|
||||
.bold{
|
||||
font-weight: bold;
|
||||
}
|
|
@ -105,7 +105,7 @@
|
|||
<div ng-transclude="btnFive">
|
||||
<vn-quick-link
|
||||
ng-if="$ctrl.client.supplier.nif"
|
||||
tooltip="Go to client"
|
||||
tooltip="Go to supplier"
|
||||
state="['supplier.card.summary', {id: $ctrl.client.supplier.id}]"
|
||||
icon="icon-supplier">
|
||||
</vn-quick-link>
|
||||
|
|
|
@ -3,5 +3,6 @@ View consumer report: Ver informe de consumo
|
|||
From date: Fecha desde
|
||||
To date: Fecha hasta
|
||||
Go to user: Ir al usuario
|
||||
Go to supplier: Ir al proveedor
|
||||
Client invoices list: Listado de facturas del cliente
|
||||
Pay method: Forma de pago
|
|
@ -1,27 +1,32 @@
|
|||
module.exports = Self => {
|
||||
Self.remoteMethod('editLatestBuys', {
|
||||
Self.remoteMethodCtx('editLatestBuys', {
|
||||
description: 'Updates a column for one or more buys',
|
||||
accessType: 'WRITE',
|
||||
accepts: [{
|
||||
arg: 'field',
|
||||
type: 'String',
|
||||
type: 'string',
|
||||
required: true,
|
||||
description: `the column to edit`
|
||||
},
|
||||
{
|
||||
arg: 'newValue',
|
||||
type: 'Any',
|
||||
type: 'any',
|
||||
required: true,
|
||||
description: `The new value to save`
|
||||
},
|
||||
{
|
||||
arg: 'lines',
|
||||
type: ['Object'],
|
||||
type: ['object'],
|
||||
required: true,
|
||||
description: `the buys which will be modified`
|
||||
},
|
||||
{
|
||||
arg: 'filter',
|
||||
type: 'object',
|
||||
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string'
|
||||
}],
|
||||
returns: {
|
||||
type: 'Object',
|
||||
type: 'object',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
|
@ -30,7 +35,7 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.editLatestBuys = async(field, newValue, lines, options) => {
|
||||
Self.editLatestBuys = async(ctx, field, newValue, lines, filter, options) => {
|
||||
let tx;
|
||||
const myOptions = {};
|
||||
|
||||
|
@ -64,17 +69,19 @@ module.exports = Self => {
|
|||
|
||||
const models = Self.app.models;
|
||||
const model = models[modelName];
|
||||
|
||||
try {
|
||||
const promises = [];
|
||||
const value = {};
|
||||
value[field] = newValue;
|
||||
|
||||
if (filter) {
|
||||
ctx.args.filter = {where: filter, limit: null};
|
||||
lines = await models.Buy.latestBuysFilter(ctx, null, myOptions);
|
||||
}
|
||||
|
||||
const targets = lines.map(line => {
|
||||
return line[identifier];
|
||||
});
|
||||
|
||||
const value = {};
|
||||
value[field] = newValue;
|
||||
|
||||
for (let target of targets)
|
||||
promises.push(model.upsertWithWhere({id: target}, value, myOptions));
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ module.exports = Self => {
|
|||
}
|
||||
],
|
||||
returns: {
|
||||
type: ['Object'],
|
||||
type: ['object'],
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
|
@ -98,6 +98,9 @@ module.exports = Self => {
|
|||
Self.latestBuysFilter = async(ctx, filter, options) => {
|
||||
const myOptions = {};
|
||||
|
||||
if (filter && filter.modelParams)
|
||||
ctx.args = filter.modelParams;
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ describe('Buy editLatestsBuys()', () => {
|
|||
const options = {transaction: tx};
|
||||
|
||||
try {
|
||||
let ctx = {
|
||||
const ctx = {
|
||||
args: {
|
||||
search: 'Ranged weapon longbow 2m'
|
||||
}
|
||||
|
@ -18,7 +18,35 @@ describe('Buy editLatestsBuys()', () => {
|
|||
const newValue = 99;
|
||||
const lines = [{itemFk: original.itemFk, id: original.id}];
|
||||
|
||||
await models.Buy.editLatestBuys(field, newValue, lines, options);
|
||||
await models.Buy.editLatestBuys(ctx, field, newValue, lines, null, options);
|
||||
|
||||
const [result] = await models.Buy.latestBuysFilter(ctx, null, options);
|
||||
|
||||
expect(result[field]).toEqual(newValue);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
|
||||
it('should change the value of a given column for filter', async() => {
|
||||
const tx = await models.Buy.beginTransaction({});
|
||||
const options = {transaction: tx};
|
||||
|
||||
try {
|
||||
const filter = {typeFk: 1};
|
||||
const ctx = {
|
||||
args: {
|
||||
filter: filter
|
||||
}
|
||||
};
|
||||
|
||||
const field = 'size';
|
||||
const newValue = 88;
|
||||
|
||||
await models.Buy.editLatestBuys(ctx, field, newValue, null, filter, options);
|
||||
|
||||
const [result] = await models.Buy.latestBuysFilter(ctx, null, options);
|
||||
|
||||
|
|
|
@ -29,9 +29,11 @@
|
|||
<tr>
|
||||
<th shrink>
|
||||
<vn-multi-check
|
||||
checked="$ctrl.checkAll"
|
||||
model="model"
|
||||
check-field="$checked">
|
||||
checked="$ctrl.checkAll"
|
||||
check-field="checked"
|
||||
check-dummy-enabled="true"
|
||||
checked-dummy-count="$ctrl.checkedDummyCount">
|
||||
</vn-multi-check>
|
||||
</th>
|
||||
<th translate>Picture</th>
|
||||
|
@ -126,7 +128,7 @@
|
|||
}">
|
||||
<td>
|
||||
<vn-check
|
||||
ng-model="buy.$checked"
|
||||
ng-model="buy.checked"
|
||||
vn-click-stop>
|
||||
</vn-check>
|
||||
</td>
|
||||
|
|
|
@ -6,7 +6,7 @@ export default class Controller extends Section {
|
|||
constructor($element, $) {
|
||||
super($element, $);
|
||||
this.editedColumn;
|
||||
this.$checkAll = false;
|
||||
this.checkAll = false;
|
||||
|
||||
this.smartTableOptions = {
|
||||
activeButtons: {
|
||||
|
@ -91,7 +91,7 @@ export default class Controller extends Section {
|
|||
const buys = this.$.model.data || [];
|
||||
const checkedBuys = [];
|
||||
for (let buy of buys) {
|
||||
if (buy.$checked)
|
||||
if (buy.checked)
|
||||
checkedBuys.push(buy);
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,9 @@ export default class Controller extends Section {
|
|||
}
|
||||
|
||||
get totalChecked() {
|
||||
if (this.checkedDummyCount)
|
||||
return this.checkedDummyCount;
|
||||
|
||||
return this.checked.length;
|
||||
}
|
||||
|
||||
|
@ -156,6 +159,9 @@ export default class Controller extends Section {
|
|||
lines: rowsToEdit
|
||||
};
|
||||
|
||||
if (this.checkedDummyCount && this.checkedDummyCount > 0)
|
||||
data.filter = this.$.model.userParams;
|
||||
|
||||
return this.$http.post('Buys/editLatestBuys', data)
|
||||
.then(() => {
|
||||
this.uncheck();
|
||||
|
|
|
@ -31,10 +31,10 @@ describe('Entry', () => {
|
|||
describe('get checked', () => {
|
||||
it(`should return a set of checked lines`, () => {
|
||||
controller.$.model.data = [
|
||||
{$checked: true, id: 1},
|
||||
{$checked: true, id: 2},
|
||||
{$checked: true, id: 3},
|
||||
{$checked: false, id: 4},
|
||||
{checked: true, id: 1},
|
||||
{checked: true, id: 2},
|
||||
{checked: true, id: 3},
|
||||
{checked: false, id: 4},
|
||||
];
|
||||
|
||||
let result = controller.checked;
|
||||
|
|
|
@ -100,12 +100,7 @@ module.exports = Self => {
|
|||
},
|
||||
]
|
||||
};
|
||||
let supplier = await Self.app.models.Supplier.findOne(filter);
|
||||
|
||||
const farmerCode = 2;
|
||||
if (supplier.sageWithholdingFk == farmerCode)
|
||||
supplier.isFarmer = true;
|
||||
|
||||
return supplier;
|
||||
return Self.app.models.Supplier.findOne(filter);
|
||||
};
|
||||
};
|
||||
|
|
|
@ -25,12 +25,4 @@ describe('Supplier getSummary()', () => {
|
|||
|
||||
expect(payMethod.name).toEqual('PayMethod one');
|
||||
});
|
||||
|
||||
it(`should get if supplier is farmer by sageWithholdingFk`, async() => {
|
||||
const supplier = await app.models.Supplier.findById(2);
|
||||
const supplierSummary = await app.models.Supplier.getSummary(2);
|
||||
|
||||
expect(supplier.isFarmer).toBeUndefined();
|
||||
expect(supplierSummary.isFarmer).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -83,11 +83,6 @@
|
|||
label="Account"
|
||||
value="{{::$ctrl.summary.account}}">
|
||||
</vn-label-value>
|
||||
<vn-check
|
||||
label="Is Farmer"
|
||||
ng-model="$ctrl.summary.isFarmer"
|
||||
disabled="true">
|
||||
</vn-check>
|
||||
</vn-one>
|
||||
</vn-horizontal>
|
||||
<vn-horizontal>
|
||||
|
|
Loading…
Reference in New Issue