Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 2965-delete_travel_from_descriptor
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Carlos Jimenez Ruiz 2021-06-15 16:41:12 +02:00
commit 8c1df0743d
6 changed files with 401 additions and 376 deletions

View File

@ -230,3 +230,7 @@ vn-table.scrollable.lg,
.vn-table.scrollable.lg { .vn-table.scrollable.lg {
max-height: 700px max-height: 700px
} }
.tableWrapper {
overflow-x: auto;
}

View File

@ -10,182 +10,185 @@
</vn-watcher> </vn-watcher>
<div class="vn-w-xl"> <div class="vn-w-xl">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-horizontal class="header"> <div class="tableWrapper">
<vn-tool-bar class="vn-mb-md"> <vn-horizontal class="header">
<vn-button <vn-tool-bar class="vn-mb-md">
disabled="$ctrl.selectedBuys() == 0" <vn-button
ng-click="deleteBuys.show()" disabled="$ctrl.selectedBuys() == 0"
vn-tooltip="Delete buy(s)" ng-click="deleteBuys.show()"
icon="delete"> vn-tooltip="Delete buy(s)"
</vn-button> icon="delete">
</vn-tool-bar> </vn-button>
<vn-one class="taxes" ng-if="$ctrl.sales.length > 0"> </vn-tool-bar>
<p><vn-label translate>Subtotal</vn-label> {{$ctrl.ticket.totalWithoutVat | currency: 'EUR':2}}</p> <vn-one class="taxes" ng-if="$ctrl.sales.length > 0">
<p><vn-label translate>VAT</vn-label> {{$ctrl.ticket.totalWithVat - $ctrl.ticket.totalWithoutVat | currency: 'EUR':2}}</p> <p><vn-label translate>Subtotal</vn-label> {{$ctrl.ticket.totalWithoutVat | currency: 'EUR':2}}</p>
<p><vn-label><strong>Total</strong></vn-label> <strong>{{$ctrl.ticket.totalWithVat | currency: 'EUR':2}}</strong></p> <p><vn-label translate>VAT</vn-label> {{$ctrl.ticket.totalWithVat - $ctrl.ticket.totalWithoutVat | currency: 'EUR':2}}</p>
</vn-one> <p><vn-label><strong>Total</strong></vn-label> <strong>{{$ctrl.ticket.totalWithVat | currency: 'EUR':2}}</strong></p>
</vn-horizontal> </vn-one>
<table class="vn-table"> </vn-horizontal>
<thead> <table class="vn-table">
<tr> <thead>
<th shrink> <tr>
<vn-multi-check model="model" on-change="$ctrl.resetChanges()"> <th shrink>
</vn-multi-check> <vn-multi-check model="model" on-change="$ctrl.resetChanges()">
</th> </vn-multi-check>
<th translate center>Item</th> </th>
<th translate center>Quantity</th> <th translate center>Item</th>
<th translate center>Package</th> <th translate center>Quantity</th>
<th translate>Stickers</th> <th translate center>Package</th>
<th translate>Weight</th> <th translate>Stickers</th>
<th translate>Packing</th> <th translate>Weight</th>
<th translate>Grouping</th> <th translate>Packing</th>
<th translate>Buying value</th> <th translate>Grouping</th>
<th translate expand>Grouping price</th> <th translate>Buying value</th>
<th translate expand>Packing price</th> <th translate expand>Grouping price</th>
<th translate>Import</th> <th translate expand>Packing price</th>
</tr> <th translate>Import</th>
</thead> </tr>
<tbody ng-repeat="buy in $ctrl.buys"> </thead>
<tr> <tbody ng-repeat="buy in $ctrl.buys">
<td shrink> <tr>
<vn-check tabindex="-1" ng-model="buy.checked"> <td shrink>
</vn-check> <vn-check tabindex="-1" ng-model="buy.checked">
</td> </vn-check>
<td shrink> </td>
<span <td shrink>
ng-if="buy.id" <span
ng-click="itemDescriptor.show($event, buy.item.id)" ng-if="buy.id"
class="link"> ng-click="itemDescriptor.show($event, buy.item.id)"
{{::buy.item.id | zeroFill:6}} class="link">
</span> {{::buy.item.id | zeroFill:6}}
<vn-autocomplete ng-if="!buy.id" class="dense" </span>
vn-focus <vn-autocomplete ng-if="!buy.id" class="dense"
url="Items" vn-focus
ng-model="buy.itemFk" url="Items"
show-field="name" ng-model="buy.itemFk"
value-field="id" show-field="name"
search-function="$ctrl.itemSearchFunc($search)" value-field="id"
on-change="$ctrl.saveBuy(buy)" search-function="$ctrl.itemSearchFunc($search)"
order="id DESC" on-change="$ctrl.saveBuy(buy)"
tabindex="1"> order="id DESC"
<tpl-item> tabindex="1">
{{::id}} - {{::name}} <tpl-item>
</tpl-item> {{::id}} - {{::name}}
</vn-autocomplete> </tpl-item>
</td> </vn-autocomplete>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.quantity | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.quantity" title="{{::buy.quantity | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.quantity"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td center> </td>
<vn-autocomplete <td center>
vn-one <vn-autocomplete
title="{{::buy.packageFk | dashIfEmpty}}" vn-one
url="Packagings" title="{{::buy.packageFk | dashIfEmpty}}"
show-field="id" url="Packagings"
value-field="id" show-field="id"
where="{isBox: true}" value-field="id"
ng-model="buy.packageFk" where="{isBox: true}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.packageFk"
</vn-autocomplete> on-change="$ctrl.saveBuy(buy)">
</td> </vn-autocomplete>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.stickers | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.stickers" title="{{::buy.stickers | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.stickers"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.weight | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.weight" title="{{::buy.weight | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.weight"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.packing | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.packing" title="{{::buy.packing | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.packing"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.grouping | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.grouping" title="{{::buy.grouping | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.grouping"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.buyingValue | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.buyingValue" title="{{::buy.buyingValue | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.buyingValue"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.price2 | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.price2" title="{{::buy.price2 | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.price2"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<vn-input-number class="dense" <td>
title="{{::buy.price3 | dashIfEmpty}}" <vn-input-number class="dense"
ng-model="buy.price3" title="{{::buy.price3 | dashIfEmpty}}"
on-change="$ctrl.saveBuy(buy)"> ng-model="buy.price3"
</vn-input-number> on-change="$ctrl.saveBuy(buy)">
</td> </vn-input-number>
<td> </td>
<span <td>
ng-if="buy.quantity != null && buy.buyingValue != null" <span
title="{{buy.quantity * buy.buyingValue | currency: 'EUR':2}}"> ng-if="buy.quantity != null && buy.buyingValue != null"
{{buy.quantity * buy.buyingValue | currency: 'EUR':2}} title="{{buy.quantity * buy.buyingValue | currency: 'EUR':2}}">
</span> {{buy.quantity * buy.buyingValue | currency: 'EUR':2}}
</td> </span>
</tr> </td>
<tr class="dark-row"> </tr>
<td shrink> <tr class="dark-row">
</td> <td shrink>
<td shrink> </td>
<span translate-attr="{title: 'Item type'}"> <td shrink>
{{::buy.item.itemType.code}} <span translate-attr="{title: 'Item type'}">
</span> {{::buy.item.itemType.code}}
</td> </span>
<td number shrink> </td>
<span translate-attr="{title: 'Item size'}"> <td number shrink>
{{::buy.item.size}} <span translate-attr="{title: 'Item size'}">
</span> {{::buy.item.size}}
</td> </span>
<td center> </td>
<span translate-attr="{title: 'Minimum price'}"> <td center>
{{::buy.item.minPrice | currency: 'EUR':2}} <span translate-attr="{title: 'Minimum price'}">
</span> {{::buy.item.minPrice | currency: 'EUR':2}}
</td> </span>
<td vn-fetched-tags colspan="9"> </td>
<vn-one title="{{::buy.item.name}}">{{::buy.item.name}}</vn-one> <td vn-fetched-tags colspan="8">
<vn-fetched-tags <vn-one title="{{::buy.item.name}}">{{::buy.item.name}}</vn-one>
max-length="6" <vn-fetched-tags
item="::buy.item" max-length="6"
tabindex="-1"> item="::buy.item"
</vn-fetched-tags> tabindex="-1">
</td> </vn-fetched-tags>
</tr> </td>
</tbody> </tr>
</table> <tr><td></td></tr>
<div> </tbody>
<vn-icon-button </table>
vn-one <div>
vn-tooltip="Add buy" <vn-icon-button
vn-bind="+" vn-one
icon="add_circle" vn-tooltip="Add buy"
ng-click="model.insert({})"> vn-bind="+"
</vn-icon-button> icon="add_circle"
ng-click="model.insert({})">
</vn-icon-button>
</div>
</div> </div>
</vn-card> </vn-card>
</div> </div>

View File

@ -8,14 +8,29 @@ vn-entry-buy-index vn-card {
background-color: lighten($color-marginal, 10%); background-color: lighten($color-marginal, 10%);
} }
tbody tr:nth-child(1) { thead tr {
border-top: 1px solid $color-marginal; border-left: 1px solid white;
border-right: 1px solid white;
}
tbody tr:nth-child(1),
tbody tr:nth-child(2) {
border-left: 1px solid $color-marginal;
border-right: 1px solid $color-marginal;
}
tbody tr:nth-child(2) {
border-bottom: 1px solid $color-marginal;
} }
tbody{ tbody{
border-bottom: 1px solid $color-marginal; border-bottom: 1px solid $color-marginal;
} }
tbody:last-child {
border-bottom: 0;
}
tbody tr:nth-child(3) { tbody tr:nth-child(3) {
height: inherit height: inherit
} }

View File

@ -49,6 +49,7 @@
rule> rule>
</vn-input-number> </vn-input-number>
</vn-horizontal> </vn-horizontal>
</vn-card>
<vn-button-bar> <vn-button-bar>
<vn-submit <vn-submit
label="Save" label="Save"

View File

@ -8,60 +8,62 @@
</vn-crud-model> </vn-crud-model>
<vn-data-viewer model="model" class="vn-w-xl"> <vn-data-viewer model="model" class="vn-w-xl">
<vn-card class="vn-mt-md"> <vn-card class="vn-mt-md">
<table class="vn-table"> <div class="tableWrapper">
<thead> <table class="vn-table">
<tr> <thead>
<th number translate>Item</th> <tr>
<th translate expand>Description</th> <th number translate>Item</th>
<th number translate>Quantity</th> <th translate expand>Description</th>
<th translate>Serie</th> <th number translate>Quantity</th>
<th translate>Components</th> <th translate>Serie</th>
<th number translate>Import</th> <th translate>Components</th>
<th number translate>Total</th> <th number translate>Import</th>
</tr> <th number translate>Total</th>
</thead> </tr>
<tbody ng-repeat="sale in components track by sale.id"> </thead>
<tr class="initial"> <tbody ng-repeat="sale in components track by sale.id">
<td rowspan="{{::sale.components.length + 1}}" number> <tr class="initial">
<span <td rowspan="{{::sale.components.length + 1}}" number>
ng-click="itemDescriptor.show($event, sale.itemFk, sale.id)" <span
class="link"> ng-click="itemDescriptor.show($event, sale.itemFk, sale.id)"
{{sale.itemFk | zeroFill:6}} class="link">
</span> {{sale.itemFk | zeroFill:6}}
</td> </span>
<td rowspan="{{::sale.components.length + 1}}" vn-fetched-tags> </td>
<vn-one title="{{::sale.item.name}}">{{::sale.item.name}}</vn-one> <td rowspan="{{::sale.components.length + 1}}" vn-fetched-tags>
<vn-one ng-if="::sale.item.subName"> <vn-one title="{{::sale.item.name}}">{{::sale.item.name}}</vn-one>
<h3 title="{{::sale.item.subName}}">{{::sale.item.subName}}</h3> <vn-one ng-if="::sale.item.subName">
</vn-one> <h3 title="{{::sale.item.subName}}">{{::sale.item.subName}}</h3>
<vn-fetched-tags </vn-one>
max-length="6" <vn-fetched-tags
item="::sale.item" max-length="6"
tabindex="-1"> item="::sale.item"
</vn-fetched-tags> tabindex="-1">
</td> </vn-fetched-tags>
<td rowspan="{{::sale.components.length + 1}}" number> </td>
{{::sale.quantity}} <td rowspan="{{::sale.components.length + 1}}" number>
</td> {{::sale.quantity}}
</tr> </td>
<tr </tr>
ng-repeat="saleComponent in sale.components track by saleComponent.componentFk" <tr
class="components"> ng-repeat="saleComponent in sale.components track by saleComponent.componentFk"
<td> class="components">
{{::saleComponent.component.componentType.type}} <td>
</td> {{::saleComponent.component.componentType.type}}
<td> </td>
{{::saleComponent.component.name}} <td>
</td> {{::saleComponent.component.name}}
<td number> </td>
{{::saleComponent.value | currency: 'EUR':3}} <td number>
</td> {{::saleComponent.value | currency: 'EUR':3}}
<td number> </td>
{{::sale.quantity * saleComponent.value | currency: 'EUR':3}} <td number>
</td> {{::sale.quantity * saleComponent.value | currency: 'EUR':3}}
</tr> </td>
</tbody> </tr>
</table> </tbody>
</table>
</div>
</vn-card> </vn-card>
</vn-data-viewer> </vn-data-viewer>
<vn-side-menu side="right"> <vn-side-menu side="right">

View File

@ -5,149 +5,149 @@
model="model" model="model"
class="vn-mb-xl vn-w-xl"> class="vn-mb-xl vn-w-xl">
<vn-card> <vn-card>
<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 class="icon-field"></vn-th> <vn-th class="icon-field"></vn-th>
<vn-th field="id">Id</vn-th> <vn-th field="id">Id</vn-th>
<vn-th field="salesPersonFk" class="expendable">Salesperson</vn-th> <vn-th field="salesPersonFk" class="expendable">Salesperson</vn-th>
<vn-th field="shipped" shrink-date>Date</vn-th> <vn-th field="shipped" shrink-date>Date</vn-th>
<vn-th>Hour</vn-th> <vn-th>Hour</vn-th>
<vn-th field="zoneHour" shrink>Closure</vn-th> <vn-th field="zoneHour" shrink>Closure</vn-th>
<vn-th field="nickname">Alias</vn-th> <vn-th field="nickname">Alias</vn-th>
<vn-th field="provinceFk" class="expendable">Province</vn-th> <vn-th field="provinceFk" class="expendable">Province</vn-th>
<vn-th field="stateFk" >State</vn-th> <vn-th field="stateFk" >State</vn-th>
<vn-th field="zoneFk">Zone</vn-th> <vn-th field="zoneFk">Zone</vn-th>
<vn-th field="warehouseFk">Warehouse</vn-th> <vn-th field="warehouseFk">Warehouse</vn-th>
<vn-th number>Total</vn-th> <vn-th number>Total</vn-th>
<vn-th></vn-th> <vn-th></vn-th>
</vn-tr> </vn-tr>
</vn-thead> </vn-thead>
<vn-tbody> <vn-tbody>
<a ng-repeat="ticket in model.data" <a ng-repeat="ticket in model.data"
class="clickable vn-tr search-result" class="clickable vn-tr search-result"
ui-sref="ticket.card.summary({id: {{::ticket.id}}})"> ui-sref="ticket.card.summary({id: {{::ticket.id}}})">
<vn-td> <vn-td>
<vn-check <vn-check
ng-model="ticket.checked" ng-model="ticket.checked"
vn-click-stop> vn-click-stop>
</vn-check> </vn-check>
</vn-td> </vn-td>
<vn-td class="icon-field"> <vn-td class="icon-field">
<vn-icon <vn-icon
ng-show="::ticket.isTaxDataChecked === 0" ng-show="::ticket.isTaxDataChecked === 0"
translate-attr="{title: 'No verified data'}" translate-attr="{title: 'No verified data'}"
class="bright" class="bright"
icon="icon-no036"> icon="icon-no036">
</vn-icon> </vn-icon>
<vn-icon <vn-icon
ng-show="::ticket.hasTicketRequest" ng-show="::ticket.hasTicketRequest"
translate-attr="{title: 'Purchase request'}" translate-attr="{title: 'Purchase request'}"
class="bright" class="bright"
icon="icon-100"> icon="icon-100">
</vn-icon> </vn-icon>
<vn-icon <vn-icon
ng-show="::ticket.isAvailable === 0" ng-show="::ticket.isAvailable === 0"
translate-attr="{title: 'Not available'}" translate-attr="{title: 'Not available'}"
class="bright" class="bright"
icon="icon-unavailable"> icon="icon-unavailable">
</vn-icon> </vn-icon>
<vn-icon <vn-icon
ng-show="::ticket.isFreezed" ng-show="::ticket.isFreezed"
translate-attr="{title: 'Client frozen'}" translate-attr="{title: 'Client frozen'}"
class="bright" class="bright"
icon="icon-frozen"> icon="icon-frozen">
</vn-icon> </vn-icon>
<vn-icon <vn-icon
ng-show="::ticket.risk" ng-show="::ticket.risk"
title="{{::$ctrl.$t('Risk')}}: {{ticket.risk}}" title="{{::$ctrl.$t('Risk')}}: {{ticket.risk}}"
class="bright" class="bright"
icon="icon-risk"> icon="icon-risk">
</vn-icon> </vn-icon>
<vn-icon <vn-icon
ng-show="::ticket.hasComponentLack" ng-show="::ticket.hasComponentLack"
translate-attr="{title: 'Component lack'}" translate-attr="{title: 'Component lack'}"
class="bright" class="bright"
icon="icon-components"> icon="icon-components">
</vn-icon> </vn-icon>
</vn-td> </vn-td>
<vn-td shrink>{{::ticket.id}}</vn-td> <vn-td shrink>{{::ticket.id}}</vn-td>
<vn-td class="expendable"> <vn-td class="expendable">
<span <span
title="{{::ticket.userName}}" title="{{::ticket.userName}}"
vn-click-stop="workerDescriptor.show($event, ticket.salesPersonFk)" vn-click-stop="workerDescriptor.show($event, ticket.salesPersonFk)"
class="link"> class="link">
{{::ticket.userName | dashIfEmpty}} {{::ticket.userName | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>
<vn-td shrink-date> <vn-td shrink-date>
<span class="chip {{$ctrl.compareDate(ticket.shipped)}}"> <span class="chip {{$ctrl.compareDate(ticket.shipped)}}">
{{::ticket.shipped | date: 'dd/MM/yyyy'}} {{::ticket.shipped | date: 'dd/MM/yyyy'}}
</span> </span>
</vn-td> </vn-td>
<vn-td shrink>{{::ticket.shipped | date: 'HH:mm'}}</vn-td> <vn-td shrink>{{::ticket.shipped | date: 'HH:mm'}}</vn-td>
<vn-td shrink>{{::ticket.zoneLanding | date: 'HH:mm'}}</vn-td> <vn-td shrink>{{::ticket.zoneLanding | date: 'HH:mm'}}</vn-td>
<vn-td> <vn-td>
<span <span
title="{{::ticket.nickname}}" title="{{::ticket.nickname}}"
vn-click-stop="clientDescriptor.show($event, ticket.clientFk)" vn-click-stop="clientDescriptor.show($event, ticket.clientFk)"
class="link"> class="link">
{{::ticket.nickname}} {{::ticket.nickname}}
</span> </span>
</vn-td> </vn-td>
<vn-td class="expendable">{{::ticket.province}}</vn-td> <vn-td class="expendable">{{::ticket.province}}</vn-td>
<vn-td class="expendable"> <vn-td class="expendable">
<span <span
ng-show="ticket.refFk" ng-show="ticket.refFk"
title="{{::ticket.refFk}}" title="{{::ticket.refFk}}"
vn-click-stop="invoiceOutDescriptor.show($event, ticket.invoiceOutId)" vn-click-stop="invoiceOutDescriptor.show($event, ticket.invoiceOutId)"
class="link"> class="link">
{{::ticket.refFk}} {{::ticket.refFk}}
</span> </span>
<span <span
ng-show="!ticket.refFk" ng-show="!ticket.refFk"
class="chip {{$ctrl.stateColor(ticket)}}"> class="chip {{$ctrl.stateColor(ticket)}}">
{{ticket.state}} {{ticket.state}}
</span> </span>
</vn-td> </vn-td>
<vn-td> <vn-td>
<span <span
title="{{::ticket.zoneName}}" title="{{::ticket.zoneName}}"
vn-click-stop="zoneDescriptor.show($event, ticket.zoneFk)" vn-click-stop="zoneDescriptor.show($event, ticket.zoneFk)"
class="link"> class="link">
{{::ticket.zoneName | dashIfEmpty}} {{::ticket.zoneName | dashIfEmpty}}
</span> </span>
</vn-td> </vn-td>
<vn-td>{{::ticket.warehouse}}</vn-td> <vn-td>{{::ticket.warehouse}}</vn-td>
<vn-td number> <vn-td number>
<span class="chip {{$ctrl.totalPriceColor(ticket)}}"> <span class="chip {{$ctrl.totalPriceColor(ticket)}}">
{{::(ticket.totalWithVat ? ticket.totalWithVat : 0) | currency: 'EUR': 2}} {{::(ticket.totalWithVat ? ticket.totalWithVat : 0) | currency: 'EUR': 2}}
</span> </span>
</vn-td> </vn-td>
<vn-td actions> <vn-td actions>
<vn-icon-button <vn-icon-button
vn-anchor="::{ vn-anchor="::{
state: 'ticket.card.sale', state: 'ticket.card.sale',
params: {id: ticket.id}, params: {id: ticket.id},
target: '_blank' target: '_blank'
}" }"
vn-tooltip="Go to lines" vn-tooltip="Go to lines"
icon="icon-lines"> icon="icon-lines">
</vn-icon-button> </vn-icon-button>
<vn-icon-button <vn-icon-button
vn-click-stop="$ctrl.preview(ticket)" vn-click-stop="$ctrl.preview(ticket)"
vn-tooltip="Preview" vn-tooltip="Preview"
icon="preview"> icon="preview">
</vn-icon-button> </vn-icon-button>
</vn-td> </vn-td>
</a> </a>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
</vn-card> </vn-card>
</vn-data-viewer> </vn-data-viewer>
<div fixed-bottom-right> <div fixed-bottom-right>