summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2015-03-12 21:21:24 -0400
committerFrederic Guillot <fred@kanboard.net>2015-03-12 21:21:24 -0400
commit925ede9b48bef67739d26f0d0a394342f2d8edf0 (patch)
treed2ce47cb3793f8e64831ff7e04b3cddb35dcc498
parentac19e36b55b566f61d750e801134396fd4d3fada (diff)
parentb747b9750b697b863fcadbbbeb0ed94220e57961 (diff)
Merge and improve pull-request #704
-rw-r--r--app/Controller/Task.php1
-rw-r--r--app/Controller/Tasklink.php16
-rw-r--r--app/Model/TaskLink.php2
-rw-r--r--app/Template/board/task_menu.php1
-rw-r--r--app/Template/task/show.php2
-rw-r--r--app/Template/tasklink/create.php8
-rw-r--r--app/Template/tasklink/show.php22
-rw-r--r--assets/css/app.css70
-rw-r--r--assets/css/src/task.css2
-rw-r--r--assets/js/app.js4
-rw-r--r--assets/js/src/base.js15
-rw-r--r--assets/js/src/task.js22
-rwxr-xr-xscripts/make-assets.sh2
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"