Tower: upload laundry_management 19.0.19.0.4 (via marketplace)
This commit is contained in:
223
addons/laundry_management/static/src/xml/view_laundry_orders.xml
Normal file
223
addons/laundry_management/static/src/xml/view_laundry_orders.xml
Normal file
@@ -0,0 +1,223 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<t t-name="laundry_management.LaundryOrdersViewPopup">
|
||||
<Dialog title="'Laundry Orders'" size="'lg'"
|
||||
contentClass="'laundry-orders-popup'">
|
||||
<div class="laundry-orders-popup__body">
|
||||
|
||||
<!-- Header: partner + counts -->
|
||||
<div class="laundry-orders-popup__header">
|
||||
<div class="laundry-orders-popup__partner">
|
||||
<i class="fa fa-user-circle-o me-2" title="Customer"/>
|
||||
<strong t-esc="props.partnerName"/>
|
||||
<span t-if="props.partnerPhone"
|
||||
class="laundry-orders-popup__phone ms-2">
|
||||
<i class="fa fa-phone me-1"/>
|
||||
<t t-esc="props.partnerPhone"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-orders-popup__count text-muted"
|
||||
t-if="hasResults">
|
||||
<t t-esc="state.orders.length"/> order(s)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Search -->
|
||||
<form class="laundry-orders-popup__search"
|
||||
t-on-submit="onSearchSubmit">
|
||||
<div class="input-group input-group-lg">
|
||||
<span class="input-group-text">
|
||||
<i class="fa fa-search" title="Search"/>
|
||||
</span>
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
placeholder="Order number, POS reference, or phone…"
|
||||
t-att-value="state.searchQuery"
|
||||
t-on-input="onSearchInput"
|
||||
t-ref="searchInput"/>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Search
|
||||
</button>
|
||||
<button type="button"
|
||||
class="btn btn-outline-secondary"
|
||||
t-on-click="onClearSearch"
|
||||
t-att-disabled="state.loading"
|
||||
t-if="state.searchQuery">
|
||||
Clear
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Error state -->
|
||||
<div t-if="state.error"
|
||||
class="alert alert-danger laundry-orders-popup__error"
|
||||
role="alert">
|
||||
<strong>Could not load orders.</strong>
|
||||
<span class="ms-2" t-esc="state.error"/>
|
||||
<button class="btn btn-sm btn-outline-danger ms-3"
|
||||
t-on-click="_fetch">
|
||||
Retry
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Loading state -->
|
||||
<div t-if="state.loading" class="laundry-orders-popup__loading">
|
||||
<t t-foreach="[1,2,3]" t-as="i" t-key="i">
|
||||
<div class="laundry-orders-popup__skeleton"/>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
<!-- Empty state -->
|
||||
<div t-if="isEmpty"
|
||||
class="laundry-orders-popup__empty text-center text-muted py-5">
|
||||
<i class="fa fa-inbox fa-3x mb-2 d-block"
|
||||
title="No orders"/>
|
||||
<t t-if="state.searchQuery">
|
||||
No orders matched "<t t-esc="state.searchQuery"/>".
|
||||
</t>
|
||||
<t t-else="">
|
||||
No laundry orders yet for this customer.
|
||||
</t>
|
||||
</div>
|
||||
|
||||
<!-- Orders list -->
|
||||
<div t-if="hasResults" class="laundry-orders-popup__list">
|
||||
<div t-foreach="state.orders" t-as="order" t-key="order.id"
|
||||
class="laundry-orders-popup__card"
|
||||
t-att-data-state="order.state"
|
||||
t-att-data-payment="order.payment_state"
|
||||
t-att-data-busy="isOrderBusy(order) ? '1' : '0'">
|
||||
|
||||
<!-- Row 1: identity + date -->
|
||||
<div class="laundry-orders-popup__card-head">
|
||||
<div class="laundry-orders-popup__card-title">
|
||||
<span class="laundry-orders-popup__order-name"
|
||||
t-esc="order.name"/>
|
||||
<span t-if="order.pos_reference"
|
||||
class="laundry-orders-popup__pos-ref ms-2">
|
||||
POS: <t t-esc="order.pos_reference"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="laundry-orders-popup__date"
|
||||
t-esc="formatDate(order)"/>
|
||||
</div>
|
||||
|
||||
<!-- Row 2: items + totals -->
|
||||
<div class="laundry-orders-popup__card-meta">
|
||||
<span class="laundry-orders-popup__items">
|
||||
<i class="fa fa-tshirt me-1" title="Items"/>
|
||||
<t t-esc="order.item_count"/> item(s)
|
||||
<span t-if="order.service_summary"
|
||||
class="laundry-orders-popup__services ms-2 text-muted"
|
||||
t-att-title="order.service_summary"
|
||||
t-esc="order.service_summary"/>
|
||||
</span>
|
||||
<span class="laundry-orders-popup__totals">
|
||||
<span class="laundry-orders-popup__total"
|
||||
t-esc="fmt(order.amount_total)"/>
|
||||
<span t-if="order.amount_due > 0"
|
||||
class="laundry-orders-popup__due ms-2"
|
||||
t-esc="'(' + fmt(order.amount_due) + ' due)'"/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Row 3: badges -->
|
||||
<div class="laundry-orders-popup__badges">
|
||||
<span class="laundry-badge"
|
||||
t-att-class="paymentBadge(order).klass">
|
||||
<t t-esc="paymentBadge(order).label"/>
|
||||
<span t-if="order.payment_state === 'due'"
|
||||
class="ms-1"
|
||||
t-esc="fmt(order.amount_due)"/>
|
||||
</span>
|
||||
<span class="laundry-badge"
|
||||
t-att-class="stateBadge(order).klass">
|
||||
<t t-esc="stateBadge(order).label"/>
|
||||
</span>
|
||||
<span t-if="order.is_delivery"
|
||||
class="laundry-badge laundry-badge--delivery">
|
||||
<i class="fa fa-truck me-1" title="Delivery"/>
|
||||
Delivery
|
||||
</span>
|
||||
<span t-if="order.is_from_pos"
|
||||
class="laundry-badge laundry-badge--source">
|
||||
From POS
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Row 4: actions -->
|
||||
<div class="laundry-orders-popup__actions">
|
||||
<button t-if="isAllowed(order, 'start_processing')"
|
||||
class="btn btn-primary btn-lg"
|
||||
t-att-disabled="isOrderBusy(order) ? 'disabled' : null"
|
||||
t-on-click="() => this.onClickStartProcessing(order)">
|
||||
<i t-if="!isBusy(order, 'start_processing')"
|
||||
class="fa fa-play me-2" title="Start Processing"/>
|
||||
<i t-else=""
|
||||
class="fa fa-spinner fa-spin me-2"
|
||||
title="Starting"/>
|
||||
Start Processing
|
||||
</button>
|
||||
|
||||
<button t-if="isAllowed(order, 'mark_ready')"
|
||||
class="btn btn-primary btn-lg"
|
||||
t-att-disabled="isOrderBusy(order) ? 'disabled' : null"
|
||||
t-on-click="() => this.onClickMarkReady(order)">
|
||||
<i t-if="!isBusy(order, 'mark_ready')"
|
||||
class="fa fa-check-circle me-2" title="Mark Ready"/>
|
||||
<i t-else=""
|
||||
class="fa fa-spinner fa-spin me-2"
|
||||
title="Marking"/>
|
||||
Mark Ready
|
||||
</button>
|
||||
|
||||
<button t-if="isAllowed(order, 'deliver')"
|
||||
class="btn btn-success btn-lg"
|
||||
t-att-disabled="isOrderBusy(order) ? 'disabled' : null"
|
||||
t-on-click="() => this.onClickDeliver(order)">
|
||||
<i t-if="!isBusy(order, 'deliver')"
|
||||
class="fa fa-truck me-2" title="Deliver"/>
|
||||
<i t-else=""
|
||||
class="fa fa-spinner fa-spin me-2"
|
||||
title="Delivering"/>
|
||||
Deliver
|
||||
</button>
|
||||
|
||||
<button t-if="isAllowed(order, 'collect_payment')"
|
||||
class="btn btn-warning btn-lg"
|
||||
t-on-click="() => this.onClickCollectPayment(order)">
|
||||
<i class="fa fa-credit-card me-2" title="Collect"/>
|
||||
Collect Payment in POS
|
||||
</button>
|
||||
|
||||
<button t-if="isAllowed(order, 'print_work_order')"
|
||||
class="btn btn-outline-secondary btn-lg"
|
||||
t-on-click="() => this.onClickPrintWorkOrder(order)">
|
||||
<i class="fa fa-print me-2" title="Print"/>
|
||||
Print Work Order
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Due hint -->
|
||||
<div t-if="order.payment_state === 'due' and order.state !== 'delivered'"
|
||||
class="laundry-orders-popup__due-hint text-muted small">
|
||||
<i class="fa fa-info-circle me-1" title="Note"/>
|
||||
Cannot deliver until
|
||||
<strong t-esc="fmt(order.amount_due)"/>
|
||||
is paid.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<t t-set-slot="footer">
|
||||
<button class="btn btn-secondary btn-lg"
|
||||
t-on-click="close">
|
||||
Close
|
||||
</button>
|
||||
</t>
|
||||
</Dialog>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
Reference in New Issue
Block a user