diff options
author | Frederic Guillot <fred@kanboard.net> | 2015-03-12 21:21:24 -0400 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2015-03-12 21:21:24 -0400 |
commit | 925ede9b48bef67739d26f0d0a394342f2d8edf0 (patch) | |
tree | d2ce47cb3793f8e64831ff7e04b3cddb35dcc498 | |
parent | ac19e36b55b566f61d750e801134396fd4d3fada (diff) | |
parent | b747b9750b697b863fcadbbbeb0ed94220e57961 (diff) |
Merge and improve pull-request #704
-rw-r--r-- | app/Controller/Task.php | 1 | ||||
-rw-r--r-- | app/Controller/Tasklink.php | 16 | ||||
-rw-r--r-- | app/Model/TaskLink.php | 2 | ||||
-rw-r--r-- | app/Template/board/task_menu.php | 1 | ||||
-rw-r--r-- | app/Template/task/show.php | 2 | ||||
-rw-r--r-- | app/Template/tasklink/create.php | 8 | ||||
-rw-r--r-- | app/Template/tasklink/show.php | 22 | ||||
-rw-r--r-- | assets/css/app.css | 70 | ||||
-rw-r--r-- | assets/css/src/task.css | 2 | ||||
-rw-r--r-- | assets/js/app.js | 4 | ||||
-rw-r--r-- | assets/js/src/base.js | 15 | ||||
-rw-r--r-- | assets/js/src/task.js | 22 | ||||
-rwxr-xr-x | scripts/make-assets.sh | 2 |
13 files changed, 102 insertions, 65 deletions
diff --git a/app/Controller/Task.php b/app/Controller/Task.php index d94c5908..1296204a 100644 --- a/app/Controller/Task.php +++ b/app/Controller/Task.php @@ -75,6 +75,7 @@ class Task extends Base 'links' => $this->taskLink->getLinks($task['id']), 'task' => $task, 'values' => $values, + 'link_label_list' => $this->link->getList(0, false), 'columns_list' => $this->board->getColumnsList($task['project_id']), 'colors_list' => $this->color->getList(), 'date_format' => $this->config->get('application_date_format'), diff --git a/app/Controller/Tasklink.php b/app/Controller/Tasklink.php index 61b7fab8..59ce0433 100644 --- a/app/Controller/Tasklink.php +++ b/app/Controller/Tasklink.php @@ -36,6 +36,7 @@ class Tasklink extends Base public function create(array $values = array(), array $errors = array()) { $task = $this->getTask(); + $ajax = $this->request->isAjax() || $this->request->getIntegerParam('ajax'); if (empty($values)) { $values = array( @@ -43,6 +44,17 @@ class Tasklink extends Base ); } + if ($ajax) { + $this->response->html($this->template->render('tasklink/create', array( + 'values' => $values, + 'errors' => $errors, + 'task' => $task, + 'labels' => $this->link->getList(0, false), + 'title' => t('Add a new link'), + 'ajax' => $ajax, + ))); + } + $this->response->html($this->taskLayout('tasklink/create', array( 'values' => $values, 'errors' => $errors, @@ -61,6 +73,7 @@ class Tasklink extends Base { $task = $this->getTask(); $values = $this->request->getValues(); + $ajax = $this->request->isAjax() || $this->request->getIntegerParam('ajax'); list($valid, $errors) = $this->taskLink->validateCreation($values); @@ -68,6 +81,9 @@ class Tasklink extends Base if ($this->taskLink->create($values['task_id'], $values['opposite_task_id'], $values['link_id'])) { $this->session->flash(t('Link added successfully.')); + if ($ajax) { + $this->response->redirect($this->helper->url('board', 'show', array('project_id' => $task['project_id']))); + } $this->response->redirect($this->helper->url('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])).'#links'); } else { diff --git a/app/Model/TaskLink.php b/app/Model/TaskLink.php index f8e9f99e..62391371 100644 --- a/app/Model/TaskLink.php +++ b/app/Model/TaskLink.php @@ -4,6 +4,7 @@ namespace Model; use SimpleValidator\Validator; use SimpleValidator\Validators; +use PicoDb\Table; /** * TaskLink model @@ -57,6 +58,7 @@ class TaskLink extends Base ->join(Link::TABLE, 'id', 'link_id') ->join(Task::TABLE, 'id', 'opposite_task_id') ->join(Board::TABLE, 'id', 'column_id', Task::TABLE) + ->orderBy(Link::TABLE.'.id ASC, '.Board::TABLE.'.position ASC, '.Task::TABLE.'.is_active DESC, '.Task::TABLE.'.id', Table::SORT_ASC) ->findAll(); } diff --git a/app/Template/board/task_menu.php b/app/Template/board/task_menu.php index bbf12291..35104b66 100644 --- a/app/Template/board/task_menu.php +++ b/app/Template/board/task_menu.php @@ -6,6 +6,7 @@ <li><i class="fa fa-tag"></i> <?= $this->a(t('Change category'), 'board', 'changeCategory', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-popover') ?></li> <li><i class="fa fa-align-left"></i> <?= $this->a(t('Change description'), 'task', 'description', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-popover') ?></li> <li><i class="fa fa-comment-o"></i> <?= $this->a(t('Add a comment'), 'comment', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-popover') ?></li> + <li><i class="fa fa-code-fork"></i> <?= $this->a(t('Add a link'), 'tasklink', 'create', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-popover') ?></li> <li><i class="fa fa-pencil-square-o"></i> <?= $this->a(t('Edit this task'), 'task', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'task-board-popover') ?></li> <li><i class="fa fa-close"></i> <?= $this->a(t('Close this task'), 'task', 'close', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'redirect' => 'board'), false, 'task-board-popover') ?></li> </ul> diff --git a/app/Template/task/show.php b/app/Template/task/show.php index ec930715..50316c9f 100644 --- a/app/Template/task/show.php +++ b/app/Template/task/show.php @@ -1,7 +1,7 @@ <?= $this->render('task/details', array('task' => $task, 'project' => $project)) ?> <?= $this->render('task/time', array('task' => $task, 'values' => $values, 'date_format' => $date_format, 'date_formats' => $date_formats)) ?> <?= $this->render('task/show_description', array('task' => $task)) ?> -<?= $this->render('tasklink/show', array('task' => $task, 'links' => $links)) ?> +<?= $this->render('tasklink/show', array('task' => $task, 'links' => $links, 'link_label_list' => $link_label_list)) ?> <?= $this->render('subtask/show', array('task' => $task, 'subtasks' => $subtasks, 'project' => $project)) ?> <?= $this->render('task/timesheet', array('task' => $task)) ?> <?= $this->render('file/show', array('task' => $task, 'files' => $files, 'images' => $images)) ?> diff --git a/app/Template/tasklink/create.php b/app/Template/tasklink/create.php index fb438cd8..acf9d6d1 100644 --- a/app/Template/tasklink/create.php +++ b/app/Template/tasklink/create.php @@ -2,7 +2,7 @@ <h2><?= t('Add a new link') ?></h2> </div> -<form action="<?= $this->u('tasklink', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> +<form action="<?= $this->u('tasklink', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'ajax' => isset($ajax))) ?>" method="post" autocomplete="off"> <?= $this->formCsrf() ?> <?= $this->formHidden('task_id', $values) ?> @@ -22,6 +22,10 @@ <div class="form-actions"> <input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/> <?= t('or') ?> - <?= $this->a(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?php if (isset($ajax)): ?> + <?= $this->a(t('cancel'), 'board', 'show', array('project_id' => $task['project_id']), false, 'close-popover') ?> + <?php else: ?> + <?= $this->a(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?> + <?php endif ?> </div> </form>
\ No newline at end of file diff --git a/app/Template/tasklink/show.php b/app/Template/tasklink/show.php index a36f89dd..75e3c376 100644 --- a/app/Template/tasklink/show.php +++ b/app/Template/tasklink/show.php @@ -41,4 +41,24 @@ </tr> <?php endforeach ?> </table> -<?php endif ?>
\ No newline at end of file + +<?php if (! isset($not_editable) && isset($link_label_list)): ?> + <form action="<?= $this->u('tasklink', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'])) ?>" method="post" autocomplete="off"> + + <?= $this->formCsrf() ?> + <?= $this->formHidden('task_id', array('task_id' => $task['id'])) ?> + <?= $this->formHidden('opposite_task_id', array()) ?> + + <?= $this->formSelect('link_id', $link_label_list, array(), array()) ?> + + <?= $this->formText( + 'title', + array(), + array(), + array('required', 'data-dst-field="opposite_task_id"', 'data-search-url="'.$this->u('app', 'autocomplete', array('exclude_task_id' => $task['id'])).'"'), + 'task-autocomplete') ?> + + <input type="submit" value="<?= t('Add') ?>" class="btn btn-blue"/> + </form> +<?php endif ?> +<?php endif ?> diff --git a/assets/css/app.css b/assets/css/app.css index 9705b64f..aa846737 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -1077,6 +1077,41 @@ span.task-board-date-overdue { .task-link-closed { text-decoration: line-through; } +.task-show-images { + list-style-type: none; +} +.task-show-images li img { + width: 100%; +} +.task-show-images li .img_container { + width: 250px; + height: 100px; + overflow: hidden; +} +.task-show-images li { + padding: 10px; + overflow: auto; + width: 250px; + min-height: 120px; + display: inline-block; + vertical-align: top; +} +.task-show-images li p{ + padding: 5px; + font-weight: bold; +} +.task-show-images li:hover { + background: #eee; +} +.task-show-image-actions { + margin-left: 5px; +} +.task-show-images li .img_container:hover { + height: 100%; +} +.task-show-file-table { + width: auto; +} /* comments */ .comment { margin-bottom: 20px; @@ -1556,38 +1591,3 @@ td li.dropit-trigger { .task-board .dropit-submenu a:hover { text-decoration: none; } -.task-show-images { - list-style-type: none; -} -.task-show-images li img { - width: 100%; -} -.task-show-images li .img_container { - width: 250px; - height: 100px; - overflow: hidden; -} -.task-show-images li { - padding: 10px; - overflow: auto; - width: 250px; - min-height: 120px; - display: inline-block; - vertical-align: top; -} -.task-show-images li p{ - padding: 5px; - font-weight: bold; -} -.task-show-images li:hover { - background: #eee; -} -.task-show-image-actions { - margin-left: 5px; -} -.task-show-images li .img_container:hover { - height: 100%; -} -.task-show-file-table { - width: auto; -}
\ No newline at end of file diff --git a/assets/css/src/task.css b/assets/css/src/task.css index 39cda76a..946d18d4 100644 --- a/assets/css/src/task.css +++ b/assets/css/src/task.css @@ -253,7 +253,7 @@ span.task-board-date-overdue { } .task-show-images li .img_container { width: 250px; - height: 100px; + height: 100px; overflow: hidden; } .task-show-images li { diff --git a/assets/js/app.js b/assets/js/app.js index 7a3a6c96..d5733ed9 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -142,7 +142,8 @@ return""!=a?"visible"==document[a]:!0},SetStorageItem:function(a,c){"undefined"! c.parent().addClass("form-tab-selected");e.find(".markdown").html(a);e.css("height",f.css("height"));e.css("width",f.css("width"));d.hide();e.show()})},MarkdownWriter:function(a){a.preventDefault();$(this).closest("ul").find("li").removeClass("form-tab-selected");$(this).parent().addClass("form-tab-selected");$(".write-area").show();$(".preview-area").hide()},CheckSession:function(){$(".form-login").length||$.ajax({cache:!1,url:$("body").data("status-url"),statusCode:{401:function(){window.location= $("body").data("login-url")}}})},Init:function(){$("#board-selector").chosen({width:180,no_results_text:$("#board-selector").data("notfound")});$("#board-selector").change(function(){window.location=$(this).attr("data-board-url").replace(/PROJECT_ID/g,$(this).val())});window.setInterval(Kanboard.CheckSession,6E4);Mousetrap.bindGlobal("mod+enter",function(){$("form").submit()});Mousetrap.bind("b",function(a){a.preventDefault();$("#board-selector").trigger("chosen:open")});$(".column-tooltip").tooltip({content:function(){return'<div class="markdown">'+ $(this).attr("title")+"</div>"},position:{my:"left-20 top",at:"center bottom+9",using:function(a,c){$(this).css(a);var b=c.target.left+c.target.width/2-c.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(c.vertical).addClass(0==b?"align-left":"align-right").appendTo(this)}}});$.datepicker.setDefaults($.datepicker.regional[$("body").data("js-lang")]);Kanboard.InitAfterAjax()},InitAfterAjax:function(){$(document).on("click",".popover",Kanboard.Popover);$(".form-date").datepicker({showOtherMonths:!0, -selectOtherMonths:!0,dateFormat:"yy-mm-dd",constrainInput:!1});$("#markdown-preview").click(Kanboard.MarkdownPreview);$("#markdown-write").click(Kanboard.MarkdownWriter);$(".auto-select").focus(function(){$(this).select()});$(".dropit-submenu").hide();$(".dropdown").not(".dropit").dropit({triggerParentEl:"span"})}}}(); +selectOtherMonths:!0,dateFormat:"yy-mm-dd",constrainInput:!1});$("#markdown-preview").click(Kanboard.MarkdownPreview);$("#markdown-write").click(Kanboard.MarkdownWriter);$(".auto-select").focus(function(){$(this).select()});$(".dropit-submenu").hide();$(".dropdown").not(".dropit").dropit({triggerParentEl:"span"});$(".task-autocomplete").length&&($(".task-autocomplete").parent().find("input[type=submit]").attr("disabled","disabled"),$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"), +minLength:2,select:function(a,c){var b=$(".task-autocomplete").data("dst-field");$("input[name="+b+"]").val(c.item.id);$(".task-autocomplete").parent().find("input[type=submit]").removeAttr("disabled")}}))}}}(); Kanboard.Board=function(){function a(a){a.preventDefault();a.stopPropagation();Kanboard.Popover(a,Kanboard.InitAfterAjax)}function c(){Mousetrap.bind("n",function(){Kanboard.OpenPopover($("#board").data("task-creation-url"),Kanboard.InitAfterAjax)});Mousetrap.bind("s",function(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?(e(),Kanboard.SetStorageItem(d(),"collapsed")):(f(),Kanboard.SetStorageItem(d(),"expanded"))});Mousetrap.bind("c",function(){p()})}function b(){$(".filter-expand-link").click(function(a){a.preventDefault(); f();Kanboard.SetStorageItem(d(),"expanded")});$(".filter-collapse-link").click(function(a){a.preventDefault();e();Kanboard.SetStorageItem(d(),"collapsed")});g()}function d(){return"board_stacking_"+$("#board").data("project-id")}function e(){$(".filter-collapse").hide();$(".task-board-collapsed").show();$(".filter-expand").show();$(".task-board-expanded").hide()}function f(){$(".filter-collapse").show();$(".task-board-collapsed").hide();$(".filter-expand").hide();$(".task-board-expanded").show()} function g(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?f():e()}function k(){$(".column").sortable({delay:300,distance:5,connectWith:".column",placeholder:"draggable-placeholder",stop:function(a,b){q(b.item.attr("data-task-id"),b.item.parent().attr("data-column-id"),b.item.index()+1,b.item.parent().attr("data-swimlane-id"))}});$("#board").on("click",".task-board-popover",a);$("#board").on("click",".task-board",function(){window.location=$(this).data("task-url")});$(".task-board-tooltip").tooltip({track:!1, @@ -163,7 +164,6 @@ Kanboard.Analytic=function(){jQuery(document).ready(function(){Kanboard.Exists(" Kanboard.Analytic.CFD=function(){return{Init:function(){jQuery.getJSON($("#chart").attr("data-url"),function(a){var c=a.labels,b=a.columns,d=a.metrics;a=[];for(var e=0;e<d.length;e++){var f={};f[c.column]=d[e].column_title;f[c.day]=d[e].day;f[c.total]=d[e].total;a.push(f)}d=dimple.newSvg("#chart","100%",380);a=new dimple.chart(d,a);a.addCategoryAxis("x",c.day).addOrderRule("Date");a.addMeasureAxis("y",c.total);a.addSeries(c.column,dimple.plot.area).addOrderRule(b.reverse());a.addLegend(10,10,500, 30,"left");a.draw()})}}}();Kanboard.Analytic.TaskRepartition=function(){return{Init:function(){jQuery.getJSON($("#chart").attr("data-url"),function(a){var c=a.labels,b=a.metrics;a=[];for(var d=0;d<b.length;d++){var e={};e[c.nb_tasks]=b[d].nb_tasks;e[c.column_title]=b[d].column_title;a.push(e)}b=dimple.newSvg("#chart","100%",350);a=new dimple.chart(b,a);a.addMeasureAxis("p",c.nb_tasks);a.addSeries(c.column_title,dimple.plot.pie).innerRadius="50%";a.addLegend(0,0,100,"100%","left");a.draw()})}}}(); Kanboard.Analytic.UserRepartition=function(){return{Init:function(){jQuery.getJSON($("#chart").attr("data-url"),function(a){var c=a.labels,b=a.metrics;a=[];for(var d=0;d<b.length;d++){var e={};e[c.nb_tasks]=b[d].nb_tasks;e[c.user]=b[d].user;a.push(e)}b=dimple.newSvg("#chart","100%",350);a=new dimple.chart(b,a);a.addMeasureAxis("p",c.nb_tasks);a.addSeries(c.user,dimple.plot.pie).innerRadius="50%";a.addLegend(0,0,100,"100%","left");a.draw()})}}}(); -Kanboard.Task=function(){jQuery(document).ready(function(){$(".task-autocomplete").length&&($("input[type=submit]").attr("disabled","disabled"),$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"),minLength:2,select:function(a,c){var b=$(".task-autocomplete").data("dst-field");$("input[name="+b+"]").val(c.item.id);$("input[type=submit]").removeAttr("disabled")}}))})}(); Kanboard.Swimlane=function(){function a(a){$(".swimlane-row-"+a).css("display","none");$(".show-icon-swimlane-"+a).css("display","inline");$(".hide-icon-swimlane-"+a).css("display","none")}function c(){var a="hidden_swimlanes_"+$("#board").data("project-id");return JSON.parse(Kanboard.GetStorageItem(a))||[]}jQuery(document).ajaxComplete(function(){c().map(function(b){a(b)})});jQuery(document).ready(function(){c().map(function(b){a(b)})});jQuery(document).on("click",".board-swimlane-toggle",function(b){b.preventDefault(); b=$(this).data("swimlane-id");if(-1<c().indexOf(b)){var d="hidden_swimlanes_"+$("#board").data("project-id"),e=JSON.parse(Kanboard.GetStorageItem(d))||[],f=e.indexOf(b);-1<f&&e.splice(f,1);Kanboard.SetStorageItem(d,JSON.stringify(e));$(".swimlane-row-"+b).css("display","table-row");$(".show-icon-swimlane-"+b).css("display","none");$(".hide-icon-swimlane-"+b).css("display","inline")}else d="hidden_swimlanes_"+$("#board").data("project-id"),e=JSON.parse(Kanboard.GetStorageItem(d))||[],e.push(b),Kanboard.SetStorageItem(d, JSON.stringify(e)),a(b)})}(); diff --git a/assets/js/src/base.js b/assets/js/src/base.js index 6e92eb31..05846ab8 100644 --- a/assets/js/src/base.js +++ b/assets/js/src/base.js @@ -242,6 +242,21 @@ var Kanboard = (function() { // Dropdown $(".dropit-submenu").hide(); $('.dropdown').not(".dropit").dropit({ triggerParentEl : "span" }); + + if ($(".task-autocomplete").length) { + $(".task-autocomplete").parent().find("input[type=submit]").attr('disabled','disabled'); + + $(".task-autocomplete").autocomplete({ + source: $(".task-autocomplete").data("search-url"), + minLength: 2, + select: function(event, ui) { + var field = $(".task-autocomplete").data("dst-field"); + $("input[name=" + field + "]").val(ui.item.id); + + $(".task-autocomplete").parent().find("input[type=submit]").removeAttr('disabled'); + } + }); + } } }; diff --git a/assets/js/src/task.js b/assets/js/src/task.js deleted file mode 100644 index 2caf81cc..00000000 --- a/assets/js/src/task.js +++ /dev/null @@ -1,22 +0,0 @@ -Kanboard.Task = (function() { - - jQuery(document).ready(function() { - - if ($(".task-autocomplete").length) { - - $("input[type=submit]").attr('disabled','disabled'); - - $(".task-autocomplete").autocomplete({ - source: $(".task-autocomplete").data("search-url"), - minLength: 2, - select: function(event, ui) { - var field = $(".task-autocomplete").data("dst-field"); - $("input[name=" + field + "]").val(ui.item.id); - - $("input[type=submit]").removeAttr('disabled'); - } - }); - } - }); - -})(); diff --git a/scripts/make-assets.sh b/scripts/make-assets.sh index 6fe867bb..4dce7245 100755 --- a/scripts/make-assets.sh +++ b/scripts/make-assets.sh @@ -3,7 +3,7 @@ app_css="base links title table form button alert tooltip header board task comment subtask markdown listing activity dashboard pagination popover confirm sidebar responsive dropdown" vendor_css="jquery-ui.min chosen.min fullcalendar.min font-awesome.min" -app_js="base board calendar analytic task swimlane dashboard" +app_js="base board calendar analytic swimlane dashboard" vendor_js="jquery-1.11.1.min jquery-ui.min jquery.ui.touch-punch.min chosen.jquery.min dropit.min moment.min fullcalendar.min mousetrap.min mousetrap-global-bind.min app.min" lang_js="da de es fi fr hu it ja pl pt-br ru sv th zh-cn tr" |