This commit is contained in:
Frédéric Guillot 2018-04-06 10:54:58 -07:00
parent ac11220a1a
commit 0b306fa60a
648 changed files with 15 additions and 38030 deletions

View File

@ -20,5 +20,3 @@ Credits
- Main developer: Frédéric Guillot
- [Contributors](https://github.com/kanboard/kanboard/graphs/contributors)
- Distributed under [MIT License](https://github.com/kanboard/kanboard/blob/master/LICENSE)

View File

@ -12,126 +12,8 @@ use Parsedown;
*/
class DocumentationController extends BaseController
{
public function show()
{
$page = $this->request->getStringParam('file', 'index');
if (!preg_match('/^[a-z0-9\-]+/', $page)) {
$page = 'index';
}
$filename = $this->getPageFilename($page);
$this->response->html($this->helper->layout->app('doc/show', $this->render($filename)));
}
/**
* Display keyboard shortcut
*/
public function shortcuts()
{
$this->response->html($this->template->render('config/keyboard_shortcuts'));
}
/**
* Prepare Markdown file
*
* @access private
* @param string $filename
* @return array
*/
private function render($filename)
{
$data = file_get_contents($filename);
$content = preg_replace_callback('/\((.*.markdown)\)/', array($this, 'replaceMarkdownUrl'), $data);
$content = preg_replace_callback('/\((screenshots.*\.png)\)/', array($this, 'replaceImageUrl'), $content);
$content = preg_replace_callback('/\((\.\.\/screenshots.*\.png)\)/', array($this, 'replaceImageUrl'), $content);
list($title, ) = explode("\n", $data, 2);
return array(
'content' => Parsedown::instance()->text($content),
'title' => $title !== 'Documentation' ? t('Documentation: %s', $title) : $title,
);
}
/**
* Regex callback to replace Markdown links
*
* @access public
* @param array $matches
* @return string
*/
public function replaceMarkdownUrl(array $matches)
{
return '('.$this->helper->url->to('DocumentationController', 'show', array('file' => str_replace('.markdown', '', $matches[1]))).')';
}
/**
* Regex callback to replace image links
*
* @access public
* @param array $matches
* @return string
*/
public function replaceImageUrl(array $matches)
{
return '('.$this->getFileBaseUrl($matches[1]).')';
}
/**
* Get Markdown file according to the current language
*
* @access private
* @param string $page
* @return string
*/
private function getPageFilename($page)
{
return $this->getFileLocation($page . '.markdown') ?:
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', 'en_US', 'index.markdown'));
}
/**
* Get base URL for Markdown links
*
* @access private
* @param string $filename
* @return string
*/
private function getFileBaseUrl($filename)
{
$language = $this->languageModel->getCurrentLanguage();
$path = $this->getFileLocation($filename);
if (strpos($path, $language) !== false) {
$url = implode('/', array('doc', $language, $filename));
} else {
$url = implode('/', array('doc', $filename));
}
return $this->helper->url->base().$url;
}
/**
* Get file location according to the current language
*
* @access private
* @param string $filename
* @return string
*/
private function getFileLocation($filename)
{
$files = array(
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', $this->languageModel->getCurrentLanguage(), $filename)),
implode(DIRECTORY_SEPARATOR, array(ROOT_DIR, 'doc', 'en_US', $filename)),
);
foreach ($files as $filename) {
if (file_exists($filename)) {
return $filename;
}
}
return '';
}
}

View File

@ -25,7 +25,16 @@ class UrlHelper extends Base
*/
public function doc($label, $file)
{
return $this->link($label, 'DocumentationController', 'show', array('file' => $file), false, '', '', true);
$version = 'latest';
if (substr(APP_VERSION, 0, 1) === 'v') {
$version = substr(APP_VERSION, 1);
} else if (ctype_digit(substr(APP_VERSION, 0, 1))) {
$version = APP_VERSION;
}
$url = sprintf(DOCUMENTATION_URL_PATTERN, $version, $file);
return sprintf('<a href="%s" target="_blank">%s</a>', $url, $label);
}
/**

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Promijeni boju zadatka kada se koristi određena veza na zadatku',
'Task link creation or modification' => 'Veza na zadatku je napravljena ili izmijenjena',
'Milestone' => 'Prekretnica',
'Documentation: %s' => 'Dokumentacija: %s',
'Reset the search/filter box' => 'Vrati na početno pretragu/filtere',
'Documentation' => 'Dokumentacija',
'Table of contents' => 'Sadržaj',
'Author' => 'Autor',
'Version' => 'Verzija',
'Plugins' => 'Dodaci',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Canviar de color quan la tasca utilitzant un enllaç tasca específica',
'Task link creation or modification' => 'La creació o modificació de l\'enllaç de tasques',
'Milestone' => 'Fita',
'Documentation: %s' => 'Documentació: %s',
'Reset the search/filter box' => 'Restablir el quadre de cerca / filtre',
'Documentation' => 'Documentació',
'Table of contents' => 'Taula de continguts',
'Author' => 'Autor',
'Version' => 'Versió',
'Plugins' => 'Connectors',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Změnit barvu úkolu při použití konkrétního odkazu na úkol',
'Task link creation or modification' => 'Vytvoření, nebo změna odkazu na úkol',
'Milestone' => 'Milník',
'Documentation: %s' => 'Dokumentace %s',
'Reset the search/filter box' => 'Vyresetovat pole pro vyhledávání/filtrování',
'Documentation' => 'Dokumentace',
'Table of contents' => 'Obsah',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Ændre opgave farve når der bruges bestemt opgave henvisning',
'Task link creation or modification' => 'Opgave henvisning oprettelse eller ændring',
'Milestone' => 'Milepæl',
'Documentation: %s' => 'Dokumentation: %s',
'Reset the search/filter box' => 'Nulstille søge- / filter-boks',
'Documentation' => 'Dokumentation',
'Table of contents' => 'Indholdsfortegnelse',
'Author' => 'Forfatter',
'Version' => 'Version',
'Plugins' => 'Udvidelses-moduler',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Aufgabefarbe ändern bei bestimmter Aufgabenverbindung',
'Task link creation or modification' => 'Aufgabenverbindung erstellen oder bearbeiten',
'Milestone' => 'Meilenstein',
'Documentation: %s' => 'Dokumentation: %s',
'Reset the search/filter box' => 'Suche/Filter-Box zurücksetzen',
'Documentation' => 'Dokumentation',
'Table of contents' => 'Inhaltsverzeichnis',
'Author' => 'Autor',
'Version' => 'Version',
'Plugins' => 'Plugins',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Αλλαγή χρώματος εργασίας χρησιμοποιώντας συγκεκριμένο σύνδεσμο εργασίας',
'Task link creation or modification' => 'Σύνδεσμος δημιουργίας ή τροποποίησης εργασίας',
'Milestone' => 'Ορόσημο',
'Documentation: %s' => 'Τεκμηρίωση: %s',
'Reset the search/filter box' => 'Αρχικοποίηση του πεδίου αναζήτησης/φιλτραρίσματος',
'Documentation' => 'Τεκμηρίωση',
'Table of contents' => 'Πίνακας περιεχομένων',
'Author' => 'Δημιουργός',
'Version' => 'Έκδοση',
'Plugins' => 'Πρόσθετα',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Cambiar el color de la tarea cuando se utiliza un enlace de tarea específico',
'Task link creation or modification' => 'Creación o modificación de enlaces de tareas',
'Milestone' => 'Hito',
'Documentation: %s' => 'Documentación: %s',
'Reset the search/filter box' => 'Restablecer la caja de búsqueda/filtro',
'Documentation' => 'Documentación',
'Table of contents' => 'Tabla de contenido',
'Author' => 'Autor',
'Version' => 'Versión',
'Plugins' => 'Plugins',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
// 'Milestone' => '',
// 'Documentation: %s' => '',
// 'Reset the search/filter box' => '',
// 'Documentation' => '',
// 'Table of contents' => '',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Changer la couleur de la tâche lorsqu\'un lien spécifique est utilisé',
'Task link creation or modification' => 'Création ou modification d\'un lien sur une tâche',
'Milestone' => 'Étape importante',
'Documentation: %s' => 'Documentation : %s',
'Reset the search/filter box' => 'Réinitialiser le champ de recherche',
'Documentation' => 'Documentation',
'Table of contents' => 'Table des matières',
'Author' => 'Auteur',
'Version' => 'Version',
'Plugins' => 'Extensions',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
// 'Milestone' => '',
// 'Documentation: %s' => '',
// 'Reset the search/filter box' => '',
'Documentation' => 'Dokumentacija',
// 'Table of contents' => '',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Feladatszín megváltoztatása, ha egy adott feladathivatkozást használnak',
'Task link creation or modification' => 'Feladathivatkozás létrehozása vagy módosítása',
'Milestone' => 'Mérföldkő',
'Documentation: %s' => 'Dokumentáció: %s',
'Reset the search/filter box' => 'A keresés/szűrés doboz visszaállítása',
'Documentation' => 'Dokumentáció',
'Table of contents' => 'Tartalomjegyzék',
'Author' => 'Szerző',
'Version' => 'Verzió',
'Plugins' => 'Bővítmények',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Ganti warna tugas ketika menggunakan tautan tugas yang spesifik',
'Task link creation or modification' => 'Tautan pembuatan atau modifikasi tugas ',
'Milestone' => 'Milestone',
'Documentation: %s' => 'Dokumentasi: %s',
'Reset the search/filter box' => 'Reset kotak pencarian/saringan',
'Documentation' => 'Dokumentasi',
'Table of contents' => 'Daftar isi',
'Author' => 'Penulis',
'Version' => 'Versi',
'Plugins' => 'Plugin',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Cambia colore del task quando si un utilizza una determinata relazione di task',
'Task link creation or modification' => 'Creazione o modifica di relazione di task',
// 'Milestone' => '',
'Documentation: %s' => 'Documentazione: %s',
'Reset the search/filter box' => 'Resetta la riceca/filtro',
'Documentation' => 'Documentazione',
'Table of contents' => 'Indice dei contenuti',
'Author' => 'Autore',
'Version' => 'Versione',
'Plugins' => 'Plugin',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => '特定のタスクリンクを使用するとタスクの色を変更',
'Task link creation or modification' => 'タスクリンクの作成または変更',
'Milestone' => 'マイルストーン',
'Documentation: %s' => 'ドキュメント:%s',
'Reset the search/filter box' => '検索/フィルタをリセット',
'Documentation' => 'ドキュメント',
'Table of contents' => '目次',
'Author' => '著者',
'Version' => 'バージョン',
'Plugins' => 'プラグイン',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => '특정 할일 링크를 사용할때 할일의 색깔 변경',
'Task link creation or modification' => '할일 링크 생성 혹은 수정',
'Milestone' => '마일스톤',
'Documentation: %s' => '문서: %s',
'Reset the search/filter box' => '찾기/필터 박스 초기화',
'Documentation' => '문서',
'Table of contents' => '목차',
'Author' => '글쓴이',
'Version' => '버전',
'Plugins' => '플러그인',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan Pautan tugas yang spesifik',
'Task link creation or modification' => 'Pautan tugas pada penciptaan atau penyuntingan',
'Milestone' => 'Batu Tanda',
'Documentation: %s' => 'Dokumentasi : %s',
'Reset the search/filter box' => 'Tetap semula pencarian/saringan',
'Documentation' => 'Dokumentasi',
'Table of contents' => 'Isi kandungan',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
'Milestone' => 'Milepæl',
'Documentation: %s' => 'Dokumentasjon: %s',
'Reset the search/filter box' => 'Nullstill søk/filter',
'Documentation' => 'Dokumentasjon',
'Table of contents' => 'Innholdsfortegnelse',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
'Milestone' => 'Mijlpaal',
// 'Documentation: %s' => '',
// 'Reset the search/filter box' => '',
// 'Documentation' => '',
// 'Table of contents' => '',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Zmień kolor zadania używając specjalnego adresu URL',
'Task link creation or modification' => 'Adres URL do utworzenia zadania lub modyfikacji',
'Milestone' => 'Kamień milowy',
'Documentation: %s' => 'Dokumentacja: %s',
'Reset the search/filter box' => 'Zresetuj pole wyszukiwania/filtrowania',
'Documentation' => 'Dokumentacja',
'Table of contents' => 'Tablica zawartości',
'Author' => 'Autor',
'Version' => 'Wersja',
'Plugins' => 'Wtyczki',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Mudar a cor da tarefa quando um link específico é utilizado',
'Task link creation or modification' => 'Criação ou modificação de um link em uma tarefa',
'Milestone' => 'Marco',
'Documentation: %s' => 'Documentação: %s',
'Reset the search/filter box' => 'Reiniciar o campo de pesquisa',
'Documentation' => 'Documentação',
'Table of contents' => 'Índice',
'Author' => 'Autor',
'Version' => 'Versão',
'Plugins' => 'Plugins',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Alterar cor da tarefa quando se usar um tipo especifico de ligação de tarefa',
'Task link creation or modification' => 'Criação ou modificação de ligação de tarefa',
'Milestone' => 'Objectivo',
'Documentation: %s' => 'Documentação: %s',
'Reset the search/filter box' => 'Repor caixa de procura/filtro',
'Documentation' => 'Documentação',
'Table of contents' => 'Tabela de conteúdos',
'Author' => 'Autor',
'Version' => 'Versão',
'Plugins' => 'Plugins',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Schimbă culoarea sarcinii când se folosește o anumită legătură în sarcină',
'Task link creation or modification' => 'Creare sau modificare legături sarcină',
'Milestone' => 'Țel',
'Documentation: %s' => 'Documentație: %s',
'Reset the search/filter box' => 'Resetează dialogul de căutare/filtre',
'Documentation' => 'Documentație',
'Table of contents' => 'Cuprins',
'Author' => 'Autor',
'Version' => 'Versiuni',
'Plugins' => 'Extensii',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Изменение цвета задач при использовании ссылки на определенные задачи',
'Task link creation or modification' => 'Ссылка на создание или модификацию задачи',
'Milestone' => 'Веха',
'Documentation: %s' => 'Документация: %s',
'Reset the search/filter box' => 'Сбросить поиск/фильтр',
'Documentation' => 'Документация',
'Table of contents' => 'Содержание',
'Author' => 'Автор',
'Version' => 'Версия',
'Plugins' => 'Плагины',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
// 'Milestone' => '',
// 'Documentation: %s' => '',
// 'Reset the search/filter box' => '',
// 'Documentation' => '',
// 'Table of contents' => '',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
// 'Change task color when using a specific task link' => '',
// 'Task link creation or modification' => '',
// 'Milestone' => '',
// 'Documentation: %s' => '',
// 'Reset the search/filter box' => '',
// 'Documentation' => '',
// 'Table of contents' => '',
// 'Author' => '',
// 'Version' => '',
// 'Plugins' => '',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'เปลี่ยนสีงานเมื่อมีการใช้การเชื่อมโยงงาน',
'Task link creation or modification' => 'การสร้างการเชื่อมโยงงานหรือการปรับเปลี่ยน',
'Milestone' => 'ขั้น',
'Documentation: %s' => 'เอกสาร: %s',
'Reset the search/filter box' => 'รีเซตกล่องค้นหา/ตัวกรอง',
'Documentation' => 'เอกสาร',
'Table of contents' => 'สารบัญ',
'Author' => 'ผู้แต่ง',
'Version' => 'เวอร์ชัน',
'Plugins' => 'ปลั๊กอิน',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Belirli bir görev bağlantısı kullanıldığında görevin rengini değiştir',
'Task link creation or modification' => 'Görev bağlantısı oluşturulması veya değiştirilmesi',
'Milestone' => 'Kilometre taşı',
'Documentation: %s' => 'Dokümantasyon: %s',
'Reset the search/filter box' => 'Arama/Filtre kutusunu sıfırla',
'Documentation' => 'Dokümantasyon',
'Table of contents' => 'İçindekiler',
'Author' => 'Yazar',
'Version' => 'Versiyon',
'Plugins' => 'Eklentiler',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => 'Thay đổi màu nhiệm vụ khi sử dụng liên kết nhiệm vụ cụ thể',
'Task link creation or modification' => 'Tạo hoặc sửa đổi liên kết nhiệm vụ',
'Milestone' => 'Milestone',
'Documentation: %s' => 'Tài liệu: %s',
'Reset the search/filter box' => 'Đặt lại hộp tìm kiếm / bộ lọc',
'Documentation' => 'Tài liệu hướng dẫn',
'Table of contents' => 'Mục lục',
'Author' => 'Tác giả',
'Version' => 'Phiên bản',
'Plugins' => 'Plugins',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => '当任务关联到指定任务时改变颜色',
'Task link creation or modification' => '任务链接创建或更新时间',
'Milestone' => '里程碑',
'Documentation: %s' => '文档:%s',
'Reset the search/filter box' => '重置搜索/过滤框',
'Documentation' => '帮助文档',
'Table of contents' => '表内容',
'Author' => '作者',
'Version' => '版本',
'Plugins' => '插件管理',

View File

@ -742,10 +742,8 @@ return array(
'Change task color when using a specific task link' => '當任務關聯到指定任務時改變顏色',
'Task link creation or modification' => '任務連接建立或更新時間',
'Milestone' => '里程碑',
'Documentation: %s' => '文件:%s',
'Reset the search/filter box' => '重設搜尋/過濾框',
'Documentation' => '文件',
'Table of contents' => '表内容',
'Author' => '作者',
'Version' => '版本',
'Plugins' => '插件',

View File

@ -1,12 +0,0 @@
<section id="main">
<div class="page-header">
<ul>
<li>
<?= $this->url->icon('life-ring', t('Table of contents'), 'DocumentationController', 'show', array('file' => 'index')) ?>
</li>
</ul>
</div>
<div class="markdown documentation">
<?= $content ?>
</div>
</section>

View File

@ -29,7 +29,8 @@
<?= $this->hook->render('template:header:dropdown') ?>
<li>
<?= $this->url->icon('life-ring', t('Documentation'), 'DocumentationController', 'show') ?>
<i class="fa fa-fw fa-life-ring" aria-hidden="true"></i>
<?= $this->url->doc(t('Documentation'), 'index') ?>
</li>
<?php if (! DISABLE_LOGOUT): ?>
<li>

View File

@ -152,3 +152,6 @@ defined('TOTP_ISSUER') or define('TOTP_ISSUER', 'Kanboard');
// Comma separated list of fields to not synchronize when using external authentication providers
defined('EXTERNAL_AUTH_EXCLUDE_FIELDS') or define('EXTERNAL_AUTH_EXCLUDE_FIELDS', 'username');
// Documentation URL
defined('DOCUMENTATION_URL_PATTERN') or define('DOCUMENTATION_URL_PATTERN', 'https://docs.kanboard.org/en/%s/user_guide/%s.html');

View File

@ -1,18 +0,0 @@
Sbalený a rozbalený režim
===========================
Úkoly na desce mohou být zobrazeny ve sbaleném nebo v rozbaleném režimu.
Přechod z jednoho pohledu na druhý lze provést pomocí klávesové zkratky **"s"** nebo pomocí rozbalovací nabídky vlevo.
Sbalený režim
--------------
![Sbalené úkoly](../screenshots/board-collapsed-mode.png)
- Pokud je úkol někomu přiřazen, zobrazí se vedle čísla úlohy iniciály osoby.
- Pokud je název úlohy příliš dlouhý, můžete svou myš umístit přes úkol, aby se zobrazil popis s celým názvem.
Rozbalený režim
-------------
![Rozbalené úkoly](../screenshots/board-expanded-mode.png)

View File

@ -1,10 +0,0 @@
Horizontální rolování a kompaktní režim
=====================================
Pokud se nástěnka nevejde na obrazovku, zobrazí se v dolní části vodorovná posuvná lišta.
Je však možné přepnout na kompaktní zobrazení, aby se zobrazily všechny sloupce na obrazovce.
![Přepnout do kompaktního režimu](../screenshots/board-compact-mode.png)
Přepínání mezi horizontálním rolováním a kompaktním zobrazením lze provést pomocí klávesové zkratky **"c"** nebo pomocí rozbalovací nabídky vlevo nahoře.

View File

@ -1,12 +0,0 @@
Zobrazit a skrýt sloupce na nástěnce
==================================
Sloupce můžete velmi snadno skrýt nebo zobrazit na nástěnce:
![Skrýt sloupec](../screenshots/hide-column.png)
Chcete-li sloupec skrýt, klikněte na rozbalovací nabídku sloupců a zvolte "Skrýt tento sloupec".
![Zobrazit sloupec](../screenshots/show-column.png)
Chcete-li znovu zobrazit sloupec, klikněte na ikonu plus.

View File

@ -1,16 +0,0 @@
Uzavírání úkolů
=============
Když je úkol uzavřen, je skrytý z nástěnky.
Vždy však můžete získat přístup k seznamu uzavřených úkolů pomocí dotazu **status:closed** v libovolném vyhledávacím formuláři nebo jednoduše vybrat **Uzavřené úkoly** z rozevírací nabídky filtru.
Existují dva různé způsoby jak zavřít úkol z rozbalovací nabídky úloh na nástěnce:
![Uzavřít úkol z rozbalovací nabídky](../screenshots/menu-close-task.png)
Nebo z nabídky postranního panelu úloh v detailním zobrazení úkolu:
![Uzavřít úkol](../screenshots/closing-tasks.png)
Poznámka: Když zavřete úkol, všechny dílčí úkoly, které nebyly dokončeny, budou změněny na stav "Dokončeno".

View File

@ -1,39 +0,0 @@
Vytváření projektů
=================
Kanboard dokáže zpracovat více projektů. Existují dva druhy projektů:
- Týmové projekty
- Soukromý projekt pro jednoho uživatele
Vytváření projektů pro více uživatelů
-------------------------------------
- Tyto projekty mohou vytvářet pouze správci a správci projektů
- Správa uživatelů je k dispozici
Na nástěnce klikněte na odkaz **Nový projekt**:
![Formulář pro tvorbu projektu](../screenshots/new-project.png)
Je to velmi snadné: stačí najít jméno pro svůj projekt!
Vytváření soukromého projektu
-----------------------------
- Každý může vytvořit soukromý projekt
- **Není** zde možnost správy uživatelů
- Do projektu mohou přistupovat pouze vlastníci a správci
Na nástěnce klikněte na odkaz **Nový soukromý projekt**.
Vytváření projektů z jiného projektu
--------------------------------------
Při vytváření nového projektu můžete zvolit duplikování vlastností jiného projektu:
- Oprávnění
- Akce
- Dráhy
- Kategorie
- Úkoly

View File

@ -1,30 +0,0 @@
Vytváření úkolů
==============
Na nástěnce klikněte na znaménko plus vedle názvu sloupce:
![Vytváření úkolů z nástěnky](../screenshots/task-creation-board.png)
Poté se zobrazí formulář vytvoření úkolu:
![Formulář pro tvorbu úkolů](../screenshots/task-creation-form.png)
Popis pole:
- **Název**: Název vašeho úkolu, který bude zobrazen na nástěnce.
- **Popis**: Popis, který používá formát [Markdown](syntax-guide.markdown).
- **Štítky**: Seznam štítků přidružených k úkolům.
- **Vytvoření dalšího úkolu**: Zaškrtněte toto políčko, pokud chcete vytvořit podobný úkol (některé pole budou předem naplněny).
- **Barva**: Vyberte barvu karty.
- **Vlastník**: Osoba, která bude na úkolu pracovat.
- **Kategorie**: K úloze lze přiřadit pouze jednu kategorii (viditelné pouze v případě, že projekty mají kategorie).
- **Sloupec**: Sloupec, ve kterém bude úloha vytvořena, úkol bude umístěn v dolní části.
- **Priorita**: Priorita úkolu, rozsah lze definovat v nastavení projektu, výchozí hodnoty jsou P0 až P3.
- **Složitost**: Používá se v agilním řízení projektů (Scrum), složitost nebo tzv. "story-points", to je číslo, které říká týmu, jak těžký je úkol. Často lidé používají Fibonacciho posloupnost.
- **Reference**: Externí ID úkolu, např. to může být číslo ticketu, které pochází z jiného systému
- **Časový odhad**: Odhad v hodinách pro dokončení úkolu.
- **Čas strávený**: Doba strávená při práci na úkolu.
- **Datum zahájení**: Toto je pole pro zadání data a času zahájení.
- **Datum splnění**: Opakované úkoly budou mít červený termín splnění a nadcházející termíny budou černé na nástěnce. Pro zadání datumů je k dispozici několik formátů datumu.
Pomocí odkazu náhled můžete vidět popis úlohy převedený ze syntaxe Markdown.

View File

@ -1,58 +0,0 @@
Kopírovat a přesunout úkoly
========================
Kopírovat úkol do stejného projektu
--------------------------------------
Přejděte do zobrazení úkolů a vlevo vyberte položku **Vytvořit kopii**.
![Kopírování úloh](../screenshots/task-duplication.png)
Nový úkol bude vytvořen se stejnými vlastnostmi jako originál.
Kopírovat úkol do jiného projektu
-----------------------------------
Přejděte do zobrazení úkolů a vyberte možnost **Vytvořit kopii v jiném projektu **.
![Kopírování úkolů do jiného projektu](../screenshots/task-duplication-another-project.png)
V rozbalovací nabídce se zobrazí pouze projekty, ve kterých jste členem.
Než provedete kopírování úkolů, Kanboard se vás zeptá na cílové vlastnosti, které nejsou společné mezi zdrojovým a cílovým projektem.
V zásadě musíte definovat:
- cílová dráha
- Sloupec
- Kategorie
- Vlastník
Přesunout úkol do jiného projektu
------------------------------
Přejděte do zobrazení úkolů a vyberte možnost **Přesunout do jiného projektu**.
Přesunutí úkolu do jiného projektu pracuje stejným způsobem jako kopírování, musíte zvolit nové vlastnosti úkolu.
Seznam kopírovaných polí
-------------------------
Zde je seznam kopírovaných vlastností:
- název
- popis
- datum splnění
- barva
- projekt
- sloupec
- vlastník
- skóre
- kategorie
- strávený čas
- dráha
- stav opakování
- spouštěč opakování
- faktor pro opakování
- časové okno pro opakování
- výchozí datum pro výpočet opakování

View File

@ -1,15 +0,0 @@
Úpravy projektů
================
Projekty lze kdykoli přejmenovat nebo zakázat.
Chcete-li projekt přejmenovat, klikněte na odkaz "Upravit projekt" vlevo.
![Úprava projektu](../screenshots/project-edition.png)
- Datum zahájení a datum ukončení se používají k vygenerování Ganttova grafu projektu.
- Popis je viditelný jako nápověda na nástěnce a na stránce výpisů projektů.
- Správci a správci projektů mohou převádět soukromý projekt na projekt s více uživateli změnou zaškrtávacího políčka "Soukromý projekt".
- Můžete také převést týmový projekt na soukromý projekt.
Poznámka: Když převedete projekt na soukromý, všichni stávající uživatelé budou stále mít přístup k projektu. Seznam uživatelů můžete upravit podle vašich potřeb.

View File

@ -1,149 +0,0 @@
Obsah
=============
Používání Kanboard
--------------
### Úvod
- [Co je Kanban?](what-is-kanban.markdown)
- [Kanban vs Todo Lists and Scrum](kanban-vs-todo-and-scrum.markdown)
- [Usage examples](usage-examples.markdown)
### Používání nástěnky
- [Zobrazení Nástěnka, Kalendář, Seznam a Gantt](project-views.markdown)
- [Sbalený a rozbalený režim](board-collapsed-expanded.markdown)
- [Horizontální rolování a kompaktní režim](board-horizontal-scrolling-and-compact-view.markdown)
- [Zobrazit a skrýt sloupce](board-show-hide-columns.markdown)
### Práce s projekty
- [Typy projektů](project-types.markdown)
- [Vytváření projektů](creating-projects.markdown)
- [Úpravy projektů](editing-projects.markdown)
- [Odstranění projektů](removing-projects.markdown)
- [Sharing boards and tasks](sharing-projects.markdown)
- [Automatic actions](automatic-actions.markdown)
- [Oprávnění projektu](project-permissions.markdown)
- [Swimlanes](swimlanes.markdown)
- [Calendar](calendar.markdown)
- [Analytics](analytics.markdown)
- [Gantt chart for tasks](gantt-chart-tasks.markdown)
- [Gantt chart for projects](gantt-chart-projects.markdown)
- [Custom filters](custom-filters.markdown)
- [Custom project roles](custom-project-roles.markdown)
### Práce s úkoly
- [Vytváření úkolů](creating-tasks.markdown)
- [Uzavírání úkolů](closing-tasks.markdown)
- [Kopírovat a přesunout úkoly](duplicate-move-tasks.markdown)
- [Adding screenshots](screenshots.markdown)
- [Internal Task links](task-links.markdown)
- [Transitions](transitions.markdown)
- [Time tracking](time-tracking.markdown)
- [Recurring tasks](recurring-tasks.markdown)
- [Create tasks by email](create-tasks-by-email.markdown)
- [Subtasks](subtasks.markdown)
- [Analytics for tasks](analytics-tasks.markdown)
- [User mentions](user-mentions.markdown)
- [Tags](tags.markdown)
### Working with users and groups
- [Roles](roles.markdown)
- [User Types](user-types.markdown)
- [Group management](groups.markdown)
- [User management](user-management.markdown)
- [Notifications](notifications.markdown)
- [Two factor authentication](2fa.markdown)
### Settings
- [Keyboard shortcuts](keyboard-shortcuts.markdown)
- [Application settings](application-configuration.markdown)
- [Nastavení projektu](project-configuration.markdown)
- [Board settings](board-configuration.markdown)
- [Calendar settings](calendar-configuration.markdown)
- [Link settings](link-labels.markdown)
- [Currency rate](currency-rate.markdown)
### Integrations
- [iCalendar subscriptions](ical.markdown)
- [RSS/Atom subscriptions](rss.markdown)
- [Json-RPC API](api-json-rpc.markdown)
- [Webhooks](webhooks.markdown)
- [Plugins](plugins.markdown)
### More information
- [Advanced Search Syntax](search.markdown)
- [Command line interface](cli.markdown)
- [Syntax guide](syntax-guide.markdown)
- [Brute force protection](bruteforce-protection.markdown)
- [Frequently asked questions](faq.markdown)
### Troubleshooting
- [Solving database migration issues](solving-database-migration-issues.markdown)
- [Blank page after upgrading](solving-blank-page-issue.markdown)
- [Unable to open a session on Windows IIS and Internet Explorer](solving-session-issue-windows-iis-ie.markdown)
- [Performances](performances.markdown)
Technical details
-----------------
### Installation
- [Requirements](requirements.markdown)
- [Installation instructions](installation.markdown)
- [Upgrade Kanboard to a new version](update.markdown)
- [Installation on Ubuntu](ubuntu-installation.markdown)
- [Installation on Debian](debian-installation.markdown)
- [Installation on Centos](centos-installation.markdown)
- [Installation on OpenSuse](suse-installation.markdown)
- [Installation on FreeBSD](freebsd-installation.markdown)
- [Installation on Windows Server with IIS](windows-iis-installation.markdown)
- [Installation on Windows Server with Apache](windows-apache-installation.markdown)
- [Installation on Heroku](heroku.markdown)
- [Run Kanboard with Docker](docker.markdown)
- [Run Kanboard with Vagrant](vagrant.markdown)
- [Run Kanboard on Cloudron](cloudron.markdown)
### Configuration
- [Daily background job](cronjob.markdown)
- [Background Worker](worker.markdown)
- [Config file](config.markdown)
- [Environment variables](env.markdown)
- [Email configuration](email-configuration.markdown)
- [URL rewriting](nice-urls.markdown)
- [Plugin Directory](plugin-directory.markdown)
### Database
- [Sqlite database management](sqlite-database.markdown)
- [How to use Mysql](mysql-configuration.markdown)
- [How to use Postgresql](postgresql-configuration.markdown)
### Authentication
- [LDAP authentication](ldap-authentication.markdown)
- [LDAP group synchronization](ldap-group-sync.markdown)
- [LDAP profile picture](ldap-profile-picture.markdown)
- [LDAP parameters](ldap-parameters.markdown)
- [LDAP configuration examples](ldap-configuration-examples.markdown)
- [Reverse proxy authentication](reverse-proxy-authentication.markdown)
### Contributors
- [Contributor guide](contributing.markdown)
- [Translations](translations.markdown)
- [Coding standards](coding-standards.markdown)
- [Running tests](tests.markdown)
- [Build assets](assets.markdown)
The documentation is written in [Markdown](http://en.wikipedia.org/wiki/Markdown).
If you want to improve the documentation, just send a pull-request.

View File

@ -1,41 +0,0 @@
Nastavení projektu
================
Přejděte do nabídky **Nastavení** a poté vlevo vyberte možnost **Nastavení projektu**.
![Nastavení projektu](../screenshots/project-settings.png)
### Výchozí sloupce pro nové projekty
Zde můžete změnit výchozí názvy sloupců.
Toto je užitečné, pokud vždy vytváříte projekty se stejnými sloupci.
Každé jméno sloupce musí být odděleno čárkou.
Ve výchozím nastavení Kanboard používá tyto názvy sloupců: Nevyřízené, Připraveno, V řešení a Dokončeno.
### Výchozí kategorie pro nové projekty
Kategorie nejsou globální pro aplikaci, ale jsou připojeny k projektu.
Každý projekt může mít různé kategorie.
Pokud však vždy vytvoříte stejné kategorie pro všechny vaše projekty, můžete zde definovat seznam kategorií, které chcete vytvořit automaticky.
### Povolit současně pouze jednu dílčí úlohu pro uživatele
Je-li tato volba povolena, může uživatel pracovat pouze s jednou dílčí úlohou v daném okamžiku.
Pokud má další dílčí úloha stav "probíhající", zobrazí se toto dialogové okno:
![Omezení uživatele dílčího úkolu](../screenshots/subtask-user-restriction.png)
### Spustit automaticky sledování času
- Pokud je povoleno, když je stav dílčí úlohy změněn na "probíhající", časovač se spustí automaticky.
- Tuto možnost deaktivujte, pokud nepoužíváte sledování času.
### Zahrnout uzavřené úkoly v kumulativním vývojovém diagramu
- Pokud je povoleno, uzavřené úkoly budou zahrnuty do kumulativního diagramu.
- Pokud je zakázáno, budou zahrnuty pouze otevřené úkoly.
- Tato volba ovlivňuje sloupec "celkem" tabulky "project_daily_column_stats"

View File

@ -1,20 +0,0 @@
Oprávnění projektu
===================
Každý projekt je izolován od jiných projektů.
Přístup k projektu musí být povolen vlastníkem projektu.
Každý uživatel a každá skupina mohou mít přiřazenou jinou roli.
Existují 3 typy [rolí projektu](roles.markdown):
- Správce projektu
- Člen projektu
- Čtenář projektu
Pouze správci mají přístup ke všemu.
Přiřazení rolí je viditelné v **Nastavení projektu > Oprávnění**:
![Oprávnění projektu](../screenshots/project-permissions.png)
U soukromých projektů nelze definovat oprávnění.

View File

@ -1,14 +0,0 @@
Typy projektů
=============
Existují dva druhy projektů:
| Type | Description |
|-------------------|-----------------------------------------------------------------------|
| Týmový projekt | Projekt s řízením uživatelů a skupin |
| Soukromý projekt | Projekt, který patří pouze jedné osobě, nemá správu uživatelů |
- Pouze správci a aplikační správci mohou vytvářet týmové projekty.
- Soukromé projekty může vytvářet každý.
[Přečtěte si dokumentaci o rolích v Kanboard](roles.markdown)

View File

@ -1,58 +0,0 @@
Nástěnka, kalendář a zobrazení seznamu
==============================
Pro každý projekt je možné úkoly vizualizovat s několika pohledy: ** Nástěnka, Kalendář, Seznam a Gantt **.
V každém zobrazení se zobrazí výsledek pole filtru v horní části.
Vyhledávač používá [advanced syntax](search.markdown).
Zobrazení nástěnky
-----------------
![Nástěnka](../screenshots/board-view.png)
- S tímto pohledem můžete snadno přetáhnout úkoly mezi sloupci.
- Můžete také použít klávesovou zkratku **"v b"** pro přepnutí na nástěnku.
- Úkoly se stínem byly nedávno upraveny.
![Omezení počtu úkolů na nástěnce](../screenshots/board-task-limit.png)
Po dosažení limitu úkolů pro sloupec se pozadí stává červeným. To znamená, že probíhá příliš mnoho úkolů ve stejnou dobu.
[Další informace o konfiguraci nástěnky](board-configuration.markdown)
Zobrazení kalendáře
--------------
![Zobrazení kalendáře](../screenshots/calendar-view.png)
- Pomocí tohoto pohledu můžete vizualizovat úkoly s datem splnění.
- V závislosti na nastavení můžete také vidět probíhající úlohy.
- K přepnutí do zobrazení kalendáře můžete také použít klávesovou zkratku **"v c"**.
- [Další informace o konfiguraci kalendáře](calendar-configuration.markdown)
Zobrazení seznamu
---------
![Zobrazení seznamu](../screenshots/list-view.png)
- V tomto zobrazení jsou všechny výsledky vašeho vyhledávání zobrazeny v tabulce.
- K přepnutí do zobrazení seznamu můžete také použít klávesovou zkratku **"v l"**.
Zobrazení jako Gantt
-----------------
![Zobrazení Gantt](../screenshots/gantt-view.png)
- Zobrazení Gantt zobrazuje úkoly na horizontální časové ose.
- Datum zahájení a datum splnění se používají k zobrazení grafu.
- Pro rychlý přístup použijte klávesovou zkratku: **v g**.
Přehled projektu
----------------
![Přehled projektu](../screenshots/project-view.png)
- Zobrazení popisu projektu.
- Připojit a nahrát dokumenty do projektu.
- Zobrazit seznam členů projektu.
- Zobrazit poslední aktivity projektu.

View File

@ -1,10 +0,0 @@
Odstranění projektů
=================
Chcete-li projekt odebrat, musíte být správcem projektu nebo správcem.
Přejděte na položku **"Nastavení projektu"** a v nabídce vlevo, v dolní části zvolte možnost "Odstranit"**.
![Odstranění projektů](../screenshots/project-remove.png)
Odstranění projektu odstraní všechny úkoly, které patří tomuto projektu.

View File

@ -1,32 +0,0 @@
Co je Kanban?
===============
Kanban je metodika původně vyvinutá společností Toyota aby byla efektivnější.
Kanban si klade za cíl dva úkoly:
- Vizualizujte svůj pracovní postup
- Omezte množství své rozdělané práce
Vizualizujte svůj pracovní postup
-----------------------
- Vaše práce je zobrazena na nástěnce, takže máte přehled o vašem projektu
- Každý sloupec představuje krok ve vašem pracovním postupu
Omezte množství své rozdělané práce
--------------------------------------------------
- Slepšuje soustředění, tím že se vyhne souběžné práci
- Každá fáze může mít limity pro rozdělanou práci
- Limity pomáhají identifikovat překážky
- Limity pomáhají vyhnout se práci na příliš mnoha úlohách současně
Měření výkonu
=======================
Kanban využívá doby potřebné k realizaci a doby cyklů k měření výkonu:
- ** Doba potřebná k realizaci **: Čas mezi vytvořením a dokončením úlohy
- ** Doba cyklu **: Čas mezi zahájením a dokončením úlohy
Můžete například mít 100 dní doby potřebné k realizaci, ale musíte dokončit úkol pouze za 1 hodinu.

View File

@ -1,30 +0,0 @@
Custom CSS
==========
Einstellung > Anwendungskonfiguration > benutzerdefiniertes Stylesheet
Inviduelle Kategorien Darstellung
---------------------------------
Für den Kategorien-Container allgemeine Darstellung:
```css
.task-board-category-container-color span {
border: solid 0.5px grey;
color: black;
}
```
Für den Text-Inhalt:
```css
[class*="category-Patchkanditat"] {
background-color: rgba(255, 0, 0, 0.50);
border: none!important;
font-weight: bold;
font-style: italic;
box-shadow: 0 1px 1px rgba(186, 186, 186, 0.55);
color: white!important;
font-size:11px;
}
```

View File

@ -1,33 +0,0 @@
Two-Factor Authentication
=========================
Each user can enable the [two-factor authentication](http://en.wikipedia.org/wiki/Two_factor_authentication).
After a successful login, a one-time code (6 characters) is asked to the user to allow access to Kanboard.
This code has to be provided by a compatible software usually installed on your smartphone.
Kanboard use the [Time-based One-time Password Algorithm](http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm) defined in the [RFC 6238](http://tools.ietf.org/html/rfc6238).
There are many software compatible with the standard TOTP system.
For example, you can use these applications:
- [Google Authenticator](https://github.com/google/google-authenticator/) (Android, iOS, Blackberry)
- [FreeOTP](https://freeotp.github.io/) (Android, iOS)
- [OATH Toolkit](http://www.nongnu.org/oath-toolkit/) (Command line utility on Unix/Linux)
This system can work offline and you don't necessarily need to have a mobile phone.
Setup
-----
1. Go to your user profile
2. On the left, click on **Two factor authentication** and check the box
3. A secret key is generated for you
![2FA](../screenshots/2fa.png)
- You have to save the secret key in your TOTP software. If you use a smartphone, the easiest solution is to scan the QR code with FreeOTP or Google Authenticator.
- Each time you will open a new session, a new code will be asked
- Don't forget to test your device before closing your session
A new secret key is generated each time you enable/disable this feature.

View File

@ -1,24 +0,0 @@
Analytics for tasks
===================
Each task has an analytics section available from the left menu in the task view.
Lead and cycle time
-------------------
![Lead and cycle time](../screenshots/task-lead-cycle-time.png)
- The lead time is the time between the task creation and the date of completion (task closed).
- The cycle time is the time between the start date and the date of completion.
- If the task is not closed the current time is used instead of the date of completion.
- If the start date is not specified, the cycle time is not calculated.
Note: You can configure an automatic action to define the start date automatically when you move a task to the column of your choice.
Time spent into each column
---------------------------
![Time spent into each column](../screenshots/time-into-each-column.png)
- This chart shows the total time spent into each column for the task.
- The time spent is calculated until the task is closed.

View File

@ -1,67 +0,0 @@
Project Analytics
=================
Each project have an analytics section. Depending on how you are using Kanboard, you can see those reports:
User repartition
----------------
![User repartition](../screenshots/user-repartition.png)
This pie chart show the number of open tasks assigned per user.
Task distribution
-----------------
![Task distribution](../screenshots/task-distribution.png)
This pie chart gives an overview of the number of open tasks per column.
Cumulative flow diagram
-----------------------
![Cumulative flow diagram](../screenshots/cfd.png)
- This chart shows the number of tasks cumulatively for each column over the time.
- The legend order is the same as the stack in the chart.
- The color of each column is determined automatically.
- Every day, the number of tasks is recorded for each column.
- If you would like to exclude closed tasks, change the [global project settings](project-configuration.markdown).
Note: You need to have at least two days of data to see the graph.
Burn down chart
---------------
![Burndown chart](../screenshots/burndown-chart.png)
The [burn down chart](http://en.wikipedia.org/wiki/Burn_down_chart) is available for each project.
- This chart is a graphical representation of work left to do versus time.
- Kanboard use the complexity or story point to generate this diagram.
- Everyday, the sum of the story points for each column is calculated.
Average time spent into each column
-----------------------------------
![Average time spent into each column](../screenshots/average-time-spent-into-each-column.png)
This chart shows the average time spent into each column for the last 1000 tasks.
- Kanboard uses the task transitions to calculate the data.
- The time spent is calculated until the task is closed.
Average Lead and Cycle time
---------------------------
![Average time spent into each column](../screenshots/average-lead-cycle-time.png)
This chart show the average lead and cycle time for the last 1000 tasks over time.
- The lead time is the time between the task creation and the date of completion.
- The cycle time is time between the specified start date of the task to the completion date.
- If the task is not closed, the current time is used instead of the date of completion.
Those metrics are calculated and recorded every day for the whole project.
Note: Don't forget to run the [daily cronjob](cronjob.markdown) to have accurate statistics.

View File

@ -1,245 +0,0 @@
API Automatic Actions Procedures
================================
## getAvailableActions
- Purpose: **Get list of available automatic actions**
- Parameters: none
- Result on success: **list of actions**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAvailableActions",
"id": 1217735483
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1217735483,
"result": {
"\Kanboard\Action\TaskLogMoveAnotherColumn": "Add a comment logging moving the task between columns",
"\Kanboard\Action\TaskAssignColorUser": "Assign a color to a specific user",
"\Kanboard\Action\TaskAssignColorColumn": "Assign a color when the task is moved to a specific column",
"\Kanboard\Action\TaskAssignCategoryColor": "Assign automatically a category based on a color",
"\Kanboard\Action\TaskAssignColorCategory": "Assign automatically a color based on a category",
"\Kanboard\Action\TaskAssignSpecificUser": "Assign the task to a specific user",
"\Kanboard\Action\TaskAssignCurrentUser": "Assign the task to the person who does the action",
"\Kanboard\Action\TaskUpdateStartDate": "Automatically update the start date",
"\Kanboard\Action\TaskAssignUser": "Change the assignee based on an external username",
"\Kanboard\Action\TaskAssignCategoryLabel": "Change the category based on an external label",
"\Kanboard\Action\TaskClose": "Close a task",
"\Kanboard\Action\CommentCreation": "Create a comment from an external provider",
"\Kanboard\Action\TaskCreation": "Create a task from an external provider",
"\Kanboard\Action\TaskDuplicateAnotherProject": "Duplicate the task to another project",
"\Kanboard\Action\TaskMoveColumnAssigned": "Move the task to another column when assigned to a user",
"\Kanboard\Action\TaskMoveColumnUnAssigned": "Move the task to another column when assignee is cleared",
"\Kanboard\Action\TaskMoveAnotherProject": "Move the task to another project",
"\Kanboard\Action\TaskOpen": "Open a task"
}
}
```
## getAvailableActionEvents
- Purpose: **Get list of available events for actions**
- Parameters: none
- Result on success: **list of events**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAvailableActionEvents",
"id": 2116665643
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2116665643,
"result": {
"bitbucket.webhook.commit": "Bitbucket commit received",
"task.close": "Closing a task",
"github.webhook.commit": "Github commit received",
"github.webhook.issue.assignee": "Github issue assignee change",
"github.webhook.issue.closed": "Github issue closed",
"github.webhook.issue.commented": "Github issue comment created",
"github.webhook.issue.label": "Github issue label change",
"github.webhook.issue.opened": "Github issue opened",
"github.webhook.issue.reopened": "Github issue reopened",
"gitlab.webhook.commit": "Gitlab commit received",
"gitlab.webhook.issue.closed": "Gitlab issue closed",
"gitlab.webhook.issue.opened": "Gitlab issue opened",
"task.move.column": "Move a task to another column",
"task.open": "Open a closed task",
"task.assignee_change": "Task assignee change",
"task.create": "Task creation",
"task.create_update": "Task creation or modification",
"task.update": "Task modification"
}
}
```
## getCompatibleActionEvents
- Purpose: **Get list of events compatible with an action**
- Parameters:
- **action_name** (string, required)
- Result on success: **list of events**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getCompatibleActionEvents",
"id": 899370297,
"params": [
"\Kanboard\Action\TaskClose"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 899370297,
"result": {
"bitbucket.webhook.commit": "Bitbucket commit received",
"github.webhook.commit": "Github commit received",
"github.webhook.issue.closed": "Github issue closed",
"gitlab.webhook.commit": "Gitlab commit received",
"gitlab.webhook.issue.closed": "Gitlab issue closed",
"task.move.column": "Move a task to another column"
}
}
```
## getActions
- Purpose: **Get list of actions for a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **list of actions properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getActions",
"id": 1433237746,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": [
{
"id" : "13",
"project_id" : "2",
"event_name" : "task.move.column",
"action_name" : "\Kanboard\Action\TaskAssignSpecificUser",
"params" : {
"column_id" : "5",
"user_id" : "1"
}
}
]
}
```
## createAction
- Purpose: **Create an action**
- Parameters:
- **project_id** (integer, required)
- **event_name** (string, required)
- **action_name** (string, required)
- **params** (key/value parameters, required)
- Result on success: **action_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createAction",
"id": 1433237746,
"params": {
"project_id" : "2",
"event_name" : "task.move.column",
"action_name" : "\Kanboard\Action\TaskAssignSpecificUser",
"params" : {
"column_id" : "3",
"user_id" : "2"
}
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": 14
}
```
## removeAction
- Purpose: **Remove an action**
- Parameters:
- **action_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeAction",
"id": 1510741671,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1510741671,
"result": true
}
```

View File

@ -1,291 +0,0 @@
API Application Procedures
==========================
## getVersion
- Purpose: **Get the application version**
- Parameters: none
- Result: **version** (Example: 1.0.12, master)
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getVersion",
"id": 1661138292
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1661138292,
"result": "1.0.13"
}
```
## getTimezone
- Purpose: **Get the application timezone**
- Parameters: none
- Result on success: **Timezone** (Example: UTC, Europe/Paris)
- Result on failure: **Default timezone** (UTC)
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getTimezone",
"id": 1661138292
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1661138292,
"result": "Europe\/Paris"
}
```
## getDefaultTaskColors
- Purpose: **Get all default task colors**
- Parameters: None
- Result on success: **Color properties**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getDefaultTaskColors",
"id": 2108929212
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2108929212,
"result": {
"yellow": {
"name": "Yellow",
"background": "rgb(245, 247, 196)",
"border": "rgb(223, 227, 45)"
},
"blue": {
"name": "Blue",
"background": "rgb(219, 235, 255)",
"border": "rgb(168, 207, 255)"
},
"green": {
"name": "Green",
"background": "rgb(189, 244, 203)",
"border": "rgb(74, 227, 113)"
},
"purple": {
"name": "Purple",
"background": "rgb(223, 176, 255)",
"border": "rgb(205, 133, 254)"
},
"red": {
"name": "Red",
"background": "rgb(255, 187, 187)",
"border": "rgb(255, 151, 151)"
},
"orange": {
"name": "Orange",
"background": "rgb(255, 215, 179)",
"border": "rgb(255, 172, 98)"
},
"grey": {
"name": "Grey",
"background": "rgb(238, 238, 238)",
"border": "rgb(204, 204, 204)"
},
"brown": {
"name": "Brown",
"background": "#d7ccc8",
"border": "#4e342e"
},
"deep_orange": {
"name": "Deep Orange",
"background": "#ffab91",
"border": "#e64a19"
},
"dark_grey": {
"name": "Dark Grey",
"background": "#cfd8dc",
"border": "#455a64"
},
"pink": {
"name": "Pink",
"background": "#f48fb1",
"border": "#d81b60"
},
"teal": {
"name": "Teal",
"background": "#80cbc4",
"border": "#00695c"
},
"cyan": {
"name": "Cyan",
"background": "#b2ebf2",
"border": "#00bcd4"
},
"lime": {
"name": "Lime",
"background": "#e6ee9c",
"border": "#afb42b"
},
"light_green": {
"name": "Light Green",
"background": "#dcedc8",
"border": "#689f38"
},
"amber": {
"name": "Amber",
"background": "#ffe082",
"border": "#ffa000"
}
}
}
```
## getDefaultTaskColor
- Purpose: **Get default task color**
- Parameters: None
- Result on success: **color_id**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getDefaultTaskColor",
"id": 1144775215
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1144775215,
"result": "yellow"
}
```
## getColorList
- Purpose: **Get the list of task colors**
- Parameters: none
- Result on success: **Dictionary of color_id => color_name**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getColorList",
"id": 1677051386
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1677051386,
"result": {
"yellow": "Yellow",
"blue": "Blue",
"green": "Green",
"purple": "Purple",
"red": "Red",
"orange": "Orange",
"grey": "Grey",
"brown": "Brown",
"deep_orange": "Deep Orange",
"dark_grey": "Dark Grey",
"pink": "Pink",
"teal": "Teal",
"cyan": "Cyan",
"lime": "Lime",
"light_green": "Light Green",
"amber": "Amber"
}
}
```
## getApplicationRoles
- Purpose: **Get the application roles**
- Parameters: none
- Result: **Dictionary of role => role_name**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getApplicationRoles",
"id": 317154243
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 317154243,
"result": {
"app-admin": "Administrator",
"app-manager": "Manager",
"app-user": "User"
}
}
```
## getProjectRoles
- Purpose: **Get the project roles**
- Parameters: none
- Result: **Dictionary of role => role_name**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectRoles",
"id": 8981960
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 8981960,
"result": {
"project-manager": "Project Manager",
"project-member": "Project Member",
"project-viewer": "Project Viewer"
}
}
```

View File

@ -1,56 +0,0 @@
API Authentication
==================
API endpoint
------------
URL: `https://YOUR_SERVER/jsonrpc.php`
Default method (HTTP Basic)
---------------------------
### Application credentials
- Username: `jsonrpc`
- Password: API token on the settings page
### User credentials
- Username: username
- Password: user password or personal access token
The API use the [HTTP Basic Authentication Scheme described in the RFC2617](http://www.ietf.org/rfc/rfc2617.txt).
Custom HTTP header
------------------
You can use an alternative HTTP header for the authentication if your server have a very specific configuration.
- The header name can be anything you want, by example `X-API-Auth`.
- The header value is the `username:password` encoded in Base64.
Configuration:
1. Define your custom header in your `config.php`: `define('API_AUTHENTICATION_HEADER', 'X-API-Auth');`
2. Encode the credentials in Base64, example with PHP `base64_encode('jsonrpc:19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929');`
3. Test with curl:
```bash
curl \
-H 'X-API-Auth: anNvbnJwYzoxOWZmZDk3MDlkMDNjZTUwNjc1YzNhNDNkMWM0OWMxYWMyMDdmNGJjNDVmMDZjNWIyNzAxZmJkZjg5Mjk=' \
-d '{"jsonrpc": "2.0", "method": "getAllProjects", "id": 1}' \
http://localhost/kanboard/jsonrpc.php
```
Authentication error
--------------------
If the credentials are wrong, you will receive a `401 Not Authorized` and the corresponding JSON response.
Authorization error
-------------------
If the connected user is not allowed to access to the resource, you will receive a `403 Forbidden`.

View File

@ -1,158 +0,0 @@
API Board Procedures
====================
## getBoard
- Purpose: **Get all necessary information to display a board**
- Parameters:
- **project_id** (integer, required)
- Result on success: **board properties**
- Result on failure: **empty list**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getBoard",
"id": 827046470,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 827046470,
"result": [
{
"id": 0,
"name": "Default swimlane",
"columns": [
{
"id": "1",
"title": "Backlog",
"position": "1",
"project_id": "1",
"task_limit": "0",
"description": "",
"tasks": [],
"nb_tasks": 0,
"score": 0
},
{
"id": "2",
"title": "Ready",
"position": "2",
"project_id": "1",
"task_limit": "0",
"description": "",
"tasks": [
{
"nb_comments":"0",
"nb_files":"0",
"nb_subtasks":"0",
"nb_completed_subtasks":"0",
"nb_links":"0",
"id":"2",
"reference":"",
"title":"Test",
"description":"",
"date_creation":"1430870507",
"date_modification":"1430870507",
"date_completed":null,
"date_due":"0",
"color_id":"yellow",
"project_id":"1",
"column_id":"2",
"swimlane_id":"0",
"owner_id":"0",
"creator_id":"1",
"position":"1",
"is_active":"1",
"score":"0",
"category_id":"0",
"date_moved":"1430870507",
"recurrence_status":"0",
"recurrence_trigger":"0",
"recurrence_factor":"0",
"recurrence_timeframe":"0",
"recurrence_basedate":"0",
"recurrence_parent":null,
"recurrence_child":null,
"assignee_username":null,
"assignee_name":null
}
],
"nb_tasks": 1,
"score": 0
},
{
"id": "3",
"title": "Work in progress",
"position": "3",
"project_id": "1",
"task_limit": "0",
"description": "",
"tasks": [
{
"nb_comments":"0",
"nb_files":"0",
"nb_subtasks":"1",
"nb_completed_subtasks":"0",
"nb_links":"0",
"id":"1",
"reference":"",
"title":"Task with comment",
"description":"",
"date_creation":"1430783188",
"date_modification":"1430783188",
"date_completed":null,
"date_due":"0",
"color_id":"red",
"project_id":"1",
"column_id":"3",
"swimlane_id":"0",
"owner_id":"1",
"creator_id":"0",
"position":"1",
"is_active":"1",
"score":"0",
"category_id":"0",
"date_moved":"1430783191",
"recurrence_status":"0",
"recurrence_trigger":"0",
"recurrence_factor":"0",
"recurrence_timeframe":"0",
"recurrence_basedate":"0",
"recurrence_parent":null,
"recurrence_child":null,
"assignee_username":"admin",
"assignee_name":null
}
],
"nb_tasks": 1,
"score": 0
},
{
"id": "4",
"title": "Done",
"position": "4",
"project_id": "1",
"task_limit": "0",
"description": "",
"tasks": [],
"nb_tasks": 0,
"score": 0
}
],
"nb_columns": 4,
"nb_tasks": 2
}
]
}
```

View File

@ -1,172 +0,0 @@
API Category Procedures
=======================
## createCategory
- Purpose: **Create a new category**
- Parameters:
- **project_id** (integer, required)
- **name** (string, required, must be unique for the given project)
- Result on success: **category_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createCategory",
"id": 541909890,
"params": {
"name": "Super category",
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 541909890,
"result": 4
}
```
## getCategory
- Purpose: **Get category information**
- Parameters:
- **category_id** (integer, required)
- Result on success: **category properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getCategory",
"id": 203539163,
"params": {
"category_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 203539163,
"result": {
"id": "1",
"name": "Super category",
"project_id": "1"
}
}
```
## getAllCategories
- Purpose: **Get all available categories**
- Parameters:
- **project_id** (integer, required)
- Result on success: **List of categories**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllCategories",
"id": 1261777968,
"params": {
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1261777968,
"result": [
{
"id": "1",
"name": "Super category",
"project_id": "1"
}
]
}
```
## updateCategory
- Purpose: **Update a category**
- Parameters:
- **id** (integer, required)
- **name** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateCategory",
"id": 570195391,
"params": {
"id": 1,
"name": "Renamed category"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 570195391,
"result": true
}
```
## removeCategory
- Purpose: **Remove a category**
- Parameters:
- **category_id** (integer)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeCategory",
"id": 88225706,
"params": {
"category_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 88225706,
"result": true
}
```

View File

@ -1,229 +0,0 @@
API Column Procedures
=====================
## getColumns
- Purpose: **Get all columns information for a given project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **columns properties**
- Result on failure: **empty list**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getColumns",
"id": 887036325,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 887036325,
"result": [
{
"id": "1",
"title": "Backlog",
"position": "1",
"project_id": "1",
"task_limit": "0"
},
{
"id": "2",
"title": "Ready",
"position": "2",
"project_id": "1",
"task_limit": "0"
},
{
"id": "3",
"title": "Work in progress",
"position": "3",
"project_id": "1",
"task_limit": "0"
}
]
}
```
## getColumn
- Purpose: **Get a single column**
- Parameters:
- **column_id** (integer, required)
- Result on success: **column properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getColumn",
"id": 1242049935,
"params": [
2
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1242049935,
"result": {
"id": "2",
"title": "Youpi",
"position": "2",
"project_id": "1",
"task_limit": "5"
}
}
```
## changeColumnPosition
- Purpose: **Change the column position**
- Parameters:
- **project_id** (integer, required)
- **column_id** (integer, required)
- **position** (integer, required, must be >= 1)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "changeColumnPosition",
"id": 99275573,
"params": [
1,
2,
3
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 99275573,
"result": true
}
```
## updateColumn
- Purpose: **Update column properties**
- Parameters:
- **column_id** (integer, required)
- **title** (string, required)
- **task_limit** (integer, optional)
- **description** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateColumn",
"id": 480740641,
"params": [
2,
"Boo",
5
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 480740641,
"result": true
}
```
## addColumn
- Purpose: **Add a new column**
- Parameters:
- **project_id** (integer, required)
- **title** (string, required)
- **task_limit** (integer, optional)
- **description** (string, optional)
- Result on success: **column_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "addColumn",
"id": 638544704,
"params": [
1,
"Boo"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 638544704,
"result": 5
}
```
## removeColumn
- Purpose: **Remove a column**
- Parameters:
- **column_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeColumn",
"id": 1433237746,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": true
}
```

View File

@ -1,182 +0,0 @@
API Comment Procedures
======================
## createComment
- Purpose: **Create a new comment**
- Parameters:
- **task_id** (integer, required)
- **user_id** (integer, required)
- **content** Markdown content (string, required)
- Result on success: **comment_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createComment",
"id": 1580417921,
"params": {
"task_id": 1,
"user_id": 1,
"content": "Comment #1"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1580417921,
"result": 11
}
```
## getComment
- Purpose: **Get comment information**
- Parameters:
- **comment_id** (integer, required)
- Result on success: **comment properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getComment",
"id": 867839500,
"params": {
"comment_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 867839500,
"result": {
"id": "1",
"task_id": "1",
"user_id": "1",
"date_creation": "1410881970",
"comment": "Comment #1",
"username": "admin",
"name": null
}
}
```
## getAllComments
- Purpose: **Get all available comments**
- Parameters:
- **task_id** (integer, required)
- Result on success: **List of comments**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllComments",
"id": 148484683,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 148484683,
"result": [
{
"id": "1",
"date_creation": "1410882272",
"task_id": "1",
"user_id": "1",
"comment": "Comment #1",
"username": "admin",
"name": null
},
...
]
}
```
## updateComment
- Purpose: **Update a comment**
- Parameters:
- **id** (integer, required)
- **content** Markdown content (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateComment",
"id": 496470023,
"params": {
"id": 1,
"content": "Comment #1 updated"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1493368950,
"result": true
}
```
## removeComment
- Purpose: **Remove a comment**
- Parameters:
- **comment_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeComment",
"id": 328836871,
"params": {
"comment_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 328836871,
"result": true
}
```

View File

@ -1,152 +0,0 @@
API Examples
============
Example with cURL
-----------------
From the command line:
```bash
curl \
-u "jsonrpc:19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929" \
-d '{"jsonrpc": "2.0", "method": "getAllProjects", "id": 1}' \
http://localhost/kanboard/jsonrpc.php
```
Response from the server:
```json
{
"jsonrpc":"2.0",
"id":1,
"result":[
{
"id":"1",
"name":"API test",
"is_active":"1",
"token":"6bd0932fe7f4b5e6e4bc3c72800bfdef36a2c5de2f38f756dfb5bd632ebf",
"last_modified":"1403392631"
}
]
}
```
Example with Python
-------------------
You can use the [official Python client for Kanboard](https://github.com/kanboard/kanboard-api-python):
```bash
pip install kanboard
```
Here an example to create a project and a task:
```python
from kanboard import Kanboard
kb = Kanboard("http://localhost/jsonrpc.php", "jsonrpc", "your_api_token")
project_id = kb.create_project(name="My project")
task_id = kb.create_task(project_id=project_id, title="My task title")
```
There are more examples on the [official website](https://github.com/kanboard/kanboard-api-python).
Example with a PHP client
-------------------------
You can use this [Json-RPC Client/Server library for PHP](https://github.com/fguillot/JsonRPC), here an example:
```php
<?php
$client = new JsonRPC\Client('http://localhost:8000/jsonrpc.php');
$client->authentication('jsonrpc', '19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929');
print_r($client->getAllProjects());
```
The response:
```
Array
(
[0] => Array
(
[id] => 1
[name] => API test
[is_active] => 1
[token] => 6bd0932fe7f4b5e6e4bc3c72800bfdef36a2c5de2f38f756dfb5bd632ebf
[last_modified] => 1403392631
)
)
```
Example with Ruby
-----------------
This example can be used with Kanboard configured with Reverse-Proxy authentication and the API configured with a custom authentication header:
```ruby
require 'faraday'
conn = Faraday.new(:url => 'https://kanboard.example.com') do |faraday|
faraday.response :logger
faraday.headers['X-API-Auth'] = 'XXX' # base64_encode('jsonrpc:API_KEY')
faraday.basic_auth(ENV['user'], ENV['pw']) # user/pass to get through basic auth
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
end
response = conn.post do |req|
req.url '/jsonrpc.php'
req.headers['Content-Type'] = 'application/json'
req.body = '{ "jsonrpc": "2.0", "id": 1, "method": "getAllProjects" }'
end
puts response.body
```
Example with Java
-----------------
This is a basic example using Spring. For proper usage see [this link](http://spring.io/guides/gs/consuming-rest).
```java
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
public class ProjectService {
public void getAllProjects() throws UnsupportedEncodingException {
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost/kanboard/jsonrpc.php";
String requestJson = "{\"jsonrpc\": \"2.0\", \"method\": \"getAllProjects\", \"id\": 1}";
String user = "jsonrpc";
String apiToken = "19ffd9709d03ce50675c3a43d1c49c1ac207f4bc45f06c5b2701fbdf8929";
// encode api token
byte[] xApiAuthTokenBytes = String.join(":", user, apiToken).getBytes("utf-8");
String xApiAuthToken = Base64.getEncoder().encodeToString(xApiAuthTokenBytes);
// consume request
HttpHeaders headers = new HttpHeaders();
headers.add("X-API-Auth", xApiAuthToken);
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);
}
}
```

View File

@ -1,221 +0,0 @@
External Task Link API Procedures
=================================
## getExternalTaskLinkTypes
- Purpose: **Get all registered external link providers**
- Parameters: **none**
- Result on success: **dict**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"getExternalTaskLinkTypes","id":477370568}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": {
"auto": "Auto",
"attachment": "Attachment",
"file": "Local File",
"weblink": "Web Link"
},
"id": 477370568
}
```
## getExternalTaskLinkProviderDependencies
- Purpose: **Get available dependencies for a given provider**
- Parameters:
- **providerName** (string, required)
- Result on success: **dict**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"getExternalTaskLinkProviderDependencies","id":124790226,"params":["weblink"]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": {
"related": "Related"
},
"id": 124790226
}
```
## createExternalTaskLink
- Purpose: **Create a new external link**
- Parameters:
- **task_id** (integer, required)
- **url** (string, required)
- **dependency** (string, required)
- **type** (string, optional)
- **title** (string, optional)
- Result on success: **link_id**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"createExternalTaskLink","id":924217495,"params":[9,"http:\/\/localhost\/document.pdf","related","attachment"]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": 1,
"id": 924217495
}
```
## updateExternalTaskLink
- Purpose: **Update external task link**
- Parameters:
- **task_id** (integer, required)
- **link_id** (integer, required)
- **title** (string, required)
- **url** (string, required)
- **dependency** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc":"2.0",
"method":"updateExternalTaskLink",
"id":1123562620,
"params": {
"task_id":9,
"link_id":1,
"title":"New title"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 1123562620
}
```
## getExternalTaskLinkById
- Purpose: **Get an external task link**
- Parameters:
- **task_id** (integer, required)
- **link_id** (integer, required)
- Result on success: **dict**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"getExternalTaskLinkById","id":2107066744,"params":[9,1]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": {
"id": "1",
"link_type": "attachment",
"dependency": "related",
"title": "document.pdf",
"url": "http:\/\/localhost\/document.pdf",
"date_creation": "1466965256",
"date_modification": "1466965256",
"task_id": "9",
"creator_id": "0"
},
"id": 2107066744
}
```
## getAllExternalTaskLinks
- Purpose: **Get all external links attached to a task**
- Parameters:
- **task_id** (integer, required)
- Result on success: **list of external links**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"getAllExternalTaskLinks","id":2069307223,"params":[9]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": [
{
"id": "1",
"link_type": "attachment",
"dependency": "related",
"title": "New title",
"url": "http:\/\/localhost\/document.pdf",
"date_creation": "1466965256",
"date_modification": "1466965256",
"task_id": "9",
"creator_id": "0",
"creator_name": null,
"creator_username": null,
"dependency_label": "Related",
"type": "Attachment"
}
],
"id": 2069307223
}
```
## removeExternalTaskLink
- Purpose: **Remove an external link**
- Parameters:
- **task_id** (integer, required)
- **link_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"removeExternalTaskLink","id":552055660,"params":[9,1]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 552055660
}
```

View File

@ -1,188 +0,0 @@
Group Member API Procedures
===========================
## getMemberGroups
- Purpose: **Get all groups for a given user**
- Parameters:
- **user_id** (integer, required)
- Result on success: **List of groups**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getMemberGroups",
"id": 1987176726,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1987176726,
"result": [
{
"id": "1",
"name": "My Group A"
}
]
}
```
## getGroupMembers
- Purpose: **Get all members of a group**
- Parameters:
- **group_id** (integer, required)
- Result on success: **List of users**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getGroupMembers",
"id": 1987176726,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1987176726,
"result": [
{
"group_id": "1",
"user_id": "1",
"id": "1",
"username": "admin",
"is_ldap_user": "0",
"name": null,
"email": null,
"notifications_enabled": "0",
"timezone": null,
"language": null,
"disable_login_form": "0",
"notifications_filter": "4",
"nb_failed_login": "0",
"lock_expiration_date": "0",
"is_project_admin": "0",
"gitlab_id": null,
"role": "app-admin"
}
]
}
```
## addGroupMember
- Purpose: **Add a user to a group**
- Parameters:
- **group_id** (integer, required)
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "addGroupMember",
"id": 1589058273,
"params": [
1,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1589058273,
"result": true
}
```
## removeGroupMember
- Purpose: **Remove a user from a group**
- Parameters:
- **group_id** (integer, required)
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeGroupMember",
"id": 1730416406,
"params": [
1,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1730416406,
"result": true
}
```
## isGroupMember
- Purpose: **Check if a user is member of a group**
- Parameters:
- **group_id** (integer, required)
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "isGroupMember",
"id": 1052800865,
"params": [
1,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1052800865,
"result": false
}
```

View File

@ -1,174 +0,0 @@
Group API Procedures
====================
## createGroup
- Purpose: **Create a new group**
- Parameters:
- **name** (string, required)
- **external_id** (string, optional)
- Result on success: **link_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createGroup",
"id": 1416806551,
"params": [
"My Group B",
"1234"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1416806551,
"result": 2
}
```
## updateGroup
- Purpose: **Update a group**
- Parameters:
- **group_id** (integer, required)
- **name** (string, optional)
- **external_id** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateGroup",
"id": 866078030,
"params": {
"group_id": "1",
"name": "ABC",
"external_id": "something"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 866078030,
"result": true
}
```
## removeGroup
- Purpose: **Remove a group**
- Parameters:
- **group_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeGroup",
"id": 566000661,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 566000661,
"result": true
}
```
## getGroup
- Purpose: **Get one group**
- Parameters:
- **group_id** (integer, required)
- Result on success: **Group dictionary**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getGroup",
"id": 1968647622,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1968647622,
"result": {
"id": "1",
"external_id": "",
"name": "My Group A"
}
}
```
## getAllGroups
- Purpose: **Get all groups**
- Parameters: none
- Result on success: **list of groups**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllGroups",
"id": 546070742
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 546070742,
"result": [
{
"id": "1",
"external_id": "",
"name": "My Group A"
},
{
"id": "2",
"external_id": "1234",
"name": "My Group B"
}
]
}
```

View File

@ -1,187 +0,0 @@
Internal Task Link API Procedures
=================================
## createTaskLink
- Purpose: **Create a link between two tasks**
- Parameters:
- **task_id** (integer, required)
- **opposite_task_id** (integer, required)
- **link_id** (integer, required)
- Result on success: **task_link_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createTaskLink",
"id": 509742912,
"params": [
2,
3,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 509742912,
"result": 1
}
```
## updateTaskLink
- Purpose: **Update task link**
- Parameters:
- **task_link_id** (integer, required)
- **task_id** (integer, required)
- **opposite_task_id** (integer, required)
- **link_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateTaskLink",
"id": 669037109,
"params": [
1,
2,
4,
2
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 669037109,
"result": true
}
```
## getTaskLinkById
- Purpose: **Get a task link**
- Parameters:
- **task_link_id** (integer, required)
- Result on success: **task link properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getTaskLinkById",
"id": 809885202,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 809885202,
"result": {
"id": "1",
"link_id": "1",
"task_id": "2",
"opposite_task_id": "3"
}
}
```
## getAllTaskLinks
- Purpose: **Get all links related to a task**
- Parameters:
- **task_id** (integer, required)
- Result on success: **list of task link**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllTaskLinks",
"id": 810848359,
"params": [
2
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 810848359,
"result": [
{
"id": "1",
"task_id": "3",
"label": "relates to",
"title": "B",
"is_active": "1",
"project_id": "1",
"task_time_spent": "0",
"task_time_estimated": "0",
"task_assignee_id": "0",
"task_assignee_username": null,
"task_assignee_name": null,
"column_title": "Backlog"
}
]
}
```
## removeTaskLink
- Purpose: **Remove a link between two tasks**
- Parameters:
- **task_link_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeTaskLink",
"id": 473028226,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 473028226,
"result": true
}
```

View File

@ -1,73 +0,0 @@
Json-RPC API
============
User and application API
------------------------
There are two types of API access:
### Application API
- Access to the API with the user "jsonrpc" and the token available on the settings page
- Access to all procedures
- No permission checked
- There is no user session on the server
- No access to procedures that starts with "My..." (example: "getMe" or "getMyProjects")
- Example of possible clients: tools to migrate/import data, create tasks from another system, etc...
### User API
- Access to the API with the user credentials (username and password)
- You can also generate a personal access token instead of your password
- Application role and project permissions are checked for each procedure
- A user session is created on the server
- Example of possible clients: native mobile/desktop application, command line utility, etc...
Security
--------
- Always use HTTPS with a valid certificate (avoid clear text communication)
- If you make a mobile application, it's your responsability to store securely the user credentials on the device
- After 3 authentication failure on the user api, the end-user have to unlock his account by using the login form
- Two factor authentication is not yet available through the API
Protocol
--------
Kanboard use the protocol Json-RPC to interact with external programs.
JSON-RPC is a remote procedure call protocol encoded in JSON.
Almost the same thing as XML-RPC but with the JSON format.
We use the [version 2 of the protocol](http://www.jsonrpc.org/specification).
You must call the API with a `POST` HTTP request.
Kanboard support batch requests, so you can make multiple API calls in a single HTTP request. It's particularly useful for mobile clients with higher network latency.
Usage
-----
- [Authentication](api-authentication.markdown)
- [Examples](api-examples.markdown)
- [Application](api-application-procedures.markdown)
- [Projects](api-project-procedures.markdown)
- [Project Permissions](api-project-permission-procedures.markdown)
- [Boards](api-board-procedures.markdown)
- [Columns](api-column-procedures.markdown)
- [Swimlanes](api-swimlane-procedures.markdown)
- [Categories](api-category-procedures.markdown)
- [Automatic Actions](api-action-procedures.markdown)
- [Tasks](api-task-procedures.markdown)
- [Subtasks](api-subtask-procedures.markdown)
- [Subtask Time Tracking](api-subtask-time-tracking-procedures.markdown)
- [Task Files](api-task-file-procedures.markdown)
- [Project Files](api-project-file-procedures.markdown)
- [Links](api-link-procedures.markdown)
- [Tags](api-tags-procedures.markdown)
- [Internal Task Links](api-internal-task-link-procedures.markdown)
- [External Task Links](api-external-task-link-procedures.markdown)
- [Comments](api-comment-procedures.markdown)
- [Users](api-user-procedures.markdown)
- [Groups](api-group-procedures.markdown)
- [Group Members](api-group-member-procedures.markdown)
- [Me](api-me-procedures.markdown)

View File

@ -1,285 +0,0 @@
API Link Procedures
===================
## getAllLinks
- Purpose: **Get the list of possible relations between tasks**
- Parameters: none
- Result on success: **List of links**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllLinks",
"id": 113057196
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 113057196,
"result": [
{
"id": "1",
"label": "relates to",
"opposite_id": "0"
},
{
"id": "2",
"label": "blocks",
"opposite_id": "3"
},
{
"id": "3",
"label": "is blocked by",
"opposite_id": "2"
},
{
"id": "4",
"label": "duplicates",
"opposite_id": "5"
},
{
"id": "5",
"label": "is duplicated by",
"opposite_id": "4"
},
{
"id": "6",
"label": "is a child of",
"opposite_id": "7"
},
{
"id": "7",
"label": "is a parent of",
"opposite_id": "6"
},
{
"id": "8",
"label": "targets milestone",
"opposite_id": "9"
},
{
"id": "9",
"label": "is a milestone of",
"opposite_id": "8"
},
{
"id": "10",
"label": "fixes",
"opposite_id": "11"
},
{
"id": "11",
"label": "is fixed by",
"opposite_id": "10"
}
]
}
```
## getOppositeLinkId
- Purpose: **Get the opposite link id of a task link**
- Parameters:
- **link_id** (integer, required)
- Result on success: **link_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getOppositeLinkId",
"id": 407062448,
"params": [
2
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 407062448,
"result": "3"
}
```
## getLinkByLabel
- Purpose: **Get a link by label**
- Parameters:
- **label** (integer, required)
- Result on success: **link properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getLinkByLabel",
"id": 1796123316,
"params": [
"blocks"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1796123316,
"result": {
"id": "2",
"label": "blocks",
"opposite_id": "3"
}
}
```
## getLinkById
- Purpose: **Get a link by id**
- Parameters:
- **link_id** (integer, required)
- Result on success: **link properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getLinkById",
"id": 1190238402,
"params": [
4
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1190238402,
"result": {
"id": "4",
"label": "duplicates",
"opposite_id": "5"
}
}
```
## createLink
- Purpose: **Create a new task relation**
- Parameters:
- **label** (integer, required)
- **opposite_label** (integer, optional)
- Result on success: **link_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createLink",
"id": 1040237496,
"params": [
"foo",
"bar"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1040237496,
"result": 13
}
```
## updateLink
- Purpose: **Update a link**
- Parameters:
- **link_id** (integer, required)
- **opposite_link_id** (integer, required)
- **label** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateLink",
"id": 2110446926,
"params": [
"14",
"12",
"boo"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2110446926,
"result": true
}
```
## removeLink
- Purpose: **Remove a link**
- Parameters:
- **link_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeLink",
"id": 2136522739,
"params": [
"14"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2136522739,
"result": true
}
```

View File

@ -1,383 +0,0 @@
User API Specific Procedures
============================
## getMe
- Purpose: **Get logged user session**
- Parameters: None
- Result on success: **user session data**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getMe",
"id": 1718627783
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1718627783,
"result": {
"id": 2,
"username": "user",
"role": "app-user",
"is_ldap_user": false,
"name": "",
"email": "",
"google_id": null,
"github_id": null,
"notifications_enabled": "0",
"timezone": null,
"language": null,
"disable_login_form": "0",
"twofactor_activated": false,
"twofactor_secret": null,
"token": "",
"notifications_filter": "4"
}
}
```
## getMyDashboard
- Purpose: **Get the dashboard of the logged user without pagination**
- Parameters: None
- Result on success: **Dashboard information**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getMyDashboard",
"id": 447898718
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1563664593,
"result": {
"projects": [
{
"id": "2",
"name": "my project",
"is_active": "1",
"token": "",
"last_modified": "1438205337",
"is_public": "0",
"is_private": "1",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": null,
"identifier": "",
"columns": [
{
"id": "5",
"title": "Backlog",
"position": "1",
"project_id": "2",
"task_limit": "0",
"description": "",
"nb_tasks": 0
},
{
"id": "6",
"title": "Ready",
"position": "2",
"project_id": "2",
"task_limit": "0",
"description": "",
"nb_tasks": 0
},
{
"id": "7",
"title": "Work in progress",
"position": "3",
"project_id": "2",
"task_limit": "0",
"description": "",
"nb_tasks": 0
},
{
"id": "8",
"title": "Done",
"position": "4",
"project_id": "2",
"task_limit": "0",
"description": "",
"nb_tasks": 0
}
],
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=2",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=2",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=2"
}
}
],
"tasks": [
{
"id": "1",
"title": "new title",
"date_due": "0",
"date_creation": "1438205336",
"project_id": "2",
"color_id": "yellow",
"time_spent": "0",
"time_estimated": "0",
"project_name": "my project",
"url": "http:\/\/127.0.0.1:8000\/?controller=task&action=show&task_id=1&project_id=2"
}
],
"subtasks": []
}
}
```
## getMyActivityStream
- Purpose: **Get the last 100 events for the logged user**
- Parameters: None
- Result on success: **List of events**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getMyActivityStream",
"id": 1132562181
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1132562181,
"result": [
{
"id": "1",
"date_creation": "1438205054",
"event_name": "task.create",
"creator_id": "2",
"project_id": "2",
"task_id": "1",
"author_username": "user",
"author_name": "",
"email": "",
"task": {
"id": "1",
"reference": "",
"title": "my user title",
"description": "",
"date_creation": "1438205054",
"date_completed": null,
"date_modification": "1438205054",
"date_due": "0",
"date_started": null,
"time_estimated": "0",
"time_spent": "0",
"color_id": "yellow",
"project_id": "2",
"column_id": "5",
"owner_id": "0",
"creator_id": "2",
"position": "1",
"is_active": "1",
"score": "0",
"category_id": "0",
"swimlane_id": "0",
"date_moved": "1438205054",
"recurrence_status": "0",
"recurrence_trigger": "0",
"recurrence_factor": "0",
"recurrence_timeframe": "0",
"recurrence_basedate": "0",
"recurrence_parent": null,
"recurrence_child": null,
"category_name": null,
"swimlane_name": null,
"project_name": "my project",
"default_swimlane": "Default swimlane",
"column_title": "Backlog",
"assignee_username": null,
"assignee_name": null,
"creator_username": "user",
"creator_name": ""
},
"changes": [],
"author": "user",
"event_title": "user created the task #1",
"event_content": "\n<p class=\"activity-title\">\n user created the task <a href=\"\/?controller=task&amp;action=show&amp;task_id=1&amp;project_id=2\" class=\"\" title=\"\" >#1<\/a><\/p>\n<p class=\"activity-description\">\n <em>my user title<\/em>\n<\/p>"
}
]
}
```
## createMyPrivateProject
- Purpose: **Create a private project for the logged user**
- Parameters:
- **name** (string, required)
- **description** (string, optional)
- Result on success: **project_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createMyPrivateProject",
"id": 1271580569,
"params": [
"my project"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1271580569,
"result": 2
}
```
## getMyProjectsList
- Purpose: **Get projects of the connected user**
- Parameters: None
- Result on success: **dictionary of project_id => project_name**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getMyProjectsList",
"id": 987834805
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 987834805,
"result": {
"2": "my project"
}
}
```
## getMyOverdueTasks
- Purpose: **Get my overdue tasks**
- Result on success: **List of tasks**
- Result on failure: **false**
Request example to fetch all tasks on the board:
```json
{
"jsonrpc": "2.0",
"method": "getMyOverdueTasks",
"id": 133280317
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": [
{
"id": "1",
"title": "Task #1",
"date_due": "1409961789",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
{
"id": "2",
"title": "Test",
"date_due": "1409962115",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
...
]
}
```
## getMyProjects
- Purpose: **Get projects of connected user with full details**
- Parameters:
- **none**
- Result on success: **List of projects with details**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getmyProjects",
"id": 2134420212
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2134420212,
"result": [
{
"id": "1",
"name": "API test",
"is_active": "1",
"token": "",
"last_modified": "1436119570",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": null,
"identifier": "",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
]
}
```

View File

@ -1,221 +0,0 @@
Project File API Procedures
===========================
## createProjectFile
- Purpose: **Create and upload a new project attachment**
- Parameters:
- **project_id** (integer, required)
- **filename** (integer, required)
- **blob** File content encoded in base64 (string, required)
- Result on success: **file_id**
- Result on failure: **false**
- Note: **The maximum file size depends of your PHP configuration, this method should not be used to upload large files**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createProjectFile",
"id": 94500810,
"params": [
1,
"My file",
"cGxhaW4gdGV4dCBmaWxl"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 94500810,
"result": 1
}
```
## getAllProjectFiles
- Purpose: **Get all files attached to a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **list of files**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllProjectFiles",
"id": 1880662820,
"params": {
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1880662820,
"result": [
{
"id": "1",
"name": "My file",
"path": "1\/1\/0db4d0a897a4c852f6e12f0239d4805f7b4ab596",
"is_image": "0",
"project_id": "1",
"date": "1432509941",
"user_id": "0",
"size": "15",
"username": null,
"user_name": null
}
]
}
```
## getProjectFile
- Purpose: **Get file information**
- Parameters:
- **project_id** (integer, required)
- **file_id** (integer, required)
- Result on success: **file properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectFile",
"id": 318676852,
"params": [
"42",
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 318676852,
"result": {
"id": "1",
"name": "My file",
"path": "1\/1\/0db4d0a897a4c852f6e12f0239d4805f7b4ab596",
"is_image": "0",
"project_id": "1",
"date": "1432509941",
"user_id": "0",
"size": "15"
}
}
```
## downloadProjectFile
- Purpose: **Download project file contents (encoded in base64)**
- Parameters:
- **project_id** (integer, required)
- **file_id** (integer, required)
- Result on success: **base64 encoded string**
- Result on failure: **empty string**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "downloadProjectFile",
"id": 235943344,
"params": [
"1",
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 235943344,
"result": "cGxhaW4gdGV4dCBmaWxl"
}
```
## removeProjectFile
- Purpose: **Remove a file associated to a project**
- Parameters:
- **project_id** (integer, required)
- **file_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeProjectFile",
"id": 447036524,
"params": [
"1",
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 447036524,
"result": true
}
```
## removeAllProjectFiles
- Purpose: **Remove all files associated to a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeAllProjectFiles",
"id": 593312993,
"params": {
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 593312993,
"result": true
}
```

View File

@ -1,307 +0,0 @@
Project Permission API Procedures
=================================
## getProjectUsers
- Purpose: **Get all members of a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **Dictionary of user_id => user name**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectUsers",
"id": 1601016721,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1601016721,
"result": {
"1": "admin"
}
}
```
## getAssignableUsers
- Purpose: **Get users that can be assigned to a task for a project** (all members except viewers)
- Parameters:
- **project_id** (integer, required)
- **prepend_unassigned** (boolean, optional, default is false)
- Result on success: **Dictionary of user_id => user name**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAssignableUsers",
"id": 658294870,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 658294870,
"result": {
"1": "admin"
}
}
```
## addProjectUser
- Purpose: **Grant access to a project for a user**
- Parameters:
- **project_id** (integer, required)
- **user_id** (integer, required)
- **role** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "addProjectUser",
"id": 1294688355,
"params": [
"1",
"1",
"project-viewer"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1294688355,
"result": true
}
```
## addProjectGroup
- Purpose: **Grant access to a project for a group**
- Parameters:
- **project_id** (integer, required)
- **group_id** (integer, required)
- **role** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "addProjectGroup",
"id": 1694959089,
"params": [
"1",
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1694959089,
"result": true
}
```
## removeProjectUser
- Purpose: **Revoke user access to a project**
- Parameters:
- **project_id** (integer, required)
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeProjectUser",
"id": 645233805,
"params": [
1,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 645233805,
"result": true
}
```
## removeProjectGroup
- Purpose: **Revoke group access to a project**
- Parameters:
- **project_id** (integer, required)
- **group_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeProjectGroup",
"id": 557146966,
"params": [
1,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 557146966,
"result": true
}
```
## changeProjectUserRole
- Purpose: **Change role of a user for a project**
- Parameters:
- **project_id** (integer, required)
- **user_id** (integer, required)
- **role** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "changeProjectUserRole",
"id": 193473170,
"params": [
"1",
"1",
"project-viewer"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 193473170,
"result": true
}
```
## changeProjectGroupRole
- Purpose: **Change role of a group for a project**
- Parameters:
- **project_id** (integer, required)
- **group_id** (integer, required)
- **role** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "changeProjectGroupRole",
"id": 2114673298,
"params": [
"1",
"1",
"project-viewer"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2114673298,
"result": true
}
```
## getProjectUserRole
- Purpose: **Get the role of a user for a given project**
- Parameters:
- **project_id** (integer, required)
- **user_id** (integer, required)
- Result on success: **role name**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectUserRole",
"id": 2114673298,
"params": [
"2",
"3"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2114673298,
"result": "project-viewer"
}
```

View File

@ -1,509 +0,0 @@
API Project Procedures
======================
## createProject
- Purpose: **Create a new project**
- Parameters:
- **name** (string, required)
- **description** (string, optional)
- **owner_id** (integer, optional)
- **identifier** (string, optional)
- Result on success: **project_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createProject",
"id": 1797076613,
"params": {
"name": "PHP client"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1797076613,
"result": 2
}
```
## getProjectById
- Purpose: **Get project information**
- Parameters:
- **project_id** (integer, required)
- Result on success: **project properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectById",
"id": 226760253,
"params": {
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 226760253,
"result": {
"id": "1",
"name": "API test",
"is_active": "1",
"token": "",
"last_modified": "1436119135",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": "test",
"identifier": "",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
}
```
## getProjectByName
- Purpose: **Get project information**
- Parameters:
- **name** (string, required)
- Result on success: **project properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectByName",
"id": 1620253806,
"params": {
"name": "Test"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1620253806,
"result": {
"id": "1",
"name": "Test",
"is_active": "1",
"token": "",
"last_modified": "1436119135",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": "test",
"identifier": "",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
}
```
## getProjectByIdentifier
- Purpose: **Get project information**
- Parameters:
- **identifier** (string, required)
- Result on success: **project properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectByIdentifier",
"id": 1620253806,
"params": {
"identifier": "TEST"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1620253806,
"result": {
"id": "1",
"name": "Test",
"is_active": "1",
"token": "",
"last_modified": "1436119135",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": "test",
"identifier": "TEST",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
}
```
## getProjectByEmail
- Purpose: **Get project information**
- Parameters:
- **email** (string, required)
- Result on success: **project properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectByEmail",
"id": 1620253806,
"params": {
"email": "my_project@my_domain.tld"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1620253806,
"result": {
"id": "1",
"name": "Test",
"is_active": "1",
"token": "",
"last_modified": "1436119135",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": "test",
"identifier": "",
"email": "my_project@my_domain.tld",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
}
```
## getAllProjects
- Purpose: **Get all available projects**
- Parameters:
- **none**
- Result on success: **List of projects**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllProjects",
"id": 2134420212
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2134420212,
"result": [
{
"id": "1",
"name": "API test",
"is_active": "1",
"token": "",
"last_modified": "1436119570",
"is_public": "0",
"is_private": "0",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1",
"description": null,
"identifier": "",
"url": {
"board": "http:\/\/127.0.0.1:8000\/?controller=board&action=show&project_id=1",
"calendar": "http:\/\/127.0.0.1:8000\/?controller=calendar&action=show&project_id=1",
"list": "http:\/\/127.0.0.1:8000\/?controller=listing&action=show&project_id=1"
}
}
]
}
```
## updateProject
- Purpose: **Update a project**
- Parameters:
- **project_id** (integer, required)
- **name** (string, optional)
- **description** (string, optional)
- **owner_id** (integer, optional)
- **identifier** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateProject",
"id": 1853996288,
"params": {
"project_id": 1,
"name": "PHP client update"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1853996288,
"result": true
}
```
## removeProject
- Purpose: **Remove a project**
- Parameters:
**project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeProject",
"id": 46285125,
"params": {
"project_id": "2"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 46285125,
"result": true
}
```
## enableProject
- Purpose: **Enable a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "enableProject",
"id": 1775494839,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1775494839,
"result": true
}
```
## disableProject
- Purpose: **Disable a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "disableProject",
"id": 1734202312,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1734202312,
"result": true
}
```
## enableProjectPublicAccess
- Purpose: **Enable public access for a given project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "enableProjectPublicAccess",
"id": 103792571,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 103792571,
"result": true
}
```
## disableProjectPublicAccess
- Purpose: **Disable public access for a given project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "disableProjectPublicAccess",
"id": 942472945,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 942472945,
"result": true
}
```
## getProjectActivity
- Purpose: **Get activity stream for a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **List of events**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectActivity",
"id": 942472945,
"params": [
"project_id": 1
]
}
```
## getProjectActivities
- Purpose: **Get Activityfeed for Project(s)**
- Parameters:
- **project_ids** (integer array, required)
- Result on success: **List of events**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getProjectActivities",
"id": 942472945,
"params": [
"project_ids": [1,2]
]
}
```

View File

@ -1,194 +0,0 @@
API Subtask procedures
======================
## createSubtask
- Purpose: **Create a new subtask**
- Parameters:
- **task_id** (integer, required)
- **title** (integer, required)
- **user_id** (int, optional)
- **time_estimated** (int, optional)
- **time_spent** (int, optional)
- **status** (int, optional)
- Result on success: **subtask_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createSubtask",
"id": 2041554661,
"params": {
"task_id": 1,
"title": "Subtask #1"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2041554661,
"result": 45
}
```
## getSubtask
- Purpose: **Get subtask information**
- Parameters:
- **subtask_id** (integer)
- Result on success: **subtask properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getSubtask",
"id": 133184525,
"params": {
"subtask_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133184525,
"result": {
"id": "1",
"title": "Subtask #1",
"status": "0",
"time_estimated": "0",
"time_spent": "0",
"task_id": "1",
"user_id": "0"
}
}
```
## getAllSubtasks
- Purpose: **Get all available subtasks**
- Parameters:
- **task_id** (integer, required)
- Result on success: **List of subtasks**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllSubtasks",
"id": 2087700490,
"params": {
"task_id": 1
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2087700490,
"result": [
{
"id": "1",
"title": "Subtask #1",
"status": "0",
"time_estimated": "0",
"time_spent": "0",
"task_id": "1",
"user_id": "0",
"username": null,
"name": null,
"status_name": "Todo"
},
...
]
}
```
## updateSubtask
- Purpose: **Update a subtask**
- Parameters:
- **id** (integer, required)
- **task_id** (integer, required)
- **title** (integer, optional)
- **user_id** (integer, optional)
- **time_estimated** (integer, optional)
- **time_spent** (integer, optional)
- **status** (integer, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateSubtask",
"id": 191749979,
"params": {
"id": 1,
"task_id": 1,
"status": 1,
"time_spent": 5,
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 191749979,
"result": true
}
```
## removeSubtask
- Purpose: **Remove a subtask**
- Parameters:
- **subtask_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeSubtask",
"id": 1382487306,
"params": {
"subtask_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1382487306,
"result": true
}
```

View File

@ -1,102 +0,0 @@
Subtask Time Tracking API procedures
====================================
## hasSubtaskTimer
- Purpose: **Check if a timer is started for the given subtask and user**
- Parameters:
- **subtask_id** (integer, required)
- **user_id** (integer, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"hasSubtaskTimer","id":1786995697,"params":[2,4]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 1786995697
}
```
## setSubtaskStartTime
- Purpose: **Start subtask timer for a user**
- Parameters:
- **subtask_id** (integer, required)
- **user_id** (integer, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"setSubtaskStartTime","id":1168991769,"params":[2,4]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 1168991769
}
```
## setSubtaskEndTime
- Purpose: **Stop subtask timer for a user**
- Parameters:
- **subtask_id** (integer, required)
- **user_id** (integer, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"setSubtaskEndTime","id":1026607603,"params":[2,4]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 1026607603
}
```
## getSubtaskTimeSpent
- Purpose: **Get time spent on a subtask for a user**
- Parameters:
- **subtask_id** (integer, required)
- **user_id** (integer, optional)
- Result on success: **number of hours**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"getSubtaskTimeSpent","id":738527378,"params":[2,4]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": 1.5,
"id": 738527378
}
```

View File

@ -1,405 +0,0 @@
API Swimlane Procedures
=======================
## getActiveSwimlanes
- Purpose: **Get the list of enabled swimlanes of a project (include default swimlane if enabled)**
- Parameters:
- **project_id** (integer, required)
- Result on success: **List of swimlanes**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getActiveSwimlanes",
"id": 934789422,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 934789422,
"result": [
{
"id": 0,
"name": "Default swimlane"
},
{
"id": "2",
"name": "Swimlane A"
}
]
}
```
## getAllSwimlanes
- Purpose: **Get the list of all swimlanes of a project (enabled or disabled) and sorted by position**
- Parameters:
- **project_id** (integer, required)
- Result on success: **List of swimlanes**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllSwimlanes",
"id": 509791576,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 509791576,
"result": [
{
"id": "1",
"name": "Another swimlane",
"position": "1",
"is_active": "1",
"project_id": "1"
},
{
"id": "2",
"name": "Swimlane A",
"position": "2",
"is_active": "1",
"project_id": "1"
}
]
}
```
## getSwimlane
- Purpose: **Get the a swimlane by id**
- Parameters:
- **swimlane_id** (integer, required)
- Result on success: **swimlane properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getSwimlane",
"id": 131071870,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 131071870,
"result": {
"id": "1",
"name": "Swimlane 1",
"position": "1",
"is_active": "1",
"project_id": "1"
}
}
```
## getSwimlaneById
- Purpose: **Get the a swimlane by id**
- Parameters:
- **swimlane_id** (integer, required)
- Result on success: **swimlane properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getSwimlaneById",
"id": 131071870,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 131071870,
"result": {
"id": "1",
"name": "Swimlane 1",
"position": "1",
"is_active": "1",
"project_id": "1"
}
}
```
## getSwimlaneByName
- Purpose: **Get the a swimlane by name**
- Parameters:
- **project_id** (integer, required)
- **name** (string, required)
- Result on success: **swimlane properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getSwimlaneByName",
"id": 824623567,
"params": [
1,
"Swimlane 1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 824623567,
"result": {
"id": "1",
"name": "Swimlane 1",
"position": "1",
"is_active": "1",
"project_id": "1"
}
}
```
## changeSwimlanePosition
- Purpose: **Move up the swimlane position** (only for active swimlanes)
- Parameters:
- **project_id** (integer, required)
- **swimlane_id** (integer, required)
- **position** (integer, required, must be >= 1)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "changeSwimlanePosition",
"id": 99275573,
"params": [
1,
2,
3
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 99275573,
"result": true
}
```
## updateSwimlane
- Purpose: **Update swimlane properties**
- Parameters:
- **project_id** (integer, required)
- **swimlane_id** (integer, required)
- **name** (string, required)
- **description** (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateSwimlane",
"id": 87102426,
"params": [
"1",
"1",
"Another swimlane"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 87102426,
"result": true
}
```
## addSwimlane
- Purpose: **Add a new swimlane**
- Parameters:
- **project_id** (integer, required)
- **name** (string, required)
- **description** (string, optional)
- Result on success: **swimlane_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "addSwimlane",
"id": 849940086,
"params": [
1,
"Swimlane 1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 849940086,
"result": 1
}
```
## removeSwimlane
- Purpose: **Remove a swimlane**
- Parameters:
- **project_id** (integer, required)
- **swimlane_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeSwimlane",
"id": 1433237746,
"params": [
2,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": true
}
```
## disableSwimlane
- Purpose: **Disable a swimlane**
- Parameters:
- **project_id** (integer, required)
- **swimlane_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "disableSwimlane",
"id": 1433237746,
"params": [
2,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": true
}
```
## enableSwimlane
- Purpose: **Enable a swimlane**
- Parameters:
- **project_id** (integer, required)
- **swimlane_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "enableSwimlane",
"id": 1433237746,
"params": [
2,
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1433237746,
"result": true
}
```

View File

@ -1,195 +0,0 @@
API Tags Procedures
===================
getAllTags
----------
- Purpose: **Get all tags**
- Parameters: none
- Result on success: **List of tags**
- Result on failure: **false|null**
Request example:
```json
{"jsonrpc":"2.0","method":"getAllTags","id":45253426}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": [
{
"id": "1",
"name": "another tag",
"project_id": "33"
}
],
"id": 45253426
}
```
getTagsByProject
----------------
- Purpose: **Get all tags for a given project**
- Parameters:
- **project_id** (integer)
- Result on success: **List of tags**
- Result on failure: **false|null**
Request example:
```json
{"jsonrpc":"2.0","method":"getTagsByProject","id":1217591720,"params":[33]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": [
{
"id": "1",
"name": "some tag",
"project_id": "33"
}
],
"id": 1217591720
}
```
createTag
---------
- Purpose: **Create a new tag**
- Parameters:
- **project_id** (integer)
- **tag** (string)
- Result on success: **tag_id**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"createTag","id":1775436017,"params":[33,"some tag"]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": 1,
"id": 1775436017
}
```
updateTag
---------
- Purpose: **Rename a tag**
- Parameters:
- **tag_id** (integer)
- **tag** (string)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"updateTag","id":2037516512,"params":["1","another tag"]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 2037516512
}
```
removeTag
---------
- Purpose: **removeTag**
- Parameters:
- **tag_id** (integer)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"removeTag","id":907581298,"params":["1"]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 907581298
}
```
setTaskTags
-----------
- Purpose: **Assign/Create/Update tags for a task**
- Parameters:
- **project_id** (integer)
- **task_id** (integer)
- **tags** List of tags ([]string)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{"jsonrpc":"2.0","method":"setTaskTags","id":1524522873,"params":[39,17,["tag1","tag2"]]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": true,
"id": 1524522873
}
```
getTaskTags
-----------
- Purpose: **Get assigned tags to a task**
- Parameters:
- **task_id** (integer)
- Result on success: **Dictionary of tags**
- Result on failure: **false|null**
Request example:
```json
{"jsonrpc":"2.0","method":"getTaskTags","id":1667157705,"params":[17]}
```
Response example:
```json
{
"jsonrpc": "2.0",
"result": {
"1": "tag1",
"2": "tag2"
},
"id": 1667157705
}
```

View File

@ -1,217 +0,0 @@
Task File API Procedures
========================
## createTaskFile
- Purpose: **Create and upload a new task attachment**
- Parameters:
- **project_id** (integer, required)
- **task_id** (integer, required)
- **filename** (integer, required)
- **blob** File content encoded in base64 (string, required)
- Result on success: **file_id**
- Result on failure: **false**
- Note: **The maximum file size depends of your PHP configuration, this method should not be used to upload large files**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createTaskFile",
"id": 94500810,
"params": [
1,
1,
"My file",
"cGxhaW4gdGV4dCBmaWxl"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 94500810,
"result": 1
}
```
## getAllTaskFiles
- Purpose: **Get all files attached to task**
- Parameters:
- **task_id** (integer, required)
- Result on success: **list of files**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllTaskFiles",
"id": 1880662820,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1880662820,
"result": [
{
"id": "1",
"name": "My file",
"path": "1\/1\/0db4d0a897a4c852f6e12f0239d4805f7b4ab596",
"is_image": "0",
"task_id": "1",
"date": "1432509941",
"user_id": "0",
"size": "15",
"username": null,
"user_name": null
}
]
}
```
## getTaskFile
- Purpose: **Get file information**
- Parameters:
- **file_id** (integer, required)
- Result on success: **file properties**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getTaskFile",
"id": 318676852,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 318676852,
"result": {
"id": "1",
"name": "My file",
"path": "1\/1\/0db4d0a897a4c852f6e12f0239d4805f7b4ab596",
"is_image": "0",
"task_id": "1",
"date": "1432509941",
"user_id": "0",
"size": "15"
}
}
```
## downloadTaskFile
- Purpose: **Download file contents (encoded in base64)**
- Parameters:
- **file_id** (integer, required)
- Result on success: **base64 encoded string**
- Result on failure: **empty string**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "downloadTaskFile",
"id": 235943344,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 235943344,
"result": "cGxhaW4gdGV4dCBmaWxl"
}
```
## removeTaskFile
- Purpose: **Remove file**
- Parameters:
- **file_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeTaskFile",
"id": 447036524,
"params": [
"1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 447036524,
"result": true
}
```
## removeAllTaskFiles
- Purpose: **Remove all files associated to a task**
- Parameters:
- **task_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeAllTaskFiles",
"id": 593312993,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 593312993,
"result": true
}
```

View File

@ -1,855 +0,0 @@
API Task Procedures
===================
## createTask
- Purpose: **Create a new task**
- Parameters:
- **title** (string, required)
- **project_id** (integer, required)
- **color_id** (string, optional)
- **column_id** (integer, optional)
- **owner_id** (integer, optional)
- **creator_id** (integer, optional)
- **date_due**: ISO8601 format (string, optional)
- **description** Markdown content (string, optional)
- **category_id** (integer, optional)
- **score** (integer, optional)
- **swimlane_id** (integer, optional)
- **priority** (integer, optional)
- **recurrence_status** (integer, optional)
- **recurrence_trigger** (integer, optional)
- **recurrence_factor** (integer, optional)
- **recurrence_timeframe** (integer, optional)
- **recurrence_basedate** (integer, optional)
- **tags** ([]string, optional)
- **date_started**: ISO8601 format (string, optional)
- Result on success: **task_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createTask",
"id": 1176509098,
"params": {
"owner_id": 1,
"creator_id": 0,
"date_due": "",
"description": "",
"category_id": 0,
"score": 0,
"title": "Test",
"project_id": 1,
"color_id": "green",
"column_id": 2,
"recurrence_status": 0,
"recurrence_trigger": 0,
"recurrence_factor": 0,
"recurrence_timeframe": 0,
"recurrence_basedate": 0
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1176509098,
"result": 3
}
```
## getTask
- Purpose: **Get task by the unique id**
- Parameters:
- **task_id** (integer, required)
- Result on success: **task properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getTask",
"id": 700738119,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 700738119,
"result": {
"id": "1",
"title": "Task #1",
"description": "",
"date_creation": "1409963206",
"color_id": "blue",
"project_id": "1",
"column_id": "2",
"owner_id": "1",
"position": "1",
"is_active": "1",
"date_completed": null,
"score": "0",
"date_due": "0",
"category_id": "0",
"creator_id": "0",
"date_modification": "1409963206",
"reference": "",
"date_started": null,
"time_spent": "0",
"time_estimated": "0",
"swimlane_id": "0",
"date_moved": "1430875287",
"recurrence_status": "0",
"recurrence_trigger": "0",
"recurrence_factor": "0",
"recurrence_timeframe": "0",
"recurrence_basedate": "0",
"recurrence_parent": null,
"recurrence_child": null,
"url": "http:\/\/127.0.0.1:8000\/?controller=task&action=show&task_id=1&project_id=1",
"color": {
"name": "Yellow",
"background": "rgb(245, 247, 196)",
"border": "rgb(223, 227, 45)"
}
}
}
```
## getTaskByReference
- Purpose: **Get task by the external reference**
- Parameters:
- **project_id** (integer, required)
- **reference** (string, required)
- Result on success: **task properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getTaskByReference",
"id": 1992081213,
"params": {
"project_id": 1,
"reference": "TICKET-1234"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1992081213,
"result": {
"id": "5",
"title": "Task with external ticket number",
"description": "[Link to my ticket](http:\/\/my-ticketing-system\/1234)",
"date_creation": "1434227446",
"color_id": "yellow",
"project_id": "1",
"column_id": "1",
"owner_id": "0",
"position": "4",
"is_active": "1",
"date_completed": null,
"score": "0",
"date_due": "0",
"category_id": "0",
"creator_id": "0",
"date_modification": "1434227446",
"reference": "TICKET-1234",
"date_started": null,
"time_spent": "0",
"time_estimated": "0",
"swimlane_id": "0",
"date_moved": "1434227446",
"recurrence_status": "0",
"recurrence_trigger": "0",
"recurrence_factor": "0",
"recurrence_timeframe": "0",
"recurrence_basedate": "0",
"recurrence_parent": null,
"recurrence_child": null,
"url": "http:\/\/127.0.0.1:8000\/?controller=task&action=show&task_id=5&project_id=1"
}
}
```
## getAllTasks
- Purpose: **Get all available tasks**
- Parameters:
- **project_id** (integer, required)
- **status_id**: The value 1 for active tasks and 0 for inactive (integer, required)
- Result on success: **List of tasks**
- Result on failure: **false**
Request example to fetch all tasks on the board:
```json
{
"jsonrpc": "2.0",
"method": "getAllTasks",
"id": 133280317,
"params": {
"project_id": 1,
"status_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": [
{
"id": "1",
"title": "Task #1",
"description": "",
"date_creation": "1409961789",
"color_id": "blue",
"project_id": "1",
"column_id": "2",
"owner_id": "1",
"position": "1",
"is_active": "1",
"date_completed": null,
"score": "0",
"date_due": "0",
"category_id": "0",
"creator_id": "0",
"date_modification": "1409961789",
"reference": "",
"date_started": null,
"time_spent": "0",
"time_estimated": "0",
"swimlane_id": "0",
"date_moved": "1430783191",
"recurrence_status": "0",
"recurrence_trigger": "0",
"recurrence_factor": "0",
"recurrence_timeframe": "0",
"recurrence_basedate": "0",
"recurrence_parent": null,
"recurrence_child": null,
"priority": "0",
"external_provider": null,
"external_uri": null,
"url": "http:\/\/127.0.0.1:8000\/?controller=task&action=show&task_id=1&project_id=1",
"color": {
"name": "Blue",
"background": "rgb(219, 235, 255)",
"border": "rgb(168, 207, 255)"
}
},
{
"id": "2",
"title": "Test",
"description": "",
"date_creation": "1409962115",
"color_id": "green",
"project_id": "1",
"column_id": "2",
"owner_id": "1",
"position": "2",
"is_active": "1",
"date_completed": null,
"score": "0",
"date_due": "0",
"category_id": "0",
"creator_id": "0",
"date_modification": "1409962115",
"reference": "",
"date_started": null,
"time_spent": "0",
"time_estimated": "0",
"swimlane_id": "0",
"date_moved": "1430783191",
"recurrence_status": "0",
"recurrence_trigger": "0",
"recurrence_factor": "0",
"recurrence_timeframe": "0",
"recurrence_basedate": "0",
"recurrence_parent": null,
"recurrence_child": null,
"priority": "0",
"external_provider": null,
"external_uri": null,
"url": "http:\/\/127.0.0.1:8000\/?controller=task&action=show&task_id=2&project_id=1",
"color": {
"name": "Green",
"background": "rgb(189, 244, 203)",
"border": "rgb(74, 227, 113)"
}
},
...
]
}
```
## getOverdueTasks
- Purpose: **Get all overdue tasks**
- Result on success: **List of tasks**
- Result on failure: **false**
Request example to fetch all tasks on the board:
```json
{
"jsonrpc": "2.0",
"method": "getOverdueTasks",
"id": 133280317
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": [
{
"id": "1",
"title": "Task #1",
"date_due": "1409961789",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
{
"id": "2",
"title": "Test",
"date_due": "1409962115",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
...
]
}
```
## getOverdueTasksByProject
- Purpose: **Get all overdue tasks for a special project**
- Result on success: **List of tasks**
- Result on failure: **false**
Request example to fetch all tasks on the board:
```json
{
"jsonrpc": "2.0",
"method": "getOverdueTasksByProject",
"id": 133280317,
"params": {
"project_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": [
{
"id": "1",
"title": "Task #1",
"date_due": "1409961789",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
{
"id": "2",
"title": "Test",
"date_due": "1409962115",
"project_id": "1",
"project_name": "Test",
"assignee_username":"admin",
"assignee_name": null
},
...
]
}
```
## updateTask
- Purpose: **Update a task**
- Parameters:
- **id** (integer, required)
- **title** (string, optional)
- **color_id** (string, optional)
- **owner_id** (integer, optional)
- **date_due**: ISO8601 format (string, optional)
- **description** Markdown content (string, optional)
- **category_id** (integer, optional)
- **score** (integer, optional)
- **priority** (integer, optional)
- **recurrence_status** (integer, optional)
- **recurrence_trigger** (integer, optional)
- **recurrence_factor** (integer, optional)
- **recurrence_timeframe** (integer, optional)
- **recurrence_basedate** (integer, optional)
- **tags** ([]string, optional)
- **date_started**: ISO8601 format (string, optional)
- Result on success: **true**
- Result on failure: **false**
Request example to change the task color:
```json
{
"jsonrpc": "2.0",
"method": "updateTask",
"id": 1406803059,
"params": {
"id": 1,
"color_id": "blue"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1406803059,
"result": true
}
```
## openTask
- Purpose: **Set a task to the status open**
- Parameters:
- **task_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "openTask",
"id": 1888531925,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1888531925,
"result": true
}
```
## closeTask
- Purpose: **Set a task to the status close**
- Parameters:
- **task_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "closeTask",
"id": 1654396960,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1654396960,
"result": true
}
```
## removeTask
- Purpose: **Remove a task**
- Parameters:
- **task_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeTask",
"id": 1423501287,
"params": {
"task_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1423501287,
"result": true
}
```
## moveTaskPosition
- Purpose: **Move a task to another column, position or swimlane inside the same board**
- Parameters:
- **project_id** (integer, required)
- **task_id** (integer, required)
- **column_id** (integer, required)
- **position** (integer, required)
- **swimlane_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "moveTaskPosition",
"id": 117211800,
"params": {
"project_id": 1,
"task_id": 1,
"column_id": 2,
"position": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 117211800,
"result": true
}
```
## moveTaskToProject
- Purpose: **Move a task to another project**
- Parameters:
- **task_id** (integer, required)
- **project_id** (integer, required)
- **swimlane_id** (integer, optional)
- **column_id** (integer, optional)
- **category_id** (integer, optional)
- **owner_id** (integer, optional)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "moveTaskToProject",
"id": 15775829,
"params": [
4,
5
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 15775829,
"result": true
}
```
## duplicateTaskToProject
- Purpose: **Move a task to another column or another position**
- Parameters:
- **task_id** (integer, required)
- **project_id** (integer, required)
- **swimlane_id** (integer, optional)
- **column_id** (integer, optional)
- **category_id** (integer, optional)
- **owner_id** (integer, optional)
- Result on success: **task_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "duplicateTaskToProject",
"id": 1662458687,
"params": [
5,
7
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1662458687,
"result": 6
}
```
## searchTasks
- Purpose: **Find tasks by using the search engine**
- Parameters:
- **project_id** (integer, required)
- **query** (string, required)
- Result on success: **list of tasks**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "searchTasks",
"id": 1468511716,
"params": {
"project_id": 2,
"query": "assignee:nobody"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1468511716,
"result": [
{
"nb_comments": "0",
"nb_files": "0",
"nb_subtasks": "0",
"nb_completed_subtasks": "0",
"nb_links": "0",
"nb_external_links": "0",
"is_milestone": null,
"id": "3",
"reference": "",
"title": "T3",
"description": "",
"date_creation": "1461365164",
"date_modification": "1461365164",
"date_completed": null,
"date_started": null,
"date_due": "0",
"color_id": "yellow",
"project_id": "2",
"column_id": "5",
"swimlane_id": "0",
"owner_id": "0",
"creator_id": "0"
// ...
}
]
}
```
## getTaskMetadata
- Purpose: **Get all metadata related to a task by task unique id**
- Parameters:
- **task_id** (integer, required)
- Result on success: **list of metadata**
- Result on failure: **empty array**
Request example to fetch all the metada of a task:
```json
{
"jsonrpc": "2.0",
"method": "getTaskMetadata",
"id": 133280317,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": [
{
"metaKey1": "metaValue1",
"metaKey2": "metaValue2",
...
}
]
}
```
## getTaskMetadataByName
- Purpose: **Get metadata related to a task by task unique id and metakey (name)**
- Parameters:
- **task_id** (integer, required)
- **name** (string, required)
- Result on success: **metadata value**
- Result on failure: **empty string**
Request example to fetch metada of a task by name:
```json
{
"jsonrpc": "2.0",
"method": "getTaskMetadataByName",
"id": 133280317,
"params": [
1,
"metaKey1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": "metaValue1"
}
```
## saveTaskMetadata
- Purpose: **Save/update task metadata**
- Parameters:
- **task_id** (integer, required)
- **array("name" => "value")** (array, required)
- Result on success: **true**
- Result on failure: **false**
Request example to add/update metada of a task:
```json
{
"jsonrpc": "2.0",
"method": "saveTaskMetadata",
"id": 133280317,
"params": [
1,
{
"metaName" : "metaValue"
}
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": true
}
```
## removeTaskMetadata
- Purpose: **Remove task metadata by name**
- Parameters:
- **task_id** (integer, required)
- **name** (string, required)
- Result on success: **true**
- Result on failure: **false**
Request example to remove metada of a task by name:
```json
{
"jsonrpc": "2.0",
"method": "removeTaskMetadata",
"id": 133280317,
"params": [
1,
"metaKey1"
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 133280317,
"result": true
}
```

View File

@ -1,357 +0,0 @@
API User Procedures
===================
## createUser
- Purpose: **Create a new user**
- Parameters:
- **username** Must be unique (string, required)
- **password** Must have at least 6 characters (string, required)
- **name** (string, optional)
- **email** (string, optional)
- **role** (string, optional, example: app-admin, app-manager, app-user)
- Result on success: **user_id**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createUser",
"id": 1518863034,
"params": {
"username": "biloute",
"password": "123456"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1518863034,
"result": 22
}
```
## createLdapUser
- Purpose: **Create a new user authentified by LDAP**
- Parameters:
- **username** (string, required)
- Result on success: **user_id**
- Result on failure: **false**
The user will only be created if he is found on the LDAP server.
This method works only with LDAP authentication configured in proxy or anonymous mode.
Request example:
```json
{
"jsonrpc": "2.0",
"method": "createLdapUser",
"id": 1518863034,
"params": {
"username": "my_ldap_user",
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1518863034,
"result": 22
}
```
## getUser
- Purpose: **Get user information**
- Parameters:
- **user_id** (integer, required)
- Result on success: **user properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getUser",
"id": 1769674781,
"params": {
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1769674781,
"result": {
"id": "1",
"username": "biloute",
"password": "$2y$10$dRs6pPoBu935RpmsrhmbjevJH5MgZ7Kr9QrnVINwwyZ3.MOwqg.0m",
"role": "app-user",
"is_ldap_user": "0",
"name": "",
"email": "",
"google_id": null,
"github_id": null,
"notifications_enabled": "0"
}
}
```
## getUserByName
- Purpose: **Get user information**
- Parameters:
- **username** (string, required)
- Result on success: **user properties**
- Result on failure: **null**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getUserByName",
"id": 1769674782,
"params": {
"username": "biloute"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1769674782,
"result": {
"id": "1",
"username": "biloute",
"password": "$2y$10$dRs6pPoBu935RpmsrhmbjevJH5MgZ7Kr9QrnVINwwyZ3.MOwqg.0m",
"role": "app-user",
"is_ldap_user": "0",
"name": "",
"email": "",
"google_id": null,
"github_id": null,
"notifications_enabled": "0"
}
}
```
## getAllUsers
- Purpose: **Get all available users**
- Parameters:
- **none**
- Result on success: **List of users**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getAllUsers",
"id": 1438712131
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 1438712131,
"result": [
{
"id": "1",
"username": "biloute",
"name": "",
"email": "",
"role": "app-user",
"is_ldap_user": "0",
"notifications_enabled": "0",
"google_id": null,
"github_id": null
},
...
]
}
```
## updateUser
- Purpose: **Update a user**
- Parameters:
- **id** (integer)
- **username** (string, optional)
- **name** (string, optional)
- **email** (string, optional)
- **role** (string, optional, example: app-admin, app-manager, app-user)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "updateUser",
"id": 322123657,
"params": {
"id": 1,
"role": "app-manager"
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 322123657,
"result": true
}
```
## removeUser
- Purpose: **Remove a user**
- Parameters:
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "removeUser",
"id": 2094191872,
"params": {
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2094191872,
"result": true
}
```
## disableUser
- Purpose: **Disable a user**
- Parameters:
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "disableUser",
"id": 2094191872,
"params": {
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2094191872,
"result": true
}
```
## enableUser
- Purpose: **Enable a user**
- Parameters:
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "enableUser",
"id": 2094191872,
"params": {
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2094191872,
"result": true
}
```
## isActiveUser
- Purpose: **Check if a user is active**
- Parameters:
- **user_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "isActiveUser",
"id": 2094191872,
"params": {
"user_id": 1
}
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 2094191872,
"result": true
}
```

View File

@ -1,41 +0,0 @@
Application settings
====================
Some parameters for the application can be changed on the settings page.
Only administrators can change those settings.
Go to the menu **Settings**, then choose **Application settings** on the left.
![Application settings](../screenshots/application-settings.png)
### Application URL
This parameter is used for email notifications.
The email footer will contain a link to the Kanboard task.
### Language
The application language can be changed at anytime.
The language will be set for all users.
### Time zone
By default, Kanboard use UTC as time zone, but you can define your own time zone.
The list contains all supported time zones by your web server.
### Date format
Input format used for date fields, for examples the due date for tasks.
Kanboard offers 4 different formats:
- DD/MM/YYYY
- MM/DD/YYYY (default)
- YYYY/MM/DD
- MM.DD.YYYY
The [ISO 8601](http://en.wikipedia.org/wiki/ISO_8601) format is always accepted (YYYY-MM-DD or YYYY_MM_DD).
### Custom Stylesheet
Write your own CSS to override or improve Kanboard default style.

View File

@ -1,49 +0,0 @@
How to build assets (Javascript and CSS files)
==============================================
Stylesheet and Javascript files are merged together and minified.
- Original CSS files are stored in the folder `assets/css/src/*.css`
- Original Javascript code is stored in the folder `assets/js/src/*.js`
- `assets/*/vendor.min.*` are external dependencies merged and minified
- `assets/*/app.min.*` are application source code merged and minified
Requirements
------------
- [NodeJS](https://nodejs.org/) with `npm`
Building Javascript and CSS files
---------------------------------
Kanboard use [Gulp](http://gulpjs.com/) to build the assets and [Bower](http://bower.io/) to manage dependencies.
These tools are installed as NodeJS dependencies into the project.
### Run everything
```bash
make static
```
### Build `vendor.min.js` and `vendor.min.css`
```bash
gulp vendor
```
### Build `app.min.js`
```bash
gulp js
```
### Build `app.min.css`
```bash
gulp css
```
Notes
-----
Building assets is not possible from the Kanboard's archive, you have to clone the repository.

View File

@ -1,108 +0,0 @@
Automatic Actions
=================
To minimize user interaction, Kanboard support automated actions.
Each automatic action is defined with these properties:
- An event to listen
- Action linked to the event
- Additional parameters
Each project has a different set of automatic actions. The configuration panel is located on the project listing page - just click on the link **Automatic actions**.
Add a new action
----------------
Click on the link **Add a new automatic action**.
![Automatique action](../screenshots/automatic-action-creation.png)
1. Choose an action
2. Select an event
3. Define the parameters
Available actions
-------------------------
- Create a comment from an external provider
- Add a comment log when moving the task between columns
- Automatically assign a category based on a color
- Change the category based on an external label
- Automatically assign a category based on a link
- Automatically assign a color based on a category
- Assign a color when the task is moved to a specific column
- Change task color when using a specific task link
- Assign a color to a specific user
- Assign the task to the person who does the action
- Assign the task to the person who does the action when the column is changed
- Assign the task to a specific user
- Change the assignee based on an external username
- Close the task
- Close a task in a specific column
- Create a task from an external provider
- Duplicate the task to another project
- Send a task by email to someone
- Move the task to another project
- Move the task to another column when assigned to a user
- Move the task to another column when the category is changed
- Move the task to another column when assignee is cleared
- Open a task
- Automatically update the start date
Examples
--------
Here are some examples used in real life:
### When I move a task to the column "Done", automatically close this task
- Choose action: **Close a task in a specific column**
- Choose the event: **Move a task to another column**
- Define action parameter: **Column = Done** (this is the destination column)
### When I move a task to the column "To be validated", assign this task to a specific user
- Choose the action: **Assign the task to a specific user**
- Choose the event: **Move a task to another column**
- Define the action parameters: **Column = To be validated** and **User = Bob** (Bob is our tester)
### When I move a task to the column "Work in progress", assign this task to the current user
- Choose action: **Assign the task to the person who does the action when the column is changed**
- Choose the event: **Move a task to another column**
- Define action parameter: **Column = Work in progress**
### When a task is completed, duplicate this task to another project
Let's say we have two projects: "Customer orders" and "Production". Once the order is validated, swap it to the "Production" project.
- Choose action: **Duplicate the task to another project**
- Choose the event: **Closing a task**
- Define action parameters: **Column = Validated** and **Project = Production**
### When a task is moved to the last column, move the exact same task to another project
Let's say we have two projects: "Ideas" and "Development". Once the idea is validated, swap it to the "Development" project.
- Choose action: **Move the task to another project**
- Choose the event: **Move a task to another column**
- Define action parameters: **Column = Validated** and **Project = Development**
### I want to assign automatically a color to the user Bob
- Choose action: **Assign a color to a specific user**
- Choose the event: **Task assignee change**
- Define action parameters: **Color = Green** and **Assignee = Bob**
### I want to assign a color automatically to the defined category "Feature Request"
- Choose action: **Assign automatically a color based on a category**
- Choose the event: **Task creation or modification**
- Define action parameters: **Color = Blue** and **Category = Feature Request**
### I want to set the start date automatically when the task is moved to the column "Work in progress"
- Choose action: **Automatically update the start date**
- Choose the event: **Move a task to another column**
- Define action parameters: **Column = Work in progress**

View File

@ -1,18 +0,0 @@
Collapsed and Expanded mode
===========================
Tasks on the board can be displayed in collapsed or in expanded mode.
Switching from one view to another can be done with the keyboard shortcut **"s"** or by using the drop-down menu on the left.
Collapsed mode
--------------
![Tasks collapsed](../screenshots/board-collapsed-mode.png)
- If the task is assigned to someone, the initials of the person are shown next to the task number.
- If the task title is too long, you can put your mouse over the task to show a tooltip with the full title.
Expanded mode
-------------
![Tasks expanded](../screenshots/board-expanded-mode.png)

View File

@ -1,24 +0,0 @@
Board settings
==============
Go to the menu **Settings**, then choose **Board settings** on the left.
![Board settings](../screenshots/board-settings.png)
### Task highlighting
This feature displays a shadow around the task when a task is moved recently.
Set the value 0 to disable this feature, 2 days by default (172800 seconds).
Everything moved since 2 days will have shadow around the task.
### Refresh interval for public board
When you share a board, the page will refresh every 60 seconds automatically by default.
### Refresh interval for private board
When your web browser is open on a board, Kanboard checks every 10 seconds if something has been changed by someone else.
Technically this process is done by Ajax polling.

View File

@ -1,10 +0,0 @@
Horizontal scrolling and compact mode
=====================================
When the board cannot fit on your screen, a horizontal scroll bar will appear at the bottom.
However, it's possible to switch to the compact the view to display all columns in your screen.
![Switch to compact mode](../screenshots/board-compact-mode.png)
Switching between horizontal scrolling and compact view can be done with the keyboard shortcut **"c"** or by using the drop-down menu on the top left.

View File

@ -1,12 +0,0 @@
Show and hide columns on the board
==================================
You can hide or display columns very easily on the board:
![Hide a column](../screenshots/hide-column.png)
To hide a column, click on the column dropdown menu and choose "Hide this column":
![Show a column](../screenshots/show-column.png)
To show the column again, click on the "plus icon".

View File

@ -1,35 +0,0 @@
Brute Force Protection
======================
The brute force protection of Kanboard works at the user account level:
- After 3 authentication failure for the same username, the login form shows a captcha image to prevent automated bot tentatives.
- After 6 authentication failure, the user account is locked down for a period of 15 minutes.
This feature works only for authentication methods that use the login form.
However, **after three authentication failure through the user API**, the account has to be unlocked by using the login form.
Kanboard doesn't block any IP addresses since bots can use several anonymous proxies. However, you can use external tools like [fail2ban](http://www.fail2ban.org) to avoid massive scans.
Configuration
-------------
Default settings can be changed with these configuration variables:
```php
// Enable captcha after 3 authentication failure
define('BRUTEFORCE_CAPTCHA', 3);
// Lock the account after 6 authentication failure
define('BRUTEFORCE_LOCKDOWN', 6);
// Lock account duration in minutes
define('BRUTEFORCE_LOCKDOWN_DURATION', 15);
```
Unlocking users
---------------
If you don't want to wait 15 minutes, you can unlock a user from the user interface.
As administrator, go to the user profile and click on "Unlock this user".

View File

@ -1,42 +0,0 @@
Calendar settings
=================
Go to the menu **Settings**, then choose **Calendar settings** on the left.
![Calendar settings](../screenshots/calendar-settings.png)
There are two different calendars in Kanboard:
- Project calendar
- User calendar (available from the dashboard)
Project calendar
----------------
This calendar shows tasks with defined due date and tasks based on the creation date or the start date.
### Show tasks based on the creation date
- The start date of the calendar event is the creation date of the task.
- The end date of the event is the date of completion.
### Show tasks based on the start date
- The start date of the calendar event is the start date of the task.
- This date can be defined manually.
- The end date of the event is the date of completion.
- If there is no start date the task will not appear on the calendar.
User calendar
-------------
This calendar shows only tasks assigned to the user and optionally sub-tasks information.
### Show sub-tasks based on the time tracking
- Display sub-tasks in the calendar from the information recorded in the time tracking table.
- The intersection with the user timetable is also calculated.
### Show sub-task estimates (forecast of future work)
- Display the estimate of future work for sub-tasks in status "todo" and with a defined "estimate" value.

View File

@ -1,20 +0,0 @@
Calendar
========
There are two different views for the calendar:
- The project view with filters (available from the board)
- The user view (available from the dashboard and from the user section)
At this time the calendar is able to display this information:
- Tasks with a due date, displayed at the top. **The due date can be changed by moving the task to another day**.
- Tasks based on the creation date or the start date. **These events cannot be modified with the calendar**.
- Sub-task time tracking, all recorded time slot will be shown in the calendar.
- Sub-task estimates, forecasts of work left
![Calendar](../screenshots/calendar.png)
The calendar configuration can be changed in the settings page.
Note: The due date doesn't contain time information.

View File

@ -1,89 +0,0 @@
Kanboard Installation on CentOS
===============================
Centos 7
--------
Install PHP and Apache:
```bash
yum install -y php php-xml php-mbstring php-pdo php-gd unzip wget
```
By default, Centos 7 use PHP 5.4.16 and Apache 2.4.6.
Restart Apache:
```bash
systemctl restart httpd.service
```
Install Kanboard:
```bash
cd /var/www/html
# Download the latest release from https://github.com/kanboard/kanboard/releases
wget https://github.com/kanboard/kanboard/archive/v<version>.zip
unzip kanboard-<version>.zip
chown -R apache:apache kanboard-<version>/data
rm kanboard-<version>.zip
```
Centos 6.x
----------
Install PHP and Apache:
```bash
yum install -y php php-xml php-mbstring php-pdo php-gd unzip wget
```
By default, Centos 6.5 use PHP 5.3.3 and Apache 2.2.15.
Enable short tags:
- Edit the file `/etc/php.ini`
- Change the line `short_open_tag = On`
Restart Apache:
```bash
service httpd restart
```
Install Kanboard:
```bash
cd /var/www/html
# Download the latest release from https://github.com/kanboard/kanboard/releases
wget https://github.com/kanboard/kanboard/archive/v<version>.zip
unzip kanboard-<version>.zip
chown -R apache:apache kanboard-<version>/data
rm kanboard-<version>.zip
```
SELinux restrictions
--------------------
If SELinux is enabled, be sure that the Apache user can write to the directory data:
```bash
chcon -R -t httpd_sys_content_rw_t /var/www/html/kanboard/data
```
Be sure to configure your server to allow Kanboard to send emails and make external network requests, by example with SELinux:
```bash
setsebool -P httpd_can_network_connect=1
```
Allowing external connections is necessary if you use LDAP, SMTP, Web hooks or any third-party integration.
Notes
-----
Some features of Kanboard require that you run [a daily background job](cronjob.markdown).

View File

@ -1,247 +0,0 @@
Command Line Interface
======================
Kanboard provides a simple command line interface that can be used from any Unix terminal.
This tool can be used only on the local machine.
This feature is useful to run commands outside of the web server processes.
Usage
-----
- Open a terminal and go to your Kanboard directory (example: `cd /var/www/kanboard`)
- Run the command `./cli` or `php cli`
```bash
Kanboard version master
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
cronjob Execute daily cronjob
help Displays help for a command
job Execute individual job (read payload from stdin)
list Lists commands
version Display Kanboard version
worker Execute queue worker
db
db:migrate Execute SQL migrations
db:version Show database schema version
export
export:daily-project-column-stats Daily project column stats CSV export (number of tasks per column and per day)
export:subtasks Subtasks CSV export
export:tasks Tasks CSV export
export:transitions Task transitions CSV export
locale
locale:compare Compare application translations with the fr_FR locale
locale:sync Synchronize all translations based on the fr_FR locale
notification
notification:overdue-tasks Send notifications for overdue tasks
plugin
plugin:install Install a plugin from a remote Zip archive
plugin:uninstall Remove a plugin
plugin:upgrade Update all installed plugins
projects
projects:archive Disable projects not touched during one year
projects:archive-activities Remove project activities after one year
projects:daily-stats Calculate daily statistics for all projects
trigger
trigger:tasks Trigger scheduler event for all tasks
user
user:reset-2fa Remove two-factor authentication for a user
user:reset-password Change user password
```
Available commands
------------------
### Tasks CSV export
Usage:
```bash
./cli export:tasks <project_id> <start_date> <end_date>
```
Example:
```bash
./cli export:tasks 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv
```
CSV data are sent to `stdout`.
### Subtasks CSV export
Usage:
```bash
./cli export:subtasks <project_id> <start_date> <end_date>
```
Example:
```bash
./cli export:subtasks 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv
```
### Task transitions CSV export
Usage:
```bash
./cli export:transitions <project_id> <start_date> <end_date>
```
Example:
```bash
./cli export:transitions 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv
```
### Export daily summaries data in CSV
The exported data will be printed on the standard output:
```bash
./cli export:daily-project-column-stats <project_id> <start_date> <end_date>
```
Example:
```bash
./cli export:daily-project-column-stats 1 2014-10-01 2014-11-30 > /tmp/my_custom_export.csv
```
### Send notifications for overdue tasks
Emails will be sent to all users with notifications enabled.
```bash
./cli notification:overdue-tasks
```
Optional parameters:
- `--show`: Display notifications sent
- `--group`: Group all overdue tasks for one user (from all projects) in one email
- `--manager`: Send all overdue tasks to project manager(s) in one email
- `-p|--project project_id|identifier`: Send notifications only for the given project
You can also display the overdue tasks with the flag `--show`:
```bash
./cli notification:overdue-tasks --show
+-----+---------+------------+------------+--------------+----------+
| Id | Title | Due date | Project Id | Project name | Assignee |
+-----+---------+------------+------------+--------------+----------+
| 201 | Test | 2014-10-26 | 1 | Project #0 | admin |
| 202 | My task | 2014-10-28 | 1 | Project #0 | |
+-----+---------+------------+------------+--------------+----------+
```
Example to filter by project:
```bash
./cli notification:overdue-tasks --project 123
```
Or if you have defined a project identifier:
```bash
./cli notification:overdue-tasks --project MY_PROJECT
```
### Run daily project stats calculation
This command calculate the statistics of each project:
```bash
./cli projects:daily-stats
Run calculation for Project #0
Run calculation for Project #1
Run calculation for Project #10
```
### Trigger for tasks
This command send a "daily cronjob event" to all open tasks of each project.
```bash
./cli trigger:tasks
Trigger task event: project_id=2, nb_tasks=1
```
### Reset user password
```bash
./cli user:reset-password my_user
```
You will be prompted for a password and confirmation. Characters are not printed to the screen.
### Remove two-factor authentication for a user
```bash
./cli user:reset-2fa my_user
```
### Install a plugin
```bash
./cli plugin:install https://github.com/kanboard/plugin-github-auth/releases/download/v1.0.1/GithubAuth-1.0.1.zip
```
Note: Installed files will have the same permissions as the current user
### Remove a plugin
```bash
./cli plugin:uninstall Budget
```
### Upgrade all plugins
```bash
./cli plugin:upgrade
* Updating plugin: Budget Planning
* Plugin up to date: Github Authentication
```
### Run Background worker
```bash
./cli worker
```
### Execute individual job (mostly for debugging)
```bash
echo 'RAW_JOB_DATA' | ./cli job
```
### Execute database migrations
If the parameter `DB_RUN_MIGRATIONS` is set to `false`, you have run the database migrations manually:
```bash
./cli db:migrate
```
### Check database schema version
```bash
./cli db:version
Current version: 95
Last version: 96
```

View File

@ -1,16 +0,0 @@
Closing tasks
=============
When a task is closed, it is hidden from the board.
However, you can always access to the list of closed tasks by using the query **status:closed** in any search form or simply choose **Closed tasks** from the filter drop-down.
There are two different ways to close a task, from the task drop-down menu on the board:
![Close a task from drop-down menu](../screenshots/menu-close-task.png)
Or from the task sidebar menu in the task detail view:
![Close task](../screenshots/closing-tasks.png)
Note: When you close a task, all sub-tasks not completed will be changed to the status "Done".

View File

@ -1,28 +0,0 @@
How to run Kanboard on Cloudron
================================
[Cloudron](https://cloudron.io) is a private smartserver on which you can install web
apps like Kanboard. You can install Kanboard into a custom domain and each
installation is backed up and kept up-to-date with Kanboard releases automatically.
[![Install](https://cloudron.io/img/button.svg)](https://cloudron.io/button.html?app=net.kanboard.cloudronapp)
Accounts
--------
The app integrates tightly with the Cloudron User Management (via LDAP). Only
Cloudron users can access the Kanboard. In addition, any Cloudron administrator
becomes a Kanboard administrator automatically.
Installing Plugins
------------------
Plugins can be installed and configured using the [Cloudron CLI](https://git.cloudron.io/cloudron/cloudron-cli)
tool. See the [app description](https://cloudron.io/appstore.html?app=net.kanboard.cloudronapp) for
more information.
Application Source code
----------------------
The source code for the Cloudron app is [here](https://git.cloudron.io/cloudron/kanboard-app).

View File

@ -1,24 +0,0 @@
Coding standards
================
PHP code
--------
- Indentation: 4 spaces
- Line return: Unix => `\n`
- Encoding: UTF-8
- Use only the opening tags `<?php` or `<?=` for templates, but **never** use `<?`
- Always write PHPdoc comments for methods and class properties
- Coding style: [PSR-1](http://www.php-fig.org/psr/psr-1/) and [PSR-2](http://www.php-fig.org/psr/psr-2/)
JavaScript code
---------------
- Indentation: 4 spaces
- Line return: Unix => `\n`
CSS code
--------
- Indentation: 4 spaces
- Line return: Unix => `\n`

View File

@ -1,342 +0,0 @@
Config File
===========
You can customize the default settings of Kanboard by adding a file `config.php` at the project root or in the `data` folder.
You can also rename the file `config.default.php` to `config.php` and change the desired values.
Enable/Disable debug mode
-------------------------
```php
define('DEBUG', true);
define('LOG_DRIVER', 'file'); // Other drivers are: syslog, stdout, stderr, system or file
// By default, the log file is in data/debug.log but you can change the path:
define('LOG_FILE', '/path/to/debug.log');
```
- The log driver must be defined if you enable the debug mode.
- The debug mode logs all SQL queries and the time taken to generate pages.
- The `system` driver use the built-in PHP logger which could be configured in the [php.ini](http://php.net/manual/en/errorfunc.configuration.php#ini.error-log). By default, log messages are sent to the web server logs.
Plugins
-------
Plugin folder:
```php
define('PLUGINS_DIR', 'data/plugins');
```
Enable/disable plugin installation from the user interface:
```php
define('PLUGIN_INSTALLER', true); // Default is true
```
Change default plugin directory URL:
```php
define('PLUGIN_API_URL', 'https://kanboard.org/plugins.json');
```
Folder for uploaded files
-------------------------
```php
define('FILES_DIR', 'data/files');
```
Cache parameters
----------------
```php
// Available cache drivers are "file" and "memory"
define('CACHE_DRIVER', 'memory');
// Cache folder to use if cache driver is "file" (must be writeable by the web server user)
define('CACHE_DIR', DATA_DIR.DIRECTORY_SEPARATOR.'cache');
```
Enable/disable url rewrite
--------------------------
```php
define('ENABLE_URL_REWRITE', false);
```
Email configuration
-------------------
```php
// Enable/disable email configuration from the user interface
define('MAIL_CONFIGURATION', true);
// E-mail address used for the "From" header (notifications)
define('MAIL_FROM', 'notifications@kanboard.local');
// Mail transport to use: "smtp", "sendmail" or "mail" (PHP mail function)
define('MAIL_TRANSPORT', 'mail');
// SMTP configuration to use when the "smtp" transport is chosen
define('MAIL_SMTP_HOSTNAME', '');
define('MAIL_SMTP_PORT', 25);
define('MAIL_SMTP_USERNAME', '');
define('MAIL_SMTP_PASSWORD', '');
define('MAIL_SMTP_ENCRYPTION', null); // Valid values are "null", "ssl" or "tls"
// Sendmail command to use when the transport is "sendmail"
define('MAIL_SENDMAIL_COMMAND', '/usr/sbin/sendmail -bs');
```
Database settings
-----------------
```php
// Run automatically database migrations
// If set to false, you will have to run manually the SQL migrations from the CLI during the next Kanboard upgrade
// Do not run the migrations from multiple processes at the same time (example: web page + background worker)
define('DB_RUN_MIGRATIONS', true);
// Database driver: sqlite, mysql or postgres (sqlite by default)
define('DB_DRIVER', 'sqlite');
// Mysql/Postgres username
define('DB_USERNAME', 'root');
// Mysql/Postgres password
define('DB_PASSWORD', '');
// Mysql/Postgres hostname
define('DB_HOSTNAME', 'localhost');
// Mysql/Postgres database name
define('DB_NAME', 'kanboard');
// Mysql/Postgres custom port (null = default port)
define('DB_PORT', null);
// Mysql SSL key
define('DB_SSL_KEY', null);
// Mysql SSL certificate
define('DB_SSL_CERT', null);
// Mysql SSL CA
define('DB_SSL_CA', null);
```
LDAP settings
-------------
```php
// Enable LDAP authentication (false by default)
define('LDAP_AUTH', false);
// LDAP server hostname
define('LDAP_SERVER', '');
// LDAP server port (389 by default)
define('LDAP_PORT', 389);
// By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification
define('LDAP_SSL_VERIFY', true);
// Enable LDAP START_TLS
define('LDAP_START_TLS', false);
// By default Kanboard lowercase the ldap username to avoid duplicate users (the database is case sensitive)
// Set to true if you want to preserve the case
define('LDAP_USERNAME_CASE_SENSITIVE', false);
// LDAP bind type: "anonymous", "user" or "proxy"
define('LDAP_BIND_TYPE', 'anonymous');
// LDAP username to use with proxy mode
// LDAP username pattern to use with user mode
define('LDAP_USERNAME', null);
// LDAP password to use for proxy mode
define('LDAP_PASSWORD', null);
// LDAP DN for users
// Example for ActiveDirectory: CN=Users,DC=kanboard,DC=local
// Example for OpenLDAP: ou=People,dc=example,dc=com
define('LDAP_USER_BASE_DN', '');
// LDAP pattern to use when searching for a user account
// Example for ActiveDirectory: '(&(objectClass=user)(sAMAccountName=%s))'
// Example for OpenLDAP: 'uid=%s'
define('LDAP_USER_FILTER', '');
// LDAP attribute for username
// Example for ActiveDirectory: 'samaccountname'
// Example for OpenLDAP: 'uid'
define('LDAP_USER_ATTRIBUTE_USERNAME', 'uid');
// LDAP attribute for user full name
// Example for ActiveDirectory: 'displayname'
// Example for OpenLDAP: 'cn'
define('LDAP_USER_ATTRIBUTE_FULLNAME', 'cn');
// LDAP attribute for user email
define('LDAP_USER_ATTRIBUTE_EMAIL', 'mail');
// LDAP attribute to find groups in user profile
define('LDAP_USER_ATTRIBUTE_GROUPS', 'memberof');
// LDAP attribute for user avatar image: thumbnailPhoto or jpegPhoto
define('LDAP_USER_ATTRIBUTE_PHOTO', '');
// LDAP attribute for user language, example: 'preferredlanguage'
// Put an empty string to disable language sync
define('LDAP_USER_ATTRIBUTE_LANGUAGE', '');
// Allow automatic LDAP user creation
define('LDAP_USER_CREATION', true);
// LDAP DN for administrators
// Example: CN=Kanboard-Admins,CN=Users,DC=kanboard,DC=local
define('LDAP_GROUP_ADMIN_DN', '');
// LDAP DN for managers
// Example: CN=Kanboard Managers,CN=Users,DC=kanboard,DC=local
define('LDAP_GROUP_MANAGER_DN', '');
// Enable LDAP group provider for project permissions
// The end-user will be able to browse LDAP groups from the user interface and allow access to specified projects
define('LDAP_GROUP_PROVIDER', false);
// LDAP Base DN for groups
define('LDAP_GROUP_BASE_DN', '');
// LDAP group filter
// Example for ActiveDirectory: (&(objectClass=group)(sAMAccountName=%s*))
define('LDAP_GROUP_FILTER', '');
// LDAP user group filter
// If this filter is configured, Kanboard will search user groups in LDAP_GROUP_BASE_DN
// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s))
define('LDAP_GROUP_USER_FILTER', '');
// LDAP attribute for the group name
define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn');
```
Reverse-Proxy Authentication settings
-------------------------------------
```php
// Enable/disable the reverse proxy authentication
define('REVERSE_PROXY_AUTH', false);
// Header name to use for the username
define('REVERSE_PROXY_USER_HEADER', 'REMOTE_USER');
// Username of the admin, by default blank
define('REVERSE_PROXY_DEFAULT_ADMIN', '');
// Default domain to use for setting the email address
define('REVERSE_PROXY_DEFAULT_DOMAIN', '');
```
RememberMe Authentication settings
----------------------------------
```php
// Enable/disable remember me authentication
define('REMEMBER_ME_AUTH', true);
```
Secure HTTP headers settings
----------------------------
```php
// Enable or disable "Strict-Transport-Security" HTTP header
define('ENABLE_HSTS', true);
// Enable or disable "X-Frame-Options: DENY" HTTP header
define('ENABLE_XFRAME', true);
```
Logging
-------
By default, Kanboard do not log anything.
If you want to enable the logging, you have to set a log driver.
```php
// Available log drivers: syslog, stderr, stdout or file
define('LOG_DRIVER', '');
// Log filename if the log driver is "file"
define('LOG_FILE', __DIR__.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'debug.log');
```
Brute-force protection
----------------------
```php
// Enable captcha after 3 authentication failure
define('BRUTEFORCE_CAPTCHA', 3);
// Lock the account after 6 authentication failure
define('BRUTEFORCE_LOCKDOWN', 6);
// Lock account duration in minute
define('BRUTEFORCE_LOCKDOWN_DURATION', 15);
```
Session
-------
```php
// Session duration in second (0 = until the browser is closed)
// See http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
define('SESSION_DURATION', 0);
```
HTTP Client
-----------
If external HTTP requests need to be sent through a proxy:
```php
define('HTTP_PROXY_HOSTNAME', '');
define('HTTP_PROXY_PORT', '3128');
define('HTTP_PROXY_USERNAME', '');
define('HTTP_PROXY_PASSWORD', '');
```
To allow self-signed certificates:
```php
// Set to false to allow self-signed certificates
define('HTTP_VERIFY_SSL_CERTIFICATE', true);
```
Various settings
----------------
```php
// Escape html inside markdown text
define('MARKDOWN_ESCAPE_HTML', true);
// API alternative authentication header, the default is HTTP Basic Authentication defined in RFC2617
define('API_AUTHENTICATION_HEADER', '');
// Hide login form, useful if all your users use Google/Github/ReverseProxy authentication
define('HIDE_LOGIN_FORM', false);
// Disabling logout (for external SSO authentication)
define('DISABLE_LOGOUT', false);
// Override API token stored in the database, useful for automated tests
define('API_AUTHENTICATION_TOKEN', 'My unique API Token');
// TOTP (2FA) issuer name
define('TOTP_ISSUER', 'Kanboard');
// Comma separated list of fields to not synchronize when using external authentication providers
define('EXTERNAL_AUTH_EXCLUDE_FIELDS', 'username');
```

View File

@ -1,70 +0,0 @@
Contributor Guidelines
======================
How can I help?
---------------
Kanboard is not perfect but there are many ways to help:
- Give feedback
- Report bugs
- Add or update translations
- Improve the documentation
- Writing code
- Tell your friends that Kanboard is awesome :)
Before doing any large undertaking, open a new issue and explain your proposal.
I want to give feedback
-----------------------
- You think something should be improved (user interface, feature requests)
- Check if your idea is not already proposed
- Open a new issue
- Describe your idea
- You can also up-vote with +1 on existing proposals
I want to report a bug
----------------------
- Check if the issue is not already reported
- Open a new ticket
- Explain what is broken
- Describe how to reproduce the bug
- Describe your environment (Kanboard version, OS, web server, PHP version, database version, hosting provider)
I want to translate Kanboard
----------------------------
Kanboard is translated in many languages.
However, translations are not complete, take look at the [translation guide to contribute](translations.markdown).
I want to improve the documentation
-----------------------------------
- You think something is not clear, there is grammatical errors, typo errors, anything.
- The documentation is written in Markdown and stored in the folder `docs`.
- Edit the files and send a pull-request.
- The documentation on the official website is synchronized with the repository.
I want to contribute to the code
--------------------------------
Pull-requests are always welcome however, to be accepted you have to follow those directives:
- **Before doing any large change or design proposal, open a new ticket to start a discussion.**
- If you want to add a new feature, respect the philosophy behind Kanboard. **We focus on simplicity**, we don't want to have a bloated software.
- The same apply for the user interface, **simplicity and efficiency**.
- Send only one pull-request per feature or bug fix.
- A smaller pull-request is easier to review and faster it will be merged.
- Make sure the [unit tests pass](tests.markdown).
- Respect the [coding standards](coding-standards.markdown).
- Write maintainable code, avoid code duplication, use PHP good practices.
In any case, if you are not sure about something open a new ticket.
Tell your friends that Kanboard is awesome :)
---------------------------------------------
If you use Kanboard, spread the word around you.
Tell them that free and open source software are cool :)

View File

@ -1,34 +0,0 @@
Create tasks by email
=====================
You can create tasks directly by sending an email.
This feature is available by using plugins.
At the moment, Kanboard is integrated with 3 external services:
- [Mailgun](https://github.com/kanboard/plugin-mailgun)
- [Sendgrid](https://github.com/kanboard/plugin-sendgrid)
- [Postmark](https://github.com/kanboard/plugin-postmark)
These services handle incoming emails without having to configure any SMTP server.
When an email is received, Kanboard receive the message on a specific end-point.
All complicated works are already handled by those services.
Incoming emails workflow
------------------------
1. You send an email to a specific address, for example **myproject@inbound.mydomain.tld**
2. Your email is forwarded to the third-party SMTP servers
3. The SMTP provider call the Kanboard web hook with the email in JSON or multipart/form-data formats
4. Kanboard parses the received email and create the task to the right project
Notes
-----
- The Kanboard web hook is protected by a random token
- The sender email address must match a Kanboard user
- The Kanboard user must be a member of the project
- Kanboard is able to convert only simple HTML emails to Markdown
- New tasks are automatically created in the first column
- Refer to the documentation of each plugin for the configuration

View File

@ -1,39 +0,0 @@
Creating Projects
=================
Kanboard can handle multiple projects. There are two kinds of projects:
- Team projects
- Private project for a single user
Creating projects for multiple users
-------------------------------------
- Only administrators and project administrators can create those projects
- User management is available
From the dashboard, click on the link **New project**:
![Project creation form](../screenshots/new-project.png)
It's very easy: you just have to find a name for your project!
Creating a private project
--------------------------
- Anybody can create a private project
- There is **NO** user management
- Only the owner and administrators can access the project
From the dashboard, click on the link **New private project**.
Creating projects from another project
--------------------------------------
When you create a new project, you can choose to duplicate the properties of another project:
- Permissions
- Actions
- Swimlanes
- Categories
- Tasks

View File

@ -1,30 +0,0 @@
Creating Tasks
==============
From the board, click on the plus sign next to the column name:
![Task creation from the board](../screenshots/task-creation-board.png)
Then the task creation form appears:
![Task creation form](../screenshots/task-creation-form.png)
Field description:
- **Title**: The title of your task, which will be displayed on the board.
- **Description**: Description that use the [Markdown](syntax-guide.markdown) format.
- **Tags**: The list of tags associated to tasks.
- **Create another task**: Check this box if you want to create a similar task (some fields will be pre-filled).
- **Color**: Choose the color of the card.
- **Assignee**: The person that will work on the task.
- **Category**: Only one category can be assigned to a task (visible only if the projects have categories).
- **Column**: The column where the task will be created, your task will be positioned at the bottom.
- **Priority**: Task priority, the range can be defined in the project settings, default values are P0 to P3.
- **Complexity**: Used in agile project management (Scrum), the complexity or story points is a number that tells the team how hard the story is. Often, people use the Fibonacci series.
- **Reference**: External ID for the task, for example it can be ticket number that come from another system
- **Original Estimate**: Estimation in hours to complete the task.
- **Time Spent**: Time spent working on the task.
- **Start Date**: This is a date time field.
- **Due Date**: Overdue tasks will have a red due date and upcoming due dates will be black on the board. Several date format are accepted in addition to the date picker.
With the preview link, you can see the task description converted from the Markdown syntax.

Some files were not shown because too many files have changed in this diff Show More