Tower: upload laundry_management 19.0.19.0.4 (via marketplace)

This commit is contained in:
2026-05-01 15:00:50 +00:00
parent 3e1a94eaed
commit 63dc434824

View 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>