summaryrefslogtreecommitdiffstats
path: root/apps/settings
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings')
-rw-r--r--apps/settings/l10n/es_MX.js119
-rw-r--r--apps/settings/l10n/es_MX.json119
-rw-r--r--apps/settings/lib/Controller/AppSettingsController.php107
-rw-r--r--apps/settings/lib/Controller/UsersController.php91
-rw-r--r--apps/settings/src/App.vue7
-rw-r--r--apps/settings/src/components/AppList.vue2
-rw-r--r--apps/settings/src/store/apps.js7
-rw-r--r--apps/settings/src/store/index.js2
-rw-r--r--apps/settings/src/store/users-settings.js (renamed from apps/settings/src/store/settings.js)4
-rw-r--r--apps/settings/src/store/users.js2
-rw-r--r--apps/settings/src/views/Apps.vue21
-rw-r--r--apps/settings/templates/settings-vue.php32
-rw-r--r--apps/settings/templates/settings/empty.php4
-rw-r--r--apps/settings/tests/Controller/AppSettingsControllerTest.php41
-rw-r--r--apps/settings/tests/Controller/UsersControllerTest.php34
15 files changed, 348 insertions, 244 deletions
diff --git a/apps/settings/l10n/es_MX.js b/apps/settings/l10n/es_MX.js
index 2f58c920a21..7a75f34a5d2 100644
--- a/apps/settings/l10n/es_MX.js
+++ b/apps/settings/l10n/es_MX.js
@@ -372,6 +372,7 @@ OC.L10N.register(
"Background job did not run yet!" : "¡El trabajo en segundo plano no se ha ejecutado todavía!",
"AJAX" : "AJAX",
"Execute one task with each page loaded. Use case: Single account instance." : "Ejecutar una tarea con cada página cargada. Caso de uso: instancia de un solo usuario.",
+ "Webcron" : "Webcron",
"Cron (Recommended)" : "Cron (recomendado)",
"Use system cron service to call the cron.php file every 5 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 5 minutos.",
"The cron.php needs to be executed by the system account \"{user}\"." : "El cron.php debe ser ejecutado por el usuario del sistema \"{user}\".",
@@ -556,85 +557,201 @@ OC.L10N.register(
"Default quota" : "Cuota predeterminada",
"Select default quota" : "Establecer la cuota predeterminada",
"Passwordless authentication requires a secure connection." : "La autentificación sin contraseña requiere una conexión segura.",
+ "Add WebAuthn device" : "Añadir dispositivo WebAuthn",
+ "Please authorize your WebAuthn device." : "Por favor, autorice su dispositivo WebAuthn.",
+ "Name your device" : "Nombrar su dispositivo",
+ "Adding your device …" : "Añadiendo su dispositivo ...",
+ "Server error while trying to add WebAuthn device" : "Error en el servidor al intentar agregar el dispositivo WebAuthn",
+ "Server error while trying to complete WebAuthn device registration" : "Error en el servidor al intentar completar el registro del dispositivo WebAuthn",
"Unnamed device" : "Dispositivo sin nombre",
+ "Passwordless Authentication" : "Autentificación sin contraseña",
+ "Set up your account for passwordless authentication following the FIDO2 standard." : "Configure su cuenta para autentificación sin contraseña siguiendo el estándar FIDO2.",
+ "No devices configured." : "No hay dispositivos configurados.",
+ "The following devices are configured for your account:" : "Los siguientes dispositivos están configurados para su cuenta:",
+ "Your browser does not support WebAuthn." : "Su navegador no soporta WebAuthn.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, puedes hacer ajustes finos al comportamiento de compartir. Por favor consulta la documentación para más información. ",
+ "You need to enable the File sharing App." : "Debe habilitar la aplicación Compartir archivos.",
+ "{license}-licensed" : "Licenciado bajo {license}",
"Changelog" : "Bitácora de cambios",
+ "by {author}\n{license}" : "por {author}\n{license}",
+ "Account management" : "Administración de cuentas",
+ "New account" : "Nueva cuenta",
+ "Active accounts" : "Cuentas activas",
"Admins" : "Administradores",
"Disabled users" : "Usuarios deshabilitados",
+ "Creating group …" : "Creando grupo …",
+ "Create group" : "Crear grupo",
"Group name" : "Nombre del grupo",
+ "Please enter a valid group name" : "Por favor, ingrese un nombre de grupo válido",
+ "Disabled accounts" : "Cuentas deshabilitadas",
+ "Account group: {group}" : "Grupo de cuentas: {group}",
+ "Failed to create group" : "No se pudo crear el grupo",
"Sending…" : "Enviando...",
"Email sent" : "Correo electrónico enviado",
"Location" : "Ubicación",
"Profile picture" : "Foto de perfil",
"About" : "Acerca de",
"Full name" : "Nombre completo",
+ "Additional email" : "Correo electrónico adicional",
+ "Headline" : "Titular",
+ "Organisation" : "Organización",
"Phone number" : "Número de teléfono",
+ "Role" : "Cargo",
+ "X (formerly Twitter)" : "X (anteriormente Twitter)",
+ "Fediverse (e.g. Mastodon)" : "Fediverse (por ejemplo, Mastodon)",
"Website" : "Sitio web",
+ "Profile visibility" : "Visibilidad del perfil",
+ "Locale" : "Configuración regional",
+ "Not available as this property is required for core functionality including file sharing and calendar invitations" : "No disponible, ya que esta propiedad es necesaria para la funcionalidad básica, incluyendo el compartir archivos y las invitaciones de calendario.",
+ "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "No disponible, ya que la federación ha sido deshabilitada para su cuenta, contacte a su administrador del sistema si tiene alguna pregunta",
+ "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "No disponible, ya que no se permite la publicación de datos específicos de usuario en el servidor de búsqueda, póngase en contacto con el administrador del sistema si tiene alguna duda",
"Your apps" : "Tus aplicaciones",
+ "Active apps" : "Aplicaciones activas",
"Disabled apps" : "Aplicaciones deshabilitadas",
"Updates" : "Actualizaciones",
"App bundles" : "Paquetes de aplicación",
+ "Featured apps" : "Aplicaciones destacadas",
+ "Supported apps" : "Aplicaciones soportadas",
+ "Show to everyone" : "Mostrar a todos",
+ "Show to logged in accounts only" : "Mostrar únicamente a usuarios conectados",
"Hide" : "Ocultar",
+ "Download and enable" : "Descargar y habilitar",
+ "Allow untested app" : "Permitir aplicación no probada",
+ "The app will be downloaded from the App Store" : "La aplicación será descargada de la tienda de aplicaciones",
"Never" : "Nunca",
"Active users" : "Usuarios activos",
+ "An error occurred during the request. Unable to proceed." : "Ocurrió un error durante la solicitud. No se puede continuar.",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La aplicación ha sido habilitada pero necesita ser actualizada. Serás redireccionado a la página de actualización en 5 segundos. ",
+ "Error: This app cannot be enabled because it makes the server unstable" : "Error: Esta aplicación no se puede habilitar porque genera inestabilidad en el servidor",
+ "Do you really want to wipe your data from this device?" : "¿Realmente desea limpiar sus datos de este dispositivo?",
+ "Confirm wipe" : "Confirmar limpieza",
+ "Could not delete the app token" : "No se pudo eliminar el token de aplicación",
+ "Error while wiping the device with the token" : "Error al limpiar el dispositivo con el token",
+ "Error while updating device token name" : "Error al actualizar el nombre del token del dispositivo",
+ "Error while updating device token scope" : "Error al actualizar el alcance del token del dispositivo",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Hubieron demasiadas solicitudes desde su red. Vuelva a intentarlo más tarde o contacte a su administrador si se trata de un error.",
+ "Account documentation" : "Documentación de la cuenta",
+ "Administration documentation" : "Documentación de administración",
"Documentation" : "Documentación",
"Forum" : "Foro",
+ "Nextcloud help resources" : "Recursos de ayuda de Nextcloud",
+ "General documentation" : "Documentación general",
+ "None/STARTTLS" : "Ninguno/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Abrir documentación",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es importante preparar este servidor para poder enviar correos electrónicos, como para restablecer contraseñas y notificaciones. ",
"Send mode" : "Modo de envío",
"Encryption" : "Encripción",
+ "Sendmail mode" : "Modo de enviar correo",
"From address" : "De la dirección",
"Server address" : "Dirección del servidor",
"Port" : "Puerto",
"Authentication" : "Autenticación",
"Authentication required" : "Autenticación requerida",
"Credentials" : "Credenciales",
+ "SMTP Login" : "Inicio de sesión SMTP",
"SMTP Password" : "Contraseña SMTP",
"Save" : "Guardar",
+ "Test and verify email settings" : "Probar y verificar la configuración del correo electrónico",
"All checks passed." : "Pasaron todas las verificaciones. ",
+ "There are some errors regarding your setup." : "Hay algunos errores referentes a su configuración.",
+ "There are some warnings regarding your setup." : "Hay algunas advertencias referentes a su configuración.",
+ "Checking for system and security issues." : "Comprobando problemas del sistema y seguridad.",
+ "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "Revise la seguridad de su Nextcloud usando <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">nuestro escáner de seguridad ↗</a>.",
+ "Reasons to use Nextcloud in your organization" : "Razones para usar Nextcloud en su organización",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud {linkclose}, el {githubopen}código fuente {linkclose} está licenciado bajo {licenseopen}AGPL{linkclose}.",
"Like our Facebook page" : "Da un Like a nuestra página de Facebook",
"Follow us on Twitter" : "Síguenos en Twitter",
+ "Follow us on Mastodon" : "Síguenos en Mastodon",
"Check out our blog" : "Visita nuestro blog",
"Subscribe to our newsletter" : "Suscribete a nuestro boletín",
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "El lanzamiento de esta versión para la comunidad de Nextcloud no cuenta con soporte y las notificaciones instantáneas no están disponibles.",
+ "Use a second factor besides your password to increase security for your account." : "Use un segundo factor además de su contraseña para incrementar la seguridad de su cuenta. ",
"No user supplied" : "No se proporcionó usuario alguno",
"Please provide an admin recovery password; otherwise, all user data will be lost." : "Por favor proporciona una contraseña de recuperación de administrador; de lo contrario toda la información del usuario se perderá. ",
+ "Backend does not support password change, but the user's encryption key was updated." : "El backend no soporta el cambio de contraseñas, pero se actualizó la llave de cifrado del usuario.",
+ "installing and updating apps via the App Store or Federated Cloud Sharing" : "instalando y actualizando aplicaciones a través de la tienda de aplicaciones o el uso compartido federado en la nube",
"Federated Cloud Sharing" : "Compartir en la Nube Federada",
+ "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL está utilizando una versión desactualizada %1$sde (%2$s). Por favor, actualice su sistema operativo o las funciones como %3$s no funcionarán de manera confiable.",
+ "You need to set your user email before being able to send test emails. Go to %s for that." : "Necesita establecer su correo electrónico antes de poder enviar correos de prueba. Vaya a %s para hacerlo.",
"Invalid user" : "Usuario inválido",
"Your username is: %s" : "Tu Usuario es: %s",
"Logged in user must be a subadmin" : "El usuario firmado debe ser un subadministrador ",
+ "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Está pendiente una tarea en segundo plano que comprueba los certificados SSL de usuario importados. Por favor, vuelva a checar más tarde.",
"Enable all" : "Habilitar todo",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
"Google Chrome" : "Google Chrome",
"Safari" : "Safari",
+ "iPhone" : "iPhone",
+ "iPad" : "iPad",
"Sync client - {os}" : "Sync client - {os}",
"Error while deleting the token" : "Se presentó un error al borrar la ficha",
"Use the credentials below to configure your app or device." : "Usa las siguientes credenciales para configurar tu aplicación o dispositivo. ",
"For security reasons this password will only be shown once." : "Por razones de seguridad esta contraseña sólo se mostrará una vez. ",
"Copied!" : "¡Copiado!",
"Copy" : "Copiar",
+ "Execute one task with each page loaded. Use case: Single user instance." : "Ejecutar una tarea con cada página cargada. Caso de uso: instancia de un solo usuario.",
"To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para correr esto necesitas la extensión POSIX de PHP. Por favor ve la {linkstart}documentación de PHP{linkend} para más detalles. ",
+ "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 5 minutos. Recomendado para todas las instancias.",
+ "The cron.php needs to be executed by the system user \"{user}\"." : "El cron.php debe ser ejecutado por el usuario del sistema \"{user}\".",
+ "Enable or disable profile by default for new users." : "Habilitar o deshabilitar el perfil por defecto para nuevos usuarios.",
"You are about to remove the group {group}. The users will NOT be deleted." : "Estás a punto de eliminar el grupo {group}. Los usuarios NO serán borrados.",
"Please confirm the group removal " : "Por favor confirma la eliminación del grupo",
+ "Choose profile picture from files" : "Seleccionar la imagen de perfil desde archivos",
"png or jpg, max. 20 MB" : "png o jpg max. 20 MB",
"Your email address" : "Tu dirección de correo electrónico",
+ "Your location" : "Su ubicación",
+ "Enable Profile" : "Habilitar perfil",
"Your Twitter handle" : "Tu cuenta de Twitter",
"You do not have permissions to see the details of this user" : "No tienes los permisos para ver los detalles de este usuario",
+ "Add new password" : " Añadir nueva contraseña",
+ "Add new email address" : "Añadir nueva dirección de correo electrónico",
+ "Set user as admin for" : "Establecer al usuario como administrador de",
+ "Select user quota" : "Seleccionar la cuota de usuario",
+ "Toggle user actions menu" : "Alternar menú de acciones de usuario",
"Delete user" : "Borrar usuario",
"Disable user" : "Deshabilitar usuario",
"Enable user" : "Habilitar usuario",
+ "Edit User" : "Editar usuario",
+ "Will be autogenerated" : "Será autogenerado",
+ "Add a new user" : "Añadir nuevo usuario",
+ "No users in here" : "No hay usuarios aquí",
+ "Enter group name" : "Ingrese el nombre del grupo",
"Add group" : "Agregar grupo",
+ "Default quota:" : "Cuota predeterminada:",
+ "Show Languages" : "Mostrar idiomas",
"Show user backend" : "Mostrar backend del usuario",
"Send email to new user" : "Enviar un correo electrónico al usuario nuevo",
"Not saved" : "No guardado",
"Twitter" : "Twitter",
+ "Not available as federation has been disabled for your account, contact your system administrator if you have any questions" : "No disponible, ya que la federación ha sido deshabilitada para su cuenta, contacte a su administrador del sistema si tiene alguna pregunta",
+ "Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "No disponible, ya que no se permite la publicación de datos específicos de usuario en el servidor de búsqueda, póngase en contacto con el administrador del sistema si tiene alguna duda",
+ "Show to logged in users only" : "Mostrar únicamente a usuarios conectados",
+ "Enable untested app" : "Habilitar aplicación no probada",
"SMTP Username" : "Usuario SMTP",
- "Set default expiration date" : "Establecer la fecha de expiración predeterminada"
+ "Expire after" : "Caduca tras",
+ "day(s)" : "día(s)",
+ "Exclude groups from password requirements:" : "Excluir grupos de los requisitos de contraseña:",
+ "Set default expiration date" : "Establecer la fecha de expiración predeterminada",
+ "Exclude groups from creating link shares:" : "Excluir grupos de la creación de enlaces compartidos:",
+ "Allow username autocompletion in share dialog" : "Permitir el autocompletado usuario en el diálogo de compartir",
+ "Allow username autocompletion to users within the same groups" : "Permitir el autocompletado para usuarios en los mismos grupos",
+ "Edit display name" : "Editar el nombre para mostrar",
+ "Select manager" : "Seleccionar administrador",
+ "User's table" : "Tabla de usuario",
+ "Select user manager" : "Seleccionar al administrador del usuario",
+ "Old user imported certificates" : "Certificados antiguos de usuario importados",
+ "Overwrite cli URL" : "Sobrescribir el URL de la línea de comandos",
+ "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "A esta instancia le faltan algunos módulos PHP recomendados. Para mejorar el rendimiento y la compatibilidad, se recomienda encarecidamente instalarlos: %s.",
+ "You are about to remove the group \"{group}\". The users will NOT be deleted." : "Está a punto de eliminar el grupo \"{group}\". Los usuarios NO serán eliminados.",
+ "No users" : "Sin usuarios",
+ "Loading user …" : "Cargando usuario ...",
+ "Failed to update user manager" : "No se pudo actualizar el gerente del usuario",
+ "User management settings" : "Ajustes de administración de usuarios",
+ "Send welcome email to new users" : "Enviar correo de bienvenida a usuarios nuevos",
+ "User management" : "Administración de usuarios",
+ "User group: {group}" : "Grupo del usuario: {group}"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/apps/settings/l10n/es_MX.json b/apps/settings/l10n/es_MX.json
index 6644e38b14e..a68a2cff2a8 100644
--- a/apps/settings/l10n/es_MX.json
+++ b/apps/settings/l10n/es_MX.json
@@ -370,6 +370,7 @@
"Background job did not run yet!" : "¡El trabajo en segundo plano no se ha ejecutado todavía!",
"AJAX" : "AJAX",
"Execute one task with each page loaded. Use case: Single account instance." : "Ejecutar una tarea con cada página cargada. Caso de uso: instancia de un solo usuario.",
+ "Webcron" : "Webcron",
"Cron (Recommended)" : "Cron (recomendado)",
"Use system cron service to call the cron.php file every 5 minutes." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 5 minutos.",
"The cron.php needs to be executed by the system account \"{user}\"." : "El cron.php debe ser ejecutado por el usuario del sistema \"{user}\".",
@@ -554,85 +555,201 @@
"Default quota" : "Cuota predeterminada",
"Select default quota" : "Establecer la cuota predeterminada",
"Passwordless authentication requires a secure connection." : "La autentificación sin contraseña requiere una conexión segura.",
+ "Add WebAuthn device" : "Añadir dispositivo WebAuthn",
+ "Please authorize your WebAuthn device." : "Por favor, autorice su dispositivo WebAuthn.",
+ "Name your device" : "Nombrar su dispositivo",
+ "Adding your device …" : "Añadiendo su dispositivo ...",
+ "Server error while trying to add WebAuthn device" : "Error en el servidor al intentar agregar el dispositivo WebAuthn",
+ "Server error while trying to complete WebAuthn device registration" : "Error en el servidor al intentar completar el registro del dispositivo WebAuthn",
"Unnamed device" : "Dispositivo sin nombre",
+ "Passwordless Authentication" : "Autentificación sin contraseña",
+ "Set up your account for passwordless authentication following the FIDO2 standard." : "Configure su cuenta para autentificación sin contraseña siguiendo el estándar FIDO2.",
+ "No devices configured." : "No hay dispositivos configurados.",
+ "The following devices are configured for your account:" : "Los siguientes dispositivos están configurados para su cuenta:",
+ "Your browser does not support WebAuthn." : "Su navegador no soporta WebAuthn.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, puedes hacer ajustes finos al comportamiento de compartir. Por favor consulta la documentación para más información. ",
+ "You need to enable the File sharing App." : "Debe habilitar la aplicación Compartir archivos.",
+ "{license}-licensed" : "Licenciado bajo {license}",
"Changelog" : "Bitácora de cambios",
+ "by {author}\n{license}" : "por {author}\n{license}",
+ "Account management" : "Administración de cuentas",
+ "New account" : "Nueva cuenta",
+ "Active accounts" : "Cuentas activas",
"Admins" : "Administradores",
"Disabled users" : "Usuarios deshabilitados",
+ "Creating group …" : "Creando grupo …",
+ "Create group" : "Crear grupo",
"Group name" : "Nombre del grupo",
+ "Please enter a valid group name" : "Por favor, ingrese un nombre de grupo válido",
+ "Disabled accounts" : "Cuentas deshabilitadas",
+ "Account group: {group}" : "Grupo de cuentas: {group}",
+ "Failed to create group" : "No se pudo crear el grupo",
"Sending…" : "Enviando...",
"Email sent" : "Correo electrónico enviado",
"Location" : "Ubicación",
"Profile picture" : "Foto de perfil",
"About" : "Acerca de",
"Full name" : "Nombre completo",
+ "Additional email" : "Correo electrónico adicional",
+ "Headline" : "Titular",
+ "Organisation" : "Organización",
"Phone number" : "Número de teléfono",
+ "Role" : "Cargo",
+ "X (formerly Twitter)" : "X (anteriormente Twitter)",
+ "Fediverse (e.g. Mastodon)" : "Fediverse (por ejemplo, Mastodon)",
"Website" : "Sitio web",
+ "Profile visibility" : "Visibilidad del perfil",
+ "Locale" : "Configuración regional",
+ "Not available as this property is required for core functionality including file sharing and calendar invitations" : "No disponible, ya que esta propiedad es necesaria para la funcionalidad básica, incluyendo el compartir archivos y las invitaciones de calendario.",
+ "Not available as federation has been disabled for your account, contact your system administration if you have any questions" : "No disponible, ya que la federación ha sido deshabilitada para su cuenta, contacte a su administrador del sistema si tiene alguna pregunta",
+ "Not available as publishing account specific data to the lookup server is not allowed, contact your system administration if you have any questions" : "No disponible, ya que no se permite la publicación de datos específicos de usuario en el servidor de búsqueda, póngase en contacto con el administrador del sistema si tiene alguna duda",
"Your apps" : "Tus aplicaciones",
+ "Active apps" : "Aplicaciones activas",
"Disabled apps" : "Aplicaciones deshabilitadas",
"Updates" : "Actualizaciones",
"App bundles" : "Paquetes de aplicación",
+ "Featured apps" : "Aplicaciones destacadas",
+ "Supported apps" : "Aplicaciones soportadas",
+ "Show to everyone" : "Mostrar a todos",
+ "Show to logged in accounts only" : "Mostrar únicamente a usuarios conectados",
"Hide" : "Ocultar",
+ "Download and enable" : "Descargar y habilitar",
+ "Allow untested app" : "Permitir aplicación no probada",
+ "The app will be downloaded from the App Store" : "La aplicación será descargada de la tienda de aplicaciones",
"Never" : "Nunca",
"Active users" : "Usuarios activos",
+ "An error occurred during the request. Unable to proceed." : "Ocurrió un error durante la solicitud. No se puede continuar.",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La aplicación ha sido habilitada pero necesita ser actualizada. Serás redireccionado a la página de actualización en 5 segundos. ",
+ "Error: This app cannot be enabled because it makes the server unstable" : "Error: Esta aplicación no se puede habilitar porque genera inestabilidad en el servidor",
+ "Do you really want to wipe your data from this device?" : "¿Realmente desea limpiar sus datos de este dispositivo?",
+ "Confirm wipe" : "Confirmar limpieza",
+ "Could not delete the app token" : "No se pudo eliminar el token de aplicación",
+ "Error while wiping the device with the token" : "Error al limpiar el dispositivo con el token",
+ "Error while updating device token name" : "Error al actualizar el nombre del token del dispositivo",
+ "Error while updating device token scope" : "Error al actualizar el alcance del token del dispositivo",
"There were too many requests from your network. Retry later or contact your administrator if this is an error." : "Hubieron demasiadas solicitudes desde su red. Vuelva a intentarlo más tarde o contacte a su administrador si se trata de un error.",
+ "Account documentation" : "Documentación de la cuenta",
+ "Administration documentation" : "Documentación de administración",
"Documentation" : "Documentación",
"Forum" : "Foro",
+ "Nextcloud help resources" : "Recursos de ayuda de Nextcloud",
+ "General documentation" : "Documentación general",
+ "None/STARTTLS" : "Ninguno/STARTTLS",
"SSL" : "SSL",
"Open documentation" : "Abrir documentación",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es importante preparar este servidor para poder enviar correos electrónicos, como para restablecer contraseñas y notificaciones. ",
"Send mode" : "Modo de envío",
"Encryption" : "Encripción",
+ "Sendmail mode" : "Modo de enviar correo",
"From address" : "De la dirección",
"Server address" : "Dirección del servidor",
"Port" : "Puerto",
"Authentication" : "Autenticación",
"Authentication required" : "Autenticación requerida",
"Credentials" : "Credenciales",
+ "SMTP Login" : "Inicio de sesión SMTP",
"SMTP Password" : "Contraseña SMTP",
"Save" : "Guardar",
+ "Test and verify email settings" : "Probar y verificar la configuración del correo electrónico",
"All checks passed." : "Pasaron todas las verificaciones. ",
+ "There are some errors regarding your setup." : "Hay algunos errores referentes a su configuración.",
+ "There are some warnings regarding your setup." : "Hay algunas advertencias referentes a su configuración.",
+ "Checking for system and security issues." : "Comprobando problemas del sistema y seguridad.",
+ "Check the security of your Nextcloud over <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">our security scan ↗</a>." : "Revise la seguridad de su Nextcloud usando <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"%s\">nuestro escáner de seguridad ↗</a>.",
+ "Reasons to use Nextcloud in your organization" : "Razones para usar Nextcloud en su organización",
"Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud {linkclose}, el {githubopen}código fuente {linkclose} está licenciado bajo {licenseopen}AGPL{linkclose}.",
"Like our Facebook page" : "Da un Like a nuestra página de Facebook",
"Follow us on Twitter" : "Síguenos en Twitter",
+ "Follow us on Mastodon" : "Síguenos en Mastodon",
"Check out our blog" : "Visita nuestro blog",
"Subscribe to our newsletter" : "Suscribete a nuestro boletín",
"This community release of Nextcloud is unsupported and instant notifications are unavailable." : "El lanzamiento de esta versión para la comunidad de Nextcloud no cuenta con soporte y las notificaciones instantáneas no están disponibles.",
+ "Use a second factor besides your password to increase security for your account." : "Use un segundo factor además de su contraseña para incrementar la seguridad de su cuenta. ",
"No user supplied" : "No se proporcionó usuario alguno",
"Please provide an admin recovery password; otherwise, all user data will be lost." : "Por favor proporciona una contraseña de recuperación de administrador; de lo contrario toda la información del usuario se perderá. ",
+ "Backend does not support password change, but the user's encryption key was updated." : "El backend no soporta el cambio de contraseñas, pero se actualizó la llave de cifrado del usuario.",
+ "installing and updating apps via the App Store or Federated Cloud Sharing" : "instalando y actualizando aplicaciones a través de la tienda de aplicaciones o el uso compartido federado en la nube",
"Federated Cloud Sharing" : "Compartir en la Nube Federada",
+ "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cURL está utilizando una versión desactualizada %1$sde (%2$s). Por favor, actualice su sistema operativo o las funciones como %3$s no funcionarán de manera confiable.",
+ "You need to set your user email before being able to send test emails. Go to %s for that." : "Necesita establecer su correo electrónico antes de poder enviar correos de prueba. Vaya a %s para hacerlo.",
"Invalid user" : "Usuario inválido",
"Your username is: %s" : "Tu Usuario es: %s",
"Logged in user must be a subadmin" : "El usuario firmado debe ser un subadministrador ",
+ "A background job is pending that checks for user imported SSL certificates. Please check back later." : "Está pendiente una tarea en segundo plano que comprueba los certificados SSL de usuario importados. Por favor, vuelva a checar más tarde.",
"Enable all" : "Habilitar todo",
"Internet Explorer" : "Internet Explorer",
"Edge" : "Edge",
"Firefox" : "Firefox",
"Google Chrome" : "Google Chrome",
"Safari" : "Safari",
+ "iPhone" : "iPhone",
+ "iPad" : "iPad",
"Sync client - {os}" : "Sync client - {os}",
"Error while deleting the token" : "Se presentó un error al borrar la ficha",
"Use the credentials below to configure your app or device." : "Usa las siguientes credenciales para configurar tu aplicación o dispositivo. ",
"For security reasons this password will only be shown once." : "Por razones de seguridad esta contraseña sólo se mostrará una vez. ",
"Copied!" : "¡Copiado!",
"Copy" : "Copiar",
+ "Execute one task with each page loaded. Use case: Single user instance." : "Ejecutar una tarea con cada página cargada. Caso de uso: instancia de un solo usuario.",
"To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para correr esto necesitas la extensión POSIX de PHP. Por favor ve la {linkstart}documentación de PHP{linkend} para más detalles. ",
+ "Use system cron service to call the cron.php file every 5 minutes. Recommended for all instances." : "Usar el servicio cron del sistema para llamar al archivo cron.php cada 5 minutos. Recomendado para todas las instancias.",
+ "The cron.php needs to be executed by the system user \"{user}\"." : "El cron.php debe ser ejecutado por el usuario del sistema \"{user}\".",
+ "Enable or disable profile by default for new users." : "Habilitar o deshabilitar el perfil por defecto para nuevos usuarios.",
"You are about to remove the group {group}. The users will NOT be deleted." : "Estás a punto de eliminar el grupo {group}. Los usuarios NO serán borrados.",
"Please confirm the group removal " : "Por favor confirma la eliminación del grupo",
+ "Choose profile picture from files" : "Seleccionar la imagen de perfil desde archivos",
"png or jpg, max. 20 MB" : "png o jpg max. 20 MB",
"Your email address" : "Tu dirección de correo electrónico",
+ "Your location" : "Su ubicación",
+ "Enable Profile" : "Habilitar perfil",
"Your Twitter handle" : "Tu cuenta de Twitter",
"You do not have permissions to see the details of this user" : "No tienes los permisos para ver los detalles de este usuario",
+ "Add new password" : " Añadir nueva contraseña",
+ "Add new email address" : "Añadir nueva dirección de correo electrónico",
+ "Set user as admin for" : "Establecer al usuario como administrador de",
+ "Select user quota" : "Seleccionar la cuota de usuario",
+ "Toggle user actions menu" : "Alternar menú de acciones de usuario",
"Delete user" : "Borrar usuario",
"Disable user" : "Deshabilitar usuario",
"Enable user" : "Habilitar usuario",
+ "Edit User" : "Editar usuario",
+ "Will be autogenerated" : "Será autogenerado",
+ "Add a new user" : "Añadir nuevo usuario",
+ "No users in here" : "No hay usuarios aquí",
+ "Enter group name" : "Ingrese el nombre del grupo",
"Add group" : "Agregar grupo",
+ "Default quota:" : "Cuota predeterminada:",
+ "Show Languages" : "Mostrar idiomas",
"Show user backend" : "Mostrar backend del usuario",
"Send email to new user" : "Enviar un correo electrónico al usuario nuevo",
"Not saved" : "No guardado",
"Twitter" : "Twitter",
+ "Not available as federation has been disabled for your account, contact your system administrator if you have any questions" : "No disponible, ya que la federación ha sido deshabilitada para su cuenta, contacte a su administrador del sistema si tiene alguna pregunta",
+ "Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "No disponible, ya que no se permite la publicación de datos específicos de usuario en el servidor de búsqueda, póngase en contacto con el administrador del sistema si tiene alguna duda",
+ "Show to logged in users only" : "Mostrar únicamente a usuarios conectados",
+ "Enable untested app" : "Habilitar aplicación no probada",
"SMTP Username" : "Usuario SMTP",
- "Set default expiration date" : "Establecer la fecha de expiración predeterminada"
+ "Expire after" : "Caduca tras",
+ "day(s)" : "día(s)",
+ "Exclude groups from password requirements:" : "Excluir grupos de los requisitos de contraseña:",
+ "Set default expiration date" : "Establecer la fecha de expiración predeterminada",
+ "Exclude groups from creating link shares:" : "Excluir grupos de la creación de enlaces compartidos:",
+ "Allow username autocompletion in share dialog" : "Permitir el autocompletado usuario en el diálogo de compartir",
+ "Allow username autocompletion to users within the same groups" : "Permitir el autocompletado para usuarios en los mismos grupos",
+ "Edit display name" : "Editar el nombre para mostrar",
+ "Select manager" : "Seleccionar administrador",
+ "User's table" : "Tabla de usuario",
+ "Select user manager" : "Seleccionar al administrador del usuario",
+ "Old user imported certificates" : "Certificados antiguos de usuario importados",
+ "Overwrite cli URL" : "Sobrescribir el URL de la línea de comandos",
+ "This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "A esta instancia le faltan algunos módulos PHP recomendados. Para mejorar el rendimiento y la compatibilidad, se recomienda encarecidamente instalarlos: %s.",
+ "You are about to remove the group \"{group}\". The users will NOT be deleted." : "Está a punto de eliminar el grupo \"{group}\". Los usuarios NO serán eliminados.",
+ "No users" : "Sin usuarios",
+ "Loading user …" : "Cargando usuario ...",
+ "Failed to update user manager" : "No se pudo actualizar el gerente del usuario",
+ "User management settings" : "Ajustes de administración de usuarios",
+ "Send welcome email to new users" : "Enviar correo de bienvenida a usuarios nuevos",
+ "User management" : "Administración de usuarios",
+ "User group: {group}" : "Grupo del usuario: {group}"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/settings/lib/Controller/AppSettingsController.php b/apps/settings/lib/Controller/AppSettingsController.php
index 1e4387bdcfd..6e1850001fb 100644
--- a/apps/settings/lib/Controller/AppSettingsController.php
+++ b/apps/settings/lib/Controller/AppSettingsController.php
@@ -47,6 +47,7 @@ use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Services\IInitialState;
use OCP\IConfig;
use OCP\IL10N;
use OCP\INavigationManager;
@@ -58,72 +59,26 @@ use Psr\Log\LoggerInterface;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class AppSettingsController extends Controller {
- /** @var \OCP\IL10N */
- private $l10n;
- /** @var IConfig */
- private $config;
- /** @var INavigationManager */
- private $navigationManager;
- /** @var IAppManager */
- private $appManager;
- /** @var CategoryFetcher */
- private $categoryFetcher;
- /** @var AppFetcher */
- private $appFetcher;
- /** @var IFactory */
- private $l10nFactory;
- /** @var BundleFetcher */
- private $bundleFetcher;
- /** @var Installer */
- private $installer;
- /** @var IURLGenerator */
- private $urlGenerator;
- /** @var LoggerInterface */
- private $logger;
-
/** @var array */
private $allApps = [];
- /**
- * @param string $appName
- * @param IRequest $request
- * @param IL10N $l10n
- * @param IConfig $config
- * @param INavigationManager $navigationManager
- * @param IAppManager $appManager
- * @param CategoryFetcher $categoryFetcher
- * @param AppFetcher $appFetcher
- * @param IFactory $l10nFactory
- * @param BundleFetcher $bundleFetcher
- * @param Installer $installer
- * @param IURLGenerator $urlGenerator
- * @param LoggerInterface $logger
- */
- public function __construct(string $appName,
+ public function __construct(
+ string $appName,
IRequest $request,
- IL10N $l10n,
- IConfig $config,
- INavigationManager $navigationManager,
- IAppManager $appManager,
- CategoryFetcher $categoryFetcher,
- AppFetcher $appFetcher,
- IFactory $l10nFactory,
- BundleFetcher $bundleFetcher,
- Installer $installer,
- IURLGenerator $urlGenerator,
- LoggerInterface $logger) {
+ private IL10N $l10n,
+ private IConfig $config,
+ private INavigationManager $navigationManager,
+ private IAppManager $appManager,
+ private CategoryFetcher $categoryFetcher,
+ private AppFetcher $appFetcher,
+ private IFactory $l10nFactory,
+ private BundleFetcher $bundleFetcher,
+ private Installer $installer,
+ private IURLGenerator $urlGenerator,
+ private LoggerInterface $logger,
+ private IInitialState $initialState,
+ ) {
parent::__construct($appName, $request);
- $this->l10n = $l10n;
- $this->config = $config;
- $this->navigationManager = $navigationManager;
- $this->appManager = $appManager;
- $this->categoryFetcher = $categoryFetcher;
- $this->appFetcher = $appFetcher;
- $this->l10nFactory = $l10nFactory;
- $this->bundleFetcher = $bundleFetcher;
- $this->installer = $installer;
- $this->urlGenerator = $urlGenerator;
- $this->logger = $logger;
}
/**
@@ -132,18 +87,22 @@ class AppSettingsController extends Controller {
* @return TemplateResponse
*/
public function viewApps(): TemplateResponse {
- $params = [];
- $params['appstoreEnabled'] = $this->config->getSystemValueBool('appstoreenabled', true);
- $params['updateCount'] = count($this->getAppsWithUpdates());
- $params['developerDocumentation'] = $this->urlGenerator->linkToDocs('developer-manual');
- $params['bundles'] = $this->getBundles();
$this->navigationManager->setActiveEntry('core_apps');
- $templateResponse = new TemplateResponse('settings', 'settings-vue', ['serverData' => $params, 'pageTitle' => $this->l10n->t('Apps')]);
+ $this->initialState->provideInitialState('appstoreEnabled', $this->config->getSystemValueBool('appstoreenabled', true));
+ $this->initialState->provideInitialState('appstoreBundles', $this->getBundles());
+ $this->initialState->provideInitialState('appstoreDeveloperDocs', $this->urlGenerator->linkToDocs('developer-manual'));
+ $this->initialState->provideInitialState('appstoreUpdateCount', count($this->getAppsWithUpdates()));
+
$policy = new ContentSecurityPolicy();
$policy->addAllowedImageDomain('https://usercontent.apps.nextcloud.com');
+
+ $templateResponse = new TemplateResponse('settings', 'settings/empty', ['pageTitle' => $this->l10n->t('Apps')]);
$templateResponse->setContentSecurityPolicy($policy);
+ \OCP\Util::addStyle('settings', 'settings');
+ \OCP\Util::addScript('settings', 'vue-settings-apps-users-management');
+
return $templateResponse;
}
@@ -184,17 +143,11 @@ class AppSettingsController extends Controller {
private function getAllCategories() {
$currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
- $formattedCategories = [];
$categories = $this->categoryFetcher->get();
- foreach ($categories as $category) {
- $formattedCategories[] = [
- 'id' => $category['id'],
- 'ident' => $category['id'],
- 'displayName' => $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name'],
- ];
- }
-
- return $formattedCategories;
+ return array_map(fn ($category) => [
+ 'id' => $category['id'],
+ 'displayName' => $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name'],
+ ], $categories);
}
private function fetchApps() {
diff --git a/apps/settings/lib/Controller/UsersController.php b/apps/settings/lib/Controller/UsersController.php
index c6abe6bff4f..238f08590b5 100644
--- a/apps/settings/lib/Controller/UsersController.php
+++ b/apps/settings/lib/Controller/UsersController.php
@@ -33,8 +33,6 @@ declare(strict_types=1);
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-// FIXME: disabled for now to be able to inject IGroupManager and also use
-// getSubAdmin()
namespace OCA\Settings\Controller;
@@ -42,9 +40,7 @@ use InvalidArgumentException;
use OC\AppFramework\Http;
use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
use OC\ForbiddenException;
-use OC\Group\Manager as GroupManager;
use OC\KnownUser\KnownUserService;
-use OC\L10N\Factory;
use OC\Security\IdentityProof\Manager;
use OC\User\Manager as UserManager;
use OCA\Settings\BackgroundJobs\VerifyUserData;
@@ -59,6 +55,7 @@ use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Services\IInitialState;
use OCP\BackgroundJob\IJobList;
use OCP\Encryption\IManager;
use OCP\EventDispatcher\IEventDispatcher;
@@ -67,7 +64,6 @@ use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IUser;
-use OCP\IUserManager;
use OCP\IUserSession;
use OCP\L10N\IFactory;
use OCP\Mail\IMailer;
@@ -75,73 +71,28 @@ use function in_array;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class UsersController extends Controller {
- /** @var UserManager */
- private $userManager;
- /** @var GroupManager */
- private $groupManager;
- /** @var IUserSession */
- private $userSession;
- /** @var IConfig */
- private $config;
- /** @var bool */
- private $isAdmin;
- /** @var IL10N */
- private $l10n;
- /** @var IMailer */
- private $mailer;
- /** @var Factory */
- private $l10nFactory;
- /** @var IAppManager */
- private $appManager;
- /** @var IAccountManager */
- private $accountManager;
- /** @var Manager */
- private $keyManager;
- /** @var IJobList */
- private $jobList;
- /** @var IManager */
- private $encryptionManager;
- /** @var KnownUserService */
- private $knownUserService;
- /** @var IEventDispatcher */
- private $dispatcher;
-
public function __construct(
string $appName,
IRequest $request,
- IUserManager $userManager,
- IGroupManager $groupManager,
- IUserSession $userSession,
- IConfig $config,
- bool $isAdmin,
- IL10N $l10n,
- IMailer $mailer,
- IFactory $l10nFactory,
- IAppManager $appManager,
- IAccountManager $accountManager,
- Manager $keyManager,
- IJobList $jobList,
- IManager $encryptionManager,
- KnownUserService $knownUserService,
- IEventDispatcher $dispatcher
+ private UserManager $userManager,
+ private IGroupManager $groupManager,
+ private IUserSession $userSession,
+ private IConfig $config,
+ private bool $isAdmin,
+ private IL10N $l10n,
+ private IMailer $mailer,
+ private IFactory $l10nFactory,
+ private IAppManager $appManager,
+ private IAccountManager $accountManager,
+ private Manager $keyManager,
+ private IJobList $jobList,
+ private IManager $encryptionManager,
+ private KnownUserService $knownUserService,
+ private IEventDispatcher $dispatcher,
+ private IInitialState $initialState,
) {
parent::__construct($appName, $request);
- $this->userManager = $userManager;
- $this->groupManager = $groupManager;
- $this->userSession = $userSession;
- $this->config = $config;
- $this->isAdmin = $isAdmin;
- $this->l10n = $l10n;
- $this->mailer = $mailer;
- $this->l10nFactory = $l10nFactory;
- $this->appManager = $appManager;
- $this->accountManager = $accountManager;
- $this->keyManager = $keyManager;
- $this->jobList = $jobList;
- $this->encryptionManager = $encryptionManager;
- $this->knownUserService = $knownUserService;
- $this->dispatcher = $dispatcher;
}
@@ -231,6 +182,7 @@ class UsersController extends Controller {
$userCount -= 1; // we also lower from one the total count
}
}
+
$userCount += $this->userManager->countUsersOfGroups($groupsInfo->getGroups());
$disabledUsers = $this->userManager->countDisabledUsersOfGroups($groupsNames);
}
@@ -280,7 +232,12 @@ class UsersController extends Controller {
$serverData['newUserRequireEmail'] = $this->config->getAppValue('core', 'newUser.requireEmail', 'no') === 'yes';
$serverData['newUserSendEmail'] = $this->config->getAppValue('core', 'newUser.sendEmail', 'yes') === 'yes';
- return new TemplateResponse('settings', 'settings-vue', ['serverData' => $serverData, 'pageTitle' => $this->l10n->t('Users')]);
+ $this->initialState->provideInitialState('usersSettings', $serverData);
+
+ \OCP\Util::addStyle('settings', 'settings');
+ \OCP\Util::addScript('settings', 'vue-settings-apps-users-management');
+
+ return new TemplateResponse('settings', 'settings/empty', ['pageTitle' => $this->l10n->t('Users')]);
}
/**
diff --git a/apps/settings/src/App.vue b/apps/settings/src/App.vue
index f7f81da5063..21565aea9ad 100644
--- a/apps/settings/src/App.vue
+++ b/apps/settings/src/App.vue
@@ -27,12 +27,5 @@
<script>
export default {
name: 'App',
- beforeMount() {
- // importing server data into the store
- const serverDataElmt = document.getElementById('serverData')
- if (serverDataElmt !== null) {
- this.$store.commit('setServerData', JSON.parse(document.getElementById('serverData').dataset.server))
- }
- },
}
</script>
diff --git a/apps/settings/src/components/AppList.vue b/apps/settings/src/components/AppList.vue
index 18c4331e0f9..ca32b9f0495 100644
--- a/apps/settings/src/components/AppList.vue
+++ b/apps/settings/src/components/AppList.vue
@@ -204,7 +204,7 @@ export default {
})
},
bundles() {
- return this.$store.getters.getServerData.bundles.filter(bundle => this.bundleApps(bundle.id).length > 0)
+ return this.$store.getters.getAppBundles.filter(bundle => this.bundleApps(bundle.id).length > 0)
},
bundleApps() {
return function(bundle) {
diff --git a/apps/settings/src/store/apps.js b/apps/settings/src/store/apps.js
index d1c5be8034f..0b71367c3b2 100644
--- a/apps/settings/src/store/apps.js
+++ b/apps/settings/src/store/apps.js
@@ -26,11 +26,13 @@ import api from './api.js'
import Vue from 'vue'
import { generateUrl } from '@nextcloud/router'
import { showError, showInfo } from '@nextcloud/dialogs'
+import { loadState } from '@nextcloud/initial-state'
const state = {
apps: [],
+ bundles: loadState('settings', 'appstoreBundles', []),
categories: [],
- updateCount: 0,
+ updateCount: loadState('settings', 'appstoreUpdateCount', 0),
loading: {},
loadingList: false,
gettingCategoriesPromise: null,
@@ -164,6 +166,9 @@ const getters = {
getAllApps(state) {
return state.apps
},
+ getAppBundles(state) {
+ return state.bundles
+ },
getUpdateCount(state) {
return state.updateCount
},
diff --git a/apps/settings/src/store/index.js b/apps/settings/src/store/index.js
index abb1f374691..7f477d3882d 100644
--- a/apps/settings/src/store/index.js
+++ b/apps/settings/src/store/index.js
@@ -25,7 +25,7 @@ import Vue from 'vue'
import Vuex, { Store } from 'vuex'
import users from './users.js'
import apps from './apps.js'
-import settings from './settings.js'
+import settings from './users-settings.js'
import oc from './oc.js'
import { showError } from '@nextcloud/dialogs'
diff --git a/apps/settings/src/store/settings.js b/apps/settings/src/store/users-settings.js
index 28d40a08028..275c7f40bf0 100644
--- a/apps/settings/src/store/settings.js
+++ b/apps/settings/src/store/users-settings.js
@@ -20,8 +20,10 @@
*
*/
+import { loadState } from '@nextcloud/initial-state'
+
const state = {
- serverData: {},
+ serverData: loadState('settings', 'usersSettings', {}),
}
const mutations = {
setServerData(state, data) {
diff --git a/apps/settings/src/store/users.js b/apps/settings/src/store/users.js
index 499aa73170d..e0ed4e2b3bf 100644
--- a/apps/settings/src/store/users.js
+++ b/apps/settings/src/store/users.js
@@ -32,7 +32,7 @@ import axios from '@nextcloud/axios'
import { generateOcsUrl } from '@nextcloud/router'
import { getCapabilities } from '@nextcloud/capabilities'
import logger from '../logger.js'
-import { parseFileSize } from "@nextcloud/files"
+import { parseFileSize } from '@nextcloud/files'
const orderGroups = function(groups, orderBy) {
/* const SORT_USERCOUNT = 1;
diff --git a/apps/settings/src/views/Apps.vue b/apps/settings/src/views/Apps.vue
index b5cfad5632f..b88afdde4e8 100644
--- a/apps/settings/src/views/Apps.vue
+++ b/apps/settings/src/views/Apps.vue
@@ -65,18 +65,18 @@
<NcAppNavigationSpacer />
<!-- App store categories -->
- <template v-if="settings.appstoreEnabled">
+ <template v-if="appstoreEnabled">
<NcAppNavigationItem id="app-category-featured"
:to="{ name: 'apps-category', params: { category: 'featured' } }"
icon="icon-favorite"
:name="$options.APPS_SECTION_ENUM.featured" />
<NcAppNavigationItem v-for="cat in categories"
- :key="'icon-category-' + cat.ident"
- :icon="'icon-category-' + cat.ident"
+ :key="'icon-category-' + cat.id"
+ :icon="'icon-category-' + cat.id"
:to="{
name: 'apps-category',
- params: { category: cat.ident },
+ params: { category: cat.id },
}"
:name="cat.displayName" />
</template>
@@ -165,9 +165,13 @@ import AppScore from '../components/AppList/AppScore.vue'
import Markdown from '../components/Markdown.vue'
import { APPS_SECTION_ENUM } from './../constants/AppsConstants.js'
+import { loadState } from '@nextcloud/initial-state'
Vue.use(VueLocalStorage)
+const appstoreEnabled = loadState('settings', 'appstoreEnabled')
+const developerDocumentation = loadState('settings', 'appstoreDeveloperDocs')
+
export default {
name: 'Apps',
APPS_SECTION_ENUM,
@@ -208,6 +212,9 @@ export default {
},
computed: {
+ appstoreEnabled() {
+ return appstoreEnabled
+ },
pageHeading() {
if (this.$options.APPS_SECTION_ENUM[this.category]) {
return this.$options.APPS_SECTION_ENUM[this.category]
@@ -233,9 +240,6 @@ export default {
updateCount() {
return this.$store.getters.getUpdateCount
},
- settings() {
- return this.$store.getters.getServerData
- },
hasRating() {
return this.app.appstoreData && this.app.appstoreData.ratingNumOverall > 5
@@ -302,7 +306,6 @@ export default {
this.$store.dispatch('getCategories', { shouldRefetchCategories: true })
this.$store.dispatch('getAllApps')
this.$store.dispatch('getGroups', { offset: 0, limit: 5 })
- this.$store.commit('setUpdateCount', this.$store.getters.getServerData.updateCount)
},
mounted() {
@@ -329,7 +332,7 @@ export default {
})
},
openDeveloperDocumentation() {
- window.open(this.settings.developerDocumentation)
+ window.open(developerDocumentation)
},
},
}
diff --git a/apps/settings/templates/settings-vue.php b/apps/settings/templates/settings-vue.php
deleted file mode 100644
index 8db9dc6286b..00000000000
--- a/apps/settings/templates/settings-vue.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @author John Molakvoæ <skjnldsv@protonmail.com>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-script('settings', 'vue-settings-apps-users-management');
-style('settings', 'settings');
-
-// Do we have some data to inject ?
-if (is_array($_['serverData'])) {
- ?>
-<span id="serverData" data-server="<?php p(json_encode($_['serverData'])); ?>"></span>
-<?php
-} ?>
diff --git a/apps/settings/templates/settings/empty.php b/apps/settings/templates/settings/empty.php
index 59e3098e3de..d0a2f9c77c4 100644
--- a/apps/settings/templates/settings/empty.php
+++ b/apps/settings/templates/settings/empty.php
@@ -4,7 +4,7 @@
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
*
- * @license GNU AGPL version 3 or any later version
+ * @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@@ -21,4 +21,4 @@
*
*/
-# used for Personal/Additional settings as fallback for legacy settings
+// Empty template as Vue will take over the `id="conent"` of the base template element
diff --git a/apps/settings/tests/Controller/AppSettingsControllerTest.php b/apps/settings/tests/Controller/AppSettingsControllerTest.php
index 8d0dae223d3..fd22d176075 100644
--- a/apps/settings/tests/Controller/AppSettingsControllerTest.php
+++ b/apps/settings/tests/Controller/AppSettingsControllerTest.php
@@ -37,6 +37,7 @@ use OCP\App\IAppManager;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Services\IInitialState;
use OCP\IConfig;
use OCP\IL10N;
use OCP\INavigationManager;
@@ -81,6 +82,8 @@ class AppSettingsControllerTest extends TestCase {
private $urlGenerator;
/** @var LoggerInterface|MockObject */
private $logger;
+ /** @var IInitialState|MockObject */
+ private $initialState;
protected function setUp(): void {
parent::setUp();
@@ -100,6 +103,7 @@ class AppSettingsControllerTest extends TestCase {
$this->installer = $this->createMock(Installer::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->logger = $this->createMock(LoggerInterface::class);
+ $this->initialState = $this->createMock(IInitialState::class);
$this->appSettingsController = new AppSettingsController(
'settings',
@@ -114,7 +118,8 @@ class AppSettingsControllerTest extends TestCase {
$this->bundleFetcher,
$this->installer,
$this->urlGenerator,
- $this->logger
+ $this->logger,
+ $this->initialState,
);
}
@@ -125,52 +130,42 @@ class AppSettingsControllerTest extends TestCase {
$expected = new JSONResponse([
[
'id' => 'auth',
- 'ident' => 'auth',
'displayName' => 'Authentication & authorization',
],
[
'id' => 'customization',
- 'ident' => 'customization',
'displayName' => 'Customization',
],
[
'id' => 'files',
- 'ident' => 'files',
'displayName' => 'Files',
],
[
'id' => 'integration',
- 'ident' => 'integration',
'displayName' => 'Integration',
],
[
'id' => 'monitoring',
- 'ident' => 'monitoring',
'displayName' => 'Monitoring',
],
[
'id' => 'multimedia',
- 'ident' => 'multimedia',
'displayName' => 'Multimedia',
],
[
'id' => 'office',
- 'ident' => 'office',
'displayName' => 'Office & text',
],
[
'id' => 'organization',
- 'ident' => 'organization',
'displayName' => 'Organization',
],
[
'id' => 'social',
- 'ident' => 'social',
'displayName' => 'Social & communication',
],
[
'id' => 'tools',
- 'ident' => 'tools',
'displayName' => 'Tools',
],
]);
@@ -198,18 +193,16 @@ class AppSettingsControllerTest extends TestCase {
->method('setActiveEntry')
->with('core_apps');
+ $this->initialState
+ ->expects($this->exactly(4))
+ ->method('provideInitialState');
+
$policy = new ContentSecurityPolicy();
$policy->addAllowedImageDomain('https://usercontent.apps.nextcloud.com');
$expected = new TemplateResponse('settings',
- 'settings-vue',
+ 'settings/empty',
[
- 'serverData' => [
- 'updateCount' => 0,
- 'appstoreEnabled' => true,
- 'bundles' => [],
- 'developerDocumentation' => ''
- ],
'pageTitle' => 'Apps'
],
'user');
@@ -233,18 +226,16 @@ class AppSettingsControllerTest extends TestCase {
->method('setActiveEntry')
->with('core_apps');
+ $this->initialState
+ ->expects($this->exactly(4))
+ ->method('provideInitialState');
+
$policy = new ContentSecurityPolicy();
$policy->addAllowedImageDomain('https://usercontent.apps.nextcloud.com');
$expected = new TemplateResponse('settings',
- 'settings-vue',
+ 'settings/empty',
[
- 'serverData' => [
- 'updateCount' => 0,
- 'appstoreEnabled' => false,
- 'bundles' => [],
- 'developerDocumentation' => ''
- ],
'pageTitle' => 'Apps'
],
'user');
diff --git a/apps/settings/tests/Controller/UsersControllerTest.php b/apps/settings/tests/Controller/UsersControllerTest.php
index eddb290212a..93feba01c60 100644
--- a/apps/settings/tests/Controller/UsersControllerTest.php
+++ b/apps/settings/tests/Controller/UsersControllerTest.php
@@ -35,6 +35,7 @@ use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
use OC\ForbiddenException;
use OC\Group\Manager;
use OC\KnownUser\KnownUserService;
+use OC\User\Manager as UserManager;
use OCA\Settings\Controller\UsersController;
use OCP\Accounts\IAccount;
use OCP\Accounts\IAccountManager;
@@ -42,21 +43,19 @@ use OCP\Accounts\IAccountProperty;
use OCP\Accounts\PropertyDoesNotExistException;
use OCP\App\IAppManager;
use OCP\AppFramework\Http;
+use OCP\AppFramework\Services\IInitialState;
use OCP\BackgroundJob\IJobList;
use OCP\Encryption\IEncryptionModule;
use OCP\Encryption\IManager;
use OCP\EventDispatcher\IEventDispatcher;
-use OCP\IAvatarManager;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IRequest;
use OCP\IUser;
-use OCP\IUserManager;
use OCP\IUserSession;
use OCP\L10N\IFactory;
use OCP\Mail\IMailer;
-use OCP\Security\ISecureRandom;
use PHPUnit\Framework\MockObject\MockObject;
/**
@@ -67,7 +66,7 @@ use PHPUnit\Framework\MockObject\MockObject;
class UsersControllerTest extends \Test\TestCase {
/** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */
private $groupManager;
- /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var UserManager|\PHPUnit\Framework\MockObject\MockObject */
private $userManager;
/** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */
private $userSession;
@@ -79,33 +78,29 @@ class UsersControllerTest extends \Test\TestCase {
private $l10nFactory;
/** @var IAppManager|\PHPUnit\Framework\MockObject\MockObject */
private $appManager;
- /** @var IAvatarManager|\PHPUnit\Framework\MockObject\MockObject */
- private $avatarManager;
/** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */
private $l;
- /** @var AccountManager | \PHPUnit\Framework\MockObject\MockObject */
+ /** @var AccountManager|\PHPUnit\Framework\MockObject\MockObject */
private $accountManager;
- /** @var ISecureRandom | \PHPUnit\Framework\MockObject\MockObject */
- private $secureRandom;
- /** @var \OCA\Settings\Mailer\NewUserMailHelper|\PHPUnit\Framework\MockObject\MockObject */
- private $newUserMailHelper;
/** @var IJobList | \PHPUnit\Framework\MockObject\MockObject */
private $jobList;
- /** @var \OC\Security\IdentityProof\Manager |\PHPUnit\Framework\MockObject\MockObject */
+ /** @var \OC\Security\IdentityProof\Manager|\PHPUnit\Framework\MockObject\MockObject */
private $securityManager;
- /** @var IManager | \PHPUnit\Framework\MockObject\MockObject */
+ /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */
private $encryptionManager;
/** @var KnownUserService|\PHPUnit\Framework\MockObject\MockObject */
private $knownUserService;
- /** @var IEncryptionModule | \PHPUnit\Framework\MockObject\MockObject */
+ /** @var IEncryptionModule|\PHPUnit\Framework\MockObject\MockObject */
private $encryptionModule;
/** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */
private $dispatcher;
+ /** @var IInitialState|\PHPUnit\Framework\MockObject\MockObject*/
+ private $initialState;
protected function setUp(): void {
parent::setUp();
- $this->userManager = $this->createMock(IUserManager::class);
+ $this->userManager = $this->createMock(UserManager::class);
$this->groupManager = $this->createMock(Manager::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->config = $this->createMock(IConfig::class);
@@ -119,6 +114,7 @@ class UsersControllerTest extends \Test\TestCase {
$this->encryptionManager = $this->createMock(IManager::class);
$this->knownUserService = $this->createMock(KnownUserService::class);
$this->dispatcher = $this->createMock(IEventDispatcher::class);
+ $this->initialState = $this->createMock(IInitialState::class);
$this->l->method('t')
->willReturnCallback(function ($text, $parameters = []) {
@@ -155,7 +151,8 @@ class UsersControllerTest extends \Test\TestCase {
$this->jobList,
$this->encryptionManager,
$this->knownUserService,
- $this->dispatcher
+ $this->dispatcher,
+ $this->initialState,
);
} else {
return $this->getMockBuilder(UsersController::class)
@@ -177,9 +174,10 @@ class UsersControllerTest extends \Test\TestCase {
$this->jobList,
$this->encryptionManager,
$this->knownUserService,
- $this->dispatcher
+ $this->dispatcher,
+ $this->initialState,
]
- )->setMethods($mockedMethods)->getMock();
+ )->onlyMethods($mockedMethods)->getMock();
}
}