Last fixes & tests passed
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Juan Ferrer 2020-05-06 14:38:09 +02:00
parent 6a8e1bf6b5
commit 6c14743017
75 changed files with 684 additions and 778 deletions

View File

@ -5,11 +5,11 @@ export default {
userMenuButton: '#user',
logoutButton: '#logout',
applicationsMenuVisible: '.modules-menu',
clientsButton: '.modules-menu > li[ui-sref="client.index"]',
itemsButton: '.modules-menu > li[ui-sref="item.index"]',
ticketsButton: '.modules-menu > li[ui-sref="ticket.index"]',
invoiceOutButton: '.modules-menu > li[ui-sref="invoiceOut.index"]',
claimsButton: '.modules-menu > li[ui-sref="claim.index"]',
clientsButton: '.modules-menu [ui-sref="client.index"]',
itemsButton: '.modules-menu [ui-sref="item.index"]',
ticketsButton: '.modules-menu [ui-sref="ticket.index"]',
invoiceOutButton: '.modules-menu [ui-sref="invoiceOut.index"]',
claimsButton: '.modules-menu [ui-sref="claim.index"]',
returnToModuleIndexButton: 'a[ui-sref="order.index"]',
homeButton: 'vn-topbar > div.side.start > a',
userLocalWarehouse: '.user-popover vn-autocomplete[ng-model="$ctrl.localWarehouseFk"]',
@ -56,8 +56,8 @@ export default {
cancelButton: 'vn-button[href="#!/client/index"]'
},
clientDescriptor: {
moreMenu: 'vn-client-descriptor vn-icon-menu[icon=more_vert]',
simpleTicketButton: '.vn-drop-down.shown li[name="Simple ticket"]'
moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]',
simpleTicketButton: '.vn-menu [name="simpleTicket"]'
},
clientBasicData: {
basicDataButton: 'vn-left-menu a[ui-sref="client.card.basicData"]',
@ -241,14 +241,14 @@ export default {
},
itemDescriptor: {
goBackToModuleIndexButton: 'vn-item-descriptor a[href="#!/item/index"]',
moreMenu: 'vn-item-descriptor vn-icon-menu[icon=more_vert]',
moreMenuRegularizeButton: '.vn-drop-down.shown li[name="Regularize stock"]',
moreMenu: 'vn-item-descriptor vn-icon-button[icon=more_vert]',
moreMenuRegularizeButton: '.vn-menu [name="regularizeStock"]',
regularizeQuantity: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.quantity"]',
regularizeWarehouse: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.warehouseFk"]',
editButton: 'vn-item-descriptor vn-float-button[icon="edit"]',
regularizeSaveButton: '.vn-dialog.shown tpl-buttons > button',
inactiveIcon: 'vn-item-descriptor vn-icon[icon="icon-unavailable"]',
navigateBackToIndex: 'vn-item-descriptor vn-icon[icon="chevron_left"]'
navigateBackToIndex: 'vn-item-descriptor [name="goToModuleIndex"]'
},
itemRequest: {
firstRequestItemID: 'vn-item-request vn-tbody > vn-tr:nth-child(1) > vn-td-editable:nth-child(7)',
@ -378,7 +378,7 @@ export default {
topbarSearch: 'vn-searchbar',
advancedSearchButton: 'vn-ticket-search-panel button[type=submit]',
searchButton: 'vn-searchbar vn-icon[icon="search"]',
moreMenu: 'vn-ticket-index vn-icon-menu[icon=more_vert]',
moreMenu: 'vn-ticket-index vn-icon-button[icon=more_vert]',
sixthWeeklyTicket: 'vn-ticket-weekly-index vn-table vn-tr:nth-child(6)',
weeklyTicket: 'vn-ticket-weekly-index vn-table > div > vn-tbody > vn-tr',
firstWeeklyTicketDeleteIcon: 'vn-ticket-weekly-index vn-tr:nth-child(1) vn-icon-button[icon="delete"]',
@ -397,13 +397,13 @@ export default {
idLabelValue: 'vn-ticket-descriptor vn-label-value[label="Id"]',
stateLabelValue: 'vn-ticket-descriptor vn-label-value[label="State"]',
goBackToModuleIndexButton: 'vn-ticket-descriptor a[ui-sref="ticket.index"]',
moreMenu: 'vn-ticket-descriptor vn-icon-menu[icon=more_vert]',
moreMenuAddStowaway: '.vn-drop-down.shown li[name="Add stowaway"]',
moreMenuDeleteStowawayButton: '.vn-drop-down.shown li[name="Delete stowaway"]',
moreMenuAddToTurn: '.vn-drop-down.shown li[name="Add turn"]',
moreMenuDeleteTicket: '.vn-drop-down.shown li[name="Delete ticket"]',
moreMenuMakeInvoice: '.vn-drop-down.shown li[name="Make invoice"]',
moreMenuChangeShippedHour: '.vn-drop-down.shown li[name="Change shipped hour"]',
moreMenu: 'vn-ticket-descriptor vn-icon-button[icon=more_vert]',
moreMenuAddStowaway: '.vn-menu [name="addStowaway"]',
moreMenuDeleteStowawayButton: '.vn-menu [name="deleteStowaway"]',
moreMenuAddToTurn: '.vn-menu [name="addTurn"]',
moreMenuDeleteTicket: '.vn-menu [name="deleteTicket"]',
moreMenuMakeInvoice: '.vn-menu [name="makeInvoice"]',
moreMenuChangeShippedHour: '.vn-menu [name="changeShipped"]',
changeShippedHourDialog: '.vn-dialog.shown',
changeShippedHour: '.vn-dialog.shown vn-input-time[ng-model="$ctrl.newShipped"]',
addStowawayDialogFirstTicket: '.vn-dialog.shown vn-table vn-tbody vn-tr',
@ -412,7 +412,7 @@ export default {
saturdayButton: '.vn-popup.shown vn-tool-bar > vn-button:nth-child(6)',
acceptDeleteButton: '.vn-dialog.shown button[response="accept"]',
acceptChangeHourButton: '.vn-dialog.shown button[response="accept"]',
descriptorDeliveryDate: 'vn-ticket-descriptor > div > div.body > div.attributes > vn-label-value:nth-child(6) > section > span',
descriptorDeliveryDate: 'vn-ticket-descriptor slot-body > .attributes > vn-label-value:nth-child(3) > section > span',
acceptInvoiceOutButton: '.vn-confirm.shown button[response="accept"]',
acceptDeleteStowawayButton: '.vn-dialog.shown button[response="accept"]'
},
@ -444,7 +444,7 @@ export default {
saleDescriptorPopoverSummaryButton: '.vn-popover.shown vn-item-descriptor a[ui-sref="item.card.summary({id: $ctrl.item.id})"]',
descriptorItemDiaryButton: 'vn-item-descriptor .quicklinks.ng-scope > vn-horizontal > a > vn-icon > i',
newItemFromCatalogButton: 'vn-ticket-sale vn-float-button[icon="add"]',
newItemButton: 'vn-ticket-sale > vn-vertical > vn-card > vn-vertical > vn-one > vn-icon-button > button > vn-icon > i',
newItemButton: 'vn-ticket-sale vn-card vn-icon-button[icon="add_circle"]',
moreMenu: 'vn-ticket-sale vn-tool-bar > vn-button-menu[vn-id="more-button"] > div > button',
moreMenuCreateClaim: '.vn-drop-down.shown li[name="Add claim"]',
moreMenuReserve: '.vn-drop-down.shown li[name="Mark as reserved"]',
@ -558,8 +558,8 @@ export default {
searchButton: 'vn-searchbar vn-icon[icon="search"]'
},
claimDescriptor: {
moreMenu: 'vn-claim-descriptor vn-icon-menu[icon=more_vert]',
moreMenuDeleteClaim: '.vn-drop-down.shown li[name="Delete claim"]',
moreMenu: 'vn-claim-descriptor vn-icon-button[icon=more_vert]',
moreMenuDeleteClaim: '.vn-menu [name="deleteClaim"]',
acceptDeleteClaim: '.vn-confirm.shown button[response="accept"]'
},
claimSummary: {
@ -571,7 +571,7 @@ export default {
itemDescriptorPopover: '.vn-popover.shown vn-item-descriptor',
itemDescriptorPopoverItemDiaryButton: '.vn-popover.shown vn-item-descriptor a[href="#!/item/2/diary"]',
firstDevelopmentWorker: 'vn-claim-summary vn-horizontal > vn-auto:nth-child(5) vn-table > div > vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(4) > span',
firstDevelopmentWorkerGoToClientButton: '.vn-popover.shown vn-worker-descriptor vn-quick-links > a[href="#!/client/21/summary"]',
firstDevelopmentWorkerGoToClientButton: '.vn-popover.shown vn-worker-descriptor .quicklinks a[href="#!/client/21/summary"]',
firstActionTicketId: 'vn-claim-summary > vn-card > vn-horizontal > vn-auto:nth-child(6) vn-table > div > vn-tbody > vn-tr > vn-td:nth-child(2) > span',
firstActionTicketDescriptor: '.vn-popover.shown vn-ticket-descriptor'
},
@ -782,7 +782,7 @@ export default {
weekWorkedHours: 'vn-worker-time-control vn-side-menu vn-label-value > section > span',
nextMonthButton: 'vn-worker-time-control vn-side-menu vn-calendar vn-button[icon=keyboard_arrow_right]',
secondWeekDay: 'vn-worker-time-control vn-side-menu vn-calendar .day:nth-child(8) > .day-number',
navigateBackToIndex: 'vn-worker-descriptor vn-icon[icon="chevron_left"]',
navigateBackToIndex: 'vn-worker-descriptor [name="goToModuleIndex"]',
acceptDeleteDialog: '.vn-confirm.shown button[response="accept"]'
},
invoiceOutIndex: {
@ -791,10 +791,10 @@ export default {
searchResult: 'vn-invoice-out-index vn-card > vn-table > div > vn-tbody > a.vn-tr',
},
invoiceOutDescriptor: {
moreMenu: 'vn-invoice-out-descriptor vn-icon-menu[icon=more_vert]',
moreMenuDeleteInvoiceOut: '.vn-drop-down.shown li[name="Delete Invoice"]',
moreMenuBookInvoiceOut: '.vn-drop-down.shown li[name="Book invoice"]',
moreMenuShowInvoiceOutPdf: '.vn-drop-down.shown li[name="Show invoice PDF"]',
moreMenu: 'vn-invoice-out-descriptor vn-icon-button[icon=more_vert]',
moreMenuDeleteInvoiceOut: '.vn-menu [name="deleteInvoice"]',
moreMenuBookInvoiceOut: '.vn-menu [name="bookInvoice"]',
moreMenuShowInvoiceOutPdf: '.vn-menu [name="showInvoicePdf"]',
acceptDeleteButton: '.vn-confirm.shown button[response="accept"]',
acceptBookingButton: '.vn-confirm.shown button[response="accept"]'
},
@ -846,8 +846,8 @@ export default {
confirmed: 'vn-entry-summary vn-check[label="Confirmed"]',
},
entryDescriptor: {
agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(3) span',
travelsQuicklink: 'vn-entry-descriptor vn-quick-links > a:nth-child(1)',
entriesQuicklink: 'vn-entry-descriptor vn-quick-links > a:nth-child(2)'
agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(2) span',
travelsQuicklink: 'vn-entry-descriptor .quicklinks > :nth-child(1) a',
entriesQuicklink: 'vn-entry-descriptor .quicklinks > :nth-child(2) a'
}
};

View File

@ -1,6 +1,3 @@
<tpl-title translate>
{{::$ctrl.message}}
</tpl-title>
<tpl-body translate>
{{::$ctrl.question}}
</tpl-body>

View File

@ -8,7 +8,6 @@ ngModule.vnComponent('vnConfirm', {
slotTemplate: require('./confirm.html'),
controller: Confirm,
bindings: {
question: '@',
message: '@?'
question: '@'
}
});

View File

@ -12,8 +12,11 @@
</vn-button>
<form>
<h6
ng-if="::$ctrl.$transclude.isSlotFilled('title')"
ng-if="::$ctrl.message || $ctrl.$transclude.isSlotFilled('title')"
ng-transclude="title">
<tpl-title translate>
{{$ctrl.message}}
</tpl-title>
</h6>
<div
class="body"

View File

@ -140,6 +140,7 @@ ngModule.vnComponent('vnDialog', {
buttons: '?tplButtons'
},
bindings: {
message: '@?',
onResponse: '&?',
onAccept: '&?'
}

View File

@ -7,6 +7,8 @@ vn-icon {
& > i,
& > i.material-icons {
display: block;
}
& > i.material-icons {
font-size: inherit;
}
}

View File

@ -1,27 +1,11 @@
@import "./effects";
/*
ul.menu {
list-style-type: none;
padding: 0;
padding-top: $spacing-md;
margin: 0;
font-size: inherit;
& > li > a {
@extend %clickable;
display: block;
color: inherit;
padding: 9px 32px;
}
}
*/
vn-list,
.vn-list {
display: block;
max-width: $width-sm;
margin: 0 auto;
padding: 0;
padding: $spacing-sm 0;
list-style-type: none;
vn-list,
@ -32,6 +16,8 @@ vn-list,
}
}
&.separated {
padding: 0;
vn-item,
.vn-item {
border-bottom: $border-thin-light;

View File

@ -1,6 +1,5 @@
import ngModule from '../../module';
import Popup from '../popup';
import template from './index.html';
import isMobile from '../../lib/is-mobile';
import './style.scss';
@ -17,7 +16,6 @@ export default class Popover extends Popup {
constructor(...args) {
super(...args);
this.displayMode = isMobile ? 'centered' : 'relative';
this.template = template;
}
/**
@ -48,7 +46,6 @@ export default class Popover extends Popup {
// Bug #2147 Popover loses parent location
set parent(value) {
this.__parent = value;
if (!value) return;
const parentRect = value.getBoundingClientRect();
@ -119,3 +116,7 @@ export default class Popover extends Popup {
ngModule.vnComponent('vnPopover', {
controller: Popover
});
ngModule.run(['$compile', function($compile) {
Popover.prototype.contentLinkFn = $compile(require('./index.html'));
}]);

View File

@ -1,6 +1,5 @@
import ngModule from '../../module';
import Component from '../../lib/component';
import template from './index.html';
import './style.scss';
/**
@ -11,7 +10,6 @@ export default class Popup extends Component {
super(...args);
this._shown = false;
this.displayMode = 'centered';
this.template = template;
}
$onDestroy() {
@ -45,11 +43,11 @@ export default class Popup extends Component {
}
this.$contentScope = this.$.$new();
let linkFn = this.$compile(this.template);
this.popup = linkFn(this.$contentScope, null,
this.contentLinkFn(
this.$contentScope,
element => this.popup = element[0],
{parentBoundTranscludeFn: this.$transclude}
)[0];
);
this.windowEl = this.popup.querySelector('.window');
this.windowEl.focus();
@ -131,3 +129,7 @@ ngModule.vnComponent('vnPopup', {
},
installClasses: false
});
ngModule.run(['$compile', function($compile) {
Popup.prototype.contentLinkFn = $compile(require('./index.html'));
}]);

View File

@ -5,6 +5,7 @@ vn-spinner {
min-height: 28px;
min-width: 28px;
color: $color-main;
overflow: hidden;
& > .loader {
position: relative;

View File

@ -9,12 +9,12 @@ function vnAcl(aclService) {
priority: -1,
link: function(_, $element, $attrs) {
acls = $attrs.vnAcl.split(',').map(i => i.trim());
if (acls[0] == '') return;
let action = $attrs.vnAclAction || 'disable';
if (aclService.hasAny(acls)) return;
console.log('acls', acls, action);
if (action === 'disable') {
let element = $element[0];

View File

@ -6,11 +6,9 @@
</vn-icon-button>
<vn-dialog
class="modal-form"
vn-id="uvc">
vn-id="uvc"
message="Fields to show">
<tpl-body>
<vn-horizontal class="vn-pa-md header">
<h5><span translate>Fields to show</span></h5>
</vn-horizontal>
<div class="vn-pa-md">
<vn-horizontal ng-repeat="field in fields">
<vn-check

15
front/core/filters/id.js Normal file
View File

@ -0,0 +1,15 @@
import ngModule from '../module';
/**
* Formats the value as id.
*
* @return {String} The formated value
*/
export default function id() {
return function(value) {
if (value == null || value === '')
return '';
return `#${value}`;
};
}
ngModule.filter('id', id);

View File

@ -4,3 +4,4 @@ import './dash-if-empty';
import './percentage';
import './currency';
import './zero-fill';
import './id';

View File

@ -87,7 +87,7 @@ export default class Component extends EventEmitter {
* Fills a named transclude slot.
*
* @param {String} slot The trasnclude slot name
* @param {JQElement|String} template The slot name
* @param {JQElement|String} template The slot template
*/
fillSlot(slot, template) {
const linkFn = this.$compile(template);
@ -196,6 +196,7 @@ runFn.$inject = [
'vnApp',
'vnToken',
'vnConfig',
'vnModules',
'aclService'
];

View File

@ -10,15 +10,10 @@ export default class Modules {
});
}
reset() {
this.modules = null;
}
get() {
if (this.modules)
return this.modules;
fetch() {
const map = {};
const modules = [];
for (let mod of this.$window.routes) {
if (!mod || !mod.routes) continue;
@ -32,12 +27,15 @@ export default class Modules {
if (res) keyBind = res.key.toUpperCase();
}
modules.push({
const module = {
name: mod.name || mod.module,
icon: mod.icon || null,
route,
keyBind
});
};
modules.push(module);
map[mod.module] = mod;
}
const sortedModules = modules.sort((a, b) => {
@ -46,9 +44,23 @@ export default class Modules {
return translatedNameA.localeCompare(translatedNameB);
});
this.modules = sortedModules;
this.map = map;
}
reset() {
this.modules = null;
this.map = null;
}
get() {
if (!this.modules) this.fetch();
return this.modules;
}
getMap() {
if (!this.map) this.fetch();
return this.map;
}
}
Modules.$inject = ['aclService', '$window', '$translate'];

View File

@ -39,3 +39,8 @@
/* Support for IE. */
font-feature-settings: 'liga';
}
[class^="icon-"] {
padding: .1em;
font-size: .833em;
}

View File

@ -32,7 +32,7 @@ html [vn-auto], vn-auto, .vn-auto {
flex: initial;
}
html [vn-none], vn-none, .vn-none {
flex: none 0 1px;
flex: 0 0 auto;
}
html [vn-one], vn-one, .vn-one {
flex: 1;

View File

@ -6,21 +6,22 @@ export default class DescriptorPopover extends Popover {
show(parent, id) {
super.show(parent);
const descriptor = this.content.querySelector('.vn-descriptor');
descriptor.$ctrl.load(id)
.then(() => {
this.$.$applyAsync(() => this.relocate());
});
this.id = id;
this.descriptor = this.content.querySelector('.vn-descriptor').$ctrl;
this.descriptor.load(id)
.then(() => this.$.$applyAsync(() => this.relocate()));
}
hide() {
super.hide();
this.id = null;
this.descriptor = null;
}
}
ngModule.vnComponent('vnDescriptorPopover', {
slotTemplate: require('./index.html'),
controller: DescriptorPopover,
bindings: {
id: '<?',
entity: '<?',
},
transclude: {
descriptor: '?slotDescriptor'
}

View File

@ -1,16 +1,11 @@
@import "variables";
.vn-descriptor-popover {
.content > vn-spinner {
padding: $spacing-md;
display: block;
margin: 0 auto;
height: 45px;
}
.descriptor-wrapper {
vn-descriptor-content > .descriptor {
width: 260px;
}
.vn-descriptor > .header > a:first-child {
& > .header > a:first-child {
visibility: hidden;
}
}
}

View File

@ -2,12 +2,15 @@
ng-if="$ctrl.descriptor.canceler"
enable="true">
</vn-spinner>
<div ng-if="$ctrl.descriptor.entity">
<div
ng-if="!$ctrl.descriptor.canceler"
class="descriptor">
<div class="header">
<a
translate-attr="{title: 'Return to module index'}"
ui-sref="{{::$ctrl.module}}.index">
<vn-icon icon="chevron_left"></vn-icon>
translate-attr="{title: 'Go to module index'}"
ui-sref="{{::$ctrl.module}}.index"
name="goToModuleIndex">
<vn-icon icon="{{$ctrl.moduleMap[$ctrl.module].icon}}"></vn-icon>
</a>
<a
translate-attr="{title: 'Preview'}"
@ -15,12 +18,23 @@
<vn-icon icon="desktop_windows"></vn-icon>
</a>
<vn-icon-button
ng-class="::{invisible: !$ctrl.$transclude.isSlotFilled('menu')}"
icon="more_vert"
vn-popover="menu">
</vn-icon-button>
</div>
<vn-menu vn-id="menu">
<div ng-transclude="menu"></div>
<vn-list ng-transclude="menu"></vn-list>
</vn-menu>
<div ng-transclude="before"></div>
<div class="body">
<div class="top">
<h5>{{$ctrl.description}}</h5>
<div class="text-secondary">
{{$ctrl.descriptor.id | id}}
</div>
</div>
<div ng-transclude="body"></div>
</div>
<div ng-transclude="after"></div>
</div>

View File

@ -3,16 +3,18 @@ import Component from 'core/lib/component';
import './style.scss';
import './quick-link';
/**
* Small card with basing entity information and actions.
*/
export default class Descriptor extends Component {
$postLink() {
const content = this.element.querySelector('vn-descriptor-content');
if (!content) throw new Error('Directive vnDescriptorContent not found');
if (content) {
angular.element(content)
.controller('vnDescriptorContent')
.descriptor = this;
}
}
get id() {
return this._id;
@ -114,13 +116,26 @@ ngModule.vnComponent('vnDescriptor', {
}
});
export class DescriptorContent {
constructor($transclude, vnModules) {
this.$transclude = $transclude;
this.moduleMap = vnModules.getMap();
}
}
DescriptorContent.$inject = ['$transclude', 'vnModules'];
ngModule.component('vnDescriptorContent', {
template: require('./index.html'),
controller: DescriptorContent,
bindings: {
module: '@'
module: '@',
description: '<',
descriptor: '<?'
},
transclude: {
body: 'slotBody',
before: '?slotBefore',
after: '?slotAfter',
menu: '?slotMenu'
}
});

View File

@ -2,7 +2,14 @@
@import "./effects";
@import "./variables";
.vn-descriptor > vn-descriptor-content {
vn-descriptor-content {
display: block;
& > vn-spinner {
display: block;
height: 40px;
padding: $spacing-md;
}
& > div {
display: block;
box-shadow: 0 1px 3px $color-shadow;
@ -15,13 +22,16 @@
color: $color-font-dark;
& > * {
@extend %clickable;
display: flex;
min-width: 45px;
height: 45px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
}
& > a,
& > vn-icon-button {
@extend %clickable;
color: inherit;
& > vn-icon {
@ -32,27 +42,34 @@
}
}
}
& > div > slot-body {
& > .body {
display: block;
padding: $spacing-sm;
padding: $spacing-md;
& > .top {
padding-bottom: $spacing-sm;
& > * {
padding: $spacing-sm;
}
& > .attributes > h5 {
padding-bottom: $spacing-sm;
margin-bottom: 0;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
& > div > slot-body {
& > * {
padding-bottom: $spacing-md;
}
& > :last-child {
padding-bottom: 0;
}
& > .icons {
display: flex;
align-items: center;
justify-content: center;
padding: 0;
& > vn-icon {
padding: $spacing-sm;
padding: $spacing-xs $spacing-sm;
color: $color-marginal;
font-size: 1.5rem;
@ -83,3 +100,4 @@
}
}
}
}

View File

@ -39,18 +39,26 @@
</vn-icon-button>
</div>
<vn-menu vn-id="apps-menu">
<ul class="modules-menu vn-pa-sm">
<li ui-sref="home">
<vn-list class="modules-menu">
<a class="vn-item" ui-sref="home">
<vn-item-section avatar>
<vn-icon icon="home"></vn-icon>
<span translate>Home</span>
</li>
<li
</vn-item-section>
<vn-item-section translate>
Home
</vn-item-section>
</a>
<a class="vn-item"
ng-repeat="mod in ::$ctrl.modules"
ui-sref="{{::mod.route.state}}">
<vn-item-section avatar>
<vn-icon icon="{{::mod.icon || 'photo'}}"></vn-icon>
<span translate>{{::mod.name}}</span>
</li>
</ul>
</vn-item-section>
<vn-item-section translate>
{{::mod.name}}
</vn-item-section>
</a>
</vn-list>
</vn-menu>
<vn-user-popover
vn-id="user-popover">

View File

@ -142,29 +142,6 @@ vn-layout {
}
}
}
.vn-popover .modules-menu {
list-style-type: none;
margin: 0;
color: $color-font-dark;
& > li {
@extend %clickable-light;
background-color: $color-main;
margin-bottom: 9px;
padding: 12px;
border-radius: 1px;
min-width: 128px;
white-space: nowrap;
&:last-child {
margin-bottom: 0;
}
& > vn-icon {
padding-right: 4px;
vertical-align: middle;
}
}
}
#user {
font-size: 1.5rem;
height: auto;

View File

@ -3,10 +3,7 @@
@import "variables";
vn-left-menu {
& > .vn-list {
padding: $spacing-md 0;
& > li > .vn-item {
& > .vn-list > li > .vn-item {
& > [side] > vn-icon[icon="keyboard_arrow_down"] {
transition: transform 200ms;
}
@ -15,4 +12,3 @@ vn-left-menu {
}
}
}
}

View File

@ -12,7 +12,7 @@ Name: Nombre
Preview: Vista previa
Profile: Perfil
Push on applications menu: Para abrir un módulo pulsa en el menú de aplicaciones
Return to module index: Volver a la página principal del módulo
Go to module index: Ir al índice del módulo
What is new: Novedades de la versión
Settings: Ajustes

View File

@ -130,5 +130,6 @@
"ORDER_ROW_UNAVAILABLE": "No hay disponibilidad de este producto",
"Distance must be lesser than 1000": "La distancia debe ser inferior a 1000",
"This ticket is deleted": "Este ticket está eliminado",
"A travel with this data already exists": "Ya existe un travel con estos datos"
"A travel with this data already exists": "Ya existe un travel con estos datos",
"AMOUNT_NOT_MATCH_GROUPING": "AMOUNT_NOT_MATCH_GROUPING"
}

View File

@ -1,36 +1,28 @@
<vn-descriptor-content module="claim">
<vn-descriptor-content
module="claim"
description="$ctrl.claim.client.name">
<slot-menu>
<ul class="vn-list">
<li>
<a class="vn-item"
ui-sref="ticket.create({clientFk: $ctrl.client.id})"
translate>
Show Pickup order
</a>
</li>
<li>
<div class="vn-item"
<vn-item
ng-click="confirmPickupOrder.show()"
translate>
Send Pickup order
</div>
</li>
<li vn-acl="salesAssistant">
<div class="vn-item"
</vn-item>
<vn-item
vn-acl="salesAssistant"
vn-acl-action="remove"
ng-click="confirmDeleteClaim.show()"
name="deleteClaim"
translate>
Delete claim
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<h5>{{$ctrl.claim.id}}</h5>
<vn-label-value
label="Client"
value="{{::$ctrl.claim.client.name}}">
</vn-label-value>
<vn-label-value
label="State"
value="{{$ctrl.claim.claimState.description}}">
@ -76,15 +68,14 @@
</slot-body>
</vn-descriptor-content>
<vn-confirm
vn-id="confirm-pickup-order"
vn-id="confirmPickupOrder"
on-accept="$ctrl.sendPickupOrder()"
question="Send Pickup order"
message="Are you sure you want to send it?">
</vn-confirm>
<vn-confirm
vn-id="confirm-delete-claim"
vn-id="confirmDeleteClaim"
on-accept="$ctrl.deleteClaim()"
question="Delete claim"
message="Are you sure you want to delete this claim?">
</vn-confirm>

View File

@ -81,10 +81,10 @@
</a>
<!-- Add Lines Dialog -->
<vn-dialog vn-id="add-sales" class="modal-form">
<tpl-title>
<span translate>Claimable sales from ticket</span> {{$ctrl.claim.ticketFk}}
</tpl-title>
<tpl-body>
<vn-horizontal class="header vn-pa-md">
<h5><span translate>Claimable sales from ticket</span> {{$ctrl.claim.ticketFk}}</h5>
</vn-horizontal>
<vn-horizontal class="vn-pa-md">
<vn-table>
<vn-thead>

View File

@ -150,9 +150,9 @@
<!-- Create custom agent dialog -->
<vn-dialog class="edit"
vn-id="customAgent"
on-accept="$ctrl.onCustomAgentAccept()">
on-accept="$ctrl.onCustomAgentAccept()"
message="New customs agent">
<tpl-body>
<h5 class="vn-py-sm" translate>New customs agent</h5>
<vn-horizontal>
<vn-textfield vn-one vn-focus
label="NIF"

View File

@ -198,9 +198,9 @@
<!-- Create custom agent dialog -->
<vn-dialog class="edit"
vn-id="customAgent"
on-accept="$ctrl.onCustomAgentAccept()">
on-accept="$ctrl.onCustomAgentAccept()"
message="New customs agent">
<tpl-body>
<h5 class="vn-py-sm" translate>New customs agent</h5>
<vn-horizontal>
<vn-textfield vn-one vn-focus
label="NIF"

View File

@ -98,9 +98,9 @@
<!-- Create bank entity dialog -->
<vn-dialog class="edit"
vn-id="bankEntityDialog"
on-accept="$ctrl.onBankEntityAccept()">
on-accept="$ctrl.onBankEntityAccept()"
message="New bank entity">
<tpl-body>
<h5 class="vn-py-sm" translate>New bank entity</h5>
<vn-horizontal>
<vn-textfield
vn-one

View File

@ -1,36 +1,26 @@
<vn-descriptor-content module="client">
<vn-descriptor-content
module="client"
description="$ctrl.client.name">
<slot-menu>
<ul class="vn-list">
<li>
<a class="vn-item"
ui-sref="ticket.create({clientFk: $ctrl.client.id})"
name="simpleTicket"
translate>
Simple ticket
</a>
</li>
<li>
<div class="vn-item"
<vn-item
ng-click="$ctrl.showSMSDialog()"
translate>
Send SMS
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="consumerReportDialog.show()"
translate>
Send consumer report
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<h5>{{$ctrl.client.name}}</h5>
<vn-label-value
label="Id"
value="{{$ctrl.client.id}}">
</vn-label-value>
<vn-label-value
label="Phone"
value="{{$ctrl.client.phone | phone}}">
@ -101,12 +91,9 @@
</vn-client-sms>
<vn-dialog
vn-id="consumerReportDialog"
on-accept="$ctrl.onConsumerReportAccept()">
on-accept="$ctrl.onConsumerReportAccept()"
message="Send consumer report">
<tpl-body>
<div>
<h5 style="text-align: center">
<span translate>Send consumer report</span>
</h5>
<vn-date-picker
vn-id="from"
vn-one
@ -120,7 +107,6 @@
ng-model="$ctrl.to"
label="To date">
</vn-date-picker>
</div>
</tpl-body>
<tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>

View File

@ -1,9 +1,9 @@
<vn-dialog class="edit"
vn-id="postcodeDialog"
on-open="$ctrl.onOpen()"
on-accept="$ctrl.onAccept()">
on-accept="$ctrl.onAccept()"
message="New postcode">
<tpl-body>
<h5 class="vn-py-sm" translate>New postcode</h5>
<p translate>Please, ensure you put the correct data!</p>
<vn-horizontal>
<vn-textfield

View File

@ -1,12 +1,12 @@
{
"module": "client",
"name": "Clients",
"icon": "icon-person",
"icon": "person",
"validations" : true,
"dependencies": ["worker", "invoiceOut"],
"menus": {
"main": [
{"state": "client.index", "icon": "icon-person"}
{"state": "client.index", "icon": "person"}
],
"card": [
{"state": "client.card.basicData", "icon": "settings"},

View File

@ -1,23 +1,18 @@
<vn-descriptor-content module="entry">
<vn-descriptor-content
module="entry"
description="$ctrl.entry.supplier.nickname">
<slot-menu>
<ul class="vn-list">
<li>
<div class="vn-item"
<vn-item
ng-click="$ctrl.showEntryReport()"
translate>
Show entry report
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<vn-label-value label="Id"
value="{{$ctrl.entry.id}}">
</vn-label-value>
<vn-label-value label="Supplier"
value="{{$ctrl.entry.supplier.nickname}}">
</vn-label-value>
<vn-label-value label="Agency "
value="{{$ctrl.entry.travel.agency.name}}">
</vn-label-value>

View File

@ -11,10 +11,14 @@ class Controller extends Descriptor {
}
get travelFilter() {
return JSON.stringify({agencyFk: this.entry.travel.agencyFk});
return this.entry && JSON.stringify({
agencyFk: this.entry.travel.agencyFk
});
}
get entryFilter() {
if (!this.entry) return null;
const date = new Date(this.entry.travel.landed);
date.setHours(0, 0, 0, 0);
@ -25,7 +29,7 @@ class Controller extends Descriptor {
to.setDate(to.getDate() + 10);
return JSON.stringify({
supplierFk: this.entry.travel.supplierFk,
supplierFk: this.entry.supplierFk,
from,
to
});

View File

@ -58,7 +58,8 @@
<vn-icon
ng-if="entry.notes.length"
vn-tooltip="{{::entry.notes}}"
icon="insert_drive_file">
icon="insert_drive_file"
class="bright">
</vn-icon>
</vn-td>
</a>

View File

@ -1,6 +1,5 @@
import ngModule from '../module';
import Section from 'salix/components/section';
import './style.scss';
export default class Controller extends Section {}

View File

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

View File

@ -3,8 +3,4 @@
vn-entry-summary .summary {
max-width: $width-lg;
vn-icon[icon=insert_drive_file]{
color: $color-font-secondary;
}
}

View File

@ -1,33 +1,33 @@
<vn-descriptor-content module="invoiceOut">
<vn-descriptor-content
module="invoiceOut"
description="$ctrl.invoiceOut.ref">
<slot-menu>
<ul class="vn-list">
<li>
<a class="vn-item"
href="api/InvoiceOuts/{{$ctrl.id}}/download?access_token={{$ctrl.vnToken.token}}"
target="_blank"
name="showInvoicePdf"
translate>
Show invoice PDF
</a>
</li>
<li vn-acl="invoicing">
<div class="vn-item"
<vn-item
ng-click="deleteConfirmation.show()"
vn-acl="invoicing"
vn-acl-action="remove"
name="deleteInvoice"
translate>
Delete Invoice
</div>
</li>
<li vn-acl="invoicing">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="bookConfirmation.show()"
vn-acl="invoicing"
vn-acl-action="remove"
name="bookInvoice"
translate>
Book invoice
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<h5>{{$ctrl.invoiceOut.ref}}</h5>
<vn-label-value
label="Date"
value="{{$ctrl.invoiceOut.issued | date: 'dd/MM/yyyy'}}">

View File

@ -3,8 +3,4 @@
vn-invoice-out-summary .summary {
max-width: $width-lg;
vn-icon[icon=insert_drive_file]{
color: $color-font-secondary;
}
}

View File

@ -145,9 +145,9 @@
<!-- Create custom agent dialog -->
<vn-dialog class="edit"
vn-id="intrastat"
on-accept="$ctrl.onIntrastatAccept()">
on-accept="$ctrl.onIntrastatAccept()"
message="New intrastat">
<tpl-body>
<h5 class="vn-py-sm" translate>New intrastat</h5>
<vn-horizontal>
<vn-input-number vn-one vn-focus
label="Identifier"

View File

@ -3,7 +3,7 @@
<btn-three>
<vn-quick-link
tooltip="Item diary"
state="['item.card.diary']"
state="['item.card.diary', {id: $ctrl.id, warehouseFk: $ctrl.warehouseFk, ticketFk: $ctrl.ticketFk}]"
icon="icon-transaction">
</vn-quick-link>
</btn-three>

View File

@ -1,15 +1,7 @@
import ngModule from '../module';
import DescriptorPopover from 'salix/components/descriptor-popover';
class Controller extends DescriptorPopover {
get diaryParams() {
return {
id: this.descriptor && this.descriptor.id,
warehouseFk: this.warehouseFk,
ticketFk: this.ticketFk
};
}
}
class Controller extends DescriptorPopover {}
ngModule.vnComponent('vnItemDescriptorPopover', {
slotTemplate: require('./index.html'),

View File

@ -1,17 +1,15 @@
<vn-descriptor-content module="item">
<vn-descriptor-content
module="item"
description="$ctrl.item.name">
<slot-menu>
<ul class="vn-list">
<li>
<div class="vn-item"
<vn-item
ng-click="regularize.show()"
name="regularizeStock"
translate>
Regularize stock
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div>
<slot-before>
<div style="position: relative" text-center>
<img
ng-src="{{::$root.imagePath}}/catalog/200x200/{{$ctrl.item.image}}"
@ -36,13 +34,9 @@
<p>{{$ctrl.available | dashIfEmpty}}</p>
</vn-one>
</vn-horizontal>
</div>
</slot-before>
<slot-body>
<div class="attributes">
<h5>{{$ctrl.item.id}}</h5>
<vn-label-value
label="Name"
value="{{$ctrl.item.name}}">
</vn-label-value>
<vn-label-value
label="Buyer"
value="{{$ctrl.item.itemType.worker.user.nickname}}">
@ -71,10 +65,8 @@
vn-id="regularize"
on-open="$ctrl.warehouseFk = $ctrl.vnConfig.warehouseFk"
on-close="$ctrl.clearRegularizeDialog()"
on-accept="$ctrl.saveRegularize()">
<tpl-title translate>
Regularize stock
</tpl-title>
on-accept="$ctrl.saveRegularize()"
message="Regularize stock">
<tpl-body>
<vn-textfield
label="Type the visible quantity"

View File

@ -1,16 +1,9 @@
vn-item-descriptor {
display: block;
img[ng-src] {
min-height: 16em;
height: 100%;
width: 100%;
display: block;
}
vn-dialog[vn-id=regularize]{
.vn-textfield{
width: 100%
}
}
}

View File

@ -86,7 +86,8 @@
<vn-icon
ng-if="request.response.length"
translate-attr="{title: request.response}"
icon="insert_drive_file">
icon="insert_drive_file"
class="bright">
</vn-icon>
<vn-icon-button
ng-if="request.isOk != 0"
@ -113,10 +114,8 @@
<vn-dialog
vn-id="denyDialog"
on-accept="$ctrl.onDenyAccept($data)"
on-close="$ctrl.denyObservation = null">
<tpl-title translate>
Specify the reasons to deny this request
</tpl-title>
on-close="$ctrl.denyObservation = null"
message="Specify the reasons to deny this request">
<tpl-body>
<vn-textarea
ng-model="$ctrl.denyObservation"

View File

@ -12,7 +12,4 @@ vn-item-request {
width: 100%
}
}
vn-icon[icon=insert_drive_file]{
color: $color-font-secondary;
}
}

View File

@ -1,4 +1,3 @@
<vn-crud-model
url="ItemCategories"
data="categories"
@ -18,8 +17,8 @@
on-search="$ctrl.onSearch($params)">
</vn-searchbar>
</vn-portal>
<vn-order-catalog-view model="model"
<vn-order-catalog-view
model="model"
order="$ctrl.order">
</vn-order-catalog-view>
<vn-side-menu side="right">

View File

@ -1,25 +1,15 @@
<vn-descriptor-content module="order">
<vn-descriptor-content
module="order"
description="$ctrl.order.client.name">
<slot-menu>
<ul class="vn-list">
<li>
<div class="vn-item"
<vn-item
ng-click="deleteOrderConfirmation.show()"
translate>
Delete order
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<vn-label-value
label="ID"
value="{{$ctrl.order.id}}">
</vn-label-value>
<vn-label-value
label="Client"
value="{{$ctrl.order.client.name}}">
</vn-label-value>
<vn-label-value
label="State"
value="{{$ctrl.$t($ctrl.order.isConfirmed ? 'Confirmed' : 'Not confirmed')}}">

View File

@ -1,19 +1,11 @@
<vn-popover vn-id="popover" on-close="$ctrl.clear()">
<div class="vn-descriptor vn-order-prices-popover">
<div class="header">
<span></span>
<a translate-attr="{title: 'Preview'}" ui-sref="item.card.summary({id: $ctrl.item.id})">
<vn-icon icon="desktop_windows"></vn-icon>
</a>
<span></span>
</div>
<div class="body vn-pa-md">
<default>
<vn-descriptor-content
module="item"
description="$ctrl.item.name"
descriptor="$ctrl"
class="vn-order-prices-popover">
<slot-body>
<div class="attributes">
<h5>{{$ctrl.item.name}}</h5>
<vn-label-value
label="Id"
value="{{$ctrl.item.id}}">
</vn-label-value>
<vn-label-value
label="Buyer"
value="{{$ctrl.item.firstName}} {{$ctrl.item.lastName}}">
@ -24,10 +16,15 @@
value="{{::tag.value}}">
</vn-label-value>
</div>
<vn-quick-links
links="$ctrl.quicklinks">
</vn-quick-links>
<div class="quicklinks">
<vn-quick-link
tooltip="Diary"
state="['item.card.diary', {id: $ctrl.id}]"
icon="icon-transaction">
</vn-quick-link>
</div>
</slot-body>
<slot-after>
<form name="form" class="prices">
<vn-table>
<vn-tbody>
@ -43,9 +40,7 @@
<div>
<span
ng-click="$ctrl.addQuantity(price)"
class="link unselectable">
{{::price.grouping}}
</span>
class="link unselectable">{{::price.grouping}}</span>
<span> x {{::price.price | currency: 'EUR': 2}}</span>
</div>
<div class="price-kg" ng-show="::price.priceKg">
@ -75,5 +70,6 @@
</vn-submit>
</div>
</form>
</div>
</vn-popover>
</slot-after>
</vn-descriptor-content>
</default>

View File

@ -1,10 +1,10 @@
import ngModule from '../module';
import Component from 'core/lib/component';
import Popover from 'core/components/popover';
import './style.scss';
class Controller extends Component {
constructor($element, $) {
super($element, $);
class Controller extends Popover {
constructor(...args) {
super(...args);
this.totalBasquet = 0;
}
@ -19,37 +19,32 @@ class Controller extends Component {
}
getTags() {
let filter = {
where: {itemFk: this.item.id,
priority: {gte: 4}},
const filter = {
where: {
itemFk: this.id,
priority: {gte: 4}
},
order: 'priority ASC',
include: {relation: 'tag'}
};
this.quicklinks = {
btnOne: {
icon: 'icon-transaction',
state: `item.card.diary({id: ${this.item.id}})`,
tooltip: 'Diary'
}
};
this.$http.get(`ItemTags?filter=${JSON.stringify(filter)}`).then(response => {
this.tags = response.data;
this.$.$applyAsync(() => {
this.$.popover.relocate();
});
this.$http.get(`ItemTags`, {filter})
.then(res => {
this.tags = res.data;
this.$.$applyAsync(() => this.relocate());
});
}
show(event, item) {
show(parent, item) {
this.item = JSON.parse(JSON.stringify(item));
this.id = item.id;
this.prices = this.item.prices;
this.getTags();
this.$.popover.parent = event.target;
this.$.popover.show();
this.$.popover.relocate();
super.show(parent);
}
clear() {
hide() {
super.hide();
this.id = null;
this.item = {};
this.tags = {};
this._prices = {};
@ -76,7 +71,7 @@ class Controller extends Component {
}
getFilledLines() {
let filledLines = [];
const filledLines = [];
let match;
this.prices.forEach(price => {
if (price.quantity && price.quantity > 0) {
@ -96,30 +91,28 @@ class Controller extends Component {
submit() {
this.calculateTotal();
let filledLines = this.getFilledLines();
const filledLines = this.getFilledLines();
if (filledLines.length <= 0) {
this.vnApp.showError(this.$translate.instant('First you must add some quantity'));
this.vnApp.showError(this.$t('First you must add some quantity'));
return;
}
let params = {
const params = {
orderFk: this.order.id,
items: filledLines
};
this.$http.post(`OrderRows/addToOrder`, params).then(res => {
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
this.$.popover.hide();
if (this.card)
this.card.reload();
this.$http.post(`OrderRows/addToOrder`, params)
.then(() => {
this.vnApp.showSuccess(this.$t('Data saved!'));
this.hide();
if (this.card) this.card.reload();
});
}
}
ngModule.component('vnOrderPricesPopover', {
template: require('./index.html'),
ngModule.vnComponent('vnOrderPricesPopover', {
slotTemplate: require('./index.html'),
controller: Controller,
bindings: {
order: '<'

View File

@ -1,8 +1,11 @@
@import "variables";
.vn-order-prices-popover {
display: block;
max-width: 350px;
.header > a:first-child {
visibility: hidden;
}
img[ng-src] {
height: 100%;
width: 100%;

View File

@ -3,7 +3,7 @@
<btn-three>
<vn-quick-link
tooltip="Route summary"
state="['route.card.summary', {id: $ctrl.descriptor.id}]"
state="['route.card.summary', {id: $ctrl.id}]"
icon="icon-delivery">
</vn-quick-link>
</btn-three>

View File

@ -1,36 +1,27 @@
<vn-descriptor-content module="route">
<vn-descriptor-content
module="route"
description="$ctrl.route.name">
<slot-menu>
<ul class="vn-list">
<li>
<div class="vn-item"
<vn-item
ng-click="$ctrl.showRouteReport()"
translate>
Show route report
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="$ctrl.sendRouteReport()"
translate>
Send route report
</div>
</li>
<li vn-acl="deliveryBoss">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="updateVolumeConfirmation.show()"
vn-acl="deliveryBoss"
vn-acl-action="remove"
translate>
Update volume
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<h5>{{$ctrl.route.name}}</h5>
<vn-label-value
label="Id"
value="{{$ctrl.route.id}}">
</vn-label-value>
<vn-label-value
label="Date"
value="{{$ctrl.route.created | date: 'dd/MM/yyyy'}}">

View File

@ -90,7 +90,8 @@
<vn-icon
ng-if="ticket.notes.length"
vn-tooltip="{{ticket.notes[0].description}}"
icon="insert_drive_file">
icon="insert_drive_file"
class="bright">
</vn-icon>
</vn-td>
</vn-tr>

View File

@ -3,8 +3,4 @@
vn-route-summary .summary {
max-width: $width-lg;
vn-icon[icon=insert_drive_file]{
color: $color-font-secondary;
}
}

View File

@ -78,11 +78,12 @@
<vn-td>{{ticket.address.postalCode}}</vn-td>
<vn-td expand title="{{ticket.address.street}}">{{ticket.address.street}}</vn-td>
<vn-td shrink>
<vn-icon-button
<vn-icon
ng-if="ticket.notes.length"
title="::{{ticket.notes[0].description}}"
icon="insert_drive_file">
</vn-icon-button>
icon="insert_drive_file"
class="bright">
</vn-icon>
</vn-td>
<vn-td>
<vn-icon-button
@ -117,10 +118,8 @@
</vn-crud-model>
<vn-dialog
vn-id="possibleTicketsDialog"
on-response="$ctrl.setTicketsRoute($response)">
<tpl-title translate>
Tickets to add
</tpl-title>
on-response="$ctrl.setTicketsRoute($response)"
message="Tickets to add">
<tpl-body>
<vn-data-viewer class="vn-pa-md" model="possibleTicketsModel">
<vn-table model="possibleTicketsModel" auto-load="false">

View File

@ -5,11 +5,9 @@
<vn-dialog
vn-id="dialog"
class="modal-form"
on-open="model.refresh()">
on-open="model.refresh()"
message="Stowaways to add">
<tpl-body>
<section class="add-stowaway header vn-pa-md">
<h5><span translate>Stowaways to add</span></h5>
</section>
<vn-horizontal class="add-stowaway vn-pa-md">
<vn-data-viewer model="model">
<vn-table model="model" auto-load="false">

View File

@ -1,103 +1,89 @@
<vn-descriptor-content module="ticket">
<vn-descriptor-content
module="ticket"
description="$ctrl.ticket.client.name">
<slot-menu>
<ul class="vn-list">
<li vn-acl="buyer">
<div class="vn-item"
<vn-item
ng-click="addTurn.show()"
vn-acl="buyer"
vn-acl-action="remove"
name="addTurn"
translate>
Add turn
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="$ctrl.showDeliveryNote()"
translate>
Show Delivery Note
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="confirmDeliveryNote.show()"
translate>
Send Delivery Note
</div>
</li>
<li ng-show="$ctrl.isEditable">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="deleteConfirmation.show()"
ng-show="$ctrl.isEditable"
name="deleteTicket"
translate>
Delete ticket
</div>
</li>
<li ng-show="$ctrl.isEditable">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="$ctrl.showChangeShipped()"
ng-show="$ctrl.isEditable"
name="changeShipped"
translate>
Change shipped hour
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="$ctrl.sendPaymentSms()"
translate>
SMS Pending payment
</div>
</li>
<li>
<div class="vn-item"
</vn-item>
<vn-item
ng-click="$ctrl.sendImportSms()"
translate>
SMS Minimum import
</div>
</li>
<li ng-show="$ctrl.canShowStowaway">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="addStowaway.show()"
ng-show="$ctrl.canShowStowaway"
name="addStowaway"
translate>
Add stowaway
</div>
</li>
<li ng-show="$ctrl.shouldShowDeleteStowaway">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="deleteStowaway.show()"
ng-show="$ctrl.shouldShowDeleteStowaway"
name="deleteStowaway"
translate>
Delete stowaway
</div>
</li>
<li ng-show="!$ctrl.isInvoiced" vn-acl="invoicing">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="makeInvoiceConfirmation.show()"
ng-show="!$ctrl.isInvoiced"
vn-acl="invoicing"
vn-acl-action="remove"
name="makeInvoice"
translate>
Make invoice
</div>
</li>
<li ng-show="$ctrl.isInvoiced" vn-acl="invoicing">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="regenerateInvoiceConfirmation.show()"
ng-show="$ctrl.isInvoiced"
vn-acl="invoicing"
vn-acl-action="remove"
translate>
Regenerate invoice
</div>
</li>
<li ng-show="$ctrl.isEditable">
<div class="vn-item"
</vn-item>
<vn-item
ng-click="recalculateComponentsConfirmation.show()"
ng-show="$ctrl.isEditable"
translate>
Recalculate components
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<h5>{{::$ctrl.client.name}}</h5>
<vn-label-value
label="Id"
value="{{$ctrl.ticket.id}}">
</vn-label-value>
<vn-label-value
label="Client"
value="{{$ctrl.ticket.client.name}}">
</vn-label-value>
<vn-label-value
label="State"
value="{{$ctrl.ticket.state.state.name}}">
@ -281,9 +267,9 @@
</vn-add-stowaway>
<vn-dialog
vn-id="changeShippedDialog"
on-accept="$ctrl.changeShipped()">
on-accept="$ctrl.changeShipped()"
message="Change shipped hour">
<tpl-body>
<h6 translate>Change shipped hour</h6>
<vn-input-time
ng-model="$ctrl.newShipped"
label="Shipped hour"

View File

@ -7,7 +7,7 @@
vn-id="watcher"
data="$ctrl.sales">
</vn-watcher>
<vn-vertical class="vn-w-xl">
<div class="vn-w-xl">
<vn-card class="vn-pa-lg">
<vn-horizontal class="header">
<vn-tool-bar class="vn-mb-md">
@ -180,17 +180,18 @@
</vn-tr>
</vn-tbody>
</vn-table>
<vn-one>
<vn-icon-button vn-none
<div>
<vn-icon-button
vn-none
vn-tooltip="Add item"
vn-bind="+"
icon="add_circle"
ng-click="$ctrl.add()"
disabled="!$ctrl.isEditable">
</vn-icon-button>
</vn-one>
</div>
</vn-card>
</vn-vertical>
</div>
<vn-float-button
ng-show="$ctrl.isEditable"
ng-click="$ctrl.newOrderFromTicket()"

View File

@ -74,9 +74,9 @@
<vn-dialog class="edit"
vn-id="newServiceTypeDialog"
on-accept="$ctrl.onNewServiceTypeAccept($data)"
on-close="newServiceType = null">
on-close="newServiceType = null"
message="New service type">
<tpl-body>
<h5 class="vn-py-sm" translate>New service type</h5>
<vn-horizontal>
<vn-textfield
vn-one

View File

@ -1,9 +1,9 @@
<vn-dialog
vn-id="SMSDialog"
on-response="$ctrl.onResponse($response)">
on-response="$ctrl.onResponse($response)"
message="Send SMS">
<tpl-body>
<section class="SMSDialog">
<h5 class="vn-py-sm" translate>Send SMS</h5>
<vn-horizontal>
<vn-textfield
vn-one

View File

@ -1,14 +1,8 @@
<vn-descriptor-content module="travel">
<vn-descriptor-content
module="travel"
description="$ctrl.travel.ref">
<slot-body>
<div class="attributes">
<vn-label-value
label="Id"
value="{{$ctrl.travel.id}}">
</vn-label-value>
<vn-label-value
label="Reference"
value="{{$ctrl.travel.ref}}">
</vn-label-value>
<vn-label-value
label="Wh. In"
value="{{$ctrl.travel.warehouseOut.name}}">

View File

@ -88,12 +88,14 @@
<vn-icon
ng-if="entry.notes.length"
vn-tooltip="{{entry.notes}}"
icon="insert_drive_file">
icon="insert_drive_file"
class="bright">
</vn-icon>
<vn-icon
ng-if="entry.observation.length"
vn-tooltip="{{entry.observation}}"
icon="insert_drive_file">
icon="insert_drive_file"
class="bright">
</vn-icon>
</vn-td>
</vn-tr>

View File

@ -3,8 +3,4 @@
vn-travel-summary .summary {
max-width: $width-lg;
vn-icon[icon=insert_drive_file]{
color: $color-font-secondary;
}
}

View File

@ -27,17 +27,15 @@
<vn-dialog
vn-id="createNode"
on-open="$ctrl.onCreateDialogOpen()"
on-response="$ctrl.onCreateResponse($response)">
on-response="$ctrl.onCreateResponse($response)"
message="New department">
<tpl-body>
<h5 class="vn-py-sm" translate>New department</h5>
<vn-horizontal>
<vn-textfield
vn-one
label="Name"
ng-model="$ctrl.newChild.name"
vn-focus>
</vn-textfield>
</vn-horizontal>
</tpl-body>
<tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>

View File

@ -1,17 +1,11 @@
<vn-descriptor-content module="worker">
<vn-descriptor-content
module="worker"
description="$ctrl.worker.firstName +' '+ $ctrl.worker.lastName">
<slot-body>
<div class="attributes">
<h5 title="{{$ctrl.worker.firstName}} {{$ctrl.worker.lastName}}">
{{$ctrl.worker.firstName}} {{$ctrl.worker.lastName}}
</h5>
<vn-label-value
label="Id"
value="{{$ctrl.worker.id}}">
</vn-label-value>
<vn-label-value
label="User"
value="{{$ctrl.worker.user.name}}"
title="{{$ctrl.worker.firstName}} {{$ctrl.worker.lastName}}">
value="{{$ctrl.worker.user.name}}">
</vn-label-value>
<vn-label-value
label="Email"

View File

@ -92,19 +92,15 @@
</vn-side-menu>
<vn-dialog
vn-id="addTimeDialog"
on-response="$ctrl.addTime($response)">
on-response="$ctrl.addTime($response)"
message="Add time">
<tpl-body>
<div>
<h5 style="text-align: center">
<span translate>Add time</span>
</h5>
<vn-input-time
vn-one
ng-model="$ctrl.newTime"
label="Hour"
vn-focus>
</vn-input-time>
</div>
</tpl-body>
<tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>

View File

@ -1,25 +1,15 @@
<vn-descriptor-content module="zone">
<vn-descriptor-content
module="zone"
description="$ctrl.zone.name">
<slot-menu>
<ul class="vn-list">
<li>
<div class="vn-item"
<vn-item class="vn-item"
ng-click="deleteZone.show()"
translate>
Delete
</div>
</li>
</ul>
</vn-item>
</slot-menu>
<slot-body>
<div class="attributes">
<vn-label-value
label="Id"
value="{{$ctrl.zone.id}}">
</vn-label-value>
<vn-label-value
label="Name"
value="{{$ctrl.zone.name}}">
</vn-label-value>
<vn-label-value
label="Warehouse"
value="{{$ctrl.zone.warehouse.name}}">

View File

@ -30,7 +30,6 @@
vn-id="dialog"
on-response="$ctrl.onSave($response)">
<tpl-body>
<vn-vertical>
<vn-autocomplete
ng-model="$ctrl.selected.warehouseFk"
url="Warehouses"
@ -38,7 +37,6 @@
value-field="id"
label="Warehouse">
</vn-autocomplete>
</vn-vertical>
</tpl-body>
<tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>