diff options
Diffstat (limited to 'app')
37 files changed, 255 insertions, 88 deletions
diff --git a/app/Controller/Base.php b/app/Controller/Base.php index 66a9e84f..efeab31e 100644 --- a/app/Controller/Base.php +++ b/app/Controller/Base.php @@ -248,7 +248,7 @@ abstract class Base extends \Kanboard\Core\Base protected function getProject($project_id = 0) { $project_id = $this->request->getIntegerParam('project_id', $project_id); - $project = $this->project->getById($project_id); + $project = $this->project->getByIdWithOwner($project_id); if (empty($project)) { $this->flash->failure(t('Project not found.')); @@ -308,6 +308,29 @@ abstract class Base extends \Kanboard\Core\Base 'board_selector' => $board_selector, 'filters' => $filters, 'title' => $project['name'], + 'description' => $this->getProjectDescription($project), ); } + + /** + * Get project description + * + * @access protected + * @param array &$project + * @return string + */ + protected function getProjectDescription(array &$project) { + if ($project['owner_id'] > 0) { + $description = t('Project owner: ').'**'.$this->template->e($project['owner_name'] ?: $project['owner_username']).'**'.PHP_EOL.PHP_EOL; + + if (! empty($project['description'])) { + $description .= '***'.PHP_EOL.PHP_EOL; + $description .= $project['description']; + } + } else { + $description = $project['description']; + } + + return $description; + } } diff --git a/app/Controller/Board.php b/app/Controller/Board.php index 06736cce..f64de69a 100644 --- a/app/Controller/Board.php +++ b/app/Controller/Board.php @@ -54,7 +54,6 @@ class Board extends Base 'users_list' => $this->projectUserRole->getAssignableUsersList($params['project']['id'], false), 'custom_filters_list' => $this->customFilter->getAll($params['project']['id'], $this->userSession->getId()), 'swimlanes' => $this->taskFilter->search($params['filters']['search'])->getBoard($params['project']['id']), - 'description' => $params['project']['description'], 'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'), 'board_highlight_period' => $this->config->get('board_highlight_period'), ) + $params)); diff --git a/app/Controller/Project.php b/app/Controller/Project.php index 27c827d1..836bfb45 100644 --- a/app/Controller/Project.php +++ b/app/Controller/Project.php @@ -29,7 +29,7 @@ class Project extends Base ->setUrl('project', 'index') ->setMax(20) ->setOrder('name') - ->setQuery($this->project->getQueryProjectDetails($project_ids)) + ->setQuery($this->project->getQueryColumnStats($project_ids)) ->calculate(); $this->response->html($this->template->layout('project/index', array( @@ -145,6 +145,7 @@ class Project extends Base 'values' => empty($values) ? $project : $values, 'errors' => $errors, 'project' => $project, + 'owners' => $this->projectUserRole->getAssignableUsersList($project['id'], true), 'title' => t('Edit project') ))); } diff --git a/app/Controller/Projectuser.php b/app/Controller/Projectuser.php index 806ede77..78b93ab6 100644 --- a/app/Controller/Projectuser.php +++ b/app/Controller/Projectuser.php @@ -131,4 +131,17 @@ class Projectuser extends Base { $this->tasks(TaskModel::STATUS_CLOSED, 'closed', t('Closed tasks'), 'Closed tasks assigned to "%s"'); } + + /** + * Users tooltip + */ + public function users() + { + $project = $this->getProject(); + + return $this->response->html($this->template->render('project_user/tooltip_users', array( + 'users' => $this->projectUserRole->getAllUsersGroupedByRole($project['id']), + 'roles' => $this->role->getProjectRoles(), + ))); + } } diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index 6ad3a783..e1af1c08 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Uzmi sliku ekrana i pritisni CTRL+V ili ⌘+V da zalijepiš ovdje.', 'Screenshot uploaded successfully.' => 'Slika ekrana uspješno dodana.', 'SEK - Swedish Krona' => 'SEK - Švedska kruna', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identifikator projekta je opcionalni alfanumerički kod koji se koristi za identifikaciju projekta.', 'Identifier' => 'Identifikator', 'Disable two factor authentication' => 'Onemogući faktor-dva autentifikaciju', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Da li zaista želiš onemogućiti faktor-dva autentifikaciju: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index 2c6cb7ed..b93b7c23 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Nimm einen Screenshot auf und drücke STRG+V oder ⌘+V um ihn hier einzufügen.', 'Screenshot uploaded successfully.' => 'Screenshot erfolgreich hochgeladen.', 'SEK - Swedish Krona' => 'SEK - Schwedische Kronen', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identifikátor projektu je volitelný alfanumerický kód používaný k identifikaci vašeho projektu.', 'Identifier' => 'Identifikator', 'Disable two factor authentication' => 'Zrušit dvou stupňovou autorizaci', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Willst du wirklich für folgenden Nutzer die Zwei-Faktor-Authentifizierung deaktivieren: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index 820b4d14..63850d70 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index f1c89ca2..ef056972 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Nimm einen Screenshot auf und drücke STRG+V oder ⌘+V um ihn hier einzufügen.', 'Screenshot uploaded successfully.' => 'Screenshot erfolgreich hochgeladen.', 'SEK - Swedish Krona' => 'SEK - Schwedische Kronen', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Der Projektidentifikator ist ein optionaler alphanumerischer Code, der das Projekt identifiziert.', 'Identifier' => 'Identifikator', 'Disable two factor authentication' => 'Deaktiviere Zwei-Faktor-Authentifizierung', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Willst du wirklich für folgenden Nutzer die Zwei-Faktor-Authentifizierung deaktivieren: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 9248943c..91709476 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Capture un patallazo y pulse CTRL+V o ⌘+V para pegar aquí.', 'Screenshot uploaded successfully.' => 'Pantallazo cargado con éxito', 'SEK - Swedish Krona' => 'SEK - Corona sueca', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'El identificador del proyecto us un código opcional alfanumérico que se usa para identificar su proyecto.', 'Identifier' => 'Identificador', 'Disable two factor authentication' => 'Desactivar la autenticación de dos factores', 'Do you really want to disable the two factor authentication for this user: "%s"?' => '¿Realmentes quiere desactuvar la autenticación de dos factores para este usuario: "%s?"', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 18553ec7..c887e02d 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index 26490b1b..f36ce104 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -688,7 +688,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Prenez une capture d\'écran et appuyez sur CTRL+V ou ⌘+V pour coller ici.', 'Screenshot uploaded successfully.' => 'Capture d\'écran téléchargée avec succès.', 'SEK - Swedish Krona' => 'SEK - Couronne suédoise', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'L\'identificateur du projet est un code alpha-numérique optionnel pour identifier votre projet.', 'Identifier' => 'Identificateur', 'Disable two factor authentication' => 'Désactiver l\'authentification à deux facteurs', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Voulez-vous vraiment désactiver l\'authentification à deux facteurs pour cet utilisateur : « %s » ?', @@ -701,7 +700,7 @@ return array( 'Score' => 'Complexité', 'The identifier must be unique' => 'L\'identifiant doit être unique', 'This linked task id doesn\'t exists' => 'L\'identifiant de la task liée n\'existe pas', - 'This value must be alphanumeric' => 'Cette valeur doit être alpha-numérique', + 'This value must be alphanumeric' => 'Cette valeur doit être alphanumérique', 'Edit recurrence' => 'Modifier la récurrence', 'Generate recurrent task' => 'Générer une tâche récurrente', 'Trigger to generate recurrent task' => 'Déclencheur pour générer la tâche récurrente', @@ -1107,4 +1106,10 @@ return array( 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => 'Aucun plugin n\'a enregistré une méthode de notification de projet. Vous pouvez toujours configurer les notifications individuelles dans votre profil d\'utilisateur.', 'My dashboard' => 'Mon tableau de bord', 'My profile' => 'Mon profile', + 'Project owner: ' => 'Responsable du projet : ', + 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => 'L\'identifiant du projet est optionnel et doit être alphanumérique, example: MONPROJET.', + 'Project owner' => 'Responsable du projet', + 'Those dates are useful for the project Gantt chart.' => 'Ces dates sont utiles pour le diagramme de Gantt des projets.', + 'Private projects do not have users and groups management.' => 'Les projets privés n\'ont pas de gestion d\'utilisateurs et de groupes.', + 'There is no project member.' => 'Il y a aucun membre du projet.', ); diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index 8f93d1c3..e12a7aad 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index 170a5b76..49d61d58 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Mengambil screenshot dan tekan CTRL + V atau ⌘ + V untuk paste di sini.', 'Screenshot uploaded successfully.' => 'Screenshot berhasil diunggah.', 'SEK - Swedish Krona' => 'SEK - Krona Swedia', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identifier proyek adalah kode alfanumerik opsional digunakan untuk mengidentifikasi proyek Anda.', 'Identifier' => 'Identifier', 'Disable two factor authentication' => 'Matikan dua faktor otentifikasi', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Apakah anda yakin akan mematikan dua faktor otentifikasi untuk pengguna ini : « %s » ?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index cd86c98b..5e2c32a9 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index e91a3bff..f1884b93 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index e83f915d..65aaa4e3 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', 'Screenshot uploaded successfully.' => 'Screenshot berhasil diunggah.', 'SEK - Swedish Krona' => 'SEK - Krona Swedia', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identifier projek adalah kode alfanumerik opsional digunakan untuk mengidentifikasi projek Anda.', 'Identifier' => 'Identifier', 'Disable two factor authentication' => 'Matikan dua faktor otentifikasi', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Apakah anda yakin akan mematikan dua faktor otentifikasi untuk pengguna ini : « %s » ?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 04f8e6ae..520149d5 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', 'Screenshot uploaded successfully.' => 'Skjermbilde opplastet', // 'SEK - Swedish Krona' => '', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Prosjektkoden er en alfanumerisk kode som kan brukes for å identifisere prosjektet', 'Identifier' => 'Prosjektkode', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index 420f8351..87f5323e 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index ecea0909..37dcfe3d 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Zrób zrzut ekranu i wciśnij CTRL+V by dodać go tutaj.', 'Screenshot uploaded successfully.' => 'Zrzut ekranu dodany.', 'SEK - Swedish Krona' => 'SEK - Korona szwedzka', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Identyfikator projektu to opcjonalny kod alfanumeryczny do identyfikacji projektu.', 'Identifier' => 'Identyfikator', 'Disable two factor authentication' => 'Wyłącz uwierzytelnianie dwuetapowe', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Czy na pewno chcesz wyłączyć uwierzytelnianie dwuetapowe dla tego użytkownika: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index e985f90d..6e47c514 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Tire uma captura de tela e pressione CTRL + V ou ⌘ + V para colar aqui.', 'Screenshot uploaded successfully.' => 'Captura de tela enviada com sucesso.', 'SEK - Swedish Krona' => 'SEK - Coroa sueca', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'O identificador de projeto é um código alfanumérico opcional utilizado para identificar o seu projeto.', 'Identifier' => 'Identificador', 'Disable two factor authentication' => 'Desativar autenticação em duas etapas', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Você realmente deseja desativar a autenticação em duas etapas para este usuário: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index bfe98033..f57657ee 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Tire um screenshot e pressione CTRL + V ou ⌘ + V para colar aqui.', 'Screenshot uploaded successfully.' => 'Screenshot enviada com sucesso.', 'SEK - Swedish Krona' => 'SEK - Coroa sueca', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'O identificador de projecto é um código alfanumérico opcional utilizado para identificar o seu projecto.', 'Identifier' => 'Identificador', 'Disable two factor authentication' => 'Desactivar autenticação com dois factores', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Tem a certeza que quer desactivar a autenticação com dois factores para esse utilizador: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 7e406c94..02bf9934 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Сделайте скриншот и нажмите CTRL+V или ⌘+V для вложения', 'Screenshot uploaded successfully.' => 'Скриншет успешно загружен', 'SEK - Swedish Krona' => 'SEK - Шведская крона', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Идентификатор проекта - это опциональный буквенно-цифровой код использующийся для идентификации проекта', 'Identifier' => 'Идентификатор', 'Disable two factor authentication' => 'Выключить двухфакторную авторизацию', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Вы действительно хотите выключить двухфакторную авторизацию для пользователя "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 995cd485..c779cd6c 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index af14409d..ca412273 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Ta en skärmdump och tryck CTRL+V för att klistra in här.', 'Screenshot uploaded successfully.' => 'Skärmdumpen laddades upp.', 'SEK - Swedish Krona' => 'SEK - Svensk Krona', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Projektidentifieraren är en valbar alfanumerisk kod som används för att identifiera ditt projekt.', 'Identifier' => 'Identifierare', 'Disable two factor authentication' => 'Inaktivera två-faktors autentisering', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Vill du verkligen inaktivera två-faktors autentisering för denna användare: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index 07733f20..b2b9a55b 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', 'Screenshot uploaded successfully.' => 'อัพโหลด screenshot เรียบร้อยแล้ว', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 8fb2483d..17163f45 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -686,7 +686,6 @@ return array( 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Bir ekran görüntüsü alın ve buraya yapıştırmak için CTRL+V veya ⌘+V tuşlarına basın.', 'Screenshot uploaded successfully.' => 'Ekran görüntüsü başarıyla yüklendi', // 'SEK - Swedish Krona' => '', - 'The project identifier is an optional alphanumeric code used to identify your project.' => 'Proje kimliği, projeyi tanımlamak için kullanılan opsiyonel bir alfanumerik koddur.', 'Identifier' => 'Kimlik', 'Disable two factor authentication' => 'İki kademeli doğrulamayı iptal et', 'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Bu kullanıcı için iki kademeli doğrulamayı iptal etmek istediğinize emin misiniz: "%s"?', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index c591fa68..e4b732ef 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -686,7 +686,6 @@ return array( // 'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => '', // 'Screenshot uploaded successfully.' => '', // 'SEK - Swedish Krona' => '', - // 'The project identifier is an optional alphanumeric code used to identify your project.' => '', // 'Identifier' => '', // 'Disable two factor authentication' => '', // 'Do you really want to disable the two factor authentication for this user: "%s"?' => '', @@ -1104,4 +1103,10 @@ return array( // 'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => '', // 'My dashboard' => '', // 'My profile' => '', + // 'Project owner: ' => '', + // 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '', + // 'Project owner' => '', + // 'Those dates are useful for the project Gantt chart.' => '', + // 'Private projects do not have users and groups management.' => '', + // 'There is no project member.' => '', ); diff --git a/app/Model/Project.php b/app/Model/Project.php index 63077348..ba0716b0 100644 --- a/app/Model/Project.php +++ b/app/Model/Project.php @@ -47,6 +47,22 @@ class Project extends Base } /** + * Get a project by id with owner name + * + * @access public + * @param integer $project_id Project id + * @return array + */ + public function getByIdWithOwner($project_id) + { + return $this->db->table(self::TABLE) + ->columns(self::TABLE.'.*', User::TABLE.'.username AS owner_username', User::TABLE.'.name AS owner_name') + ->eq(self::TABLE.'.id', $project_id) + ->join(User::TABLE, 'id', 'owner_id') + ->findOne(); + } + + /** * Get a project by the name * * @access public @@ -276,23 +292,6 @@ class Project extends Base } /** - * Fetch more information for each project - * - * @access public - * @param array $projects - * @return array - */ - public function applyProjectDetails(array $projects) - { - foreach ($projects as &$project) { - $this->getColumnStats($project); - $project = array_merge($project, $this->projectUserRole->getAllUsersGroupedByRole($project['id'])); - } - - return $projects; - } - - /** * Get project summary for a list of project * * @access public @@ -307,30 +306,13 @@ class Project extends Base return $this->db ->table(Project::TABLE) - ->in('id', $project_ids) + ->columns(self::TABLE.'.*', User::TABLE.'.username AS owner_username', User::TABLE.'.name AS owner_name') + ->join(User::TABLE, 'id', 'owner_id') + ->in(self::TABLE.'.id', $project_ids) ->callback(array($this, 'applyColumnStats')); } /** - * Get project details (users + columns) for a list of project - * - * @access public - * @param array $project_ids List of project id - * @return \PicoDb\Table - */ - public function getQueryProjectDetails(array $project_ids) - { - if (empty($project_ids)) { - return $this->db->table(Project::TABLE)->limit(0); - } - - return $this->db - ->table(Project::TABLE) - ->in('id', $project_ids) - ->callback(array($this, 'applyProjectDetails')); - } - - /** * Create a project * * @access public @@ -346,6 +328,7 @@ class Project extends Base $values['token'] = ''; $values['last_modified'] = time(); $values['is_private'] = empty($values['is_private']) ? 0 : 1; + $values['owner_id'] = $user_id; if (! empty($values['identifier'])) { $values['identifier'] = strtoupper($values['identifier']); diff --git a/app/Schema/Mysql.php b/app/Schema/Mysql.php index c98e083e..ad7f7be1 100644 --- a/app/Schema/Mysql.php +++ b/app/Schema/Mysql.php @@ -6,7 +6,12 @@ use PDO; use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; -const VERSION = 101; +const VERSION = 102; + +function version_102(PDO $pdo) +{ + $pdo->exec("ALTER TABLE projects ADD COLUMN owner_id INT DEFAULT 0"); +} function version_101(PDO $pdo) { diff --git a/app/Schema/Postgres.php b/app/Schema/Postgres.php index 961d8f4d..d23a7723 100644 --- a/app/Schema/Postgres.php +++ b/app/Schema/Postgres.php @@ -6,7 +6,12 @@ use PDO; use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; -const VERSION = 81; +const VERSION = 82; + +function version_82(PDO $pdo) +{ + $pdo->exec("ALTER TABLE projects ADD COLUMN owner_id INTEGER DEFAULT 0"); +} function version_81(PDO $pdo) { diff --git a/app/Schema/Sqlite.php b/app/Schema/Sqlite.php index f1be0cf1..daa70f54 100644 --- a/app/Schema/Sqlite.php +++ b/app/Schema/Sqlite.php @@ -6,7 +6,12 @@ use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; use PDO; -const VERSION = 93; +const VERSION = 94; + +function version_94(PDO $pdo) +{ + $pdo->exec("ALTER TABLE projects ADD COLUMN owner_id INTEGER DEFAULT 0"); +} function version_93(PDO $pdo) { diff --git a/app/Template/project/edit.php b/app/Template/project/edit.php index 188107d1..3a273f32 100644 --- a/app/Template/project/edit.php +++ b/app/Template/project/edit.php @@ -11,18 +11,26 @@ <?= $this->form->label(t('Identifier'), 'identifier') ?> <?= $this->form->text('identifier', $values, $errors, array('maxlength="50"')) ?> - <p class="form-help"><?= t('The project identifier is an optional alphanumeric code used to identify your project.') ?></p> + <p class="form-help"><?= t('The project identifier is optional and must be alphanumeric, example: MYPROJECT.') ?></p> + <?= $this->form->label(t('Project owner'), 'owner_id') ?> + <?= $this->form->select('owner_id', $owners, $values, $errors) ?> + + <hr> <?= $this->form->label(t('Start date'), 'start_date') ?> <?= $this->form->text('start_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> <?= $this->form->label(t('End date'), 'end_date') ?> <?= $this->form->text('end_date', $values, $errors, array('maxlength="10"'), 'form-date') ?> + <p class="form-help"><?= t('Those dates are useful for the project Gantt chart.') ?></p> <?php if ($this->user->hasProjectAccess('project', 'create', $project['id'])): ?> + <hr> <?= $this->form->checkbox('is_private', t('Private project'), 1, $project['is_private'] == 1) ?> + <p class="form-help"><?= t('Private projects do not have users and groups management.') ?></p> <?php endif ?> + <hr> <?= $this->form->label(t('Description'), 'description') ?> <div class="form-tabs"> diff --git a/app/Template/project/index.php b/app/Template/project/index.php index c7d74f8b..3d2a33ea 100644 --- a/app/Template/project/index.php +++ b/app/Template/project/index.php @@ -23,9 +23,9 @@ <th class="column-15"><?= $paginator->order(t('Project'), 'name') ?></th> <th class="column-8"><?= $paginator->order(t('Start date'), 'start_date') ?></th> <th class="column-8"><?= $paginator->order(t('End date'), 'end_date') ?></th> + <th class="column-15"><?= $paginator->order(t('Owner'), 'owner_id') ?></th> <?php if ($this->user->hasAccess('projectuser', 'managers')): ?> - <th class="column-12"><?= t('Managers') ?></th> - <th class="column-12"><?= t('Members') ?></th> + <th class="column-10"><?= t('Users') ?></th> <?php endif ?> <th><?= t('Columns') ?></th> </tr> @@ -66,16 +66,15 @@ <td> <?= $project['end_date'] ?> </td> + <td> + <?php if ($project['owner_id'] > 0): ?> + <?= $this->e($project['owner_name'] ?: $project['owner_username']) ?> + <?php endif ?> + </td> <?php if ($this->user->hasAccess('projectuser', 'managers')): ?> <td> - <?= $this->render('project/roles', array('roles' => $project, 'role' => \Kanboard\Core\Security\Role::PROJECT_MANAGER)) ?> - </td> - <td> - <?php if ($project['is_everybody_allowed'] == 1): ?> - <?= t('Everybody') ?> - <?php else: ?> - <?= $this->render('project/roles', array('roles' => $project, 'role' => \Kanboard\Core\Security\Role::PROJECT_MEMBER)) ?> - <?php endif ?> + <i class="fa fa-users fa-fw"></i> + <a href="#" class="tooltip" title="<?= t('Members') ?>" data-href="<?= $this->url->href('Projectuser', 'users', array('project_id' => $project['id'])) ?>"><?= t('Members') ?></a> </td> <?php endif ?> <td class="dashboard-project-stats"> diff --git a/app/Template/project/roles.php b/app/Template/project/roles.php deleted file mode 100644 index d4cd43cb..00000000 --- a/app/Template/project/roles.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php if (! empty($roles[$role])): ?> - <ul class="no-bullet"> - <?php foreach ($roles[$role] as $user_id => $user_name): ?> - <li><?= $this->url->link($this->e($user_name), 'projectuser', 'opens', array('user_id' => $user_id)) ?></li> - <?php endforeach ?> - </ul> -<?php endif ?>
\ No newline at end of file diff --git a/app/Template/project/show.php b/app/Template/project/show.php index 5a65a26e..5f1aefc1 100644 --- a/app/Template/project/show.php +++ b/app/Template/project/show.php @@ -4,6 +4,10 @@ <ul class="listing"> <li><strong><?= $project['is_active'] ? t('Active') : t('Inactive') ?></strong></li> + <?php if ($project['owner_id'] > 0): ?> + <li><?= t('Project owner: ') ?><strong><?= $this->e($project['owner_name'] ?: $project['owner_username']) ?></strong></li> + <?php endif ?> + <?php if ($project['is_private']): ?> <li><i class="fa fa-lock"></i> <?= t('This project is private') ?></li> <?php endif ?> diff --git a/app/Template/project/sidebar.php b/app/Template/project/sidebar.php index 025c410d..e798195d 100644 --- a/app/Template/project/sidebar.php +++ b/app/Template/project/sidebar.php @@ -11,6 +11,9 @@ <?php endif ?> <?php if ($this->user->hasProjectAccess('project', 'edit', $project['id'])): ?> + <li <?= $this->app->checkMenuSelection('project', 'edit') ?>> + <?= $this->url->link(t('Edit project'), 'project', 'edit', array('project_id' => $project['id'])) ?> + </li> <li <?= $this->app->checkMenuSelection('project', 'share') ?>> <?= $this->url->link(t('Public access'), 'project', 'share', array('project_id' => $project['id'])) ?> </li> @@ -20,9 +23,6 @@ <li <?= $this->app->checkMenuSelection('project', 'integrations') ?>> <?= $this->url->link(t('Integrations'), 'project', 'integrations', array('project_id' => $project['id'])) ?> </li> - <li <?= $this->app->checkMenuSelection('project', 'edit') ?>> - <?= $this->url->link(t('Edit project'), 'project', 'edit', array('project_id' => $project['id'])) ?> - </li> <li <?= $this->app->checkMenuSelection('column') ?>> <?= $this->url->link(t('Columns'), 'column', 'index', array('project_id' => $project['id'])) ?> </li> diff --git a/app/Template/project_user/tooltip_users.php b/app/Template/project_user/tooltip_users.php new file mode 100644 index 00000000..7a07caad --- /dev/null +++ b/app/Template/project_user/tooltip_users.php @@ -0,0 +1,14 @@ +<?php if (empty($users)): ?> + <p><?= t('There is no project member.') ?></p> +<?php else: ?> + <?php foreach ($roles as $role => $role_name): ?> + <?php if (isset($users[$role])): ?> + <strong><?= $role_name ?></strong> + <ul> + <?php foreach ($users[$role] as $user_id => $user): ?> + <li><?= $this->url->link($this->e($user), 'Projectuser', 'opens', array('user_id' => $user_id)) ?></li> + <?php endforeach ?> + </ul> + <?php endif ?> + <?php endforeach ?> +<?php endif ?>
\ No newline at end of file |