valtech-components 2.0.1030 → 2.0.1032
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/organisms/member-import-modal/member-import-modal.component.mjs +88 -26
- package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.i18n.mjs +9 -1
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +94 -26
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/member-import-modal/member-import-modal.component.d.ts +4 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
|
@@ -25,7 +25,7 @@ import { getApps, getApp, initializeApp as initializeApp$1 } from 'firebase/app'
|
|
|
25
25
|
import * as i2$1 from '@ionic/angular/standalone';
|
|
26
26
|
import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonTextarea, IonDatetime, IonInput, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonRadioGroup, IonRadio, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonChip, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonFooter, IonListHeader, IonInfiniteScroll, IonInfiniteScrollContent, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
|
|
27
27
|
import { addIcons } from 'ionicons';
|
|
28
|
-
import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline } from 'ionicons/icons';
|
|
28
|
+
import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, cloudUploadOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline } from 'ionicons/icons';
|
|
29
29
|
import { Browser } from '@capacitor/browser';
|
|
30
30
|
import * as i1$6 from '@angular/platform-browser';
|
|
31
31
|
import { DomSanitizer, Meta, Title } from '@angular/platform-browser';
|
|
@@ -55,7 +55,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
|
55
55
|
* Current version of valtech-components.
|
|
56
56
|
* This is automatically updated during the publish process.
|
|
57
57
|
*/
|
|
58
|
-
const VERSION = '2.0.
|
|
58
|
+
const VERSION = '2.0.1032';
|
|
59
59
|
|
|
60
60
|
// Control de estado de refresco (singleton a nivel de módulo)
|
|
61
61
|
let isRefreshing = false;
|
|
@@ -49233,6 +49233,10 @@ const MEMBER_IMPORT_MODAL_I18N = {
|
|
|
49233
49233
|
title: 'Importar miembros',
|
|
49234
49234
|
hint: 'Pega un CSV con columnas: email, nombre, rol (una fila por persona).',
|
|
49235
49235
|
csvPlaceholder: 'email,nombre,rol\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
|
|
49236
|
+
uploadFile: 'Subir archivo CSV',
|
|
49237
|
+
orPaste: 'o pega el CSV abajo',
|
|
49238
|
+
fileLoaded: 'Archivo cargado: {name}',
|
|
49239
|
+
fileReadError: 'No se pudo leer el archivo.',
|
|
49236
49240
|
rolesAvailable: 'Roles disponibles:',
|
|
49237
49241
|
onConflictLabel: 'Si el email ya existe',
|
|
49238
49242
|
conflictAssign: 'Asignar el rol',
|
|
@@ -49261,6 +49265,10 @@ const MEMBER_IMPORT_MODAL_I18N = {
|
|
|
49261
49265
|
title: 'Import members',
|
|
49262
49266
|
hint: 'Paste a CSV with columns: email, name, role (one row per person).',
|
|
49263
49267
|
csvPlaceholder: 'email,name,role\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
|
|
49268
|
+
uploadFile: 'Upload CSV file',
|
|
49269
|
+
orPaste: 'or paste the CSV below',
|
|
49270
|
+
fileLoaded: 'File loaded: {name}',
|
|
49271
|
+
fileReadError: "Couldn't read the file.",
|
|
49264
49272
|
rolesAvailable: 'Available roles:',
|
|
49265
49273
|
onConflictLabel: 'If the email already exists',
|
|
49266
49274
|
conflictAssign: 'Assign the role',
|
|
@@ -49288,6 +49296,7 @@ const MEMBER_IMPORT_MODAL_I18N = {
|
|
|
49288
49296
|
};
|
|
49289
49297
|
|
|
49290
49298
|
const DEFAULT_NAMESPACE$8 = 'Settings.ImportModal';
|
|
49299
|
+
addIcons({ cloudUploadOutline });
|
|
49291
49300
|
/**
|
|
49292
49301
|
* `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
|
|
49293
49302
|
*
|
|
@@ -49313,6 +49322,8 @@ class MemberImportModalComponent {
|
|
|
49313
49322
|
this.submitting = signal(false);
|
|
49314
49323
|
this.errorMsg = signal('');
|
|
49315
49324
|
this.results = signal(null);
|
|
49325
|
+
/** Nombre del archivo CSV cargado (vacío si se pegó manualmente). */
|
|
49326
|
+
this.fileName = signal('');
|
|
49316
49327
|
this.rolesHint = computed(() => this.availableRoles.length ? `${this.t('rolesAvailable')} ${this.availableRoles.join(', ')}` : '');
|
|
49317
49328
|
this.summaryLabel = computed(() => {
|
|
49318
49329
|
const s = this.results()?.summary;
|
|
@@ -49329,6 +49340,23 @@ class MemberImportModalComponent {
|
|
|
49329
49340
|
this.i18n.registerContent(this.i18nNamespace, MEMBER_IMPORT_MODAL_I18N);
|
|
49330
49341
|
}
|
|
49331
49342
|
}
|
|
49343
|
+
/** Carga un archivo CSV seleccionado: lee su texto al textarea (`csv`). */
|
|
49344
|
+
onFileSelected(event) {
|
|
49345
|
+
const input = event.target;
|
|
49346
|
+
const file = input.files?.[0];
|
|
49347
|
+
if (!file)
|
|
49348
|
+
return;
|
|
49349
|
+
this.errorMsg.set('');
|
|
49350
|
+
const reader = new FileReader();
|
|
49351
|
+
reader.onload = () => {
|
|
49352
|
+
this.csv = String(reader.result ?? '');
|
|
49353
|
+
this.fileName.set(file.name);
|
|
49354
|
+
};
|
|
49355
|
+
reader.onerror = () => this.errorMsg.set(this.t('fileReadError'));
|
|
49356
|
+
reader.readAsText(file);
|
|
49357
|
+
// Permite re-seleccionar el mismo archivo (el change no dispara si no se limpia).
|
|
49358
|
+
input.value = '';
|
|
49359
|
+
}
|
|
49332
49360
|
/** Parsea el CSV pegado a filas {email,name,roleName}. Tolera header. */
|
|
49333
49361
|
parseCsv() {
|
|
49334
49362
|
const rows = [];
|
|
@@ -49387,6 +49415,7 @@ class MemberImportModalComponent {
|
|
|
49387
49415
|
}
|
|
49388
49416
|
reset() {
|
|
49389
49417
|
this.csv = '';
|
|
49418
|
+
this.fileName.set('');
|
|
49390
49419
|
this.errorMsg.set('');
|
|
49391
49420
|
this.results.set(null);
|
|
49392
49421
|
}
|
|
@@ -49418,6 +49447,23 @@ class MemberImportModalComponent {
|
|
|
49418
49447
|
<val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
|
|
49419
49448
|
}
|
|
49420
49449
|
|
|
49450
|
+
<!-- Subida de archivo: label nativo envuelve el input (label trick, igual
|
|
49451
|
+
que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
|
|
49452
|
+
<div class="import-upload">
|
|
49453
|
+
<label class="import-upload__btn">
|
|
49454
|
+
<ion-icon name="cloud-upload-outline" />
|
|
49455
|
+
<span>{{ t('uploadFile') }}</span>
|
|
49456
|
+
<input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
|
|
49457
|
+
</label>
|
|
49458
|
+
<span class="import-upload__hint">{{ t('orPaste') }}</span>
|
|
49459
|
+
</div>
|
|
49460
|
+
|
|
49461
|
+
@if (fileName()) {
|
|
49462
|
+
<p class="import-file-loaded">
|
|
49463
|
+
{{ t('fileLoaded').replace('{name}', fileName()) }}
|
|
49464
|
+
</p>
|
|
49465
|
+
}
|
|
49466
|
+
|
|
49421
49467
|
<ion-textarea
|
|
49422
49468
|
class="import-csv"
|
|
49423
49469
|
[autoGrow]="true"
|
|
@@ -49426,17 +49472,19 @@ class MemberImportModalComponent {
|
|
|
49426
49472
|
[(ngModel)]="csv"
|
|
49427
49473
|
/>
|
|
49428
49474
|
|
|
49429
|
-
<
|
|
49430
|
-
|
|
49431
|
-
|
|
49432
|
-
|
|
49433
|
-
|
|
49434
|
-
|
|
49435
|
-
|
|
49436
|
-
|
|
49437
|
-
|
|
49438
|
-
|
|
49439
|
-
|
|
49475
|
+
<div class="import-conflict-box">
|
|
49476
|
+
<ion-select
|
|
49477
|
+
class="import-conflict"
|
|
49478
|
+
label="{{ t('onConflictLabel') }}"
|
|
49479
|
+
labelPlacement="stacked"
|
|
49480
|
+
interface="popover"
|
|
49481
|
+
[(ngModel)]="onConflict"
|
|
49482
|
+
>
|
|
49483
|
+
<ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
|
|
49484
|
+
<ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
|
|
49485
|
+
<ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
|
|
49486
|
+
</ion-select>
|
|
49487
|
+
</div>
|
|
49440
49488
|
|
|
49441
49489
|
<ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
|
|
49442
49490
|
{{ t('sendActivation') }}
|
|
@@ -49477,7 +49525,7 @@ class MemberImportModalComponent {
|
|
|
49477
49525
|
</div>
|
|
49478
49526
|
}
|
|
49479
49527
|
</ion-content>
|
|
49480
|
-
`, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size
|
|
49528
|
+
`, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:12px}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-upload__hint{font-size:.8125rem;color:var(--ion-color-medium)}.import-file-loaded{margin:0 0 12px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:.8125rem}.import-conflict-box{border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);padding:4px 12px;margin-bottom:16px}.import-conflict{--background: transparent;width:100%}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
|
|
49481
49529
|
}
|
|
49482
49530
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, decorators: [{
|
|
49483
49531
|
type: Component,
|
|
@@ -49493,6 +49541,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49493
49541
|
IonSelectOption,
|
|
49494
49542
|
IonCheckbox,
|
|
49495
49543
|
IonSpinner,
|
|
49544
|
+
IonIcon,
|
|
49496
49545
|
DisplayComponent,
|
|
49497
49546
|
TextComponent,
|
|
49498
49547
|
TitleComponent,
|
|
@@ -49517,6 +49566,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49517
49566
|
<val-text [props]="{ content: rolesHint(), size: 'small', color: 'medium', bold: false }" />
|
|
49518
49567
|
}
|
|
49519
49568
|
|
|
49569
|
+
<!-- Subida de archivo: label nativo envuelve el input (label trick, igual
|
|
49570
|
+
que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
|
|
49571
|
+
<div class="import-upload">
|
|
49572
|
+
<label class="import-upload__btn">
|
|
49573
|
+
<ion-icon name="cloud-upload-outline" />
|
|
49574
|
+
<span>{{ t('uploadFile') }}</span>
|
|
49575
|
+
<input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
|
|
49576
|
+
</label>
|
|
49577
|
+
<span class="import-upload__hint">{{ t('orPaste') }}</span>
|
|
49578
|
+
</div>
|
|
49579
|
+
|
|
49580
|
+
@if (fileName()) {
|
|
49581
|
+
<p class="import-file-loaded">
|
|
49582
|
+
{{ t('fileLoaded').replace('{name}', fileName()) }}
|
|
49583
|
+
</p>
|
|
49584
|
+
}
|
|
49585
|
+
|
|
49520
49586
|
<ion-textarea
|
|
49521
49587
|
class="import-csv"
|
|
49522
49588
|
[autoGrow]="true"
|
|
@@ -49525,17 +49591,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49525
49591
|
[(ngModel)]="csv"
|
|
49526
49592
|
/>
|
|
49527
49593
|
|
|
49528
|
-
<
|
|
49529
|
-
|
|
49530
|
-
|
|
49531
|
-
|
|
49532
|
-
|
|
49533
|
-
|
|
49534
|
-
|
|
49535
|
-
|
|
49536
|
-
|
|
49537
|
-
|
|
49538
|
-
|
|
49594
|
+
<div class="import-conflict-box">
|
|
49595
|
+
<ion-select
|
|
49596
|
+
class="import-conflict"
|
|
49597
|
+
label="{{ t('onConflictLabel') }}"
|
|
49598
|
+
labelPlacement="stacked"
|
|
49599
|
+
interface="popover"
|
|
49600
|
+
[(ngModel)]="onConflict"
|
|
49601
|
+
>
|
|
49602
|
+
<ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
|
|
49603
|
+
<ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
|
|
49604
|
+
<ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
|
|
49605
|
+
</ion-select>
|
|
49606
|
+
</div>
|
|
49539
49607
|
|
|
49540
49608
|
<ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
|
|
49541
49609
|
{{ t('sendActivation') }}
|
|
@@ -49576,7 +49644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
49576
49644
|
</div>
|
|
49577
49645
|
}
|
|
49578
49646
|
</ion-content>
|
|
49579
|
-
`, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size
|
|
49647
|
+
`, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:12px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:12px}.import-upload__btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);color:var(--ion-color-dark);font-size:.875rem;font-weight:600;cursor:pointer;transition:border-color .15s ease}.import-upload__btn:hover{border-color:var(--ion-color-primary, #7026df)}.import-upload__btn ion-icon{font-size:1.25rem}.import-upload__btn input[type=file]{display:none}.import-upload__hint{font-size:.8125rem;color:var(--ion-color-medium)}.import-file-loaded{margin:0 0 12px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:16px;font-family:monospace;font-size:.8125rem}.import-conflict-box{border:1px solid var(--ion-color-medium, #92949c);border-radius:10px;background:var(--ion-color-light);padding:4px 12px;margin-bottom:16px}.import-conflict{--background: transparent;width:100%}.import-activation{display:block;margin-bottom:16px;font-size:14px}.import-error{margin:0 0 12px;font-size:.875rem;color:var(--ion-color-danger, #c0392b)}.import-actions{margin-top:8px}.import-results{display:flex;flex-direction:column;gap:6px;margin:12px 0}.import-row{display:grid;grid-template-columns:1fr auto;grid-row-gap:2px;align-items:center;padding:10px 12px;border-radius:8px;border-left:3px solid var(--ion-color-medium);background:var(--ion-color-light);font-size:14px}.import-row--created{border-left-color:var(--ion-color-success, #2dd36f)}.import-row--assigned{border-left-color:var(--ion-color-primary, #7026df)}.import-row--skipped{border-left-color:var(--ion-color-medium, #92949c)}.import-row--error{border-left-color:var(--ion-color-danger, #c0392b)}.import-row__email{font-weight:600;color:var(--ion-color-dark)}.import-row__status{text-align:right;color:var(--ion-color-medium-shade, #6b6e76)}.import-row__reason{grid-column:1 / -1;font-size:12px;color:var(--ion-color-danger, #c0392b)}\n"] }]
|
|
49580
49648
|
}], ctorParameters: () => [], propDecorators: { orgId: [{
|
|
49581
49649
|
type: Input
|
|
49582
49650
|
}], availableRoles: [{
|