@freteclick/quasar-financial-ui 1.0.113 → 1.0.115

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