valtech-components 4.0.12 → 4.0.14

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.
@@ -5,14 +5,18 @@
5
5
  export const MEMBER_IMPORT_MODAL_I18N = {
6
6
  es: {
7
7
  title: 'Importar miembros',
8
- hint: 'Pega un CSV con columnas: email, nombre, rol (una fila por persona).',
8
+ subtitle: 'Carga un archivo CSV o pega el contenido directamente. Cada fila debe tener email, nombre y rol. Los cambios se aplican al instante.',
9
9
  csvPlaceholder: 'email,nombre,rol\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
10
+ importMethodLabel: '¿Cómo deseas importar?',
11
+ importMethodFile: 'Por archivo',
12
+ importMethodFileHint: 'Sube un archivo .csv desde tu equipo',
13
+ importMethodPaste: 'Pegar contenido',
14
+ importMethodPasteHint: 'Escribe o pega el CSV directamente',
10
15
  uploadFile: 'Subir archivo CSV',
11
- orPaste: 'o pega el CSV abajo',
12
16
  fileLoaded: 'Archivo cargado: {name}',
13
17
  fileReadError: 'No se pudo leer el archivo.',
14
18
  rolesAvailable: 'Roles disponibles:',
15
- onConflictLabel: 'Si el email ya existe',
19
+ onConflictLabel: '¿Qué hacer si el email ya existe?',
16
20
  conflictAssign: 'Asignar el rol',
17
21
  conflictSkip: 'Omitir',
18
22
  conflictError: 'Marcar error',
@@ -20,7 +24,7 @@ export const MEMBER_IMPORT_MODAL_I18N = {
20
24
  submit: 'Importar',
21
25
  submitting: 'Importando...',
22
26
  parseError: 'No se pudo interpretar el CSV. Revisa el formato.',
23
- noRows: 'Pega al menos una fila válida (email y rol).',
27
+ noRows: 'Agrega al menos una fila válida (email y rol).',
24
28
  summary: 'Resumen',
25
29
  created: 'creados',
26
30
  assigned: 'asignados',
@@ -37,14 +41,18 @@ export const MEMBER_IMPORT_MODAL_I18N = {
37
41
  },
38
42
  en: {
39
43
  title: 'Import members',
40
- hint: 'Paste a CSV with columns: email, name, role (one row per person).',
44
+ subtitle: 'Upload a CSV file or paste the content directly. Each row must include email, name and role. Changes are applied immediately.',
41
45
  csvPlaceholder: 'email,name,role\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
46
+ importMethodLabel: 'How do you want to import?',
47
+ importMethodFile: 'From file',
48
+ importMethodFileHint: 'Upload a .csv file from your device',
49
+ importMethodPaste: 'Paste content',
50
+ importMethodPasteHint: 'Type or paste the CSV directly',
42
51
  uploadFile: 'Upload CSV file',
43
- orPaste: 'or paste the CSV below',
44
52
  fileLoaded: 'File loaded: {name}',
45
53
  fileReadError: "Couldn't read the file.",
46
54
  rolesAvailable: 'Available roles:',
47
- onConflictLabel: 'If the email already exists',
55
+ onConflictLabel: 'What to do if the email already exists?',
48
56
  conflictAssign: 'Assign the role',
49
57
  conflictSkip: 'Skip',
50
58
  conflictError: 'Mark as error',
@@ -52,7 +60,7 @@ export const MEMBER_IMPORT_MODAL_I18N = {
52
60
  submit: 'Import',
53
61
  submitting: 'Importing...',
54
62
  parseError: "Couldn't parse the CSV. Check the format.",
55
- noRows: 'Paste at least one valid row (email and role).',
63
+ noRows: 'Add at least one valid row (email and role).',
56
64
  summary: 'Summary',
57
65
  created: 'created',
58
66
  assigned: 'assigned',
@@ -68,4 +76,4 @@ export const MEMBER_IMPORT_MODAL_I18N = {
68
76
  genericError: "Couldn't complete the import. Try again.",
69
77
  },
70
78
  };
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWltcG9ydC1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9tZW1iZXItaW1wb3J0LW1vZGFsL21lbWJlci1pbXBvcnQtbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBcUI7SUFDeEQsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixJQUFJLEVBQUUsc0VBQXNFO1FBQzVFLGNBQWMsRUFBRSxnRUFBZ0U7UUFDaEYsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixPQUFPLEVBQUUscUJBQXFCO1FBQzlCLFVBQVUsRUFBRSx5QkFBeUI7UUFDckMsYUFBYSxFQUFFLDZCQUE2QjtRQUM1QyxjQUFjLEVBQUUsb0JBQW9CO1FBQ3BDLGVBQWUsRUFBRSx1QkFBdUI7UUFDeEMsY0FBYyxFQUFFLGdCQUFnQjtRQUNoQyxZQUFZLEVBQUUsUUFBUTtRQUN0QixhQUFhLEVBQUUsY0FBYztRQUM3QixjQUFjLEVBQUUsaURBQWlEO1FBQ2pFLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLFVBQVUsRUFBRSxlQUFlO1FBQzNCLFVBQVUsRUFBRSxtREFBbUQ7UUFDL0QsTUFBTSxFQUFFLDhDQUE4QztRQUN0RCxPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsU0FBUztRQUNsQixRQUFRLEVBQUUsV0FBVztRQUNyQixPQUFPLEVBQUUsVUFBVTtRQUNuQixNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsT0FBTztRQUNqQixTQUFTLEVBQUUsUUFBUTtRQUNuQixTQUFTLEVBQUUsU0FBUztRQUNwQixjQUFjLEVBQUUsb0JBQW9CO1FBQ3BDLGlCQUFpQixFQUFFLHNCQUFzQjtRQUN6QyxLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLEtBQUssRUFBRSxRQUFRO1FBQ2YsWUFBWSxFQUFFLHdEQUF3RDtLQUN2RTtJQUNELEVBQUUsRUFBRTtRQUNGLEtBQUssRUFBRSxnQkFBZ0I7UUFDdkIsSUFBSSxFQUFFLG1FQUFtRTtRQUN6RSxjQUFjLEVBQUUsK0RBQStEO1FBQy9FLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsT0FBTyxFQUFFLHdCQUF3QjtRQUNqQyxVQUFVLEVBQUUscUJBQXFCO1FBQ2pDLGFBQWEsRUFBRSx5QkFBeUI7UUFDeEMsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxlQUFlLEVBQUUsNkJBQTZCO1FBQzlDLGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsWUFBWSxFQUFFLE1BQU07UUFDcEIsYUFBYSxFQUFFLGVBQWU7UUFDOUIsY0FBYyxFQUFFLHVDQUF1QztRQUN2RCxNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUUsY0FBYztRQUMxQixVQUFVLEVBQUUsMkNBQTJDO1FBQ3ZELE1BQU0sRUFBRSxnREFBZ0Q7UUFDeEQsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsUUFBUSxFQUFFLE9BQU87UUFDakIsU0FBUyxFQUFFLFFBQVE7UUFDbkIsU0FBUyxFQUFFLFFBQVE7UUFDbkIsY0FBYyxFQUFFLGlCQUFpQjtRQUNqQyxpQkFBaUIsRUFBRSxvQkFBb0I7UUFDdkMsS0FBSyxFQUFFLHNCQUFzQjtRQUM3QixLQUFLLEVBQUUsT0FBTztRQUNkLFlBQVksRUFBRSwwQ0FBMEM7S0FDekQ7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1tZW1iZXItaW1wb3J0LW1vZGFsYCAoQURSLTAyMykuXG4gKiBBdXRvLXJlZ2lzdHJhZG9zIHNpIGVsIGNvbnN1bWVyIG5vIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgU2V0dGluZ3MuSW1wb3J0TW9kYWxgLlxuICovXG5leHBvcnQgY29uc3QgTUVNQkVSX0lNUE9SVF9NT0RBTF9JMThOOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIHRpdGxlOiAnSW1wb3J0YXIgbWllbWJyb3MnLFxuICAgIGhpbnQ6ICdQZWdhIHVuIENTViBjb24gY29sdW1uYXM6IGVtYWlsLCBub21icmUsIHJvbCAodW5hIGZpbGEgcG9yIHBlcnNvbmEpLicsXG4gICAgY3N2UGxhY2Vob2xkZXI6ICdlbWFpbCxub21icmUscm9sXFxuYW5hQHguY29tLEFuYSxlZGl0b3JcXG5iZXRvQHguY29tLEJldG8sdmlld2VyJyxcbiAgICB1cGxvYWRGaWxlOiAnU3ViaXIgYXJjaGl2byBDU1YnLFxuICAgIG9yUGFzdGU6ICdvIHBlZ2EgZWwgQ1NWIGFiYWpvJyxcbiAgICBmaWxlTG9hZGVkOiAnQXJjaGl2byBjYXJnYWRvOiB7bmFtZX0nLFxuICAgIGZpbGVSZWFkRXJyb3I6ICdObyBzZSBwdWRvIGxlZXIgZWwgYXJjaGl2by4nLFxuICAgIHJvbGVzQXZhaWxhYmxlOiAnUm9sZXMgZGlzcG9uaWJsZXM6JyxcbiAgICBvbkNvbmZsaWN0TGFiZWw6ICdTaSBlbCBlbWFpbCB5YSBleGlzdGUnLFxuICAgIGNvbmZsaWN0QXNzaWduOiAnQXNpZ25hciBlbCByb2wnLFxuICAgIGNvbmZsaWN0U2tpcDogJ09taXRpcicsXG4gICAgY29uZmxpY3RFcnJvcjogJ01hcmNhciBlcnJvcicsXG4gICAgc2VuZEFjdGl2YXRpb246ICdFbnZpYXIgZW1haWwgZGUgYWN0aXZhY2nDs24gYSBsYXMgY3VlbnRhcyBudWV2YXMnLFxuICAgIHN1Ym1pdDogJ0ltcG9ydGFyJyxcbiAgICBzdWJtaXR0aW5nOiAnSW1wb3J0YW5kby4uLicsXG4gICAgcGFyc2VFcnJvcjogJ05vIHNlIHB1ZG8gaW50ZXJwcmV0YXIgZWwgQ1NWLiBSZXZpc2EgZWwgZm9ybWF0by4nLFxuICAgIG5vUm93czogJ1BlZ2EgYWwgbWVub3MgdW5hIGZpbGEgdsOhbGlkYSAoZW1haWwgeSByb2wpLicsXG4gICAgc3VtbWFyeTogJ1Jlc3VtZW4nLFxuICAgIGNyZWF0ZWQ6ICdjcmVhZG9zJyxcbiAgICBhc3NpZ25lZDogJ2FzaWduYWRvcycsXG4gICAgc2tpcHBlZDogJ29taXRpZG9zJyxcbiAgICBmYWlsZWQ6ICdjb24gZXJyb3InLFxuICAgIGNvbEVtYWlsOiAnRW1haWwnLFxuICAgIGNvbFN0YXR1czogJ0VzdGFkbycsXG4gICAgY29sRGV0YWlsOiAnRGV0YWxsZScsXG4gICAgYWN0aXZhdGlvblNlbnQ6ICdhY3RpdmFjacOzbiBlbnZpYWRhJyxcbiAgICBhY3RpdmF0aW9uUGVuZGluZzogJ2FjdGl2YWNpw7NuIHBlbmRpZW50ZScsXG4gICAgYWdhaW46ICdJbXBvcnRhciBvdHJvIGxvdGUnLFxuICAgIGNsb3NlOiAnQ2VycmFyJyxcbiAgICBnZW5lcmljRXJyb3I6ICdObyBzZSBwdWRvIGNvbXBsZXRhciBsYSBpbXBvcnRhY2nDs24uIEludGVudGEgZGUgbnVldm8uJyxcbiAgfSxcbiAgZW46IHtcbiAgICB0aXRsZTogJ0ltcG9ydCBtZW1iZXJzJyxcbiAgICBoaW50OiAnUGFzdGUgYSBDU1Ygd2l0aCBjb2x1bW5zOiBlbWFpbCwgbmFtZSwgcm9sZSAob25lIHJvdyBwZXIgcGVyc29uKS4nLFxuICAgIGNzdlBsYWNlaG9sZGVyOiAnZW1haWwsbmFtZSxyb2xlXFxuYW5hQHguY29tLEFuYSxlZGl0b3JcXG5iZXRvQHguY29tLEJldG8sdmlld2VyJyxcbiAgICB1cGxvYWRGaWxlOiAnVXBsb2FkIENTViBmaWxlJyxcbiAgICBvclBhc3RlOiAnb3IgcGFzdGUgdGhlIENTViBiZWxvdycsXG4gICAgZmlsZUxvYWRlZDogJ0ZpbGUgbG9hZGVkOiB7bmFtZX0nLFxuICAgIGZpbGVSZWFkRXJyb3I6IFwiQ291bGRuJ3QgcmVhZCB0aGUgZmlsZS5cIixcbiAgICByb2xlc0F2YWlsYWJsZTogJ0F2YWlsYWJsZSByb2xlczonLFxuICAgIG9uQ29uZmxpY3RMYWJlbDogJ0lmIHRoZSBlbWFpbCBhbHJlYWR5IGV4aXN0cycsXG4gICAgY29uZmxpY3RBc3NpZ246ICdBc3NpZ24gdGhlIHJvbGUnLFxuICAgIGNvbmZsaWN0U2tpcDogJ1NraXAnLFxuICAgIGNvbmZsaWN0RXJyb3I6ICdNYXJrIGFzIGVycm9yJyxcbiAgICBzZW5kQWN0aXZhdGlvbjogJ1NlbmQgYWN0aXZhdGlvbiBlbWFpbCB0byBuZXcgYWNjb3VudHMnLFxuICAgIHN1Ym1pdDogJ0ltcG9ydCcsXG4gICAgc3VibWl0dGluZzogJ0ltcG9ydGluZy4uLicsXG4gICAgcGFyc2VFcnJvcjogXCJDb3VsZG4ndCBwYXJzZSB0aGUgQ1NWLiBDaGVjayB0aGUgZm9ybWF0LlwiLFxuICAgIG5vUm93czogJ1Bhc3RlIGF0IGxlYXN0IG9uZSB2YWxpZCByb3cgKGVtYWlsIGFuZCByb2xlKS4nLFxuICAgIHN1bW1hcnk6ICdTdW1tYXJ5JyxcbiAgICBjcmVhdGVkOiAnY3JlYXRlZCcsXG4gICAgYXNzaWduZWQ6ICdhc3NpZ25lZCcsXG4gICAgc2tpcHBlZDogJ3NraXBwZWQnLFxuICAgIGZhaWxlZDogJ2ZhaWxlZCcsXG4gICAgY29sRW1haWw6ICdFbWFpbCcsXG4gICAgY29sU3RhdHVzOiAnU3RhdHVzJyxcbiAgICBjb2xEZXRhaWw6ICdEZXRhaWwnLFxuICAgIGFjdGl2YXRpb25TZW50OiAnYWN0aXZhdGlvbiBzZW50JyxcbiAgICBhY3RpdmF0aW9uUGVuZGluZzogJ2FjdGl2YXRpb24gcGVuZGluZycsXG4gICAgYWdhaW46ICdJbXBvcnQgYW5vdGhlciBiYXRjaCcsXG4gICAgY2xvc2U6ICdDbG9zZScsXG4gICAgZ2VuZXJpY0Vycm9yOiBcIkNvdWxkbid0IGNvbXBsZXRlIHRoZSBpbXBvcnQuIFRyeSBhZ2Fpbi5cIixcbiAgfSxcbn07XG4iXX0=
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYmVyLWltcG9ydC1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9tZW1iZXItaW1wb3J0LW1vZGFsL21lbWJlci1pbXBvcnQtbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBcUI7SUFDeEQsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixRQUFRLEVBQ04sc0lBQXNJO1FBQ3hJLGNBQWMsRUFBRSxnRUFBZ0U7UUFDaEYsaUJBQWlCLEVBQUUsd0JBQXdCO1FBQzNDLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isb0JBQW9CLEVBQUUsc0NBQXNDO1FBQzVELGlCQUFpQixFQUFFLGlCQUFpQjtRQUNwQyxxQkFBcUIsRUFBRSxvQ0FBb0M7UUFDM0QsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixVQUFVLEVBQUUseUJBQXlCO1FBQ3JDLGFBQWEsRUFBRSw2QkFBNkI7UUFDNUMsY0FBYyxFQUFFLG9CQUFvQjtRQUNwQyxlQUFlLEVBQUUsbUNBQW1DO1FBQ3BELGNBQWMsRUFBRSxnQkFBZ0I7UUFDaEMsWUFBWSxFQUFFLFFBQVE7UUFDdEIsYUFBYSxFQUFFLGNBQWM7UUFDN0IsY0FBYyxFQUFFLGlEQUFpRDtRQUNqRSxNQUFNLEVBQUUsVUFBVTtRQUNsQixVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsbURBQW1EO1FBQy9ELE1BQU0sRUFBRSxnREFBZ0Q7UUFDeEQsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsUUFBUSxFQUFFLFdBQVc7UUFDckIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsTUFBTSxFQUFFLFdBQVc7UUFDbkIsUUFBUSxFQUFFLE9BQU87UUFDakIsU0FBUyxFQUFFLFFBQVE7UUFDbkIsU0FBUyxFQUFFLFNBQVM7UUFDcEIsY0FBYyxFQUFFLG9CQUFvQjtRQUNwQyxpQkFBaUIsRUFBRSxzQkFBc0I7UUFDekMsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixLQUFLLEVBQUUsUUFBUTtRQUNmLFlBQVksRUFBRSx3REFBd0Q7S0FDdkU7SUFDRCxFQUFFLEVBQUU7UUFDRixLQUFLLEVBQUUsZ0JBQWdCO1FBQ3ZCLFFBQVEsRUFDTiwrSEFBK0g7UUFDakksY0FBYyxFQUFFLCtEQUErRDtRQUMvRSxpQkFBaUIsRUFBRSw0QkFBNEI7UUFDL0MsZ0JBQWdCLEVBQUUsV0FBVztRQUM3QixvQkFBb0IsRUFBRSxxQ0FBcUM7UUFDM0QsaUJBQWlCLEVBQUUsZUFBZTtRQUNsQyxxQkFBcUIsRUFBRSxnQ0FBZ0M7UUFDdkQsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixVQUFVLEVBQUUscUJBQXFCO1FBQ2pDLGFBQWEsRUFBRSx5QkFBeUI7UUFDeEMsY0FBYyxFQUFFLGtCQUFrQjtRQUNsQyxlQUFlLEVBQUUseUNBQXlDO1FBQzFELGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsWUFBWSxFQUFFLE1BQU07UUFDcEIsYUFBYSxFQUFFLGVBQWU7UUFDOUIsY0FBYyxFQUFFLHVDQUF1QztRQUN2RCxNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUUsY0FBYztRQUMxQixVQUFVLEVBQUUsMkNBQTJDO1FBQ3ZELE1BQU0sRUFBRSw4Q0FBOEM7UUFDdEQsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsUUFBUSxFQUFFLE9BQU87UUFDakIsU0FBUyxFQUFFLFFBQVE7UUFDbkIsU0FBUyxFQUFFLFFBQVE7UUFDbkIsY0FBYyxFQUFFLGlCQUFpQjtRQUNqQyxpQkFBaUIsRUFBRSxvQkFBb0I7UUFDdkMsS0FBSyxFQUFFLHNCQUFzQjtRQUM3QixLQUFLLEVBQUUsT0FBTztRQUNkLFlBQVksRUFBRSwwQ0FBMEM7S0FDekQ7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1tZW1iZXItaW1wb3J0LW1vZGFsYCAoQURSLTAyMykuXG4gKiBBdXRvLXJlZ2lzdHJhZG9zIHNpIGVsIGNvbnN1bWVyIG5vIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgU2V0dGluZ3MuSW1wb3J0TW9kYWxgLlxuICovXG5leHBvcnQgY29uc3QgTUVNQkVSX0lNUE9SVF9NT0RBTF9JMThOOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIHRpdGxlOiAnSW1wb3J0YXIgbWllbWJyb3MnLFxuICAgIHN1YnRpdGxlOlxuICAgICAgJ0NhcmdhIHVuIGFyY2hpdm8gQ1NWIG8gcGVnYSBlbCBjb250ZW5pZG8gZGlyZWN0YW1lbnRlLiBDYWRhIGZpbGEgZGViZSB0ZW5lciBlbWFpbCwgbm9tYnJlIHkgcm9sLiBMb3MgY2FtYmlvcyBzZSBhcGxpY2FuIGFsIGluc3RhbnRlLicsXG4gICAgY3N2UGxhY2Vob2xkZXI6ICdlbWFpbCxub21icmUscm9sXFxuYW5hQHguY29tLEFuYSxlZGl0b3JcXG5iZXRvQHguY29tLEJldG8sdmlld2VyJyxcbiAgICBpbXBvcnRNZXRob2RMYWJlbDogJ8K/Q8OzbW8gZGVzZWFzIGltcG9ydGFyPycsXG4gICAgaW1wb3J0TWV0aG9kRmlsZTogJ1BvciBhcmNoaXZvJyxcbiAgICBpbXBvcnRNZXRob2RGaWxlSGludDogJ1N1YmUgdW4gYXJjaGl2byAuY3N2IGRlc2RlIHR1IGVxdWlwbycsXG4gICAgaW1wb3J0TWV0aG9kUGFzdGU6ICdQZWdhciBjb250ZW5pZG8nLFxuICAgIGltcG9ydE1ldGhvZFBhc3RlSGludDogJ0VzY3JpYmUgbyBwZWdhIGVsIENTViBkaXJlY3RhbWVudGUnLFxuICAgIHVwbG9hZEZpbGU6ICdTdWJpciBhcmNoaXZvIENTVicsXG4gICAgZmlsZUxvYWRlZDogJ0FyY2hpdm8gY2FyZ2Fkbzoge25hbWV9JyxcbiAgICBmaWxlUmVhZEVycm9yOiAnTm8gc2UgcHVkbyBsZWVyIGVsIGFyY2hpdm8uJyxcbiAgICByb2xlc0F2YWlsYWJsZTogJ1JvbGVzIGRpc3BvbmlibGVzOicsXG4gICAgb25Db25mbGljdExhYmVsOiAnwr9RdcOpIGhhY2VyIHNpIGVsIGVtYWlsIHlhIGV4aXN0ZT8nLFxuICAgIGNvbmZsaWN0QXNzaWduOiAnQXNpZ25hciBlbCByb2wnLFxuICAgIGNvbmZsaWN0U2tpcDogJ09taXRpcicsXG4gICAgY29uZmxpY3RFcnJvcjogJ01hcmNhciBlcnJvcicsXG4gICAgc2VuZEFjdGl2YXRpb246ICdFbnZpYXIgZW1haWwgZGUgYWN0aXZhY2nDs24gYSBsYXMgY3VlbnRhcyBudWV2YXMnLFxuICAgIHN1Ym1pdDogJ0ltcG9ydGFyJyxcbiAgICBzdWJtaXR0aW5nOiAnSW1wb3J0YW5kby4uLicsXG4gICAgcGFyc2VFcnJvcjogJ05vIHNlIHB1ZG8gaW50ZXJwcmV0YXIgZWwgQ1NWLiBSZXZpc2EgZWwgZm9ybWF0by4nLFxuICAgIG5vUm93czogJ0FncmVnYSBhbCBtZW5vcyB1bmEgZmlsYSB2w6FsaWRhIChlbWFpbCB5IHJvbCkuJyxcbiAgICBzdW1tYXJ5OiAnUmVzdW1lbicsXG4gICAgY3JlYXRlZDogJ2NyZWFkb3MnLFxuICAgIGFzc2lnbmVkOiAnYXNpZ25hZG9zJyxcbiAgICBza2lwcGVkOiAnb21pdGlkb3MnLFxuICAgIGZhaWxlZDogJ2NvbiBlcnJvcicsXG4gICAgY29sRW1haWw6ICdFbWFpbCcsXG4gICAgY29sU3RhdHVzOiAnRXN0YWRvJyxcbiAgICBjb2xEZXRhaWw6ICdEZXRhbGxlJyxcbiAgICBhY3RpdmF0aW9uU2VudDogJ2FjdGl2YWNpw7NuIGVudmlhZGEnLFxuICAgIGFjdGl2YXRpb25QZW5kaW5nOiAnYWN0aXZhY2nDs24gcGVuZGllbnRlJyxcbiAgICBhZ2FpbjogJ0ltcG9ydGFyIG90cm8gbG90ZScsXG4gICAgY2xvc2U6ICdDZXJyYXInLFxuICAgIGdlbmVyaWNFcnJvcjogJ05vIHNlIHB1ZG8gY29tcGxldGFyIGxhIGltcG9ydGFjacOzbi4gSW50ZW50YSBkZSBudWV2by4nLFxuICB9LFxuICBlbjoge1xuICAgIHRpdGxlOiAnSW1wb3J0IG1lbWJlcnMnLFxuICAgIHN1YnRpdGxlOlxuICAgICAgJ1VwbG9hZCBhIENTViBmaWxlIG9yIHBhc3RlIHRoZSBjb250ZW50IGRpcmVjdGx5LiBFYWNoIHJvdyBtdXN0IGluY2x1ZGUgZW1haWwsIG5hbWUgYW5kIHJvbGUuIENoYW5nZXMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuJyxcbiAgICBjc3ZQbGFjZWhvbGRlcjogJ2VtYWlsLG5hbWUscm9sZVxcbmFuYUB4LmNvbSxBbmEsZWRpdG9yXFxuYmV0b0B4LmNvbSxCZXRvLHZpZXdlcicsXG4gICAgaW1wb3J0TWV0aG9kTGFiZWw6ICdIb3cgZG8geW91IHdhbnQgdG8gaW1wb3J0PycsXG4gICAgaW1wb3J0TWV0aG9kRmlsZTogJ0Zyb20gZmlsZScsXG4gICAgaW1wb3J0TWV0aG9kRmlsZUhpbnQ6ICdVcGxvYWQgYSAuY3N2IGZpbGUgZnJvbSB5b3VyIGRldmljZScsXG4gICAgaW1wb3J0TWV0aG9kUGFzdGU6ICdQYXN0ZSBjb250ZW50JyxcbiAgICBpbXBvcnRNZXRob2RQYXN0ZUhpbnQ6ICdUeXBlIG9yIHBhc3RlIHRoZSBDU1YgZGlyZWN0bHknLFxuICAgIHVwbG9hZEZpbGU6ICdVcGxvYWQgQ1NWIGZpbGUnLFxuICAgIGZpbGVMb2FkZWQ6ICdGaWxlIGxvYWRlZDoge25hbWV9JyxcbiAgICBmaWxlUmVhZEVycm9yOiBcIkNvdWxkbid0IHJlYWQgdGhlIGZpbGUuXCIsXG4gICAgcm9sZXNBdmFpbGFibGU6ICdBdmFpbGFibGUgcm9sZXM6JyxcbiAgICBvbkNvbmZsaWN0TGFiZWw6ICdXaGF0IHRvIGRvIGlmIHRoZSBlbWFpbCBhbHJlYWR5IGV4aXN0cz8nLFxuICAgIGNvbmZsaWN0QXNzaWduOiAnQXNzaWduIHRoZSByb2xlJyxcbiAgICBjb25mbGljdFNraXA6ICdTa2lwJyxcbiAgICBjb25mbGljdEVycm9yOiAnTWFyayBhcyBlcnJvcicsXG4gICAgc2VuZEFjdGl2YXRpb246ICdTZW5kIGFjdGl2YXRpb24gZW1haWwgdG8gbmV3IGFjY291bnRzJyxcbiAgICBzdWJtaXQ6ICdJbXBvcnQnLFxuICAgIHN1Ym1pdHRpbmc6ICdJbXBvcnRpbmcuLi4nLFxuICAgIHBhcnNlRXJyb3I6IFwiQ291bGRuJ3QgcGFyc2UgdGhlIENTVi4gQ2hlY2sgdGhlIGZvcm1hdC5cIixcbiAgICBub1Jvd3M6ICdBZGQgYXQgbGVhc3Qgb25lIHZhbGlkIHJvdyAoZW1haWwgYW5kIHJvbGUpLicsXG4gICAgc3VtbWFyeTogJ1N1bW1hcnknLFxuICAgIGNyZWF0ZWQ6ICdjcmVhdGVkJyxcbiAgICBhc3NpZ25lZDogJ2Fzc2lnbmVkJyxcbiAgICBza2lwcGVkOiAnc2tpcHBlZCcsXG4gICAgZmFpbGVkOiAnZmFpbGVkJyxcbiAgICBjb2xFbWFpbDogJ0VtYWlsJyxcbiAgICBjb2xTdGF0dXM6ICdTdGF0dXMnLFxuICAgIGNvbERldGFpbDogJ0RldGFpbCcsXG4gICAgYWN0aXZhdGlvblNlbnQ6ICdhY3RpdmF0aW9uIHNlbnQnLFxuICAgIGFjdGl2YXRpb25QZW5kaW5nOiAnYWN0aXZhdGlvbiBwZW5kaW5nJyxcbiAgICBhZ2FpbjogJ0ltcG9ydCBhbm90aGVyIGJhdGNoJyxcbiAgICBjbG9zZTogJ0Nsb3NlJyxcbiAgICBnZW5lcmljRXJyb3I6IFwiQ291bGRuJ3QgY29tcGxldGUgdGhlIGltcG9ydC4gVHJ5IGFnYWluLlwiLFxuICB9LFxufTtcbiJdfQ==
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.12';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMic7XG4iXX0=
5
+ export const VERSION = '4.0.14';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xNCc7XG4iXX0=
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.12';
59
+ const VERSION = '4.0.14';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -50078,14 +50078,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50078
50078
  const MEMBER_IMPORT_MODAL_I18N = {
50079
50079
  es: {
50080
50080
  title: 'Importar miembros',
50081
- hint: 'Pega un CSV con columnas: email, nombre, rol (una fila por persona).',
50081
+ subtitle: 'Carga un archivo CSV o pega el contenido directamente. Cada fila debe tener email, nombre y rol. Los cambios se aplican al instante.',
50082
50082
  csvPlaceholder: 'email,nombre,rol\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
50083
+ importMethodLabel: '¿Cómo deseas importar?',
50084
+ importMethodFile: 'Por archivo',
50085
+ importMethodFileHint: 'Sube un archivo .csv desde tu equipo',
50086
+ importMethodPaste: 'Pegar contenido',
50087
+ importMethodPasteHint: 'Escribe o pega el CSV directamente',
50083
50088
  uploadFile: 'Subir archivo CSV',
50084
- orPaste: 'o pega el CSV abajo',
50085
50089
  fileLoaded: 'Archivo cargado: {name}',
50086
50090
  fileReadError: 'No se pudo leer el archivo.',
50087
50091
  rolesAvailable: 'Roles disponibles:',
50088
- onConflictLabel: 'Si el email ya existe',
50092
+ onConflictLabel: '¿Qué hacer si el email ya existe?',
50089
50093
  conflictAssign: 'Asignar el rol',
50090
50094
  conflictSkip: 'Omitir',
50091
50095
  conflictError: 'Marcar error',
@@ -50093,7 +50097,7 @@ const MEMBER_IMPORT_MODAL_I18N = {
50093
50097
  submit: 'Importar',
50094
50098
  submitting: 'Importando...',
50095
50099
  parseError: 'No se pudo interpretar el CSV. Revisa el formato.',
50096
- noRows: 'Pega al menos una fila válida (email y rol).',
50100
+ noRows: 'Agrega al menos una fila válida (email y rol).',
50097
50101
  summary: 'Resumen',
50098
50102
  created: 'creados',
50099
50103
  assigned: 'asignados',
@@ -50110,14 +50114,18 @@ const MEMBER_IMPORT_MODAL_I18N = {
50110
50114
  },
50111
50115
  en: {
50112
50116
  title: 'Import members',
50113
- hint: 'Paste a CSV with columns: email, name, role (one row per person).',
50117
+ subtitle: 'Upload a CSV file or paste the content directly. Each row must include email, name and role. Changes are applied immediately.',
50114
50118
  csvPlaceholder: 'email,name,role\nana@x.com,Ana,editor\nbeto@x.com,Beto,viewer',
50119
+ importMethodLabel: 'How do you want to import?',
50120
+ importMethodFile: 'From file',
50121
+ importMethodFileHint: 'Upload a .csv file from your device',
50122
+ importMethodPaste: 'Paste content',
50123
+ importMethodPasteHint: 'Type or paste the CSV directly',
50115
50124
  uploadFile: 'Upload CSV file',
50116
- orPaste: 'or paste the CSV below',
50117
50125
  fileLoaded: 'File loaded: {name}',
50118
50126
  fileReadError: "Couldn't read the file.",
50119
50127
  rolesAvailable: 'Available roles:',
50120
- onConflictLabel: 'If the email already exists',
50128
+ onConflictLabel: 'What to do if the email already exists?',
50121
50129
  conflictAssign: 'Assign the role',
50122
50130
  conflictSkip: 'Skip',
50123
50131
  conflictError: 'Mark as error',
@@ -50125,7 +50133,7 @@ const MEMBER_IMPORT_MODAL_I18N = {
50125
50133
  submit: 'Import',
50126
50134
  submitting: 'Importing...',
50127
50135
  parseError: "Couldn't parse the CSV. Check the format.",
50128
- noRows: 'Paste at least one valid row (email and role).',
50136
+ noRows: 'Add at least one valid row (email and role).',
50129
50137
  summary: 'Summary',
50130
50138
  created: 'created',
50131
50139
  assigned: 'assigned',
@@ -50143,7 +50151,7 @@ const MEMBER_IMPORT_MODAL_I18N = {
50143
50151
  };
50144
50152
 
50145
50153
  const DEFAULT_NAMESPACE$8 = 'Settings.ImportModal';
50146
- addIcons({ cloudUploadOutline });
50154
+ addIcons({ cloudUploadOutline, documentTextOutline });
50147
50155
  /**
50148
50156
  * `val-member-import-modal` — panel de carga masiva de miembros (ADR-023 fase 6).
50149
50157
  *
@@ -50164,8 +50172,27 @@ class MemberImportModalComponent {
50164
50172
  /** Namespace i18n. */
50165
50173
  this.i18nNamespace = DEFAULT_NAMESPACE$8;
50166
50174
  this.csv = '';
50167
- this.onConflict = 'assignRole';
50168
- this.sendActivation = true;
50175
+ this.importMode = signal('file');
50176
+ this.onConflictControl = new FormControl('assignRole');
50177
+ this.sendActivationControl = new FormControl(true);
50178
+ this.conflictRadioProps = computed(() => ({
50179
+ control: this.onConflictControl,
50180
+ label: '',
50181
+ type: InputType.RADIO,
50182
+ state: ComponentStates.ENABLED,
50183
+ options: [
50184
+ { id: 'assignRole', name: this.t('conflictAssign'), order: 0 },
50185
+ { id: 'skip', name: this.t('conflictSkip'), order: 1 },
50186
+ { id: 'error', name: this.t('conflictError'), order: 2 },
50187
+ ],
50188
+ }));
50189
+ this.sendActivationProps = computed(() => ({
50190
+ control: this.sendActivationControl,
50191
+ label: this.t('sendActivation'),
50192
+ type: InputType.CHECK,
50193
+ state: ComponentStates.ENABLED,
50194
+ labelPlacement: 'end',
50195
+ }));
50169
50196
  this.submitting = signal(false);
50170
50197
  this.errorMsg = signal('');
50171
50198
  this.results = signal(null);
@@ -50235,8 +50262,8 @@ class MemberImportModalComponent {
50235
50262
  this.orgService
50236
50263
  .importMembers(this.orgId, {
50237
50264
  users,
50238
- onConflict: this.onConflict,
50239
- sendActivation: this.sendActivation,
50265
+ onConflict: (this.onConflictControl.value ?? 'assignRole'),
50266
+ sendActivation: this.sendActivationControl.value ?? true,
50240
50267
  })
50241
50268
  .subscribe({
50242
50269
  next: res => {
@@ -50265,6 +50292,7 @@ class MemberImportModalComponent {
50265
50292
  this.fileName.set('');
50266
50293
  this.errorMsg.set('');
50267
50294
  this.results.set(null);
50295
+ this.importMode.set('file');
50268
50296
  }
50269
50297
  dismiss() {
50270
50298
  this._modalRef?.dismiss(null, 'cancel');
@@ -50286,10 +50314,9 @@ class MemberImportModalComponent {
50286
50314
 
50287
50315
  <ion-content class="ion-padding">
50288
50316
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
50317
+ <val-title [props]="{ content: t('subtitle'), size: 'large', color: '', bold: false }" />
50289
50318
 
50290
50319
  @if (!results()) {
50291
- <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
50292
-
50293
50320
  @if (rolesHint()) {
50294
50321
  <val-text
50295
50322
  class="import-roles-hint"
@@ -50297,42 +50324,79 @@ class MemberImportModalComponent {
50297
50324
  />
50298
50325
  }
50299
50326
 
50300
- <!-- Subida de archivo: label nativo envuelve el input (label trick, igual
50301
- que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
50302
- <div class="import-upload">
50303
- <label class="import-upload__btn">
50304
- <ion-icon name="cloud-upload-outline" />
50305
- <span>{{ t('uploadFile') }}</span>
50306
- <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
50307
- </label>
50308
- <span class="import-upload__hint">{{ t('orPaste') }}</span>
50327
+ <!-- Selector de método de importación -->
50328
+ <div class="import-section">
50329
+ <val-title [props]="{ content: t('importMethodLabel'), size: 'small', color: 'dark', bold: true }" />
50330
+ <div class="import-method-cards">
50331
+ <button
50332
+ type="button"
50333
+ class="import-method-card"
50334
+ [class.import-method-card--active]="importMode() === 'file'"
50335
+ (click)="importMode.set('file')"
50336
+ >
50337
+ <ion-icon name="cloud-upload-outline" class="import-method-card__icon" />
50338
+ <span class="import-method-card__title">{{ t('importMethodFile') }}</span>
50339
+ <span class="import-method-card__hint">{{ t('importMethodFileHint') }}</span>
50340
+ </button>
50341
+ <button
50342
+ type="button"
50343
+ class="import-method-card"
50344
+ [class.import-method-card--active]="importMode() === 'paste'"
50345
+ (click)="importMode.set('paste')"
50346
+ >
50347
+ <ion-icon name="document-text-outline" class="import-method-card__icon" />
50348
+ <span class="import-method-card__title">{{ t('importMethodPaste') }}</span>
50349
+ <span class="import-method-card__hint">{{ t('importMethodPasteHint') }}</span>
50350
+ </button>
50351
+ </div>
50309
50352
  </div>
50310
50353
 
50311
- @if (fileName()) {
50312
- <p class="import-file-loaded">
50313
- {{ t('fileLoaded').replace('{name}', fileName()) }}
50314
- </p>
50354
+ <!-- Subida de archivo (label trick — gesto confiable en iOS/PWA) -->
50355
+ @if (importMode() === 'file') {
50356
+ <div class="import-section">
50357
+ <label class="import-upload__btn">
50358
+ <ion-icon name="cloud-upload-outline" />
50359
+ <span>{{ t('uploadFile') }}</span>
50360
+ <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
50361
+ </label>
50362
+ @if (fileName()) {
50363
+ <p class="import-file-loaded">
50364
+ {{ t('fileLoaded').replace('{name}', fileName()) }}
50365
+ </p>
50366
+ }
50367
+ </div>
50315
50368
  }
50316
50369
 
50317
- <ion-textarea
50318
- class="import-csv"
50319
- [autoGrow]="true"
50320
- [rows]="6"
50321
- [placeholder]="t('csvPlaceholder')"
50322
- [(ngModel)]="csv"
50323
- />
50370
+ <!-- Pegar CSV -->
50371
+ @if (importMode() === 'paste') {
50372
+ <div class="import-section">
50373
+ <ion-textarea
50374
+ class="import-csv"
50375
+ [autoGrow]="true"
50376
+ [rows]="6"
50377
+ [placeholder]="t('csvPlaceholder')"
50378
+ [(ngModel)]="csv"
50379
+ />
50380
+ </div>
50381
+ }
50324
50382
 
50325
- <!-- Selector de conflicto: label + ion-select fill=outline (patrón lib) -->
50326
- <span class="import-field-label">{{ t('onConflictLabel') }}</span>
50327
- <ion-select class="import-conflict" fill="outline" shape="round" interface="popover" [(ngModel)]="onConflict">
50328
- <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
50329
- <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
50330
- <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
50331
- </ion-select>
50383
+ <!-- Si hubo carga de archivo, mostrar textarea de solo lectura para revisar -->
50384
+ @if (importMode() === 'file' && csv) {
50385
+ <div class="import-section">
50386
+ <ion-textarea class="import-csv" [autoGrow]="true" [rows]="4" [readonly]="true" [value]="csv" />
50387
+ </div>
50388
+ }
50332
50389
 
50333
- <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
50334
- {{ t('sendActivation') }}
50335
- </ion-checkbox>
50390
+ <!-- Conflicto: radio buttons -->
50391
+ <div class="import-section">
50392
+ <val-title [props]="{ content: t('onConflictLabel'), size: 'small', color: 'dark', bold: true }" />
50393
+ <val-radio-input [props]="conflictRadioProps()" />
50394
+ </div>
50395
+
50396
+ <!-- Activación: val-check-input -->
50397
+ <div class="import-section">
50398
+ <val-check-input [props]="sendActivationProps()" />
50399
+ </div>
50336
50400
 
50337
50401
  @if (errorMsg()) {
50338
50402
  <p class="import-error">{{ errorMsg() }}</p>
@@ -50369,26 +50433,26 @@ class MemberImportModalComponent {
50369
50433
  </div>
50370
50434
  }
50371
50435
  </ion-content>
50372
- `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:16px}.import-roles-hint{display:block;margin-bottom:16px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:16px}.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 16px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:20px;font-family:monospace;font-size:.8125rem}.import-field-label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:6px}.import-conflict{display:block;width:100%;margin-bottom:20px}.import-activation{display:block;margin-bottom:20px;font-size:.875rem}.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"] }] }); }
50436
+ `, isInline: true, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:8px}.import-roles-hint{display:block;margin-bottom:24px}.import-section{margin-bottom:28px}.import-section val-title{margin-bottom:10px}.import-method-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}.import-method-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:14px 16px;border:1.5px solid var(--ion-color-light-shade, #d7d8da);border-radius:12px;background:var(--ion-color-light);cursor:pointer;text-align:left;transition:border-color .15s ease,background .15s ease}.import-method-card:hover{border-color:var(--ion-color-medium, #92949c)}.import-method-card--active{border-color:var(--ion-color-primary, #7026df);background:color-mix(in srgb,var(--ion-color-primary, #7026df) 6%,var(--ion-color-light))}.import-method-card__icon{font-size:1.375rem;color:var(--ion-color-medium-shade, #6b6e76);margin-bottom:4px}.import-method-card--active .import-method-card__icon{color:var(--ion-color-primary, #7026df)}.import-method-card__title{font-size:.875rem;font-weight:600;color:var(--ion-color-dark)}.import-method-card__hint{font-size:.75rem;color:var(--ion-color-medium, #92949c);line-height:1.3}.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-file-loaded{margin:10px 0 0;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;font-family:monospace;font-size:.8125rem}.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:.875rem}.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:.75rem;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: "ngmodule", type: ReactiveFormsModule }, { 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: 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"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }] }); }
50373
50437
  }
50374
50438
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MemberImportModalComponent, decorators: [{
50375
50439
  type: Component,
50376
50440
  args: [{ selector: 'val-member-import-modal', standalone: true, imports: [
50377
50441
  FormsModule,
50442
+ ReactiveFormsModule,
50378
50443
  IonHeader,
50379
50444
  IonToolbar,
50380
50445
  IonButtons,
50381
50446
  IonButton,
50382
50447
  IonContent,
50383
50448
  IonTextarea,
50384
- IonSelect,
50385
- IonSelectOption,
50386
- IonCheckbox,
50387
50449
  IonSpinner,
50388
50450
  IonIcon,
50389
50451
  DisplayComponent,
50390
50452
  TextComponent,
50391
50453
  TitleComponent,
50454
+ RadioInputComponent,
50455
+ CheckInputComponent,
50392
50456
  ], template: `
50393
50457
  <ion-header>
50394
50458
  <ion-toolbar>
@@ -50402,10 +50466,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50402
50466
 
50403
50467
  <ion-content class="ion-padding">
50404
50468
  <val-display [props]="{ content: t('title'), size: 'small', color: 'dark' }" />
50469
+ <val-title [props]="{ content: t('subtitle'), size: 'large', color: '', bold: false }" />
50405
50470
 
50406
50471
  @if (!results()) {
50407
- <val-title [props]="{ content: t('hint'), size: 'large', color: '', bold: false }" />
50408
-
50409
50472
  @if (rolesHint()) {
50410
50473
  <val-text
50411
50474
  class="import-roles-hint"
@@ -50413,42 +50476,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50413
50476
  />
50414
50477
  }
50415
50478
 
50416
- <!-- Subida de archivo: label nativo envuelve el input (label trick, igual
50417
- que val-attachment-uploader) → gesto confiable en iOS/PWA. -->
50418
- <div class="import-upload">
50419
- <label class="import-upload__btn">
50420
- <ion-icon name="cloud-upload-outline" />
50421
- <span>{{ t('uploadFile') }}</span>
50422
- <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
50423
- </label>
50424
- <span class="import-upload__hint">{{ t('orPaste') }}</span>
50479
+ <!-- Selector de método de importación -->
50480
+ <div class="import-section">
50481
+ <val-title [props]="{ content: t('importMethodLabel'), size: 'small', color: 'dark', bold: true }" />
50482
+ <div class="import-method-cards">
50483
+ <button
50484
+ type="button"
50485
+ class="import-method-card"
50486
+ [class.import-method-card--active]="importMode() === 'file'"
50487
+ (click)="importMode.set('file')"
50488
+ >
50489
+ <ion-icon name="cloud-upload-outline" class="import-method-card__icon" />
50490
+ <span class="import-method-card__title">{{ t('importMethodFile') }}</span>
50491
+ <span class="import-method-card__hint">{{ t('importMethodFileHint') }}</span>
50492
+ </button>
50493
+ <button
50494
+ type="button"
50495
+ class="import-method-card"
50496
+ [class.import-method-card--active]="importMode() === 'paste'"
50497
+ (click)="importMode.set('paste')"
50498
+ >
50499
+ <ion-icon name="document-text-outline" class="import-method-card__icon" />
50500
+ <span class="import-method-card__title">{{ t('importMethodPaste') }}</span>
50501
+ <span class="import-method-card__hint">{{ t('importMethodPasteHint') }}</span>
50502
+ </button>
50503
+ </div>
50425
50504
  </div>
50426
50505
 
50427
- @if (fileName()) {
50428
- <p class="import-file-loaded">
50429
- {{ t('fileLoaded').replace('{name}', fileName()) }}
50430
- </p>
50506
+ <!-- Subida de archivo (label trick — gesto confiable en iOS/PWA) -->
50507
+ @if (importMode() === 'file') {
50508
+ <div class="import-section">
50509
+ <label class="import-upload__btn">
50510
+ <ion-icon name="cloud-upload-outline" />
50511
+ <span>{{ t('uploadFile') }}</span>
50512
+ <input type="file" accept=".csv,text/csv,text/plain" (change)="onFileSelected($event)" />
50513
+ </label>
50514
+ @if (fileName()) {
50515
+ <p class="import-file-loaded">
50516
+ {{ t('fileLoaded').replace('{name}', fileName()) }}
50517
+ </p>
50518
+ }
50519
+ </div>
50431
50520
  }
50432
50521
 
50433
- <ion-textarea
50434
- class="import-csv"
50435
- [autoGrow]="true"
50436
- [rows]="6"
50437
- [placeholder]="t('csvPlaceholder')"
50438
- [(ngModel)]="csv"
50439
- />
50522
+ <!-- Pegar CSV -->
50523
+ @if (importMode() === 'paste') {
50524
+ <div class="import-section">
50525
+ <ion-textarea
50526
+ class="import-csv"
50527
+ [autoGrow]="true"
50528
+ [rows]="6"
50529
+ [placeholder]="t('csvPlaceholder')"
50530
+ [(ngModel)]="csv"
50531
+ />
50532
+ </div>
50533
+ }
50440
50534
 
50441
- <!-- Selector de conflicto: label + ion-select fill=outline (patrón lib) -->
50442
- <span class="import-field-label">{{ t('onConflictLabel') }}</span>
50443
- <ion-select class="import-conflict" fill="outline" shape="round" interface="popover" [(ngModel)]="onConflict">
50444
- <ion-select-option value="assignRole">{{ t('conflictAssign') }}</ion-select-option>
50445
- <ion-select-option value="skip">{{ t('conflictSkip') }}</ion-select-option>
50446
- <ion-select-option value="error">{{ t('conflictError') }}</ion-select-option>
50447
- </ion-select>
50535
+ <!-- Si hubo carga de archivo, mostrar textarea de solo lectura para revisar -->
50536
+ @if (importMode() === 'file' && csv) {
50537
+ <div class="import-section">
50538
+ <ion-textarea class="import-csv" [autoGrow]="true" [rows]="4" [readonly]="true" [value]="csv" />
50539
+ </div>
50540
+ }
50448
50541
 
50449
- <ion-checkbox class="import-activation" labelPlacement="end" [(ngModel)]="sendActivation">
50450
- {{ t('sendActivation') }}
50451
- </ion-checkbox>
50542
+ <!-- Conflicto: radio buttons -->
50543
+ <div class="import-section">
50544
+ <val-title [props]="{ content: t('onConflictLabel'), size: 'small', color: 'dark', bold: true }" />
50545
+ <val-radio-input [props]="conflictRadioProps()" />
50546
+ </div>
50547
+
50548
+ <!-- Activación: val-check-input -->
50549
+ <div class="import-section">
50550
+ <val-check-input [props]="sendActivationProps()" />
50551
+ </div>
50452
50552
 
50453
50553
  @if (errorMsg()) {
50454
50554
  <p class="import-error">{{ errorMsg() }}</p>
@@ -50485,7 +50585,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50485
50585
  </div>
50486
50586
  }
50487
50587
  </ion-content>
50488
- `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:16px}.import-roles-hint{display:block;margin-bottom:16px}.import-upload{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:16px}.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 16px;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;margin-bottom:20px;font-family:monospace;font-size:.8125rem}.import-field-label{display:block;font-size:.8125rem;font-weight:600;color:var(--ion-color-medium, #6b6675);margin-bottom:6px}.import-conflict{display:block;width:100%;margin-bottom:20px}.import-activation{display:block;margin-bottom:20px;font-size:.875rem}.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"] }]
50588
+ `, styles: ["val-display{display:block;margin-bottom:4px}val-title{display:block;margin-bottom:8px}.import-roles-hint{display:block;margin-bottom:24px}.import-section{margin-bottom:28px}.import-section val-title{margin-bottom:10px}.import-method-cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}.import-method-card{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:14px 16px;border:1.5px solid var(--ion-color-light-shade, #d7d8da);border-radius:12px;background:var(--ion-color-light);cursor:pointer;text-align:left;transition:border-color .15s ease,background .15s ease}.import-method-card:hover{border-color:var(--ion-color-medium, #92949c)}.import-method-card--active{border-color:var(--ion-color-primary, #7026df);background:color-mix(in srgb,var(--ion-color-primary, #7026df) 6%,var(--ion-color-light))}.import-method-card__icon{font-size:1.375rem;color:var(--ion-color-medium-shade, #6b6e76);margin-bottom:4px}.import-method-card--active .import-method-card__icon{color:var(--ion-color-primary, #7026df)}.import-method-card__title{font-size:.875rem;font-weight:600;color:var(--ion-color-dark)}.import-method-card__hint{font-size:.75rem;color:var(--ion-color-medium, #92949c);line-height:1.3}.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-file-loaded{margin:10px 0 0;font-size:.8125rem;color:var(--ion-color-medium-shade, #6b6e76)}.import-csv{--background: var(--ion-color-light);border-radius:10px;font-family:monospace;font-size:.8125rem}.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:.875rem}.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:.75rem;color:var(--ion-color-danger, #c0392b)}\n"] }]
50489
50589
  }], ctorParameters: () => [], propDecorators: { orgId: [{
50490
50590
  type: Input
50491
50591
  }], availableRoles: [{