@sumaris-net/ngx-components 18.2.31 → 18.2.32

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.
Files changed (37) hide show
  1. package/doc/changelog.md +1031 -1028
  2. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +1 -1
  3. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +1 -1
  4. package/esm2022/src/app/core/peer/select-peer.modal.mjs +3 -3
  5. package/esm2022/src/app/core/peer/select-peer.module.mjs +1 -1
  6. package/esm2022/src/app/core/services/config/core.config.mjs +1 -1
  7. package/esm2022/src/app/core/services/model/node-feature.model.mjs +1 -1
  8. package/esm2022/src/app/core/services/model/peer.model.mjs +1 -1
  9. package/esm2022/src/app/core/services/network.service.mjs +1 -1
  10. package/esm2022/src/app/core/services/network.utils.mjs +1 -1
  11. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +1 -1
  12. package/esm2022/src/app/core/table/testing/table.testing.mjs +3 -3
  13. package/esm2022/src/app/shared/forms.mjs +1 -1
  14. package/esm2022/src/app/shared/inputs.mjs +1 -1
  15. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +3 -3
  16. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +3 -3
  17. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +1 -1
  18. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +5 -3
  19. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +1 -1
  20. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
  21. package/esm2022/src/app/shared/material/material.animations.mjs +1 -1
  22. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +1 -1
  23. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +1 -1
  24. package/esm2022/src/app/shared/validator/validators.mjs +1 -1
  25. package/esm2022/src/environments/environment.class.mjs +1 -1
  26. package/esm2022/src/environments/environment.mjs +1 -1
  27. package/fesm2022/sumaris-net.ngx-components.mjs +14 -12
  28. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/src/app/shared/inputs.d.ts +1 -1
  31. package/src/assets/i18n/en-US.json +735 -735
  32. package/src/assets/i18n/en.json +734 -734
  33. package/src/assets/i18n/fr.json +734 -734
  34. package/src/assets/manifest.json +17 -17
  35. package/src/theme/_material.scss +213 -213
  36. package/src/theme/_ngx-components.scss +955 -955
  37. package/src/theme/_ngx-components.table.scss +597 -597
@@ -1,597 +1,597 @@
1
- // --------------------------------------------------
2
- // Material Table
3
- // --------------------------------------------------
4
-
5
- .table-container {
6
- max-width: 100%;
7
- max-height: 100%;
8
- overflow-x: auto;
9
- }
10
-
11
- .dark .mat-mdc-table {
12
- --mdc-checkbox-selected-checkmark-color: var(--ion-text-color);
13
- --mdc-checkbox-unselected-icon-color: var(--ion-text-color);
14
- --mdc-checkbox-selected-icon-color: var(--ion-color-accent);
15
- --mdc-checkbox-unselected-focus-icon-color: var(--ion-text-color);
16
- --mdc-checkbox-unselected-hover-icon-color: var(--ion-text-color);
17
- --mdc-checkbox-unselected-pressed-icon-color: var(--ion-color-accent);
18
- }
19
-
20
- .mat-mdc-table {
21
- min-width: calc(100% - 1px);
22
- border-collapse: separate;
23
- --mat-table-background-color: var(--background, var(--ion-background-color));
24
- --mat-table-header-color: var(--ion-color-primary);
25
- --mat-table-header-background-color: var(--mat-table-background-color);
26
- --mat-table-row-item-label-text-color: var(--ion-text-color);
27
- --mat-table-row-item-outline-color: var(--ion-border-color);
28
- --mat-table-row-item-label-text-size: 14px;
29
- --mat-table-row-item-label-text-tracking: normal;
30
- --mat-row-height: #{$app-table-row-height} !important;
31
- --mat-row-max-height: #{$app-table-row-max-height} !important;
32
- --mat-cell-horizontal-padding: #{$app-table-cell-horizontal-padding};
33
- --mat-cell-padding-top: calc(var(--mat-row-height) / 2 - var(--mat-table-row-item-label-text-size, 14px));
34
-
35
- --mdc-typography-body1-font-size: 14px;
36
- --mdc-typography-body1-letter-spacing: normal;
37
-
38
- --mat-form-field-container-text-tracking: normal;
39
- --mat-form-field-state-layer-color: #{$app-table-cell-focus-background-color};
40
- --mat-form-field-subscript-text-size: 10px;
41
- --mdc-checkbox-state-layer-size: 20px;
42
- --mdc-radio-state-layer-size: 20px;
43
- --mdc-filled-text-field-container-color: transparent;
44
- --mdc-filled-text-field-disabled-container-color: transparent;
45
- --mdc-filled-text-field-input-text-color: var(--ion-text-color);
46
- --mdc-filled-text-field-input-text-placeholder-color: var(--app-form-field-label-color);
47
- --mdc-filled-text-field-caret-color: var(--ion-text-color);
48
- --mdc-filled-text-field-active-indicator-color: transparent;
49
- --mdc-filled-text-field-hover-label-text-color: var(--app-form-field-label-color);
50
- --mdc-filled-text-field-hover-active-indicator-color: transparent;
51
- --mdc-filled-text-field-focus-label-text-color: var(--ion-color-primary);
52
- --mdc-filled-text-field-focus-active-indicator-color: var(--ion-color-primary);
53
-
54
- --mat-select-enabled-trigger-text-color: var(--ion-text-color);
55
- --mat-select-disabled-trigger-text-color: var(--ion-text-color);
56
- --mat-checkbox-label-text-color: var(--ion-text-color);
57
-
58
- .mat-mdc-header-cell {
59
- color: var(--mat-table-header-color);
60
- background: var(--mat-table-header-background-color) !important;
61
-
62
- &.disabled {
63
- color: var(--ion-color-medium, grey);
64
- }
65
-
66
- &.cdk-drag-preview {
67
- color: var(--ion-color-primary100);
68
- border-bottom-width: 0;
69
-
70
- .mat-sort-header-arrow {
71
- display: none;
72
- }
73
- }
74
-
75
- // force invisible
76
- &.cdk-visually-hidden {
77
- position: absolute !important;
78
- }
79
-
80
- & > ion-label,
81
- & > mat-label,
82
- & button > ion-label,
83
- & button > mat-label {
84
- margin-top: 0;
85
- margin-bottom: 0;
86
- text-align: start;
87
- }
88
- }
89
-
90
- .mat-mdc-header-row {
91
- --mat-table-header-headline-size: 12px;
92
- --mat-table-header-headline-line-height: 12px;
93
- height: var(--app-table-header-height, 52px);
94
- border-bottom: 1px solid #{$app-table-border-color};
95
- }
96
-
97
- // Auto hide sort header, when the column is not sorted
98
- // (useful to minimize the column width - e.g. on mobile device)
99
- &.mat-table-hide-sort-arrow {
100
- .mat-sort-header-arrow {
101
- transition: none !important;
102
- }
103
-
104
- .mat-sort-header-arrow:not([style*='opacity: 1']) {
105
- display: none;
106
- }
107
- }
108
-
109
- .mat-mdc-header-row,
110
- .mat-mdc-row,
111
- .mat-mdc-footer-row {
112
- height: calc(min(var(--mat-row-height), var(--mat-row-max-height)));
113
- max-height: var(--mat-row-max-height);
114
-
115
- // Reserve space for row dirty border
116
- //border-left: 3px solid transparent;
117
-
118
- .mat-mdc-header-cell,
119
- .mat-mdc-cell,
120
- .mat-mdc-footer-cell {
121
- // Remove default padding
122
- padding-inline: 0;
123
-
124
- &.ion-padding-start {
125
- padding-inline-start: var(--mat-cell-horizontal-padding);
126
- }
127
-
128
- &.mat-mdc-table-sticky-border-elem-left {
129
- border-right: 1px solid #{$app-table-border-color};
130
- }
131
-
132
- &.mat-mdc-table-sticky-border-elem-right {
133
- border-left: 1px solid #{$app-table-border-color};
134
- }
135
-
136
- /* Add a start padding to content (but not the cell itself) (e.g. tables with odd/event style - like BatchGroupsTable) */
137
- &.mat-mdc-cell-content-start-padding,
138
- &.mat-mdc-cell-content-padding-start {
139
- // Reset start padding here (only apply cell's content)
140
- padding-inline-start: 0;
141
-
142
- // Add left padding in labels, div, etc
143
- & > ion-label,
144
- & > mat-label,
145
- & > ion-text,
146
- & > div,
147
- & > span,
148
- & > .ion-padding-start {
149
- padding: 0 var(--mat-cell-horizontal-padding, 8px);
150
- }
151
- & > ion-label,
152
- & > mat-label,
153
- & > ion-text {
154
- // By default, display was 'inline', so the previous padding was only apply on the first element
155
- display: inline-block;
156
- }
157
-
158
- // Add left padding in form fields
159
- .mat-mdc-form-field-label {
160
- width: 100%;
161
- padding-left: var(--mat-cell-horizontal-padding, 8px);
162
- }
163
-
164
- .mat-mdc-form-field-infix {
165
- padding-left: var(--mat-cell-horizontal-padding, 8px);
166
- }
167
- }
168
- }
169
-
170
- .mat-column-select {
171
- overflow: initial;
172
- width: 50px;
173
- min-width: 50px;
174
- max-width: 50px;
175
- padding-left: 14px;
176
- }
177
-
178
- .mat-column-id {
179
- min-width: 50px;
180
- max-width: 90px;
181
-
182
- &.code {
183
- min-width: 150px;
184
- max-width: 150px;
185
- }
186
-
187
- &.mat-column-sticky {
188
- border-right: 1px solid #{$app-table-border-color};
189
- }
190
- }
191
-
192
- .mat-mdc-cell-date,
193
- .mat-cell-date {
194
- min-width: 128px;
195
- max-width: 128px;
196
-
197
- input {
198
- max-width: 120px;
199
- overflow: visible !important;
200
- }
201
- }
202
-
203
- .mat-mdc-cell-date-time,
204
- .mat-cell-date-time {
205
- min-width: 155px;
206
- max-width: 180px;
207
-
208
- mat-date-time-field {
209
- ion-col.day {
210
- min-width: unset !important; // make sure column is resizable
211
- }
212
- }
213
- input {
214
- max-width: 120px;
215
- overflow: visible !important;
216
- }
217
- }
218
-
219
- .mat-column-comments {
220
- min-width: 30px;
221
- }
222
-
223
- .mat-column-actions {
224
- text-align: end;
225
- min-width: var(--mat-column-actions-min-width);
226
- width: var(--mat-column-actions-width, 48px); // 48px = a button width
227
- max-width: var(--mat-column-actions-max-width, 48px); // 48px = a button width
228
- padding-inline-start: 0 !important; // No start padding
229
- padding-inline-end: 0; // No end padding
230
- padding-right: unset !important; // use padding-inline-start instead
231
- padding-left: unset !important; // use padding-inline-end instead
232
- color: unset; // Remove row color (let the button decide)
233
- }
234
-
235
- .mat-mdc-cell.computed mat-form-field,
236
- .mat-mdc-cell-computed,
237
- .mat-cell-computed,
238
- .mat-mdc-cell ion-text.computed,
239
- .mat-mdc-cell ion-label.computed {
240
- --ion-text-color: var(--app-form-color-computed, #{$app-form-color-computed}) !important;
241
- color: var(--ion-text-color) !important;
242
- font-style: italic;
243
- }
244
- }
245
-
246
- .mat-mdc-row {
247
- // Disabled row
248
- &.mat-mdc-row-disabled *,
249
- &.mat-row-disabled * {
250
- cursor: pointer;
251
- // Necessary to focus on <mat-form-field> when row is readonly since angular 15 migrating
252
- pointer-events: unset !important;
253
- }
254
-
255
- &.mat-mdc-row-disabled:hover,
256
- &.mat-row-disabled:hover {
257
- background-color: var(--ion-color-light);
258
-
259
- .mat-mdc-cell {
260
- color: var(--ion-color-light-contrast);
261
- }
262
- }
263
-
264
- &.mat-mdc-row-selected,
265
- &.mat-row-selected {
266
- --ion-text-color: var(--app-table-row-item-selected-text-color) !important;
267
- --ion-background-color: var(--app-table-row-item-selected-background-color) !important;
268
-
269
- --mdc-filled-text-field-input-text-color: var(--ion-text-color);
270
- --mat-select-enabled-trigger-text-color: var(--ion-text-color);
271
- --mat-select-disabled-trigger-text-color: var(--ion-text-color);
272
- --mat-checkbox-label-text-color: var(--ion-text-color);
273
-
274
- background-color: var(--ion-background-color);
275
-
276
- &:not(.mat-mdc-row-error):not(.mat-row-error):hover {
277
- background-color: var(--ion-background-color);
278
- }
279
-
280
- .mat-mdc-cell {
281
- color: var(--ion-text-color);
282
- }
283
-
284
- &.mat-mdc-row-disabled:hover,
285
- &.mat-row-disabled:hover {
286
- background-color: var(--ion-background-color) !important;
287
- }
288
- }
289
-
290
- // Dirty row
291
- &.mat-mdc-row-dirty,
292
- &.mat-row-dirty {
293
- // Resize the dirty icon (in the 'actions' column)
294
- .mat-column-actions mat-icon.dirty-icon,
295
- .mat-column-actions ion-icon.dirty-icon {
296
- width: 40px;
297
- }
298
- }
299
-
300
- // Error row
301
- &.mat-mdc-row-error,
302
- &.mat-row-error {
303
- background-color: var(--ion-color-warning-tint);
304
-
305
- &.mat-mdc-row-disabled:hover,
306
- &.mat-row-disabled:hover {
307
- background-color: var(--ion-color-warning-shade) !important;
308
- }
309
- }
310
-
311
- .mat-mdc-input-element:disabled,
312
- .mat-form-field-disabled {
313
- //.mat-mdc-form-field-label {
314
- // visibility: hidden;
315
- //}
316
- color: inherit;
317
-
318
- .mdc-floating-label {
319
- visibility: hidden;
320
- }
321
- }
322
-
323
- mat-autocomplete-field,
324
- app-form-field {
325
- width: 100%;
326
- }
327
-
328
- .mat-mdc-form-field {
329
- width: 100%;
330
-
331
- --mat-form-field-container-text-size: 14px;
332
- --mdc-filled-text-field-label-text-size: var(--mat-form-field-container-text-size);
333
- --mat-select-trigger-text-size: var(--mat-form-field-container-text-size);
334
- --mat-mdc-form-field-height: calc(var(--mat-row-height) - 2px);
335
- --mdc-outlined-text-field-outline-width: 0;
336
- height: var(--mat-mdc-form-field-height);
337
-
338
- .mat-mdc-form-field-label {
339
- width: 100%;
340
- }
341
-
342
- &.mat-form-field-appearance-fill {
343
- height: var(--mat-mdc-form-field-height);
344
- padding-top: 1px; // suppress a redundant line in table
345
- }
346
-
347
- .mat-mdc-text-field-wrapper {
348
- max-height: var(--mat-mdc-form-field-height);
349
- }
350
-
351
- .mdc-text-field {
352
- padding-inline: 0;
353
- }
354
-
355
- // Prefix
356
- .mat-mdc-form-field-icon-prefix {
357
- padding: 0;
358
-
359
- ion-icon,
360
- .mat-icon {
361
- $font-size: calculateRem(18px);
362
- $margin-vertical: calculateRem(4px);
363
- height: $font-size;
364
- width: $font-size;
365
- margin-left: $margin-vertical;
366
- margin-right: $margin-vertical;
367
- }
368
- }
369
-
370
- // Infix
371
- .mat-mdc-form-field-infix {
372
- height: var(--mat-row-height);
373
- max-height: var(--mat-row-height);
374
- min-height: 1em;
375
- width: 100%;
376
- white-space: nowrap;
377
- overflow: inherit;
378
-
379
- padding-top: var(--mat-cell-padding-top) !important;
380
- padding-right: 0;
381
- padding-bottom: 0;
382
- padding-left: 0;
383
-
384
- .mat-mdc-input-element,
385
- input {
386
- //margin-left: 5px;
387
- overflow: hidden;
388
- text-overflow: ellipsis;
389
- white-space: nowrap;
390
- }
391
-
392
- input[type='number']::-webkit-outer-spin-button,
393
- input[type='number']::-webkit-inner-spin-button {
394
- -webkit-appearance: none;
395
- margin: 0;
396
- }
397
-
398
- input[type='number'] {
399
- //text-align: right;
400
- -moz-appearance: textfield;
401
- }
402
- }
403
-
404
- // Suffix
405
- .mat-mdc-form-field-icon-suffix {
406
- white-space: nowrap;
407
- padding: 0;
408
-
409
- .mat-mdc-icon-button {
410
- --mdc-icon-button-state-layer-size: 24px;
411
- padding: 0;
412
-
413
- ion-icon,
414
- .mat-icon {
415
- $font-size: calculateRem(18px);
416
- font-size: $font-size;
417
- line-height: 1.125;
418
- }
419
-
420
- .mat-mdc-button-touch-target {
421
- width: var(--mdc-icon-button-state-layer-size);
422
- }
423
- }
424
- }
425
-
426
- // Specific behavior for chips
427
- &.mat-mdc-form-field-type-mat-chip-grid {
428
- --mat-cell-padding-top: 7px;
429
- }
430
-
431
- // Specific behavior for select
432
- &.mat-mdc-form-field-type-mat-select {
433
- --mat-select-arrow-transform: translateY(0px);
434
- .mdc-text-field {
435
- padding-right: 8px;
436
- }
437
- }
438
-
439
- // FIXME: in table, required indicator is only inside the float label
440
- .mat-mdc-floating-label {
441
- display: none;
442
- visibility: hidden;
443
- }
444
-
445
- &.mat-form-field-hide-placeholder .mat-mdc-select-placeholder {
446
- /* TODO use variables select theme */
447
- color: rgba(0, 0, 0, 0.6) !important;
448
- -webkit-text-fill-color: rgba(0, 0, 0, 0.6) !important;
449
- }
450
- } // .mat-mdc-form-field
451
-
452
- .mat-mdc-form-field-subscript-wrapper,
453
- .mat-mdc-form-field-subscript-wrapper.mat-mdc-form-field-bottom-align {
454
- margin-top: -1.5rem;
455
- text-align: right;
456
- pointer-events: none;
457
-
458
- mat-error,
459
- mat-hint {
460
- font-size: var(--mat-form-field-subscript-text-size);
461
- }
462
- }
463
-
464
- .mat-boolean-field-button.mat-mdc-form-field-appearance-fill .mat-mdc-form-field-infix,
465
- .mat-boolean-field-button .mat-mdc-form-field-infix {
466
- // Increase top border (because of button height)
467
- }
468
-
469
- mat-date-time-field {
470
- height: calc(var(--mat-row-height) - 2px);
471
- ion-col.day {
472
- min-width: unset !important; // make sure column is resizable
473
- }
474
- ion-col.hour {
475
- --max-width: var(--min-width) !important;
476
- }
477
- }
478
-
479
- mat-latlong-field {
480
- --mat-select-arrow-transform: translateY(-3px);
481
- height: calc(var(--mat-row-height) - 2px);
482
-
483
- .mat-mdc-form-field-infix {
484
- height: calc(var(--mat-row-height) - 14px) !important;
485
- }
486
- }
487
-
488
- .mat-mdc-cell > .ion-text-nowrap {
489
- width: 100%;
490
- overflow: hidden;
491
- text-overflow: ellipsis;
492
- white-space: pre;
493
- }
494
-
495
- /* Show when hover row */
496
- .mat-mdc-cell .visible-hover-row {
497
- visibility: hidden;
498
- }
499
-
500
- &:hover {
501
- .mat-mdc-cell .visible-hover-row {
502
- visibility: visible;
503
- }
504
- }
505
-
506
- .mat-mdc-cell .avatar {
507
- color: #d9d9d9;
508
- background-color: #f8f8f8;
509
- border: solid 1px #d9d9d9;
510
- overflow: hidden !important;
511
- width: 40px;
512
- height: 40px;
513
- border-radius: 50%;
514
- display: inline-block;
515
- }
516
- }
517
-
518
- /* Special case to have small row */
519
- &.compact .mat-mdc-row,
520
- .mat-mdc-row.mat-mdc-row-small,
521
- .mat-mdc-row.mat-row-small {
522
- min-height: inherit;
523
- --mat-row-height: 33px;
524
- --mat-row-max-height: 33px;
525
- }
526
-
527
- .mat-mdc-row.mat-mdc-row-small .mat-mdc-cell,
528
- .mat-mdc-row .mat-mdc-cell.mat-mdc-row-small,
529
- .mat-mdc-row.mat-row-small .mat-mdc-cell,
530
- .mat-mdc-row .mat-mdc-cell.mat-row-small {
531
- line-height: 15px;
532
- @include font-size(12px);
533
- }
534
-
535
- .mat-mdc-row-height-auto,
536
- .mat-row-height-auto {
537
- max-height: unset !important;
538
- }
539
-
540
- // Restore border on last row
541
- .mdc-data-table__row:last-child .mat-mdc-cell {
542
- border-bottom-color: var(--mat-table-row-item-outline-color, rgba(0, 0, 0, 0.12)) !important;
543
- border-bottom-width: var(--mat-table-row-item-outline-width, 1px) !important;
544
- border-bottom-style: solid !important;
545
- }
546
- }
547
-
548
-
549
- // Paginator
550
- .mat-mdc-paginator {
551
- --mat-paginator-container-size: var(--app-paginator-height, #{$app-paginator-height});
552
- --mat-paginator-container-background-color: var(--ion-toolbar-background, var(--ion-background-color, #{$ion-toolbar-background}));
553
- --mat-paginator-container-text-tracking: normal;
554
- --mat-paginator-container-text-color: var(--app-form-color, #{$app-form-color});
555
-
556
- overflow-y: hidden;
557
-
558
- .mat-mdc-paginator-page-size-select {
559
- height: var(--mat-paginator-container-size) !important;
560
- margin-top: -10px;
561
-
562
- .mat-mdc-form-field-infix {
563
- height: var(--mat-paginator-container-size) !important;
564
- }
565
- }
566
-
567
- button {
568
- --mdc-icon-button-state-layer-size: var(--mat-paginator-container-size) !important;
569
- padding: 6px !important;
570
- }
571
- }
572
-
573
- // -------------------------
574
- // Specific Properties table
575
- // -------------------------
576
- app-properties-table {
577
- .mat-column-value {
578
- min-width: 50%;
579
- max-width: 50%;
580
- width: 50%;
581
- }
582
- }
583
-
584
- html.plt-mobile {
585
- .mat-paginator-footer .mat-mdc-paginator-outer-container .mat-mdc-paginator-container {
586
- // Move paginator to the left,
587
- // because floating button are on the right
588
- margin-top: 0 !important;
589
- justify-content: flex-start;
590
-
591
- // Hide page size (not need on small screens)
592
- .mat-mdc-paginator-page-size {
593
- visibility: hidden;
594
- display: none;
595
- }
596
- }
597
- }
1
+ // --------------------------------------------------
2
+ // Material Table
3
+ // --------------------------------------------------
4
+
5
+ .table-container {
6
+ max-width: 100%;
7
+ max-height: 100%;
8
+ overflow-x: auto;
9
+ }
10
+
11
+ .dark .mat-mdc-table {
12
+ --mdc-checkbox-selected-checkmark-color: var(--ion-text-color);
13
+ --mdc-checkbox-unselected-icon-color: var(--ion-text-color);
14
+ --mdc-checkbox-selected-icon-color: var(--ion-color-accent);
15
+ --mdc-checkbox-unselected-focus-icon-color: var(--ion-text-color);
16
+ --mdc-checkbox-unselected-hover-icon-color: var(--ion-text-color);
17
+ --mdc-checkbox-unselected-pressed-icon-color: var(--ion-color-accent);
18
+ }
19
+
20
+ .mat-mdc-table {
21
+ min-width: calc(100% - 1px);
22
+ border-collapse: separate;
23
+ --mat-table-background-color: var(--background, var(--ion-background-color));
24
+ --mat-table-header-color: var(--ion-color-primary);
25
+ --mat-table-header-background-color: var(--mat-table-background-color);
26
+ --mat-table-row-item-label-text-color: var(--ion-text-color);
27
+ --mat-table-row-item-outline-color: var(--ion-border-color);
28
+ --mat-table-row-item-label-text-size: 14px;
29
+ --mat-table-row-item-label-text-tracking: normal;
30
+ --mat-row-height: #{$app-table-row-height} !important;
31
+ --mat-row-max-height: #{$app-table-row-max-height} !important;
32
+ --mat-cell-horizontal-padding: #{$app-table-cell-horizontal-padding};
33
+ --mat-cell-padding-top: calc(var(--mat-row-height) / 2 - var(--mat-table-row-item-label-text-size, 14px));
34
+
35
+ --mdc-typography-body1-font-size: 14px;
36
+ --mdc-typography-body1-letter-spacing: normal;
37
+
38
+ --mat-form-field-container-text-tracking: normal;
39
+ --mat-form-field-state-layer-color: #{$app-table-cell-focus-background-color};
40
+ --mat-form-field-subscript-text-size: 10px;
41
+ --mdc-checkbox-state-layer-size: 20px;
42
+ --mdc-radio-state-layer-size: 20px;
43
+ --mdc-filled-text-field-container-color: transparent;
44
+ --mdc-filled-text-field-disabled-container-color: transparent;
45
+ --mdc-filled-text-field-input-text-color: var(--ion-text-color);
46
+ --mdc-filled-text-field-input-text-placeholder-color: var(--app-form-field-label-color);
47
+ --mdc-filled-text-field-caret-color: var(--ion-text-color);
48
+ --mdc-filled-text-field-active-indicator-color: transparent;
49
+ --mdc-filled-text-field-hover-label-text-color: var(--app-form-field-label-color);
50
+ --mdc-filled-text-field-hover-active-indicator-color: transparent;
51
+ --mdc-filled-text-field-focus-label-text-color: var(--ion-color-primary);
52
+ --mdc-filled-text-field-focus-active-indicator-color: var(--ion-color-primary);
53
+
54
+ --mat-select-enabled-trigger-text-color: var(--ion-text-color);
55
+ --mat-select-disabled-trigger-text-color: var(--ion-text-color);
56
+ --mat-checkbox-label-text-color: var(--ion-text-color);
57
+
58
+ .mat-mdc-header-cell {
59
+ color: var(--mat-table-header-color);
60
+ background: var(--mat-table-header-background-color) !important;
61
+
62
+ &.disabled {
63
+ color: var(--ion-color-medium, grey);
64
+ }
65
+
66
+ &.cdk-drag-preview {
67
+ color: var(--ion-color-primary100);
68
+ border-bottom-width: 0;
69
+
70
+ .mat-sort-header-arrow {
71
+ display: none;
72
+ }
73
+ }
74
+
75
+ // force invisible
76
+ &.cdk-visually-hidden {
77
+ position: absolute !important;
78
+ }
79
+
80
+ & > ion-label,
81
+ & > mat-label,
82
+ & button > ion-label,
83
+ & button > mat-label {
84
+ margin-top: 0;
85
+ margin-bottom: 0;
86
+ text-align: start;
87
+ }
88
+ }
89
+
90
+ .mat-mdc-header-row {
91
+ --mat-table-header-headline-size: 12px;
92
+ --mat-table-header-headline-line-height: 12px;
93
+ height: var(--app-table-header-height, 52px);
94
+ border-bottom: 1px solid #{$app-table-border-color};
95
+ }
96
+
97
+ // Auto hide sort header, when the column is not sorted
98
+ // (useful to minimize the column width - e.g. on mobile device)
99
+ &.mat-table-hide-sort-arrow {
100
+ .mat-sort-header-arrow {
101
+ transition: none !important;
102
+ }
103
+
104
+ .mat-sort-header-arrow:not([style*='opacity: 1']) {
105
+ display: none;
106
+ }
107
+ }
108
+
109
+ .mat-mdc-header-row,
110
+ .mat-mdc-row,
111
+ .mat-mdc-footer-row {
112
+ height: calc(min(var(--mat-row-height), var(--mat-row-max-height)));
113
+ max-height: var(--mat-row-max-height);
114
+
115
+ // Reserve space for row dirty border
116
+ //border-left: 3px solid transparent;
117
+
118
+ .mat-mdc-header-cell,
119
+ .mat-mdc-cell,
120
+ .mat-mdc-footer-cell {
121
+ // Remove default padding
122
+ padding-inline: 0;
123
+
124
+ &.ion-padding-start {
125
+ padding-inline-start: var(--mat-cell-horizontal-padding);
126
+ }
127
+
128
+ &.mat-mdc-table-sticky-border-elem-left {
129
+ border-right: 1px solid #{$app-table-border-color};
130
+ }
131
+
132
+ &.mat-mdc-table-sticky-border-elem-right {
133
+ border-left: 1px solid #{$app-table-border-color};
134
+ }
135
+
136
+ /* Add a start padding to content (but not the cell itself) (e.g. tables with odd/event style - like BatchGroupsTable) */
137
+ &.mat-mdc-cell-content-start-padding,
138
+ &.mat-mdc-cell-content-padding-start {
139
+ // Reset start padding here (only apply cell's content)
140
+ padding-inline-start: 0;
141
+
142
+ // Add left padding in labels, div, etc
143
+ & > ion-label,
144
+ & > mat-label,
145
+ & > ion-text,
146
+ & > div,
147
+ & > span,
148
+ & > .ion-padding-start {
149
+ padding: 0 var(--mat-cell-horizontal-padding, 8px);
150
+ }
151
+ & > ion-label,
152
+ & > mat-label,
153
+ & > ion-text {
154
+ // By default, display was 'inline', so the previous padding was only apply on the first element
155
+ display: inline-block;
156
+ }
157
+
158
+ // Add left padding in form fields
159
+ .mat-mdc-form-field-label {
160
+ width: 100%;
161
+ padding-left: var(--mat-cell-horizontal-padding, 8px);
162
+ }
163
+
164
+ .mat-mdc-form-field-infix {
165
+ padding-left: var(--mat-cell-horizontal-padding, 8px);
166
+ }
167
+ }
168
+ }
169
+
170
+ .mat-column-select {
171
+ overflow: initial;
172
+ width: 50px;
173
+ min-width: 50px;
174
+ max-width: 50px;
175
+ padding-left: 14px;
176
+ }
177
+
178
+ .mat-column-id {
179
+ min-width: 50px;
180
+ max-width: 90px;
181
+
182
+ &.code {
183
+ min-width: 150px;
184
+ max-width: 150px;
185
+ }
186
+
187
+ &.mat-column-sticky {
188
+ border-right: 1px solid #{$app-table-border-color};
189
+ }
190
+ }
191
+
192
+ .mat-mdc-cell-date,
193
+ .mat-cell-date {
194
+ min-width: 128px;
195
+ max-width: 128px;
196
+
197
+ input {
198
+ max-width: 120px;
199
+ overflow: visible !important;
200
+ }
201
+ }
202
+
203
+ .mat-mdc-cell-date-time,
204
+ .mat-cell-date-time {
205
+ min-width: 155px;
206
+ max-width: 180px;
207
+
208
+ mat-date-time-field {
209
+ ion-col.day {
210
+ min-width: unset !important; // make sure column is resizable
211
+ }
212
+ }
213
+ input {
214
+ max-width: 120px;
215
+ overflow: visible !important;
216
+ }
217
+ }
218
+
219
+ .mat-column-comments {
220
+ min-width: 30px;
221
+ }
222
+
223
+ .mat-column-actions {
224
+ text-align: end;
225
+ min-width: var(--mat-column-actions-min-width);
226
+ width: var(--mat-column-actions-width, 48px); // 48px = a button width
227
+ max-width: var(--mat-column-actions-max-width, 48px); // 48px = a button width
228
+ padding-inline-start: 0 !important; // No start padding
229
+ padding-inline-end: 0; // No end padding
230
+ padding-right: unset !important; // use padding-inline-start instead
231
+ padding-left: unset !important; // use padding-inline-end instead
232
+ color: unset; // Remove row color (let the button decide)
233
+ }
234
+
235
+ .mat-mdc-cell.computed mat-form-field,
236
+ .mat-mdc-cell-computed,
237
+ .mat-cell-computed,
238
+ .mat-mdc-cell ion-text.computed,
239
+ .mat-mdc-cell ion-label.computed {
240
+ --ion-text-color: var(--app-form-color-computed, #{$app-form-color-computed}) !important;
241
+ color: var(--ion-text-color) !important;
242
+ font-style: italic;
243
+ }
244
+ }
245
+
246
+ .mat-mdc-row {
247
+ // Disabled row
248
+ &.mat-mdc-row-disabled *,
249
+ &.mat-row-disabled * {
250
+ cursor: pointer;
251
+ // Necessary to focus on <mat-form-field> when row is readonly since angular 15 migrating
252
+ pointer-events: unset !important;
253
+ }
254
+
255
+ &.mat-mdc-row-disabled:hover,
256
+ &.mat-row-disabled:hover {
257
+ background-color: var(--ion-color-light);
258
+
259
+ .mat-mdc-cell {
260
+ color: var(--ion-color-light-contrast);
261
+ }
262
+ }
263
+
264
+ &.mat-mdc-row-selected,
265
+ &.mat-row-selected {
266
+ --ion-text-color: var(--app-table-row-item-selected-text-color) !important;
267
+ --ion-background-color: var(--app-table-row-item-selected-background-color) !important;
268
+
269
+ --mdc-filled-text-field-input-text-color: var(--ion-text-color);
270
+ --mat-select-enabled-trigger-text-color: var(--ion-text-color);
271
+ --mat-select-disabled-trigger-text-color: var(--ion-text-color);
272
+ --mat-checkbox-label-text-color: var(--ion-text-color);
273
+
274
+ background-color: var(--ion-background-color);
275
+
276
+ &:not(.mat-mdc-row-error):not(.mat-row-error):hover {
277
+ background-color: var(--ion-background-color);
278
+ }
279
+
280
+ .mat-mdc-cell {
281
+ color: var(--ion-text-color);
282
+ }
283
+
284
+ &.mat-mdc-row-disabled:hover,
285
+ &.mat-row-disabled:hover {
286
+ background-color: var(--ion-background-color) !important;
287
+ }
288
+ }
289
+
290
+ // Dirty row
291
+ &.mat-mdc-row-dirty,
292
+ &.mat-row-dirty {
293
+ // Resize the dirty icon (in the 'actions' column)
294
+ .mat-column-actions mat-icon.dirty-icon,
295
+ .mat-column-actions ion-icon.dirty-icon {
296
+ width: 40px;
297
+ }
298
+ }
299
+
300
+ // Error row
301
+ &.mat-mdc-row-error,
302
+ &.mat-row-error {
303
+ background-color: var(--ion-color-warning-tint);
304
+
305
+ &.mat-mdc-row-disabled:hover,
306
+ &.mat-row-disabled:hover {
307
+ background-color: var(--ion-color-warning-shade) !important;
308
+ }
309
+ }
310
+
311
+ .mat-mdc-input-element:disabled,
312
+ .mat-form-field-disabled {
313
+ //.mat-mdc-form-field-label {
314
+ // visibility: hidden;
315
+ //}
316
+ color: inherit;
317
+
318
+ .mdc-floating-label {
319
+ visibility: hidden;
320
+ }
321
+ }
322
+
323
+ mat-autocomplete-field,
324
+ app-form-field {
325
+ width: 100%;
326
+ }
327
+
328
+ .mat-mdc-form-field {
329
+ width: 100%;
330
+
331
+ --mat-form-field-container-text-size: 14px;
332
+ --mdc-filled-text-field-label-text-size: var(--mat-form-field-container-text-size);
333
+ --mat-select-trigger-text-size: var(--mat-form-field-container-text-size);
334
+ --mat-mdc-form-field-height: calc(var(--mat-row-height) - 2px);
335
+ --mdc-outlined-text-field-outline-width: 0;
336
+ height: var(--mat-mdc-form-field-height);
337
+
338
+ .mat-mdc-form-field-label {
339
+ width: 100%;
340
+ }
341
+
342
+ &.mat-form-field-appearance-fill {
343
+ height: var(--mat-mdc-form-field-height);
344
+ padding-top: 1px; // suppress a redundant line in table
345
+ }
346
+
347
+ .mat-mdc-text-field-wrapper {
348
+ max-height: var(--mat-mdc-form-field-height);
349
+ }
350
+
351
+ .mdc-text-field {
352
+ padding-inline: 0;
353
+ }
354
+
355
+ // Prefix
356
+ .mat-mdc-form-field-icon-prefix {
357
+ padding: 0;
358
+
359
+ ion-icon,
360
+ .mat-icon {
361
+ $font-size: calculateRem(18px);
362
+ $margin-vertical: calculateRem(4px);
363
+ height: $font-size;
364
+ width: $font-size;
365
+ margin-left: $margin-vertical;
366
+ margin-right: $margin-vertical;
367
+ }
368
+ }
369
+
370
+ // Infix
371
+ .mat-mdc-form-field-infix {
372
+ height: var(--mat-row-height);
373
+ max-height: var(--mat-row-height);
374
+ min-height: 1em;
375
+ width: 100%;
376
+ white-space: nowrap;
377
+ overflow: inherit;
378
+
379
+ padding-top: var(--mat-cell-padding-top) !important;
380
+ padding-right: 0;
381
+ padding-bottom: 0;
382
+ padding-left: 0;
383
+
384
+ .mat-mdc-input-element,
385
+ input {
386
+ //margin-left: 5px;
387
+ overflow: hidden;
388
+ text-overflow: ellipsis;
389
+ white-space: nowrap;
390
+ }
391
+
392
+ input[type='number']::-webkit-outer-spin-button,
393
+ input[type='number']::-webkit-inner-spin-button {
394
+ -webkit-appearance: none;
395
+ margin: 0;
396
+ }
397
+
398
+ input[type='number'] {
399
+ //text-align: right;
400
+ -moz-appearance: textfield;
401
+ }
402
+ }
403
+
404
+ // Suffix
405
+ .mat-mdc-form-field-icon-suffix {
406
+ white-space: nowrap;
407
+ padding: 0;
408
+
409
+ .mat-mdc-icon-button {
410
+ --mdc-icon-button-state-layer-size: 24px;
411
+ padding: 0;
412
+
413
+ ion-icon,
414
+ .mat-icon {
415
+ $font-size: calculateRem(18px);
416
+ font-size: $font-size;
417
+ line-height: 1.125;
418
+ }
419
+
420
+ .mat-mdc-button-touch-target {
421
+ width: var(--mdc-icon-button-state-layer-size);
422
+ }
423
+ }
424
+ }
425
+
426
+ // Specific behavior for chips
427
+ &.mat-mdc-form-field-type-mat-chip-grid {
428
+ --mat-cell-padding-top: 7px;
429
+ }
430
+
431
+ // Specific behavior for select
432
+ &.mat-mdc-form-field-type-mat-select {
433
+ --mat-select-arrow-transform: translateY(0px);
434
+ .mdc-text-field {
435
+ padding-right: 8px;
436
+ }
437
+ }
438
+
439
+ // FIXME: in table, required indicator is only inside the float label
440
+ .mat-mdc-floating-label {
441
+ display: none;
442
+ visibility: hidden;
443
+ }
444
+
445
+ &.mat-form-field-hide-placeholder .mat-mdc-select-placeholder {
446
+ /* TODO use variables select theme */
447
+ color: rgba(0, 0, 0, 0.6) !important;
448
+ -webkit-text-fill-color: rgba(0, 0, 0, 0.6) !important;
449
+ }
450
+ } // .mat-mdc-form-field
451
+
452
+ .mat-mdc-form-field-subscript-wrapper,
453
+ .mat-mdc-form-field-subscript-wrapper.mat-mdc-form-field-bottom-align {
454
+ margin-top: -1.5rem;
455
+ text-align: right;
456
+ pointer-events: none;
457
+
458
+ mat-error,
459
+ mat-hint {
460
+ font-size: var(--mat-form-field-subscript-text-size);
461
+ }
462
+ }
463
+
464
+ .mat-boolean-field-button.mat-mdc-form-field-appearance-fill .mat-mdc-form-field-infix,
465
+ .mat-boolean-field-button .mat-mdc-form-field-infix {
466
+ // Increase top border (because of button height)
467
+ }
468
+
469
+ mat-date-time-field {
470
+ height: calc(var(--mat-row-height) - 2px);
471
+ ion-col.day {
472
+ min-width: unset !important; // make sure column is resizable
473
+ }
474
+ ion-col.hour {
475
+ --max-width: var(--min-width) !important;
476
+ }
477
+ }
478
+
479
+ mat-latlong-field {
480
+ --mat-select-arrow-transform: translateY(-3px);
481
+ height: calc(var(--mat-row-height) - 2px);
482
+
483
+ .mat-mdc-form-field-infix {
484
+ height: calc(var(--mat-row-height) - 14px) !important;
485
+ }
486
+ }
487
+
488
+ .mat-mdc-cell > .ion-text-nowrap {
489
+ width: 100%;
490
+ overflow: hidden;
491
+ text-overflow: ellipsis;
492
+ white-space: pre;
493
+ }
494
+
495
+ /* Show when hover row */
496
+ .mat-mdc-cell .visible-hover-row {
497
+ visibility: hidden;
498
+ }
499
+
500
+ &:hover {
501
+ .mat-mdc-cell .visible-hover-row {
502
+ visibility: visible;
503
+ }
504
+ }
505
+
506
+ .mat-mdc-cell .avatar {
507
+ color: #d9d9d9;
508
+ background-color: #f8f8f8;
509
+ border: solid 1px #d9d9d9;
510
+ overflow: hidden !important;
511
+ width: 40px;
512
+ height: 40px;
513
+ border-radius: 50%;
514
+ display: inline-block;
515
+ }
516
+ }
517
+
518
+ /* Special case to have small row */
519
+ &.compact .mat-mdc-row,
520
+ .mat-mdc-row.mat-mdc-row-small,
521
+ .mat-mdc-row.mat-row-small {
522
+ min-height: inherit;
523
+ --mat-row-height: 33px;
524
+ --mat-row-max-height: 33px;
525
+ }
526
+
527
+ .mat-mdc-row.mat-mdc-row-small .mat-mdc-cell,
528
+ .mat-mdc-row .mat-mdc-cell.mat-mdc-row-small,
529
+ .mat-mdc-row.mat-row-small .mat-mdc-cell,
530
+ .mat-mdc-row .mat-mdc-cell.mat-row-small {
531
+ line-height: 15px;
532
+ @include font-size(12px);
533
+ }
534
+
535
+ .mat-mdc-row-height-auto,
536
+ .mat-row-height-auto {
537
+ max-height: unset !important;
538
+ }
539
+
540
+ // Restore border on last row
541
+ .mdc-data-table__row:last-child .mat-mdc-cell {
542
+ border-bottom-color: var(--mat-table-row-item-outline-color, rgba(0, 0, 0, 0.12)) !important;
543
+ border-bottom-width: var(--mat-table-row-item-outline-width, 1px) !important;
544
+ border-bottom-style: solid !important;
545
+ }
546
+ }
547
+
548
+
549
+ // Paginator
550
+ .mat-mdc-paginator {
551
+ --mat-paginator-container-size: var(--app-paginator-height, #{$app-paginator-height});
552
+ --mat-paginator-container-background-color: var(--ion-toolbar-background, var(--ion-background-color, #{$ion-toolbar-background}));
553
+ --mat-paginator-container-text-tracking: normal;
554
+ --mat-paginator-container-text-color: var(--app-form-color, #{$app-form-color});
555
+
556
+ overflow-y: hidden;
557
+
558
+ .mat-mdc-paginator-page-size-select {
559
+ height: var(--mat-paginator-container-size) !important;
560
+ margin-top: -10px;
561
+
562
+ .mat-mdc-form-field-infix {
563
+ height: var(--mat-paginator-container-size) !important;
564
+ }
565
+ }
566
+
567
+ button {
568
+ --mdc-icon-button-state-layer-size: var(--mat-paginator-container-size) !important;
569
+ padding: 6px !important;
570
+ }
571
+ }
572
+
573
+ // -------------------------
574
+ // Specific Properties table
575
+ // -------------------------
576
+ app-properties-table {
577
+ .mat-column-value {
578
+ min-width: 50%;
579
+ max-width: 50%;
580
+ width: 50%;
581
+ }
582
+ }
583
+
584
+ html.plt-mobile {
585
+ .mat-paginator-footer .mat-mdc-paginator-outer-container .mat-mdc-paginator-container {
586
+ // Move paginator to the left,
587
+ // because floating button are on the right
588
+ margin-top: 0 !important;
589
+ justify-content: flex-start;
590
+
591
+ // Hide page size (not need on small screens)
592
+ .mat-mdc-paginator-page-size {
593
+ visibility: hidden;
594
+ display: none;
595
+ }
596
+ }
597
+ }