diff options
Diffstat (limited to 'apps/settings')
-rw-r--r-- | apps/settings/l10n/es_MX.js | 119 | ||||
-rw-r--r-- | apps/settings/l10n/es_MX.json | 119 | ||||
-rw-r--r-- | apps/settings/lib/Controller/AppSettingsController.php | 107 | ||||
-rw-r--r-- | apps/settings/lib/Controller/UsersController.php | 91 | ||||
-rw-r--r-- | apps/settings/src/App.vue | 7 | ||||
-rw-r--r-- | apps/settings/src/components/AppList.vue | 2 | ||||
-rw-r--r-- | apps/settings/src/store/apps.js | 7 | ||||
-rw-r--r-- | apps/settings/src/store/index.js | 2 | ||||
-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.js | 2 | ||||
-rw-r--r-- | apps/settings/src/views/Apps.vue | 21 | ||||
-rw-r--r-- | apps/settings/templates/settings-vue.php | 32 | ||||
-rw-r--r-- | apps/settings/templates/settings/empty.php | 4 | ||||
-rw-r--r-- | apps/settings/tests/Controller/AppSettingsControllerTest.php | 41 | ||||
-rw-r--r-- | apps/settings/tests/Controller/UsersControllerTest.php | 34 |
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(); } } |