├── tasklists.png ├── locales ├── cs_CZ.mo ├── en_GB.mo ├── es_419.mo ├── es_EC.mo ├── es_ES.mo ├── es_MX.mo ├── es_VE.mo ├── fi_FI.mo ├── fr_FR.mo ├── ja_JP.mo ├── pl_PL.mo ├── pt_BR.mo ├── ru_RU.mo ├── ja_JP.po ├── es_VE.po ├── es_MX.po ├── es_EC.po ├── es_ES.po ├── pt_BR.po ├── pl_PL.po ├── fi_FI.po ├── en_GB.po ├── es_419.po ├── cs_CZ.po └── ru_RU.po ├── screenshots ├── kanban.png ├── addTask.png └── Tasks list from Dashboard.png ├── public └── lib │ ├── kanban │ ├── images │ │ └── dragger.png │ ├── LICENSE │ ├── js │ │ ├── SearchTokenizer │ │ │ ├── SearchToken.min.js │ │ │ ├── SearchTokenizerResult.min.js │ │ │ ├── SearchToken.js │ │ │ ├── SearchTokenizerResult.js │ │ │ ├── SearchTokenizer.min.js │ │ │ └── SearchTokenizer.js │ │ └── kanban-actions.js │ └── README.md │ └── jquery-ui │ └── images │ ├── ui-icons_444444_256x240.png │ ├── ui-icons_555555_256x240.png │ ├── ui-icons_777620_256x240.png │ ├── ui-icons_777777_256x240.png │ ├── ui-icons_cc0000_256x240.png │ └── ui-icons_ffffff_256x240.png ├── sql ├── update-2.1.4.sql ├── update-1.6.1.sql ├── update-2.0.0.sql ├── update-1.6.0.sql ├── update-2.1.5.sql ├── update-2.1.0.sql ├── update-1.5.1.sql ├── empty-1.0.0.sql ├── empty-1.3.0.sql ├── update-1.4.0.sql ├── update-1.4.1.sql └── empty-1.4.0.sql ├── SECURITY.md ├── TODO.txt ├── ISSUE_TEMPLATE.md ├── tools ├── update_mo.pl ├── update_po.pl └── extract_template.sh ├── .github └── workflows │ ├── updatepot.yml │ ├── generatemo.yml │ └── release.yml ├── index.php ├── ajax ├── index.php ├── inputEntity.php ├── dropdownState.php ├── contextForm.php ├── getTaskComment.php ├── dropdownTypeTasks.php ├── updatetask.php ├── getUserPicture.php ├── seetask.php └── addOptions.php ├── front ├── index.php ├── preference.form.php ├── ticket.form.php ├── setup.templates.php ├── task.php ├── typevisibility.form.php ├── comment.form.php ├── kanban.php ├── task_comment.form.php └── task.form.php ├── README.md ├── templates └── kanban.html.twig ├── src ├── Menu.php ├── Item_Kanban.php └── Preference.php └── setup.php /tasklists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/tasklists.png -------------------------------------------------------------------------------- /locales/cs_CZ.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/cs_CZ.mo -------------------------------------------------------------------------------- /locales/en_GB.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/en_GB.mo -------------------------------------------------------------------------------- /locales/es_419.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/es_419.mo -------------------------------------------------------------------------------- /locales/es_EC.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/es_EC.mo -------------------------------------------------------------------------------- /locales/es_ES.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/es_ES.mo -------------------------------------------------------------------------------- /locales/es_MX.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/es_MX.mo -------------------------------------------------------------------------------- /locales/es_VE.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/es_VE.mo -------------------------------------------------------------------------------- /locales/fi_FI.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/fi_FI.mo -------------------------------------------------------------------------------- /locales/fr_FR.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/fr_FR.mo -------------------------------------------------------------------------------- /locales/ja_JP.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/ja_JP.mo -------------------------------------------------------------------------------- /locales/pl_PL.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/pl_PL.mo -------------------------------------------------------------------------------- /locales/pt_BR.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/pt_BR.mo -------------------------------------------------------------------------------- /locales/ru_RU.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/locales/ru_RU.mo -------------------------------------------------------------------------------- /screenshots/kanban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/screenshots/kanban.png -------------------------------------------------------------------------------- /screenshots/addTask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/screenshots/addTask.png -------------------------------------------------------------------------------- /public/lib/kanban/images/dragger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/kanban/images/dragger.png -------------------------------------------------------------------------------- /screenshots/Tasks list from Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/screenshots/Tasks list from Dashboard.png -------------------------------------------------------------------------------- /sql/update-2.1.4.sql: -------------------------------------------------------------------------------- 1 | UPDATE `glpi_documents_items` SET `itemtype` = 'GlpiPlugin\\Tasklists\\Task' WHERE `itemtype` = 'PluginTasklistsTask'; 2 | -------------------------------------------------------------------------------- /sql/update-1.6.1.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `glpi_plugin_tasklists_tasks` 2 | ADD `users_id_requester` int(11) NOT NULL DEFAULT '0'; 3 | 4 | 5 | -------------------------------------------------------------------------------- /sql/update-2.0.0.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `glpi_plugin_tasklists_tasks` 2 | CHANGE `comment` `content` text collate utf8mb4_unicode_ci; 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /public/lib/jquery-ui/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/public/lib/jquery-ui/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /sql/update-1.6.0.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE `glpi_plugin_tasklists_preferences` 2 | ADD `automatic_refresh` TINYINT(1) NOT NULL DEFAULT '0'; 3 | ALTER TABLE `glpi_plugin_tasklists_preferences` 4 | ADD `automatic_refresh_delay` INT(11) NOT NULL DEFAULT '10'; 5 | 6 | -------------------------------------------------------------------------------- /sql/update-2.1.5.sql: -------------------------------------------------------------------------------- 1 | UPDATE `glpi_savedsearches` SET `itemtype` = 'GlpiPlugin\\Tasklists\\Tasklist' WHERE `itemtype` = 'PluginTasklistsTask'; 2 | UPDATE `glpi_savedsearches_users` SET `itemtype` = 'GlpiPlugin\\Tasklists\\Tasklist' WHERE `itemtype` = 'PluginTasklistsTask'; 3 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ------- | ------------------ | 7 | | 2.0.x | :white_check_mark: | 8 | 9 | ## Reporting a Vulnerability 10 | 11 | Please send an email to thetsmr[@]gmail.com 12 | -------------------------------------------------------------------------------- /TODO.txt: -------------------------------------------------------------------------------- 1 | Add notification for revive user in charge ? 2 | Add min - max by state 3 | Add notifications to comments ? 4 | 5 | ************** 6 | ordonner les contextes - pref ? 7 | ************** 8 | 9 | GLPI 10 10 | 11 | move teams to specific table for display 12 | Drop context for states 13 | drop clone 14 | drop glpi_plugin_tasklists_stateorders 15 | drop glpi_plugin_tasklists_items_kanbans 16 | drop addoptions.php 17 | 18 | fix see archived 19 | -------------------------------------------------------------------------------- /sql/update-2.1.0.sql: -------------------------------------------------------------------------------- 1 | UPDATE `glpi_plugin_tasklists_items_kanbans` SET `itemtype` = 'GlpiPlugin\\Tasklists\\TaskType' WHERE `itemtype` = 'PluginTasklistsTaskType'; 2 | UPDATE `glpi_items_kanbans` SET `itemtype` = 'GlpiPlugin\\Tasklists\\TaskType' WHERE `itemtype` = 'PluginTasklistsTaskType'; 3 | UPDATE `glpi_notifications` SET `itemtype` = 'GlpiPlugin\\Releases\\Task' WHERE `itemtype` = 'PluginTasklistsTask'; 4 | UPDATE `glpi_notificationtemplates` SET `itemtype` = 'GlpiPlugin\\Releases\\Task' WHERE `itemtype` = 'PluginTasklistsTask'; 5 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Dear GLPi user. 2 | 3 | BEFORE SUBMITTING YOUR ISSUE, please make sure to read and follow these steps : 4 | 5 | * Verify that your question has not already been asked 6 | * Please use the below template. 7 | * Delete this text before submiting your issue. 8 | 9 | The Plugin team. 10 | 11 | ------------ 12 | * Version of the plugin : 13 | 14 | 15 | * Version of your GLPI : 16 | 17 | 18 | * Steps to reproduce (which actions have you made) : 19 | 20 | 21 | * Expected result : 22 | 23 | 24 | * Actual result : 25 | 26 | 27 | * URL of the page : 28 | 29 | 30 | * Screenshot of the problem (if pertinent) : 31 | 32 | -------------------------------------------------------------------------------- /tools/update_mo.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | #!/usr/bin/perl -w 3 | 4 | if (@ARGV!=0){ 5 | print "USAGE update_mo.pl\n\n"; 6 | 7 | exit(); 8 | } 9 | 10 | 11 | opendir(DIRHANDLE,'locales')||die "ERROR: can not read current directory\n"; 12 | foreach (readdir(DIRHANDLE)){ 13 | if ($_ ne '..' && $_ ne '.'){ 14 | 15 | if(!(-l "$dir/$_")){ 16 | if (index($_,".po",0)==length($_)-3) { 17 | $lang=$_; 18 | $lang=~s/\.po//; 19 | 20 | `msgfmt locales/$_ -o locales/$lang.mo`; 21 | } 22 | } 23 | 24 | } 25 | } 26 | closedir DIRHANDLE; 27 | 28 | # 29 | # 30 | -------------------------------------------------------------------------------- /.github/workflows/updatepot.yml: -------------------------------------------------------------------------------- 1 | name: Update POT 2 | on: 3 | push: 4 | branches: [ master ] 5 | paths-ignore: 6 | - 'locales/**' 7 | 8 | env: 9 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 10 | jobs: 11 | run: 12 | 13 | name: Update POT 14 | 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout repo 18 | uses: actions/checkout@v4 19 | 20 | - name: install xgettext 21 | 22 | run: sudo apt-get install gettext; 23 | - name: Update POT 24 | run: sh tools/extract_template.sh; 25 | 26 | - name: Commit changes 27 | uses: EndBug/add-and-commit@v9 28 | with: 29 | message: "Update POT" 30 | 31 | - name: Push changes 32 | uses: actions-go/push@master 33 | with: 34 | commit-message: '' 35 | 36 | -------------------------------------------------------------------------------- /tools/update_po.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | #!/usr/bin/perl -w 3 | 4 | if (@ARGV!=2){ 5 | print "USAGE update_po.pl transifex_login transifex_password\n\n"; 6 | 7 | exit(); 8 | } 9 | $user = $ARGV[0]; 10 | $password = $ARGV[1]; 11 | 12 | opendir(DIRHANDLE,'locales')||die "ERROR: can not read current directory\n"; 13 | foreach (readdir(DIRHANDLE)){ 14 | if ($_ ne '..' && $_ ne '.'){ 15 | 16 | if(!(-l "$dir/$_")){ 17 | if (index($_,".po",0)==length($_)-3) { 18 | $lang=$_; 19 | $lang=~s/\.po//; 20 | 21 | `wget --user=$user --password=$password --output-document=locales/$_ http://www.transifex.com/api/2/project/GLPI_tasklists/resource/glpi/translation/$lang/?file=$_`; 22 | } 23 | } 24 | 25 | } 26 | } 27 | closedir DIRHANDLE; 28 | 29 | # 30 | # 31 | -------------------------------------------------------------------------------- /.github/workflows/generatemo.yml: -------------------------------------------------------------------------------- 1 | name: Generate MO 2 | on: 3 | push: 4 | branches: [ master ] 5 | paths: 6 | - '**.po' 7 | env: 8 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 9 | jobs: 10 | run: 11 | 12 | name: Generate mo 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout repo 16 | uses: actions/checkout@v4 17 | 18 | - name: Setup Perl environment 19 | # You may pin to the exact commit or the version. 20 | # uses: shogo82148/actions-setup-perl@8d2e3d59a9516b785ed32169d48a4888eaa9b514 21 | uses: shogo82148/actions-setup-perl@v1 22 | - name: msgfmt 23 | # You may pin to the exact commit or the version. 24 | # uses: whtsky/msgfmt-action@6b2181f051b002182d01a1e1f1aff216230c5a4d 25 | uses: whtsky/msgfmt-action@20190305 26 | - name: Generate mo 27 | run: perl tools/update_mo.pl; 28 | 29 | - name: Commit changes 30 | uses: EndBug/add-and-commit@v9 31 | with: 32 | 33 | message: "Generate mo" 34 | - name: Push changes 35 | 36 | uses: actions-go/push@master 37 | 38 | -------------------------------------------------------------------------------- /public/lib/kanban/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 craig-davey96 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | -------------------------------------------------------------------------------- /ajax/index.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | -------------------------------------------------------------------------------- /front/index.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | -------------------------------------------------------------------------------- /sql/update-1.5.1.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `glpi_plugin_tasklists_items_kanbans` 2 | ( 3 | `id` INT(11) NOT NULL AUTO_INCREMENT, -- id 4 | `itemtype` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, 5 | `items_id` int(11) DEFAULT NULL, 6 | `users_id` int(11) NOT NULL, 7 | `plugin_tasklists_taskstates_id` int(11) NOT NULL, 8 | `state` int(1) NOT NULL DEFAULT 0, 9 | `date_mod` timestamp NULL DEFAULT NULL, 10 | `date_creation` timestamp NULL DEFAULT NULL, 11 | PRIMARY KEY (`id`), 12 | UNIQUE KEY `unicity` (`itemtype`, `items_id`, `users_id`, `plugin_tasklists_taskstates_id`) 13 | ) ENGINE = InnoDB 14 | DEFAULT CHARSET = utf8 15 | COLLATE = utf8_unicode_ci; 16 | 17 | ALTER TABLE `glpi_plugin_tasklists_preferences` 18 | ADD `automatic_refresh` TINYINT(1) NOT NULL DEFAULT '0'; 19 | ALTER TABLE `glpi_plugin_tasklists_preferences` 20 | ADD `automatic_refresh_delay` INT(11) NOT NULL DEFAULT '10'; 21 | 22 | -------------------------------------------------------------------------------- /front/preference.form.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Preference; 31 | 32 | Session::checkLoginUser(); 33 | 34 | //Save user preferences 35 | if (isset ($_POST['update'])) { 36 | $pref = new Preference(); 37 | $pref->check(-1, UPDATE, $_POST); 38 | $pref->update($_POST); 39 | Html::back(); 40 | } 41 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchToken.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | export default class SearchToken{constructor(t,s,i,e,h,l=null){this.term=t;this.tag=s||null;this.exclusion=i;this.position=e;this.raw=h;this.prefix=l}} -------------------------------------------------------------------------------- /ajax/inputEntity.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | header("Content-Type: text/html; charset=UTF-8"); 31 | Html::header_nocache(); 32 | 33 | Session::checkLoginUser(); 34 | Session::checkRight('plugin_tasklists', UPDATE); 35 | 36 | if (isset($_POST["entities_id"])) { 37 | echo Html::hidden('entities_id', ['value' => $_POST["entities_id"]]); 38 | } 39 | -------------------------------------------------------------------------------- /front/ticket.form.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use Glpi\Exception\Http\BadRequestHttpException; 31 | use GlpiPlugin\Tasklists\Ticket; 32 | 33 | Session::checkLoginUser(); 34 | 35 | $ticket = new Ticket(); 36 | if (isset($_POST["add"])) { 37 | $ticket->check(-1, CREATE, $_POST); 38 | 39 | $ticket->add($_POST); 40 | Html::back(); 41 | 42 | } 43 | 44 | throw new BadRequestHttpException("lost"); 45 | -------------------------------------------------------------------------------- /ajax/dropdownState.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Task; 31 | 32 | header("Content-Type: text/html; charset=UTF-8"); 33 | Html::header_nocache(); 34 | 35 | Session::checkLoginUser(); 36 | Session::checkRight('plugin_tasklists', UPDATE); 37 | 38 | if (isset($_POST["plugin_tasklists_tasktypes_id"])) { 39 | 40 | Task::displayState($_POST['plugin_tasklists_tasktypes_id']); 41 | 42 | } 43 | -------------------------------------------------------------------------------- /front/setup.templates.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Menu; 31 | use GlpiPlugin\Tasklists\Task; 32 | 33 | global $CFG_GLPI; 34 | $task = new Task(); 35 | 36 | if ($task->canView() || Session::haveRight("config", UPDATE)) { 37 | Html::header(Task::getTypeName(2), '', "helpdesk", Menu::class); 38 | 39 | $task->listOfTemplates($CFG_GLPI['root_doc'] . "/plugins/tasklists/front/task.form.php", $_GET["add"]); 40 | 41 | Html::footer(); 42 | } 43 | -------------------------------------------------------------------------------- /front/task.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use Glpi\Exception\Http\AccessDeniedHttpException; 31 | use GlpiPlugin\Tasklists\Menu; 32 | use GlpiPlugin\Tasklists\Task; 33 | 34 | Html::header(Task::getTypeName(2), '', "helpdesk", Menu::class); 35 | 36 | $task = new Task(); 37 | 38 | if ($task->canView() || Session::haveRight("config", CREATE)) { 39 | 40 | Search::show(Task::class); 41 | 42 | } else { 43 | throw new AccessDeniedHttpException(); 44 | } 45 | 46 | Html::footer(); 47 | -------------------------------------------------------------------------------- /front/typevisibility.form.php: -------------------------------------------------------------------------------- 1 | . 28 | -------------------------------------------------------------------------- 29 | */ 30 | 31 | use GlpiPlugin\Tasklists\TypeVisibility; 32 | 33 | $group = new TypeVisibility(); 34 | 35 | if (isset($_POST["add_groups"])) { 36 | $group->check(-1, UPDATE, $_POST); 37 | //add groups 38 | foreach ($_POST['groups_id'] as $groups_id) { 39 | $group->add(['groups_id' => $groups_id, 40 | 'plugin_tasklists_tasktypes_id' => $_POST['plugin_tasklists_tasktypes_id']]); 41 | } 42 | Html::back(); 43 | } 44 | -------------------------------------------------------------------------------- /front/comment.form.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Menu; 31 | use GlpiPlugin\Tasklists\Task; 32 | 33 | if (!isset($_GET["id"])) { 34 | $_GET["id"] = ""; 35 | } 36 | if (!isset($_GET["withtemplate"])) { 37 | $_GET["withtemplate"] = ""; 38 | } 39 | 40 | Html::header(Task::getTypeName(2), '', "helpdesk", Menu::class); 41 | 42 | $task = new Task(); 43 | $task->checkGlobal(READ); 44 | $task->getFromDB($_GET['id']); 45 | $note = new Notepad(); 46 | $note->showForItem($task); 47 | 48 | Html::footer(); 49 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchTokenizerResult.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | export default class SearchTokenizerResult{constructor(){this.tokens=[]}getTag(t){return this.tokens.filter((e=>e.tag===t))}getTaggedTerms(){return this.tokens.filter((t=>t.tag!==null))}getUntaggedTerms(){return this.tokens.filter((t=>t.tag===null))}getFullPhrase(){let t="";this.getUntaggedTerms().forEach((e=>t+=` ${e.term}`));return t.trim()}} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plugin Tasklists for GLPI 2 | 3 | ![Plugin tasklists](https://raw.githubusercontent.com/InfotelGLPI/tasklists/master/screenshots/kanban.png "Plugin tasklists") 4 | 5 | This plugin is on Transifex - Help us to translate : 6 | https://www.transifex.com/infotelGLPI/GLPI_tasklists/ 7 | 8 | See wiki for use it ? https://github.com/InfotelGLPI/tasklists/wiki 9 | 10 | Adding a management of tasks & a kanban. This plugin adds in GLPI, an interface to add tasks & manage them into a kanban 11 | 12 | Last features : 13 | 14 | - [X] Clone task 15 | - [X] Add comments to tasks 16 | - [X] See authors tasks filter 17 | - [X] See archived tasks filter 18 | - [X] See in progress tasks filter 19 | - [X] Send notifications for add / change / delete task 20 | - [X] Use richtext on tasks 21 | - [X] Add templates by context 22 | - [X] Add entity pre-selection 23 | - [X] Use a default Backlog from list 24 | - [X] Link to tickets 25 | - [X] Preference : context by default 26 | - [X] See percentage of completion from tasks 27 | - [X] Order States 28 | - [X] Add context to States 29 | - [X] Add color to States 30 | - [X] Minimize closed tasks 31 | - [X] Can be used with mail collector to create tasks 32 | - [ ] Add notification for revive user in charge 33 | - [ ] Add min - max by state 34 | - [ ] Add notifications to comments 35 | 36 | For GLPI versions <9.1, for use it with mail collector you must to modify "inc/rulemailcollector.class.php" file, into "executeActions" fonction, into switch : switch ($action->fields["action_type"]), add a default case : 37 | 38 | ``` 39 | default: 40 | //plugins actions 41 | $executeaction = clone $this; 42 | $output = $executeaction->executePluginsActions($action, $output, $params); 43 | break; 44 | ``` 45 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchToken.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | 34 | class SearchToken { 35 | constructor(term, tag, exclusion, position, raw, prefix = null) { 36 | this.term = term; 37 | this.tag = tag || null; // Prevent undefined value 38 | this.exclusion = exclusion; 39 | this.position = position; 40 | this.raw = raw; 41 | this.prefix = prefix; 42 | } 43 | } 44 | window.SearchToken = SearchToken; 45 | -------------------------------------------------------------------------------- /ajax/contextForm.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\TaskState; 31 | 32 | Session::checkLoginUser(); 33 | Session::checkRight('plugin_tasklists_config', UPDATE); 34 | 35 | Html::header_nocache(); 36 | header("Content-Type: text/html; charset=UTF-8"); 37 | 38 | //Html::requireJs('tinymce'); 39 | echo ""; 40 | 41 | if (isset($_GET['newContext'])) { 42 | $options = [ 43 | 'from_edit_ajax' => true, 44 | 45 | 'withtemplate' => 0 46 | ]; 47 | $task = new TaskState(); 48 | $task->showForm(0, $options); 49 | 50 | } 51 | -------------------------------------------------------------------------------- /ajax/getTaskComment.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Task_Comment; 31 | 32 | header("Content-Type: text/html; charset=UTF-8"); 33 | Html::header_nocache(); 34 | 35 | Session::checkLoginUser(); 36 | Session::checkRight('plugin_tasklists', UPDATE); 37 | 38 | if (!isset($_POST['plugin_tasklists_tasks_id'])) { 39 | throw new \RuntimeException('Required argument missing!'); 40 | } 41 | 42 | $plugin_tasklists_tasks_id = $_POST['plugin_tasklists_tasks_id']; 43 | $lang = null; 44 | if (isset($_POST['language'])) { 45 | $lang = $_POST['language']; 46 | } 47 | 48 | $edit = false; 49 | if (isset($_POST['edit'])) { 50 | $edit = $_POST['edit']; 51 | } 52 | 53 | $answer = false; 54 | if (isset($_POST['answer'])) { 55 | $answer = $_POST['answer']; 56 | } 57 | 58 | echo Task_Comment::getCommentForm($plugin_tasklists_tasks_id, $lang, $edit, $answer); 59 | -------------------------------------------------------------------------------- /public/lib/kanban/README.md: -------------------------------------------------------------------------------- 1 | # Kanban-jQuery 2 | # https://github.com/craig-davey96/Kanban-jQuery 3 | Kanban Board jQuery Plugin 4 | 5 | # Requirements 6 | 7 | 1. jQuery v3.2.1+ (https://jquery.com/download/) 8 | 2. jQuery UI v1.12.1+ (https://jqueryui.com/) 9 | 10 | # Example 11 | 12 | Include styles and script 13 | ```html 14 | 15 | 16 | ``` 17 | 18 | Example of the HTML element 19 | ```html 20 |
21 | ``` 22 | 23 | Example of the javascript call to create a Kanban Board 24 | ```js 25 | $('#kanban').kanban({ 26 | titles: ['Task' , 'Estimate' , 'Complete' , 'Invoiced' , 'Paid'], 27 | colours: ['#00aaff','#ff921d','#00ff40','#ffe54b','#8454ff'], 28 | items: [ 29 | { 30 | id: 1, 31 | title: 'Test', 32 | block: 'Task', 33 | link: '[URL]', 34 | link_text: 'TEST001', 35 | footer: ' 1
1/4
' 36 | }, 37 | { 38 | id: 2, 39 | title: 'Test 2', 40 | block: 'Estimate', 41 | footer: ' 1
1/4
' 42 | }, 43 | { 44 | id: 3, 45 | title: 'Test 3', 46 | block: 'Estimate', 47 | footer: ' 1
1/4
' 48 | }, 49 | { 50 | id: 4, 51 | title: 'Test 5', 52 | block: 'Estimate', 53 | footer: ' 1
1/4
' 54 | }, 55 | { 56 | id: 5, 57 | title: 'Test 5', 58 | block: 'Estimate', 59 | footer: ' 1
1/4
' 60 | }, 61 | ] 62 | }); 63 | ``` 64 | -------------------------------------------------------------------------------- /ajax/dropdownTypeTasks.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Task; 31 | 32 | if (strpos($_SERVER['PHP_SELF'], "dropdownTypeTasks.php")) { 33 | header("Content-Type: text/html; charset=UTF-8"); 34 | Html::header_nocache(); 35 | } 36 | 37 | Session::checkCentralAccess(); 38 | Session::checkRight('plugin_tasklists', UPDATE); 39 | 40 | global $DB; 41 | 42 | // Make a select box 43 | if (isset($_POST["tasktypes"])) { 44 | $used = []; 45 | 46 | // Clean used array 47 | if ( 48 | isset($_POST['used']) 49 | && is_array($_POST['used']) 50 | && (count($_POST['used']) > 0) 51 | ) { 52 | $options = [ 53 | 'id' => $_POST['used'], 54 | 'plugin_tasklists_tasktypes_id' => $_POST['tasktypes'] 55 | ]; 56 | foreach ( 57 | $DB->request([ 58 | 'FROM' => 'glpi_plugin_tasklists_tasks', 59 | 'WHERE' => $options 60 | ]) as $data 61 | ) { 62 | $used[$data['id']] = $data['id']; 63 | } 64 | } 65 | 66 | 67 | Dropdown::show( 68 | Task::class, 69 | [ 70 | 'name' => $_POST['myname'], 71 | 'used' => $used, 72 | 'width' => '50%', 73 | 'entity' => $_POST['entity'], 74 | 'rand' => $_POST['rand'], 75 | 'condition' => ["glpi_plugin_tasklists_tasks.plugin_tasklists_tasktypes_id" => $_POST["tasktypes"]] 76 | ] 77 | ); 78 | } 79 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchTokenizerResult.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | 34 | class SearchTokenizerResult { 35 | 36 | constructor() { 37 | /** 38 | * @type {SearchToken[]} 39 | */ 40 | this.tokens = []; 41 | } 42 | 43 | /** 44 | * Get all tokens with a specific tag 45 | * @param name 46 | * @return {SearchToken[]} 47 | */ 48 | getTag(name) { 49 | return this.tokens.filter(t => t.tag === name); 50 | } 51 | 52 | /** 53 | * Get all tokens with a tag 54 | * @return {SearchToken[]} 55 | */ 56 | getTaggedTerms() { 57 | return this.tokens.filter(t => t.tag !== null); 58 | } 59 | 60 | /** 61 | * Get all tokens without a tag 62 | * @return {SearchToken[]} 63 | */ 64 | getUntaggedTerms() { 65 | return this.tokens.filter(t => t.tag === null); 66 | } 67 | 68 | /** 69 | * Get all untagged terms as a concatenated string 70 | * 71 | * The terms in the resulting string should be in the same order they appeared in the tokenizer input string. 72 | * @return {string} 73 | */ 74 | getFullPhrase() { 75 | let full_phrase = ''; 76 | this.getUntaggedTerms().forEach(t => full_phrase += ` ${t.term}`); 77 | return full_phrase.trim(); 78 | } 79 | } 80 | window.SearchTokenizerResult = SearchTokenizerResult; 81 | -------------------------------------------------------------------------------- /front/kanban.php: -------------------------------------------------------------------------------- 1 | . 28 | -------------------------------------------------------------------------- 29 | */ 30 | 31 | 32 | global $CFG_GLPI; 33 | 34 | use Glpi\Exception\Http\AccessDeniedHttpException; 35 | use GlpiPlugin\Tasklists\Menu; 36 | use GlpiPlugin\Tasklists\Task; 37 | use GlpiPlugin\Tasklists\Kanban; 38 | 39 | Html::header(Task::getTypeName(2), '', "helpdesk", Menu::class); 40 | 41 | $kanban = new Kanban(); 42 | 43 | if ($kanban->canView() || Session::haveRight("config", CREATE)) { 44 | //AS module for SearchTokenizer 45 | // echo ""; 46 | echo ""; 47 | echo ""; 48 | echo ""; 49 | echo ""; 50 | echo ""; 51 | 52 | Html::requireJs('sortable'); 53 | // Html::requireJs('kanban'); 54 | echo Html::css(PLUGIN_TASKLISTS_WEBDIR . '/lib/kanban/css/kanban.css'); 55 | // echo Html::script(PLUGIN_TASKLISTS_WEBDIR . "/lib/kanban/js/kanban-actions.js"); 56 | if (!isset($_GET["context_id"])) { 57 | $_GET["context_id"] = -1; 58 | } 59 | Kanban::showKanban($_GET["context_id"]); 60 | } else { 61 | throw new AccessDeniedHttpException(); 62 | } 63 | 64 | Html::footer(); 65 | -------------------------------------------------------------------------------- /tools/extract_template.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | # --- Étape 1 : Extraction des chaînes PHP --- 5 | find . -name '*.php' > php_files.list 6 | 7 | xgettext --files-from=php_files.list \ 8 | --copyright-holder='Tasklists Development Team' \ 9 | --package-name='Tasklists plugin' \ 10 | -o locales/glpi.pot \ 11 | -L PHP \ 12 | --add-comments=TRANS \ 13 | --from-code=UTF-8 \ 14 | --force-po \ 15 | --sort-output \ 16 | --keyword=_n:1,2,4t \ 17 | --keyword=__s:1,2t \ 18 | --keyword=__:1,2t \ 19 | --keyword=_e:1,2t \ 20 | --keyword=_x:1c,2,3t \ 21 | --keyword=_ex:1c,2,3t \ 22 | --keyword=_nx:1c,2,3,5t \ 23 | --keyword=_sx:1c,2,3t 24 | 25 | rm php_files.list 26 | 27 | # --- Étape 2 : Extraction des chaînes Twig --- 28 | 29 | SCRIPT_DIR=$(dirname "$0") 30 | WORKING_DIR=$(readlink -f "$SCRIPT_DIR/..") 31 | OUTPUT_FILE="$WORKING_DIR/locales/glpi.pot" 32 | 33 | F_ARGS_N="1,2" 34 | F_ARGS__S="1" 35 | F_ARGS__="1" 36 | F_ARGS_X="1c,2" 37 | F_ARGS_SX="1c,2" 38 | F_ARGS_NX="1c,2,3" 39 | F_ARGS_SN="1,2" 40 | 41 | find "$WORKING_DIR/templates" -type f -name "*.twig" | while read -r file; do 42 | 43 | # Convertit les blocs Twig {{ ... }} en pseudo-code PHP pour xgettext 44 | perl -0pe 's/\{\{\s*(.*?)\s*\}\}//g' "$file" \ 45 | | xgettext -o "$OUTPUT_FILE" -L PHP \ 46 | --add-comments=TRANS \ 47 | --from-code=UTF-8 \ 48 | --force-po \ 49 | --join-existing \ 50 | --sort-output \ 51 | --keyword=_n:$F_ARGS_N \ 52 | --keyword=__:$F_ARGS__ \ 53 | --keyword=_x:$F_ARGS_X \ 54 | --keyword=_nx:$F_ARGS_NX \ 55 | --keyword=_sn:$F_ARGS_SN \ 56 | - 57 | 58 | # Corrige les références de fichier dans le POT 59 | sed -i -r "s|standard input:([0-9]+)|$file:\1|g" "$OUTPUT_FILE" 60 | done 61 | # --- Étape 3 : Extraction des chaînes JavaScript --- 62 | KANBAN_DIR="$WORKING_DIR/public/lib/kanban/js" 63 | OUTPUT_FILE="$WORKING_DIR/locales/glpi.pot" 64 | 65 | # Crée le fichier de sortie s'il n'existe pas 66 | mkdir -p "$(dirname "$OUTPUT_FILE")" 67 | touch "$OUTPUT_FILE" 68 | 69 | if [ -d "$KANBAN_DIR" ]; then 70 | echo "Extraction depuis JavaScript : $KANBAN_DIR" 71 | find "$KANBAN_DIR" -type f -name "*.js" > js_files.list 72 | 73 | # xgettext a besoin du fichier de sortie en paramètre explicite APRÈS -j 74 | xgettext --files-from=js_files.list \ 75 | -L JavaScript \ 76 | --add-comments=TRANS \ 77 | --from-code=UTF-8 \ 78 | --force-po \ 79 | --sort-output \ 80 | --keyword=_n:1,2 \ 81 | --keyword=__:1 \ 82 | --keyword=_x:1c,2 \ 83 | --keyword=_nx:1c,2,3 \ 84 | -o "$OUTPUT_FILE" -j 85 | 86 | rm js_files.list 87 | else 88 | echo "⚠️ Dossier $KANBAN_DIR introuvable — étape JavaScript ignorée." 89 | fi 90 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | 2 | on: 3 | push: 4 | # Sequence of patterns matched against refs/tags 5 | tags: 6 | - '*.*.*' # Push events to matching ex:20.15.10 7 | 8 | name: Create release with tag 9 | env: 10 | TAG_VALUE: ${GITHUB_REF/refs\/tags\//} 11 | jobs: 12 | build: 13 | name: Upload Release Asset 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v2 18 | - name: Build project # This would actually build your project, using zip for an example artifact 19 | id: build_ 20 | env: 21 | GITHUB_NAME: ${{ github.event.repository.name }} 22 | 23 | 24 | run: sudo apt-get install libxml-xpath-perl;echo $(xpath -e '/root/versions/version[num="'${GITHUB_REF/refs\/tags\//}'"]/compatibility/text()' $GITHUB_NAME.xml);echo ::set-output name=version_glpi::$(xpath -e '/root/versions/version[num="'${GITHUB_REF/refs\/tags\//}'"]/compatibility/text()' $GITHUB_NAME.xml); rm -rf $GITHUB_NAME.xml tools wiki screenshots test .git .github ISSUE_TEMPLATE.md TODO.txt $GITHUB_NAME.png;cd ..; tar jcvf glpi-$GITHUB_NAME-${GITHUB_REF/refs\/tags\//}.tar.bz2 $GITHUB_NAME;ls -al;echo ::set-output name=tag::${GITHUB_REF/refs\/tags\//};echo ${{ steps.getxml.outputs.info }}; 25 | # run: rm -rf $GITHUB_NAME.xml tools wiki screenshots test ISSUE_TEMPLATE.md TODO.txt $GITHUB_NAME.png; tar -zcvf glpi-$GITHUB_NAME-$GITHUB_TAG.tar.gz $GITHUB_NAME 26 | - name: Create Release 27 | id: create_release 28 | uses: actions/create-release@v1 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | with: 32 | tag_name: ${{ github.ref }} 33 | release_name: | 34 | GLPI ${{ steps.build_.outputs.version_glpi }} : Version ${{ github.ref }} disponible / available 35 | body : Version ${{ steps.build_.outputs.tag }} released for GLPI ${{ steps.build_.outputs.version_glpi }} 36 | draft: false 37 | prerelease: true 38 | - name: Upload Release Asset 39 | id: upload-release-asset 40 | uses: actions/upload-release-asset@v1 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | GITHUB_NAME: ${{ github.event.repository.name }} 44 | with: 45 | upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 46 | asset_path: /home/runner/work/${{ github.event.repository.name }}/glpi-${{ github.event.repository.name }}-${{ steps.build_.outputs.tag }}.tar.bz2 47 | asset_name: glpi-${{ github.event.repository.name }}-${{ steps.build_.outputs.tag }}.tar.bz2 48 | asset_content_type: application/zip 49 | 50 | -------------------------------------------------------------------------------- /templates/kanban.html.twig: -------------------------------------------------------------------------------- 1 | {# 2 | # --------------------------------------------------------------------- 3 | # GLPI - Gestionnaire Libre de Parc Informatique 4 | # Copyright (C) 2015-2022 Teclib' and contributors. 5 | # 6 | # http://glpi-project.org 7 | # 8 | # based on GLPI - Gestionnaire Libre de Parc Informatique 9 | # Copyright (C) 2003-2014 by the INDEPNET Development Team. 10 | # 11 | # --------------------------------------------------------------------- 12 | # 13 | # LICENSE 14 | # 15 | # This file is part of GLPI. 16 | # 17 | # GLPI is free software; you can redistribute it and/or modify 18 | # it under the terms of the GNU General Public License as published by 19 | # the Free Software Foundation; either version 2 of the License, or 20 | # (at your option) any later version. 21 | # 22 | # GLPI is distributed in the hope that it will be useful, 23 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 24 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 | # GNU General Public License for more details. 26 | # 27 | # You should have received a copy of the GNU General Public License 28 | # along with GLPI. If not, see . 29 | # --------------------------------------------------------------------- 30 | #} 31 | 32 | {% import 'components/form/fields_macros.html.twig' as fields %} 33 | {% import 'components/form/modals_macros.html.twig' as modals %} 34 | 35 | {% if rights is not defined %} 36 | {% set rights = { 37 | 'create_item': false, 38 | 'delete_item': false, 39 | 'create_column': false, 40 | 'modify_view': false, 41 | 'order_card': false, 42 | 'create_card_limited_columns': [0], 43 | } %} 44 | {% endif %} 45 | 46 |
47 | {{ modals.modal('', '', { 48 | 'id': 'kanban-modal' 49 | }) }} 50 | 51 | {% for supported_itemtype, info in supported_itemtypes %} 52 | 58 | {% endfor %} 59 | 60 | 78 | -------------------------------------------------------------------------------- /ajax/updatetask.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Task; 31 | 32 | Session::checkLoginUser(); 33 | Session::checkRight('plugin_tasklists', UPDATE); 34 | 35 | if (isset($_POST['data_id']) 36 | && isset($_POST['percent_done'])) { 37 | $task = new Task(); 38 | $input['percent_done'] = $_POST['percent_done']; 39 | $input['id'] = $_POST['data_id']; 40 | $task->update($input); 41 | 42 | } else if (isset($_POST['data_id']) 43 | && isset($_POST['updatepriority'])) { 44 | $task = new Task(); 45 | if ($task->getFromDB($_POST['data_id'])) { 46 | if ($task->fields["priority"] < 5) { 47 | $input['priority'] = $task->fields["priority"] + 1; 48 | } 49 | $input['id'] = $_POST['data_id']; 50 | $task->update($input); 51 | } 52 | } else if (isset($_POST['data_id']) 53 | && isset($_POST['archivetask'])) { 54 | $task = new Task(); 55 | $input['is_archived'] = 1; 56 | $input['id'] = $_POST['data_id']; 57 | $task->update($input); 58 | 59 | } else if (isset($_POST['archivealltasks']) 60 | && isset($_POST['state_id']) 61 | && isset($_POST['context_id'])) { 62 | 63 | $task = new Task(); 64 | $dbu = new DbUtils(); 65 | $cond = ["plugin_tasklists_taskstates_id" => $_POST['state_id'], 66 | "plugin_tasklists_tasktypes_id" => $_POST['context_id'], 67 | "is_deleted" => 0, 68 | "is_archived" => 0]; 69 | $tasks = $dbu->getAllDataFromTable($dbu->getTableForItemType(Task::class), 70 | $cond); 71 | foreach ($tasks as $key => $row) { 72 | if ($task->getFromDB($row['id'])) { 73 | $input['is_archived'] = 1; 74 | $input['id'] = $row['id']; 75 | $task->update($input); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /front/task_comment.form.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use Glpi\Exception\Http\BadRequestHttpException; 31 | use GlpiPlugin\Tasklists\Task; 32 | use GlpiPlugin\Tasklists\Task_Comment; 33 | 34 | Session::checkLoginUser(); 35 | 36 | $comment = new Task_Comment(); 37 | if (!isset($_POST['plugin_tasklists_tasks_id'])) { 38 | $message = __('Mandatory fields are not filled!'); 39 | Session::addMessageAfterRedirect($message, false, ERROR); 40 | Html::back(); 41 | } 42 | $task = new Task(); 43 | $task->getFromDB($_POST['plugin_tasklists_tasks_id']); 44 | //if (!$task->canComment()) { 45 | // Html::displayRightError(); 46 | //} 47 | 48 | if (isset($_POST["add"])) { 49 | if (!isset($_POST['plugin_tasklists_tasks_id']) || !isset($_POST['comment'])) { 50 | $message = __('Mandatory fields are not filled!'); 51 | Session::addMessageAfterRedirect($message, false, ERROR); 52 | Html::back(); 53 | } 54 | 55 | if ($newid = $comment->add($_POST)) { 56 | Session::addMessageAfterRedirect( 57 | "" . __('Your comment has been added') . "", 58 | false, 59 | INFO 60 | ); 61 | } 62 | Html::back(); 63 | } 64 | 65 | if (isset($_POST["edit"])) { 66 | if (!isset($_POST['plugin_tasklists_tasks_id']) || !isset($_POST['id']) || !isset($_POST['comment'])) { 67 | $message = __('Mandatory fields are not filled!'); 68 | Session::addMessageAfterRedirect($message, false, ERROR); 69 | Html::back(); 70 | } 71 | 72 | $comment->getFromDB($_POST['id']); 73 | $data = array_merge($comment->fields, $_POST); 74 | if ($comment->update($data)) { 75 | Session::addMessageAfterRedirect( 76 | "" . __('Your comment has been edited') . "", 77 | false, 78 | INFO 79 | ); 80 | } 81 | Html::back(); 82 | } 83 | 84 | throw new BadRequestHttpException("lost"); 85 | -------------------------------------------------------------------------------- /sql/empty-1.0.0.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasks`; 2 | CREATE TABLE `glpi_plugin_tasklists_tasks` 3 | ( 4 | `id` int(11) NOT NULL auto_increment, 5 | `entities_id` int(11) NOT NULL default '0', 6 | `is_recursive` tinyint(1) NOT NULL default '0', 7 | `name` varchar(255) collate utf8_unicode_ci default NULL, 8 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_plugin_tasklists_tasktypes (id)', 9 | `priority` int(11) NOT NULL DEFAULT '1', 10 | `visibility` int(11) NOT NULL DEFAULT '1', 11 | `actiontime` int(11) NOT NULL DEFAULT '0', 12 | `percent_done` int(11) NOT NULL DEFAULT '0', 13 | `state` int(11) NOT NULL DEFAULT '1', 14 | `due_date` date default NULL, 15 | `users_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_users (id)', 16 | `groups_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_groups (id)', 17 | `comment` text collate utf8_unicode_ci, 18 | `notepad` longtext collate utf8_unicode_ci, 19 | `date_mod` datetime default NULL, 20 | `is_deleted` tinyint(1) NOT NULL default '0', 21 | PRIMARY KEY (`id`), 22 | KEY `name` (`name`), 23 | KEY `entities_id` (`entities_id`), 24 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 25 | KEY `users_id` (`users_id`), 26 | KEY `groups_id` (`groups_id`), 27 | KEY `date_mod` (`date_mod`), 28 | KEY `is_deleted` (`is_deleted`) 29 | ) ENGINE = MyISAM 30 | DEFAULT CHARSET = utf8 31 | COLLATE = utf8_unicode_ci; 32 | 33 | 34 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasktypes`; 35 | CREATE TABLE `glpi_plugin_tasklists_tasktypes` 36 | ( 37 | `id` int(11) NOT NULL AUTO_INCREMENT, 38 | `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 39 | `entities_id` int(11) NOT NULL DEFAULT '0', 40 | `is_recursive` tinyint(1) NOT NULL DEFAULT '0', 41 | `comment` text COLLATE utf8_unicode_ci, 42 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL DEFAULT '0', 43 | `completename` text COLLATE utf8_unicode_ci, 44 | `level` int(11) NOT NULL DEFAULT '0', 45 | `ancestors_cache` longtext COLLATE utf8_unicode_ci, 46 | `sons_cache` longtext COLLATE utf8_unicode_ci, 47 | PRIMARY KEY (`id`), 48 | KEY `name` (`name`), 49 | KEY `unicity` (`plugin_tasklists_tasktypes_id`, `name`) 50 | ) ENGINE = MyISAM 51 | DEFAULT CHARSET = utf8 52 | COLLATE = utf8_unicode_ci; -------------------------------------------------------------------------------- /sql/empty-1.3.0.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasks`; 2 | CREATE TABLE `glpi_plugin_tasklists_tasks` 3 | ( 4 | `id` int(11) NOT NULL auto_increment, 5 | `entities_id` int(11) NOT NULL default '0', 6 | `is_recursive` tinyint(1) NOT NULL default '0', 7 | `name` varchar(255) collate utf8_unicode_ci default NULL, 8 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_plugin_tasklists_tasktypes (id)', 9 | `priority` int(11) NOT NULL DEFAULT '1', 10 | `visibility` int(11) NOT NULL DEFAULT '1', 11 | `actiontime` int(11) NOT NULL DEFAULT '0', 12 | `percent_done` int(11) NOT NULL DEFAULT '0', 13 | `state` int(11) NOT NULL DEFAULT '1', 14 | `due_date` date default NULL, 15 | `users_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_users (id)', 16 | `groups_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_groups (id)', 17 | `comment` text collate utf8_unicode_ci, 18 | `notepad` longtext collate utf8_unicode_ci, 19 | `date_mod` datetime default NULL, 20 | `is_deleted` tinyint(1) NOT NULL default '0', 21 | PRIMARY KEY (`id`), 22 | KEY `name` (`name`), 23 | KEY `entities_id` (`entities_id`), 24 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 25 | KEY `users_id` (`users_id`), 26 | KEY `groups_id` (`groups_id`), 27 | KEY `date_mod` (`date_mod`), 28 | KEY `is_deleted` (`is_deleted`) 29 | ) ENGINE = InnoDB 30 | DEFAULT CHARSET = utf8 31 | COLLATE = utf8_unicode_ci; 32 | 33 | 34 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasktypes`; 35 | CREATE TABLE `glpi_plugin_tasklists_tasktypes` 36 | ( 37 | `id` int(11) NOT NULL AUTO_INCREMENT, 38 | `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 39 | `entities_id` int(11) NOT NULL DEFAULT '0', 40 | `is_recursive` tinyint(1) NOT NULL DEFAULT '0', 41 | `comment` text COLLATE utf8_unicode_ci, 42 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL DEFAULT '0', 43 | `completename` text COLLATE utf8_unicode_ci, 44 | `level` int(11) NOT NULL DEFAULT '0', 45 | `ancestors_cache` longtext COLLATE utf8_unicode_ci, 46 | `sons_cache` longtext COLLATE utf8_unicode_ci, 47 | PRIMARY KEY (`id`), 48 | KEY `name` (`name`), 49 | KEY `unicity` (`plugin_tasklists_tasktypes_id`, `name`) 50 | ) ENGINE = InnoDB 51 | DEFAULT CHARSET = utf8 52 | COLLATE = utf8_unicode_ci; -------------------------------------------------------------------------------- /src/Menu.php: -------------------------------------------------------------------------------- 1 | . 28 | -------------------------------------------------------------------------- 29 | */ 30 | 31 | namespace GlpiPlugin\Tasklists; 32 | 33 | use CommonGLPI; 34 | use Session; 35 | 36 | /** 37 | * Class Menu 38 | */ 39 | class Menu extends CommonGLPI 40 | { 41 | public static $rightname = 'plugin_tasklists'; 42 | 43 | /** 44 | * @param int $nb 45 | * 46 | * @return string 47 | */ 48 | public static function getMenuName($nb = 1) 49 | { 50 | return __('Tasks list', 'tasklists'); 51 | } 52 | 53 | /** 54 | * @return array 55 | */ 56 | public static function getMenuContent() 57 | { 58 | 59 | $menu = []; 60 | $menu['title'] = self::getMenuName(2); 61 | $menu['page'] = Kanban::getSearchURL(false) ; 62 | 63 | $menu['links']['search'] = Task::getSearchURL(false); 64 | if (Task::canCreate()) { 65 | $menu['links']['add'] = PLUGIN_TASKLISTS_WEBDIR . '/front/setup.templates.php?add=1'; 66 | $menu['links']['template'] = PLUGIN_TASKLISTS_WEBDIR . '/front/setup.templates.php?add=0'; 67 | } 68 | $menu['links']['summary'] = Kanban::getSearchURL(false); 69 | 70 | $image = " " . Task::getTypeName(Session::getPluralNumber()); 71 | $menu['links'][$image] = Task::getSearchURL(false); 72 | 73 | $menu['icon'] = self::getIcon(); 74 | 75 | return $menu; 76 | } 77 | 78 | /** 79 | * @return string 80 | */ 81 | public static function getIcon() 82 | { 83 | return "ti ti-layout-kanban"; 84 | } 85 | 86 | public static function removeRightsFromSession() 87 | { 88 | if (isset($_SESSION['glpimenu']['helpdesk']['types'][Menu::class])) { 89 | unset($_SESSION['glpimenu']['helpdesk']['types'][Menu::class]); 90 | } 91 | if (isset($_SESSION['glpimenu']['helpdesk']['content'][Menu::class])) { 92 | unset($_SESSION['glpimenu']['helpdesk']['content'][Menu::class]); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchTokenizer.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | import SearchToken from"./SearchToken.js";import SearchTokenizerResult from"./SearchTokenizerResult.js";export default class SearchTokenizer{constructor(e={},t=false,s={}){this.token_pattern=/([^\s"']?\w+:)?("[^"]*"|'[^']*'|[^\s]+)/g;this.EXCLUSION_PREFIX="!";this.allowed_tags=e;this.drop_unallowed_tags=t;this.options=Object.assign({custom_prefixes:{}},s);delete this.options.custom_prefixes[this.EXCLUSION_PREFIX];delete this.options.custom_prefixes["'"];delete this.options.custom_prefixes['"']}isAllowedTag(e){if(e===null||e===undefined){return true}const t=Object.keys(this.allowed_tags).length===0||e in this.allowed_tags;return t}clearAutocomplete(){Object.keys(this.allowed_tags).forEach((e=>{this.allowed_tags[e].autocomplete_values=[]}))}setAutocomplete(e,t){if(e in this.allowed_tags){this.allowed_tags[e].autocomplete_values=t}}getAutocomplete(e){let t=[];if(e in this.allowed_tags){if(typeof this.allowed_tags[e].autocomplete_values==="function"){t=this.allowed_tags[e].autocomplete_values()}else{t=this.allowed_tags[e].autocomplete_values}}return t||[]}tokenize(e){e=e||"";e=e.trim();const t=new SearchTokenizerResult;let s=null;let l=0;while((s=this.token_pattern.exec(e))!==null){let e=false;let i=s[1]||null;let o=s[2].trim();if(i){i=i.slice(0,-1)}if(i===null&&o.endsWith(":")){i=o.slice(0,-1);o=""}let a=null;if(i&&i.length>1){const t=i.slice(0,1);const s=Object.keys(this.options.custom_prefixes);if(t===this.EXCLUSION_PREFIX){e=true;i=i.slice(1)}else{if(s.includes(t)){const e=i.slice(1);if(this.allowed_tags[e]&&this.allowed_tags[e].supported_prefixes.includes(t)){a=t;i=e}}}}if(!this.allowed_tags[i]||!(this.allowed_tags[i].supported_prefixes||[]).includes(this.EXCLUSION_PREFIX)){e=false}o=o||"";if(o.length>0){if(/^".+"$/.test(o)){o=o.trim().replace(/^"/,"").replace(/"$/,"").trim()}if(/^'.+'$/.test(o)){o=o.trim().replace(/^'/,"").replace(/'$/,"").trim()}}if(this.isAllowedTag(i)){t.tokens.push(new SearchToken(o,i,e,l++,s[0],a))}else if(!this.drop_unallowed_tags){t.tokens.push(new SearchToken(s[0],null,false,l++,s[0]))}}return t}} -------------------------------------------------------------------------------- /ajax/getUserPicture.php: -------------------------------------------------------------------------------- 1 | . 32 | * 33 | * --------------------------------------------------------------------- 34 | */ 35 | 36 | use Glpi\Exception\Http\BadRequestHttpException; 37 | use function Safe\json_encode; 38 | 39 | header("Content-Type: application/json; charset=UTF-8"); 40 | Html::header_nocache(); 41 | 42 | if (!isset($_REQUEST['users_id'])) { 43 | throw new BadRequestHttpException("Missing users_id parameter"); 44 | } elseif (!is_array($_REQUEST['users_id'])) { 45 | $_REQUEST['users_id'] = [$_REQUEST['users_id']]; 46 | } 47 | 48 | $_REQUEST['users_id'] = array_unique($_REQUEST['users_id']); 49 | 50 | if (!isset($_REQUEST['size'])) { 51 | $_REQUEST['size'] = '100%'; 52 | } 53 | 54 | if (!isset($_REQUEST['allow_blank'])) { 55 | $_REQUEST['allow_blank'] = false; 56 | } 57 | 58 | $user = new User(); 59 | $imgs = []; 60 | 61 | foreach ($_REQUEST['users_id'] as $user_id) { 62 | if ($user->getFromDB($user_id)) { 63 | if (!empty($user->fields['picture']) || $_REQUEST['allow_blank']) { 64 | if (isset($_REQUEST['type']) && $_REQUEST['type'] == 'thumbnail') { 65 | $path = User::getThumbnailURLForPicture($user->fields['picture']); 66 | } else { 67 | $path = User::getURLForPicture($user->fields['picture']); 68 | } 69 | $img = Html::image($path, [ 70 | 'title' => getUserName($user_id), 71 | 'data-bs-toggle' => 'tooltip', 72 | 'width' => $_REQUEST['size'], 73 | 'height' => $_REQUEST['size'], 74 | 'class' => $_REQUEST['class'] ?? '', 75 | ]); 76 | if (isset($_REQUEST['link']) && $_REQUEST['link']) { 77 | $imgs[$user_id] = sprintf( 78 | '%2$s', 79 | htmlescape(User::getFormURLWithID($user_id)), 80 | $img 81 | ); 82 | } else { 83 | $imgs[$user_id] = $img; 84 | } 85 | } else { 86 | // No picture and default image is not allowed. 87 | continue; 88 | } 89 | } 90 | } 91 | 92 | echo json_encode($imgs, JSON_FORCE_OBJECT); 93 | -------------------------------------------------------------------------------- /front/task.form.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | Session::checkRight("plugin_tasklists", READ); 31 | 32 | use GlpiPlugin\Tasklists\Menu; 33 | use GlpiPlugin\Tasklists\Task; 34 | use GlpiPlugin\Tasklists\Ticket; 35 | 36 | if (!isset($_GET["id"])) { 37 | $_GET["id"] = ""; 38 | } 39 | if (!isset($_GET["withtemplate"])) { 40 | $_GET["withtemplate"] = ""; 41 | } 42 | 43 | $task = new Task(); 44 | 45 | if (isset($_POST["add"])) { 46 | $task->check(-1, CREATE, $_POST); 47 | $newID = $task->add($_POST); 48 | //if ($_SESSION['glpibackcreated']) { 49 | // Html::redirect($task->getFormURL() . "?id=" . $newID); 50 | //} 51 | Html::back(); 52 | } else if (isset($_POST["delete"])) { 53 | $task->check($_POST['id'], DELETE); 54 | $task->delete($_POST); 55 | if (!isset($_POST["from_edit_ajax"])) { 56 | $task->redirectToList(); 57 | } else { 58 | Html::back(); 59 | } 60 | 61 | } else if (isset($_POST["restore"])) { 62 | $task->check($_POST['id'], PURGE); 63 | $task->restore($_POST); 64 | $task->redirectToList(); 65 | 66 | } else if (isset($_POST["purge"])) { 67 | $task->check($_POST['id'], PURGE); 68 | $task->delete($_POST, 1); 69 | if (!isset($_POST["from_edit_ajax"])) { 70 | $task->redirectToList(); 71 | } else { 72 | Html::back(); 73 | } 74 | 75 | } else if (isset($_POST["update"])) { 76 | $task->check($_POST['id'], UPDATE); 77 | $task->update($_POST); 78 | Html::back(); 79 | 80 | } else if (isset($_POST["done"])) { 81 | $task->check($_POST['id'], UPDATE); 82 | $options['id'] = $_POST['id']; 83 | $options['state'] = 2; 84 | $options['percent_done'] = 100; 85 | $task->update($options); 86 | Html::back(); 87 | 88 | } else if (isset($_POST["ticket_link"])) { 89 | 90 | $ticket = new Ticket(); 91 | $task = new Task(); 92 | $task->check($_POST['plugin_tasklists_tasks_id'], UPDATE); 93 | $ticket->add(['tickets_id' => $_POST['tickets_id'], 94 | 'plugin_tasklists_tasks_id' => $_POST['plugin_tasklists_tasks_id']]); 95 | Html::back(); 96 | 97 | } else { 98 | 99 | $task->checkGlobal(READ); 100 | 101 | Html::header(Task::getTypeName(2), '', "helpdesk", Menu::class); 102 | 103 | Html::requireJs('tinymce'); 104 | $task->display(['id' => $_GET["id"], 'withtemplate' => $_GET["withtemplate"]]); 105 | 106 | Html::footer(); 107 | } 108 | -------------------------------------------------------------------------------- /public/lib/kanban/js/kanban-actions.js: -------------------------------------------------------------------------------- 1 | $(document.body).on("kanban:post_build_toolbar", "#kanban", () => { 2 | 3 | var datas = $("#kanban").data('js_class'); 4 | var kcolumns = datas.columns; 5 | // console.log(datas); 6 | 7 | //Infotel add link on toolbar for archive all tasks on this column 8 | $.each(kcolumns, function( index, value ) { 9 | var finishState = value.finished; 10 | if (datas.rights.canCreateItem) { 11 | if (finishState === 1) { 12 | var archive_all_tasks = __('Archive all tasks of this state', 'tasklists'); 13 | // datas.toolbar_el = ""; 14 | } 15 | } 16 | }); 17 | 18 | // this.root_taslists = PLUGIN_TASKLISTS_WEBDIR + "/ajax/"; 19 | // self.tasklist_root = self.root_taslists + "/ajax/"; 20 | 21 | // var archiveColumnTask = function (column) { 22 | // var archivealltasks = 1; 23 | // var state_id = column; 24 | // var context_id = self.item.items_id; 25 | // var data = {archivealltasks, state_id, context_id}; 26 | // var alert_archive_all_tasks = __('Are you sure you want to archive all tasks ?', 'tasklists'); 27 | // if (confirm(alert_archive_all_tasks)) { 28 | // $.ajax({ 29 | // data: data, 30 | // type: 'POST', 31 | // url: (self.tasklist_root + "updatetask.php"), 32 | // success: function (data) { 33 | // self.refresh(); 34 | // } 35 | // }); 36 | // } 37 | // }; 38 | }); 39 | 40 | $(document.body).on("kanban:post_build", "#kanban", () => { 41 | 42 | //Infotel add card background 43 | //
  • 46 | 47 | 48 | //Infotel add link for update priority & archive task 49 | // let link = ""; 50 | // if (card.finished == 1 && card.archived == 0) { 51 | // let title_archive = __('Archive this task', 'tasklists'); 52 | // link += ' '; 53 | // } 54 | // if (card.finished == 0 && card.priority_id < self.max_priority) { 55 | // let title_priority = __('Update priority of task', 'tasklists'); 56 | // link += ''; 57 | // } 58 | // card_el += link; 59 | 60 | // $("a#archivetask" + items_id).click(function () { 61 | // var archivetask = 1; 62 | // var data_id = items_id; 63 | // var data = {archivetask, data_id}; 64 | // let title_archive = __('Are you sure you want to archive this task ?', 'tasklists'); 65 | // if (confirm(title_archive)) { 66 | // $.ajax({ 67 | // data: data, 68 | // type: 'POST', 69 | // url: (self.tasklist_root + "updatetask.php"), 70 | // success: function (data) { 71 | // self.refresh(); 72 | // } 73 | // }); 74 | // } 75 | // }); 76 | // $("a#updatepriority" + items_id).click(function () { 77 | // var updatepriority = 1; 78 | // var data_id = items_id; 79 | // var data = {updatepriority, data_id}; 80 | // $.ajax({ 81 | // data: data, 82 | // type: 'POST', 83 | // url: (self.tasklist_root + "updatetask.php"), 84 | // success: function (data) { 85 | // self.refresh(); 86 | // } 87 | // }); 88 | // }); 89 | }); 90 | -------------------------------------------------------------------------------- /setup.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | global $CFG_GLPI; 31 | 32 | use GlpiPlugin\Tasklists\Preference; 33 | use GlpiPlugin\Tasklists\Dashboard; 34 | use GlpiPlugin\Tasklists\Menu; 35 | use GlpiPlugin\Tasklists\Profile; 36 | use GlpiPlugin\Tasklists\Ticket; 37 | use GlpiPlugin\Tasklists\Task; 38 | 39 | define('PLUGIN_TASKLISTS_VERSION', '2.1.5'); 40 | 41 | if (!defined("PLUGIN_TASKLISTS_DIR")) { 42 | define("PLUGIN_TASKLISTS_DIR", Plugin::getPhpDir("tasklists")); 43 | // define("PLUGIN_TASKLISTS_WEBDIR", Plugin::getPhpDir("tasklists",false)); 44 | $root = $CFG_GLPI['root_doc'] . '/plugins/tasklists'; 45 | define("PLUGIN_TASKLISTS_WEBDIR", $root); 46 | } 47 | // Init the hooks of the plugins -Needed 48 | function plugin_init_tasklists() 49 | { 50 | global $PLUGIN_HOOKS, $CFG_GLPI; 51 | 52 | $PLUGIN_HOOKS['csrf_compliant']['tasklists'] = true; 53 | $PLUGIN_HOOKS['change_profile']['tasklists'] = [Profile::class, 'initProfile']; 54 | $PLUGIN_HOOKS['use_rules']['tasklists'] = ['RuleMailCollector']; 55 | // $PLUGIN_HOOKS[Hooks::ADD_CSS]['tasklists'][] = "kanban.css"; 56 | if (Session::getLoginUserID()) { 57 | 58 | Plugin::registerClass(Task::class, [ 59 | 'document_types' => true, 60 | 'notificationtemplates_types' => true, 61 | ]); 62 | 63 | Plugin::registerClass( 64 | Ticket::class, 65 | ['addtabon' => 'Ticket'] 66 | ); 67 | 68 | $PLUGIN_HOOKS['item_purge']['tasklists']['Ticket'] = [Ticket::class, 'cleanForTicket']; 69 | 70 | Plugin::registerClass( 71 | Profile::class, 72 | ['addtabon' => 'Profile'] 73 | ); 74 | 75 | Plugin::registerClass( 76 | Preference::class, 77 | ['addtabon' => 'Preference'] 78 | ); 79 | 80 | if (Session::haveRight("plugin_tasklists", READ)) { 81 | $PLUGIN_HOOKS['menu_toadd']['tasklists'] = ['helpdesk' => Menu::class]; 82 | } 83 | 84 | if (class_exists('PluginMydashboardMenu')) { 85 | $PLUGIN_HOOKS['mydashboard']['tasklists'] = [Dashboard::class]; 86 | } 87 | 88 | if (Session::haveRight("plugin_tasklists", CREATE)) { 89 | $PLUGIN_HOOKS['use_massive_action']['tasklists'] = 1; 90 | } 91 | } 92 | } 93 | 94 | // Get the name and the version of the plugin - Needed 95 | /** 96 | * @return array 97 | */ 98 | function plugin_version_tasklists() 99 | { 100 | 101 | return [ 102 | 'name' => __('Tasks list', 'tasklists'), 103 | 'version' => PLUGIN_TASKLISTS_VERSION, 104 | 'license' => 'GPLv2+', 105 | 'author' => "Infotel, Xavier CAILLAUD", 106 | 'homepage' => 'https://github.com/InfotelGLPI/tasklists', 107 | 'requirements' => [ 108 | 'glpi' => [ 109 | 'min' => '11.0', 110 | 'max' => '12.0', 111 | 'dev' => false, 112 | ], 113 | ], 114 | ]; 115 | 116 | } 117 | -------------------------------------------------------------------------------- /ajax/seetask.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use GlpiPlugin\Tasklists\Task; 31 | 32 | Session::checkLoginUser(); 33 | Session::checkRight('plugin_tasklists', UPDATE); 34 | 35 | Html::header_nocache(); 36 | header("Content-Type: text/html; charset=UTF-8"); 37 | 38 | //Html::requireJs('tinymce'); 39 | echo ""; 40 | 41 | if (isset($_GET['id'])) { 42 | $options = [ 43 | 'from_edit_ajax' => true, 44 | 'id' => $_GET['id'], 45 | 'withtemplate' => 0 46 | ]; 47 | echo ""; 50 | echo "
    "; 51 | $task = new Task(); 52 | $task->showForm($_GET['id'],$options); 53 | } else if (isset($_GET['plugin_tasklists_tasktypes_id']) 54 | && isset($_GET['plugin_tasklists_taskstates_id'])) { 55 | $options = [ 56 | 'from_edit_ajax' => true, 57 | 'plugin_tasklists_tasktypes_id' => $_GET['plugin_tasklists_tasktypes_id'], 58 | 'plugin_tasklists_taskstates_id' => $_GET['plugin_tasklists_taskstates_id'], 59 | 'withtemplate' => 0 60 | ]; 61 | $task = new Task(); 62 | if ($id = $task->hasTemplate($options)) { 63 | $options['withtemplate'] = 2; 64 | $task->showForm($id, $options); 65 | } else { 66 | $task->showForm(0, $options); 67 | } 68 | } else if (isset($_GET['clone_id'])) { 69 | $id = $_GET['clone_id']; 70 | $task = new Task(); 71 | if ($task->getFromDB($id)) { 72 | $options = [ 73 | 'from_edit_ajax' => true, 74 | 'plugin_tasklists_tasktypes_id' => $task->fields['plugin_tasklists_tasktypes_id'], 75 | 'plugin_tasklists_taskstates_id' => $task->fields['plugin_tasklists_taskstates_id'], 76 | 'priority' => $task->fields['priority'], 77 | 'users_id' => Session::getLoginUserID(), 78 | 'groups_id' => $task->fields['groups_id'], 79 | 'client' => $task->fields['client'], 80 | 'entities_id' => $task->fields['entities_id'], 81 | 'visibility' => $task->fields['visibility'], 82 | 'withtemplate' => 0 83 | ]; 84 | $taskcloned = new Task(); 85 | $taskcloned->showForm(0, $options); 86 | } 87 | } else if (isset($_GET['task_id'])) { 88 | $id = $_GET['task_id']; 89 | $task = new Task(); 90 | if ($task->getFromDB($id)) { 91 | $options = [ 92 | 'from_edit_ajax' => true, 93 | //'plugin_tasklists_tasktypes_id' => $task->fields['plugin_tasklists_tasktypes_id'], 94 | //'plugin_tasklists_taskstates_id' => $task->fields['plugin_tasklists_taskstates_id'], 95 | //'priority' => $task->fields['priority'], 96 | //'users_id' => Session::getLoginUserID(), 97 | //'groups_id' => $task->fields['groups_id'], 98 | //'client' => $task->fields['client'], 99 | 'entities_id' => $task->fields['entities_id'], 100 | 'name' => $task->fields['name'], 101 | 'content' => $task->fields['comment'], 102 | 'withtemplate' => 0 103 | ]; 104 | $ticket = new Ticket(); 105 | $ticket->showForm(0, $options); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /sql/update-1.4.0.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `glpi_plugin_tasklists_taskstates` 2 | ( 3 | `id` int(11) NOT NULL AUTO_INCREMENT, 4 | `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 5 | `entities_id` int(11) NOT NULL DEFAULT '0', 6 | `is_recursive` tinyint(1) NOT NULL DEFAULT '0', 7 | `is_finished` tinyint(1) NOT NULL DEFAULT '0', 8 | `tasktypes` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 9 | `color` varchar(200) DEFAULT '#CCC' NOT NULL, 10 | `comment` text COLLATE utf8_unicode_ci, 11 | PRIMARY KEY (`id`), 12 | KEY `name` (`name`), 13 | KEY `entities_id` (`entities_id`) 14 | ) ENGINE = InnoDB 15 | DEFAULT CHARSET = utf8 16 | COLLATE = utf8_unicode_ci; 17 | 18 | INSERT INTO `glpi_plugin_tasklists_taskstates` (`id`, `name`, `entities_id`, `is_recursive`, `comment`, `color`, 19 | `tasktypes`) 20 | VALUES (1, 'To do', '0', '1', NULL, '#CCC', NULL); 21 | INSERT INTO `glpi_plugin_tasklists_taskstates` (`id`, `name`, `entities_id`, `is_recursive`, `comment`, `color`, 22 | `tasktypes`) 23 | VALUES (2, 'Done', '0', '1', NULL, '#CCC', NULL); 24 | 25 | ALTER TABLE `glpi_plugin_tasklists_tasks` 26 | CHANGE `state` `plugin_tasklists_taskstates_id` INT(11) NOT NULL DEFAULT '0' COMMENT 'RELATION to glpi_plugin_tasklists_taskstates (id)'; 27 | ALTER TABLE `glpi_plugin_tasklists_tasks` 28 | ADD `is_archived` tinyint(1) NOT NULL default '0'; 29 | ALTER TABLE `glpi_plugin_tasklists_tasks` 30 | ADD `client` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL; 31 | ALTER TABLE `glpi_plugin_tasklists_tasks` 32 | ADD `date_creation` datetime default NULL; 33 | ALTER TABLE `glpi_plugin_tasklists_tasks` 34 | ADD `due_date` date default NULL; 35 | ALTER TABLE `glpi_plugin_tasklists_tasks` 36 | ADD `is_template` smallint(6) NOT NULL default '0'; 37 | ALTER TABLE `glpi_plugin_tasklists_tasks` 38 | ADD `template_name` varchar(200) collate utf8_unicode_ci NOT NULL default ''; 39 | 40 | CREATE TABLE `glpi_plugin_tasklists_stateorders` 41 | ( 42 | `id` int(11) NOT NULL auto_increment, -- id 43 | `plugin_tasklists_taskstates_id` int(11) NOT NULL DEFAULT 0, 44 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL DEFAULT 0, 45 | `ranking` int(11) NULL, 46 | PRIMARY KEY (`id`), 47 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 48 | KEY `plugin_tasklists_taskstates_id` (`plugin_tasklists_taskstates_id`) 49 | ) ENGINE = InnoDB 50 | DEFAULT CHARSET = utf8 51 | COLLATE = utf8_unicode_ci; 52 | 53 | CREATE TABLE `glpi_plugin_tasklists_typevisibilities` 54 | ( 55 | `id` int(11) NOT NULL AUTO_INCREMENT, 56 | `groups_id` int(11) NOT NULL default '0', 57 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL default '0', 58 | PRIMARY KEY (`id`), 59 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 60 | KEY `groups_id` (`groups_id`) 61 | ) ENGINE = InnoDB 62 | DEFAULT CHARSET = utf8 63 | COLLATE = utf8_unicode_ci; 64 | 65 | CREATE TABLE `glpi_plugin_tasklists_preferences` 66 | ( 67 | `id` int(11) NOT NULL COMMENT 'RELATION to glpi_users(id)', 68 | `default_type` int(11) NOT NULL DEFAULT 0, 69 | PRIMARY KEY (`id`) 70 | ) ENGINE = InnoDB 71 | DEFAULT CHARSET = utf8 72 | COLLATE = utf8_unicode_ci; 73 | 74 | CREATE TABLE `glpi_plugin_tasklists_tickets` 75 | ( 76 | `id` int(11) NOT NULL AUTO_INCREMENT, 77 | `tickets_id` int(11) NOT NULL DEFAULT '0', 78 | `plugin_tasklists_tasks_id` int(11) NOT NULL DEFAULT '0', 79 | PRIMARY KEY (`id`), 80 | KEY `plugin_tasklists_tasks_id` (`plugin_tasklists_tasks_id`), 81 | KEY `tickets_id` (`tickets_id`) 82 | ) ENGINE = InnoDB 83 | DEFAULT CHARSET = utf8 84 | COLLATE = utf8_unicode_ci; 85 | 86 | CREATE TABLE `glpi_plugin_tasklists_tasks_comments` 87 | ( 88 | `id` int(11) NOT NULL AUTO_INCREMENT, 89 | `plugin_tasklists_tasks_id` int(11) NOT NULL, 90 | `users_id` int(11) NOT NULL DEFAULT '0', 91 | `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, 92 | `comment` text COLLATE utf8_unicode_ci NOT NULL, 93 | `parent_comment_id` int(11) DEFAULT NULL, 94 | `date_creation` datetime DEFAULT NULL, 95 | `date_mod` datetime DEFAULT NULL, 96 | PRIMARY KEY (`id`) 97 | ) ENGINE = InnoDB 98 | DEFAULT CHARSET = utf8 99 | COLLATE = utf8_unicode_ci; -------------------------------------------------------------------------------- /src/Item_Kanban.php: -------------------------------------------------------------------------------- 1 | . 28 | -------------------------------------------------------------------------- 29 | */ 30 | 31 | namespace GlpiPlugin\Tasklists; 32 | 33 | use CommonDBRelation; 34 | use Session; 35 | 36 | class Item_Kanban extends CommonDBRelation 37 | { 38 | public static $itemtype_1 = 'itemtype'; 39 | public static $items_id_1 = 'items_id'; 40 | public static $itemtype_2 = 'User'; 41 | public static $items_id_2 = 'users_id'; 42 | public static $checkItem_1_Rights = 'plugin_tasklists'; 43 | 44 | 45 | /** 46 | * Load the state of a Kanban's column for a specific kanban for the current user 47 | * 48 | * @param string $itemtype Type of the item. 49 | * @param int $items_id ID of the item. 50 | * @param int $plugin_tasklists_taskstates_id column id 51 | * @param string $timestamp Timestamp string of last check or null to always get the state. 52 | * 53 | * @return return the state of the collummn for the user 54 | * if the state doesn't exist it is created 55 | * @since 9.5.0 56 | */ 57 | public static function loadStateForItem($itemtype, $items_id, $plugin_tasklists_taskstates_id, $timestamp = null) 58 | { 59 | global $DB; 60 | 61 | 62 | $item = new self(); 63 | if ($item->getFromDBByCrit([ 64 | 'users_id' => Session::getLoginUserID(), 65 | 'itemtype' => $itemtype, 66 | 'items_id' => $items_id, 67 | 'plugin_tasklists_taskstates_id' => $plugin_tasklists_taskstates_id, 68 | ])) { 69 | return $item->getField('state'); 70 | 71 | } else { 72 | $input = [ 73 | 'users_id' => Session::getLoginUserID(), 74 | 'itemtype' => $itemtype, 75 | 'items_id' => $items_id, 76 | 'state' => false, 77 | 'plugin_tasklists_taskstates_id' => $plugin_tasklists_taskstates_id, 78 | 'date_creation' => $_SESSION['glpi_currenttime'], 79 | 'date_mod' => $_SESSION['glpi_currenttime'], 80 | ]; 81 | $item->add($input); 82 | return false; 83 | } 84 | } 85 | 86 | 87 | public static function collapseColumn($itemtype, $items_id, $column) 88 | { 89 | $item = new self(); 90 | $item->getFromDBByCrit([ 91 | 'users_id' => Session::getLoginUserID(), 92 | 'itemtype' => $itemtype, 93 | 'items_id' => $items_id, 94 | 'plugin_tasklists_taskstates_id' => $column, 95 | ]); 96 | $input = $item->fields; 97 | $input["state"] = true; 98 | $input["date_mod"] = $_SESSION['glpi_currenttime']; 99 | $item->update($input); 100 | } 101 | 102 | public static function expandColumn($itemtype, $items_id, $column) 103 | { 104 | 105 | $item = new self(); 106 | $item->getFromDBByCrit([ 107 | 'users_id' => Session::getLoginUserID(), 108 | 'itemtype' => $itemtype, 109 | 'items_id' => $items_id, 110 | 'plugin_tasklists_taskstates_id' => $column, 111 | ]); 112 | $input = $item->fields; 113 | $input["state"] = false; 114 | $input["date_mod"] = $_SESSION['glpi_currenttime']; 115 | $item->update($input); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /sql/update-1.4.1.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `glpi_plugin_tasklists_taskstates` 2 | ( 3 | `id` INT(11) NOT NULL AUTO_INCREMENT, 4 | `name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, 5 | `entities_id` INT(11) NOT NULL DEFAULT '0', 6 | `is_recursive` TINYINT(1) NOT NULL DEFAULT '0', 7 | `is_finished` TINYINT(1) NOT NULL DEFAULT '0', 8 | `tasktypes` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, 9 | `color` VARCHAR(200) DEFAULT '#CCC' NOT NULL, 10 | `comment` TEXT COLLATE utf8_unicode_ci, 11 | PRIMARY KEY (`id`), 12 | KEY `name` (`name`), 13 | KEY `entities_id` (`entities_id`) 14 | ) 15 | ENGINE = InnoDB 16 | DEFAULT CHARSET = utf8 17 | COLLATE = utf8_unicode_ci; 18 | 19 | INSERT INTO `glpi_plugin_tasklists_taskstates` (`id`, `name`, `entities_id`, `is_recursive`, `comment`, `color`, 20 | `tasktypes`) 21 | VALUES (1, 'To do', '0', '1', NULL, '#CCC', NULL); 22 | INSERT INTO `glpi_plugin_tasklists_taskstates` (`id`, `name`, `entities_id`, `is_recursive`, `comment`, `color`, 23 | `tasktypes`) 24 | VALUES (2, 'Done', '0', '1', NULL, '#CCC', NULL); 25 | 26 | ALTER TABLE `glpi_plugin_tasklists_tasks` 27 | CHANGE `state` `plugin_tasklists_taskstates_id` INT(11) NOT NULL DEFAULT '0' 28 | COMMENT 'RELATION to glpi_plugin_tasklists_taskstates (id)'; 29 | ALTER TABLE `glpi_plugin_tasklists_tasks` 30 | ADD `is_archived` TINYINT(1) NOT NULL DEFAULT '0'; 31 | ALTER TABLE `glpi_plugin_tasklists_tasks` 32 | ADD `client` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL; 33 | ALTER TABLE `glpi_plugin_tasklists_tasks` 34 | ADD `date_creation` DATETIME DEFAULT NULL; 35 | ALTER TABLE `glpi_plugin_tasklists_tasks` 36 | ADD `is_template` SMALLINT(6) NOT NULL DEFAULT '0'; 37 | ALTER TABLE `glpi_plugin_tasklists_tasks` 38 | ADD `template_name` VARCHAR(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''; 39 | 40 | CREATE TABLE `glpi_plugin_tasklists_stateorders` 41 | ( 42 | `id` INT(11) NOT NULL AUTO_INCREMENT, -- id 43 | `plugin_tasklists_taskstates_id` INT(11) NOT NULL DEFAULT 0, 44 | `plugin_tasklists_tasktypes_id` INT(11) NOT NULL DEFAULT 0, 45 | `ranking` INT(11) NULL, 46 | PRIMARY KEY (`id`), 47 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 48 | KEY `plugin_tasklists_taskstates_id` (`plugin_tasklists_taskstates_id`) 49 | ) 50 | ENGINE = InnoDB 51 | DEFAULT CHARSET = utf8 52 | COLLATE = utf8_unicode_ci; 53 | 54 | CREATE TABLE `glpi_plugin_tasklists_typevisibilities` 55 | ( 56 | `id` INT(11) NOT NULL AUTO_INCREMENT, 57 | `groups_id` INT(11) NOT NULL DEFAULT '0', 58 | `plugin_tasklists_tasktypes_id` INT(11) NOT NULL DEFAULT '0', 59 | PRIMARY KEY (`id`), 60 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 61 | KEY `groups_id` (`groups_id`) 62 | ) 63 | ENGINE = InnoDB 64 | DEFAULT CHARSET = utf8 65 | COLLATE = utf8_unicode_ci; 66 | 67 | CREATE TABLE `glpi_plugin_tasklists_preferences` 68 | ( 69 | `id` INT(11) NOT NULL 70 | COMMENT 'RELATION to glpi_users(id)', 71 | `default_type` INT(11) NOT NULL DEFAULT 0, 72 | PRIMARY KEY (`id`) 73 | ) 74 | ENGINE = InnoDB 75 | DEFAULT CHARSET = utf8 76 | COLLATE = utf8_unicode_ci; 77 | 78 | CREATE TABLE `glpi_plugin_tasklists_tickets` 79 | ( 80 | `id` INT(11) NOT NULL AUTO_INCREMENT, 81 | `tickets_id` INT(11) NOT NULL DEFAULT '0', 82 | `plugin_tasklists_tasks_id` INT(11) NOT NULL DEFAULT '0', 83 | PRIMARY KEY (`id`), 84 | KEY `plugin_tasklists_tasks_id` (`plugin_tasklists_tasks_id`), 85 | KEY `tickets_id` (`tickets_id`) 86 | ) 87 | ENGINE = InnoDB 88 | DEFAULT CHARSET = utf8 89 | COLLATE = utf8_unicode_ci; 90 | 91 | CREATE TABLE `glpi_plugin_tasklists_tasks_comments` 92 | ( 93 | `id` INT(11) NOT NULL AUTO_INCREMENT, 94 | `plugin_tasklists_tasks_id` INT(11) NOT NULL, 95 | `users_id` INT(11) NOT NULL DEFAULT '0', 96 | `language` VARCHAR(5) COLLATE utf8_unicode_ci DEFAULT NULL, 97 | `comment` TEXT COLLATE utf8_unicode_ci NOT NULL, 98 | `parent_comment_id` INT(11) DEFAULT NULL, 99 | `date_creation` DATETIME DEFAULT NULL, 100 | `date_mod` DATETIME DEFAULT NULL, 101 | PRIMARY KEY (`id`) 102 | ) 103 | ENGINE = InnoDB 104 | DEFAULT CHARSET = utf8 105 | COLLATE = utf8_unicode_ci; -------------------------------------------------------------------------------- /ajax/addOptions.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | use Glpi\Exception\Http\BadRequestHttpException; 31 | use GlpiPlugin\Tasklists\TaskType; 32 | 33 | header("Content-Type: text/html; charset=UTF-8"); 34 | Html::header_nocache(); 35 | 36 | Session::checkLoginUser(); 37 | Session::checkRight('plugin_tasklists', UPDATE); 38 | if ($_SERVER['REQUEST_METHOD'] !== 'GET') { 39 | // Get AJAX input and load it into $_REQUEST 40 | $input = file_get_contents('php://input'); 41 | parse_str($input, $_REQUEST); 42 | } 43 | 44 | if (!isset($_REQUEST['action'])) { 45 | throw new BadRequestHttpException("Missing action parameter"); 46 | } 47 | $action = $_REQUEST['action']; 48 | 49 | 50 | if ($_REQUEST['action'] == 'addArchived') { 51 | 52 | header("Content-Type: application/json; charset=UTF-8", true); 53 | $states = []; 54 | $states[0] = __("Not archived", 'tasklists'); 55 | $states[1] = __("Archived", 'tasklists'); 56 | 57 | if (!isset($_SESSION["archive"][Session::getLoginUserID()])) { 58 | $_SESSION["archive"][Session::getLoginUserID()] = json_encode([0]); 59 | } 60 | if ($_SESSION["archive"][Session::getLoginUserID()] != "" && $_SESSION["archive"][Session::getLoginUserID()] != "null") { 61 | $arch = Dropdown::showFromArray("archive", $states, 62 | ['id' => 'archive', 63 | 'multiple' => true, 64 | 'values' => json_decode($_SESSION["archive"][Session::getLoginUserID()], true), 65 | "display" => false]); 66 | } else { 67 | $arch = Dropdown::showFromArray("archive", $states, ['id' => 'archive', 68 | 'multiple' => true, 69 | 'value' => 0, 70 | "display" => false]); 71 | 72 | } 73 | 74 | echo json_encode($arch, JSON_FORCE_OBJECT); 75 | 76 | } else if ($_REQUEST['action'] == 'changeArchive') { 77 | if (!empty($_REQUEST['vals'])) 78 | $_SESSION["archive"][Session::getLoginUserID()] = json_encode($_REQUEST['vals']); 79 | 80 | } 81 | if ($_REQUEST['action'] == 'addUsers') { 82 | 83 | header("Content-Type: application/json; charset=UTF-8", true); 84 | $users = TaskType::findUsers($_REQUEST['context']); 85 | 86 | if (!isset($_SESSION["usersKanban"][Session::getLoginUserID()])) { 87 | $_SESSION["usersKanban"][Session::getLoginUserID()] = json_encode([-1]); 88 | } 89 | if ($_SESSION["usersKanban"][Session::getLoginUserID()] != "" && isset($_SESSION["archive"]) && $_SESSION["archive"][Session::getLoginUserID()] != "null") { 90 | $arch = Dropdown::showFromArray("usersKanban", $users, ['id' => 'users', 91 | 'multiple' => true, 92 | 'values' => json_decode($_SESSION["usersKanban"][Session::getLoginUserID()], true), 93 | "display" => false]); 94 | } else { 95 | $arch = Dropdown::showFromArray("usersKanban", $users, ['id' => 'users', 96 | 'multiple' => true, 97 | 'value' => -1, 98 | "display" => false]); 99 | } 100 | 101 | echo json_encode($arch, JSON_FORCE_OBJECT); 102 | 103 | } else if ($_REQUEST['action'] == 'changeUsers') { 104 | if (!empty($_REQUEST['vals'])) 105 | $_SESSION["usersKanban"][Session::getLoginUserID()] = json_encode($_REQUEST['vals']); 106 | 107 | } 108 | -------------------------------------------------------------------------------- /locales/ja_JP.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # INOUE Daisuke, 2024 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2024-12-30 13:49+0000\n" 15 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 16 | "Last-Translator: INOUE Daisuke, 2024\n" 17 | "Language-Team: Japanese (Japan) (https://app.transifex.com/infotelGLPI/teams/79675/ja_JP/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: ja_JP\n" 22 | "Plural-Forms: nplurals=1; plural=0;\n" 23 | 24 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "タスクリスト" 29 | 30 | #: ajax/addOptions.php:30 31 | msgid "Not archived" 32 | msgstr "未保管" 33 | 34 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 35 | msgid "Archived" 36 | msgstr "保管済み" 37 | 38 | #: inc/dashboard.class.php:59 39 | msgid "Tables" 40 | msgstr "テーブル" 41 | 42 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 43 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 44 | #: inc/tasktype.class.php:52 45 | msgid "Context" 46 | msgid_plural "Contexts" 47 | msgstr[0] "コンテキスト" 48 | 49 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 50 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 51 | #: inc/task.class.php:568 inc/tasktype.class.php:229 52 | msgid "Due date" 53 | msgstr "期限" 54 | 55 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 56 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 57 | msgid "Add task" 58 | msgstr "タスクの追加" 59 | 60 | #: inc/kanban.class.php:76 61 | msgid "Kanban" 62 | msgstr "カンバン" 63 | 64 | #: inc/kanban.class.php:148 65 | msgid "You don't have the right to see any context" 66 | msgstr "コンテキストを表示する権限がありません" 67 | 68 | #: inc/kanban.class.php:185 69 | msgid "There is no accessible context" 70 | msgstr "開くことができるコンテキストがありません" 71 | 72 | #: inc/notificationtargettask.class.php:51 73 | msgid "A task has been added" 74 | msgstr "タスクを追加しました" 75 | 76 | #: inc/notificationtargettask.class.php:52 77 | msgid "A task has been updated" 78 | msgstr "タスクを更新しました" 79 | 80 | #: inc/notificationtargettask.class.php:53 81 | msgid "A task has been removed" 82 | msgstr "タスクを削除しました" 83 | 84 | #: inc/notificationtargettask.class.php:217 85 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 86 | #: inc/task.class.php:559 87 | msgid "Other client" 88 | msgstr "その他のクライアント" 89 | 90 | #: inc/notificationtargettask.class.php:271 91 | msgid "At creation, update, removal of a task" 92 | msgstr "タスクの作成、更新、削除時" 93 | 94 | #: inc/preference.class.php:88 95 | msgid "Context by default" 96 | msgstr "デフォルトのコンテキスト" 97 | 98 | #: inc/preference.class.php:96 99 | msgid "Automatic refreshing of tasklist" 100 | msgstr "タスクリストの自動画面更新" 101 | 102 | #: inc/preference.class.php:102 103 | msgid "Refresh every " 104 | msgstr "更新間隔" 105 | 106 | #: inc/preference.class.php:106 107 | msgid "minute(s)" 108 | msgstr "分" 109 | 110 | #: inc/profile.class.php:164 inc/profile.class.php:208 111 | msgid "See and update all tasks" 112 | msgstr "すべてのタスクを表示・更新" 113 | 114 | #: inc/profile.class.php:173 inc/profile.class.php:211 115 | msgid "Configure contexts and statuses" 116 | msgstr "コンテキストと状態の設定" 117 | 118 | #: inc/task.class.php:254 119 | msgctxt "quantity" 120 | msgid "Number of comments" 121 | msgstr "コメント数" 122 | 123 | #: inc/task.class.php:392 124 | msgid "You cannot archive a task with this state" 125 | msgstr "この状態のタスクを保管できません" 126 | 127 | #: inc/task.class.php:522 128 | msgid "Existing client" 129 | msgstr "既存のクライアント" 130 | 131 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 132 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 133 | msgid "Backlog" 134 | msgstr "バックログ" 135 | 136 | #: inc/task.class.php:1143 137 | msgctxt "visibility" 138 | msgid "This user" 139 | msgstr "このユーザー" 140 | 141 | #: inc/task.class.php:1146 142 | msgctxt "visibility" 143 | msgid "This user and this group" 144 | msgstr "このユーザーとグループ" 145 | 146 | #: inc/task.class.php:1149 147 | msgctxt "visibility" 148 | msgid "All" 149 | msgstr "すべて" 150 | 151 | #: inc/task.class.php:1192 152 | msgid "Affect entity for create task" 153 | msgstr "タスクを作成してエンティティ―に影響を与える" 154 | 155 | #: inc/taskstate.class.php:84 156 | msgid "Status" 157 | msgid_plural "Statuses" 158 | msgstr[0] "状態" 159 | 160 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 161 | msgid "Linked task" 162 | msgid_plural "Linked tasks" 163 | msgstr[0] "リンクしたタスク" 164 | 165 | #: inc/ticket.class.php:228 166 | msgid "No task linked to this ticket yet" 167 | msgstr "このチケットにリンクしているタスクはありません" 168 | 169 | #: inc/ticket.class.php:259 170 | msgid "Link a existant ticket" 171 | msgstr "既存のチケットにリンクする" 172 | 173 | #: inc/ticket.class.php:285 174 | msgid "Linked tickets" 175 | msgstr "リンクしているチケット" 176 | 177 | #: inc/typevisibility.class.php:138 178 | msgid "Add a group" 179 | msgstr "グループを追加" 180 | 181 | #: inc/typevisibility.class.php:179 182 | msgid "Groups allowed to use context" 183 | msgstr "コンテキストの利用を許可しているグループ" 184 | -------------------------------------------------------------------------------- /locales/es_VE.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Francisco Bolivar, 2024 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2024-12-30 13:49+0000\n" 15 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 16 | "Last-Translator: Francisco Bolivar, 2024\n" 17 | "Language-Team: Spanish (Venezuela) (https://app.transifex.com/infotelGLPI/teams/79675/es_VE/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: es_VE\n" 22 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 23 | 24 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Lista de tareas" 29 | 30 | #: ajax/addOptions.php:30 31 | msgid "Not archived" 32 | msgstr "No archivado" 33 | 34 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 35 | msgid "Archived" 36 | msgstr "Archivado" 37 | 38 | #: inc/dashboard.class.php:59 39 | msgid "Tables" 40 | msgstr "Tablas" 41 | 42 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 43 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 44 | #: inc/tasktype.class.php:52 45 | msgid "Context" 46 | msgid_plural "Contexts" 47 | msgstr[0] "Contexto" 48 | msgstr[1] "De contextos" 49 | msgstr[2] "Contextos" 50 | 51 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 52 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 53 | #: inc/task.class.php:568 inc/tasktype.class.php:229 54 | msgid "Due date" 55 | msgstr "Fecha de vencimiento" 56 | 57 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 58 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 59 | msgid "Add task" 60 | msgstr "Añadir tarea" 61 | 62 | #: inc/kanban.class.php:76 63 | msgid "Kanban" 64 | msgstr "Kanban" 65 | 66 | #: inc/kanban.class.php:148 67 | msgid "You don't have the right to see any context" 68 | msgstr "No tienes permisos para ver ningún contexto" 69 | 70 | #: inc/kanban.class.php:185 71 | msgid "There is no accessible context" 72 | msgstr "No hay un contexto accesible" 73 | 74 | #: inc/notificationtargettask.class.php:51 75 | msgid "A task has been added" 76 | msgstr "Se ha añadido una tarea" 77 | 78 | #: inc/notificationtargettask.class.php:52 79 | msgid "A task has been updated" 80 | msgstr "Se ha actualizado una tarea" 81 | 82 | #: inc/notificationtargettask.class.php:53 83 | msgid "A task has been removed" 84 | msgstr "Se ha eliminado una tarea" 85 | 86 | #: inc/notificationtargettask.class.php:217 87 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 88 | #: inc/task.class.php:559 89 | msgid "Other client" 90 | msgstr "Otro cliente" 91 | 92 | #: inc/notificationtargettask.class.php:271 93 | msgid "At creation, update, removal of a task" 94 | msgstr "En la creación, actualización, eliminación de una tarea" 95 | 96 | #: inc/preference.class.php:88 97 | msgid "Context by default" 98 | msgstr "Contexto por defecto" 99 | 100 | #: inc/preference.class.php:96 101 | msgid "Automatic refreshing of tasklist" 102 | msgstr "Actualización automática de la lista de tareas" 103 | 104 | #: inc/preference.class.php:102 105 | msgid "Refresh every " 106 | msgstr "Actualizar cada " 107 | 108 | #: inc/preference.class.php:106 109 | msgid "minute(s)" 110 | msgstr "minuto(s)" 111 | 112 | #: inc/profile.class.php:164 inc/profile.class.php:208 113 | msgid "See and update all tasks" 114 | msgstr "Ver y actualizar todas las tareas" 115 | 116 | #: inc/profile.class.php:173 inc/profile.class.php:211 117 | msgid "Configure contexts and statuses" 118 | msgstr "Configurar contextos y estados" 119 | 120 | #: inc/task.class.php:254 121 | msgctxt "quantity" 122 | msgid "Number of comments" 123 | msgstr "Número de comentarios" 124 | 125 | #: inc/task.class.php:392 126 | msgid "You cannot archive a task with this state" 127 | msgstr "No puede archivar una tarea con este estado" 128 | 129 | #: inc/task.class.php:522 130 | msgid "Existing client" 131 | msgstr "Cliente existente" 132 | 133 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 134 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 135 | msgid "Backlog" 136 | msgstr "Atrasos" 137 | 138 | #: inc/task.class.php:1143 139 | msgctxt "visibility" 140 | msgid "This user" 141 | msgstr "Este usuario" 142 | 143 | #: inc/task.class.php:1146 144 | msgctxt "visibility" 145 | msgid "This user and this group" 146 | msgstr "Este usuario y este grupo" 147 | 148 | #: inc/task.class.php:1149 149 | msgctxt "visibility" 150 | msgid "All" 151 | msgstr "Todos" 152 | 153 | #: inc/task.class.php:1192 154 | msgid "Affect entity for create task" 155 | msgstr "Afectar entidad para crear tarea" 156 | 157 | #: inc/taskstate.class.php:84 158 | msgid "Status" 159 | msgid_plural "Statuses" 160 | msgstr[0] "Estado" 161 | msgstr[1] "De estados" 162 | msgstr[2] "Estados" 163 | 164 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 165 | msgid "Linked task" 166 | msgid_plural "Linked tasks" 167 | msgstr[0] "Tarea vinculada" 168 | msgstr[1] "De tareas vinculadas" 169 | msgstr[2] "Tareas vinculadas" 170 | 171 | #: inc/ticket.class.php:228 172 | msgid "No task linked to this ticket yet" 173 | msgstr "Aún no hay ninguna tarea vinculada a este caso" 174 | 175 | #: inc/ticket.class.php:259 176 | msgid "Link a existant ticket" 177 | msgstr "Vincular un caso existente" 178 | 179 | #: inc/ticket.class.php:285 180 | msgid "Linked tickets" 181 | msgstr "Casos vinculados" 182 | 183 | #: inc/typevisibility.class.php:138 184 | msgid "Add a group" 185 | msgstr "Agregar un grupo" 186 | 187 | #: inc/typevisibility.class.php:179 188 | msgid "Groups allowed to use context" 189 | msgstr "Grupos autorizados a usar contexto" 190 | -------------------------------------------------------------------------------- /locales/es_MX.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Carlos Moreno Rodríguez , 2023 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2024-12-30 13:49+0000\n" 15 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 16 | "Last-Translator: Carlos Moreno Rodríguez , 2023\n" 17 | "Language-Team: Spanish (Mexico) (https://app.transifex.com/infotelGLPI/teams/79675/es_MX/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: es_MX\n" 22 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 23 | 24 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Lista de tareas" 29 | 30 | #: ajax/addOptions.php:30 31 | msgid "Not archived" 32 | msgstr "No archivado" 33 | 34 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 35 | msgid "Archived" 36 | msgstr "Archivado" 37 | 38 | #: inc/dashboard.class.php:59 39 | msgid "Tables" 40 | msgstr "Tablas" 41 | 42 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 43 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 44 | #: inc/tasktype.class.php:52 45 | msgid "Context" 46 | msgid_plural "Contexts" 47 | msgstr[0] "Contexto" 48 | msgstr[1] "Contextos" 49 | msgstr[2] "Contextos" 50 | 51 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 52 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 53 | #: inc/task.class.php:568 inc/tasktype.class.php:229 54 | msgid "Due date" 55 | msgstr "Fecha de vencimiento" 56 | 57 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 58 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 59 | msgid "Add task" 60 | msgstr "Agregar tarea" 61 | 62 | #: inc/kanban.class.php:76 63 | msgid "Kanban" 64 | msgstr "Kanban" 65 | 66 | #: inc/kanban.class.php:148 67 | msgid "You don't have the right to see any context" 68 | msgstr "Sin derecho a visualizar ningún contexto" 69 | 70 | #: inc/kanban.class.php:185 71 | msgid "There is no accessible context" 72 | msgstr "No hay un contexto accesible" 73 | 74 | #: inc/notificationtargettask.class.php:51 75 | msgid "A task has been added" 76 | msgstr "Tarea agregada" 77 | 78 | #: inc/notificationtargettask.class.php:52 79 | msgid "A task has been updated" 80 | msgstr "Tarea actualizada" 81 | 82 | #: inc/notificationtargettask.class.php:53 83 | msgid "A task has been removed" 84 | msgstr "Tarea eliminada" 85 | 86 | #: inc/notificationtargettask.class.php:217 87 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 88 | #: inc/task.class.php:559 89 | msgid "Other client" 90 | msgstr "Otro cliente" 91 | 92 | #: inc/notificationtargettask.class.php:271 93 | msgid "At creation, update, removal of a task" 94 | msgstr "Creación, actualización y borrado de una tarea" 95 | 96 | #: inc/preference.class.php:88 97 | msgid "Context by default" 98 | msgstr "Contexto predefinido" 99 | 100 | #: inc/preference.class.php:96 101 | msgid "Automatic refreshing of tasklist" 102 | msgstr "Actualización automática de la lista de tareas" 103 | 104 | #: inc/preference.class.php:102 105 | msgid "Refresh every " 106 | msgstr "Actualizar cada " 107 | 108 | #: inc/preference.class.php:106 109 | msgid "minute(s)" 110 | msgstr "minuto(s)" 111 | 112 | #: inc/profile.class.php:164 inc/profile.class.php:208 113 | msgid "See and update all tasks" 114 | msgstr "Ver y actualizar todas las tareas" 115 | 116 | #: inc/profile.class.php:173 inc/profile.class.php:211 117 | msgid "Configure contexts and statuses" 118 | msgstr "Configurar contextos y estados" 119 | 120 | #: inc/task.class.php:254 121 | msgctxt "quantity" 122 | msgid "Number of comments" 123 | msgstr "Número de comentarios" 124 | 125 | #: inc/task.class.php:392 126 | msgid "You cannot archive a task with this state" 127 | msgstr "No puedes archivar una tarea con este estado" 128 | 129 | #: inc/task.class.php:522 130 | msgid "Existing client" 131 | msgstr "Cliente existente" 132 | 133 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 134 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 135 | msgid "Backlog" 136 | msgstr "Reserva" 137 | 138 | #: inc/task.class.php:1143 139 | msgctxt "visibility" 140 | msgid "This user" 141 | msgstr "Este usuario" 142 | 143 | #: inc/task.class.php:1146 144 | msgctxt "visibility" 145 | msgid "This user and this group" 146 | msgstr "Este usuario y su grupo" 147 | 148 | #: inc/task.class.php:1149 149 | msgctxt "visibility" 150 | msgid "All" 151 | msgstr "Todas" 152 | 153 | #: inc/task.class.php:1192 154 | msgid "Affect entity for create task" 155 | msgstr "Afectar entidad para crear tarea" 156 | 157 | #: inc/taskstate.class.php:84 158 | msgid "Status" 159 | msgid_plural "Statuses" 160 | msgstr[0] "Estado" 161 | msgstr[1] "Estados" 162 | msgstr[2] "Estados" 163 | 164 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 165 | msgid "Linked task" 166 | msgid_plural "Linked tasks" 167 | msgstr[0] "Tarea vinculada" 168 | msgstr[1] "Tareas vinculadas" 169 | msgstr[2] "Tareas vinculadas" 170 | 171 | #: inc/ticket.class.php:228 172 | msgid "No task linked to this ticket yet" 173 | msgstr "Aún no hay ninguna tarea vinculada a este ticket" 174 | 175 | #: inc/ticket.class.php:259 176 | msgid "Link a existant ticket" 177 | msgstr "Vincular un ticket existente" 178 | 179 | #: inc/ticket.class.php:285 180 | msgid "Linked tickets" 181 | msgstr "Tickets vinculados" 182 | 183 | #: inc/typevisibility.class.php:138 184 | msgid "Add a group" 185 | msgstr "Agregar un grupo" 186 | 187 | #: inc/typevisibility.class.php:179 188 | msgid "Groups allowed to use context" 189 | msgstr "Grupos permitidos para usar contexto" 190 | -------------------------------------------------------------------------------- /locales/es_EC.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Soporte Infraestructura Standby, 2023 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2024-12-30 13:49+0000\n" 15 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 16 | "Last-Translator: Soporte Infraestructura Standby, 2023\n" 17 | "Language-Team: Spanish (Ecuador) (https://app.transifex.com/infotelGLPI/teams/79675/es_EC/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: es_EC\n" 22 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 23 | 24 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Lista de tareas" 29 | 30 | #: ajax/addOptions.php:30 31 | msgid "Not archived" 32 | msgstr "Sin archivar" 33 | 34 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 35 | msgid "Archived" 36 | msgstr "Archivado" 37 | 38 | #: inc/dashboard.class.php:59 39 | msgid "Tables" 40 | msgstr "Tablas" 41 | 42 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 43 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 44 | #: inc/tasktype.class.php:52 45 | msgid "Context" 46 | msgid_plural "Contexts" 47 | msgstr[0] "Contextos" 48 | msgstr[1] "Contextos" 49 | msgstr[2] "Contextos" 50 | 51 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 52 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 53 | #: inc/task.class.php:568 inc/tasktype.class.php:229 54 | msgid "Due date" 55 | msgstr "Fecha de vencimiento" 56 | 57 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 58 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 59 | msgid "Add task" 60 | msgstr "Agregar tarea" 61 | 62 | #: inc/kanban.class.php:76 63 | msgid "Kanban" 64 | msgstr "Kanban" 65 | 66 | #: inc/kanban.class.php:148 67 | msgid "You don't have the right to see any context" 68 | msgstr "No tienes derecho a ver ningún contexto" 69 | 70 | #: inc/kanban.class.php:185 71 | msgid "There is no accessible context" 72 | msgstr "No existe un contexto accesible" 73 | 74 | #: inc/notificationtargettask.class.php:51 75 | msgid "A task has been added" 76 | msgstr "Se ha agregado una tarea" 77 | 78 | #: inc/notificationtargettask.class.php:52 79 | msgid "A task has been updated" 80 | msgstr "Una tarea se ha actualizado" 81 | 82 | #: inc/notificationtargettask.class.php:53 83 | msgid "A task has been removed" 84 | msgstr "Una tarea ha sido eliminada" 85 | 86 | #: inc/notificationtargettask.class.php:217 87 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 88 | #: inc/task.class.php:559 89 | msgid "Other client" 90 | msgstr "Otro cliente" 91 | 92 | #: inc/notificationtargettask.class.php:271 93 | msgid "At creation, update, removal of a task" 94 | msgstr "En la creación, actualización, eliminación de una tarea" 95 | 96 | #: inc/preference.class.php:88 97 | msgid "Context by default" 98 | msgstr "Contexto predeterminado" 99 | 100 | #: inc/preference.class.php:96 101 | msgid "Automatic refreshing of tasklist" 102 | msgstr "Actualizar automáticamente la lista de tareas" 103 | 104 | #: inc/preference.class.php:102 105 | msgid "Refresh every " 106 | msgstr "Actualizar cada" 107 | 108 | #: inc/preference.class.php:106 109 | msgid "minute(s)" 110 | msgstr "minuto(s)" 111 | 112 | #: inc/profile.class.php:164 inc/profile.class.php:208 113 | msgid "See and update all tasks" 114 | msgstr "Ver y actualizar todas las tareas" 115 | 116 | #: inc/profile.class.php:173 inc/profile.class.php:211 117 | msgid "Configure contexts and statuses" 118 | msgstr "Configurar contextos y estados" 119 | 120 | #: inc/task.class.php:254 121 | msgctxt "quantity" 122 | msgid "Number of comments" 123 | msgstr "Número de comentarios" 124 | 125 | #: inc/task.class.php:392 126 | msgid "You cannot archive a task with this state" 127 | msgstr "No se puede archivar una tarea con este estado" 128 | 129 | #: inc/task.class.php:522 130 | msgid "Existing client" 131 | msgstr "Cliente existente" 132 | 133 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 134 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 135 | msgid "Backlog" 136 | msgstr "Atrasos" 137 | 138 | #: inc/task.class.php:1143 139 | msgctxt "visibility" 140 | msgid "This user" 141 | msgstr "Este usuario" 142 | 143 | #: inc/task.class.php:1146 144 | msgctxt "visibility" 145 | msgid "This user and this group" 146 | msgstr "Este usuario y este grupo" 147 | 148 | #: inc/task.class.php:1149 149 | msgctxt "visibility" 150 | msgid "All" 151 | msgstr "Todos" 152 | 153 | #: inc/task.class.php:1192 154 | msgid "Affect entity for create task" 155 | msgstr "Entidad afectada para crear tarea" 156 | 157 | #: inc/taskstate.class.php:84 158 | msgid "Status" 159 | msgid_plural "Statuses" 160 | msgstr[0] "Estados" 161 | msgstr[1] "Estados" 162 | msgstr[2] "Estados" 163 | 164 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 165 | msgid "Linked task" 166 | msgid_plural "Linked tasks" 167 | msgstr[0] "Tareas vinculadas" 168 | msgstr[1] "Tareas vinculadas" 169 | msgstr[2] "Tareas vinculadas" 170 | 171 | #: inc/ticket.class.php:228 172 | msgid "No task linked to this ticket yet" 173 | msgstr "Todavía no hay ninguna tarea vinculada a este ticket" 174 | 175 | #: inc/ticket.class.php:259 176 | msgid "Link a existant ticket" 177 | msgstr "Vincular un ticket existente" 178 | 179 | #: inc/ticket.class.php:285 180 | msgid "Linked tickets" 181 | msgstr "Tickets vinculados" 182 | 183 | #: inc/typevisibility.class.php:138 184 | msgid "Add a group" 185 | msgstr "Agregar un grupo" 186 | 187 | #: inc/typevisibility.class.php:179 188 | msgid "Groups allowed to use context" 189 | msgstr "Grupos autorizados a utilizar el contexto" 190 | -------------------------------------------------------------------------------- /locales/es_ES.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Xavier CAILLAUD , 2020 8 | # FranciscoFJ , 2022 9 | # 10 | #, fuzzy 11 | msgid "" 12 | msgstr "" 13 | "Project-Id-Version: GLPI - Tasklists plugin\n" 14 | "Report-Msgid-Bugs-To: \n" 15 | "POT-Creation-Date: 2024-12-30 13:49+0000\n" 16 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 17 | "Last-Translator: FranciscoFJ , 2022\n" 18 | "Language-Team: Spanish (Spain) (https://app.transifex.com/infotelGLPI/teams/79675/es_ES/)\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Language: es_ES\n" 23 | "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 24 | 25 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 26 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 27 | #: inc/preference.class.php:46 inc/profile.class.php:52 28 | msgid "Tasks list" 29 | msgstr "Lista de tareas" 30 | 31 | #: ajax/addOptions.php:30 32 | msgid "Not archived" 33 | msgstr "No archivado" 34 | 35 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 36 | msgid "Archived" 37 | msgstr "Archivado" 38 | 39 | #: inc/dashboard.class.php:59 40 | msgid "Tables" 41 | msgstr "Tableros" 42 | 43 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 44 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 45 | #: inc/tasktype.class.php:52 46 | msgid "Context" 47 | msgid_plural "Contexts" 48 | msgstr[0] "Contexto" 49 | msgstr[1] "Contextos" 50 | msgstr[2] "Contextos" 51 | 52 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 53 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 54 | #: inc/task.class.php:568 inc/tasktype.class.php:229 55 | msgid "Due date" 56 | msgstr "Fecha de vencimiento" 57 | 58 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 59 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 60 | msgid "Add task" 61 | msgstr "Agregar tarea" 62 | 63 | #: inc/kanban.class.php:76 64 | msgid "Kanban" 65 | msgstr "Kanban" 66 | 67 | #: inc/kanban.class.php:148 68 | msgid "You don't have the right to see any context" 69 | msgstr "Usted no tiene privilegios para ver ningún contexto " 70 | 71 | #: inc/kanban.class.php:185 72 | msgid "There is no accessible context" 73 | msgstr "No hay contexto accesible" 74 | 75 | #: inc/notificationtargettask.class.php:51 76 | msgid "A task has been added" 77 | msgstr "Se ha añadido una tarea." 78 | 79 | #: inc/notificationtargettask.class.php:52 80 | msgid "A task has been updated" 81 | msgstr "Se ha actualizado una tarea" 82 | 83 | #: inc/notificationtargettask.class.php:53 84 | msgid "A task has been removed" 85 | msgstr "Se ha borrado una tarea" 86 | 87 | #: inc/notificationtargettask.class.php:217 88 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 89 | #: inc/task.class.php:559 90 | msgid "Other client" 91 | msgstr "Otro cliente" 92 | 93 | #: inc/notificationtargettask.class.php:271 94 | msgid "At creation, update, removal of a task" 95 | msgstr "En la creación, actualización, eliminación de una tarea" 96 | 97 | #: inc/preference.class.php:88 98 | msgid "Context by default" 99 | msgstr "Contexto predefinido" 100 | 101 | #: inc/preference.class.php:96 102 | msgid "Automatic refreshing of tasklist" 103 | msgstr "Actualización automática de la lista de tareas" 104 | 105 | #: inc/preference.class.php:102 106 | msgid "Refresh every " 107 | msgstr "Actualizar cada" 108 | 109 | #: inc/preference.class.php:106 110 | msgid "minute(s)" 111 | msgstr "minuto(s)" 112 | 113 | #: inc/profile.class.php:164 inc/profile.class.php:208 114 | msgid "See and update all tasks" 115 | msgstr "Ver y actualizar todas las tareas" 116 | 117 | #: inc/profile.class.php:173 inc/profile.class.php:211 118 | msgid "Configure contexts and statuses" 119 | msgstr "Configurar contextos y estados" 120 | 121 | #: inc/task.class.php:254 122 | msgctxt "quantity" 123 | msgid "Number of comments" 124 | msgstr "Número de comentarios" 125 | 126 | #: inc/task.class.php:392 127 | msgid "You cannot archive a task with this state" 128 | msgstr "No puedes archivar una tarea con este estado" 129 | 130 | #: inc/task.class.php:522 131 | msgid "Existing client" 132 | msgstr "Cliente existente" 133 | 134 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 135 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 136 | msgid "Backlog" 137 | msgstr "Reserva" 138 | 139 | #: inc/task.class.php:1143 140 | msgctxt "visibility" 141 | msgid "This user" 142 | msgstr "Este usuario" 143 | 144 | #: inc/task.class.php:1146 145 | msgctxt "visibility" 146 | msgid "This user and this group" 147 | msgstr "Este usuario y este grupo" 148 | 149 | #: inc/task.class.php:1149 150 | msgctxt "visibility" 151 | msgid "All" 152 | msgstr "Todos" 153 | 154 | #: inc/task.class.php:1192 155 | msgid "Affect entity for create task" 156 | msgstr "Afecta a la entidad para crear la tarea" 157 | 158 | #: inc/taskstate.class.php:84 159 | msgid "Status" 160 | msgid_plural "Statuses" 161 | msgstr[0] "Estado" 162 | msgstr[1] "Estados" 163 | msgstr[2] "Estados" 164 | 165 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 166 | msgid "Linked task" 167 | msgid_plural "Linked tasks" 168 | msgstr[0] "Tarea vinculada" 169 | msgstr[1] "Tareas vinculadas" 170 | msgstr[2] "Tareas vinculadas" 171 | 172 | #: inc/ticket.class.php:228 173 | msgid "No task linked to this ticket yet" 174 | msgstr "Aún no hay ninguna tarea vinculada a esta petición" 175 | 176 | #: inc/ticket.class.php:259 177 | msgid "Link a existant ticket" 178 | msgstr "Vincula una petición existente" 179 | 180 | #: inc/ticket.class.php:285 181 | msgid "Linked tickets" 182 | msgstr "Peticiones vinculadas" 183 | 184 | #: inc/typevisibility.class.php:138 185 | msgid "Add a group" 186 | msgstr "Agregar un grupo" 187 | 188 | #: inc/typevisibility.class.php:179 189 | msgid "Groups allowed to use context" 190 | msgstr "Grupos permitidos para usar el contexto" 191 | -------------------------------------------------------------------------------- /locales/pt_BR.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Paulo Henrique , 2021 8 | # Luis José Machado Sousa , 2021 9 | # Rafael Gomes , 2022 10 | # Eduardo Mozart de Oliveira , 2025 11 | # 12 | #, fuzzy 13 | msgid "" 14 | msgstr "" 15 | "Project-Id-Version: GLPI - Tasklists plugin\n" 16 | "Report-Msgid-Bugs-To: \n" 17 | "POT-Creation-Date: 2024-12-30 13:55+0000\n" 18 | "PO-Revision-Date: 2020-11-02 16:28+0000\n" 19 | "Last-Translator: Eduardo Mozart de Oliveira , 2025\n" 20 | "Language-Team: Portuguese (Brazil) (https://app.transifex.com/infotelGLPI/teams/79675/pt_BR/)\n" 21 | "MIME-Version: 1.0\n" 22 | "Content-Type: text/plain; charset=UTF-8\n" 23 | "Content-Transfer-Encoding: 8bit\n" 24 | "Language: pt_BR\n" 25 | "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" 26 | 27 | #: setup.php:87 inc/dashboard.class.php:60 inc/dashboard.class.php:178 28 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 29 | #: inc/preference.class.php:46 inc/profile.class.php:52 30 | msgid "Tasks list" 31 | msgstr "Lista de tarefas" 32 | 33 | #: ajax/addOptions.php:30 34 | msgid "Not archived" 35 | msgstr "Não arquivado" 36 | 37 | #: ajax/addOptions.php:31 inc/task.class.php:197 inc/task.class.php:686 38 | msgid "Archived" 39 | msgstr "Arquivado" 40 | 41 | #: inc/dashboard.class.php:59 42 | msgid "Tables" 43 | msgstr "Tabelas" 44 | 45 | #: inc/dashboard.class.php:102 inc/task.class.php:96 inc/task.class.php:478 46 | #: inc/taskstate.class.php:137 inc/taskstate.class.php:189 47 | #: inc/tasktype.class.php:52 48 | msgid "Context" 49 | msgid_plural "Contexts" 50 | msgstr[0] "Contexto" 51 | msgstr[1] "Contextos" 52 | msgstr[2] "Contextos" 53 | 54 | #: inc/dashboard.class.php:108 inc/notificationtargettask.class.php:213 55 | #: inc/notificationtargettask.class.php:259 inc/task.class.php:134 56 | #: inc/task.class.php:568 inc/tasktype.class.php:229 57 | msgid "Due date" 58 | msgstr "Data de vencimento" 59 | 60 | #: inc/dashboard.class.php:163 inc/dashboard.class.php:164 61 | #: inc/dashboard.class.php:169 inc/ticket.class.php:154 62 | msgid "Add task" 63 | msgstr "Adicionar tarefa" 64 | 65 | #: inc/kanban.class.php:76 66 | msgid "Kanban" 67 | msgstr "Kanban" 68 | 69 | #: inc/kanban.class.php:148 70 | msgid "You don't have the right to see any context" 71 | msgstr "Você não tem o direito de ver nenhum contexto" 72 | 73 | #: inc/kanban.class.php:185 74 | msgid "There is no accessible context" 75 | msgstr "Sem contexto acessível" 76 | 77 | #: inc/notificationtargettask.class.php:51 78 | msgid "A task has been added" 79 | msgstr "Uma tarefa foi adicionada" 80 | 81 | #: inc/notificationtargettask.class.php:52 82 | msgid "A task has been updated" 83 | msgstr "Uma tarefa foi atualizada" 84 | 85 | #: inc/notificationtargettask.class.php:53 86 | msgid "A task has been removed" 87 | msgstr "Uma tarefa foi removida" 88 | 89 | #: inc/notificationtargettask.class.php:217 90 | #: inc/notificationtargettask.class.php:263 inc/task.class.php:205 91 | #: inc/task.class.php:559 92 | msgid "Other client" 93 | msgstr "Outro cliente" 94 | 95 | #: inc/notificationtargettask.class.php:271 96 | msgid "At creation, update, removal of a task" 97 | msgstr "Na criação, atualização, remoção de uma tarefa" 98 | 99 | #: inc/preference.class.php:88 100 | msgid "Context by default" 101 | msgstr "Contexto por padrão" 102 | 103 | #: inc/preference.class.php:96 104 | msgid "Automatic refreshing of tasklist" 105 | msgstr "Atualização automática da lista de tarefas" 106 | 107 | #: inc/preference.class.php:102 108 | msgid "Refresh every " 109 | msgstr "Atualizar a cada" 110 | 111 | #: inc/preference.class.php:106 112 | msgid "minute(s)" 113 | msgstr "minuto(s)" 114 | 115 | #: inc/profile.class.php:164 inc/profile.class.php:208 116 | msgid "See and update all tasks" 117 | msgstr "Veja e atualize todas as tarefas" 118 | 119 | #: inc/profile.class.php:173 inc/profile.class.php:211 120 | msgid "Configure contexts and statuses" 121 | msgstr "Configurar contextos e status" 122 | 123 | #: inc/task.class.php:254 124 | msgctxt "quantity" 125 | msgid "Number of comments" 126 | msgstr "Número de comentários" 127 | 128 | #: inc/task.class.php:392 129 | msgid "You cannot archive a task with this state" 130 | msgstr "Você não pode arquivar uma tarefa com este estado" 131 | 132 | #: inc/task.class.php:522 133 | msgid "Existing client" 134 | msgstr "Cliente existente" 135 | 136 | #: inc/task.class.php:709 inc/task.class.php:790 inc/task.class.php:1085 137 | #: inc/tasktype.class.php:165 inc/tasktype.class.php:526 138 | msgid "Backlog" 139 | msgstr "Lista de pendências" 140 | 141 | #: inc/task.class.php:1143 142 | msgctxt "visibility" 143 | msgid "This user" 144 | msgstr "Este usuário" 145 | 146 | #: inc/task.class.php:1146 147 | msgctxt "visibility" 148 | msgid "This user and this group" 149 | msgstr "Este usuário e este grupo" 150 | 151 | #: inc/task.class.php:1149 152 | msgctxt "visibility" 153 | msgid "All" 154 | msgstr "Todos" 155 | 156 | #: inc/task.class.php:1192 157 | msgid "Affect entity for create task" 158 | msgstr "Afetar entidade para criar tarefa" 159 | 160 | #: inc/taskstate.class.php:84 161 | msgid "Status" 162 | msgid_plural "Statuses" 163 | msgstr[0] "Status" 164 | msgstr[1] "Status" 165 | msgstr[2] "Status" 166 | 167 | #: inc/ticket.class.php:74 inc/ticket.class.php:184 168 | msgid "Linked task" 169 | msgid_plural "Linked tasks" 170 | msgstr[0] "Tarefa vinculada" 171 | msgstr[1] "Tarefas vinculadas" 172 | msgstr[2] "Tarefas vinculadas" 173 | 174 | #: inc/ticket.class.php:228 175 | msgid "No task linked to this ticket yet" 176 | msgstr "Nenhuma tarefa vinculada a este chamado ainda" 177 | 178 | #: inc/ticket.class.php:259 179 | msgid "Link a existant ticket" 180 | msgstr "Vincular a um chamado existente" 181 | 182 | #: inc/ticket.class.php:285 183 | msgid "Linked tickets" 184 | msgstr "Vincular chamados" 185 | 186 | #: inc/typevisibility.class.php:138 187 | msgid "Add a group" 188 | msgstr "Adicionar um grupo" 189 | 190 | #: inc/typevisibility.class.php:179 191 | msgid "Groups allowed to use context" 192 | msgstr "Grupos autorizados a usar o contexto" 193 | -------------------------------------------------------------------------------- /src/Preference.php: -------------------------------------------------------------------------------- 1 | . 27 | -------------------------------------------------------------------------- 28 | */ 29 | 30 | namespace GlpiPlugin\Tasklists; 31 | use CommonDBTM; 32 | use CommonGLPI; 33 | use DbUtils; 34 | use Dropdown; 35 | use Session; 36 | 37 | /** 38 | * Class Preference 39 | */ 40 | class Preference extends CommonDBTM 41 | { 42 | 43 | static $rightname = 'plugin_tasklists'; 44 | 45 | /** 46 | * @param CommonGLPI $item 47 | * @param int $withtemplate 48 | * 49 | * @return string|translated 50 | */ 51 | function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) 52 | { 53 | if (Session::haveRight('plugin_tasklists', READ) 54 | && $item->getType() == 'Preference') { 55 | return self::createTabEntry(__('Tasks list', 'tasklists')); 56 | } 57 | return ''; 58 | } 59 | 60 | /** 61 | * @return string 62 | */ 63 | static function getIcon() 64 | { 65 | return Task::getIcon(); 66 | } 67 | 68 | 69 | /** 70 | * @param CommonGLPI $item 71 | * @param int $tabnum 72 | * @param int $withtemplate 73 | * 74 | * @return bool 75 | */ 76 | static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) 77 | { 78 | $pref = new self(); 79 | $pref->showPreferenceForm(Session::getLoginUserID()); 80 | return true; 81 | } 82 | 83 | /** 84 | * @param $user_id 85 | */ 86 | function showPreferenceForm($user_id) 87 | { 88 | //If user has no preferences yet, we set default values 89 | if (!$this->getFromDB($user_id)) { 90 | $this->initPreferences($user_id); 91 | $this->getFromDB($user_id); 92 | } 93 | 94 | //Preferences are not deletable 95 | $options['candel'] = false; 96 | $options['colspan'] = 1; 97 | 98 | $this->showFormHeader($options); 99 | 100 | echo "" . __("Context by default", "tasklists") . ""; 101 | echo ""; 102 | $types = TypeVisibility::seeAllowedTypes(); 103 | Dropdown::show(TaskType::class, ['name' => "default_type", 104 | 'value' => $this->fields['default_type'], 105 | 'condition' => ["id" => $types]]); 106 | echo ""; 107 | echo ""; 108 | echo "" . __("Automatic refreshing of tasklist", "tasklists") . ""; 109 | echo ""; 110 | Dropdown::showYesNo("automatic_refresh", $this->fields['automatic_refresh']); 111 | echo ""; 112 | echo ""; 113 | 114 | echo "" . __("Refresh every ", "tasklists") . ""; 115 | echo ""; 116 | Dropdown::showFromArray( 117 | "automatic_refresh_delay", 118 | [1 => 1, 2 => 2, 5 => 5, 10 => 10, 30 => 30, 60 => 60], 119 | ["value" => $this->fields['automatic_refresh_delay']] 120 | ); 121 | echo " " . __('minute(s)', "mydashboard"); 122 | echo ""; 123 | echo ""; 124 | 125 | $this->showFormButtons($options); 126 | } 127 | 128 | /** 129 | * @param $users_id 130 | */ 131 | public function initPreferences($users_id) 132 | { 133 | 134 | $input = []; 135 | $input['id'] = $users_id; 136 | $input['default_type'] = "0"; 137 | $this->add($input); 138 | } 139 | 140 | /** 141 | * @param $users_id 142 | * 143 | * @return int 144 | */ 145 | public static function checkDefaultType($users_id) 146 | { 147 | return self::checkPreferenceValue('default_type', $users_id); 148 | } 149 | 150 | /** 151 | * @param $field 152 | * @param int $users_id 153 | * 154 | * @return int 155 | */ 156 | public static function checkPreferenceValue($field, $users_id = 0) 157 | { 158 | $dbu = new DbUtils(); 159 | $data = $dbu->getAllDataFromTable($dbu->getTableForItemType(__CLASS__), ["id" => $users_id]); 160 | if (!empty($data)) { 161 | $first = array_pop($data); 162 | if ($field != "default_type") { 163 | return $first[$field]; 164 | } 165 | if ($first[$field] > 0) { 166 | return $first[$field]; 167 | } else { 168 | $values = TaskType::getAllForKanban(); 169 | $data = []; 170 | foreach ($values as $key => $value) { 171 | if (TypeVisibility::isUserHaveRight($key)) { 172 | $data[] = $key; 173 | } 174 | } 175 | if (!empty($data)) { 176 | $first = reset($data); 177 | return $first; 178 | } else { 179 | return 0; 180 | } 181 | } 182 | } else { 183 | $values = TaskType::getAllForKanban(); 184 | $data = []; 185 | foreach ($values as $key => $value) { 186 | if (TypeVisibility::isUserHaveRight($key)) { 187 | $data[] = $key; 188 | } 189 | } 190 | if (!empty($data)) { 191 | $first = reset($data); 192 | return $first; 193 | } else { 194 | return 0; 195 | } 196 | } 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /locales/pl_PL.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Ryszard Jeziorski , 2019 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 15 | "PO-Revision-Date: 2017-10-18 16:45+0000\n" 16 | "Last-Translator: Ryszard Jeziorski , 2019\n" 17 | "Language-Team: Polish (Poland) (https://www.transifex.com/infotelGLPI/teams/79675/pl_PL/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: pl_PL\n" 22 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" 23 | 24 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Lista zadań" 29 | 30 | #: ajax/addOptions.php:31 31 | msgid "Not archived" 32 | msgstr "" 33 | 34 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 35 | msgid "Archived" 36 | msgstr "Zarchiwizowane" 37 | 38 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 39 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 40 | #: inc/tasktype.class.php:48 41 | msgid "Context" 42 | msgid_plural "Contexts" 43 | msgstr[0] "Kontekst" 44 | msgstr[1] "Konteksty" 45 | msgstr[2] "Kontekstów" 46 | msgstr[3] "Kontekst" 47 | 48 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 49 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 50 | #: inc/task.class.php:496 inc/tasktype.class.php:256 51 | msgid "Due date" 52 | msgstr "Data zakończenia" 53 | 54 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 55 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 56 | msgid "Add task" 57 | msgstr "Dodaj zadanie" 58 | 59 | #: inc/kanban.class.php:61 60 | msgid "Kanban" 61 | msgstr "Kanban" 62 | 63 | #: inc/kanban.class.php:121 64 | msgid "You don't have the right to see any context" 65 | msgstr "" 66 | 67 | #: inc/kanban.class.php:188 68 | msgid "There is no accessible context" 69 | msgstr "" 70 | 71 | #: inc/kanban.class.php:247 72 | msgid "Toggle collapse" 73 | msgstr "" 74 | 75 | #: inc/kanban.class.php:248 76 | msgid "Search" 77 | msgstr "" 78 | 79 | #: inc/kanban.class.php:249 80 | msgid "Search or filter results" 81 | msgstr "" 82 | 83 | #: inc/kanban.class.php:250 84 | msgid "Add status" 85 | msgstr "" 86 | 87 | #: inc/kanban.class.php:251 88 | msgid "Create status" 89 | msgstr "" 90 | 91 | #: inc/kanban.class.php:253 92 | msgid "Add a column from existing status" 93 | msgstr "" 94 | 95 | #: inc/kanban.class.php:254 96 | msgid "Or add a new status" 97 | msgstr "" 98 | 99 | #: inc/kanban.class.php:259 100 | msgid "Archive all tasks of this state" 101 | msgstr "" 102 | 103 | #: inc/kanban.class.php:260 104 | msgid "See archived tasks" 105 | msgstr "Zadania zarchiwizowane" 106 | 107 | #: inc/kanban.class.php:261 108 | msgid "Hide archived tasks" 109 | msgstr "Ukryj zarchiwizowane zadania" 110 | 111 | #: inc/kanban.class.php:262 112 | msgid "Clone task" 113 | msgstr "Sklonuj zadanie" 114 | 115 | #: inc/kanban.class.php:263 116 | msgid "See tasks in progress" 117 | msgstr "Zadania wykonywane" 118 | 119 | #: inc/kanban.class.php:264 120 | msgid "See tasks of" 121 | msgstr "Zadania użytkownika" 122 | 123 | #: inc/kanban.class.php:265 124 | msgid "See all tasks" 125 | msgstr "Wszystkie zadania" 126 | 127 | #: inc/kanban.class.php:266 128 | msgid "Are you sure you want to archive this task ?" 129 | msgstr "" 130 | 131 | #: inc/kanban.class.php:267 132 | msgid "Are you sure you want to archive all tasks ?" 133 | msgstr "" 134 | 135 | #: inc/kanban.class.php:268 136 | msgid "Archive this task" 137 | msgstr "" 138 | 139 | #: inc/kanban.class.php:269 140 | msgid "Update priority of task" 141 | msgstr "" 142 | 143 | #: inc/kanban.class.php:270 144 | msgid "Details of task" 145 | msgstr "Szczegóły zdania" 146 | 147 | #: inc/notificationtargettask.class.php:50 148 | msgid "A task has been added" 149 | msgstr "Dodano zadanie" 150 | 151 | #: inc/notificationtargettask.class.php:51 152 | msgid "A task has been updated" 153 | msgstr "Zaktualizowano zadanie" 154 | 155 | #: inc/notificationtargettask.class.php:52 156 | msgid "A task has been removed" 157 | msgstr "Usunięto zadanie" 158 | 159 | #: inc/notificationtargettask.class.php:207 160 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 161 | #: inc/task.class.php:486 162 | msgid "Other client" 163 | msgstr "Inny klient" 164 | 165 | #: inc/notificationtargettask.class.php:259 166 | msgid "At creation, update, removal of a task" 167 | msgstr "" 168 | 169 | #: inc/preference.class.php:80 170 | msgid "Context by default" 171 | msgstr "" 172 | 173 | #: inc/preference.class.php:88 174 | msgid "Automatic refreshing of tasklist" 175 | msgstr "" 176 | 177 | #: inc/preference.class.php:94 178 | msgid "Refresh every " 179 | msgstr "" 180 | 181 | #: inc/preference.class.php:98 182 | msgid "minute(s)" 183 | msgstr "" 184 | 185 | #: inc/profile.class.php:153 inc/profile.class.php:196 186 | msgid "See and update all tasks" 187 | msgstr "" 188 | 189 | #: inc/profile.class.php:162 inc/profile.class.php:199 190 | msgid "Configure contexts and statuses" 191 | msgstr "" 192 | 193 | #: inc/stateorder.class.php:96 194 | msgid "States ordering" 195 | msgstr "" 196 | 197 | #: inc/stateorder.class.php:156 198 | msgid "Add states from linked Kanban" 199 | msgstr "" 200 | 201 | #: inc/task.class.php:333 202 | msgid "You cannot archive a task with this state" 203 | msgstr "" 204 | 205 | #: inc/task.class.php:457 206 | msgid "Existing client" 207 | msgstr "" 208 | 209 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 210 | #: inc/tasktype.class.php:161 211 | msgid "Backlog" 212 | msgstr "Zaległości" 213 | 214 | #: inc/task.class.php:1045 215 | msgctxt "visibility" 216 | msgid "This user" 217 | msgstr "Użytkownik" 218 | 219 | #: inc/task.class.php:1048 220 | msgctxt "visibility" 221 | msgid "This user and this group" 222 | msgstr "Użytkownik i grupa" 223 | 224 | #: inc/task.class.php:1051 225 | msgctxt "visibility" 226 | msgid "All" 227 | msgstr "Wszystko" 228 | 229 | #: inc/task.class.php:1093 230 | msgid "Affect entity for create task" 231 | msgstr "" 232 | 233 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 234 | msgid "Linked task" 235 | msgid_plural "Linked tasks" 236 | msgstr[0] "Powiązane zadanie" 237 | msgstr[1] "Powiązane zadania" 238 | msgstr[2] "Powiązanych zadań" 239 | msgstr[3] "Powiązane zadania" 240 | 241 | #: inc/ticket.class.php:227 242 | msgid "No task linked to this ticket yet" 243 | msgstr "Brak powiązanych zadań do tego zgłoszenia" 244 | 245 | #: inc/ticket.class.php:258 246 | msgid "Link a existant ticket" 247 | msgstr "Powiąż ze zgłoszeniem" 248 | 249 | #: inc/ticket.class.php:284 250 | msgid "Linked tickets" 251 | msgstr "Powiązane zgłoszenia" 252 | 253 | #: inc/typevisibility.class.php:138 254 | msgid "Add a group" 255 | msgstr "Dodaj grupę" 256 | 257 | #: inc/typevisibility.class.php:179 258 | msgid "Groups allowed to use context" 259 | msgstr "Grupy dopuszczone do użycia w tym kontekście" 260 | -------------------------------------------------------------------------------- /locales/fi_FI.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Markku Vepsä, 2018 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 15 | "PO-Revision-Date: 2017-10-18 16:45+0000\n" 16 | "Last-Translator: Markku Vepsä, 2018\n" 17 | "Language-Team: Finnish (Finland) (https://www.transifex.com/infotelGLPI/teams/79675/fi_FI/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: fi_FI\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Tehtävien luettelo" 29 | 30 | #: ajax/addOptions.php:31 31 | msgid "Not archived" 32 | msgstr "" 33 | 34 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 35 | msgid "Archived" 36 | msgstr "Arkistoitu" 37 | 38 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 39 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 40 | #: inc/tasktype.class.php:48 41 | msgid "Context" 42 | msgid_plural "Contexts" 43 | msgstr[0] "Asiayhteys" 44 | msgstr[1] "Asiayhteydet" 45 | 46 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 47 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 48 | #: inc/task.class.php:496 inc/tasktype.class.php:256 49 | msgid "Due date" 50 | msgstr "Määräaika" 51 | 52 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 53 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 54 | msgid "Add task" 55 | msgstr "Lisää tehtävä" 56 | 57 | #: inc/kanban.class.php:61 58 | msgid "Kanban" 59 | msgstr "Taulu" 60 | 61 | #: inc/kanban.class.php:121 62 | msgid "You don't have the right to see any context" 63 | msgstr "Sinulla ei ole oikeutta nähdä mitään asiayhteyttä" 64 | 65 | #: inc/kanban.class.php:188 66 | msgid "There is no accessible context" 67 | msgstr "" 68 | 69 | #: inc/kanban.class.php:247 70 | msgid "Toggle collapse" 71 | msgstr "" 72 | 73 | #: inc/kanban.class.php:248 74 | msgid "Search" 75 | msgstr "" 76 | 77 | #: inc/kanban.class.php:249 78 | msgid "Search or filter results" 79 | msgstr "" 80 | 81 | #: inc/kanban.class.php:250 82 | msgid "Add status" 83 | msgstr "" 84 | 85 | #: inc/kanban.class.php:251 86 | msgid "Create status" 87 | msgstr "" 88 | 89 | #: inc/kanban.class.php:253 90 | msgid "Add a column from existing status" 91 | msgstr "" 92 | 93 | #: inc/kanban.class.php:254 94 | msgid "Or add a new status" 95 | msgstr "" 96 | 97 | #: inc/kanban.class.php:259 98 | msgid "Archive all tasks of this state" 99 | msgstr "Arkistoi kaikki tässä tilassa olevat tehtävät" 100 | 101 | #: inc/kanban.class.php:260 102 | msgid "See archived tasks" 103 | msgstr "Näytä arkistoidut tehtävät" 104 | 105 | #: inc/kanban.class.php:261 106 | msgid "Hide archived tasks" 107 | msgstr "Piilota arkistoidut tehtävät" 108 | 109 | #: inc/kanban.class.php:262 110 | msgid "Clone task" 111 | msgstr "Monista tehtävä" 112 | 113 | #: inc/kanban.class.php:263 114 | msgid "See tasks in progress" 115 | msgstr "Katso käynnissä olevat tehtävät" 116 | 117 | #: inc/kanban.class.php:264 118 | msgid "See tasks of" 119 | msgstr "Näytä tehtävät" 120 | 121 | #: inc/kanban.class.php:265 122 | msgid "See all tasks" 123 | msgstr "Näytä kaikki tehtävät" 124 | 125 | #: inc/kanban.class.php:266 126 | msgid "Are you sure you want to archive this task ?" 127 | msgstr "Haluatko varmasti arkistoida tämän tehtävän?" 128 | 129 | #: inc/kanban.class.php:267 130 | msgid "Are you sure you want to archive all tasks ?" 131 | msgstr "Haluatko varmasti arkistoida kaikki tehtävät?" 132 | 133 | #: inc/kanban.class.php:268 134 | msgid "Archive this task" 135 | msgstr "Arkistoi tämä tehtävä" 136 | 137 | #: inc/kanban.class.php:269 138 | msgid "Update priority of task" 139 | msgstr "Päivitä tehtävän prioriteetti" 140 | 141 | #: inc/kanban.class.php:270 142 | msgid "Details of task" 143 | msgstr "Tehtävän lisätiedot" 144 | 145 | #: inc/notificationtargettask.class.php:50 146 | msgid "A task has been added" 147 | msgstr "Tehtävä on lisätty" 148 | 149 | #: inc/notificationtargettask.class.php:51 150 | msgid "A task has been updated" 151 | msgstr "Tehtävä on päivitetty" 152 | 153 | #: inc/notificationtargettask.class.php:52 154 | msgid "A task has been removed" 155 | msgstr "Tehtävä on poistettu" 156 | 157 | #: inc/notificationtargettask.class.php:207 158 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 159 | #: inc/task.class.php:486 160 | msgid "Other client" 161 | msgstr "Muu asiakas" 162 | 163 | #: inc/notificationtargettask.class.php:259 164 | msgid "At creation, update, removal of a task" 165 | msgstr "Luonti, päivitys, tehtävän poisto" 166 | 167 | #: inc/preference.class.php:80 168 | msgid "Context by default" 169 | msgstr "Asiayhteys oletuksena" 170 | 171 | #: inc/preference.class.php:88 172 | msgid "Automatic refreshing of tasklist" 173 | msgstr "" 174 | 175 | #: inc/preference.class.php:94 176 | msgid "Refresh every " 177 | msgstr "" 178 | 179 | #: inc/preference.class.php:98 180 | msgid "minute(s)" 181 | msgstr "" 182 | 183 | #: inc/profile.class.php:153 inc/profile.class.php:196 184 | msgid "See and update all tasks" 185 | msgstr "Näytä ja päivitä kaikki tehtävät" 186 | 187 | #: inc/profile.class.php:162 inc/profile.class.php:199 188 | msgid "Configure contexts and statuses" 189 | msgstr "" 190 | 191 | #: inc/stateorder.class.php:96 192 | msgid "States ordering" 193 | msgstr "Tilojen järjestely" 194 | 195 | #: inc/stateorder.class.php:156 196 | msgid "Add states from linked Kanban" 197 | msgstr "" 198 | 199 | #: inc/task.class.php:333 200 | msgid "You cannot archive a task with this state" 201 | msgstr "Et voi arkistoida tässä tilassa olevaa tehtävää" 202 | 203 | #: inc/task.class.php:457 204 | msgid "Existing client" 205 | msgstr "Olemassa oleva asiakas" 206 | 207 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 208 | #: inc/tasktype.class.php:161 209 | msgid "Backlog" 210 | msgstr "Jono" 211 | 212 | #: inc/task.class.php:1045 213 | msgctxt "visibility" 214 | msgid "This user" 215 | msgstr "Tämä käyttäjä" 216 | 217 | #: inc/task.class.php:1048 218 | msgctxt "visibility" 219 | msgid "This user and this group" 220 | msgstr "Tämä käyttäjä ja tämä ryhmä" 221 | 222 | #: inc/task.class.php:1051 223 | msgctxt "visibility" 224 | msgid "All" 225 | msgstr "Kaikki" 226 | 227 | #: inc/task.class.php:1093 228 | msgid "Affect entity for create task" 229 | msgstr "Kohdista tehtävä yksikköön" 230 | 231 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 232 | msgid "Linked task" 233 | msgid_plural "Linked tasks" 234 | msgstr[0] "Liitetty tehtävä" 235 | msgstr[1] "Liitetyt tehtävät" 236 | 237 | #: inc/ticket.class.php:227 238 | msgid "No task linked to this ticket yet" 239 | msgstr "Tikettiin ei vielä ole liitetty tehtävää" 240 | 241 | #: inc/ticket.class.php:258 242 | msgid "Link a existant ticket" 243 | msgstr "Liitä olemassa oleva tiketti" 244 | 245 | #: inc/ticket.class.php:284 246 | msgid "Linked tickets" 247 | msgstr "Liitetyt tiketit" 248 | 249 | #: inc/typevisibility.class.php:138 250 | msgid "Add a group" 251 | msgstr "Lisää ryhmä" 252 | 253 | #: inc/typevisibility.class.php:179 254 | msgid "Groups allowed to use context" 255 | msgstr "Sallitut ryhmät" 256 | -------------------------------------------------------------------------------- /locales/en_GB.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 11 | "PO-Revision-Date: 2020-07-20 15:19+0200\n" 12 | "MIME-Version: 1.0\n" 13 | "Content-Type: text/plain; charset=UTF-8\n" 14 | "Content-Transfer-Encoding: 8bit\n" 15 | "Language: en_GB\n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 17 | "Last-Translator: \n" 18 | "Language-Team: \n" 19 | "X-Generator: Poedit 2.3\n" 20 | 21 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 22 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 23 | #: inc/preference.class.php:46 inc/profile.class.php:52 24 | msgid "Tasks list" 25 | msgstr "Tasks list" 26 | 27 | #: ajax/addOptions.php:31 28 | msgid "Not archived" 29 | msgstr "Not archived" 30 | 31 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 32 | msgid "Archived" 33 | msgstr "Archived" 34 | 35 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 36 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 37 | #: inc/tasktype.class.php:48 38 | msgid "Context" 39 | msgid_plural "Contexts" 40 | msgstr[0] "Context" 41 | msgstr[1] "Contexts" 42 | 43 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 44 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 45 | #: inc/task.class.php:496 inc/tasktype.class.php:256 46 | msgid "Due date" 47 | msgstr "Due date" 48 | 49 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 50 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 51 | msgid "Add task" 52 | msgstr "Add task" 53 | 54 | #: inc/kanban.class.php:61 55 | msgid "Kanban" 56 | msgstr "Kanban" 57 | 58 | #: inc/kanban.class.php:121 59 | msgid "You don't have the right to see any context" 60 | msgstr "You don't have the right to see any context" 61 | 62 | #: inc/kanban.class.php:188 63 | msgid "There is no accessible context" 64 | msgstr "There is no accessible context" 65 | 66 | #: inc/kanban.class.php:247 67 | msgid "Toggle collapse" 68 | msgstr "Toggle collapse" 69 | 70 | #: inc/kanban.class.php:248 71 | msgid "Search" 72 | msgstr "Search" 73 | 74 | #: inc/kanban.class.php:249 75 | msgid "Search or filter results" 76 | msgstr "Search or filter results" 77 | 78 | #: inc/kanban.class.php:250 79 | msgid "Add status" 80 | msgstr "Add status" 81 | 82 | #: inc/kanban.class.php:251 83 | msgid "Create status" 84 | msgstr "Create status" 85 | 86 | #: inc/kanban.class.php:253 87 | msgid "Add a column from existing status" 88 | msgstr "Add a column from existing status" 89 | 90 | #: inc/kanban.class.php:254 91 | msgid "Or add a new status" 92 | msgstr "Or add a new status" 93 | 94 | #: inc/kanban.class.php:259 95 | msgid "Archive all tasks of this state" 96 | msgstr "Archive all tasks of this state" 97 | 98 | #: inc/kanban.class.php:260 99 | msgid "See archived tasks" 100 | msgstr "See archived tasks" 101 | 102 | #: inc/kanban.class.php:261 103 | msgid "Hide archived tasks" 104 | msgstr "Hide archived tasks" 105 | 106 | #: inc/kanban.class.php:262 107 | msgid "Clone task" 108 | msgstr "Clone task" 109 | 110 | #: inc/kanban.class.php:263 111 | msgid "See tasks in progress" 112 | msgstr "See tasks in progress" 113 | 114 | #: inc/kanban.class.php:264 115 | msgid "See tasks of" 116 | msgstr "See tasks of" 117 | 118 | #: inc/kanban.class.php:265 119 | msgid "See all tasks" 120 | msgstr "See all tasks" 121 | 122 | #: inc/kanban.class.php:266 123 | msgid "Are you sure you want to archive this task ?" 124 | msgstr "Are you sure you want to archive this task ?" 125 | 126 | #: inc/kanban.class.php:267 127 | msgid "Are you sure you want to archive all tasks ?" 128 | msgstr "Are you sure you want to archive all tasks ?" 129 | 130 | #: inc/kanban.class.php:268 131 | msgid "Archive this task" 132 | msgstr "Archive this task" 133 | 134 | #: inc/kanban.class.php:269 135 | msgid "Update priority of task" 136 | msgstr "Update priority of task" 137 | 138 | #: inc/kanban.class.php:270 139 | msgid "Details of task" 140 | msgstr "Details of task" 141 | 142 | #: inc/notificationtargettask.class.php:50 143 | msgid "A task has been added" 144 | msgstr "A task has been added" 145 | 146 | #: inc/notificationtargettask.class.php:51 147 | msgid "A task has been updated" 148 | msgstr "A task has been updated" 149 | 150 | #: inc/notificationtargettask.class.php:52 151 | msgid "A task has been removed" 152 | msgstr "A task has been removed" 153 | 154 | #: inc/notificationtargettask.class.php:207 155 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 156 | #: inc/task.class.php:486 157 | msgid "Other client" 158 | msgstr "Other client" 159 | 160 | #: inc/notificationtargettask.class.php:259 161 | msgid "At creation, update, removal of a task" 162 | msgstr "At creation, update, removal of a task" 163 | 164 | #: inc/preference.class.php:80 165 | msgid "Context by default" 166 | msgstr "Context by default" 167 | 168 | #: inc/preference.class.php:88 169 | msgid "Automatic refreshing of tasklist" 170 | msgstr "Automatic refreshing of tasklist" 171 | 172 | #: inc/preference.class.php:94 173 | msgid "Refresh every " 174 | msgstr "Refresh every " 175 | 176 | #: inc/preference.class.php:98 177 | msgid "minute(s)" 178 | msgstr "minute(s)" 179 | 180 | #: inc/profile.class.php:153 inc/profile.class.php:196 181 | msgid "See and update all tasks" 182 | msgstr "See and update all tasks" 183 | 184 | #: inc/profile.class.php:162 inc/profile.class.php:199 185 | msgid "Configure contexts and statuses" 186 | msgstr "Configure contexts and statuses" 187 | 188 | #: inc/stateorder.class.php:96 189 | msgid "States ordering" 190 | msgstr "States ordering" 191 | 192 | #: inc/stateorder.class.php:156 193 | msgid "Add states from linked Kanban" 194 | msgstr "Add states from linked Kanban" 195 | 196 | #: inc/task.class.php:333 197 | msgid "You cannot archive a task with this state" 198 | msgstr "You cannot archive a task with this state" 199 | 200 | #: inc/task.class.php:457 201 | msgid "Existing client" 202 | msgstr "Existing client" 203 | 204 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 205 | #: inc/tasktype.class.php:161 206 | msgid "Backlog" 207 | msgstr "Backlog" 208 | 209 | #: inc/task.class.php:1045 210 | msgctxt "visibility" 211 | msgid "This user" 212 | msgstr "This user" 213 | 214 | #: inc/task.class.php:1048 215 | msgctxt "visibility" 216 | msgid "This user and this group" 217 | msgstr "This user and this group" 218 | 219 | #: inc/task.class.php:1051 220 | msgctxt "visibility" 221 | msgid "All" 222 | msgstr "All" 223 | 224 | #: inc/task.class.php:1093 225 | msgid "Affect entity for create task" 226 | msgstr "Affect entity for create task" 227 | 228 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 229 | msgid "Linked task" 230 | msgid_plural "Linked tasks" 231 | msgstr[0] "Linked task" 232 | msgstr[1] "Linked tasks" 233 | 234 | #: inc/ticket.class.php:227 235 | msgid "No task linked to this ticket yet" 236 | msgstr "No task linked to this ticket yet" 237 | 238 | #: inc/ticket.class.php:258 239 | msgid "Link a existant ticket" 240 | msgstr "Link a existant ticket" 241 | 242 | #: inc/ticket.class.php:284 243 | msgid "Linked tickets" 244 | msgstr "Linked tickets" 245 | 246 | #: inc/typevisibility.class.php:138 247 | msgid "Add a group" 248 | msgstr "Add a group" 249 | 250 | #: inc/typevisibility.class.php:179 251 | msgid "Groups allowed to use context" 252 | msgstr "Groups allowed to use context" 253 | -------------------------------------------------------------------------------- /locales/es_419.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Jorge Paniagua , 2019 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 15 | "PO-Revision-Date: 2017-10-18 16:45+0000\n" 16 | "Last-Translator: Jorge Paniagua , 2019\n" 17 | "Language-Team: Spanish (Latin America) (https://www.transifex.com/infotelGLPI/teams/79675/es_419/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: es_419\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Lista de tareas" 29 | 30 | #: ajax/addOptions.php:31 31 | msgid "Not archived" 32 | msgstr "" 33 | 34 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 35 | msgid "Archived" 36 | msgstr "Archivado" 37 | 38 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 39 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 40 | #: inc/tasktype.class.php:48 41 | msgid "Context" 42 | msgid_plural "Contexts" 43 | msgstr[0] "Contexto" 44 | msgstr[1] "Contexto" 45 | 46 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 47 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 48 | #: inc/task.class.php:496 inc/tasktype.class.php:256 49 | msgid "Due date" 50 | msgstr "Fecha de vencimiento" 51 | 52 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 53 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 54 | msgid "Add task" 55 | msgstr "Agregar tarea" 56 | 57 | #: inc/kanban.class.php:61 58 | msgid "Kanban" 59 | msgstr "Kanban" 60 | 61 | #: inc/kanban.class.php:121 62 | msgid "You don't have the right to see any context" 63 | msgstr "Usted no tiene privilegios para ver ningún contexto" 64 | 65 | #: inc/kanban.class.php:188 66 | msgid "There is no accessible context" 67 | msgstr "" 68 | 69 | #: inc/kanban.class.php:247 70 | msgid "Toggle collapse" 71 | msgstr "" 72 | 73 | #: inc/kanban.class.php:248 74 | msgid "Search" 75 | msgstr "" 76 | 77 | #: inc/kanban.class.php:249 78 | msgid "Search or filter results" 79 | msgstr "" 80 | 81 | #: inc/kanban.class.php:250 82 | msgid "Add status" 83 | msgstr "" 84 | 85 | #: inc/kanban.class.php:251 86 | msgid "Create status" 87 | msgstr "" 88 | 89 | #: inc/kanban.class.php:253 90 | msgid "Add a column from existing status" 91 | msgstr "" 92 | 93 | #: inc/kanban.class.php:254 94 | msgid "Or add a new status" 95 | msgstr "" 96 | 97 | #: inc/kanban.class.php:259 98 | msgid "Archive all tasks of this state" 99 | msgstr "Archivar todas las tareas de este estado" 100 | 101 | #: inc/kanban.class.php:260 102 | msgid "See archived tasks" 103 | msgstr "Ver tareas archivadas" 104 | 105 | #: inc/kanban.class.php:261 106 | msgid "Hide archived tasks" 107 | msgstr "Ocultar tareas archivadas" 108 | 109 | #: inc/kanban.class.php:262 110 | msgid "Clone task" 111 | msgstr "Duplicar tarea" 112 | 113 | #: inc/kanban.class.php:263 114 | msgid "See tasks in progress" 115 | msgstr "Ver tareas en progreso" 116 | 117 | #: inc/kanban.class.php:264 118 | msgid "See tasks of" 119 | msgstr "Ver tareas de " 120 | 121 | #: inc/kanban.class.php:265 122 | msgid "See all tasks" 123 | msgstr "Ver todas las tareas" 124 | 125 | #: inc/kanban.class.php:266 126 | msgid "Are you sure you want to archive this task ?" 127 | msgstr "¿Esta seguro que quiere archivar esta tarea?" 128 | 129 | #: inc/kanban.class.php:267 130 | msgid "Are you sure you want to archive all tasks ?" 131 | msgstr "¿Esta seguro que quiere archivar todas las tareas?" 132 | 133 | #: inc/kanban.class.php:268 134 | msgid "Archive this task" 135 | msgstr "Archiva esta tarea" 136 | 137 | #: inc/kanban.class.php:269 138 | msgid "Update priority of task" 139 | msgstr "Actualizar prioridad de tarea" 140 | 141 | #: inc/kanban.class.php:270 142 | msgid "Details of task" 143 | msgstr "Detalles de tarea" 144 | 145 | #: inc/notificationtargettask.class.php:50 146 | msgid "A task has been added" 147 | msgstr "Una tarea ha sido agregada" 148 | 149 | #: inc/notificationtargettask.class.php:51 150 | msgid "A task has been updated" 151 | msgstr "Una tarea ha sido actualizada" 152 | 153 | #: inc/notificationtargettask.class.php:52 154 | msgid "A task has been removed" 155 | msgstr "Una tarea ha sido eliminada" 156 | 157 | #: inc/notificationtargettask.class.php:207 158 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 159 | #: inc/task.class.php:486 160 | msgid "Other client" 161 | msgstr "Otro cliente" 162 | 163 | #: inc/notificationtargettask.class.php:259 164 | msgid "At creation, update, removal of a task" 165 | msgstr "En la creación, actualización, eliminación de una tarea" 166 | 167 | #: inc/preference.class.php:80 168 | msgid "Context by default" 169 | msgstr "Contexto predefinido" 170 | 171 | #: inc/preference.class.php:88 172 | msgid "Automatic refreshing of tasklist" 173 | msgstr "" 174 | 175 | #: inc/preference.class.php:94 176 | msgid "Refresh every " 177 | msgstr "" 178 | 179 | #: inc/preference.class.php:98 180 | msgid "minute(s)" 181 | msgstr "" 182 | 183 | #: inc/profile.class.php:153 inc/profile.class.php:196 184 | msgid "See and update all tasks" 185 | msgstr "Ver y actualizar todas las tareas" 186 | 187 | #: inc/profile.class.php:162 inc/profile.class.php:199 188 | msgid "Configure contexts and statuses" 189 | msgstr "" 190 | 191 | #: inc/stateorder.class.php:96 192 | msgid "States ordering" 193 | msgstr "Ordenación de estados" 194 | 195 | #: inc/stateorder.class.php:156 196 | msgid "Add states from linked Kanban" 197 | msgstr "" 198 | 199 | #: inc/task.class.php:333 200 | msgid "You cannot archive a task with this state" 201 | msgstr "Usted no puede archivar una tarea en este estado" 202 | 203 | #: inc/task.class.php:457 204 | msgid "Existing client" 205 | msgstr "Cliente existente" 206 | 207 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 208 | #: inc/tasktype.class.php:161 209 | msgid "Backlog" 210 | msgstr "Backlog" 211 | 212 | #: inc/task.class.php:1045 213 | msgctxt "visibility" 214 | msgid "This user" 215 | msgstr "Este usuario" 216 | 217 | #: inc/task.class.php:1048 218 | msgctxt "visibility" 219 | msgid "This user and this group" 220 | msgstr "Este usuario y su grupo" 221 | 222 | #: inc/task.class.php:1051 223 | msgctxt "visibility" 224 | msgid "All" 225 | msgstr "Todo" 226 | 227 | #: inc/task.class.php:1093 228 | msgid "Affect entity for create task" 229 | msgstr "Entidad afectada por tarea creada" 230 | 231 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 232 | msgid "Linked task" 233 | msgid_plural "Linked tasks" 234 | msgstr[0] "T" 235 | msgstr[1] "Tareas vinculadas" 236 | 237 | #: inc/ticket.class.php:227 238 | msgid "No task linked to this ticket yet" 239 | msgstr "Aún no hay ninguna tarea vinculada a este ticket" 240 | 241 | #: inc/ticket.class.php:258 242 | msgid "Link a existant ticket" 243 | msgstr "Vincula un ticket existente" 244 | 245 | #: inc/ticket.class.php:284 246 | msgid "Linked tickets" 247 | msgstr "Tickets vinculados" 248 | 249 | #: inc/typevisibility.class.php:138 250 | msgid "Add a group" 251 | msgstr "Agregar un grupo" 252 | 253 | #: inc/typevisibility.class.php:179 254 | msgid "Groups allowed to use context" 255 | msgstr "Grupos permitidos para usar el contexto" 256 | -------------------------------------------------------------------------------- /locales/cs_CZ.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Pavel Borecki , 2018 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 15 | "PO-Revision-Date: 2017-10-18 16:45+0000\n" 16 | "Last-Translator: Pavel Borecki , 2018\n" 17 | "Language-Team: Czech (Czech Republic) (https://www.transifex.com/infotelGLPI/teams/79675/cs_CZ/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: cs_CZ\n" 22 | "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" 23 | 24 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Seznam úkolů" 29 | 30 | #: ajax/addOptions.php:31 31 | msgid "Not archived" 32 | msgstr "" 33 | 34 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 35 | msgid "Archived" 36 | msgstr "Archivováno" 37 | 38 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 39 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 40 | #: inc/tasktype.class.php:48 41 | msgid "Context" 42 | msgid_plural "Contexts" 43 | msgstr[0] "Kontext" 44 | msgstr[1] "Kontexty" 45 | msgstr[2] "Kontextů" 46 | msgstr[3] "Kontexty" 47 | 48 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 49 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 50 | #: inc/task.class.php:496 inc/tasktype.class.php:256 51 | msgid "Due date" 52 | msgstr "Termín" 53 | 54 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 55 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 56 | msgid "Add task" 57 | msgstr "Přidat úkol" 58 | 59 | #: inc/kanban.class.php:61 60 | msgid "Kanban" 61 | msgstr "Kanban" 62 | 63 | #: inc/kanban.class.php:121 64 | msgid "You don't have the right to see any context" 65 | msgstr "Nemáte oprávnění pro zobrazení žádného kontextu" 66 | 67 | #: inc/kanban.class.php:188 68 | msgid "There is no accessible context" 69 | msgstr "" 70 | 71 | #: inc/kanban.class.php:247 72 | msgid "Toggle collapse" 73 | msgstr "" 74 | 75 | #: inc/kanban.class.php:248 76 | msgid "Search" 77 | msgstr "" 78 | 79 | #: inc/kanban.class.php:249 80 | msgid "Search or filter results" 81 | msgstr "" 82 | 83 | #: inc/kanban.class.php:250 84 | msgid "Add status" 85 | msgstr "" 86 | 87 | #: inc/kanban.class.php:251 88 | msgid "Create status" 89 | msgstr "" 90 | 91 | #: inc/kanban.class.php:253 92 | msgid "Add a column from existing status" 93 | msgstr "" 94 | 95 | #: inc/kanban.class.php:254 96 | msgid "Or add a new status" 97 | msgstr "" 98 | 99 | #: inc/kanban.class.php:259 100 | msgid "Archive all tasks of this state" 101 | msgstr "Archivovat všechny úkoly, které mají tento stav" 102 | 103 | #: inc/kanban.class.php:260 104 | msgid "See archived tasks" 105 | msgstr "Zobrazit archivované úkoly" 106 | 107 | #: inc/kanban.class.php:261 108 | msgid "Hide archived tasks" 109 | msgstr "Skrýt archivované úkoly" 110 | 111 | #: inc/kanban.class.php:262 112 | msgid "Clone task" 113 | msgstr "Klonovat úkol" 114 | 115 | #: inc/kanban.class.php:263 116 | msgid "See tasks in progress" 117 | msgstr "Zobrazit všechny rozpracované úkoly" 118 | 119 | #: inc/kanban.class.php:264 120 | msgid "See tasks of" 121 | msgstr "Zobrazit úkoly" 122 | 123 | #: inc/kanban.class.php:265 124 | msgid "See all tasks" 125 | msgstr "Zobrazit všechny úkoly" 126 | 127 | #: inc/kanban.class.php:266 128 | msgid "Are you sure you want to archive this task ?" 129 | msgstr "Opravdu chcete tento úkol zaarchivovat?" 130 | 131 | #: inc/kanban.class.php:267 132 | msgid "Are you sure you want to archive all tasks ?" 133 | msgstr "Opravdu chcete zaarchivovat všechny úkoly?" 134 | 135 | #: inc/kanban.class.php:268 136 | msgid "Archive this task" 137 | msgstr "Zaarchivovat tento úkol" 138 | 139 | #: inc/kanban.class.php:269 140 | msgid "Update priority of task" 141 | msgstr "Změnit prioritu úkolu" 142 | 143 | #: inc/kanban.class.php:270 144 | msgid "Details of task" 145 | msgstr "Podrobnosti úkolu" 146 | 147 | #: inc/notificationtargettask.class.php:50 148 | msgid "A task has been added" 149 | msgstr "Byl přidán úkol" 150 | 151 | #: inc/notificationtargettask.class.php:51 152 | msgid "A task has been updated" 153 | msgstr "Byl aktualizován úkol" 154 | 155 | #: inc/notificationtargettask.class.php:52 156 | msgid "A task has been removed" 157 | msgstr "Byl odebrán úkol" 158 | 159 | #: inc/notificationtargettask.class.php:207 160 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 161 | #: inc/task.class.php:486 162 | msgid "Other client" 163 | msgstr "Jiný klint" 164 | 165 | #: inc/notificationtargettask.class.php:259 166 | msgid "At creation, update, removal of a task" 167 | msgstr "Při vytvoření, aktualizaci a odebrání úkolu" 168 | 169 | #: inc/preference.class.php:80 170 | msgid "Context by default" 171 | msgstr "Kontext ve výchozím stavu" 172 | 173 | #: inc/preference.class.php:88 174 | msgid "Automatic refreshing of tasklist" 175 | msgstr "" 176 | 177 | #: inc/preference.class.php:94 178 | msgid "Refresh every " 179 | msgstr "" 180 | 181 | #: inc/preference.class.php:98 182 | msgid "minute(s)" 183 | msgstr "" 184 | 185 | #: inc/profile.class.php:153 inc/profile.class.php:196 186 | msgid "See and update all tasks" 187 | msgstr "Zobrazit a aktualizovat všechny úkoly" 188 | 189 | #: inc/profile.class.php:162 inc/profile.class.php:199 190 | msgid "Configure contexts and statuses" 191 | msgstr "" 192 | 193 | #: inc/stateorder.class.php:96 194 | msgid "States ordering" 195 | msgstr "Řazení vztahů" 196 | 197 | #: inc/stateorder.class.php:156 198 | msgid "Add states from linked Kanban" 199 | msgstr "" 200 | 201 | #: inc/task.class.php:333 202 | msgid "You cannot archive a task with this state" 203 | msgstr "Není možné archivovat úkol, který je v tomto stavu" 204 | 205 | #: inc/task.class.php:457 206 | msgid "Existing client" 207 | msgstr "Existující klient" 208 | 209 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 210 | #: inc/tasktype.class.php:161 211 | msgid "Backlog" 212 | msgstr "Nashromážděno" 213 | 214 | #: inc/task.class.php:1045 215 | msgctxt "visibility" 216 | msgid "This user" 217 | msgstr "Tento uživatel" 218 | 219 | #: inc/task.class.php:1048 220 | msgctxt "visibility" 221 | msgid "This user and this group" 222 | msgstr "Tento uživatel a skupina" 223 | 224 | #: inc/task.class.php:1051 225 | msgctxt "visibility" 226 | msgid "All" 227 | msgstr "Všichni" 228 | 229 | #: inc/task.class.php:1093 230 | msgid "Affect entity for create task" 231 | msgstr "Přiřadit entitu pro vytvoření úkolu" 232 | 233 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 234 | msgid "Linked task" 235 | msgid_plural "Linked tasks" 236 | msgstr[0] "Propojený úkol" 237 | msgstr[1] "Propojené úkoly" 238 | msgstr[2] "Propojených úkolů" 239 | msgstr[3] "Propojené úkoly" 240 | 241 | #: inc/ticket.class.php:227 242 | msgid "No task linked to this ticket yet" 243 | msgstr "K tomuto požadavku zatím nejsou připojené žádné úkoly" 244 | 245 | #: inc/ticket.class.php:258 246 | msgid "Link a existant ticket" 247 | msgstr "Propojit s existujícím požadavkem" 248 | 249 | #: inc/ticket.class.php:284 250 | msgid "Linked tickets" 251 | msgstr "Připojené požadavky" 252 | 253 | #: inc/typevisibility.class.php:138 254 | msgid "Add a group" 255 | msgstr "Přidat skupinu" 256 | 257 | #: inc/typevisibility.class.php:179 258 | msgid "Groups allowed to use context" 259 | msgstr "Skupiny kterým je umožněno používat kontext" 260 | -------------------------------------------------------------------------------- /locales/ru_RU.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR Tasklists Development Team 3 | # This file is distributed under the same license as the GLPI - Tasklists plugin package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | # Translators: 7 | # Denis Arkhipov , 2019 8 | # 9 | #, fuzzy 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: GLPI - Tasklists plugin 1.4.0\n" 13 | "Report-Msgid-Bugs-To: \n" 14 | "POT-Creation-Date: 2020-07-20 15:07+0200\n" 15 | "PO-Revision-Date: 2017-10-18 16:45+0000\n" 16 | "Last-Translator: Denis Arkhipov , 2019\n" 17 | "Language-Team: Russian (Russia) (https://www.transifex.com/infotelGLPI/teams/79675/ru_RU/)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=UTF-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Language: ru_RU\n" 22 | "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" 23 | 24 | #: setup.php:89 inc/dashboard.class.php:58 inc/dashboard.class.php:178 25 | #: inc/dashboard.class.php:183 inc/menu.class.php:44 26 | #: inc/preference.class.php:46 inc/profile.class.php:52 27 | msgid "Tasks list" 28 | msgstr "Список задач" 29 | 30 | #: ajax/addOptions.php:31 31 | msgid "Not archived" 32 | msgstr "" 33 | 34 | #: ajax/addOptions.php:32 inc/task.class.php:181 inc/task.class.php:599 35 | msgid "Archived" 36 | msgstr "Заархивирован" 37 | 38 | #: inc/dashboard.class.php:93 inc/task.class.php:80 inc/task.class.php:418 39 | #: inc/taskstate.class.php:100 inc/taskstate.class.php:152 40 | #: inc/tasktype.class.php:48 41 | msgid "Context" 42 | msgid_plural "Contexts" 43 | msgstr[0] "Контекст" 44 | msgstr[1] "Контексты" 45 | msgstr[2] "Контексты" 46 | msgstr[3] "Контексты" 47 | 48 | #: inc/dashboard.class.php:93 inc/notificationtargettask.class.php:203 49 | #: inc/notificationtargettask.class.php:247 inc/task.class.php:118 50 | #: inc/task.class.php:496 inc/tasktype.class.php:256 51 | msgid "Due date" 52 | msgstr "Срок исполнения" 53 | 54 | #: inc/dashboard.class.php:164 inc/dashboard.class.php:172 55 | #: inc/kanban.class.php:257 inc/ticket.class.php:154 56 | msgid "Add task" 57 | msgstr "Добавить задачу" 58 | 59 | #: inc/kanban.class.php:61 60 | msgid "Kanban" 61 | msgstr "Канбан" 62 | 63 | #: inc/kanban.class.php:121 64 | msgid "You don't have the right to see any context" 65 | msgstr "У вас нет прав на просмотр контекста" 66 | 67 | #: inc/kanban.class.php:188 68 | msgid "There is no accessible context" 69 | msgstr "" 70 | 71 | #: inc/kanban.class.php:247 72 | msgid "Toggle collapse" 73 | msgstr "" 74 | 75 | #: inc/kanban.class.php:248 76 | msgid "Search" 77 | msgstr "" 78 | 79 | #: inc/kanban.class.php:249 80 | msgid "Search or filter results" 81 | msgstr "" 82 | 83 | #: inc/kanban.class.php:250 84 | msgid "Add status" 85 | msgstr "" 86 | 87 | #: inc/kanban.class.php:251 88 | msgid "Create status" 89 | msgstr "" 90 | 91 | #: inc/kanban.class.php:253 92 | msgid "Add a column from existing status" 93 | msgstr "" 94 | 95 | #: inc/kanban.class.php:254 96 | msgid "Or add a new status" 97 | msgstr "" 98 | 99 | #: inc/kanban.class.php:259 100 | msgid "Archive all tasks of this state" 101 | msgstr "Заархивировать задачи с таким статусом" 102 | 103 | #: inc/kanban.class.php:260 104 | msgid "See archived tasks" 105 | msgstr "Показать архивные задачи" 106 | 107 | #: inc/kanban.class.php:261 108 | msgid "Hide archived tasks" 109 | msgstr "Скрыть архивные задачи" 110 | 111 | #: inc/kanban.class.php:262 112 | msgid "Clone task" 113 | msgstr "Копировать задачу" 114 | 115 | #: inc/kanban.class.php:263 116 | msgid "See tasks in progress" 117 | msgstr "Посмотреть задачи в работе" 118 | 119 | #: inc/kanban.class.php:264 120 | msgid "See tasks of" 121 | msgstr "Посмотреть задачу" 122 | 123 | #: inc/kanban.class.php:265 124 | msgid "See all tasks" 125 | msgstr "Посмотреть все задачи" 126 | 127 | #: inc/kanban.class.php:266 128 | msgid "Are you sure you want to archive this task ?" 129 | msgstr "Вы уверены, что хотите заархивировать эту задачу?" 130 | 131 | #: inc/kanban.class.php:267 132 | msgid "Are you sure you want to archive all tasks ?" 133 | msgstr "Вы уверены, что хотите заархивировать все задачи?" 134 | 135 | #: inc/kanban.class.php:268 136 | msgid "Archive this task" 137 | msgstr "Архивировать эту задачу" 138 | 139 | #: inc/kanban.class.php:269 140 | msgid "Update priority of task" 141 | msgstr "Обновить приоритет задачи" 142 | 143 | #: inc/kanban.class.php:270 144 | msgid "Details of task" 145 | msgstr "Детали задачи" 146 | 147 | #: inc/notificationtargettask.class.php:50 148 | msgid "A task has been added" 149 | msgstr "Задача была добавлена" 150 | 151 | #: inc/notificationtargettask.class.php:51 152 | msgid "A task has been updated" 153 | msgstr "Задача была обновлена" 154 | 155 | #: inc/notificationtargettask.class.php:52 156 | msgid "A task has been removed" 157 | msgstr "Задача была удалена" 158 | 159 | #: inc/notificationtargettask.class.php:207 160 | #: inc/notificationtargettask.class.php:251 inc/task.class.php:189 161 | #: inc/task.class.php:486 162 | msgid "Other client" 163 | msgstr "Другой клиент" 164 | 165 | #: inc/notificationtargettask.class.php:259 166 | msgid "At creation, update, removal of a task" 167 | msgstr "При создании, изменении, удалении задачи" 168 | 169 | #: inc/preference.class.php:80 170 | msgid "Context by default" 171 | msgstr "Контекст по умолчанию" 172 | 173 | #: inc/preference.class.php:88 174 | msgid "Automatic refreshing of tasklist" 175 | msgstr "" 176 | 177 | #: inc/preference.class.php:94 178 | msgid "Refresh every " 179 | msgstr "" 180 | 181 | #: inc/preference.class.php:98 182 | msgid "minute(s)" 183 | msgstr "" 184 | 185 | #: inc/profile.class.php:153 inc/profile.class.php:196 186 | msgid "See and update all tasks" 187 | msgstr "Посмотреть и обновить все задачи" 188 | 189 | #: inc/profile.class.php:162 inc/profile.class.php:199 190 | msgid "Configure contexts and statuses" 191 | msgstr "" 192 | 193 | #: inc/stateorder.class.php:96 194 | msgid "States ordering" 195 | msgstr "Упорядочение статусов" 196 | 197 | #: inc/stateorder.class.php:156 198 | msgid "Add states from linked Kanban" 199 | msgstr "" 200 | 201 | #: inc/task.class.php:333 202 | msgid "You cannot archive a task with this state" 203 | msgstr "Вы не можете заархивировать задачу с таким статусом" 204 | 205 | #: inc/task.class.php:457 206 | msgid "Existing client" 207 | msgstr "Существующий клиент" 208 | 209 | #: inc/task.class.php:622 inc/task.class.php:709 inc/task.class.php:985 210 | #: inc/tasktype.class.php:161 211 | msgid "Backlog" 212 | msgstr "Бэклог" 213 | 214 | #: inc/task.class.php:1045 215 | msgctxt "visibility" 216 | msgid "This user" 217 | msgstr "Этот пользователь" 218 | 219 | #: inc/task.class.php:1048 220 | msgctxt "visibility" 221 | msgid "This user and this group" 222 | msgstr "Этот пользователь и эта группа" 223 | 224 | #: inc/task.class.php:1051 225 | msgctxt "visibility" 226 | msgid "All" 227 | msgstr "Все" 228 | 229 | #: inc/task.class.php:1093 230 | msgid "Affect entity for create task" 231 | msgstr "Влияние организации на создание задачи" 232 | 233 | #: inc/ticket.class.php:74 inc/ticket.class.php:183 234 | msgid "Linked task" 235 | msgid_plural "Linked tasks" 236 | msgstr[0] "Связанная задача" 237 | msgstr[1] "Связанные задачи" 238 | msgstr[2] "Связанные задачи" 239 | msgstr[3] "Связанные задачи" 240 | 241 | #: inc/ticket.class.php:227 242 | msgid "No task linked to this ticket yet" 243 | msgstr "Нет связанных с заявкой задач" 244 | 245 | #: inc/ticket.class.php:258 246 | msgid "Link a existant ticket" 247 | msgstr "Связать с существующей заявкой" 248 | 249 | #: inc/ticket.class.php:284 250 | msgid "Linked tickets" 251 | msgstr "Связанные заявки" 252 | 253 | #: inc/typevisibility.class.php:138 254 | msgid "Add a group" 255 | msgstr "Добавить группу" 256 | 257 | #: inc/typevisibility.class.php:179 258 | msgid "Groups allowed to use context" 259 | msgstr "Группы с разрешением использовать контекст" 260 | -------------------------------------------------------------------------------- /public/lib/kanban/js/SearchTokenizer/SearchTokenizer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * --------------------------------------------------------------------- 3 | * 4 | * GLPI - Gestionnaire Libre de Parc Informatique 5 | * 6 | * http://glpi-project.org 7 | * 8 | * @copyright 2015-2024 Teclib' and contributors. 9 | * @copyright 2003-2014 by the INDEPNET Development Team. 10 | * @licence https://www.gnu.org/licenses/gpl-3.0.html 11 | * 12 | * --------------------------------------------------------------------- 13 | * 14 | * LICENSE 15 | * 16 | * This file is part of GLPI. 17 | * 18 | * This program is free software: you can redistribute it and/or modify 19 | * it under the terms of the GNU General Public License as published by 20 | * the Free Software Foundation, either version 3 of the License, or 21 | * (at your option) any later version. 22 | * 23 | * This program is distributed in the hope that it will be useful, 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 | * GNU General Public License for more details. 27 | * 28 | * You should have received a copy of the GNU General Public License 29 | * along with this program. If not, see . 30 | * 31 | * --------------------------------------------------------------------- 32 | */ 33 | 34 | // import SearchToken from "./SearchToken.js"; 35 | // import SearchTokenizerResult from "./SearchTokenizerResult.js"; 36 | 37 | /** 38 | * Inspired by/rebuilt from https://github.com/tatsuya/search-text-tokenizer 39 | */ 40 | class SearchTokenizer { 41 | 42 | /** 43 | * @typedef TagDefinition 44 | * @property {string} description 45 | * @property {string[]|function} autocomplete_values 46 | * @property {string[]} supported_prefixes 47 | */ 48 | 49 | /** 50 | * @typedef TokenizerOptions 51 | * @property {Object.} custom_prefixes Object of custom prefixes as keys and properties. These characters can be located at the start of a token's tag and will be stripped from the token's tag. 52 | * The stripped prefix is then stored in the token's `prefix` property. The properties for the custom prefixes can be unique for the implementation of the tokenizer. 53 | * The only built-in properties are `token_color` which can be used by {@link SearchInput} to change the color of the token, and `label` which can be used by {@link SearchInput} for buttons within suggestions. 54 | */ 55 | 56 | /** 57 | * 58 | * @param {Object.} allowed_tags Tags the tokenizer should recognize 59 | * The object keys are the tag names. Each tag can have multiple properties to store 60 | * additional information such as descriptions. 61 | * @param {boolean} drop_unallowed_tags If true, unallowed tags are ignored. If false, the token is treated as a plain term. 62 | * @param {TokenizerOptions} options Additional tokenizer options 63 | */ 64 | constructor(allowed_tags = {}, drop_unallowed_tags = false, options = {}) { 65 | this.token_pattern = /([^\s"']?\w+:)?("[^"]*"|'[^']*'|[^\s]+)/g; 66 | this.EXCLUSION_PREFIX = '!'; 67 | this.allowed_tags = allowed_tags; 68 | this.drop_unallowed_tags = drop_unallowed_tags; 69 | 70 | this.options = Object.assign({ 71 | custom_prefixes: {}, 72 | }, options); 73 | 74 | // Ignore custom prefixes used by core 75 | delete this.options.custom_prefixes[this.EXCLUSION_PREFIX]; 76 | delete this.options.custom_prefixes['\'']; 77 | delete this.options.custom_prefixes['"']; 78 | } 79 | 80 | /** 81 | * Check if a given tag is allowed by the tokenizer 82 | * @param {string|null} tag 83 | * @return {boolean} 84 | */ 85 | isAllowedTag(tag) { 86 | if (tag === null || tag === undefined) { 87 | return true; 88 | } 89 | const result = Object.keys(this.allowed_tags).length === 0 || (tag in this.allowed_tags); 90 | return result; 91 | } 92 | 93 | clearAutocomplete() { 94 | Object.keys(this.allowed_tags).forEach((k) => { 95 | this.allowed_tags[k].autocomplete_values = []; 96 | }); 97 | } 98 | 99 | setAutocomplete(tag, values) { 100 | if (tag in this.allowed_tags) { 101 | this.allowed_tags[tag].autocomplete_values = values; 102 | } 103 | } 104 | 105 | /** 106 | * Get autocomplete values for a given tag 107 | * @param tag 108 | * @return {string[]} 109 | */ 110 | getAutocomplete(tag) { 111 | let result = []; 112 | if (tag in this.allowed_tags) { 113 | if (typeof this.allowed_tags[tag].autocomplete_values === 'function') { 114 | result = this.allowed_tags[tag].autocomplete_values(); 115 | } else { 116 | result = this.allowed_tags[tag].autocomplete_values; 117 | } 118 | } 119 | return result || []; 120 | } 121 | 122 | /** 123 | * 124 | * @param {string} input 125 | * @returns {SearchTokenizerResult} 126 | */ 127 | tokenize(input) { 128 | input = input || ''; 129 | input = input.trim(); 130 | 131 | const result = new SearchTokenizerResult(); 132 | 133 | let token = null; 134 | let pos = 0; 135 | 136 | while ((token = this.token_pattern.exec(input)) !== null) { 137 | let is_exclusion = false; 138 | let tag = token[1] || null; 139 | let term = token[2].trim(); 140 | 141 | // Tag without the separator 142 | if (tag) { 143 | tag = tag.slice(0, -1); 144 | } 145 | 146 | if (tag === null && term.endsWith(':')) { 147 | tag = term.slice(0, -1); 148 | term = ''; 149 | } 150 | 151 | let token_prefix = null; 152 | // Handle custom prefixes 153 | if (tag && tag.length > 1) { 154 | const custom_prefix = tag.slice(0, 1); 155 | const allowed_prefixes = Object.keys(this.options.custom_prefixes); 156 | if (custom_prefix === this.EXCLUSION_PREFIX) { 157 | is_exclusion = true; 158 | tag = tag.slice(1); 159 | } else { 160 | if (allowed_prefixes.includes(custom_prefix)) { 161 | const new_tag = tag.slice(1); 162 | if (this.allowed_tags[new_tag] && this.allowed_tags[new_tag].supported_prefixes.includes(custom_prefix)) { 163 | token_prefix = custom_prefix; 164 | tag = new_tag; 165 | } 166 | } 167 | } 168 | } 169 | 170 | // Remove exclusion if the tag doesn't support that prefix 171 | if (!this.allowed_tags[tag] || !(this.allowed_tags[tag].supported_prefixes || []).includes(this.EXCLUSION_PREFIX)) { 172 | is_exclusion = false; 173 | } 174 | 175 | term = term || ''; 176 | if (term.length > 0) { 177 | if (/^".+"$/.test(term)) { 178 | term = term.trim().replace(/^"/, '').replace(/"$/, '').trim(); 179 | } 180 | if (/^'.+'$/.test(term)) { 181 | term = term.trim().replace(/^'/, '').replace(/'$/, '').trim(); 182 | } 183 | } 184 | 185 | if (this.isAllowedTag(tag)) { 186 | result.tokens.push(new SearchToken(term, tag, is_exclusion, pos++, token[0], token_prefix)); 187 | } else if (!this.drop_unallowed_tags) { 188 | result.tokens.push(new SearchToken(token[0], null, false, pos++, token[0])); 189 | } 190 | } 191 | 192 | return result; 193 | } 194 | } 195 | window.SearchTokenizer = SearchTokenizer; 196 | -------------------------------------------------------------------------------- /sql/empty-1.4.0.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasks`; 2 | CREATE TABLE `glpi_plugin_tasklists_tasks` 3 | ( 4 | `id` int(11) NOT NULL auto_increment, 5 | `entities_id` int(11) NOT NULL default '0', 6 | `is_recursive` tinyint(1) NOT NULL default '0', 7 | `name` varchar(255) collate utf8_unicode_ci default NULL, 8 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_plugin_tasklists_tasktypes (id)', 9 | `plugin_tasklists_taskstates_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_plugin_tasklists_taskstates (id)', 10 | `priority` int(11) NOT NULL DEFAULT '1', 11 | `visibility` int(11) NOT NULL DEFAULT '1', 12 | `actiontime` int(11) NOT NULL DEFAULT '0', 13 | `percent_done` int(11) NOT NULL DEFAULT '0', 14 | `state` int(11) NOT NULL DEFAULT '1', 15 | `due_date` date default NULL, 16 | `users_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_users (id)', 17 | `groups_id` int(11) NOT NULL default '0' COMMENT 'RELATION to glpi_groups (id)', 18 | `client` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 19 | `comment` text collate utf8_unicode_ci, 20 | `notepad` longtext collate utf8_unicode_ci, 21 | `date_mod` datetime default NULL, 22 | `date_creation` datetime default NULL, 23 | `is_template` smallint(6) NOT NULL default '0', 24 | `template_name` varchar(200) collate utf8_unicode_ci NOT NULL default '', 25 | `is_deleted` tinyint(1) NOT NULL default '0', 26 | `is_archived` tinyint(1) NOT NULL default '0', 27 | PRIMARY KEY (`id`), 28 | KEY `name` (`name`), 29 | KEY `entities_id` (`entities_id`), 30 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 31 | KEY `is_template` (`is_template`), 32 | KEY `users_id` (`users_id`), 33 | KEY `groups_id` (`groups_id`), 34 | KEY `date_mod` (`date_mod`), 35 | KEY `is_deleted` (`is_deleted`), 36 | KEY `is_archived` (`is_archived`) 37 | ) ENGINE = InnoDB 38 | DEFAULT CHARSET = utf8 39 | COLLATE = utf8_unicode_ci; 40 | 41 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasktypes`; 42 | CREATE TABLE `glpi_plugin_tasklists_tasktypes` 43 | ( 44 | `id` int(11) NOT NULL AUTO_INCREMENT, 45 | `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 46 | `entities_id` int(11) NOT NULL DEFAULT '0', 47 | `is_recursive` tinyint(1) NOT NULL DEFAULT '0', 48 | `comment` text COLLATE utf8_unicode_ci, 49 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL DEFAULT '0', 50 | `completename` text COLLATE utf8_unicode_ci, 51 | `level` int(11) NOT NULL DEFAULT '0', 52 | `ancestors_cache` longtext COLLATE utf8_unicode_ci, 53 | `sons_cache` longtext COLLATE utf8_unicode_ci, 54 | PRIMARY KEY (`id`), 55 | KEY `name` (`name`), 56 | KEY `entities_id` (`entities_id`), 57 | KEY `unicity` (`plugin_tasklists_tasktypes_id`, `name`) 58 | ) ENGINE = InnoDB 59 | DEFAULT CHARSET = utf8 60 | COLLATE = utf8_unicode_ci; 61 | 62 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_taskstates`; 63 | CREATE TABLE `glpi_plugin_tasklists_taskstates` 64 | ( 65 | `id` int(11) NOT NULL AUTO_INCREMENT, 66 | `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 67 | `entities_id` int(11) NOT NULL DEFAULT '0', 68 | `is_recursive` tinyint(1) NOT NULL DEFAULT '0', 69 | `is_finished` tinyint(1) NOT NULL DEFAULT '0', 70 | `tasktypes` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 71 | `color` varchar(200) DEFAULT '#CCC' NOT NULL, 72 | `comment` text COLLATE utf8_unicode_ci, 73 | PRIMARY KEY (`id`), 74 | KEY `name` (`name`), 75 | KEY `entities_id` (`entities_id`) 76 | ) ENGINE = InnoDB 77 | DEFAULT CHARSET = utf8 78 | COLLATE = utf8_unicode_ci; 79 | 80 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_stateorders`; 81 | CREATE TABLE `glpi_plugin_tasklists_stateorders` 82 | ( 83 | `id` int(11) NOT NULL auto_increment, -- id 84 | `plugin_tasklists_taskstates_id` int(11) NOT NULL DEFAULT 0, 85 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL DEFAULT 0, 86 | `ranking` int(11) NULL, 87 | PRIMARY KEY (`id`), 88 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 89 | KEY `plugin_tasklists_taskstates_id` (`plugin_tasklists_taskstates_id`) 90 | ) ENGINE = InnoDB 91 | DEFAULT CHARSET = utf8 92 | COLLATE = utf8_unicode_ci; 93 | 94 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_typevisibilities`; 95 | CREATE TABLE `glpi_plugin_tasklists_typevisibilities` 96 | ( 97 | `id` int(11) NOT NULL AUTO_INCREMENT, 98 | `groups_id` int(11) NOT NULL default '0', 99 | `plugin_tasklists_tasktypes_id` int(11) NOT NULL default '0', 100 | PRIMARY KEY (`id`), 101 | KEY `plugin_tasklists_tasktypes_id` (`plugin_tasklists_tasktypes_id`), 102 | KEY `groups_id` (`groups_id`) 103 | ) ENGINE = InnoDB 104 | DEFAULT CHARSET = utf8 105 | COLLATE = utf8_unicode_ci; 106 | 107 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_preferences`; 108 | CREATE TABLE `glpi_plugin_tasklists_preferences` 109 | ( 110 | `id` int(11) NOT NULL COMMENT 'RELATION to glpi_users(id)', 111 | `default_type` int(11) NOT NULL DEFAULT 0, 112 | PRIMARY KEY (`id`) 113 | ) ENGINE = InnoDB 114 | DEFAULT CHARSET = utf8 115 | COLLATE = utf8_unicode_ci; 116 | 117 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tickets`; 118 | CREATE TABLE `glpi_plugin_tasklists_tickets` 119 | ( 120 | `id` int(11) NOT NULL AUTO_INCREMENT, 121 | `tickets_id` int(11) NOT NULL DEFAULT '0', 122 | `plugin_tasklists_tasks_id` int(11) NOT NULL DEFAULT '0', 123 | PRIMARY KEY (`id`), 124 | KEY `plugin_tasklists_tasks_id` (`plugin_tasklists_tasks_id`), 125 | KEY `tickets_id` (`tickets_id`) 126 | ) ENGINE = InnoDB 127 | DEFAULT CHARSET = utf8 128 | COLLATE = utf8_unicode_ci; 129 | 130 | DROP TABLE IF EXISTS `glpi_plugin_tasklists_tasks_comments`; 131 | CREATE TABLE `glpi_plugin_tasklists_tasks_comments` 132 | ( 133 | `id` int(11) NOT NULL AUTO_INCREMENT, 134 | `plugin_tasklists_tasks_id` int(11) NOT NULL, 135 | `users_id` int(11) NOT NULL DEFAULT '0', 136 | `language` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL, 137 | `comment` text COLLATE utf8_unicode_ci NOT NULL, 138 | `parent_comment_id` int(11) DEFAULT NULL, 139 | `date_creation` datetime DEFAULT NULL, 140 | `date_mod` datetime DEFAULT NULL, 141 | PRIMARY KEY (`id`) 142 | ) ENGINE = InnoDB 143 | DEFAULT CHARSET = utf8 144 | COLLATE = utf8_unicode_ci; --------------------------------------------------------------------------------