5244-component_workerAutocomplete #1679

Merged
vicent merged 33 commits from 5244-component_workerAutocomplete into dev 2023-08-25 08:56:46 +00:00
40 changed files with 258 additions and 206 deletions

View File

@ -0,0 +1,3 @@
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
('Worker', 'search', 'READ', 'ALLOW', 'ROLE', 'employee');

View File

@ -0,0 +1,3 @@
UPDATE `vn`.`department`
SET code='VN'
WHERE name='VERDNATURA';

View File

@ -632,6 +632,7 @@ let actions = {
await this.write(selector, value.toString()); await this.write(selector, value.toString());
break; break;
case 'vn-autocomplete': case 'vn-autocomplete':
case 'vn-worker-autocomplete':
if (value) if (value)
await this.autocompleteSearch(selector, value.toString()); await this.autocompleteSearch(selector, value.toString());
else else
@ -667,6 +668,7 @@ let actions = {
switch (tagName) { switch (tagName) {
case 'vn-textfield': case 'vn-textfield':
case 'vn-autocomplete': case 'vn-autocomplete':
case 'vn-worker-autocomplete':
case 'vn-input-time': case 'vn-input-time':
case 'vn-datalist': case 'vn-datalist':
el = await input.$('input'); el = await input.$('input');

View File

@ -187,7 +187,7 @@ export default {
country: 'vn-client-create vn-autocomplete[ng-model="$ctrl.client.countryFk"]', country: 'vn-client-create vn-autocomplete[ng-model="$ctrl.client.countryFk"]',
userName: 'vn-client-create vn-textfield[ng-model="$ctrl.client.userName"]', userName: 'vn-client-create vn-textfield[ng-model="$ctrl.client.userName"]',
email: 'vn-client-create vn-textfield[ng-model="$ctrl.client.email"]', email: 'vn-client-create vn-textfield[ng-model="$ctrl.client.email"]',
salesPerson: 'vn-client-create vn-autocomplete[ng-model="$ctrl.client.salesPersonFk"]', salesPerson: 'vn-client-create vn-worker-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
saveNewProvicenButton: '#saveProvince', saveNewProvicenButton: '#saveProvince',
saveNewCityButton: '#saveCity', saveNewCityButton: '#saveCity',
saveNewPoscode: '#savePostcode', saveNewPoscode: '#savePostcode',
@ -199,7 +199,7 @@ export default {
email: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.email"]', email: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.email"]',
phone: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.phone"]', phone: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.phone"]',
mobile: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.mobile"]', mobile: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.mobile"]',
salesPerson: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.salesPersonFk"]', salesPerson: 'vn-client-basic-data vn-worker-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
channel: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.contactChannelFk"]', channel: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.contactChannelFk"]',
transferor: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.transferorFk"]', transferor: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.transferorFk"]',
businessType: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.businessTypeFk"]', businessType: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.businessTypeFk"]',
@ -735,7 +735,7 @@ export default {
}, },
createStateView: { createStateView: {
state: 'vn-autocomplete[ng-model="$ctrl.stateFk"]', state: 'vn-autocomplete[ng-model="$ctrl.stateFk"]',
worker: 'vn-autocomplete[ng-model="$ctrl.workerFk"]', worker: 'vn-worker-autocomplete[ng-model="$ctrl.workerFk"]',
saveStateButton: `button[type=submit]` saveStateButton: `button[type=submit]`
}, },
claimsIndex: { claimsIndex: {
@ -781,12 +781,12 @@ export default {
firstClaimReason: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]', firstClaimReason: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]',
firstClaimResult: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]', firstClaimResult: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]',
firstClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]', firstClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]',
firstClaimWorker: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.workerFk"]', firstClaimWorker: 'vn-claim-development vn-horizontal:nth-child(1) vn-worker-autocomplete[ng-model="claimDevelopment.workerFk"]',
firstClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]', firstClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]',
secondClaimReason: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]', secondClaimReason: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]',
secondClaimResult: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]', secondClaimResult: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]',
secondClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]', secondClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]',
secondClaimWorker: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.workerFk"]', secondClaimWorker: 'vn-claim-development vn-horizontal:nth-child(2) vn-worker-autocomplete[ng-model="claimDevelopment.workerFk"]',
secondClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]', secondClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]',
saveDevelopmentButton: 'button[type=submit]' saveDevelopmentButton: 'button[type=submit]'
}, },
@ -854,7 +854,7 @@ export default {
}, },
createRouteView: { createRouteView: {
worker: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.workerFk"]', worker: 'vn-route-create vn-worker-autocomplete[ng-model="$ctrl.route.workerFk"]',
createdDatePicker: 'vn-route-create vn-date-picker[ng-model="$ctrl.route.created"]', createdDatePicker: 'vn-route-create vn-date-picker[ng-model="$ctrl.route.created"]',
vehicleAuto: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]', vehicleAuto: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]',
agency: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.agencyModeFk"]', agency: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.agencyModeFk"]',
@ -976,7 +976,7 @@ export default {
street: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.street"]', street: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.street"]',
user: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.name"]', user: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.name"]',
email: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.email"]', email: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.email"]',
boss: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.bossFk"]', boss: 'vn-worker-create vn-worker-autocomplete[ng-model="$ctrl.worker.bossFk"]',
role: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.roleFk"]', role: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.roleFk"]',
iban: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.iban"]', iban: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.iban"]',
createButton: 'vn-worker-create vn-submit[label="Create"]', createButton: 'vn-worker-create vn-submit[label="Create"]',

View File

@ -59,7 +59,7 @@ describe('Ticket Create new tracking state path', () => {
const result = await page const result = await page
.waitToGetProperty(selectors.createStateView.worker, 'value'); .waitToGetProperty(selectors.createStateView.worker, 'value');
expect(result).toEqual('salesPersonNick'); expect(result).toEqual('salesPerson');
}); });
it(`should succesfully create a valid state`, async() => { it(`should succesfully create a valid state`, async() => {

View File

@ -17,10 +17,9 @@ import './style.scss';
* @event change Thrown when value is changed * @event change Thrown when value is changed
*/ */
export default class Autocomplete extends Field { export default class Autocomplete extends Field {
constructor($element, $, $compile, $transclude) { constructor($element, $, $transclude) {
super($element, $, $compile); super($element, $, $transclude);
this.$transclude = $transclude; this.$transclude = $transclude;
this.$compile = $compile;
this._selection = null; this._selection = null;
this.input = this.element.querySelector('input'); this.input = this.element.querySelector('input');
} }
@ -153,7 +152,14 @@ export default class Autocomplete extends Field {
filter.include = this.include; filter.include = this.include;
let json = encodeURIComponent(JSON.stringify(filter)); let json = encodeURIComponent(JSON.stringify(filter));
this.$http.get(`${this.url}?filter=${json}`).then(
let url;
if (this.url.includes('?'))
url = `${this.url}&filter=${json}`;
else
url = `${this.url}?filter=${json}`;
this.$http.get(url).then(
json => this.onSelectionRequest(json.data), json => this.onSelectionRequest(json.data),
() => this.onSelectionRequest() () => this.onSelectionRequest()
); );
@ -282,7 +288,7 @@ export default class Autocomplete extends Field {
this.refreshSelection(); this.refreshSelection();
} }
} }
Autocomplete.$inject = ['$element', '$scope', '$compile', '$transclude']; Autocomplete.$inject = ['$element', '$scope', '$transclude'];
ngModule.vnComponent('vnAutocomplete', { ngModule.vnComponent('vnAutocomplete', {
template: require('./index.html'), template: require('./index.html'),

View File

@ -3,8 +3,8 @@ import FormInput from '../form-input';
import './style.scss'; import './style.scss';
export default class Field extends FormInput { export default class Field extends FormInput {
constructor($element, $scope) { constructor($element, $scope, $transclude) {
super($element, $scope); super($element, $scope, $transclude);
this.prefix = null; this.prefix = null;
this.suffix = null; this.suffix = null;
@ -197,7 +197,7 @@ export default class Field extends FormInput {
}); });
} }
} }
Field.$inject = ['$element', '$scope']; Field.$inject = ['$element', '$scope', '$transclude'];
ngModule.vnComponent('vnField', { ngModule.vnComponent('vnField', {
template: require('./index.html'), template: require('./index.html'),

View File

@ -51,6 +51,7 @@ import './textarea';
import './th'; import './th';
import './treeview'; import './treeview';
import './wday-picker'; import './wday-picker';
import './worker-autocomplete';
import './datalist'; import './datalist';
import './contextmenu'; import './contextmenu';
import './rating'; import './rating';

View File

@ -0,0 +1,8 @@
<tpl-item>
<div>
{{name}}
</div>
<div class="text-caption text-secondary">
{{nickname}}, {{code}}
</div>
</tpl-item>

View File

@ -0,0 +1,40 @@
import ngModule from '../../module';
import Autocomplete from '../autocomplete';
export default class WorkerAutocomplete extends Autocomplete {
constructor(...args) {
super(...args);
}
$onInit() {
super.$onInit();
let url = 'Workers/search';
if (this.departments) {
const parameter = encodeURIComponent(JSON.stringify(this.departments));
url = `Workers/search?departmentCodes=${parameter}`;
}
Object.assign(this, {
label: 'Worker',
url,
vicent marked this conversation as resolved Outdated
Outdated
Review

url,

url,
searchFunction: function({$search}) {
return {and: [
{'active': {neq: false}},
{or: [
{'name': $search},
{'nickname': {like: '%' + $search + '%'}},
{'code': {like: $search + '%'}}
]}
]};
},
});
}
}
ngModule.vnComponent('vnWorkerAutocomplete', {
slotTemplate: require('./index.html'),
controller: WorkerAutocomplete,
bindings: {
departments: '<?'
},
});

View File

@ -25,15 +25,13 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
disabled="false" disabled="false"
ng-model="$ctrl.claim.workerFk"
url="Workers/activeWithRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}" ng-model="$ctrl.claim.workerFk"
where="{role: 'salesPerson'}" departments="['VT']"
label="Attended by"> label="Attended by">
</vn-autocomplete> </vn-worker-autocomplete>
<vn-autocomplete <vn-autocomplete
ng-model="$ctrl.claim.claimStateFk" ng-model="$ctrl.claim.claimStateFk"
data="claimStates" data="claimStates"

View File

@ -36,7 +36,7 @@
data="claimDevelopments" data="claimDevelopments"
form="form"> form="form">
</vn-watcher> </vn-watcher>
<vn-vertical class="vn-w-md"> <vn-vertical class="vn-w-lg">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-vertical> <vn-vertical>
<form name="form"> <form name="form">
@ -66,16 +66,11 @@
show-field="description" show-field="description"
rule> rule>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-worker-autocomplete
ng-model="claimDevelopment.workerFk" ng-model="claimDevelopment.workerFk"
url="Workers/activeWithInheritedRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Worker"
rule> rule>
</vn-autocomplete> </vn-worker-autocomplete>
<vn-autocomplete <vn-autocomplete
label="Redelivery" label="Redelivery"
ng-model="claimDevelopment.claimRedeliveryFk" ng-model="claimDevelopment.claimRedeliveryFk"

View File

@ -22,26 +22,18 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.salesPersonFk" ng-model="filter.salesPersonFk"
url="Workers/activeWithRole" departments="['VT']"
search-function="{firstName: $search}"
value-field="id"
where="{role: {inq: ['salesTeamBoss', 'salesPerson', 'officeBoss']}}"
label="Salesperson"> label="Salesperson">
<tpl-item>{{firstName}} {{name}}</tpl-item> </vn-worker-autocomplete>
</vn-autocomplete> <vn-worker-autocomplete
<vn-autocomplete
vn-one vn-one
ng-model="filter.attenderFk" ng-model="filter.attenderFk"
url="Workers/activeWithRole" departments="['VT']"
search-function="{firstName: $search}"
value-field="id"
where="{role: {inq: ['salesTeamBoss', 'salesPerson']}}"
label="Attended by"> label="Attended by">
<tpl-item>{{firstName}} {{name}}</tpl-item> </vn-worker-autocomplete>
</vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete vn-one <vn-autocomplete vn-one

View File

@ -59,17 +59,14 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="$ctrl.client.salesPersonFk" ng-model="$ctrl.client.salesPersonFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'salesPerson'}"
label="Salesperson" label="Salesperson"
vn-acl="salesAssistant"> vn-acl="salesAssistant">
</vn-autocomplete> </vn-worker-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
ng-model="$ctrl.client.contactChannelFk" ng-model="$ctrl.client.contactChannelFk"

View File

@ -17,12 +17,11 @@
<vn-autocomplete <vn-autocomplete
vn-one vn-one
ng-model="filter.buyerId" ng-model="filter.buyerId"
url="Workers/activeWithRole" url="TicketRequests/getItemTypeWorker"
search-function="{firstName: $search}" search-function="{firstName: $search}"
show-field="nickname"
value-field="id" value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}"
label="Buyer"> label="Buyer">
<tpl-item>{{nickname}}</tpl-item>
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>

View File

@ -15,15 +15,12 @@
rule rule
vn-focus> vn-focus>
</vn-textfield> </vn-textfield>
<vn-autocomplete <vn-worker-autocomplete
label="Salesperson" label="Salesperson"
ng-model="$ctrl.client.salesPersonFk" ng-model="$ctrl.client.salesPersonFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}" show-field="nickname">
show-field="firstName" </vn-worker-autocomplete>
where="{role: 'salesPerson'}">
<tpl-item>{{firstName}} {{lastName}}</tpl-item>
</vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-autocomplete

View File

@ -14,17 +14,12 @@
vn-one label="Name" vn-one label="Name"
ng-model="filter.name"> ng-model="filter.name">
</vn-textfield> </vn-textfield>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.salesPersonFk" ng-model="filter.salesPersonFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}"
show-field="firstName"
value-field="id"
where="{role: 'salesPerson'}"
label="Salesperson"> label="Salesperson">
<tpl-item>{{firstName}} {{name}}</tpl-item> </vn-worker-autocomplete>
</vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-textfield <vn-textfield

View File

@ -54,11 +54,10 @@
vn-id="salesPerson" vn-id="salesPerson"
disabled="false" disabled="false"
ng-model="$ctrl.filter.salesPersonFk" ng-model="$ctrl.filter.salesPersonFk"
url="Workers/activeWithRole" url="TicketRequests/getItemTypeWorker"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}" search-function="{firstName: $search}"
value-field="id" value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}"
label="Buyer" label="Buyer"
on-change="$ctrl.addFilters()"> on-change="$ctrl.addFilters()">
</vn-autocomplete> </vn-autocomplete>

View File

@ -54,11 +54,10 @@
vn-id="buyer" vn-id="buyer"
disabled="false" disabled="false"
ng-model="$ctrl.filter.buyerFk" ng-model="$ctrl.filter.buyerFk"
url="Workers/activeWithRole" url="TicketRequests/getItemTypeWorker"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}" search-function="{firstName: $search}"
value-field="id" value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}"
label="Buyer" label="Buyer"
on-change="$ctrl.addFilters()"> on-change="$ctrl.addFilters()">
</vn-autocomplete> </vn-autocomplete>

View File

@ -44,8 +44,7 @@ class Controller extends Section {
{ {
field: 'buyerFk', field: 'buyerFk',
autocomplete: { autocomplete: {
url: 'Workers/activeWithRole', url: 'TicketRequests/getItemTypeWorker',
where: `{role: {inq: ['logistic', 'buyer']}}`,
searchFunction: '{firstName: $search}', searchFunction: '{firstName: $search}',
showField: 'nickname', showField: 'nickname',
valueField: 'id', valueField: 'id',

View File

@ -22,12 +22,11 @@
<vn-autocomplete <vn-autocomplete
vn-one vn-one
ng-model="filter.attenderFk" ng-model="filter.attenderFk"
url="Workers/activeWithRole" url="TicketRequests/getItemTypeWorker"
search-function="{firstName: $search}" search-function="{firstName: $search}"
show-field="nickname"
value-field="id" value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}" label="Atender">
label="Buyer">
<tpl-item>{{nickname}}</tpl-item>
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal class="vn-px-lg"> <vn-horizontal class="vn-px-lg">
@ -46,18 +45,13 @@
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal class="vn-px-lg"> <vn-horizontal class="vn-px-lg">
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.requesterFk" ng-model="filter.requesterFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}" label="Salesperson">
value-field="id" </vn-worker-autocomplete>
where="{role: 'salesPerson'}"
label="Comercial">
<tpl-item>{{firstName}} {{lastName}}</tpl-item>
</vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<section class="vn-px-md"> <section class="vn-px-md">
<vn-horizontal class="manifold-panel vn-pa-md"> <vn-horizontal class="manifold-panel vn-pa-md">
<vn-date-picker <vn-date-picker

View File

@ -43,16 +43,12 @@
label="Nickname" label="Nickname"
ng-model="filter.nickname"> ng-model="filter.nickname">
</vn-textfield> </vn-textfield>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.salesPersonFk" ng-model="filter.salesPersonFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Sales person"> label="Sales person">
<tpl-item>{{firstName}} {{name}}</tpl-item> </vn-worker-autocomplete>
</vn-autocomplete>
<vn-textfield <vn-textfield
vn-one vn-one
label="Invoice" label="Invoice"

View File

@ -25,16 +25,13 @@
show-field="name" show-field="name"
value-field="id"> value-field="id">
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.workerFk" ng-model="filter.workerFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}"
show-field="nickname" show-field="nickname"
value-field="id"
where="{role: 'salesPerson'}"
label="Sales person"> label="Sales person">
</vn-autocomplete> </vn-worker-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-date-picker <vn-date-picker

View File

@ -8,20 +8,11 @@
<form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md"> <form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
ng-model="$ctrl.route.workerFk" ng-model="$ctrl.route.workerFk"
url="Workers/activeWithInheritedRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Worker"
vn-name="worker"> vn-name="worker">
<tpl-item> </vn-worker-autocomplete>
<div>{{::nickname}}</div>
<div class="text-secondary text-caption">{{::name}}</div>
</tpl-item>
</vn-autocomplete>
<vn-autocomplete <vn-autocomplete
label="Vehicle" label="Vehicle"
ng-model="$ctrl.route.vehicleFk" ng-model="$ctrl.route.vehicleFk"

View File

@ -8,14 +8,10 @@
<form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md"> <form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
label="Worker"
ng-model="$ctrl.route.workerFk" ng-model="$ctrl.route.workerFk"
url="Workers/activeWithInheritedRole" show-field="nickname">
show-field="nickname" </vn-worker-autocomplete>
search-function="{firstName: $search}"
where="{role: 'employee'}">
</vn-autocomplete>
<vn-date-picker <vn-date-picker
label="Created" label="Created"
ng-model="$ctrl.route.created"> ng-model="$ctrl.route.created">

View File

@ -15,16 +15,11 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal class="vn-px-lg"> <vn-horizontal class="vn-px-lg">
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.workerFk" ng-model="filter.workerFk"
url="Workers/activeWithInheritedRole" show-field="nickname">
show-field="nickname" </vn-worker-autocomplete>
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Worker">
</vn-autocomplete>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
label="Agency" label="Agency"

View File

@ -15,17 +15,13 @@
rule rule
vn-focus> vn-focus>
</vn-textfield> </vn-textfield>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="$ctrl.supplier.workerFk" ng-model="$ctrl.supplier.workerFk"
url="Workers/activeWithInheritedRole"
search-function="{firstName: $search}"
show-field="nickname" show-field="nickname"
value-field="id"
where="{role: 'employee'}"
label="Responsible" label="Responsible"
info="Responsible for approving invoices"> info="Responsible for approving invoices">
</vn-autocomplete> </vn-worker-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-check <vn-check

View File

@ -17,12 +17,11 @@
<vn-autocomplete <vn-autocomplete
vn-one vn-one
ng-model="filter.buyerId" ng-model="filter.buyerId"
url="Workers/activeWithRole" url="TicketRequests/getItemTypeWorker"
search-function="{firstName: $search}" search-function="{firstName: $search}"
show-field="nickname"
value-field="id" value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}"
label="Buyer"> label="Buyer">
<tpl-item>{{nickname}}</tpl-item>
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>

View File

@ -22,9 +22,13 @@ module.exports = Self => {
} }
}); });
Self.getItemTypeWorker = async filter => { Self.getItemTypeWorker = async(filter, options) => {
const myOptions = {};
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
if (typeof options == 'object')
Object.assign(myOptions, options);
const query = const query =
`SELECT DISTINCT u.id, u.nickname `SELECT DISTINCT u.id, u.nickname
FROM itemType it FROM itemType it

View File

@ -62,16 +62,12 @@
label="Nickname" label="Nickname"
ng-model="filter.nickname"> ng-model="filter.nickname">
</vn-textfield> </vn-textfield>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="filter.salesPersonFk" ng-model="filter.salesPersonFk"
url="Workers/activeWithInheritedRole" departments="['VT']"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Sales person"> label="Sales person">
<tpl-item>{{firstName}} {{name}}</tpl-item> </vn-worker-autocomplete>
</vn-autocomplete>
<vn-textfield <vn-textfield
vn-one vn-one
label="Invoice" label="Invoice"

View File

@ -19,17 +19,10 @@
label="State" label="State"
vn-focus> vn-focus>
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
url="Workers/activeWithInheritedRole" ng-model="$ctrl.workerFk">
ng-if="$ctrl.isPickerDesignedState" </vn-worker-autocomplete>
ng-model="$ctrl.workerFk"
show-field="nickname"
search-function="{firstName: $search}"
value-field="id"
where="{role: 'employee'}"
label="Worker">
</vn-autocomplete>
</vn-horizontal> </vn-horizontal>
</vn-card> </vn-card>
<vn-button-bar> <vn-button-bar>

View File

@ -1,7 +1,7 @@
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('activeWithInheritedRole', { Self.remoteMethod('activeWithInheritedRole', {
description: 'Returns active workers with a role', description: 'Returns active workers with an inherited role',
accessType: 'READ', accessType: 'READ',
accepts: [{ accepts: [{
arg: 'filter', arg: 'filter',

View File

@ -1,7 +1,7 @@
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('activeWithRole', { Self.remoteMethod('activeWithRole', {
description: 'Returns active workers with an inherited role', description: 'Returns active workers with a role',
accessType: 'READ', accessType: 'READ',
accepts: [{ accepts: [{
arg: 'filter', arg: 'filter',

View File

@ -0,0 +1,69 @@
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
module.exports = Self => {
Self.remoteMethodCtx('search', {
description: 'Returns an array of search results for a specified worker',
vicent marked this conversation as resolved Outdated

chatGPT: No, esa frase tiene algunos errores gramaticales y no es completamente clara en inglés.

Si intentas decir que quieres devolver un arreglo de resultados de búsqueda de un trabajador específico, la frase correcta sería:

"Returns an array of search results for a specified worker."

Esa corrección asume que estás hablando de devolver resultados de búsqueda relacionados con un trabajador en particular.

chatGPT: No, esa frase tiene algunos errores gramaticales y no es completamente clara en inglés. Si intentas decir que quieres devolver un arreglo de resultados de búsqueda de un trabajador específico, la frase correcta sería: "Returns an array of search results for a specified worker." Esa corrección asume que estás hablando de devolver resultados de búsqueda relacionados con un trabajador en particular.
accepts: [{
arg: 'filter',
type: 'object',
description: 'Filter to define conditions and paginate the data.',
vicent marked this conversation as resolved Outdated

Filter to define conditions and paginate the data.

Filter to define conditions and paginate the data.
required: true
},
{
arg: 'departmentCodes',
type: ['string'],
description: 'Department codes to search workers',
}],
returns: {
type: ['object'],
root: true
},
http: {
path: `/search`,
verb: 'GET'
}
});
Self.search = async(ctx, filter, departmentCodes) => {
const models = Self.app.models;
const conn = Self.dataSource.connector;
if (departmentCodes) {
const departments = await models.Department.find({
fields: ['id', 'sons'],
where: {code: {inq: departmentCodes}}
});
const allLeaves = await getAllLeaves(ctx, departments);
const where = {'departmentFk': {inq: allLeaves}};
filter = mergeFilters(filter, {where});
}
const stmt = new ParameterizedSQL(`
SELECT *
FROM(
SELECT DISTINCT w.id, w.code, u.name, u.nickname, u.active, b.departmentFk
FROM worker w
JOIN account.user u ON u.id = w.id
JOIN business b ON b.workerFk = w.id
) w`);
stmt.merge(conn.makeSuffix(filter));
return conn.executeStmt(stmt);
};
async function getAllLeaves(ctx, departments) {
const models = Self.app.models;
const leaves = [];
for (const department of departments) {
if (department.sons > 0) {
const subLeaves = await models.Department.getLeaves(ctx, department.id, null);
const grandLeaves = await getAllLeaves(ctx, subLeaves);
leaves.push(...grandLeaves);
}
leaves.push(department.id);
}
return leaves;
}
};

View File

@ -16,6 +16,7 @@ module.exports = Self => {
require('../methods/worker/new')(Self); require('../methods/worker/new')(Self);
require('../methods/worker/deallocatePDA')(Self); require('../methods/worker/deallocatePDA')(Self);
require('../methods/worker/allocatePDA')(Self); require('../methods/worker/allocatePDA')(Self);
require('../methods/worker/search')(Self);
require('../methods/worker/isAuthorized')(Self); require('../methods/worker/isAuthorized')(Self);
Self.validatesUniquenessOf('locker', { Self.validatesUniquenessOf('locker', {

View File

@ -37,14 +37,11 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
ng-model="$ctrl.worker.bossFk" ng-model="$ctrl.worker.bossFk"
url="Workers/activeWithInheritedRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
where="{role: 'employee'}"
label="Boss"> label="Boss">
</vn-autocomplete> </vn-worker-autocomplete>
<vn-autocomplete <vn-autocomplete
label="Marital status" label="Marital status"
data="$ctrl.maritalStatus" data="$ctrl.maritalStatus"

View File

@ -131,15 +131,12 @@
value-field="id" value-field="id"
label="Company"> label="Company">
</vn-autocomplete> </vn-autocomplete>
<vn-autocomplete <vn-worker-autocomplete
vn-one vn-one
ng-model="$ctrl.worker.bossFk" ng-model="$ctrl.worker.bossFk"
url="Workers/activeWithInheritedRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
where="{role: 'employee'}"
label="Boss"> label="Boss">
</vn-autocomplete> </vn-worker-autocomplete>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-autocomplete

View File

@ -44,13 +44,11 @@
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-worker-autocomplete
ng-model="$ctrl.department.workerFk" ng-model="$ctrl.department.workerFk"
url="Workers/activeWithInheritedRole"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}"
label="Boss department"> label="Boss department">
</vn-autocomplete> </vn-worker-autocomplete>
<vn-autocomplete <vn-autocomplete
ng-model="$ctrl.department.clientFk" ng-model="$ctrl.department.clientFk"
url="Clients/" url="Clients/"