@freteclick/quasar-financial-ui 1.0.113 → 1.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,61 +1,225 @@
1
1
  <template>
2
- <div>
3
- <Filters :filters="filters" @onRequest="onRequest" />
4
- <q-table :loading="isLoading" :rows="data" :columns="settings.columns" v-model:pagination="pagination"
5
- @request="onRequest" row-key="id" :visible-columns="settings.visibleColumns" style="min-height: 90vh">
6
- <template v-slot:body="props">
7
- <q-tr :props="props">
8
- <q-td key="id" :props="props">
9
- <q-btn outline dense :to="{ name: 'ReceiveDetails', params: { id: props.row.id } }"
10
- :label="props.cols[0].value" :style="{ color: props.row.color_status }" class="full-width" />
11
- </q-td>
12
- <q-td key="tipo" :props="props">{{ props.cols[1].value }}</q-td>
13
- <q-td key="pedidos" :props="props">
14
- <q-btn outline dense :label="
15
- props.row.pedidos.length > 1
16
- ? `${props.row.pedidos.length} Pedidos`
17
- : '1 Pedido'
18
- " color="primary" @click="seeOrdersList(props.row.pedidos, props.row.id)" class="full-width" />
19
- </q-td>
20
- <q-td key="dataVencimento" :props="props">{{
21
- props.cols[3].value
22
- }}</q-td>
23
- <q-td key="payer" :props="props">{{ props.cols[4].value }}</q-td>
24
- <q-td key="client" :props="props">{{ props.cols[5].value }}</q-td>
25
- <q-td key="status" :props="props" :style="{ color: props.row.color_status }">
26
- {{ $t(`invoice.statuses.${props.row.status}`) }}
27
- </q-td>
28
- <q-td key="preco" :props="props">{{ props.cols[7].value }}</q-td>
29
- </q-tr>
30
- </template>
31
- </q-table>
2
+ <div class="receivables-page">
3
+ <div class="receivables-page__content">
4
+ <PageHeader
5
+ title="Contas a receber"
6
+ description="Acompanhe faturas, vencimentos e valores da sua empresa."
7
+ >
8
+ <template #actions>
9
+ <q-btn
10
+ outline
11
+ no-caps
12
+ rounded
13
+ color="white"
14
+ icon="tune"
15
+ label="Filtros"
16
+ @click="filtersDrawerOpen = true"
17
+ />
18
+ </template>
19
+ </PageHeader>
20
+
21
+ <section class="receivables-table-panel">
22
+ <div class="receivables-table-panel__heading">
23
+ <div>
24
+ <span class="receivables-section-eyebrow">LANÇAMENTOS</span>
25
+ <h2>Faturas de recebimento</h2>
26
+ </div>
27
+ <q-card flat class="receivables-summary__card" aria-label="Valor total dos recebíveis">
28
+ <div class="receivables-summary__icon receivables-summary__icon--green">
29
+ <q-icon name="payments" />
30
+ </div>
31
+ <div class="receivables-summary__copy">
32
+ <span>Valor total dos recebíveis</span>
33
+ <strong class="receivables-summary__amount">{{ filteredTotalAmount }}</strong>
34
+ <small>Soma de todas as faturas filtradas</small>
35
+ </div>
36
+ </q-card>
37
+ </div>
38
+
39
+ <q-table
40
+ flat
41
+ class="receivables-table"
42
+ :loading="isLoading"
43
+ :rows="data"
44
+ :columns="settings.columns"
45
+ v-model:pagination="pagination"
46
+ @request="onRequest"
47
+ row-key="id"
48
+ :visible-columns="settings.visibleColumns"
49
+ :rows-per-page-options="[10, 25, 50]"
50
+ :grid="$q.screen.lt.sm"
51
+ no-data-label="Nenhuma fatura encontrada"
52
+ no-results-label="Nenhuma fatura corresponde aos filtros"
53
+ loading-label="Carregando recebíveis..."
54
+ rows-per-page-label="Linhas por página"
55
+ >
56
+ <template v-slot:body="props">
57
+ <q-tr :props="props" class="receivables-table__row">
58
+ <q-td key="id" :props="props">
59
+ <q-btn
60
+ flat
61
+ dense
62
+ no-caps
63
+ icon="receipt_long"
64
+ :label="`#${props.row.id}`"
65
+ :to="{ name: 'ReceiveDetails', params: { id: props.row.id } }"
66
+ class="receivables-invoice-link"
67
+ />
68
+ </q-td>
69
+ <q-td key="tipo" :props="props">
70
+ <q-badge class="receivables-type-badge">{{ props.row.tipo }}</q-badge>
71
+ </q-td>
72
+ <q-td key="pedidos" :props="props">
73
+ <q-btn
74
+ flat
75
+ dense
76
+ no-caps
77
+ icon="link"
78
+ color="primary"
79
+ :label="ordersLabel(props.row.pedidos)"
80
+ :disable="!props.row.pedidos.length"
81
+ @click="seeOrdersList(props.row.pedidos, props.row.id)"
82
+ class="receivables-orders-link"
83
+ />
84
+ </q-td>
85
+ <q-td key="dataVencimento" :props="props">
86
+ <div class="receivables-date-cell">
87
+ <q-icon name="event" />
88
+ <span>{{ props.row.dataVencimentoLabel }}</span>
89
+ </div>
90
+ </q-td>
91
+ <q-td key="payer" :props="props">{{ props.row.payer }}</q-td>
92
+ <q-td key="client" :props="props">{{ props.row.client }}</q-td>
93
+ <q-td key="status" :props="props">
94
+ <q-badge
95
+ rounded
96
+ class="receivables-status-badge"
97
+ :style="statusStyle(props.row.color_status)"
98
+ >
99
+ <span class="receivables-status-badge__dot" />
100
+ {{ statusLabel(props.row.status) }}
101
+ </q-badge>
102
+ </q-td>
103
+ <q-td key="preco" :props="props" class="receivables-price-cell">
104
+ {{ props.cols[7].value }}
105
+ </q-td>
106
+ </q-tr>
107
+ </template>
108
+
109
+ <template v-slot:item="props">
110
+ <div class="col-12">
111
+ <q-card flat bordered class="receivables-mobile-card">
112
+ <div class="receivables-mobile-card__top">
113
+ <q-btn
114
+ flat
115
+ dense
116
+ no-caps
117
+ icon="receipt_long"
118
+ :label="`#${props.row.id}`"
119
+ :to="{ name: 'ReceiveDetails', params: { id: props.row.id } }"
120
+ class="receivables-invoice-link"
121
+ />
122
+ <q-badge
123
+ rounded
124
+ class="receivables-status-badge"
125
+ :style="statusStyle(props.row.color_status)"
126
+ >
127
+ <span class="receivables-status-badge__dot" />
128
+ {{ statusLabel(props.row.status) }}
129
+ </q-badge>
130
+ </div>
131
+ <div class="receivables-mobile-card__type">{{ props.row.tipo }}</div>
132
+ <div class="receivables-mobile-card__grid">
133
+ <div>
134
+ <span>Vencimento</span>
135
+ <strong>{{ props.row.dataVencimentoLabel }}</strong>
136
+ </div>
137
+ <div>
138
+ <span>Valor</span>
139
+ <strong>{{ props.cols[7].value }}</strong>
140
+ </div>
141
+ <div>
142
+ <span>Pagador</span>
143
+ <strong>{{ props.row.payer }}</strong>
144
+ </div>
145
+ <div>
146
+ <span>Cliente</span>
147
+ <strong>{{ props.row.client }}</strong>
148
+ </div>
149
+ </div>
150
+ <div class="receivables-mobile-card__actions">
151
+ <q-btn
152
+ flat
153
+ dense
154
+ no-caps
155
+ icon="link"
156
+ color="primary"
157
+ :label="ordersLabel(props.row.pedidos)"
158
+ :disable="!props.row.pedidos.length"
159
+ @click="seeOrdersList(props.row.pedidos, props.row.id)"
160
+ />
161
+ <q-btn
162
+ unelevated
163
+ dense
164
+ no-caps
165
+ color="primary"
166
+ label="Abrir fatura"
167
+ :to="{ name: 'ReceiveDetails', params: { id: props.row.id } }"
168
+ />
169
+ </div>
170
+ </q-card>
171
+ </div>
172
+ </template>
173
+ </q-table>
174
+ </section>
175
+ </div>
32
176
 
33
177
  <q-dialog v-model="dialogs.orders.visible" transition-show="scale" transition-hide="scale">
34
- <q-card class="text-white" style="background-color: #00519b; width: 300px">
35
- <q-card-section>
36
- <div class="row items-center">
37
- <div class="text-h6">
38
- Pedidos da Fatura #{{ dialogs.orders.invoice }}
39
- </div>
40
- <q-space />
41
- <q-btn icon="close" color="white" flat round dense v-close-popup />
178
+ <q-card class="receivables-orders-dialog">
179
+ <q-card-section class="receivables-orders-dialog__header">
180
+ <div>
181
+ <span>DETALHES DA FATURA</span>
182
+ <h3>Pedidos da fatura #{{ dialogs.orders.invoice }}</h3>
42
183
  </div>
184
+ <q-btn icon="close" flat round dense v-close-popup aria-label="Fechar" />
43
185
  </q-card-section>
44
-
45
- <q-card-section class="q-pt-none">
46
- <q-markup-table>
47
- <tbody>
48
- <tr v-for="(orderId, index) in dialogs.orders.items" :key="index">
49
- <td class="text-center">
50
- <q-btn flat color="primary" :label="`Ver pedido #${orderId}`"
51
- :to="{ name: 'OrderDetails', params: { id: orderId } }" />
52
- </td>
53
- </tr>
54
- </tbody>
55
- </q-markup-table>
56
- </q-card-section>
186
+ <div class="receivables-orders-dialog__list">
187
+ <q-list separator>
188
+ <q-item v-for="(orderId, index) in dialogs.orders.items" :key="index">
189
+ <q-item-section avatar>
190
+ <q-avatar color="blue-1" text-color="primary" icon="receipt" />
191
+ </q-item-section>
192
+ <q-item-section>Pedido #{{ orderId }}</q-item-section>
193
+ <q-item-section side>
194
+ <q-btn
195
+ flat
196
+ dense
197
+ no-caps
198
+ color="primary"
199
+ label="Abrir"
200
+ :to="{ name: 'OrderDetails', params: { id: orderId } }"
201
+ />
202
+ </q-item-section>
203
+ </q-item>
204
+ </q-list>
205
+ </div>
57
206
  </q-card>
58
207
  </q-dialog>
208
+
209
+ <FilterDrawer
210
+ v-model="filtersDrawerOpen"
211
+ eyebrow="CONTAS A RECEBER"
212
+ title="Refinar recebíveis"
213
+ description="Escolha os critérios para atualizar a listagem."
214
+ :show-apply="false"
215
+ @clear="clearFilters"
216
+ >
217
+ <Filters
218
+ :filters="filters"
219
+ variant="receivables-drawer"
220
+ @onRequest="onFilterRequest"
221
+ />
222
+ </FilterDrawer>
59
223
  </div>
60
224
  </template>
61
225
 
@@ -67,6 +231,8 @@ import {
67
231
  } from "@freteclick/quasar-common-ui/src/utils/formatter";
68
232
 
69
233
  import { date } from "quasar";
234
+ import PageHeader from "@freteclick/quasar-common-ui/src/components/common/PageHeader.vue";
235
+ import FilterDrawer from "@freteclick/quasar-common-ui/src/components/common/FilterDrawer.vue";
70
236
  import Filters from "../../common/Filters.vue";
71
237
 
72
238
  const SETTINGS = {
@@ -89,18 +255,21 @@ const SETTINGS = {
89
255
  return `#${val}`;
90
256
  },
91
257
  label: "ID",
258
+ sortable: false,
92
259
  },
93
260
  {
94
261
  name: "tipo",
95
262
  align: "left",
96
263
  field: "tipo",
97
264
  label: "Tipo",
265
+ sortable: false,
98
266
  },
99
267
  {
100
268
  name: "pedidos",
101
269
  align: "left",
102
270
  field: "pedidos",
103
271
  label: "Pedidos",
272
+ sortable: false,
104
273
  },
105
274
  {
106
275
  name: "dataVencimento",
@@ -110,33 +279,38 @@ const SETTINGS = {
110
279
  return formatDateYmdTodmY(val);
111
280
  },
112
281
  label: "Data vencimento",
282
+ sortable: false,
113
283
  },
114
284
  {
115
285
  name: "payer",
116
286
  field: "payer",
117
287
  align: "left",
118
288
  label: "Pagador",
289
+ sortable: false,
119
290
  },
120
291
  {
121
292
  name: "client",
122
293
  field: "client",
123
294
  align: "left",
124
295
  label: "Cliente",
296
+ sortable: false,
125
297
  },
126
298
  {
127
299
  name: "status",
128
300
  field: "status",
129
301
  align: "left",
130
302
  label: "Status",
303
+ sortable: false,
131
304
  },
132
305
  {
133
306
  name: "preco",
134
307
  field: "preco",
135
- align: "left",
308
+ align: "right",
136
309
  format: (val, row) => {
137
310
  return formatMoney(val, "BRL", "pt-br");
138
311
  },
139
312
  label: "Preço",
313
+ sortable: false,
140
314
  },
141
315
  ],
142
316
  };
@@ -145,6 +319,8 @@ Object.freeze(SETTINGS);
145
319
 
146
320
  export default {
147
321
  components: {
322
+ PageHeader,
323
+ FilterDrawer,
148
324
  Filters,
149
325
  },
150
326
  props: {
@@ -203,6 +379,7 @@ export default {
203
379
  invoice: null,
204
380
  },
205
381
  },
382
+ filtersDrawerOpen: false,
206
383
  data: [],
207
384
  filters: {
208
385
  orderType: {
@@ -219,7 +396,7 @@ export default {
219
396
  },
220
397
  pagination: {
221
398
  sortBy: "dataVencimento",
222
- descending: false,
399
+ descending: true,
223
400
  page: 1,
224
401
  rowsPerPage: 10,
225
402
  rowsNumber: 10,
@@ -234,8 +411,16 @@ export default {
234
411
  violations: "receiveInvoice/violations",
235
412
  items: "receiveInvoice/items",
236
413
  totalItems: "receiveInvoice/totalItems",
414
+ totalAmount: "receiveInvoice/totalAmount",
237
415
  myCompany: "people/currentCompany",
238
416
  }),
417
+
418
+ filteredTotalAmount() {
419
+ if (this.totalAmount === null || this.totalAmount === undefined) return "—";
420
+
421
+ return formatMoney(Number(this.totalAmount) || 0, "BRL", "pt-br");
422
+ },
423
+
239
424
  },
240
425
 
241
426
  watch: {
@@ -256,34 +441,34 @@ export default {
256
441
  items(items) {
257
442
  if (!items) return;
258
443
 
259
- let data = [];
260
-
261
- for (let i in items) {
262
- let item = items[i];
263
- let orders = [];
264
-
265
- for (let o in item.order) {
266
- orders.push(item.order[o].order["@id"].replace(/[^0-9]/g, ""));
267
- }
268
-
269
- var clientName = item.order[0].order.client.name;
270
- var payerName = item.order[0].order.payer.name;
271
-
272
- data.push({
273
- "@id": item["@id"],
274
- id: item["@id"].replace(/[^0-9]/g, ""),
275
- tipo: this.$t(item.invoice_type),
444
+ this.data = items.map((item) => {
445
+ const orderEntries = Array.isArray(item.order) ? item.order : [];
446
+ const orders = orderEntries
447
+ .map((entry) => {
448
+ const orderUri = entry && entry.order && entry.order["@id"];
449
+ return orderUri ? String(orderUri).replace(/[^0-9]/g, "") : null;
450
+ })
451
+ .filter(Boolean);
452
+ const firstOrder =
453
+ (orderEntries.find((entry) => entry && entry.order) || {}).order || {};
454
+ const invoiceUri = item["@id"] || "";
455
+
456
+ return {
457
+ "@id": invoiceUri,
458
+ id: String(invoiceUri).replace(/[^0-9]/g, "") || item.id,
459
+ tipo: item.invoice_type ? this.$t(item.invoice_type) : "—",
276
460
  pedidos: orders,
277
- color_status: item.status.color,
278
- dataVencimento: item.dueDate,
279
- payer: payerName,
280
- client: clientName,
281
- status: item.status.status,
282
- preco: item.price,
283
- });
284
- }
285
-
286
- this.data = data;
461
+ color_status: (item.status && item.status.color) || "",
462
+ dataVencimento: item.dueDate || "",
463
+ dataVencimentoLabel: item.dueDate
464
+ ? formatDateYmdTodmY(item.dueDate)
465
+ : "—",
466
+ payer: (firstOrder.payer && firstOrder.payer.name) || "—",
467
+ client: (firstOrder.client && firstOrder.client.name) || "—",
468
+ status: (item.status && item.status.status) || "",
469
+ preco: item.price || 0,
470
+ };
471
+ });
287
472
  },
288
473
  },
289
474
 
@@ -300,6 +485,33 @@ export default {
300
485
  this.dialogs.orders.visible = true;
301
486
  },
302
487
 
488
+ ordersLabel(orders) {
489
+ const count = Array.isArray(orders) ? orders.length : 0;
490
+ return count === 1 ? "1 pedido" : `${count} pedidos`;
491
+ },
492
+
493
+ statusLabel(status) {
494
+ return status ? this.$t(`invoice.statuses.${status}`) : "—";
495
+ },
496
+
497
+ statusStyle(color) {
498
+ return color ? { color } : {};
499
+ },
500
+
501
+ clearFilters() {
502
+ this.filters.text = null;
503
+ this.filters.orderType = { label: "Todos", value: null };
504
+ this.filters.status = { label: "Todos", value: null };
505
+ this.filters.date = { from: "", to: "" };
506
+ this.pagination.page = 1;
507
+ this.onRequest({ pagination: this.pagination });
508
+ },
509
+
510
+ onFilterRequest() {
511
+ this.pagination.page = 1;
512
+ this.onRequest({ pagination: this.pagination });
513
+ },
514
+
303
515
  formatDate(dateString) {
304
516
  if (dateString)
305
517
  return date.formatDate(
@@ -311,20 +523,21 @@ export default {
311
523
  onRequest(props) {
312
524
  if (this.isLoading) return;
313
525
 
314
- let pagination = props ? props.pagination : this.pagination;
315
-
316
- let { page, rowsPerPage, sortBy, descending } = pagination;
526
+ const requestedPagination =
527
+ props && props.pagination ? props.pagination : this.pagination;
528
+ const page = Number(requestedPagination.page) || 1;
529
+ const rowsPerPage = Number(requestedPagination.rowsPerPage) || 10;
317
530
 
318
- let params = { itemsPerPage: rowsPerPage, page };
531
+ const params = { itemsPerPage: rowsPerPage, page };
319
532
 
320
533
  params.from = this.formatDate(this.filters.date.from) || "";
321
534
  params.to = this.formatDate(this.filters.date.to) || "";
322
- params.orderType = this.filters.orderType.value || "";
535
+ params.orderType = (this.filters.orderType && this.filters.orderType.value) || "";
323
536
 
324
537
  if (this.filters.text != null && this.filters.text.length > 0) {
325
538
  if (this.filters.text.length < 2) return;
326
539
 
327
- params["searchBy"] = this.filters.text;
540
+ params.searchBy = this.filters.text.trim();
328
541
  }
329
542
 
330
543
  if (this.filters.status != null) {
@@ -345,15 +558,357 @@ export default {
345
558
  params["order.order"] = this.orderId;
346
559
  }
347
560
 
348
- params["invoice[dueDate]"] = "desc";
349
-
350
561
  this.getItems(params).then(() => {
351
- this.pagination.page = page;
352
- this.pagination.rowsPerPage = rowsPerPage;
353
- this.pagination.sortBy = sortBy;
354
- this.pagination.descending = descending;
562
+ this.pagination = {
563
+ ...this.pagination,
564
+ page,
565
+ rowsPerPage,
566
+ sortBy: "dataVencimento",
567
+ descending: true,
568
+ };
355
569
  });
356
570
  },
357
571
  },
358
572
  };
359
573
  </script>
574
+
575
+ <style lang="scss" scoped>
576
+ .receivables-page {
577
+ width: 100%;
578
+ color: #1b2d43;
579
+ }
580
+
581
+ .receivables-page__content {
582
+ display: grid;
583
+ width: min(100%, 1480px);
584
+ gap: 20px;
585
+ margin: 0 auto;
586
+ }
587
+
588
+ .receivables-summary__card {
589
+ display: flex;
590
+ width: min(100%, 410px);
591
+ min-width: 280px;
592
+ align-items: center;
593
+ gap: 12px;
594
+ margin-left: auto;
595
+ padding: 12px 16px;
596
+ border: 1px solid #e7edf4;
597
+ border-radius: 14px;
598
+ background: #fbfdff;
599
+ }
600
+
601
+ .receivables-summary__icon {
602
+ display: grid;
603
+ width: 46px;
604
+ height: 46px;
605
+ flex: 0 0 auto;
606
+ place-items: center;
607
+ border-radius: 14px;
608
+ font-size: 22px;
609
+ }
610
+
611
+ .receivables-summary__icon--green {
612
+ color: #27805a;
613
+ background: #e8f7ef;
614
+ }
615
+
616
+ .receivables-summary__copy {
617
+ display: flex;
618
+ min-width: 0;
619
+ flex-direction: column;
620
+ }
621
+
622
+ .receivables-summary__copy > span {
623
+ color: #6f7f91;
624
+ font-size: 12px;
625
+ font-weight: 600;
626
+ }
627
+
628
+ .receivables-summary__copy strong {
629
+ overflow: hidden;
630
+ margin-top: 2px;
631
+ color: #1a2e45;
632
+ font-size: 24px;
633
+ font-weight: 750;
634
+ letter-spacing: -0.035em;
635
+ text-overflow: ellipsis;
636
+ white-space: nowrap;
637
+ }
638
+
639
+ .receivables-summary__copy strong.receivables-summary__amount {
640
+ font-size: clamp(17px, 1.5vw, 22px);
641
+ }
642
+
643
+ .receivables-summary__copy small {
644
+ margin-top: 1px;
645
+ color: #93a0af;
646
+ font-size: 11px;
647
+ }
648
+
649
+ .receivables-table-panel {
650
+ overflow: hidden;
651
+ border: 1px solid #e5ebf3;
652
+ border-radius: 19px;
653
+ background: #fff;
654
+ box-shadow: 0 12px 32px rgba(25, 48, 78, 0.05);
655
+ }
656
+
657
+ .receivables-table-panel__heading {
658
+ display: flex;
659
+ align-items: center;
660
+ justify-content: space-between;
661
+ gap: 20px;
662
+ padding: 23px 25px 19px;
663
+ border-bottom: 1px solid #edf1f6;
664
+ }
665
+
666
+ .receivables-section-eyebrow {
667
+ color: #7890aa;
668
+ font-size: 10px;
669
+ font-weight: 750;
670
+ letter-spacing: 0.13em;
671
+ }
672
+
673
+ .receivables-table-panel__heading h2 {
674
+ margin: 5px 0 0;
675
+ color: #1a2e45;
676
+ font-size: 19px;
677
+ font-weight: 720;
678
+ letter-spacing: -0.02em;
679
+ }
680
+
681
+ .receivables-table {
682
+ color: #33465b;
683
+ }
684
+
685
+ .receivables-table :deep(.q-table thead tr) {
686
+ height: 48px;
687
+ background: #f8fafc;
688
+ }
689
+
690
+ .receivables-table :deep(.q-table thead th) {
691
+ padding: 0 16px;
692
+ color: #7b8b9c;
693
+ font-size: 10px;
694
+ font-weight: 750;
695
+ letter-spacing: 0.07em;
696
+ text-transform: uppercase;
697
+ }
698
+
699
+ .receivables-table :deep(.q-table tbody td) {
700
+ height: 64px;
701
+ padding: 10px 16px;
702
+ border-color: #edf1f5;
703
+ font-size: 12px;
704
+ }
705
+
706
+ .receivables-table :deep(.q-table tbody tr) {
707
+ transition: background-color 0.15s ease;
708
+ }
709
+
710
+ .receivables-table :deep(.q-table tbody tr:hover) {
711
+ background: #f8fbff;
712
+ }
713
+
714
+ .receivables-table :deep(.q-table__bottom) {
715
+ min-height: 58px;
716
+ padding: 8px 18px;
717
+ border-top: 1px solid #edf1f5;
718
+ color: #718096;
719
+ font-size: 12px;
720
+ }
721
+
722
+ .receivables-invoice-link {
723
+ border-radius: 8px;
724
+ color: #245d9c;
725
+ font-size: 12px;
726
+ font-weight: 750;
727
+ }
728
+
729
+ .receivables-invoice-link :deep(.q-icon) {
730
+ font-size: 17px;
731
+ }
732
+
733
+ .receivables-type-badge {
734
+ padding: 6px 9px;
735
+ border-radius: 7px;
736
+ color: #526b86;
737
+ background: #eef3f8;
738
+ font-size: 10px;
739
+ font-weight: 650;
740
+ }
741
+
742
+ .receivables-orders-link {
743
+ border-radius: 8px;
744
+ font-size: 11px;
745
+ font-weight: 650;
746
+ }
747
+
748
+ .receivables-date-cell {
749
+ display: flex;
750
+ align-items: center;
751
+ gap: 7px;
752
+ white-space: nowrap;
753
+ }
754
+
755
+ .receivables-date-cell .q-icon {
756
+ color: #8294a8;
757
+ font-size: 16px;
758
+ }
759
+
760
+ .receivables-status-badge {
761
+ display: inline-flex;
762
+ align-items: center;
763
+ gap: 6px;
764
+ padding: 6px 9px;
765
+ border-radius: 20px;
766
+ background: #f0f4f7;
767
+ font-size: 10px;
768
+ font-weight: 700;
769
+ }
770
+
771
+ .receivables-status-badge__dot {
772
+ width: 6px;
773
+ height: 6px;
774
+ border-radius: 50%;
775
+ background: currentColor;
776
+ }
777
+
778
+ .receivables-price-cell {
779
+ color: #1e3e5e;
780
+ font-weight: 750;
781
+ white-space: nowrap;
782
+ }
783
+
784
+ .receivables-mobile-card {
785
+ margin: 4px 0;
786
+ padding: 16px;
787
+ border-color: #e7edf4;
788
+ border-radius: 15px;
789
+ background: #fff;
790
+ }
791
+
792
+ .receivables-mobile-card__top,
793
+ .receivables-mobile-card__actions {
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: space-between;
797
+ gap: 10px;
798
+ }
799
+
800
+ .receivables-mobile-card__type {
801
+ margin: 6px 0 14px;
802
+ color: #728398;
803
+ font-size: 11px;
804
+ }
805
+
806
+ .receivables-mobile-card__grid {
807
+ display: grid;
808
+ grid-template-columns: repeat(2, minmax(0, 1fr));
809
+ gap: 13px 10px;
810
+ }
811
+
812
+ .receivables-mobile-card__grid > div {
813
+ display: flex;
814
+ min-width: 0;
815
+ flex-direction: column;
816
+ gap: 4px;
817
+ }
818
+
819
+ .receivables-mobile-card__grid span {
820
+ color: #8795a5;
821
+ font-size: 10px;
822
+ }
823
+
824
+ .receivables-mobile-card__grid strong {
825
+ overflow: hidden;
826
+ color: #263b52;
827
+ font-size: 12px;
828
+ font-weight: 650;
829
+ text-overflow: ellipsis;
830
+ white-space: nowrap;
831
+ }
832
+
833
+ .receivables-mobile-card__actions {
834
+ margin-top: 16px;
835
+ padding-top: 12px;
836
+ border-top: 1px solid #edf1f5;
837
+ }
838
+
839
+ .receivables-orders-dialog {
840
+ display: flex;
841
+ width: min(100%, 520px);
842
+ max-height: min(82vh, 760px);
843
+ flex-direction: column;
844
+ overflow: hidden;
845
+ border-radius: 18px;
846
+ }
847
+
848
+ .receivables-orders-dialog__list {
849
+ min-height: 0;
850
+ flex: 1 1 auto;
851
+ overflow-y: auto;
852
+ overscroll-behavior: contain;
853
+ }
854
+
855
+ .receivables-orders-dialog__header {
856
+ display: flex;
857
+ align-items: center;
858
+ justify-content: space-between;
859
+ gap: 12px;
860
+ padding: 20px 22px;
861
+ color: #fff;
862
+ background: #173f68;
863
+ }
864
+
865
+ .receivables-orders-dialog__header span {
866
+ color: #c7d9eb;
867
+ font-size: 9px;
868
+ font-weight: 750;
869
+ letter-spacing: 0.12em;
870
+ }
871
+
872
+ .receivables-orders-dialog__header h3 {
873
+ margin: 5px 0 0;
874
+ font-size: 17px;
875
+ font-weight: 700;
876
+ }
877
+
878
+ .receivables-orders-dialog__header .q-btn {
879
+ color: #fff;
880
+ }
881
+
882
+ @media (max-width: 600px) {
883
+ .receivables-page__content {
884
+ gap: 14px;
885
+ }
886
+
887
+ .receivables-summary__card {
888
+ padding: 14px 16px;
889
+ }
890
+
891
+ .receivables-summary__icon {
892
+ width: 40px;
893
+ height: 40px;
894
+ }
895
+
896
+ .receivables-table-panel {
897
+ border-radius: 16px;
898
+ }
899
+
900
+ .receivables-table-panel__heading {
901
+ align-items: flex-start;
902
+ flex-direction: column;
903
+ gap: 12px;
904
+ padding: 18px 17px 14px;
905
+ }
906
+
907
+ .receivables-summary__card {
908
+ width: 100%;
909
+ min-width: 0;
910
+ margin-left: 0;
911
+ }
912
+
913
+ }
914
+ </style>