diff --git a/doc/es_ES/analytics-tasks.markdown b/doc/es_ES/analytics-tasks.markdown new file mode 100644 index 000000000..fb2d347f5 --- /dev/null +++ b/doc/es_ES/analytics-tasks.markdown @@ -0,0 +1,24 @@ +Análisis para tareas +=================== + +Cada tarea tiene una sección de análisis disponible en el menu izquierdo en la vista de tarea. + +Espera y tiempo de ciclo +------------------- + + + +- El tiempo de espera es el tiempo entre la creacion de la tarea y la fecha de finalización (Tarea cerrada). +- El tiempo de ciclo es el tiempo entre la fecha de inicio y la fecha de finalización. +- Si la tarea no esta cerrada el tiempo actual es usado en lugar de la fecha de finalización. +- Si la fecha de inicio no es especificada, el tiempo de ciclo no es calculado. + +Nota: Puede configurar una accion automatica para definir la fecha de inicio automaticamente cuando se mueve una tarea a la columna de su eleccion. + +El tiempo invertido en cada columna +--------------------------- + + + +- Esta gráfico muestra el total de tiempo invertido en cada columna para la tarea. +- El tiempo invertido es calculado hasta que la tarea es cerrada. diff --git a/doc/es_ES/board-collapsed-expanded.markdown b/doc/es_ES/board-collapsed-expanded.markdown new file mode 100644 index 000000000..a8ba2beb8 --- /dev/null +++ b/doc/es_ES/board-collapsed-expanded.markdown @@ -0,0 +1,18 @@ +Modo colapsar y expandir +=========================== + +Las tares en el tablero pueden visualizarse en modo colapsado o en modo expandido. +El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"s"** o usar el menu drop-down que esta parte superior izquierda. + +Modo de colapsado +-------------- + + + +- Si la tarea es asignada a alguien, las iniciales de la persona se muestran junto al número de tareas +- Si el titulo de la tarea es demasiado largo, tu puedes poner el puntero del ratón sobre la tarea de mostrar una información sobre herramientas con el título completo + +Modo expansivo +-------------- + + diff --git a/doc/es_ES/board-configuration.markdown b/doc/es_ES/board-configuration.markdown new file mode 100644 index 000000000..112ebc216 --- /dev/null +++ b/doc/es_ES/board-configuration.markdown @@ -0,0 +1,25 @@ +Configuración del tablero +========================== + +Ir al menu **Configuraciones **, elije **Ajustes de tablero ** a la izquierda. + + + +### Resaltado de tarea + +Esta caracterista muestra una sombra alrededor de la tarea cuando una tarea se trasladó recientemente + +Establecer el valor 0 para desactivar esta caracterista, 2 dias por default (172800 segundos). + +Todo lo trasladó desde de 2 dias tendra una sombra alrededor de la tarea. + +### Recargar el intervalo para la pizarra publica + +Cuando tu compartes un tablero, la pagina se refresca cada 60 segundos automaticamente por default. + +### Refrescar el intervalo para un tablero privado + +Cuando su navegador está abierto un tablero, Kanboard comprueba cada 10 segundos si algo ha sido cambiado por otra persona. + +Técnicamente este proceso se lleva a cabo por el Ajax. + diff --git a/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown b/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown new file mode 100644 index 000000000..9dab532a6 --- /dev/null +++ b/doc/es_ES/board-horizontal-scrolling-and-compact-view.markdown @@ -0,0 +1,12 @@ +Horizontal scrolling y modo compacto +===================================== + +Cuando el tablero no puede caber en su pantalla , una barra de scroll horizontal +When the board cannot fit on your screen, a horizontal scroll bar aparecerá en la parte inferior. + +Sin embargo, es posible cambiar a una vista de modo compacto para visualizar todas las columnas en su pantalla. + + + +Cambiar entre scrolling y vista compacta +El cambio entre el desplazamiento horizontal y la vista compacta se puede hacer con la combinación de teclas **"c"** o usar el menu drop-down que esta parte superior izquierda. diff --git a/doc/es_ES/board-show-hide-columns.markdown b/doc/es_ES/board-show-hide-columns.markdown new file mode 100644 index 000000000..6700b9877 --- /dev/null +++ b/doc/es_ES/board-show-hide-columns.markdown @@ -0,0 +1,12 @@ +Mostrar y ocultar columnas en el tablero +================================== + +Se puede ocultar o visualizar columnas muy facilmente en el tablero: + + + +Para ocultar una columna, click en la columna escoge en el menu dropdown "ocultar esta columna" : + + + +Para mostar nuevamente la columna, click en el icono con el simbolo de suma "plus icon" diff --git a/doc/es_ES/contributing.markdown b/doc/es_ES/contributing.markdown new file mode 100644 index 000000000..7f18e6eb5 --- /dev/null +++ b/doc/es_ES/contributing.markdown @@ -0,0 +1,67 @@ +Directrices del contribuyente +====================== + +¿Cómo puedo ayudar? +----------------- + +Kanboard no es perfecto, pero hay muchas maneras de ayudar: + +- Dar opinión +- Informar de los errores +- Añadir o actualizar traducciones +- Mejorar la documentación +- Código de Escritura +- Dile a tus amigos que Kanboard es impresionante + +Antes de hacer cualquier empresa grande, abrir un nuevo tema y explicar su propuesta. + +Quiero dar retroalimentación +----------------------- +- Usted piensa que algo debe ser mejorado (interface de usuario, peticiones de caracterÃsticas) +- Comprobar si aún no se propuso su idea +- Abrir un nuevo tema +- Describir su idea +- Puede también hacer un voto con +1 en las propuestas existentes + +Quiero informar de un error +--------------------------- + +- Compruebe si el problema no se ha comunicado anteriormente +- Abrir un nuevo ticket +- Explicar lo que está roto +- Describir la forma de reproducir el error +- Describir su entorno (versión Kanboard, sistema operativo, servidor web, Versión de PHP , la versión de la base de datos, el proveedor de alojamiento)} + +Deseo traducir Kanboard +---------------------------- +Kanboard se traduce en muchos idiomas. + +Sin embargo, las traducciones no están completas, observe la [guÃa de traducción para contribuir] (https://kanboard.net/documentation/translations). + + +Quiero mejorar la documentación +----------------------------------- +- ¿Crees que algo no está claro, existen errores gramaticales, errores tipográficos, otra cosa ? +- La documentación está escrita en Markdown y se almacena en la carpeta `docs`. +- Editar los archivos y enviar un Pull-Request +- La documentación se sincroniza con el repositorio y el sitio web oficial . + +Quiero contribuir al código +-------------------------------- +Los pulls son siempre bienvenidos , al ser aceptado se tiene que seguir estas directrices: + +- ** Antes de hacer cualquier cambio grande o propuesta de diseño, abrir un nuevo ticket en comenzar una discusión **. +- Si desea agregar una nueva función, respetar la filosofÃa detrás de Kanboard. ** Nos centramos en la simplicidad **, no queremos tener un software sobrecargado . +- Lo mismo se aplica para la interface de usuario, ** ** simplicidad y eficiencia. +- Enviar un solo pull por caracterÃstica o corrección de errores. +- Un pull más pequeño es más fácil y más rápido para revisar y fusionarlo. +- Asegurarse [ de hacer las pruebas unitarias (tests.markdown). +- Respetar los [estandares de codificación] (coding-standards.markdown). +- Escribir código mantenible, evitar la duplicación de código, usar las buenas practicas de PHP. +En cualquier caso, si no está seguro acerca de algo abierto crear un uevo ticket. + +Dile a tus amigos que Kanboard es impresionante +--------------------------------------------- + +Si utiliza Kanboard, corre la voz que le rodean. +Diles que es software libre y de código abierto esto es cool. diff --git a/doc/es_ES/plugin-authentication-architecture.markdown b/doc/es_ES/plugin-authentication-architecture.markdown new file mode 100644 index 000000000..86069aa06 --- /dev/null +++ b/doc/es_ES/plugin-authentication-architecture.markdown @@ -0,0 +1,99 @@ +Arquitectura de autenticación +============================= + +Kanboard provee una flexible y conectable arquitectura de autenticación. + +Por default, el usuario puede autenticarse con multiple metodos: + +- Autenticación por usuario y password (Base de datos local y LDAP) +- Autenticación OAuth2 +- Autenticación Reverse-Proxy +- Autenticación basada en Cookie (Recuerdame) + +Además, despues de una autenticación satisfactoria un puede hacerse post de autenticación Two-Factor . +Kanboard sopoarta nativamente el standart TOTP. + +Interfaces de autenticación +---------------------------- + +Para tener un sistema conectable, los drivers de autenticación deben implementar un conjunto de interfaces + +| Interface | Rol | +|------------------------------------------|------------------------------------------------------------------| +| AuthenticationProviderInterface | Interface base para otras interfaces de autenticación | +| PreAuthenticationProviderInterface | The user is already authenticated al alcanzar la aplicación, Usualmente los servidores web definen algunas variables de entorno | +| PasswordAuthenticationProviderInterface | El metodo de autenticación que usa el username y password provienen del formulario de login | +| OAuthAuthenticationProviderInterface | Proveedores OAuth2 | +| PostAuthenticationProviderInterface | Drivers de autenticación Two-Factor ,pide el código a confirmar | +| SessionCheckProviderInterface | Los proveedores que son capaces de comprobar si la sesión de usuario es válida | + +### Ejemplos de autenticación de proveedores: + +- Database por default metodos a implementar `PasswordAuthenticationProviderInterface` y `SessionCheckProviderInterface` +- Reverse-Proxy metodos a implementar `PreAuthenticationProviderInterface` y `SessionCheckProviderInterface` +- Google metodos a implementar `OAuthAuthenticationProviderInterface` +- LDAP metodos a implementar `PasswordAuthenticationProviderInterface` +- RememberMe cookie metodos a implementar `PreAuthenticationProviderInterface` +- Two-Factor TOTP metodos a implementar `PostAuthenticationProviderInterface` + +flujo de trabajo de autenticación ** Workflow ** +------------------------------------------------ + +Para cada peticion HTTP: + +1. Si la sesión de usuario esta abierta, ejecuta el registro de proveedores que implementa`SessionCheckProviderInterface` +2. Ejecuta todos los proveedores que implementa `PreAuthenticationProviderInterface` +3. Si el usuario final hace un submit al formulario del login, Los proveedores que implementa `PasswordAuthenticationProviderInterface` are executed +4. Si el usuario final quiere usar OAuth2, el selecciona el proveedor a ejecutar +5. Despues de una autenticación satisfactoria, el ultimo registro utilizará `PostAuthenticationProviderInterface` +6. Sincronizar la información del usuario si es necesario + +Este workflow es manejado por la clase `Kanboard\Core\Security\AuthenticationManager`. + +Eventos disparados: + +- `AuthenticationManager::EVENT_SUCCESS`: autenticación satisfactoria +- `AuthenticationManager::EVENT_FAILURE`: autenticación fallida + +Cada vez que se produce un evento de fallo , el contador de intentos fallidos se incrementa. + +La cuenta de usuario se puede bloquear para el período de tiempo configurado y un captcha puede ser mostrado para evitar ataques de fuerza bruta . + +Interface de usuario del proveedor +--------------------------------- + +Cuando la autenticación es satisfactoria, la `AuthenticationManager` pedura la información del usuario para que el driver llame al metodo `getUser()`. +Este metodo debe regresar un objeto que implementa la interface `Kanboard\Core\User\UserProviderInterface`. + +Esta clase abstracta reune la información dede otro sistema. + +Ejemplos : + +- `DatabaseUserProvider` proporciona información para un usuario interno +- `LdapUserProvider` para un usuario LDAP +- `ReverseProxyUserProvider` para un usuario Reverse-Proxy +- `GoogleUserProvider` represtan un usuario de Google + +Los métodos para la interface del proveedor de Usuario: + +- `isUserCreationAllowed()`: Regresa true para permitir la creación automática de usuarios +- `getExternalIdColumn()`: Obtener Identificación del nombre de la columna externa (google_id, github_id, gitlab_id...) +- `getInternalId()`: Obtener el id interno de la base de datos +- `getExternalId()`: Obtener el id externo(Unique id) +- `getRole()`: Obtener el rol de usuario +- `getUsername()`: Obtener en nombre de usuario ** username ** +- `getName()`: Obtener nombre completo del usuario +- `getEmail()`: Obtener el correo electronico del usuario +- `getExternalGroupIds()`: Obtiene los ids externos del grupo, automáticamente sincroniza la membresia del grupo y la presenta +- `getExtraAttributes()`: Obtiene los atributos extras para ser mostrados a el usuario durante la sincronización local + +No es obligatorio que el metodo devuelva un valor. + +Sincronización de un usuario local +---------------------------------- + +La información del usuario puede ser sincronizada automáticamente con la base de datos local. + +- Si el metodo`getInternalId()` regresa un valor no realiza la sincronización +- Los metodos `getExternalIdColumn()` y `getExternalId()` debe regresar un valor para sincronizar el usuario +- Las propiedades que regresan un ** String ** vacios no se sincronizan diff --git a/doc/es_ES/plugin-authentication.markdown b/doc/es_ES/plugin-authentication.markdown new file mode 100644 index 000000000..057421560 --- /dev/null +++ b/doc/es_ES/plugin-authentication.markdown @@ -0,0 +1,42 @@ +Plugin de autenticación +===================== + +EL nuevo backend de autenticación se puede escribir con muy pocas lineas de codigo. + +Registro de proveedores +----------------------- + +En el metodo `initialize()` nuestro plugin, llama al metodo `register()` de la clase `AuthenticationManager`: + +```php +public function initialize() +{ + $this->authenticationManager->register(new ReverseProxyLdapAuth($this->container)); +} +``` + +El objeto proveniente de el metodo `register()` debe implementar one de las interfaces de autenticación predefidas. + +Esas interfaces estan definidas en los namespace `Kanboard\Core\Security`: + +- `Kanboard\Core\Security\PreAuthenticationProviderInterface` +- `Kanboard\Core\Security\PostAuthenticationProviderInterface` +- `Kanboard\Core\Security\PasswordAuthenticationProviderInterface` +- `Kanboard\Core\Security\OAuthAuthenticationProviderInterface` + + + +El único requisito es implementar las interfaces, la clase se puede escribir de la manera deseada y situado en cualquier lugar en el disco + +Usuario del proveedor +---------------------- + +Cuando la autenticación es satisfactoria, tu driver debe regresar un objato que representa al usuario. +Este objeto debe implementasr la interface `Kanboard\Core\User\UserProviderInterface`. + +Ejemplo de plugin de autenticación +---------------------------------- + +- [Autenticación de proveedores incluido en kanboard](https://github.com/kanboard/kanboard/tree/master/app/Auth) +- [Reverse-Proxy Autenticación con soporte LDAP](https://github.com/kanboard/plugin-reverse-proxy-ldap) +- [Two-Factor Autenticación SMS](https://github.com/kanboard/plugin-sms-2fa) diff --git a/doc/es_ES/plugin-authorization-architecture.markdown b/doc/es_ES/plugin-authorization-architecture.markdown new file mode 100644 index 000000000..884e90aa0 --- /dev/null +++ b/doc/es_ES/plugin-authorization-architecture.markdown @@ -0,0 +1,39 @@ +Arquitecuta de autorización +=========================== + +Kanboard [soporta multiples roles](roles.markdown) a nivel de aplicación y a nivel de proyecto. + +Workflow de autorización +-------------------------- + +Para cada solicitud HTTP: + +1. Autorizar o no el acceso a los recursos en base a la lista de acceso a las aplicaciones +2. Si el recurso es para un projecto (board, tarea...): + 1. Extrae los roles de usuario para este proyecto + 2. Permitir/Denegar accesos basados en el mapa de acceso del proyecto + +Extendiendo mapa de accesos +--------------------------- + +Lista de accesos (ACL) se basa en el nombre de clase del controlador y el nombre del método +La lista de acceso está a cargo de la clase `Kanboard\Core\Security\AccessMap`. + +Hay dos mapa de acceso: una para la aplicación y la otra para un proyecto. + +- Acceso al mapa de aplicación : `$this->applicationAccessMap` +- Acceso al mapa del proyecto: `$this->projectAccessMap` + +Ejemplos para definir una nueva política para tu plugin: + +```php +// Todos los metodos de la clase MyController: +$this->projectAccessMap->add('MyController', '*', Role::PROJECT_MANAGER); + +// Todos los metodos: +$this->projectAccessMap->add('MyOtherController', array('create', 'save'), Role::PROJECT_MEMBER); +``` + +Los roles estan defidos en la clase `Kanboard\Core\Security\Role`. + +Clase de autorización (`Kanboard\Core\Security\Authorization`) comprobará el acceso de cada página. diff --git a/doc/es_ES/plugin-automatic-actions.markdown b/doc/es_ES/plugin-automatic-actions.markdown new file mode 100644 index 000000000..6e0a9b657 --- /dev/null +++ b/doc/es_ES/plugin-automatic-actions.markdown @@ -0,0 +1,61 @@ +Agregando acciones automáticas +=============================== + +Agregando una nueva acccion automática es bastante simple. + +Creando una nueva accion +------------------------ + +Tus acciones automáticas deben heradarse de la clase `Kanboard\Action\Base`. + +Varios métodos abstractos deben ser implementadas por sí mismo: + +| Metodos | Descripción | +|-------------------------------------|------------------------------------------------------------------| +| `getDescription()` | Descripcion visible en la interface del usuario | +| `getCompatibleEvents()` | Obtener las listas de eventos compatibles | +| `getActionRequiredParameters()` | Obtener los parametros requeridos para la acción (definidos por el usuario)| +| `getEventRequiredParameters()` | Obtener los parametros requeridos para el evento | +| `doAction(array $data)` | Ejecutar la acción, Debe regresar true si fue satisfactorio | +| `hasRequiredCondition(array $data)` | Comprobar si los datos de eventos cumplen la condición de acción | + +Tu accion automatica es identificada en kanboard utilizando el nombre de la clase absoluta con el espacio de nombre incluido + +Agregando nuevos eventos +------------------------ + +La lista de eventos de la aplicación está disponible en la clase `Kanboard\Core\Event\EventManager::getAll()`. +Sin embargo, si tu plugin dispara nuevos eventos, tu puedes registrar estos eventos : + +```php +$this->actionManager->getAction('\Kanboard\Plugin\MyPlugin\MyActionName')->addEvent('my.event', 'My event description'); +``` + +Tu puedes extender la lista de eventos compatibles de acciones existentes para ser usada en algun metodo. + +Registra la acción +---------------------- + +Tu tienes que llamar el metodo `register()` desde la clase `Kanboard\Core\Action\ActionManager`: + +```php +actionManager->register(new TaskRename($this->container)); + } +} +``` + +Ejemplo +------- + +- [Ejemplo de acción automatica](https://github.com/kanboard/plugin-example-automatic-action) diff --git a/doc/es_ES/plugin-avatar-provider.markdown b/doc/es_ES/plugin-avatar-provider.markdown new file mode 100644 index 000000000..2cce06471 --- /dev/null +++ b/doc/es_ES/plugin-avatar-provider.markdown @@ -0,0 +1,32 @@ +Agregando un nuevo avatar del proveedor +======================================= + +Registrar +------------ + +```php +$this->avatarManager->register(new CustomAvatarProvider()); +``` + +Interface +--------- + +El proveedor debe implementar la interface `Kanboard\Core\User\Avatar\AvatarProviderInterface`: + + +| Metodo | Descripcion | +|-------------------------------|---------------------------------------------------------------| +| `render(array $user, $size)` | Renderizar HTML | +| `isActive(array $user)` | Regresa un boolean si el proveedor esta activo | + + +El argumento `$user` es un directorio que contiene estas llaves : + +```php +[ + 'id' => 123, + 'username' => 'admin', + 'name' => 'Administrator', + 'email' => 'me@localhost', +] +``` diff --git a/doc/es_ES/plugin-directory.markdown b/doc/es_ES/plugin-directory.markdown new file mode 100644 index 000000000..a7ce114cd --- /dev/null +++ b/doc/es_ES/plugin-directory.markdown @@ -0,0 +1,15 @@ +Plugin de configuración del directorio +====================================== + +Para instalar, actualizar y eliminar plugins dede la interface de usuario, debes tener estos requerimientos: + +- El directorio del plugin debe ser de escritura por el usuario del servidor web +- La extensión Zip debe estar disponible en tu server. +- Los parametros de configuración `PLUGIN_INSTALLER` deben estar en `true` + +Para desactivar esta función , cambie el valor de `PLUGIN_INSTALLER` a `false` en tu archivo de configuración. +También puede cambiar los permisos de la carpeta Plugin en el filesystem. + +Sólo los administradores pueden instalar plugins desde la interfaz de usuario. + +Por defecto, sólo plug-in que aparece en la página web de Kanboard están disponibles . diff --git a/doc/es_ES/plugin-events.markdown b/doc/es_ES/plugin-events.markdown new file mode 100644 index 000000000..1f8bdc24b --- /dev/null +++ b/doc/es_ES/plugin-events.markdown @@ -0,0 +1,27 @@ +Uso de eventos +=============== + +Kanboard usar internamente el [ Componente EventDispatcher de Symfony ](https://symfony.com/doc/2.3/components/event_dispatcher/index.html) para manegar internamente los eventos. + +Eventos escucha ** Listening ** +------------------------------- + +```php +$this->on('app.bootstrap', function($container) { + // tu codigo +}); +``` + +- El primer argumento es el nombre del evento (string) +- El segundo argumento es una funcion PHP callable (finalización o metodos de la clase) + +Agregando un nuevo evento +------------------------- + +Para agregar un nuevo, tienes que llamar al metodo `register()` de la clase `Kanboard\Core\Event\EventManager`: + +```php +$this->eventManager->register('my.event.name', 'Mi descripcion del nuevo evento'); +``` + +Estos eventos pueden ser utilizados por otros componentes de Kanboard como acciones automáticas . diff --git a/doc/es_ES/plugin-external-link.markdown b/doc/es_ES/plugin-external-link.markdown new file mode 100644 index 000000000..343712a66 --- /dev/null +++ b/doc/es_ES/plugin-external-link.markdown @@ -0,0 +1,79 @@ +Vinculación externa de proveedores +================================== + +Esta funcionalidad le permite vincular una tarea a los elementos adicionales almacenados en otro sistema. + +Por ejemplo, tu puedes vincular una tarea a: +For example, you can link a task to: + +- Una pagina web tradicional +- Datos adjuntos (Documentos PDF almacenados en la web, archivos ...) +- Cualquier sitema de tickets (bug tracker, soporte personalizado de tickets...) + +Cada item tiene un tipo, u na URL, un tipo dedependencia y un titulo. + +Por default,Kanboard incluye dos tipos de proveedores + +- Vinculación Web : Copiar y pegar un enlace y Kanboard se ha podido ir a la página de título de forma automática. +- Datos adjuntos: Enlace a todo lo que no es una página web + +Flujo de trabajo ** Workflow ** +-------------------------------- + +1. El usuario final copia y pega el URL al submit del formulario. +2.- Si el tipo de link es "auto", Kanboard crea un bucle a través de todos los proveedores registrados hasta que hay una coincidencia +3. Entonces , el proveedor de enlace devuelve un objeto que implementa la interfaz de `ExternalLinkInterface` +4. El formulario se muestra al usuario con todos los datos precargados antes de guardar el enlace + +Interfaces +---------- + +Para implementar un nuevo vinculo al proveedor desde un plugin, es necesario crear 2 clases que implementarlas en las interfaces: + +- `Kanboard\Core\ExternalLink\ExternalLinkProviderInterface` +- `Kanboard\Core\ExternalLink\ExternalLinkInterface` + +### ExternalLinkProviderInterface + +| Method | Usage | +|----------------------------|---------------------------------------------------------------------------------| +| `getName()` | Obtener el nombre del proveedor(label) | +| `getType()` | Obtener el tipo de link (se guardarán en la base de datos) | +| `getDependencies()` | Obtener un diccionario de los tipos de dependencia soportados por el proveedor | +| `setUserTextInput($input)` | Texto introducido por el usuario | +| `match()` | Regresa true si el proveedor puede analizar correctamente la entrada del usuario| +| `getLink()` | Obtener el enlace que se encuentra con las propiedades | + +### ExternalLinkInterface + +| Method | Usage | +|-------------------|-----------------------------| +| `getTitle()` | Obtiene un titulo de link | +| `getUrl()` | Obtiene una link de URL | +| `setUrl($url)` | URL del enlace | + +El registro de un nuevo proveedor de enlace +------------------------------------------ + +En tu `Plugin.php`, solo puedes llamar al metodo `register()` desde el objeto `ExternalLinkManager`: + +```php +externalLinkManager->register(new MyLinkProvider()); + } +} +``` + +Ejemplos +-------- + +- Kanboard incluye proveedores por default "WebLink" y "Attachment" diff --git a/doc/es_ES/plugin-group-provider.markdown b/doc/es_ES/plugin-group-provider.markdown new file mode 100644 index 000000000..dd7422499 --- /dev/null +++ b/doc/es_ES/plugin-group-provider.markdown @@ -0,0 +1,54 @@ +Personalizar grupos de proveedores +================================== + +Kanboard es capaz de cargar grupos de un sistema externo. +Esta caracteristica es principalmente usada para permisos de proyectos. + +Los **Projects Managers** pueden permitir el acceso a un proyecto para un grupo +El usuario final **end-user** utilizara una caja de autocomplementar y busquedas para un grupo + +Cada vez que se ejecuta una consulta de grupo , todos los proveedores de grupo registrados se ejecutan . + +Flujo de trabajo del Grupo de Proveedores **Workflow** +----------------------------------------------------- + +1. El usuario final **end-user** comienza a escribir el nombre del grupo y el campo se autocompleta +2. EL `GroupManager` la clase ejecuta la consulta para todos los proveedores de grupo registrados +3. Los resultados son fusionados y regresados a la interface de usuario +4. Antes de seleccionar un grupo, a información del grupo se sincronizan con la base de datos local si es necesario + +Interface del grupo de proveedores +---------------------------------- + +interface a implementar: `Kanboard\Core\Group\GroupProviderInterface`. + +Las clases que implementa esta interface abstracta del grupo de información, solo hay 3 metodos: + +- `getInternalId()`: Obtiene el id interno de la base de datos, de otra manera regresa 0 +- `getExternalId()`: Obtiene un id unico externo +- `getName()`: Obtiene el nombre de grupo + +Kanboard utilizará el ID externo para sincronizar con la base de datos local. + +Interface Backend del grupo de proveedores +------------------------------------------ +Interface a implementar: `Kanboard\Core\Group\GroupBackendProviderInterface`. + +Esta interface requiere solo un metodo: `find($input)`. +El argumento `$input` es el texto introducido desde la interfaz de usuario. + +Este metodo debe regresar una lista de `GroupProviderInterface`, es es el resultado de la busqueda. + +Backend de registro desde Plugins +--------------------------------- + +En el metodo `initialize()` de su plugins registrado se puede personalizar el backend : + +```php +$groupManager->register(new MyCustomLdapBackendGroupProvider($this->container)); +``` + +Ejemplos +-------- + +- [Kanboard incluye el grupo de provedores (LDAP y base de datos)](https://github.com/kanboard/kanboard/tree/master/app/Group) diff --git a/doc/es_ES/plugin-helpers.markdown b/doc/es_ES/plugin-helpers.markdown new file mode 100644 index 000000000..665910759 --- /dev/null +++ b/doc/es_ES/plugin-helpers.markdown @@ -0,0 +1,39 @@ +Registrar nuevos helpers +======================= + +Estrucura del helper: + +```php +helper->register('myHelper', '\Kanboard\Plugin\MyPlugin\Helper\MyHelper'); +``` + +Usar tu helper desde una plantilla **Template**: + +```php +
+ = $this->myHelper->doSomething() ?> +
+``` + +Usar tu helper dese otra clase: + +```php +$this->helper->myHelper->doSomething(); +``` diff --git a/doc/es_ES/plugin-hooks.markdown b/doc/es_ES/plugin-hooks.markdown new file mode 100644 index 000000000..46855d27d --- /dev/null +++ b/doc/es_ES/plugin-hooks.markdown @@ -0,0 +1,249 @@ +Plugin Hooks +============ + +Hooks de aplicación +----------------- + +Los hooks pueden extender , reemplazar, filtar datos o cambiar los comportamientos por default, cad hook es identificado con unico nombre, ejemplo : `controller:calendar:user:events` + +### Escuchar en eventos hook + +En tu metodo `initialize()` tu necesitas llamar al metodo `on()` de la clase `Kanboard\Core\Plugin\Hook`: + +```php +$this->hook->on('hook_name', $callable); +``` + +El primer argumento es el nombre del hook y el segundo es un callable PHP + +### Hooks ejecutado sólo una vez + +Algunos hooks solo tienen un listener: + +#### model:subtask-time-tracking:calculate:time-spent + +- Anular el cálculo del tiempo anterior cuando se detiene el temporizador de la subtarea +- Argumentos : + - `$user_id` (integer) + - `$start` (DateTime) + - `$end` (DateTime) + +### Fusionar hooks + +"Fusionar hooks" actuar de la misma manera que la función de `array_merge`. el hook callback solo regresa un array. Este array se fusionará con la que viene por defecto. + +Ejemplo para agregar eventos en el calendario del usuario: + +```php +class Plugin extends Base +{ + public function initialize() + { + $container = $this->container; + + $this->hook->on('controller:calendar:user:events', function($user_id, $start, $end) use ($container) { + $model = new SubtaskForecast($container); + return $model->getCalendarEvents($user_id, $end); // Return new events + }); + } +} +``` + +Ejemplo para sobrescribir los valores por default de las tareas: + +```php +class Plugin extends Base +{ + public function initialize() + { + $this->hook->on('controller:task:form:default', function (array $default_values) { + return empty($default_values['score']) ? array('score' => 4) : array(); + }); + } +} +``` + +Lista de fusión de hooks: + +#### controller:task:form:default + +- sobrescribir los valores por default de las tareas +- Argumentos: + - `$default_values`: actual default values (array) + +#### controller:calendar:project:events + +- Agregar mas eventos a el calendario del projecto +- Argumentos: + - `$project_id` (integer) + - `$start` Calendar start date (string, ISO-8601 format) + - `$end` Calendar` end date (string, ISO-8601 format) + +#### controller:calendar:user:events + +- Agregar mas eventos a el calendario de usuario +- Argumentos: + - `$user_id` (integer) + - `$start` Calendar start date (string, ISO-8601 format) + - `$end` Calendar end date (string, ISO-8601 format) + +Asset Hooks +----------- + +Asset hooks pueden ser usados para agregar nuevas stylesheet facilmente o un nuevo archivo JavaScript en el layout. tu puedes usar estas caracteristicas para crear un tema y sobreescribir todo los estilos por dafault del kanboard. + +Ejemplo para agregar un stylesheet **hoja de estilo** + +```php +hook->on('template:layout:css', array('template' => 'plugins/Css/skin.css')); + } +} +``` + +Lista de asset Hooks: + +- `template:layout:css` +- `template:layout:js` + + +Referencia de hooks +--------------- + +La reference hooks son pasados a una variable por referencia. + +Ejemplo: + +```php +$this->hook->on('formatter:board:query', function (\PicoDb\Table &query) { + $query->eq('color_id', 'red'); +}); +``` + +El código anterior mostrará sólo las tareas en rojo en el tablero. + +Lista de referencias de hooks: + +| Hook | Description | +|--------------------------------------------|---------------------------------------------------------------| +| `formatter:board:query` | Alterar consulta a la base antes de tablero de renderizado | +| `pagination:dashboard:task:query` | Alterar consulta de base de datos para las tareas de la paginación en el dashboard | +| `pagination:dashboard:subtask:query` | Alterar consulta a la base de la paginación en el subtareas del dashboard | +| `model:task:creation:prepare` | Alterar los valores del formulario antes de guardar una tarea | +| `model:task:modification:prepare` | Alterar los valores del formulario antes de editar una tarea + +Template Hooks +-------------- + +Template hooks permitirá añadir nuevos contenidos en las plantillas existentes. + +Ejemplo para agregar nuevos contenidos en el sidebar del dashboard: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar'); +``` + +Ejemplo para adjuntar un template con variables locales: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', array( + 'variable' => 'foobar', +)); +``` + +Ejemplo para adjuntar un template con un callable: + +```php +$this->template->hook->attach('template:dashboard:sidebar', 'myplugin:dashboard/sidebar', function($hook_param1, $hook_param2) { + return array('new_template_variable' => 'foobar'); // Inyectar una nueva variable en la plantilla Plugin +}); +``` + +Este llamada es usualmente definida en el metodo `initialize()` +El primer argumento es el nombre del hook y el segundo argumento es el nombre del template. + +Los nombres de plantillas con el prefijo del nombre del plugin y los dos puntos indican la ubicación de la plantilla. + +Ejemplo con `myplugin:dashboard/sidebar`: + +- `myplugin` Es el nombre de tu plugin (minusculas) +- `dashboard/sidebar` es el nombre del template +- En el filesystem, El plugin esta localizado aqui: `plugins\Myplugin\Template\dashboard\sidebar.php` +- Templates estan escritos en puro PHP (no se olvide de escapar los datos) + +Los nombres de plantillas sin prefijo son plantillas básicas. + +Lista de templates hooks: + +| Hook | Descripción | +|--------------------------------------------|----------------------------------------------------| +| `template:analytic:sidebar` | Sidebar en paginas analiticas | +| `template:app:filters-helper:before` | Filtro helper dropdown (top) | +| `template:app:filters-helper:after` | Filtro helper dropdown (bottom) | +| `template:auth:login-form:before` | Pagina de login (top) | +| `template:auth:login-form:after` | Pagina de login (bottom) | +| `template:board:private:task:before-title` | Tarea en un tablero privado : despues del titulo | +| `template:board:private:task:after-title` | Tarea en un tablero privado : antes del titulo | +| `template:board:public:task:before-title` | Tarea en un tablero publico : despues del titulo | +| `template:board:public:task:after-title` | Tarea en un tablero publico : antes del titulo | +| `template:board:task:footer` | Tarea en el tablero : footer | +| `template:board:task:icons` | Tarea en el tablero: tooltip icon | +| `template:board:column:dropdown` | Menu Dropdown en las columnas del tablero | +| `template:config:sidebar` | Sidebar pagina de configuración | +| `template:config:application ` | Aplicación de configuración del formulario | +| `template:config:email` | Email settings page | +| `template:config:integrations` | Integration page in global settings | +| `template:dashboard:sidebar` | Sidebar en la pagina del dashboard | +| `template:dashboard:show` | Pagina principal del dashboard | +| `template:export:sidebar` | Sidebar para exportar paginas | +| `template:import:sidebar` | Sidebar para importar paginas | +| `template:header:dropdown` | Dropdown menu Pagina header (icono avatar de usuario) | +| `template:header:creation-dropdown` | Dropdown menu Pagina header (plus icon) | +| `template:layout:head` | Layout de la pagina `