valtech-components 2.0.824 → 2.0.826
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.
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +30 -46
- package/esm2022/lib/components/molecules/feedback-form/feedback-form.component.mjs +12 -36
- package/esm2022/lib/components/molecules/refresher/refresher.component.mjs +3 -3
- package/esm2022/lib/components/molecules/refresher/types.mjs +2 -2
- package/esm2022/lib/components/molecules/username-input/username-input.component.mjs +3 -3
- package/esm2022/lib/components/organisms/avatar-upload/avatar-upload.component.mjs +3 -3
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +12 -28
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +63 -48
- package/esm2022/lib/components/organisms/infinite-list/types.mjs +2 -2
- package/esm2022/lib/components/templates/page-wrapper/page-wrapper.component.mjs +9 -3
- package/esm2022/lib/services/modal/simple-modal-content.component.mjs +16 -5
- package/esm2022/lib/services/skeleton/directives/loading.directive.mjs +3 -4
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +143 -168
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/services/firebase/firebase-messaging-sw.js +19 -8
|
@@ -53,7 +53,7 @@ import 'prismjs/components/prism-json';
|
|
|
53
53
|
* Current version of valtech-components.
|
|
54
54
|
* This is automatically updated during the publish process.
|
|
55
55
|
*/
|
|
56
|
-
const VERSION = '2.0.
|
|
56
|
+
const VERSION = '2.0.826';
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Servicio para gestionar presets de componentes.
|
|
@@ -4776,9 +4776,7 @@ class QrCodeComponent {
|
|
|
4776
4776
|
}
|
|
4777
4777
|
async onDownload() {
|
|
4778
4778
|
try {
|
|
4779
|
-
const options = this.props.downloadFilename
|
|
4780
|
-
? { filename: this.props.downloadFilename }
|
|
4781
|
-
: undefined;
|
|
4779
|
+
const options = this.props.downloadFilename ? { filename: this.props.downloadFilename } : undefined;
|
|
4782
4780
|
await this.qrService.download(this.props.qr, options);
|
|
4783
4781
|
this.actionComplete.emit({
|
|
4784
4782
|
action: 'download',
|
|
@@ -4860,12 +4858,16 @@ class QrCodeComponent {
|
|
|
4860
4858
|
>
|
|
4861
4859
|
@if (props.loading) {
|
|
4862
4860
|
<div class="loading-overlay">
|
|
4863
|
-
<ion-spinner name="
|
|
4861
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
4864
4862
|
</div>
|
|
4865
4863
|
}
|
|
4866
4864
|
|
|
4867
4865
|
@if (props.label && props.label.position === 'top') {
|
|
4868
|
-
<div
|
|
4866
|
+
<div
|
|
4867
|
+
class="qr-label qr-label--top"
|
|
4868
|
+
[style.--label-color]="props.label.color || 'inherit'"
|
|
4869
|
+
[style.--label-size]="getLabelFontSize()"
|
|
4870
|
+
>
|
|
4869
4871
|
@if (props.label.icon && props.label.iconPosition !== 'end') {
|
|
4870
4872
|
<ion-icon [name]="props.label.icon"></ion-icon>
|
|
4871
4873
|
}
|
|
@@ -4887,7 +4889,11 @@ class QrCodeComponent {
|
|
|
4887
4889
|
</div>
|
|
4888
4890
|
|
|
4889
4891
|
@if (props.label && props.label.position !== 'top') {
|
|
4890
|
-
<div
|
|
4892
|
+
<div
|
|
4893
|
+
class="qr-label qr-label--bottom"
|
|
4894
|
+
[style.--label-color]="props.label.color || 'inherit'"
|
|
4895
|
+
[style.--label-size]="getLabelFontSize()"
|
|
4896
|
+
>
|
|
4891
4897
|
@if (props.label.icon && props.label.iconPosition !== 'end') {
|
|
4892
4898
|
<ion-icon [name]="props.label.icon"></ion-icon>
|
|
4893
4899
|
}
|
|
@@ -4901,34 +4907,19 @@ class QrCodeComponent {
|
|
|
4901
4907
|
@if (hasActions()) {
|
|
4902
4908
|
<div class="qr-actions">
|
|
4903
4909
|
@if (props.showDownload) {
|
|
4904
|
-
<ion-button
|
|
4905
|
-
fill="clear"
|
|
4906
|
-
size="small"
|
|
4907
|
-
(click)="onDownload()"
|
|
4908
|
-
[title]="getDownloadLabel()"
|
|
4909
|
-
>
|
|
4910
|
+
<ion-button fill="clear" size="small" (click)="onDownload()" [title]="getDownloadLabel()">
|
|
4910
4911
|
<ion-icon name="download-outline" slot="icon-only"></ion-icon>
|
|
4911
4912
|
</ion-button>
|
|
4912
4913
|
}
|
|
4913
4914
|
|
|
4914
4915
|
@if (props.showCopy && canCopy) {
|
|
4915
|
-
<ion-button
|
|
4916
|
-
fill="clear"
|
|
4917
|
-
size="small"
|
|
4918
|
-
(click)="onCopy()"
|
|
4919
|
-
[title]="getCopyLabel()"
|
|
4920
|
-
>
|
|
4916
|
+
<ion-button fill="clear" size="small" (click)="onCopy()" [title]="getCopyLabel()">
|
|
4921
4917
|
<ion-icon name="copy-outline" slot="icon-only"></ion-icon>
|
|
4922
4918
|
</ion-button>
|
|
4923
4919
|
}
|
|
4924
4920
|
|
|
4925
4921
|
@if (props.showShare && canShare) {
|
|
4926
|
-
<ion-button
|
|
4927
|
-
fill="clear"
|
|
4928
|
-
size="small"
|
|
4929
|
-
(click)="onShare()"
|
|
4930
|
-
[title]="getShareLabel()"
|
|
4931
|
-
>
|
|
4922
|
+
<ion-button fill="clear" size="small" (click)="onShare()" [title]="getShareLabel()">
|
|
4932
4923
|
<ion-icon name="share-outline" slot="icon-only"></ion-icon>
|
|
4933
4924
|
</ion-button>
|
|
4934
4925
|
}
|
|
@@ -4953,12 +4944,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4953
4944
|
>
|
|
4954
4945
|
@if (props.loading) {
|
|
4955
4946
|
<div class="loading-overlay">
|
|
4956
|
-
<ion-spinner name="
|
|
4947
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
4957
4948
|
</div>
|
|
4958
4949
|
}
|
|
4959
4950
|
|
|
4960
4951
|
@if (props.label && props.label.position === 'top') {
|
|
4961
|
-
<div
|
|
4952
|
+
<div
|
|
4953
|
+
class="qr-label qr-label--top"
|
|
4954
|
+
[style.--label-color]="props.label.color || 'inherit'"
|
|
4955
|
+
[style.--label-size]="getLabelFontSize()"
|
|
4956
|
+
>
|
|
4962
4957
|
@if (props.label.icon && props.label.iconPosition !== 'end') {
|
|
4963
4958
|
<ion-icon [name]="props.label.icon"></ion-icon>
|
|
4964
4959
|
}
|
|
@@ -4980,7 +4975,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4980
4975
|
</div>
|
|
4981
4976
|
|
|
4982
4977
|
@if (props.label && props.label.position !== 'top') {
|
|
4983
|
-
<div
|
|
4978
|
+
<div
|
|
4979
|
+
class="qr-label qr-label--bottom"
|
|
4980
|
+
[style.--label-color]="props.label.color || 'inherit'"
|
|
4981
|
+
[style.--label-size]="getLabelFontSize()"
|
|
4982
|
+
>
|
|
4984
4983
|
@if (props.label.icon && props.label.iconPosition !== 'end') {
|
|
4985
4984
|
<ion-icon [name]="props.label.icon"></ion-icon>
|
|
4986
4985
|
}
|
|
@@ -4994,34 +4993,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4994
4993
|
@if (hasActions()) {
|
|
4995
4994
|
<div class="qr-actions">
|
|
4996
4995
|
@if (props.showDownload) {
|
|
4997
|
-
<ion-button
|
|
4998
|
-
fill="clear"
|
|
4999
|
-
size="small"
|
|
5000
|
-
(click)="onDownload()"
|
|
5001
|
-
[title]="getDownloadLabel()"
|
|
5002
|
-
>
|
|
4996
|
+
<ion-button fill="clear" size="small" (click)="onDownload()" [title]="getDownloadLabel()">
|
|
5003
4997
|
<ion-icon name="download-outline" slot="icon-only"></ion-icon>
|
|
5004
4998
|
</ion-button>
|
|
5005
4999
|
}
|
|
5006
5000
|
|
|
5007
5001
|
@if (props.showCopy && canCopy) {
|
|
5008
|
-
<ion-button
|
|
5009
|
-
fill="clear"
|
|
5010
|
-
size="small"
|
|
5011
|
-
(click)="onCopy()"
|
|
5012
|
-
[title]="getCopyLabel()"
|
|
5013
|
-
>
|
|
5002
|
+
<ion-button fill="clear" size="small" (click)="onCopy()" [title]="getCopyLabel()">
|
|
5014
5003
|
<ion-icon name="copy-outline" slot="icon-only"></ion-icon>
|
|
5015
5004
|
</ion-button>
|
|
5016
5005
|
}
|
|
5017
5006
|
|
|
5018
5007
|
@if (props.showShare && canShare) {
|
|
5019
|
-
<ion-button
|
|
5020
|
-
fill="clear"
|
|
5021
|
-
size="small"
|
|
5022
|
-
(click)="onShare()"
|
|
5023
|
-
[title]="getShareLabel()"
|
|
5024
|
-
>
|
|
5008
|
+
<ion-button fill="clear" size="small" (click)="onShare()" [title]="getShareLabel()">
|
|
5025
5009
|
<ion-icon name="share-outline" slot="icon-only"></ion-icon>
|
|
5026
5010
|
</ion-button>
|
|
5027
5011
|
}
|
|
@@ -17387,7 +17371,7 @@ const DEFAULT_REFRESHER_METADATA = {
|
|
|
17387
17371
|
pullFactor: 0.5,
|
|
17388
17372
|
snapbackDuration: 280,
|
|
17389
17373
|
closeDuration: 280,
|
|
17390
|
-
spinnerType: '
|
|
17374
|
+
spinnerType: 'circular',
|
|
17391
17375
|
hapticFeedback: true,
|
|
17392
17376
|
webMode: false,
|
|
17393
17377
|
};
|
|
@@ -17568,7 +17552,7 @@ class RefresherComponent {
|
|
|
17568
17552
|
} @else {
|
|
17569
17553
|
<!-- Default Ionic refresher content -->
|
|
17570
17554
|
<ion-refresher-content
|
|
17571
|
-
|
|
17555
|
+
pullingIcon="chevron-down-circle-outline"
|
|
17572
17556
|
[pullingText]="mergedProps.pullingText"
|
|
17573
17557
|
[refreshingSpinner]="mergedProps.spinnerType"
|
|
17574
17558
|
[refreshingText]="mergedProps.refreshingText"
|
|
@@ -17626,7 +17610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
17626
17610
|
} @else {
|
|
17627
17611
|
<!-- Default Ionic refresher content -->
|
|
17628
17612
|
<ion-refresher-content
|
|
17629
|
-
|
|
17613
|
+
pullingIcon="chevron-down-circle-outline"
|
|
17630
17614
|
[pullingText]="mergedProps.pullingText"
|
|
17631
17615
|
[refreshingSpinner]="mergedProps.spinnerType"
|
|
17632
17616
|
[refreshingText]="mergedProps.refreshingText"
|
|
@@ -25854,7 +25838,7 @@ class UsernameInputComponent {
|
|
|
25854
25838
|
<span slot="end" class="availability-indicator">
|
|
25855
25839
|
@switch (availabilityStatus()) {
|
|
25856
25840
|
@case ('checking') {
|
|
25857
|
-
<ion-spinner name="
|
|
25841
|
+
<ion-spinner name="circular" class="checking-spinner" />
|
|
25858
25842
|
}
|
|
25859
25843
|
@case ('available') {
|
|
25860
25844
|
<ion-icon name="checkmark-circle" class="status-icon available" />
|
|
@@ -25915,7 +25899,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
25915
25899
|
<span slot="end" class="availability-indicator">
|
|
25916
25900
|
@switch (availabilityStatus()) {
|
|
25917
25901
|
@case ('checking') {
|
|
25918
|
-
<ion-spinner name="
|
|
25902
|
+
<ion-spinner name="circular" class="checking-spinner" />
|
|
25919
25903
|
}
|
|
25920
25904
|
@case ('available') {
|
|
25921
25905
|
<ion-icon name="checkmark-circle" class="status-icon available" />
|
|
@@ -29231,13 +29215,13 @@ class CommentSectionComponent {
|
|
|
29231
29215
|
}
|
|
29232
29216
|
getSkeletonArray() {
|
|
29233
29217
|
const count = this.props.skeletonCount || 3;
|
|
29234
|
-
return Array(count)
|
|
29218
|
+
return Array(count)
|
|
29219
|
+
.fill(0)
|
|
29220
|
+
.map((_, i) => i);
|
|
29235
29221
|
}
|
|
29236
29222
|
canSubmit() {
|
|
29237
29223
|
const minLength = this.props.inputConfig?.minLength || 1;
|
|
29238
|
-
return
|
|
29239
|
-
!this.props.loading &&
|
|
29240
|
-
!this.props.inputConfig?.disabled);
|
|
29224
|
+
return this.newCommentText.trim().length >= minLength && !this.props.loading && !this.props.inputConfig?.disabled;
|
|
29241
29225
|
}
|
|
29242
29226
|
isNearLimit() {
|
|
29243
29227
|
const maxLength = this.props.inputConfig?.maxLength || 2000;
|
|
@@ -29245,7 +29229,7 @@ class CommentSectionComponent {
|
|
|
29245
29229
|
}
|
|
29246
29230
|
onSortChange(event) {
|
|
29247
29231
|
const selectedToken = event.detail.value;
|
|
29248
|
-
const option = this.props.sortOptions?.find(
|
|
29232
|
+
const option = this.props.sortOptions?.find(o => o.token === selectedToken);
|
|
29249
29233
|
if (option) {
|
|
29250
29234
|
this.sortChange.emit({
|
|
29251
29235
|
option,
|
|
@@ -29414,14 +29398,9 @@ class CommentSectionComponent {
|
|
|
29414
29398
|
@if (props.hasMore && props.paginationMode !== 'infinite') {
|
|
29415
29399
|
<div class="load-more-section">
|
|
29416
29400
|
@if (props.loadingMore) {
|
|
29417
|
-
<ion-spinner name="
|
|
29401
|
+
<ion-spinner name="circular" [color]="props.color || 'primary'"></ion-spinner>
|
|
29418
29402
|
} @else {
|
|
29419
|
-
<ion-button
|
|
29420
|
-
fill="outline"
|
|
29421
|
-
[color]="props.color || 'primary'"
|
|
29422
|
-
expand="block"
|
|
29423
|
-
(click)="onLoadMore()"
|
|
29424
|
-
>
|
|
29403
|
+
<ion-button fill="outline" [color]="props.color || 'primary'" expand="block" (click)="onLoadMore()">
|
|
29425
29404
|
{{ displayLoadMoreLabel }}
|
|
29426
29405
|
</ion-button>
|
|
29427
29406
|
}
|
|
@@ -29444,10 +29423,7 @@ class CommentSectionComponent {
|
|
|
29444
29423
|
}
|
|
29445
29424
|
} @else {
|
|
29446
29425
|
<div class="empty-state">
|
|
29447
|
-
<ion-icon
|
|
29448
|
-
[name]="props.emptyState?.icon || 'chatbubble-ellipses-outline'"
|
|
29449
|
-
class="empty-icon"
|
|
29450
|
-
></ion-icon>
|
|
29426
|
+
<ion-icon [name]="props.emptyState?.icon || 'chatbubble-ellipses-outline'" class="empty-icon"></ion-icon>
|
|
29451
29427
|
<h4 class="empty-title">{{ getEmptyTitle() }}</h4>
|
|
29452
29428
|
<p class="empty-message">{{ getEmptyMessage() }}</p>
|
|
29453
29429
|
</div>
|
|
@@ -29584,14 +29560,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29584
29560
|
@if (props.hasMore && props.paginationMode !== 'infinite') {
|
|
29585
29561
|
<div class="load-more-section">
|
|
29586
29562
|
@if (props.loadingMore) {
|
|
29587
|
-
<ion-spinner name="
|
|
29563
|
+
<ion-spinner name="circular" [color]="props.color || 'primary'"></ion-spinner>
|
|
29588
29564
|
} @else {
|
|
29589
|
-
<ion-button
|
|
29590
|
-
fill="outline"
|
|
29591
|
-
[color]="props.color || 'primary'"
|
|
29592
|
-
expand="block"
|
|
29593
|
-
(click)="onLoadMore()"
|
|
29594
|
-
>
|
|
29565
|
+
<ion-button fill="outline" [color]="props.color || 'primary'" expand="block" (click)="onLoadMore()">
|
|
29595
29566
|
{{ displayLoadMoreLabel }}
|
|
29596
29567
|
</ion-button>
|
|
29597
29568
|
}
|
|
@@ -29614,10 +29585,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
29614
29585
|
}
|
|
29615
29586
|
} @else {
|
|
29616
29587
|
<div class="empty-state">
|
|
29617
|
-
<ion-icon
|
|
29618
|
-
[name]="props.emptyState?.icon || 'chatbubble-ellipses-outline'"
|
|
29619
|
-
class="empty-icon"
|
|
29620
|
-
></ion-icon>
|
|
29588
|
+
<ion-icon [name]="props.emptyState?.icon || 'chatbubble-ellipses-outline'" class="empty-icon"></ion-icon>
|
|
29621
29589
|
<h4 class="empty-title">{{ getEmptyTitle() }}</h4>
|
|
29622
29590
|
<p class="empty-message">{{ getEmptyMessage() }}</p>
|
|
29623
29591
|
</div>
|
|
@@ -30057,7 +30025,7 @@ class DataTableComponent {
|
|
|
30057
30025
|
<!-- Loading overlay -->
|
|
30058
30026
|
@if (props.loadingState?.loading) {
|
|
30059
30027
|
<div class="loading-overlay">
|
|
30060
|
-
<ion-spinner name="
|
|
30028
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
30061
30029
|
@if (props.loadingState?.message) {
|
|
30062
30030
|
<span class="loading-message">{{ props.loadingState.message }}</span>
|
|
30063
30031
|
}
|
|
@@ -30065,12 +30033,13 @@ class DataTableComponent {
|
|
|
30065
30033
|
}
|
|
30066
30034
|
|
|
30067
30035
|
<div class="table-wrapper" [class.is-loading]="props.loadingState?.loading">
|
|
30068
|
-
<table
|
|
30069
|
-
role="grid"
|
|
30070
|
-
[attr.aria-label]="props.ariaLabel"
|
|
30071
|
-
>
|
|
30036
|
+
<table role="grid" [attr.aria-label]="props.ariaLabel">
|
|
30072
30037
|
@if (props.caption) {
|
|
30073
|
-
<caption class="sr-only">
|
|
30038
|
+
<caption class="sr-only">
|
|
30039
|
+
{{
|
|
30040
|
+
props.caption
|
|
30041
|
+
}}
|
|
30042
|
+
</caption>
|
|
30074
30043
|
}
|
|
30075
30044
|
|
|
30076
30045
|
<thead>
|
|
@@ -30191,12 +30160,14 @@ class DataTableComponent {
|
|
|
30191
30160
|
|
|
30192
30161
|
<!-- Data cells -->
|
|
30193
30162
|
@for (column of visibleColumns; track column.key) {
|
|
30194
|
-
<td
|
|
30195
|
-
[class]="getColumnClass(column)"
|
|
30196
|
-
[style.text-align]="column.align"
|
|
30197
|
-
>
|
|
30163
|
+
<td [class]="getColumnClass(column)" [style.text-align]="column.align">
|
|
30198
30164
|
@if (column.cellTemplate) {
|
|
30199
|
-
<ng-container
|
|
30165
|
+
<ng-container
|
|
30166
|
+
*ngTemplateOutlet="
|
|
30167
|
+
column.cellTemplate;
|
|
30168
|
+
context: { row, column, value: getCellValue(row, column) }
|
|
30169
|
+
"
|
|
30170
|
+
></ng-container>
|
|
30200
30171
|
} @else {
|
|
30201
30172
|
{{ getFormattedValue(row, column) }}
|
|
30202
30173
|
}
|
|
@@ -30206,7 +30177,9 @@ class DataTableComponent {
|
|
|
30206
30177
|
<!-- Actions cell -->
|
|
30207
30178
|
@if (props.actionsTemplate) {
|
|
30208
30179
|
<td class="actions-cell">
|
|
30209
|
-
<ng-container
|
|
30180
|
+
<ng-container
|
|
30181
|
+
*ngTemplateOutlet="props.actionsTemplate; context: { row, index: i }"
|
|
30182
|
+
></ng-container>
|
|
30210
30183
|
</td>
|
|
30211
30184
|
}
|
|
30212
30185
|
</tr>
|
|
@@ -30234,7 +30207,9 @@ class DataTableComponent {
|
|
|
30234
30207
|
} @else {
|
|
30235
30208
|
@for (row of displayedData; track trackByFn(row); let i = $index) {
|
|
30236
30209
|
@if (props.mobileCardTemplate) {
|
|
30237
|
-
<ng-container
|
|
30210
|
+
<ng-container
|
|
30211
|
+
*ngTemplateOutlet="props.mobileCardTemplate; context: { row, index: i, columns: visibleColumns }"
|
|
30212
|
+
></ng-container>
|
|
30238
30213
|
} @else {
|
|
30239
30214
|
<div
|
|
30240
30215
|
class="data-card"
|
|
@@ -30273,7 +30248,12 @@ class DataTableComponent {
|
|
|
30273
30248
|
<span class="card-field__label">{{ column.label }}</span>
|
|
30274
30249
|
<span class="card-field__value">
|
|
30275
30250
|
@if (column.cellTemplate) {
|
|
30276
|
-
<ng-container
|
|
30251
|
+
<ng-container
|
|
30252
|
+
*ngTemplateOutlet="
|
|
30253
|
+
column.cellTemplate;
|
|
30254
|
+
context: { row, column, value: getCellValue(row, column) }
|
|
30255
|
+
"
|
|
30256
|
+
></ng-container>
|
|
30277
30257
|
} @else {
|
|
30278
30258
|
{{ getFormattedValue(row, column) }}
|
|
30279
30259
|
}
|
|
@@ -30285,7 +30265,9 @@ class DataTableComponent {
|
|
|
30285
30265
|
<!-- Card actions -->
|
|
30286
30266
|
@if (props.actionsTemplate) {
|
|
30287
30267
|
<div class="card-actions">
|
|
30288
|
-
<ng-container
|
|
30268
|
+
<ng-container
|
|
30269
|
+
*ngTemplateOutlet="props.actionsTemplate; context: { row, index: i }"
|
|
30270
|
+
></ng-container>
|
|
30289
30271
|
</div>
|
|
30290
30272
|
}
|
|
30291
30273
|
</div>
|
|
@@ -30339,9 +30321,7 @@ class DataTableComponent {
|
|
|
30339
30321
|
<ion-icon slot="icon-only" name="chevron-back-outline"></ion-icon>
|
|
30340
30322
|
</ion-button>
|
|
30341
30323
|
|
|
30342
|
-
<span class="page-indicator">
|
|
30343
|
-
{{ props.pagination.page + 1 }} / {{ totalPages }}
|
|
30344
|
-
</span>
|
|
30324
|
+
<span class="page-indicator"> {{ props.pagination.page + 1 }} / {{ totalPages }} </span>
|
|
30345
30325
|
|
|
30346
30326
|
<ion-button
|
|
30347
30327
|
fill="clear"
|
|
@@ -30371,16 +30351,7 @@ class DataTableComponent {
|
|
|
30371
30351
|
}
|
|
30372
30352
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
30373
30353
|
type: Component,
|
|
30374
|
-
args: [{ selector: 'val-data-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
30375
|
-
CommonModule,
|
|
30376
|
-
FormsModule,
|
|
30377
|
-
IonButton,
|
|
30378
|
-
IonIcon,
|
|
30379
|
-
IonCheckbox,
|
|
30380
|
-
IonSpinner,
|
|
30381
|
-
IonSelect,
|
|
30382
|
-
IonSelectOption,
|
|
30383
|
-
], template: `
|
|
30354
|
+
args: [{ selector: 'val-data-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, IonButton, IonIcon, IonCheckbox, IonSpinner, IonSelect, IonSelectOption], template: `
|
|
30384
30355
|
<div
|
|
30385
30356
|
class="data-table-container"
|
|
30386
30357
|
[class]="props.cssClass"
|
|
@@ -30409,7 +30380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30409
30380
|
<!-- Loading overlay -->
|
|
30410
30381
|
@if (props.loadingState?.loading) {
|
|
30411
30382
|
<div class="loading-overlay">
|
|
30412
|
-
<ion-spinner name="
|
|
30383
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
30413
30384
|
@if (props.loadingState?.message) {
|
|
30414
30385
|
<span class="loading-message">{{ props.loadingState.message }}</span>
|
|
30415
30386
|
}
|
|
@@ -30417,12 +30388,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30417
30388
|
}
|
|
30418
30389
|
|
|
30419
30390
|
<div class="table-wrapper" [class.is-loading]="props.loadingState?.loading">
|
|
30420
|
-
<table
|
|
30421
|
-
role="grid"
|
|
30422
|
-
[attr.aria-label]="props.ariaLabel"
|
|
30423
|
-
>
|
|
30391
|
+
<table role="grid" [attr.aria-label]="props.ariaLabel">
|
|
30424
30392
|
@if (props.caption) {
|
|
30425
|
-
<caption class="sr-only">
|
|
30393
|
+
<caption class="sr-only">
|
|
30394
|
+
{{
|
|
30395
|
+
props.caption
|
|
30396
|
+
}}
|
|
30397
|
+
</caption>
|
|
30426
30398
|
}
|
|
30427
30399
|
|
|
30428
30400
|
<thead>
|
|
@@ -30543,12 +30515,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30543
30515
|
|
|
30544
30516
|
<!-- Data cells -->
|
|
30545
30517
|
@for (column of visibleColumns; track column.key) {
|
|
30546
|
-
<td
|
|
30547
|
-
[class]="getColumnClass(column)"
|
|
30548
|
-
[style.text-align]="column.align"
|
|
30549
|
-
>
|
|
30518
|
+
<td [class]="getColumnClass(column)" [style.text-align]="column.align">
|
|
30550
30519
|
@if (column.cellTemplate) {
|
|
30551
|
-
<ng-container
|
|
30520
|
+
<ng-container
|
|
30521
|
+
*ngTemplateOutlet="
|
|
30522
|
+
column.cellTemplate;
|
|
30523
|
+
context: { row, column, value: getCellValue(row, column) }
|
|
30524
|
+
"
|
|
30525
|
+
></ng-container>
|
|
30552
30526
|
} @else {
|
|
30553
30527
|
{{ getFormattedValue(row, column) }}
|
|
30554
30528
|
}
|
|
@@ -30558,7 +30532,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30558
30532
|
<!-- Actions cell -->
|
|
30559
30533
|
@if (props.actionsTemplate) {
|
|
30560
30534
|
<td class="actions-cell">
|
|
30561
|
-
<ng-container
|
|
30535
|
+
<ng-container
|
|
30536
|
+
*ngTemplateOutlet="props.actionsTemplate; context: { row, index: i }"
|
|
30537
|
+
></ng-container>
|
|
30562
30538
|
</td>
|
|
30563
30539
|
}
|
|
30564
30540
|
</tr>
|
|
@@ -30586,7 +30562,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30586
30562
|
} @else {
|
|
30587
30563
|
@for (row of displayedData; track trackByFn(row); let i = $index) {
|
|
30588
30564
|
@if (props.mobileCardTemplate) {
|
|
30589
|
-
<ng-container
|
|
30565
|
+
<ng-container
|
|
30566
|
+
*ngTemplateOutlet="props.mobileCardTemplate; context: { row, index: i, columns: visibleColumns }"
|
|
30567
|
+
></ng-container>
|
|
30590
30568
|
} @else {
|
|
30591
30569
|
<div
|
|
30592
30570
|
class="data-card"
|
|
@@ -30625,7 +30603,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30625
30603
|
<span class="card-field__label">{{ column.label }}</span>
|
|
30626
30604
|
<span class="card-field__value">
|
|
30627
30605
|
@if (column.cellTemplate) {
|
|
30628
|
-
<ng-container
|
|
30606
|
+
<ng-container
|
|
30607
|
+
*ngTemplateOutlet="
|
|
30608
|
+
column.cellTemplate;
|
|
30609
|
+
context: { row, column, value: getCellValue(row, column) }
|
|
30610
|
+
"
|
|
30611
|
+
></ng-container>
|
|
30629
30612
|
} @else {
|
|
30630
30613
|
{{ getFormattedValue(row, column) }}
|
|
30631
30614
|
}
|
|
@@ -30637,7 +30620,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30637
30620
|
<!-- Card actions -->
|
|
30638
30621
|
@if (props.actionsTemplate) {
|
|
30639
30622
|
<div class="card-actions">
|
|
30640
|
-
<ng-container
|
|
30623
|
+
<ng-container
|
|
30624
|
+
*ngTemplateOutlet="props.actionsTemplate; context: { row, index: i }"
|
|
30625
|
+
></ng-container>
|
|
30641
30626
|
</div>
|
|
30642
30627
|
}
|
|
30643
30628
|
</div>
|
|
@@ -30691,9 +30676,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
30691
30676
|
<ion-icon slot="icon-only" name="chevron-back-outline"></ion-icon>
|
|
30692
30677
|
</ion-button>
|
|
30693
30678
|
|
|
30694
|
-
<span class="page-indicator">
|
|
30695
|
-
{{ props.pagination.page + 1 }} / {{ totalPages }}
|
|
30696
|
-
</span>
|
|
30679
|
+
<span class="page-indicator"> {{ props.pagination.page + 1 }} / {{ totalPages }} </span>
|
|
30697
30680
|
|
|
30698
30681
|
<ion-button
|
|
30699
30682
|
fill="clear"
|
|
@@ -31558,7 +31541,7 @@ const DEFAULT_INFINITE_LIST_METADATA = {
|
|
|
31558
31541
|
threshold: '100px',
|
|
31559
31542
|
debounceTime: 300,
|
|
31560
31543
|
autoLoad: true,
|
|
31561
|
-
spinnerType: '
|
|
31544
|
+
spinnerType: 'circular',
|
|
31562
31545
|
useLoadMoreButton: false,
|
|
31563
31546
|
showDividers: false,
|
|
31564
31547
|
enableRefresh: false,
|
|
@@ -35437,7 +35420,7 @@ class AvatarUploadComponent {
|
|
|
35437
35420
|
<!-- Loading Overlay -->
|
|
35438
35421
|
@if (loading()) {
|
|
35439
35422
|
<div class="loading-overlay">
|
|
35440
|
-
<ion-spinner name="
|
|
35423
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
35441
35424
|
</div>
|
|
35442
35425
|
}
|
|
35443
35426
|
</div>
|
|
@@ -35493,7 +35476,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
35493
35476
|
<!-- Loading Overlay -->
|
|
35494
35477
|
@if (loading()) {
|
|
35495
35478
|
<div class="loading-overlay">
|
|
35496
|
-
<ion-spinner name="
|
|
35479
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
35497
35480
|
</div>
|
|
35498
35481
|
}
|
|
35499
35482
|
</div>
|
|
@@ -37183,7 +37166,10 @@ class PageWrapperComponent {
|
|
|
37183
37166
|
ion-content — por eso va aquí crudo, no envuelto en val-refresher. -->
|
|
37184
37167
|
@if (pageRefresh.hasHandler()) {
|
|
37185
37168
|
<ion-refresher slot="fixed" (ionRefresh)="onPageRefresh($event)">
|
|
37186
|
-
<ion-refresher-content
|
|
37169
|
+
<ion-refresher-content
|
|
37170
|
+
pullingIcon="chevron-down-circle-outline"
|
|
37171
|
+
refreshingSpinner="circular"
|
|
37172
|
+
></ion-refresher-content>
|
|
37187
37173
|
</ion-refresher>
|
|
37188
37174
|
}
|
|
37189
37175
|
<val-container [props]="{ size: contentMaxWidth() }">
|
|
@@ -37225,7 +37211,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
37225
37211
|
ion-content — por eso va aquí crudo, no envuelto en val-refresher. -->
|
|
37226
37212
|
@if (pageRefresh.hasHandler()) {
|
|
37227
37213
|
<ion-refresher slot="fixed" (ionRefresh)="onPageRefresh($event)">
|
|
37228
|
-
<ion-refresher-content
|
|
37214
|
+
<ion-refresher-content
|
|
37215
|
+
pullingIcon="chevron-down-circle-outline"
|
|
37216
|
+
refreshingSpinner="circular"
|
|
37217
|
+
></ion-refresher-content>
|
|
37229
37218
|
</ion-refresher>
|
|
37230
37219
|
}
|
|
37231
37220
|
<val-container [props]="{ size: contentMaxWidth() }">
|
|
@@ -37712,7 +37701,7 @@ class SimpleModalContentComponent {
|
|
|
37712
37701
|
(click)="onButtonClick(button)"
|
|
37713
37702
|
>
|
|
37714
37703
|
@if (button.loading) {
|
|
37715
|
-
<ion-spinner name="
|
|
37704
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
37716
37705
|
} @else {
|
|
37717
37706
|
{{ button.text }}
|
|
37718
37707
|
}
|
|
@@ -37726,7 +37715,18 @@ class SimpleModalContentComponent {
|
|
|
37726
37715
|
}
|
|
37727
37716
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleModalContentComponent, decorators: [{
|
|
37728
37717
|
type: Component,
|
|
37729
|
-
args: [{ selector: 'val-simple-modal-content', standalone: true, imports: [
|
|
37718
|
+
args: [{ selector: 'val-simple-modal-content', standalone: true, imports: [
|
|
37719
|
+
CommonModule,
|
|
37720
|
+
IonHeader,
|
|
37721
|
+
IonToolbar,
|
|
37722
|
+
IonTitle,
|
|
37723
|
+
IonButtons,
|
|
37724
|
+
IonButton,
|
|
37725
|
+
IonIcon,
|
|
37726
|
+
IonContent,
|
|
37727
|
+
IonFooter,
|
|
37728
|
+
IonSpinner,
|
|
37729
|
+
], template: `
|
|
37730
37730
|
<ion-header>
|
|
37731
37731
|
<ion-toolbar>
|
|
37732
37732
|
<ion-title>{{ title }}</ion-title>
|
|
@@ -37758,7 +37758,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
37758
37758
|
(click)="onButtonClick(button)"
|
|
37759
37759
|
>
|
|
37760
37760
|
@if (button.loading) {
|
|
37761
|
-
<ion-spinner name="
|
|
37761
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
37762
37762
|
} @else {
|
|
37763
37763
|
{{ button.text }}
|
|
37764
37764
|
}
|
|
@@ -38854,7 +38854,7 @@ class LoadingDirective {
|
|
|
38854
38854
|
const element = document.createElement('div');
|
|
38855
38855
|
element.className = 'val-loading-spinner';
|
|
38856
38856
|
element.innerHTML = `
|
|
38857
|
-
<ion-spinner name="
|
|
38857
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
38858
38858
|
`;
|
|
38859
38859
|
element.style.cssText = 'display: flex; justify-content: center; padding: 20px;';
|
|
38860
38860
|
const hostElement = this.viewContainer.element.nativeElement;
|
|
@@ -38864,8 +38864,7 @@ class LoadingDirective {
|
|
|
38864
38864
|
// Fallback simple si no hay template registrado
|
|
38865
38865
|
const element = document.createElement('div');
|
|
38866
38866
|
element.className = 'val-loading-fallback';
|
|
38867
|
-
element.style.cssText =
|
|
38868
|
-
'display: flex; flex-direction: column; gap: 12px; padding: 16px;';
|
|
38867
|
+
element.style.cssText = 'display: flex; flex-direction: column; gap: 12px; padding: 16px;';
|
|
38869
38868
|
for (let i = 0; i < this.count; i++) {
|
|
38870
38869
|
const skeleton = document.createElement('div');
|
|
38871
38870
|
skeleton.style.cssText = `
|
|
@@ -42638,7 +42637,7 @@ class FeedbackFormComponent {
|
|
|
42638
42637
|
ngOnInit() {
|
|
42639
42638
|
// Filtrar tipos habilitados si se especifica
|
|
42640
42639
|
if (this.props.enabledTypes?.length) {
|
|
42641
|
-
this.typeOptions = this.typeOptions.filter(
|
|
42640
|
+
this.typeOptions = this.typeOptions.filter(opt => this.props.enabledTypes.includes(opt.value));
|
|
42642
42641
|
}
|
|
42643
42642
|
// Usar opciones personalizadas si se proporcionan
|
|
42644
42643
|
if (this.props.typeOptions?.length) {
|
|
@@ -42647,14 +42646,8 @@ class FeedbackFormComponent {
|
|
|
42647
42646
|
// Inicializar formulario
|
|
42648
42647
|
this.form = this.fb.group({
|
|
42649
42648
|
type: [this.props.defaultType || 'feedback', Validators.required],
|
|
42650
|
-
title: [
|
|
42651
|
-
|
|
42652
|
-
[Validators.required, Validators.minLength(5), Validators.maxLength(200)],
|
|
42653
|
-
],
|
|
42654
|
-
description: [
|
|
42655
|
-
'',
|
|
42656
|
-
[Validators.required, Validators.minLength(10), Validators.maxLength(5000)],
|
|
42657
|
-
],
|
|
42649
|
+
title: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(200)]],
|
|
42650
|
+
description: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(5000)]],
|
|
42658
42651
|
});
|
|
42659
42652
|
}
|
|
42660
42653
|
async handleSubmit() {
|
|
@@ -42769,22 +42762,13 @@ class FeedbackFormComponent {
|
|
|
42769
42762
|
<!-- Actions -->
|
|
42770
42763
|
<div class="form-actions">
|
|
42771
42764
|
@if (props.cancelButtonText) {
|
|
42772
|
-
<ion-button
|
|
42773
|
-
fill="outline"
|
|
42774
|
-
color="medium"
|
|
42775
|
-
type="button"
|
|
42776
|
-
(click)="onCancelClick()"
|
|
42777
|
-
>
|
|
42765
|
+
<ion-button fill="outline" color="medium" type="button" (click)="onCancelClick()">
|
|
42778
42766
|
{{ props.cancelButtonText }}
|
|
42779
42767
|
</ion-button>
|
|
42780
42768
|
}
|
|
42781
|
-
<ion-button
|
|
42782
|
-
type="submit"
|
|
42783
|
-
[disabled]="form.invalid || isSubmitting()"
|
|
42784
|
-
expand="block"
|
|
42785
|
-
>
|
|
42769
|
+
<ion-button type="submit" [disabled]="form.invalid || isSubmitting()" expand="block">
|
|
42786
42770
|
@if (isSubmitting()) {
|
|
42787
|
-
<ion-spinner name="
|
|
42771
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
42788
42772
|
} @else {
|
|
42789
42773
|
{{ props.submitButtonText || i18n.t('submit') }}
|
|
42790
42774
|
}
|
|
@@ -42892,22 +42876,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
42892
42876
|
<!-- Actions -->
|
|
42893
42877
|
<div class="form-actions">
|
|
42894
42878
|
@if (props.cancelButtonText) {
|
|
42895
|
-
<ion-button
|
|
42896
|
-
fill="outline"
|
|
42897
|
-
color="medium"
|
|
42898
|
-
type="button"
|
|
42899
|
-
(click)="onCancelClick()"
|
|
42900
|
-
>
|
|
42879
|
+
<ion-button fill="outline" color="medium" type="button" (click)="onCancelClick()">
|
|
42901
42880
|
{{ props.cancelButtonText }}
|
|
42902
42881
|
</ion-button>
|
|
42903
42882
|
}
|
|
42904
|
-
<ion-button
|
|
42905
|
-
type="submit"
|
|
42906
|
-
[disabled]="form.invalid || isSubmitting()"
|
|
42907
|
-
expand="block"
|
|
42908
|
-
>
|
|
42883
|
+
<ion-button type="submit" [disabled]="form.invalid || isSubmitting()" expand="block">
|
|
42909
42884
|
@if (isSubmitting()) {
|
|
42910
|
-
<ion-spinner name="
|
|
42885
|
+
<ion-spinner name="circular"></ion-spinner>
|
|
42911
42886
|
} @else {
|
|
42912
42887
|
{{ props.submitButtonText || i18n.t('submit') }}
|
|
42913
42888
|
}
|