diff options
-rw-r--r-- | README.markdown | 1 | ||||
-rw-r--r-- | app/Controller/Config.php | 2 | ||||
-rw-r--r-- | app/Locales/de_DE/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/es_ES/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/fi_FI/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/fr_FR/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/it_IT/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/pl_PL/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/pt_BR/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/ru_RU/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/sv_SE/translations.php | 2 | ||||
-rw-r--r-- | app/Locales/zh_CN/translations.php | 2 | ||||
-rw-r--r-- | app/Model/Board.php | 11 | ||||
-rw-r--r-- | app/Model/Config.php | 2 | ||||
-rw-r--r-- | app/Model/Project.php | 17 | ||||
-rw-r--r-- | app/Schema/Mysql.php | 12 | ||||
-rw-r--r-- | app/Schema/Postgres.php | 11 | ||||
-rw-r--r-- | app/Schema/Sqlite.php | 18 | ||||
-rw-r--r-- | app/Templates/config_index.php | 4 | ||||
-rw-r--r-- | tests/units/Base.php | 1 | ||||
-rw-r--r-- | tests/units/BoardTest.php | 32 | ||||
-rw-r--r-- | tests/units/ConfigTest.php | 32 |
22 files changed, 144 insertions, 19 deletions
diff --git a/README.markdown b/README.markdown index 2df1dad1..efb002ed 100644 --- a/README.markdown +++ b/README.markdown @@ -118,6 +118,7 @@ Contributors: - Kiswa: https://github.com/kiswa - Kralo: https://github.com/kralo - Levlaz: https://github.com/levlaz +- Lim Yuen Hoe: https://github.com/jasonmoofang - Mathgl67: https://github.com/mathgl67 - Matthieu Keller: https://github.com/maggick - Mauro Mariño: https://github.com/moromarino diff --git a/app/Controller/Config.php b/app/Controller/Config.php index a364c5f4..4c3018c1 100644 --- a/app/Controller/Config.php +++ b/app/Controller/Config.php @@ -25,6 +25,7 @@ class Config extends Base 'menu' => 'config', 'title' => t('Settings'), 'timezones' => $this->config->getTimezones(), + 'default_columns' => implode(', ', $this->board->getDefaultColumns()), ))); } @@ -58,6 +59,7 @@ class Config extends Base 'menu' => 'config', 'title' => t('Settings'), 'timezones' => $this->config->getTimezones(), + 'default_columns' => implode(', ', $this->board->getDefaultColumns()), ))); } diff --git a/app/Locales/de_DE/translations.php b/app/Locales/de_DE/translations.php index fc36b235..2bd0fabb 100644 --- a/app/Locales/de_DE/translations.php +++ b/app/Locales/de_DE/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/es_ES/translations.php b/app/Locales/es_ES/translations.php index 2cb19e1b..7374b274 100644 --- a/app/Locales/es_ES/translations.php +++ b/app/Locales/es_ES/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/fi_FI/translations.php b/app/Locales/fi_FI/translations.php index 4481078d..5f4b2c4e 100644 --- a/app/Locales/fi_FI/translations.php +++ b/app/Locales/fi_FI/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/fr_FR/translations.php b/app/Locales/fr_FR/translations.php index 1e725a7e..2cb65b76 100644 --- a/app/Locales/fr_FR/translations.php +++ b/app/Locales/fr_FR/translations.php @@ -494,4 +494,6 @@ return array( '%s moved the task #%d to the column "%s"' => '%s a déplacé la tâche n°%d dans la colonne « %s »', '%s moved the task #%d to the position %d in the column "%s"' => '%s a déplacé la tâche n°%d à la position n°%d dans la colonne « %s »', 'Activity' => 'Activité', + 'Default values are "%s"' => 'Les valeurs par défaut sont « %s »', + 'Default columns for new projects (Comma-separated)' => 'Colonnes par défaut pour les nouveaux projets (séparé par des virgules)', ); diff --git a/app/Locales/it_IT/translations.php b/app/Locales/it_IT/translations.php index 5834faf2..43613e4d 100644 --- a/app/Locales/it_IT/translations.php +++ b/app/Locales/it_IT/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/pl_PL/translations.php b/app/Locales/pl_PL/translations.php index ca48f2e6..bedcfd71 100644 --- a/app/Locales/pl_PL/translations.php +++ b/app/Locales/pl_PL/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/pt_BR/translations.php b/app/Locales/pt_BR/translations.php index b72fbb62..4c273077 100644 --- a/app/Locales/pt_BR/translations.php +++ b/app/Locales/pt_BR/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/ru_RU/translations.php b/app/Locales/ru_RU/translations.php index a663a33a..b230853c 100644 --- a/app/Locales/ru_RU/translations.php +++ b/app/Locales/ru_RU/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/sv_SE/translations.php b/app/Locales/sv_SE/translations.php index aa63f6aa..b762aedb 100644 --- a/app/Locales/sv_SE/translations.php +++ b/app/Locales/sv_SE/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Locales/zh_CN/translations.php b/app/Locales/zh_CN/translations.php index 9c45809a..d4bd084c 100644 --- a/app/Locales/zh_CN/translations.php +++ b/app/Locales/zh_CN/translations.php @@ -494,4 +494,6 @@ return array( // '%s moved the task #%d to the column "%s"' => '', // '%s moved the task #%d to the position %d in the column "%s"' => '', // 'Activity' => '', + // 'Default values are "%s"' => '', + // 'Default columns for new projects (Comma-separated)' => '', ); diff --git a/app/Model/Board.php b/app/Model/Board.php index 07020600..f8df4069 100644 --- a/app/Model/Board.php +++ b/app/Model/Board.php @@ -21,6 +21,17 @@ class Board extends Base const TABLE = 'columns'; /** + * Get Kanboard default columns + * + * @access public + * @return array + */ + public function getDefaultColumns() + { + return array(t('Backlog'), t('Ready'), t('Work in progress'), t('Done')); + } + + /** * Create a board with default columns, must be executed inside a transaction * * @access public diff --git a/app/Model/Config.php b/app/Model/Config.php index 89bcb58b..f411e3e2 100644 --- a/app/Model/Config.php +++ b/app/Model/Config.php @@ -72,7 +72,7 @@ class Config extends Base $_SESSION['config'] = $this->getAll(); } - if (isset($_SESSION['config'][$name])) { + if (! empty($_SESSION['config'][$name])) { return $_SESSION['config'][$name]; } diff --git a/app/Model/Project.php b/app/Model/Project.php index 6e75838c..0ba18498 100644 --- a/app/Model/Project.php +++ b/app/Model/Project.php @@ -496,14 +496,19 @@ class Project extends Base } $project_id = $this->db->getConnection()->getLastId(); + $column_names = explode(',', $this->config->get('default_columns', implode(',', $this->board->getDefaultColumns()))); + $columns = array(); - $this->board->create($project_id, array( - array('title' => t('Backlog'), 'task_limit' => 0), - array('title' => t('Ready'), 'task_limit' => 0), - array('title' => t('Work in progress'), 'task_limit' => 0), - array('title' => t('Done'), 'task_limit' => 0), - )); + foreach ($column_names as $column_name) { + + $column_name = trim($column_name); + + if (! empty($column_name)) { + $columns[] = array('title' => $column_name, 'task_limit' => 0); + } + } + $this->board->create($project_id, $columns); $this->db->closeTransaction(); return (int) $project_id; diff --git a/app/Schema/Mysql.php b/app/Schema/Mysql.php index 2d3f993e..86685067 100644 --- a/app/Schema/Mysql.php +++ b/app/Schema/Mysql.php @@ -4,7 +4,12 @@ namespace Schema; use Core\Security; -const VERSION = 25; +const VERSION = 26; + +function version_26($pdo) +{ + $pdo->exec("ALTER TABLE config ADD COLUMN default_columns VARCHAR(255) DEFAULT ''"); +} function version_25($pdo) { @@ -100,7 +105,8 @@ function version_20($pdo) function version_19($pdo) { - $pdo->exec("ALTER TABLE config ADD COLUMN api_token VARCHAR(255) DEFAULT '".Security::generateToken()."'"); + $pdo->exec("ALTER TABLE config ADD COLUMN api_token VARCHAR(255) DEFAULT ''"); + $pdo->exec("UPDATE config SET api_token='".Security::generateToken()."'"); } function version_18($pdo) @@ -205,7 +211,7 @@ function version_1($pdo) $pdo->exec(" CREATE TABLE config ( language CHAR(5) DEFAULT 'en_US', - webhooks_token VARCHAR(255), + webhooks_token VARCHAR(255) DEFAULT '', timezone VARCHAR(50) DEFAULT 'UTC' ) ENGINE=InnoDB CHARSET=utf8 "); diff --git a/app/Schema/Postgres.php b/app/Schema/Postgres.php index b58b9bb3..a7e57d66 100644 --- a/app/Schema/Postgres.php +++ b/app/Schema/Postgres.php @@ -4,7 +4,12 @@ namespace Schema; use Core\Security; -const VERSION = 6; +const VERSION = 7; + +function version_7($pdo) +{ + $pdo->exec("ALTER TABLE config ADD COLUMN default_columns VARCHAR(255) DEFAULT ''"); +} function version_6($pdo) { @@ -95,9 +100,9 @@ function version_1($pdo) $pdo->exec(" CREATE TABLE config ( language CHAR(5) DEFAULT 'en_US', - webhooks_token VARCHAR(255), + webhooks_token VARCHAR(255) DEFAULT '', timezone VARCHAR(50) DEFAULT 'UTC', - api_token VARCHAR(255) + api_token VARCHAR(255) DEFAULT '' ); CREATE TABLE users ( diff --git a/app/Schema/Sqlite.php b/app/Schema/Sqlite.php index ecd62c97..cab69fa0 100644 --- a/app/Schema/Sqlite.php +++ b/app/Schema/Sqlite.php @@ -4,7 +4,12 @@ namespace Schema; use Core\Security; -const VERSION = 25; +const VERSION = 26; + +function version_26($pdo) +{ + $pdo->exec("ALTER TABLE config ADD COLUMN default_columns TEXT DEFAULT ''"); +} function version_25($pdo) { @@ -97,7 +102,8 @@ function version_20($pdo) function version_19($pdo) { - $pdo->exec("ALTER TABLE config ADD COLUMN api_token TEXT DEFAULT '".Security::generateToken()."'"); + $pdo->exec("ALTER TABLE config ADD COLUMN api_token TEXT DEFAULT ''"); + $pdo->exec("UPDATE config SET api_token='".Security::generateToken()."'"); } function version_18($pdo) @@ -307,8 +313,8 @@ function version_1($pdo) { $pdo->exec(" CREATE TABLE config ( - language TEXT, - webhooks_token TEXT + language TEXT DEFAULT 'en_US', + webhooks_token TEXT DEFAULT '' ) "); @@ -366,7 +372,7 @@ function version_1($pdo) $pdo->exec(" INSERT INTO config - (language, webhooks_token) - VALUES ('en_US', '".Security::generateToken()."') + (webhooks_token) + VALUES ('".Security::generateToken()."') "); } diff --git a/app/Templates/config_index.php b/app/Templates/config_index.php index 98b8b28d..2d9ce116 100644 --- a/app/Templates/config_index.php +++ b/app/Templates/config_index.php @@ -20,6 +20,10 @@ <?= Helper\form_label(t('Webhook URL for task modification'), 'webhooks_url_task_modification') ?> <?= Helper\form_text('webhooks_url_task_modification', $values, $errors) ?><br/> + <?= Helper\form_label(t('Default columns for new projects (Comma-separated)'), 'default_columns') ?> + <?= Helper\form_text('default_columns', $values, $errors) ?><br/> + <p class="form-help"><?= t('Default values are "%s"', $default_columns) ?></p> + <div class="form-actions"> <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/> </div> diff --git a/tests/units/Base.php b/tests/units/Base.php index c566ce9a..cea9764c 100644 --- a/tests/units/Base.php +++ b/tests/units/Base.php @@ -33,6 +33,7 @@ require_once __DIR__.'/../../app/translator.php'; require_once __DIR__.'/../../app/helpers.php'; require_once __DIR__.'/../../app/Model/Base.php'; +require_once __DIR__.'/../../app/Model/Config.php'; require_once __DIR__.'/../../app/Model/Task.php'; require_once __DIR__.'/../../app/Model/Acl.php'; require_once __DIR__.'/../../app/Model/Comment.php'; diff --git a/tests/units/BoardTest.php b/tests/units/BoardTest.php index 23ea8808..35e102b4 100644 --- a/tests/units/BoardTest.php +++ b/tests/units/BoardTest.php @@ -4,9 +4,41 @@ require_once __DIR__.'/Base.php'; use Model\Project; use Model\Board; +use Model\Config; class BoardTest extends Base { + public function testCreation() + { + $p = new Project($this->registry); + $b = new Board($this->registry); + $c = new Config($this->registry); + + // Default columns + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $columns = $b->getColumnsList(1); + + $this->assertTrue(is_array($columns)); + $this->assertEquals(4, count($columns)); + $this->assertEquals('Backlog', $columns[1]); + $this->assertEquals('Ready', $columns[2]); + $this->assertEquals('Work in progress', $columns[3]); + $this->assertEquals('Done', $columns[4]); + + // Custom columns: spaces should be trimed and no empty columns + + $this->assertTrue($c->save(array('default_columns' => ' column #1 , column #2, '))); + + $this->assertEquals(2, $p->create(array('name' => 'UnitTest2'))); + $columns = $b->getColumnsList(2); + + $this->assertTrue(is_array($columns)); + $this->assertEquals(2, count($columns)); + $this->assertEquals('column #1', $columns[5]); + $this->assertEquals('column #2', $columns[6]); + } + public function testMoveColumns() { $p = new Project($this->registry); diff --git a/tests/units/ConfigTest.php b/tests/units/ConfigTest.php new file mode 100644 index 00000000..7298936e --- /dev/null +++ b/tests/units/ConfigTest.php @@ -0,0 +1,32 @@ +<?php + +require_once __DIR__.'/Base.php'; + +use Model\Config; + +class ConfigTest extends Base +{ + public function testDefaultValues() + { + $c = new Config($this->registry); + + $this->assertEquals('en_US', $c->get('language')); + $this->assertEquals('UTC', $c->get('timezone')); + + $this->assertEmpty($c->get('webhooks_url_task_modification')); + $this->assertEmpty($c->get('webhooks_url_task_creation')); + $this->assertEmpty($c->get('default_columns')); + + $this->assertNotEmpty($c->get('webhooks_token')); + $this->assertNotEmpty($c->get('api_token')); + } + + public function testGet() + { + $c = new Config($this->registry); + + $this->assertEquals('', $c->get('default_columns')); + $this->assertEquals('test', $c->get('default_columns', 'test')); + $this->assertEquals(0, $c->get('default_columns', 0)); + } +} |