#1882 Popover::show() boilerplate code removed
gitea/salix/pipeline/head There was a failure building this commit Details

This commit is contained in:
Juan Ferrer 2020-04-28 14:26:02 +02:00
parent 5826099601
commit b536c8291a
61 changed files with 556 additions and 839 deletions

View File

@ -31,6 +31,7 @@ rules:
curly: [error, multi-or-nest] curly: [error, multi-or-nest]
indent: [error, 4] indent: [error, 4]
arrow-parens: [error, as-needed] arrow-parens: [error, as-needed]
jasmine/no-focused-tests: 0
no-multiple-empty-lines: ["error", { "max": 1, "maxEOF": 1 }] no-multiple-empty-lines: ["error", { "max": 1, "maxEOF": 1 }]
space-in-parens: ["error", "never"] space-in-parens: ["error", "never"]
jasmine/no-focused-tests: 0
jasmine/prefer-toHaveBeenCalledWith: 0

View File

@ -63,10 +63,10 @@ export default class DescriptorPopover extends Popover {
this.relocate(); this.relocate();
return this.$http.get(url, options) return this.$http.get(url, options)
.then(res => { .then(res => {
this.canceler = null;
this.$.$applyAsync(() => this.relocate()); this.$.$applyAsync(() => this.relocate());
return res; return res;
}); })
.finally(() => this.canceler = null);
} }
} }

View File

@ -1,8 +1,9 @@
<a ng-repeat="button in $ctrl.links" <vn-spinner
vn-tooltip="{{::button.tooltip}}" ng-if="$ctrl.canceler"
class="vn-button colored" enable="true">
ui-sref="{{::button.state}}"> </vn-spinner>
<vn-icon <div
icon="{{::button.icon}}"> ng-if="$ctrl.entity"
</vn-icon> ng-transclude="body"
</a> class="descriptor-wrapper">
</div>

View File

@ -1,21 +1,39 @@
import ngModule from '../../module'; import ngModule from '../../module';
import Component from 'core/lib/component'; import Component from 'core/lib/component';
import './quick-links';
import './style.scss'; import './style.scss';
import './quick-links';
import './quick-link';
export default class Descriptor extends Component { export default class Descriptor extends Component {
set quicklinks(value = {}) { get entity() {
this._quicklinks = Object.assign(value, this._quicklinks); return this._entity;
}
set entity(value) {
this._entity = value;
} }
get quicklinks() { get quicklinks() {
return this._quicklinks; return this._quicklinks;
} }
set quicklinks(value = {}) {
this._quicklinks = Object.assign(value, this._quicklinks);
}
} }
Descriptor.$inject = ['$element', '$scope'/* , '$transclude'*/];
ngModule.vnComponent('vnDescriptor', { ngModule.vnComponent('vnDescriptor', {
template: require('./index.html'),
controller: Descriptor, controller: Descriptor,
bindings: { bindings: {
entity: '<?',
quicklinks: '<' quicklinks: '<'
}, },
transclude: {
body: '?slotBody',
btnOne: '?btnOne',
btnTwo: '?btnTwo',
btnThree: '?btnThree'
}
}); });

View File

@ -0,0 +1,8 @@
<a
ui-sref="{{$ctrl.state}}"
vn-tooltip="{{::$ctrl.tooltip}}"
class="vn-button colored">
<vn-icon
icon="{{::$ctrl.icon}}">
</vn-icon>
</a>

View File

@ -0,0 +1,13 @@
import ngModule from '../../module';
export default class QuickLink {}
ngModule.component('vnQuickLink', {
template: require('./quick-link.html'),
controller: QuickLink,
bindings: {
state: '@?',
icon: '@?',
tooltip: '@?'
}
});

View File

@ -2,7 +2,9 @@
@import "./effects"; @import "./effects";
@import "./variables"; @import "./variables";
.vn-descriptor { .vn-descriptor,
.vn-descriptor slot-body {
display: block;
box-shadow: 0 1px 3px $color-shadow; box-shadow: 0 1px 3px $color-shadow;
& > .header { & > .header {
@ -65,7 +67,11 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
& > a { & > a,
vn-quick-link > a {
display: flex;
align-items: center;
justify-content: center;
padding: 0 $spacing-md; padding: 0 $spacing-md;
margin: 0 $spacing-sm; margin: 0 $spacing-sm;

View File

@ -1,4 +1,6 @@
<vn-crud-model vn-id="model" auto-load="true" <vn-crud-model
vn-id="model"
auto-load="true"
url="ClaimDms" url="ClaimDms"
link="{claimFk: $ctrl.$params.id}" link="{claimFk: $ctrl.$params.id}"
limit="20" limit="20"
@ -17,7 +19,7 @@
<section class="actions"> <section class="actions">
<vn-button <vn-button
class="round" class="round"
ng-click="$ctrl.showDeleteConfirm($index)" ng-click="confirm.show($index)"
title="{{'Remove file' | translate}}" title="{{'Remove file' | translate}}"
tabindex="-1" tabindex="-1"
icon="delete"> icon="delete">
@ -25,19 +27,16 @@
</section> </section>
</section> </section>
</vn-horizontal> </vn-horizontal>
<vn-worker-descriptor-popover
vn-id="workerDescriptor">
</vn-worker-descriptor-popover>
<vn-confirm <vn-confirm
vn-id="confirm" vn-id="confirm"
message="This file will be deleted" message="This file will be deleted"
question="Are you sure you want to continue?" question="Are you sure you want to continue?"
on-response="$ctrl.deleteDms($response)"> on-accept="$ctrl.deleteDms($data)">
</vn-confirm> </vn-confirm>
<vn-float-button fixed-bottom-right <vn-float-button
icon="add" icon="add"
vn-tooltip="Select photo" vn-tooltip="Select photo"
vn-bind="+" vn-bind="+"
ng-click="$ctrl.openUploadDialog()"> ng-click="$ctrl.openUploadDialog()"
fixed-bottom-right>
</vn-float-button> </vn-float-button>

View File

@ -3,28 +3,13 @@ import Section from 'salix/components/section';
import './style.scss'; import './style.scss';
class Controller extends Section { class Controller extends Section {
showWorkerDescriptor(event, workerFk) { deleteDms(index) {
event.preventDefault(); const dmsFk = this.photos[index].dmsFk;
event.stopImmediatePropagation(); return this.$http.post(`ClaimDms/${dmsFk}/removeFile`)
this.$.workerDescriptor.parent = event.target; .then(() => {
this.$.workerDescriptor.workerFk = workerFk; this.$.model.remove(index);
this.$.workerDescriptor.show(); this.vnApp.showSuccess(this.$t('Photo deleted'));
}
showDeleteConfirm(index) {
this.dmsIndex = index;
this.$.confirm.show();
}
deleteDms(response) {
if (response === 'accept') {
const dmsFk = this.photos[this.dmsIndex].dmsFk;
const query = `claimDms/${dmsFk}/removeFile`;
this.$http.post(query).then(() => {
this.$.model.remove(this.dmsIndex);
this.vnApp.showSuccess(this.$translate.instant('Photo deleted'));
}); });
}
} }
onDrop($event) { onDrop($event) {
@ -36,10 +21,10 @@ class Controller extends Section {
} }
setDefaultParams() { setDefaultParams() {
const params = {filter: { const filter = {
where: {code: 'claim'} where: {code: 'claim'}
}}; };
return this.$http.get('DmsTypes/findOne', {params}).then(res => { return this.$http.get('DmsTypes/findOne', {filter}).then(res => {
const dmsTypeId = res.data && res.data.id; const dmsTypeId = res.data && res.data.id;
const companyId = this.vnConfig.companyFk; const companyId = this.vnConfig.companyFk;
const warehouseId = this.vnConfig.warehouseFk; const warehouseId = this.vnConfig.warehouseFk;
@ -50,7 +35,7 @@ class Controller extends Section {
warehouseId: warehouseId, warehouseId: warehouseId,
companyId: companyId, companyId: companyId,
dmsTypeId: dmsTypeId, dmsTypeId: dmsTypeId,
description: this.$translate.instant('FileDescription', { description: this.$t('FileDescription', {
claimId: this.claim.id, claimId: this.claim.id,
clientId: this.claim.client.id, clientId: this.claim.client.id,
clientName: this.claim.client.name clientName: this.claim.client.name
@ -91,7 +76,7 @@ class Controller extends Section {
data: this.dms.files data: this.dms.files
}; };
this.$http(options).then(() => { this.$http(options).then(() => {
this.vnApp.showSuccess(this.$translate.instant('Photo uploaded!')); this.vnApp.showSuccess(this.$t('Photo uploaded!'));
this.$.model.refresh(); this.$.model.refresh();
}); });
} }

View File

@ -6,16 +6,13 @@ describe('Claim', () => {
let $scope; let $scope;
let $httpBackend; let $httpBackend;
let controller; let controller;
let $httpParamSerializer;
beforeEach(ngModule('claim')); beforeEach(ngModule('claim'));
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_, _$httpParamSerializer_) => { beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => {
$httpParamSerializer = _$httpParamSerializer_;
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
const $element = angular.element('<vn-claim-photos></vn-claim-photos>'); controller = $componentController('vnClaimPhotos', {$element: null, $scope});
controller = $componentController('vnClaimPhotos', {$element, $scope});
controller.$.model = crudModel; controller.$.model = crudModel;
controller.claim = { controller.claim = {
id: 1, id: 1,
@ -25,31 +22,25 @@ describe('Claim', () => {
describe('deleteDms()', () => { describe('deleteDms()', () => {
it('should make an HTTP Post query', () => { it('should make an HTTP Post query', () => {
const dmsId = 1;
const dmsIndex = 0;
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
jest.spyOn(controller.$.model, 'remove'); jest.spyOn(controller.$.model, 'remove');
controller.photos = [{dmsFk: 1}];
controller.dmsIndex = dmsIndex;
$httpBackend.when('POST', `claimDms/${dmsId}/removeFile`).respond({}); const dmsId = 1;
$httpBackend.expect('POST', `claimDms/${dmsId}/removeFile`); const dmsIndex = 0;
controller.deleteDms('accept'); controller.photos = [{dmsFk: 1}];
$httpBackend.expectPOST(`ClaimDms/${dmsId}/removeFile`).respond();
controller.deleteDms(dmsIndex);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex); expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex);
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Photo deleted'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
describe('setDefaultParams()', () => { describe('setDefaultParams()', () => {
it('should make an HTTP GET query, then set all dms properties', () => { it('should make an HTTP GET query, then set all dms properties', () => {
const params = {filter: { $httpBackend.expectRoute('GET', `DmsTypes/findOne`).respond({});
where: {code: 'claim'}
}};
let serializedParams = $httpParamSerializer(params);
$httpBackend.when('GET', `DmsTypes/findOne?${serializedParams}`).respond({});
$httpBackend.expect('GET', `DmsTypes/findOne?${serializedParams}`);
controller.setDefaultParams(); controller.setDefaultParams();
$httpBackend.flush(); $httpBackend.flush();
@ -67,13 +58,12 @@ describe('Claim', () => {
controller.dmsIndex = dmsIndex; controller.dmsIndex = dmsIndex;
controller.dms = {files: []}; controller.dms = {files: []};
$httpBackend.when('POST', `claims/${claimId}/uploadFile`).respond({}); $httpBackend.expectPOST(`claims/${claimId}/uploadFile`).respond({});
$httpBackend.expect('POST', `claims/${claimId}/uploadFile`);
controller.create(); controller.create();
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.refresh).toHaveBeenCalledWith(); expect(controller.$.model.refresh).toHaveBeenCalled();
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Photo uploaded!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -1,9 +1,13 @@
<div class="vn-descriptor"> <slot-body>
<div class="header"> <div class="header">
<a translate-attr="{title: 'Return to module index'}" ui-sref="client.index"> <a
translate-attr="{title: 'Return to module index'}"
ui-sref="client.index">
<vn-icon icon="chevron_left"></vn-icon> <vn-icon icon="chevron_left"></vn-icon>
</a> </a>
<a translate-attr="{title: 'Preview'}" ui-sref="client.card.summary({id: $ctrl.client.id})"> <a
translate-attr="{title: 'Preview'}"
ui-sref="client.card.summary({id: $ctrl.client.id})">
<vn-icon icon="desktop_windows"></vn-icon> <vn-icon icon="desktop_windows"></vn-icon>
</a> </a>
<vn-icon-button <vn-icon-button
@ -62,17 +66,23 @@
ng-class="{bright: $ctrl.client.isTaxDataChecked == false}"> ng-class="{bright: $ctrl.client.isTaxDataChecked == false}">
</vn-icon> </vn-icon>
</div> </div>
<div class="quicklinks"> <div class="quicklinks" >
<a class="vn-button colored" <div ng-transclude="btnOne">
vn-tooltip="Client ticket list" <vn-quick-link
ui-sref="ticket.index({q: $ctrl.filter})"> tooltip="Client ticket list"
<vn-icon icon="icon-ticket"></vn-icon> state="ticket.index({ q: '{{ {clientFk: $ctrl.client.id} }}' })"
</a> icon="icon-ticket">
<a class="vn-button colored" </vn-quick-link>
vn-tooltip="New order" </div>
ui-sref="order.create({clientFk: $ctrl.client.id})"> <div ng-transclude="btnTwo">
<vn-icon icon="icon-basketadd"></vn-icon> <vn-quick-link
</a> tooltip="New order"
state="order.create({ clientFk: {{ $ctrl.client.id }} })"
icon="icon-basketadd">
</vn-quick-link>
</div>
<div ng-transclude="btnThree">
</div>
</div> </div>
<!-- <!--
<vn-quick-links <vn-quick-links
@ -80,61 +90,61 @@
</vn-quick-links> </vn-quick-links>
--> -->
</div> </div>
</div> <vn-menu vn-id="menu">
<vn-menu vn-id="menu"> <ul class="vn-list">
<ul class="vn-list"> <li>
<li> <a class="vn-item"
<a class="vn-item" ui-sref="ticket.create({clientFk: $ctrl.client.id})"
ui-sref="ticket.create({clientFk: $ctrl.client.id})" translate>
translate> Simple ticket
Simple ticket </a>
</a> </li>
</li> <li>
<li> <div class="vn-item"
<div class="vn-item" ng-click="$ctrl.showSMSDialog()"
ng-click="$ctrl.showSMSDialog()" translate>
translate> Send SMS
Send SMS </div>
</div> </li>
</li> <li>
<li> <div class="vn-item"
<div class="vn-item" ng-click="consumerReportDialog.show()"
ng-click="consumerReportDialog.show()" translate>
translate> Send consumer report
Send consumer report </div>
</div> </li>
</li> </ul>
</ul> </vn-menu>
</vn-menu> <vn-client-sms
<vn-client-sms vn-id="sms"
vn-id="sms" sms="$ctrl.newSMS">
sms="$ctrl.newSMS"> </vn-client-sms>
</vn-client-sms> <vn-dialog
<vn-dialog vn-id="consumerReportDialog"
vn-id="consumerReportDialog" on-accept="$ctrl.onConsumerReportAccept()">
on-accept="$ctrl.onConsumerReportAccept()"> <tpl-body>
<tpl-body> <div>
<div> <h5 style="text-align: center">
<h5 style="text-align: center"> <span translate>Send consumer report</span>
<span translate>Send consumer report</span> </h5>
</h5> <vn-date-picker
<vn-date-picker vn-id="from"
vn-id="from" vn-one
vn-one ng-model="$ctrl.from"
ng-model="$ctrl.from" label="From date"
label="From date" vn-focus>
vn-focus> </vn-date-picker>
<vn-date-picker
vn-id="to"
vn-one
ng-model="$ctrl.to"
label="To date">
</vn-date-picker> </vn-date-picker>
<vn-date-picker </div>
vn-id="to" </tpl-body>
vn-one <tpl-buttons>
ng-model="$ctrl.to" <input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
label="To date"> <button response="accept" translate>Accept</button>
</vn-date-picker> </tpl-buttons>
</div> </vn-dialog>
</tpl-body> </slot-body>
<tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
<button response="accept" translate>Accept</button>
</tpl-buttons>
</vn-dialog>

View File

@ -2,17 +2,17 @@ import ngModule from '../module';
import Descriptor from 'salix/components/descriptor'; import Descriptor from 'salix/components/descriptor';
class Controller extends Descriptor { class Controller extends Descriptor {
constructor($element, $, $httpParamSerializer) { constructor($element, $, $transclude, $httpParamSerializer) {
super($element, $); super($element, $, $transclude);
this.$httpParamSerializer = $httpParamSerializer; this.$httpParamSerializer = $httpParamSerializer;
} }
get client() { get client() {
return this._client; return this.entity;
} }
set client(value) { set client(value) {
this._client = value; this.entity = value;
if (!value) return; if (!value) return;
if (this.$params.sendSMS) if (this.$params.sendSMS)
@ -33,7 +33,7 @@ class Controller extends Descriptor {
} }
get filter() { get filter() {
return this.client ? JSON.stringify({clientFk: this.client.id}) : null; return JSON.stringify({clientFk: this.client.id});
} }
showSMSDialog() { showSMSDialog() {
@ -56,11 +56,10 @@ class Controller extends Descriptor {
window.open(`api/report/campaign-metrics?${params}`); window.open(`api/report/campaign-metrics?${params}`);
} }
} }
Controller.$inject = ['$element', '$scope', '$transclude', '$httpParamSerializer'];
Controller.$inject = ['$element', '$scope', '$httpParamSerializer'];
ngModule.vnComponent('vnClientDescriptor', { ngModule.vnComponent('vnClientDescriptor', {
template: require('./index.html'), slotTemplate: require('./index.html'),
bindings: { bindings: {
client: '<' client: '<'
}, },

View File

@ -62,7 +62,7 @@
</vn-td> </vn-td>
<vn-td shrink> <vn-td shrink>
<span class="link" <span class="link"
ng-click="$ctrl.showWorkerDescriptor($event, document.dms.workerFk)"> ng-click="workerDescriptor.show($event, document.dms.workerFk)">
{{::document.dms.worker.user.nickname | dashIfEmpty}} {{::document.dms.worker.user.nickname | dashIfEmpty}}
</span></vn-td> </span></vn-td>
<vn-td> <vn-td>
@ -86,7 +86,7 @@
<vn-td shrink> <vn-td shrink>
<vn-icon-button <vn-icon-button
icon="delete" icon="delete"
ng-click="$ctrl.showDeleteConfirm($index)" ng-click="confirm.show($index)"
title="{{'Remove file' | translate}}" title="{{'Remove file' | translate}}"
tabindex="-1"> tabindex="-1">
</vn-icon-button> </vn-icon-button>
@ -109,5 +109,5 @@
vn-id="confirm" vn-id="confirm"
message="This file will be deleted" message="This file will be deleted"
question="Are you sure you want to continue?" question="Are you sure you want to continue?"
on-response="$ctrl.deleteDms($response)"> on-accept="$ctrl.deleteDms($data)">
</vn-confirm> </vn-confirm>

View File

@ -24,8 +24,7 @@ class Controller extends Section {
scope: { scope: {
fields: ['name'] fields: ['name']
} }
}, }, {
{
relation: 'worker', relation: 'worker',
scope: { scope: {
fields: ['userFk'], fields: ['userFk'],
@ -42,28 +41,13 @@ class Controller extends Section {
}; };
} }
showWorkerDescriptor(event, workerFk) { deleteDms(index) {
event.preventDefault(); const dmsFk = this.clientDms[index].dmsFk;
event.stopImmediatePropagation(); return this.$http.post(`ClientDms/${dmsFk}/removeFile`)
this.$.workerDescriptor.parent = event.target; .then(() => {
this.$.workerDescriptor.workerFk = workerFk; this.$.model.remove(index);
this.$.workerDescriptor.show(); this.vnApp.showSuccess(this.$t('Data saved!'));
}
showDeleteConfirm(index) {
this.dmsIndex = index;
this.$.confirm.show();
}
deleteDms(response) {
if (response === 'accept') {
const dmsFk = this.clientDms[this.dmsIndex].dmsFk;
const query = `clientDms/${dmsFk}/removeFile`;
this.$http.post(query).then(() => {
this.$.model.remove(this.dmsIndex);
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
}); });
}
} }
} }

View File

@ -12,27 +12,25 @@ describe('Client', () => {
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => { beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
const $element = angular.element('<vn-client-dms-index></vn-client-dms-index>'); controller = $componentController('vnClientDmsIndex', {$element: null, $scope});
controller = $componentController('vnClientDmsIndex', {$element, $scope});
controller.$.model = crudModel; controller.$.model = crudModel;
})); }));
describe('deleteDms()', () => { describe('deleteDms()', () => {
it('should make an HTTP Post query', () => { it('should make an HTTP Post query', () => {
const dmsId = 1;
const dmsIndex = 0;
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
jest.spyOn(controller.$.model, 'remove'); jest.spyOn(controller.$.model, 'remove');
controller.clientDms = [{dmsFk: 1}];
controller.dmsIndex = dmsIndex;
$httpBackend.when('POST', `clientDms/${dmsId}/removeFile`).respond({}); const dmsId = 1;
$httpBackend.expect('POST', `clientDms/${dmsId}/removeFile`); const dmsIndex = 0;
controller.deleteDms('accept'); controller.clientDms = [{dmsFk: 1}];
$httpBackend.expectPOST(`ClientDms/${dmsId}/removeFile`).respond();
controller.deleteDms(dmsIndex);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex); expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex);
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -29,9 +29,10 @@
{{::sample.type.description}} {{::sample.type.description}}
</vn-td> </vn-td>
<vn-td> <vn-td>
<span class="link" <span
ng-click="$ctrl.showWorkerDescriptor($event, sample.worker.id)"> ng-click="workerDescriptor.show($event, sample.worker.id)"
{{::sample.worker.user.nickname}} class="link">
{{::sample.worker.user.nickname}}
</span> </span>
</vn-td> </vn-td>
<vn-td>{{::sample.company.code}}</vn-td> <vn-td>{{::sample.company.code}}</vn-td>

View File

@ -11,8 +11,7 @@ class Controller extends Section {
scope: { scope: {
fields: ['code', 'description'] fields: ['code', 'description']
} }
}, }, {
{
relation: 'worker', relation: 'worker',
scope: { scope: {
fields: ['userFk'], fields: ['userFk'],
@ -23,8 +22,7 @@ class Controller extends Section {
} }
} }
} }
}, }, {
{
relation: 'company', relation: 'company',
scope: { scope: {
fields: ['code'] fields: ['code']
@ -33,20 +31,8 @@ class Controller extends Section {
] ]
}; };
} }
showWorkerDescriptor(event, workerFk) {
if (event.defaultPrevented) return;
event.preventDefault();
event.stopImmediatePropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
} }
Controller.$inject = ['$element', '$scope'];
ngModule.component('vnClientSampleIndex', { ngModule.component('vnClientSampleIndex', {
template: require('./index.html'), template: require('./index.html'),
controller: Controller controller: Controller

View File

@ -43,7 +43,7 @@
<vn-td center> <vn-td center>
<span <span
class="link" class="link"
ng-click="$ctrl.showTravelDescriptor($event, entry.travelFk)"> vn-click-stop="travelDescriptor.show($event, entry.travelFk)">
{{::entry.landed | date:'dd/MM/yyyy'}} {{::entry.landed | date:'dd/MM/yyyy'}}
</span> </span>
</vn-td> </vn-td>
@ -64,15 +64,8 @@
</a> </a>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
</vn-data-viewer>
</vn-card> </vn-card>
</vn-data-viewer>
<vn-travel-descriptor-popover <vn-travel-descriptor-popover
vn-id="travelDescriptor" vn-id="travelDescriptor">
travel-id="$ctrl.selectedTravel"> </vn-travel-descriptor-popover>
</vn-travel-descriptor-popover>
<vn-popup vn-id="summary">
<vn-entry-summary
entry="$ctrl.entrySelected">
</vn-entry-summary>
</vn-popup>
<vn-scroll-up></vn-scroll-up>

View File

@ -1,17 +1,8 @@
import ngModule from '../module'; import ngModule from '../module';
import Section from 'salix/components/section'; import Section from 'salix/components/section';
import './style.scss'; import './style.scss';
export default class Controller extends Section {
showTravelDescriptor(event, travelFk) {
if (event.defaultPrevented) return;
event.preventDefault();
event.stopPropagation();
this.selectedTravel = travelFk; export default class Controller extends Section {}
this.$.travelDescriptor.parent = event.target;
this.$.travelDescriptor.show();
}
}
ngModule.component('vnEntryIndex', { ngModule.component('vnEntryIndex', {
template: require('./index.html'), template: require('./index.html'),

View File

@ -1,5 +1,5 @@
@import "variables"; @import "variables";
vn-icon[icon=insert_drive_file]{ vn-icon[icon=insert_drive_file] {
color: $color-font-secondary; color: $color-font-secondary;
} }

View File

@ -3,18 +3,18 @@
url="TicketRequests/filter" url="TicketRequests/filter"
limit="20" limit="20"
data="requests" data="requests"
order="shipped DESC, isOk ASC"> order="shipped DESC, isOk ASC"
auto-load="true">
</vn-crud-model> </vn-crud-model>
<vn-portal slot="topbar"> <vn-portal slot="topbar">
<vn-searchbar vn-focus <vn-searchbar
panel="vn-request-search-panel" panel="vn-request-search-panel"
suggested-filter="$ctrl.filter.where" suggested-filter="$ctrl.filter.where"
info="Search request by id or alias"> info="Search request by id or alias"
model="model"
auto-state="false">
</vn-searchbar> </vn-searchbar>
</vn-portal> </vn-portal>
<vn-auto-search
on-search="$ctrl.onSearch($params)">
</vn-auto-search>
<vn-data-viewer model="model"> <vn-data-viewer model="model">
<vn-card> <vn-card>
<vn-table model="model"> <vn-table model="model">
@ -36,7 +36,7 @@
<vn-tr ng-repeat="request in requests"> <vn-tr ng-repeat="request in requests">
<vn-td number> <vn-td number>
<span class="link" <span class="link"
ng-click="$ctrl.showTicketDescriptor($event, request.ticketFk)"> ng-click="ticketDescriptor.show($event, request.ticketFk)">
{{request.ticketFk}} {{request.ticketFk}}
</span> </span>
</vn-td> </vn-td>
@ -52,7 +52,7 @@
<vn-td> <vn-td>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, request.attenderFk)"> ng-click="workerDescriptor.show($event, request.attenderFk)">
{{::request.atenderNickname}} {{::request.atenderNickname}}
</span> </span>
</vn-td> </vn-td>
@ -76,7 +76,7 @@
<vn-td expand> <vn-td expand>
<span <span
class="link" class="link"
ng-click="$ctrl.showItemDescriptor($event, request.itemFk)" ng-click="itemDescriptor.show($event, request.itemFk)"
title="{{request.itemDescription}}"> title="{{request.itemDescription}}">
{{request.itemDescription}} {{request.itemDescription}}
</span> </span>
@ -111,16 +111,17 @@
vn-id="itemDescriptor"> vn-id="itemDescriptor">
</vn-item-descriptor-popover> </vn-item-descriptor-popover>
<vn-dialog <vn-dialog
vn-id="deny-dialog" vn-id="denyDialog"
on-accept="$ctrl.onDenyAccept($data)" on-accept="$ctrl.onDenyAccept($data)"
on-close="$ctrl.onDenyClose()"> on-close="$ctrl.denyObservation = null">
<tpl-title translate>
Specify the reasons to deny this request
</tpl-title>
<tpl-body> <tpl-body>
<h5 class="vn-pa-md" translate>Specify the reasons to deny this request</h5> <vn-textarea
<vn-horizontal class="vn-pa-md"> ng-model="$ctrl.denyObservation"
<vn-textarea vn-focus vn-focus>
ng-model="$ctrl.denyObservation"> </vn-textarea>
</vn-textarea>
</vn-horizontal>
</tpl-body> </tpl-body>
<tpl-buttons> <tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/> <input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>

View File

@ -25,11 +25,6 @@ export default class Controller extends Section {
} }
} }
$postLink() {
if (this.filter)
this.onSearch(this.filter);
}
getState(isOk) { getState(isOk) {
if (isOk === null) if (isOk === null)
return 'Nueva'; return 'Nueva';
@ -62,11 +57,11 @@ export default class Controller extends Section {
quantity: request.saleQuantity quantity: request.saleQuantity
}; };
let endpoint = `Sales/${request.saleFk}/`; let endpoint = `Sales/${request.saleFk}`;
this.$http.patch(endpoint, params).then(() => { this.$http.patch(endpoint, params)
this.vnApp.showSuccess(this.$t('Data saved!')); .then(() => this.vnApp.showSuccess(this.$t('Data saved!')))
}).then(() => this.confirmRequest(request)); .then(() => this.confirmRequest(request));
} else } else
this.confirmRequest(request); this.confirmRequest(request);
} }
@ -85,69 +80,20 @@ export default class Controller extends Section {
return 'success'; return 'success';
} }
onSearch(params) {
if (params)
this.$.model.applyFilter(null, params);
else
this.$.model.clear();
}
showDenyReason(event, requestId) {
this.selectedRequest = requestId;
this.$.denyReason.parent = event.target;
this.$.denyReason.show();
}
clear() {
delete this.denyRequestId;
}
onDenyAccept(request) { onDenyAccept(request) {
let params = { let params = {
observation: this.denyObservation observation: this.denyObservation
}; };
let query = `TicketRequests/${request.id}/deny`; return this.$http.post(`TicketRequests/${request.id}/deny`, params)
return this.$http.post(query, params).then(res => { .then(res => {
const newRequest = res.data; const newRequest = res.data;
request.isOk = newRequest.isOk; request.isOk = newRequest.isOk;
request.attenderFk = newRequest.attenderFk; request.attenderFk = newRequest.attenderFk;
request.response = newRequest.response; request.response = newRequest.response;
this.vnApp.showSuccess(this.$t('Data saved!')); this.vnApp.showSuccess(this.$t('Data saved!'));
}); });
}
onDenyClose() {
this.denyObservation = null;
}
showTicketDescriptor(event, ticketFk) {
this.$.ticketDescriptor.ticketFk = ticketFk;
this.$.ticketDescriptor.parent = event.target;
this.$.ticketDescriptor.show();
event.preventDefault();
event.stopImmediatePropagation();
}
showItemDescriptor(event, itemFk) {
this.$.itemDescriptor.itemFk = itemFk;
this.$.itemDescriptor.parent = event.target;
this.$.itemDescriptor.show();
}
showWorkerDescriptor(event, workerFk) {
this.$.workerDescriptor.workerFk = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
preventNavigation(event) {
event.preventDefault();
} }
} }

View File

@ -1,5 +1,4 @@
import './index.js'; import './index.js';
import crudModel from 'core/mocks/crud-model';
describe('Item', () => { describe('Item', () => {
describe('Component vnItemRequest', () => { describe('Component vnItemRequest', () => {
@ -12,10 +11,7 @@ describe('Item', () => {
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => { beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
$scope.model = crudModel; controller = $componentController('vnItemRequest', {$element: null, $scope});
$scope.denyReason = {hide: () => {}};
const $element = angular.element('<vn-item-request></vn-item-request>');
controller = $componentController('vnItemRequest', {$element, $scope});
})); }));
afterAll(() => { afterAll(() => {
@ -49,23 +45,20 @@ describe('Item', () => {
controller.confirmRequest(request); controller.confirmRequest(request);
expect(controller.vnApp.showSuccess).not.toHaveBeenCalledWith(); expect(controller.vnApp.showSuccess).not.toHaveBeenCalled();
}); });
it('should perform a query and call vnApp.showSuccess() and refresh if the conditions are met', () => { it('should perform a query and call vnApp.showSuccess() and refresh if the conditions are met', () => {
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
let model = controller.$.model;
jest.spyOn(model, 'refresh');
const expectedResult = {concept: 'Melee Weapon'}; const expectedResult = {concept: 'Melee Weapon'};
let request = {itemFk: 1, saleQuantity: 1, id: 1}; let request = {itemFk: 1, saleQuantity: 1, id: 1};
$httpBackend.when('POST', `TicketRequests/${request.id}/confirm`).respond(expectedResult); $httpBackend.expectPOST(`TicketRequests/${request.id}/confirm`).respond(expectedResult);
$httpBackend.expect('POST', `TicketRequests/${request.id}/confirm`).respond(expectedResult);
controller.confirmRequest(request); controller.confirmRequest(request);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
@ -83,19 +76,17 @@ describe('Item', () => {
let request = {saleFk: 1, saleQuantity: 1}; let request = {saleFk: 1, saleQuantity: 1};
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
$httpBackend.when('PATCH', `Sales/${request.saleFk}/`).respond(); $httpBackend.expectPATCH(`Sales/${request.saleFk}`).respond();
$httpBackend.expect('PATCH', `Sales/${request.saleFk}/`).respond();
controller.changeQuantity(request); controller.changeQuantity(request);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
describe('compareDate()', () => { describe('compareDate()', () => {
it(`should return "success" if receives a future date`, () => { it(`should return "success" if receives a future date`, () => {
let date = '3019-02-18T11:00:00.000Z'; let date = '3019-02-18T11:00:00.000Z';
let result = controller.compareDate(date); let result = controller.compareDate(date);
expect(result).toEqual('success'); expect(result).toEqual('success');
@ -103,7 +94,6 @@ describe('Item', () => {
it(`should return "warning" if date is today`, () => { it(`should return "warning" if date is today`, () => {
let date = new Date(); let date = new Date();
let result = controller.compareDate(date); let result = controller.compareDate(date);
expect(result).toEqual('warning'); expect(result).toEqual('warning');
@ -117,9 +107,8 @@ describe('Item', () => {
response: 'new' response: 'new'
}; };
const url = `TicketRequests/:id/deny`; $httpBackend.expectPOST(`TicketRequests/${request.id}/deny`)
$httpBackend.expectRoute('POST', url).respond({response: 'denied'}); .respond({response: 'denied'});
controller.onDenyAccept(request); controller.onDenyAccept(request);
$httpBackend.flush(); $httpBackend.flush();

View File

@ -37,7 +37,7 @@
on-error-src/> on-error-src/>
</vn-td> </vn-td>
<vn-td number> <vn-td number>
<span ng-click="$ctrl.showDescriptor($event, row.itemFk)" <span ng-click="descriptor.show($event, row.itemFk)"
class="link"> class="link">
{{::row.itemFk | zeroFill:6}} {{::row.itemFk | zeroFill:6}}
</span> </span>

View File

@ -48,13 +48,6 @@ class Controller extends Section {
.then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
} }
showDescriptor(event, itemFk) {
let descriptor = this.$.descriptor;
descriptor.itemFk = itemFk;
descriptor.parent = event.target;
descriptor.show();
}
save() { save() {
this.$http.post(`Orders/${this.$params.id}/confirm`).then(() => { this.$http.post(`Orders/${this.$params.id}/confirm`).then(() => {
this.vnApp.showSuccess(this.$t('Order confirmed')); this.vnApp.showSuccess(this.$t('Order confirmed'));

View File

@ -6,7 +6,8 @@ describe('Order', () => {
let controller; let controller;
let $httpBackend; let $httpBackend;
let rows = [ const vat = 10.5;
const rows = [
{ {
quantity: 4, quantity: 4,
price: 10.5 price: 10.5
@ -23,11 +24,10 @@ describe('Order', () => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$state.params.id = 1; $state.params.id = 1;
$httpBackend.whenRoute('GET', `OrderRows`).respond(rows); $httpBackend.whenGET(`OrderRows`).respond(rows);
$httpBackend.whenRoute('GET', `Orders/:id/getVAT`).respond(200, 10.5); $httpBackend.whenRoute('GET', `Orders/:id/getVAT`).respond(200, vat);
let $element = angular.element('<div></div>'); controller = $componentController('vnOrderLine', {$element: null});
controller = $componentController('vnOrderLine', {$element});
})); }));
describe('getRows()', () => { describe('getRows()', () => {
@ -35,7 +35,7 @@ describe('Order', () => {
controller.getRows(); controller.getRows();
$httpBackend.flush(); $httpBackend.flush();
expect(controller.rows).toBeDefined(); expect(controller.rows).toEqual(rows);
}); });
}); });
@ -44,7 +44,7 @@ describe('Order', () => {
controller.getVAT(); controller.getVAT();
$httpBackend.flush(); $httpBackend.flush();
expect(controller.VAT).toBeDefined(); expect(controller.VAT).toBe(vat);
}); });
}); });
@ -59,7 +59,7 @@ describe('Order', () => {
$httpBackend.flush(); $httpBackend.flush();
expect(controller.rows.length).toBe(1); expect(controller.rows.length).toBe(1);
expect(controller.card.reload).toHaveBeenCalledWith(); expect(controller.card.reload).toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -63,7 +63,7 @@
</vn-td> </vn-td>
<vn-td shrink> <vn-td shrink>
<span <span
ng-click="$ctrl.showDescriptor($event, row.itemFk)" ng-click="descriptor.show($event, row.itemFk)"
class="link"> class="link">
{{::row.itemFk | zeroFill:6}} {{::row.itemFk | zeroFill:6}}
</span> </span>

View File

@ -4,10 +4,8 @@ import './style.scss';
class Controller extends Section { class Controller extends Section {
setSummary() { setSummary() {
this.$http.get(`Orders/${this.order.id}/summary`).then(res => { this.$http.get(`Orders/${this.order.id}/summary`)
if (res && res.data) .then(res => this.summary = res.data);
this.summary = res.data;
});
} }
get formattedAddress() { get formattedAddress() {
@ -23,16 +21,6 @@ class Controller extends Section {
if (this.order && this.order.id) if (this.order && this.order.id)
this.setSummary(); this.setSummary();
} }
showDescriptor(event, itemFk) {
this.$.descriptor.itemFk = itemFk;
this.$.descriptor.parent = event.target;
this.$.descriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnOrderSummary', { ngModule.component('vnOrderSummary', {

View File

@ -16,14 +16,15 @@ describe('Order', () => {
describe('getSummary()', () => { describe('getSummary()', () => {
it('should now perform a GET query and define the summary property', () => { it('should now perform a GET query and define the summary property', () => {
let res = {id: 1, nickname: 'Batman'}; let res = {
$httpBackend.when('GET', `Orders/1/summary`).respond(200, res); id: 1,
$httpBackend.expect('GET', `Orders/1/summary`); nickname: 'Batman'
};
$httpBackend.expectGET(`Orders/1/summary`).respond(res);
controller.setSummary(); controller.setSummary();
$httpBackend.flush(); $httpBackend.flush();
expect(controller.summary).toBeDefined(); expect(controller.summary).toEqual(res);
expect(controller.summary.nickname).toEqual('Batman');
}); });
}); });

View File

@ -34,7 +34,7 @@
<vn-tr ng-repeat="row in rows"> <vn-tr ng-repeat="row in rows">
<vn-td number> <vn-td number>
<span <span
ng-click="$ctrl.showDescriptor($event, row.itemFk)" ng-click="descriptor.show($event, row.itemFk)"
class="link"> class="link">
{{::row.itemFk}} {{::row.itemFk}}
</span> </span>

View File

@ -16,27 +16,15 @@ class Controller extends Section {
onDataChange() { onDataChange() {
this.$http.get(`Orders/${this.$params.id}/getVolumes`) this.$http.get(`Orders/${this.$params.id}/getVolumes`)
.then(response => { .then(res => {
if (response.data) { this.$.model.data.forEach(order => {
this.$.model.data.forEach(order => { res.data.volumes.forEach(volume => {
response.data.volumes.forEach(volume => { if (order.itemFk === volume.itemFk)
if (order.itemFk === volume.itemFk) order.volume = volume.volume;
order.volume = volume.volume;
});
}); });
} });
}); });
} }
showDescriptor(event, itemFk) {
this.$.descriptor.itemFk = itemFk;
this.$.descriptor.parent = event.target;
this.$.descriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnOrderVolume', { ngModule.component('vnOrderVolume', {

View File

@ -4,58 +4,39 @@ describe('Order', () => {
describe('Component vnOrderVolume', () => { describe('Component vnOrderVolume', () => {
let controller; let controller;
let $httpBackend; let $httpBackend;
let $state;
let $scope; let $scope;
beforeEach(ngModule('order')); beforeEach(ngModule('order'));
beforeEach(angular.mock.inject(($componentController, _$state_, _$httpBackend_, $rootScope) => { beforeEach(angular.mock.inject(($componentController, $state, _$httpBackend_, $rootScope) => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
$scope.model = {data: [{itemFk: 1}, {itemFk: 2}], accept: () => { $scope.model = {
return { data: [
then: () => {} {itemFk: 1},
}; {itemFk: 2}
}}; ]
$scope.descriptor = {show: () => {}}; };
$scope.popover = {relocate: () => {}};
$state = _$state_;
$state.params.id = 1; $state.params.id = 1;
const $element = angular.element('<vn-order-volume></vn-order-volume>'); const $element = angular.element('<vn-order-volume></vn-order-volume>');
controller = $componentController('vnOrderVolume', {$element, $scope}); controller = $componentController('vnOrderVolume', {$element, $scope});
})); }));
it('should join the sale volumes to its respective sale', () => { it('should join the sale volumes to its respective sale', () => {
let response = {volumes: [{itemFk: 1, volume: 0.008}, {itemFk: 2, volume: 0.003}]}; let response = {
$httpBackend.whenGET(`Orders/1/getVolumes`).respond(response); volumes: [
$httpBackend.expectGET(`Orders/1/getVolumes`); {itemFk: 1, volume: 0.008},
{itemFk: 2, volume: 0.003}
]
};
$httpBackend.expectGET(`Orders/1/getVolumes`).respond(response);
controller.onDataChange(); controller.onDataChange();
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.data[0].volume).toBe(0.008); expect(controller.$.model.data[0].volume).toBe(0.008);
expect(controller.$.model.data[1].volume).toBe(0.003); expect(controller.$.model.data[1].volume).toBe(0.003);
}); });
describe('showDescriptor()', () => {
it('should set $scope.descriptor.itemFk, $scope.descriptor.parent and call $scope.descriptor.show()', () => {
let event = {target: 1};
let itemFk = 1;
jest.spyOn(controller.$.descriptor, 'show');
controller.showDescriptor(event, itemFk);
expect(controller.$.descriptor.itemFk).toBe(1);
expect(controller.$.descriptor.parent).toBe(1);
expect(controller.$.descriptor.show).toHaveBeenCalledWith();
});
});
describe('onDescriptorLoad()', () => {
it('should call $scope.popover.relocate()', () => {
jest.spyOn(controller.$.popover, 'relocate');
controller.onDescriptorLoad();
expect(controller.$.popover.relocate).toHaveBeenCalledWith();
});
});
}); });
}); });

View File

@ -26,7 +26,7 @@
<vn-td expand> <vn-td expand>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, route.workerFk)"> vn-click-stop="workerDescriptor.show($event, route.workerFk)">
{{::route.workerNickname}} {{::route.workerNickname}}
</span> </span>
</vn-td> </vn-td>
@ -37,7 +37,7 @@
<vn-td>{{::route.description | dashIfEmpty}}</vn-td> <vn-td>{{::route.description | dashIfEmpty}}</vn-td>
<vn-td> <vn-td>
<vn-icon-button <vn-icon-button
ng-click="$ctrl.preview($event, route)" vn-click-stop="$ctrl.preview(route)"
vn-tooltip="Preview" vn-tooltip="Preview"
icon="desktop_windows"> icon="desktop_windows">
</vn-icon-button> </vn-icon-button>
@ -60,5 +60,4 @@
vn-bind="+" vn-bind="+"
fixed-bottom-right> fixed-bottom-right>
<vn-float-button icon="add"></vn-float-button> <vn-float-button icon="add"></vn-float-button>
</a> </a>
<vn-scroll-up></vn-scroll-up>

View File

@ -2,21 +2,7 @@ import ngModule from '../module';
import Section from 'salix/components/section'; import Section from 'salix/components/section';
export default class Controller extends Section { export default class Controller extends Section {
showWorkerDescriptor(event, workerFk) { preview(route) {
if (event.defaultPrevented) return;
event.preventDefault();
event.stopPropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
preview(event, route) {
if (event.defaultPrevented) return;
event.preventDefault();
event.stopPropagation();
this.routeSelected = route; this.routeSelected = route;
this.$.summary.show(); this.$.summary.show();
} }

View File

@ -9,8 +9,7 @@ class Controller extends Section {
order: 'concept ASC', order: 'concept ASC',
include: [{ include: [{
relation: 'item', relation: 'item',
}, }, {
{
relation: 'components', relation: 'components',
scope: { scope: {
fields: ['componentFk', 'value'], fields: ['componentFk', 'value'],

View File

@ -60,7 +60,7 @@
</vn-td> </vn-td>
<vn-td shrink> <vn-td shrink>
<span class="link" <span class="link"
ng-click="$ctrl.showWorkerDescriptor($event, document.dms.workerFk)"> ng-click="workerDescriptor.show($event, document.dms.workerFk)">
{{::document.dms.worker.user.nickname | dashIfEmpty}} {{::document.dms.worker.user.nickname | dashIfEmpty}}
</span></vn-td> </span></vn-td>
<vn-td> <vn-td>
@ -83,7 +83,7 @@
</vn-td> </vn-td>
<vn-td shrink> <vn-td shrink>
<vn-icon-button icon="delete" <vn-icon-button icon="delete"
ng-click="$ctrl.showDeleteConfirm($index)" ng-click="confirm.show($index)"
title="{{'Remove file' | translate}}" title="{{'Remove file' | translate}}"
tabindex="-1"> tabindex="-1">
</vn-icon-button> </vn-icon-button>
@ -106,5 +106,5 @@
vn-id="confirm" vn-id="confirm"
message="This file will be deleted" message="This file will be deleted"
question="Are you sure you want to continue?" question="Are you sure you want to continue?"
on-response="$ctrl.deleteDms($response)"> on-accept="$ctrl.deleteDms($data)">
</vn-confirm> </vn-confirm>

View File

@ -42,28 +42,13 @@ class Controller extends Section {
}; };
} }
showWorkerDescriptor(event, workerFk) { deleteDms(index) {
event.preventDefault(); const dmsFk = this.ticketDms[index].dmsFk;
event.stopImmediatePropagation(); this.$http.post(`ticketDms/${dmsFk}/removeFile`)
this.$.workerDescriptor.parent = event.target; .then(() => {
this.$.workerDescriptor.workerFk = workerFk; this.$.model.remove(index);
this.$.workerDescriptor.show(); this.vnApp.showSuccess(this.$t('Data saved!'));
}
showDeleteConfirm(index) {
this.dmsIndex = index;
this.$.confirm.show();
}
deleteDms(response) {
if (response === 'accept') {
const dmsFk = this.ticketDms[this.dmsIndex].dmsFk;
const query = `ticketDms/${dmsFk}/removeFile`;
this.$http.post(query).then(() => {
this.$.model.remove(this.dmsIndex);
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
}); });
}
} }
} }

View File

@ -10,27 +10,25 @@ describe('Ticket', () => {
beforeEach(angular.mock.inject(($componentController, _$httpBackend_) => { beforeEach(angular.mock.inject(($componentController, _$httpBackend_) => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
const $element = angular.element('<vn-ticket-dms-index></vn-ticket-dms-index>'); controller = $componentController('vnTicketDmsIndex', {$element: null});
controller = $componentController('vnTicketDmsIndex', {$element});
controller.$.model = crudModel; controller.$.model = crudModel;
})); }));
describe('deleteDms()', () => { describe('deleteDms()', () => {
it('should make an HTTP Post query', () => { it('should make an HTTP Post query', () => {
const dmsId = 1;
const dmsIndex = 0;
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
jest.spyOn(controller.$.model, 'remove'); jest.spyOn(controller.$.model, 'remove');
controller.ticketDms = [{dmsFk: 1}];
controller.dmsIndex = dmsIndex;
$httpBackend.when('POST', `ticketDms/${dmsId}/removeFile`).respond({}); const dmsId = 1;
$httpBackend.expect('POST', `ticketDms/${dmsId}/removeFile`); const dmsIndex = 0;
controller.deleteDms('accept'); controller.ticketDms = [{dmsFk: 1}];
$httpBackend.expectPOST(`ticketDms/${dmsId}/removeFile`).respond({});
controller.deleteDms(dmsIndex);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex); expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex);
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -28,7 +28,7 @@
<vn-tr ng-repeat="expedition in expeditions"> <vn-tr ng-repeat="expedition in expeditions">
<vn-td class="vn-px-md" style="width:30px; color:#FFA410;"> <vn-td class="vn-px-md" style="width:30px; color:#FFA410;">
<vn-icon-button icon="delete" <vn-icon-button icon="delete"
ng-click="$ctrl.deleteExpedition(expedition)" ng-click="deleteExpedition.show(expedition.id)"
vn-tooltip="Delete expedition"> vn-tooltip="Delete expedition">
</vn-icon-button> </vn-icon-button>
</vn-td> </vn-td>
@ -48,7 +48,7 @@
<vn-td expand> <vn-td expand>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, expedition.workerFk)"> ng-click="workerDescriptor.show($event, expedition.workerFk)">
{{::expedition.userNickname | dashIfEmpty}} {{::expedition.userNickname | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>
@ -66,8 +66,8 @@
vn-id="workerDescriptor"> vn-id="workerDescriptor">
</vn-worker-descriptor-popover> </vn-worker-descriptor-popover>
<vn-confirm <vn-confirm
vn-id="delete-expedition" vn-id="deleteExpedition"
on-response="$ctrl.returnDialog($response)" on-accept="$ctrl.onDialogAccept($data)"
question="Delete expedition" question="Delete expedition"
message="Are you sure you want to delete this expedition?"> message="Are you sure you want to delete this expedition?">
</vn-confirm> </vn-confirm>

View File

@ -2,17 +2,9 @@ import ngModule from '../module';
import Section from 'salix/components/section'; import Section from 'salix/components/section';
class Controller extends Section { class Controller extends Section {
deleteExpedition(expedition) { onDialogAccept(id) {
this.expeditionId = expedition.id; return this.$http.delete(`Expeditions/${id}`)
this.$.deleteExpedition.show(); .then(() => this.$.model.refresh());
}
returnDialog(response) {
if (response === 'accept') {
this.$http.delete(`Expeditions/${this.expeditionId}`).then(
() => this.$.model.refresh()
);
}
} }
showItemDescriptor(event, itemFk) { showItemDescriptor(event, itemFk) {
@ -32,18 +24,6 @@ class Controller extends Section {
this.$.itemDescriptor.parent = event.target; this.$.itemDescriptor.parent = event.target;
this.$.itemDescriptor.show(); this.$.itemDescriptor.show();
} }
showWorkerDescriptor(event, workerFk) {
event.preventDefault();
event.stopImmediatePropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnTicketExpedition', { ngModule.component('vnTicketExpedition', {

View File

@ -14,20 +14,17 @@ describe('Ticket', () => {
$scope.model = { $scope.model = {
refresh: () => {} refresh: () => {}
}; };
const $element = angular.element('<vn-ticket-expedition></vn-ticket-expedition>'); controller = $componentController('vnTicketExpedition', {$element: null, $scope});
controller = $componentController('vnTicketExpedition', {$element, $scope});
})); }));
describe('returnDialog()', () => { describe('onDialogAccept()', () => {
it('should perform a DELETE query', () => { it('should perform a DELETE query', () => {
jest.spyOn($scope.model, 'refresh'); jest.spyOn($scope.model, 'refresh');
let response = 'accept'; const id = 1;
controller.expeditionId = 1;
$httpBackend.when('DELETE', `Expeditions/1`).respond(200); $httpBackend.expectDELETE(`Expeditions/${id}`).respond(200);
$httpBackend.expect('DELETE', `Expeditions/1`); controller.onDialogAccept(id);
controller.returnDialog(response);
$httpBackend.flush(); $httpBackend.flush();
expect($scope.model.refresh).toHaveBeenCalledWith(); expect($scope.model.refresh).toHaveBeenCalledWith();

View File

@ -25,7 +25,7 @@
</div> </div>
<div class="description"> <div class="description">
<h3> <h3>
<span class="link" ng-click="$ctrl.showDescriptor($event, sale.item.id)"> <span class="link" ng-click="descriptor.show($event, sale.item.id)">
{{::sale.item.name}} {{::sale.item.name}}
</span> </span>
</h3> </h3>

View File

@ -13,16 +13,6 @@ class Controller extends Section {
} }
}; };
} }
showDescriptor(event, itemFk) {
this.$.descriptor.itemFk = itemFk;
this.$.descriptor.parent = event.target;
this.$.descriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnTicketPicture', { ngModule.component('vnTicketPicture', {

View File

@ -43,14 +43,14 @@
<vn-td> <vn-td>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, request.requesterFk)"> ng-click="workerDescriptor.show($event, request.requesterFk)">
{{::request.requester.user.nickname | dashIfEmpty}} {{::request.requester.user.nickname | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>
<vn-td> <vn-td>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, request.attenderFk)"> ng-click="workerDescriptor.show($event, request.attenderFk)">
{{::request.atender.user.nickname | dashIfEmpty}} {{::request.atender.user.nickname | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>

View File

@ -16,8 +16,7 @@ class Controller extends Section {
} }
} }
} }
}, }, {
{
relation: 'requester', relation: 'requester',
scope: { scope: {
include: { include: {
@ -27,8 +26,7 @@ class Controller extends Section {
} }
} }
} }
}, }, {
{
relation: 'sale' relation: 'sale'
} }
] ]
@ -60,14 +58,6 @@ class Controller extends Section {
this.$.itemDescriptor.show(); this.$.itemDescriptor.show();
} }
showWorkerDescriptor(event, workerFk) {
event.preventDefault();
event.stopImmediatePropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
getRequestState(state) { getRequestState(state) {
switch (state) { switch (state) {
case null: case null:

View File

@ -6,9 +6,8 @@ describe('Ticket', () => {
beforeEach(ngModule('ticket')); beforeEach(ngModule('ticket'));
beforeEach(angular.mock.inject($componentController => { beforeEach(inject($componentController => {
const $element = angular.element('<vn-ticket-request-index></vn-ticket-request-index>'); controller = $componentController('vnTicketRequestIndex', {$element: null});
controller = $componentController('vnTicketRequestIndex', {$element});
})); }));
describe('getRequestState()', () => { describe('getRequestState()', () => {

View File

@ -33,10 +33,6 @@ class Controller extends Section {
this.$.descriptor.parent = event.target; this.$.descriptor.parent = event.target;
this.$.descriptor.show(); this.$.descriptor.show();
} }
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnTicketSaleChecked', { ngModule.component('vnTicketSaleChecked', {

View File

@ -52,7 +52,7 @@
<vn-td expand> <vn-td expand>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, sale.workerFk)"> ng-click="workerDescriptor.show($event, sale.workerFk)">
{{::sale.userNickname | dashIfEmpty}} {{::sale.userNickname | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>

View File

@ -18,18 +18,6 @@ class Controller extends Section {
this.$.itemDescriptor.parent = event.target; this.$.itemDescriptor.parent = event.target;
this.$.itemDescriptor.show(); this.$.itemDescriptor.show();
} }
showWorkerDescriptor(event, workerFk) {
event.preventDefault();
event.stopImmediatePropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnTicketSaleTracking', { ngModule.component('vnTicketSaleTracking', {

View File

@ -9,176 +9,175 @@
</vn-watcher> </vn-watcher>
<vn-vertical class="vn-w-xl"> <vn-vertical class="vn-w-xl">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-vertical> <vn-horizontal class="header">
<vn-horizontal class="header"> <vn-tool-bar class="vn-mb-md">
<vn-tool-bar class="vn-mb-md"> <vn-button
<vn-button disabled="!$ctrl.isEditable"
disabled="!$ctrl.isEditable" label="Ok"
label="Ok" vn-http-click="$ctrl.onStateOkClick()"
vn-http-click="$ctrl.onStateOkClick()" vn-tooltip="Change ticket state to 'Ok'">
vn-tooltip="Change ticket state to 'Ok'"> </vn-button>
</vn-button> <vn-button-menu
<vn-button-menu disabled="!$ctrl.isEditable"
disabled="!$ctrl.isEditable" label="State"
label="State" value-field="id"
value-field="id" url="States/editableStates"
url="States/editableStates" on-change="$ctrl.onStateChange(value)">
on-change="$ctrl.onStateChange(value)"> </vn-button-menu>
</vn-button-menu> <vn-button-menu
<vn-button-menu ng-show="$ctrl.isChecked"
ng-show="$ctrl.isChecked" vn-id="more-button"
vn-id="more-button" label="More"
label="More" show-filter="false"
show-filter="false" value-field="callback"
value-field="callback" translate-fields="['name']"
translate-fields="['name']" on-change="$ctrl.onMoreChange(value)"
on-change="$ctrl.onMoreChange(value)" on-open="$ctrl.onMoreOpen()">
on-open="$ctrl.onMoreOpen()"> </vn-button-menu>
</vn-button-menu> <vn-button
<vn-button disabled="!$ctrl.isChecked || !$ctrl.isEditable"
disabled="!$ctrl.isChecked || !$ctrl.isEditable" ng-click="deleteLines.show()"
ng-click="$ctrl.showRemoveLinesDialog()" vn-tooltip="Remove lines"
vn-tooltip="Remove lines" icon="delete">
icon="delete"> </vn-button>
</vn-button> <vn-button
<vn-button disabled="!$ctrl.isChecked || !$ctrl.isEditable"
disabled="!$ctrl.isChecked || !$ctrl.isEditable" ng-click="transfer.show()"
ng-click="$ctrl.showTransferPopover($event);" vn-tooltip="Transfer lines"
vn-tooltip="Transfer lines" icon="call_split">
icon="call_split"> </vn-button>
</vn-button> </vn-tool-bar>
</vn-tool-bar> <vn-one class="taxes" ng-if="$ctrl.sales.length > 0">
<vn-one class="taxes" ng-if="$ctrl.sales.length > 0"> <p><vn-label translate>Subtotal</vn-label> {{$ctrl.subtotal | currency: 'EUR':2}}</p>
<p><vn-label translate>Subtotal</vn-label> {{$ctrl.subtotal | currency: 'EUR':2}}</p> <p><vn-label translate>VAT</vn-label> {{$ctrl.VAT | currency: 'EUR':2}}</p>
<p><vn-label translate>VAT</vn-label> {{$ctrl.VAT | currency: 'EUR':2}}</p> <p><vn-label><strong>Total</strong></vn-label> <strong>{{$ctrl.total | currency: 'EUR':2}}</strong></p>
<p><vn-label><strong>Total</strong></vn-label> <strong>{{$ctrl.total | currency: 'EUR':2}}</strong></p> </vn-one>
</vn-one> </vn-horizontal>
</vn-horizontal> <vn-table model="model">
<vn-table model="model"> <vn-thead>
<vn-thead> <vn-tr>
<vn-tr> <vn-th shrink>
<vn-th shrink> <vn-multi-check
<vn-multi-check model="model">
model="model"> </vn-multi-check>
</vn-multi-check> </vn-th>
</vn-th> <vn-th shrink></vn-th>
<vn-th shrink></vn-th> <vn-th shrink></vn-th>
<vn-th shrink></vn-th> <vn-th number>Id</vn-th>
<vn-th number>Id</vn-th> <vn-th>Quantity</vn-th>
<vn-th>Quantity</vn-th> <vn-th>Item</vn-th>
<vn-th>Item</vn-th> <vn-th number>Price</vn-th>
<vn-th number>Price</vn-th> <vn-th number>Disc</vn-th>
<vn-th number>Disc</vn-th> <vn-th number>Amount</vn-th>
<vn-th number>Amount</vn-th>
</vn-tr>
</vn-thead>
<vn-tbody>
<vn-tr ng-repeat="sale in $ctrl.sales">
<vn-td shrink>
<vn-check
ng-model="sale.checked">
</vn-check>
</vn-td>
<vn-td shrink>
<a ui-sref="claim.card.basicData({id: sale.claim.claimFk})">
<vn-icon
ng-show="sale.claim.claimFk"
icon="icon-claims"
vn-tooltip="{{::$ctrl.$translate.instant('Claim')}}: {{::sale.claim.claimFk}}">
</vn-icon>
</a>
<vn-icon
ng-show="sale.visible < 0 || sale.available < 0"
color-main
icon="warning"
vn-tooltip="Visible: {{::sale.visible || 0}} <br> {{::$ctrl.$translate.instant('Available')}}: {{::sale.available || 0}}">
</vn-icon>
<vn-icon ng-show="sale.reserved"
icon="icon-reserve"
vn-tooltip="{{::$ctrl.$translate.instant('Reserved')}}">
</vn-icon>
</vn-td>
<vn-td shrink>
<img
ng-src="{{::$root.imagePath}}/50x50/{{sale.image}}"
zoom-image="{{::$root.imagePath}}/1600x900/{{sale.image}}"
on-error-src/>
</vn-td>
<vn-td vn-focus number>
<span class="link" ng-if="sale.id"
ng-click="$ctrl.showDescriptor($event, sale.itemFk)">
{{sale.itemFk}}
</span>
<vn-autocomplete
ng-if="!sale.id"
vn-focus
vn-one
url="Items"
ng-model="sale.itemFk"
show-field="name"
value-field="id"
search-function="$ctrl.itemSearchFunc($search)"
on-change="$ctrl.onChangeQuantity(sale)"
order="id DESC"
tabindex="1">
<tpl-item>
{{id}} - {{name}}
</tpl-item>
</vn-autocomplete>
</vn-td>
<vn-td-editable ng-if="sale.id" disabled="!$ctrl.isEditable" number>
<text>{{sale.quantity}}</text>
<field>
<vn-input-number class="dense"
vn-focus
ng-model="sale.quantity"
on-change="$ctrl.onChangeQuantity(sale)">
</vn-input-number>
</field>
</vn-td-editable>
<vn-td ng-if="!sale.id" number>
<vn-input-number
ng-model="sale.quantity"
on-change="$ctrl.onChangeQuantity(sale)"
tabindex="2">
</vn-input-number>
</vn-td>
<vn-td-editable disabled="!sale.id || !$ctrl.isEditable" expand>
<text>
<vn-fetched-tags
max-length="6"
item="sale.item"
name="sale.concept"
sub-name="sale.subName">
</vn-fetched-tags>
</text>
<field>
<vn-textfield class="dense"
vn-id="concept"
ng-model="sale.concept"
on-change="$ctrl.updateConcept(sale)">
</vn-textfield>
</field>
</vn-td-editable>
<vn-td number>
<span ng-class="{'link': $ctrl.isEditable}"
title="{{$ctrl.isEditable ? 'Edit price' : ''}}"
ng-click="$ctrl.showEditPricePopover($event, sale)">
{{sale.price | currency: 'EUR':2}}
</span>
</vn-td>
<vn-td number>
<span ng-class="{'link': !$ctrl.isLocked}"
title="{{!$ctrl.isLocked ? 'Edit discount' : ''}}"
ng-click="$ctrl.showEditDiscountPopover($event, sale)"
ng-if="sale.id">
{{(sale.discount / 100) | percentage}}
</span>
</vn-td>
<vn-td number>
{{$ctrl.getSaleTotal(sale) | currency: 'EUR':2}}
</vn-td>
</vn-tr> </vn-tr>
</vn-thead>
<vn-tbody>
<vn-tr ng-repeat="sale in $ctrl.sales">
<vn-td shrink>
<vn-check
ng-model="sale.checked">
</vn-check>
</vn-td>
<vn-td shrink>
<a ui-sref="claim.card.basicData({id: sale.claim.claimFk})">
<vn-icon
ng-show="sale.claim.claimFk"
icon="icon-claims"
vn-tooltip="{{::$ctrl.$translate.instant('Claim')}}: {{::sale.claim.claimFk}}">
</vn-icon>
</a>
<vn-icon
ng-show="sale.visible < 0 || sale.available < 0"
color-main
icon="warning"
vn-tooltip="Visible: {{::sale.visible || 0}} <br> {{::$ctrl.$translate.instant('Available')}}: {{::sale.available || 0}}">
</vn-icon>
<vn-icon ng-show="sale.reserved"
icon="icon-reserve"
vn-tooltip="{{::$ctrl.$translate.instant('Reserved')}}">
</vn-icon>
</vn-td>
<vn-td shrink>
<img
ng-src="{{::$root.imagePath}}/50x50/{{sale.image}}"
zoom-image="{{::$root.imagePath}}/1600x900/{{sale.image}}"
on-error-src/>
</vn-td>
<vn-td vn-focus number>
<span class="link" ng-if="sale.id"
ng-click="$ctrl.showDescriptor($event, sale.itemFk)">
{{sale.itemFk}}
</span>
<vn-autocomplete
ng-if="!sale.id"
vn-focus
vn-one
url="Items"
ng-model="sale.itemFk"
show-field="name"
value-field="id"
search-function="$ctrl.itemSearchFunc($search)"
on-change="$ctrl.onChangeQuantity(sale)"
order="id DESC"
tabindex="1">
<tpl-item>
{{id}} - {{name}}
</tpl-item>
</vn-autocomplete>
</vn-td>
<vn-td-editable ng-if="sale.id" disabled="!$ctrl.isEditable" number>
<text>{{sale.quantity}}</text>
<field>
<vn-input-number class="dense"
vn-focus
ng-model="sale.quantity"
on-change="$ctrl.onChangeQuantity(sale)">
</vn-input-number>
</field>
</vn-td-editable>
<vn-td ng-if="!sale.id" number>
<vn-input-number
ng-model="sale.quantity"
on-change="$ctrl.onChangeQuantity(sale)"
tabindex="2">
</vn-input-number>
</vn-td>
<vn-td-editable disabled="!sale.id || !$ctrl.isEditable" expand>
<text>
<vn-fetched-tags
max-length="6"
item="sale.item"
name="sale.concept"
sub-name="sale.subName">
</vn-fetched-tags>
</text>
<field>
<vn-textfield class="dense"
vn-id="concept"
ng-model="sale.concept"
on-change="$ctrl.updateConcept(sale)">
</vn-textfield>
</field>
</vn-td-editable>
<vn-td number>
<span ng-class="{'link': $ctrl.isEditable}"
title="{{$ctrl.isEditable ? 'Edit price' : ''}}"
ng-click="$ctrl.showEditPricePopover($event, sale)">
{{sale.price | currency: 'EUR':2}}
</span>
</vn-td>
<vn-td number>
<span ng-class="{'link': !$ctrl.isLocked}"
title="{{!$ctrl.isLocked ? 'Edit discount' : ''}}"
ng-click="$ctrl.showEditDiscountPopover($event, sale)"
ng-if="sale.id">
{{(sale.discount / 100) | percentage}}
</span>
</vn-td>
<vn-td number>
{{$ctrl.getSaleTotal(sale) | currency: 'EUR':2}}
</vn-td>
</vn-tr>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
<vn-one> <vn-one>
@ -200,7 +199,6 @@
vn-bind="+" vn-bind="+"
fixed-bottom-right> fixed-bottom-right>
</vn-float-button> </vn-float-button>
<vn-item-descriptor-popover <vn-item-descriptor-popover
vn-id="descriptor" vn-id="descriptor"
quicklinks="$ctrl.quicklinks"> quicklinks="$ctrl.quicklinks">

View File

@ -228,16 +228,6 @@ class Controller extends Section {
} }
} }
showRemoveLinesDialog() {
this.$.deleteLines.show();
}
showTransferPopover(event) {
this.setTransferParams();
this.$.transfer.parent = event.target;
this.$.transfer.show();
}
setTransferParams() { setTransferParams() {
const checkedSales = JSON.stringify(this.checkedLines()); const checkedSales = JSON.stringify(this.checkedLines());
const sales = JSON.parse(checkedSales); const sales = JSON.parse(checkedSales);
@ -312,10 +302,6 @@ class Controller extends Section {
this.$.descriptor.show(); this.$.descriptor.show();
} }
onDescriptorLoad() {
this.$.popover.relocate();
}
showEditPricePopover(event, sale) { showEditPricePopover(event, sale) {
if (!this.isEditable) return; if (!this.isEditable) return;
this.sale = sale; this.sale = sale;

View File

@ -61,10 +61,6 @@ class Controller extends Section {
this.$.descriptor.show(); this.$.descriptor.show();
} }
onDescriptorLoad() {
this.$.popover.relocate();
}
get isEditable() { get isEditable() {
try { try {
return !this.ticket.state.state.alertLevel; return !this.ticket.state.state.alertLevel;

View File

@ -24,7 +24,7 @@
<vn-td expand> <vn-td expand>
<span <span
class="link" class="link"
ng-click="$ctrl.showWorkerDescriptor($event, tracking.worker.user.id)"> ng-click="workerDescriptor.show($event, tracking.worker.user.id)">
{{::tracking.worker.user.nickname | dashIfEmpty}} {{::tracking.worker.user.nickname | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>

View File

@ -17,8 +17,7 @@ class Controller extends Section {
} }
} }
} }
}, }, {
{
relation: 'state', relation: 'state',
scope: { scope: {
fields: ['name'] fields: ['name']
@ -27,14 +26,6 @@ class Controller extends Section {
] ]
}; };
} }
showWorkerDescriptor(event, workerFk) {
event.preventDefault();
event.stopImmediatePropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
} }
ngModule.component('vnTicketTrackingIndex', { ngModule.component('vnTicketTrackingIndex', {

View File

@ -60,10 +60,6 @@ class Controller extends Section {
this.$.descriptor.parent = event.target; this.$.descriptor.parent = event.target;
this.$.descriptor.show(); this.$.descriptor.show();
} }
onDescriptorLoad() {
this.$.popover.relocate();
}
} }
ngModule.component('vnTicketVolume', { ngModule.component('vnTicketVolume', {

View File

@ -66,16 +66,21 @@ describe('ticket', () => {
}); });
}); });
/* it('should join the sale volumes to its respective sale', () => { /*
it('should join the sale volumes to its respective sale', () => {
controller.ticket = {id: 1}; controller.ticket = {id: 1};
let response = {volumes: [{saleFk: 1, m3: 0.008}, {saleFk: 2, m3: 0.003}]}; let response = {volumes: [
$httpBackend.whenGET(`tickets/1/getVolume`).respond(response); {saleFk: 1, m3: 0.008},
$httpBackend.expectGET(`tickets/1/getVolume`); {saleFk: 2, m3: 0.003}
]};
$httpBackend.expectGET(`tickets/1/getVolume`).respond(response);
controller.onDataChange(); controller.onDataChange();
$httpBackend.flush(); $httpBackend.flush();
expect($scope.model.data[0].volume.m3).toBe(0.008); expect($scope.model.data[0].volume.m3).toBe(0.008);
expect($scope.model.data[1].volume.m3).toBe(0.003); expect($scope.model.data[1].volume.m3).toBe(0.003);
}); */ });
*/
}); });
}); });

View File

@ -56,7 +56,7 @@
</a> </a>
</vn-td> </vn-td>
<vn-td shrink> <vn-td shrink>
<vn-icon-button ui-sref="worker.card.edit({dmsId: {{::document.dmsFk}}})" <vn-icon-button ui-sref="worker.card.edit({dmsId: {{::document.dmsFk}}})"
icon="edit" icon="edit"
title="{{'Edit file' | translate}}"> title="{{'Edit file' | translate}}">
</vn-icon-button> </vn-icon-button>
@ -64,7 +64,7 @@
<vn-td shrink> <vn-td shrink>
<vn-icon-button <vn-icon-button
icon="delete" icon="delete"
ng-click="$ctrl.showDeleteConfirm($index)" ng-click="confirm.show($index)"
title="{{'Remove file' | translate}}" title="{{'Remove file' | translate}}"
tabindex="-1"> tabindex="-1">
</vn-icon-button> </vn-icon-button>
@ -74,10 +74,7 @@
</vn-table> </vn-table>
</vn-card> </vn-card>
</vn-data-viewer> </vn-data-viewer>
<vn-worker-descriptor-popover <a ui-sref="worker.card.dms.create"
vn-id="workerDescriptor">
</vn-worker-descriptor-popover>
<a ui-sref="worker.card.create"
vn-tooltip="Upload file" vn-tooltip="Upload file"
vn-bind="+" vn-bind="+"
fixed-bottom-right> fixed-bottom-right>
@ -87,5 +84,5 @@
vn-id="confirm" vn-id="confirm"
message="This file will be deleted" message="This file will be deleted"
question="Are you sure you want to continue?" question="Are you sure you want to continue?"
on-response="$ctrl.deleteDms($response)"> on-accept="$ctrl.deleteDms($data)">
</vn-confirm> </vn-confirm>

View File

@ -19,51 +19,37 @@ class Controller extends Component {
'file', 'file',
'created', 'created',
], ],
include: [{ include: [
relation: 'dmsType', {
scope: { relation: 'dmsType',
fields: ['name'] scope: {
fields: ['name']
}
}, {
relation: 'worker',
scope: {
fields: ['userFk'],
include: {
relation: 'user',
scope: {
fields: ['nickname']
}
},
}
} }
}, ]
{
relation: 'worker',
scope: {
fields: ['userFk'],
include: {
relation: 'user',
scope: {
fields: ['nickname']
}
},
}
}]
}, },
} }
}; };
} }
showWorkerDescriptor(event, workerFk) { deleteDms(index) {
event.preventDefault(); const workerDmsId = this.workerDms[index].dmsFk;
event.stopImmediatePropagation(); return this.$http.post(`WorkerDms/${workerDmsId}/removeFile`)
this.$.workerDescriptor.parent = event.target; .then(() => {
this.$.workerDescriptor.workerFk = workerFk; this.$.model.remove(index);
this.$.workerDescriptor.show(); this.vnApp.showSuccess(this.$t('Data saved!'));
}
showDeleteConfirm(index) {
this.dmsIndex = index;
this.$.confirm.show();
}
deleteDms(response) {
if (response === 'accept') {
const workerDmsId = this.workerDms[this.dmsIndex].id;
const query = `WorkerDms/${workerDmsId}/removeFile`;
this.$http.post(query).then(() => {
this.$.model.remove(this.dmsIndex);
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
}); });
}
} }
} }

View File

@ -4,36 +4,33 @@ import crudModel from 'core/mocks/crud-model';
describe('Worker', () => { describe('Worker', () => {
describe('Component vnWorkerDmsIndex', () => { describe('Component vnWorkerDmsIndex', () => {
let $scope; let $scope;
let $element;
let $httpBackend; let $httpBackend;
let controller; let controller;
beforeEach(ngModule('worker')); beforeEach(ngModule('worker'));
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_) => { beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => {
$httpBackend = _$httpBackend_; $httpBackend = _$httpBackend_;
$scope = $rootScope.$new(); $scope = $rootScope.$new();
$element = angular.element(`<vn-worker-dms-index></vn-worker-dms-index`); controller = $componentController('vnWorkerDmsIndex', {$element: null, $scope});
controller = $componentController('vnWorkerDmsIndex', {$element, $scope});
controller.$.model = crudModel; controller.$.model = crudModel;
})); }));
describe('deleteDms()', () => { describe('deleteDms()', () => {
it('should make an HTTP Post query', () => { it('should make an HTTP Post query', () => {
const workerDmsId = 1;
const dmsIndex = 0;
jest.spyOn(controller.vnApp, 'showSuccess'); jest.spyOn(controller.vnApp, 'showSuccess');
jest.spyOn(controller.$.model, 'remove'); jest.spyOn(controller.$.model, 'remove');
controller.workerDms = [{id: 1, dmsFk: 4}];
controller.dmsIndex = dmsIndex;
$httpBackend.when('POST', `WorkerDms/${workerDmsId}/removeFile`).respond({}); const workerDmsId = 4;
$httpBackend.expect('POST', `WorkerDms/${workerDmsId}/removeFile`); const dmsIndex = 0;
controller.deleteDms('accept'); controller.workerDms = [{id: 1, dmsFk: 4}];
$httpBackend.expectPOST(`WorkerDms/${workerDmsId}/removeFile`).respond();
controller.deleteDms(dmsIndex);
$httpBackend.flush(); $httpBackend.flush();
expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex); expect(controller.$.model.remove).toHaveBeenCalledWith(dmsIndex);
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); expect(controller.vnApp.showSuccess).toHaveBeenCalled();
}); });
}); });
}); });

View File

@ -32,7 +32,7 @@
<span translate class="label">Changed by</span><span class="label">: </span> <span translate class="label">Changed by</span><span class="label">: </span>
<span <span
ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}" ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}"
ng-click="$ctrl.showWorkerDescriptor($event, log.user.worker.id)" ng-click="workerDescriptor.show($event, log.user.id)"
translate>{{::log.user.name | dashIfEmpty}} translate>{{::log.user.name | dashIfEmpty}}
</span> </span>
</div> </div>
@ -53,7 +53,7 @@
<vn-td class="expendable"> <vn-td class="expendable">
<span <span
ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}" ng-class="{'link': log.user.worker.id, 'value': !log.user.worker.id}"
ng-click="$ctrl.showWorkerDescriptor($event, log.user.worker.id)" ng-click="workerDescriptor.show($event, log.user.id)"
translate>{{::log.user.name | dashIfEmpty}} translate>{{::log.user.name | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>

View File

@ -42,18 +42,6 @@ export default class Controller extends Section {
} }
} }
showWorkerDescriptor(event, workerFk) {
if (event.defaultPrevented) return;
if (!workerFk) return;
event.preventDefault();
event.stopPropagation();
this.selectedWorker = workerFk;
this.$.workerDescriptor.parent = event.target;
this.$.workerDescriptor.show();
}
getInstance(instance) { getInstance(instance) {
const properties = []; const properties = [];
let validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/; let validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;