|
|
|
@ -51,6 +51,7 @@ define([
|
|
|
|
|
|
|
|
|
|
var verbose = function (x) { console.log(x); };
|
|
|
|
|
verbose = function () {}; // comment out to enable verbose logging
|
|
|
|
|
var onRedraw = Util.mkEvent();
|
|
|
|
|
|
|
|
|
|
Messages.kanban_title = "Title"; // XXX
|
|
|
|
|
Messages.kanban_body = "Body"; // XXX
|
|
|
|
@ -60,9 +61,9 @@ define([
|
|
|
|
|
Messages.kanban_tags = "Filter tags"; // XXX
|
|
|
|
|
|
|
|
|
|
// XXX
|
|
|
|
|
// Tag filter:
|
|
|
|
|
// remember tags in padAttribute
|
|
|
|
|
// click on a tag ==> add it to the list
|
|
|
|
|
// Conflicts
|
|
|
|
|
// use cursor channel to tell others what you are editing
|
|
|
|
|
// add outline + warning inside the modal?
|
|
|
|
|
|
|
|
|
|
var setValueAndCursor = function (input, val, _cursor) {
|
|
|
|
|
if (!input) { return; }
|
|
|
|
@ -259,7 +260,7 @@ define([
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var button = [{
|
|
|
|
|
className: 'danger', // XXX align left
|
|
|
|
|
className: 'danger left',
|
|
|
|
|
name: Messages.kanban_delete,
|
|
|
|
|
onClick: function () {
|
|
|
|
|
var boards = kanban.options.boards || {};
|
|
|
|
@ -432,6 +433,9 @@ define([
|
|
|
|
|
widthBoard: '300px',
|
|
|
|
|
buttonContent: '❌',
|
|
|
|
|
readOnly: framework.isReadOnly(),
|
|
|
|
|
refresh: function () {
|
|
|
|
|
onRedraw.fire();
|
|
|
|
|
},
|
|
|
|
|
onChange: function () {
|
|
|
|
|
verbose("Board object has changed");
|
|
|
|
|
framework.localChange();
|
|
|
|
@ -607,7 +611,7 @@ define([
|
|
|
|
|
}
|
|
|
|
|
kanban.inEditMode = "new";
|
|
|
|
|
// create a form to enter element
|
|
|
|
|
var boardId = $(el.parentNode.parentNode).attr("data-id");
|
|
|
|
|
var boardId = $(el).closest('.kanban-board').attr("data-id");
|
|
|
|
|
var $item = $('<div>', {'class': 'kanban-item new-item'});
|
|
|
|
|
var $input = getInput().val(name).appendTo($item);
|
|
|
|
|
kanban.addForm(boardId, $item[0]);
|
|
|
|
@ -620,10 +624,14 @@ define([
|
|
|
|
|
kanban.inEditMode = false;
|
|
|
|
|
if (!$input.val()) { return; }
|
|
|
|
|
var id = Util.createRandomInteger();
|
|
|
|
|
kanban.addElement(boardId, {
|
|
|
|
|
var item = {
|
|
|
|
|
"id": id,
|
|
|
|
|
"title": $input.val(),
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
if (kanban.options.tags && kanban.options.tags.length) {
|
|
|
|
|
item.tags = kanban.options.tags;
|
|
|
|
|
}
|
|
|
|
|
kanban.addElement(boardId, item);
|
|
|
|
|
};
|
|
|
|
|
$input.blur(save);
|
|
|
|
|
$input.keydown(function (e) {
|
|
|
|
@ -673,6 +681,7 @@ define([
|
|
|
|
|
|
|
|
|
|
var $container = $('#cp-app-kanban-content');
|
|
|
|
|
var addControls = function () {
|
|
|
|
|
// Quick or normal mode
|
|
|
|
|
var small = h('span.cp-kanban-view-small.fa.fa-minus');
|
|
|
|
|
var big = h('span.cp-kanban-view.fa.fa-bars');
|
|
|
|
|
$(small).click(function () {
|
|
|
|
@ -686,42 +695,108 @@ define([
|
|
|
|
|
framework._.sfCommon.setPadAttribute('quickMode', false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Tags filter
|
|
|
|
|
var existing = getExistingTags(kanban.options.boards);
|
|
|
|
|
var input = UI.dialog.textInput();
|
|
|
|
|
var list = h('div.cp-kanban-filterTags-list');
|
|
|
|
|
var reset = h('i.cp-kanban-filterTags-reset.fa.fa-times');
|
|
|
|
|
var tags = h('div.cp-kanban-filterTags', [
|
|
|
|
|
Messages.kanban_tags,
|
|
|
|
|
input
|
|
|
|
|
h('span.cp-kanban-filterTags-name', Messages.kanban_tags),
|
|
|
|
|
reset,
|
|
|
|
|
list
|
|
|
|
|
]);
|
|
|
|
|
var field = UI.tokenField(input, existing).preventDuplicates(function (val) {
|
|
|
|
|
UI.warn(Messages._getKey('tags_duplicate', [val]));
|
|
|
|
|
});
|
|
|
|
|
field.setTokens([]);
|
|
|
|
|
var $reset = $(reset);
|
|
|
|
|
var $list = $(list);
|
|
|
|
|
|
|
|
|
|
var getTags = function () {
|
|
|
|
|
return $list.find('span.active').map(function () {
|
|
|
|
|
return $(this).data('tag');
|
|
|
|
|
}).get();
|
|
|
|
|
};
|
|
|
|
|
var commitTags = function () {
|
|
|
|
|
var t = field.getTokens();
|
|
|
|
|
var t = getTags();
|
|
|
|
|
if (t.length) {
|
|
|
|
|
$reset.show();
|
|
|
|
|
} else {
|
|
|
|
|
$reset.hide();
|
|
|
|
|
}
|
|
|
|
|
framework._.sfCommon.setPadAttribute('tagsFilter', t);
|
|
|
|
|
kanban.options.tags = t;
|
|
|
|
|
kanban.setBoards(kanban.options.boards);
|
|
|
|
|
addEditItemButton(framework, kanban);
|
|
|
|
|
};
|
|
|
|
|
field.tokenfield.on('tokenfield:createdtoken', commitTags);
|
|
|
|
|
field.tokenfield.on('tokenfield:editedoken', commitTags);
|
|
|
|
|
field.tokenfield.on('tokenfield:removedtoken', commitTags);
|
|
|
|
|
|
|
|
|
|
var redrawList = function (allTags) {
|
|
|
|
|
if (!Array.isArray(allTags)) { return; }
|
|
|
|
|
$list.empty();
|
|
|
|
|
allTags.forEach(function (t) {
|
|
|
|
|
var tag;
|
|
|
|
|
$list.append(tag = h('span', {
|
|
|
|
|
'data-tag': t
|
|
|
|
|
}, t));
|
|
|
|
|
var $tag = $(tag).click(function () {
|
|
|
|
|
if ($tag.hasClass('active')) {
|
|
|
|
|
$tag.removeClass('active');
|
|
|
|
|
} else {
|
|
|
|
|
$tag.addClass('active');
|
|
|
|
|
}
|
|
|
|
|
commitTags();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
redrawList(existing);
|
|
|
|
|
|
|
|
|
|
var setTags = function (tags) {
|
|
|
|
|
$list.find('span').removeClass('active');
|
|
|
|
|
if (!Array.isArray(tags)) { return; }
|
|
|
|
|
tags.forEach(function (t, i) {
|
|
|
|
|
if (existing.indexOf(t) === -1) {
|
|
|
|
|
// This tag doesn't exist anymore
|
|
|
|
|
tags.splice(i, 1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
$list.find('span').filter(function () {
|
|
|
|
|
return $(this).data('tag') === t;
|
|
|
|
|
}).addClass('active');
|
|
|
|
|
});
|
|
|
|
|
framework._.sfCommon.setPadAttribute('tagsFilter', tags);
|
|
|
|
|
};
|
|
|
|
|
$reset.hide().click(function () {
|
|
|
|
|
setTags([]);
|
|
|
|
|
commitTags();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var container = h('div#cp-kanban-controls', [
|
|
|
|
|
tags, // XXX
|
|
|
|
|
tags,
|
|
|
|
|
h('div.cp-kanban-changeView', [
|
|
|
|
|
small,
|
|
|
|
|
big
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
$container.prepend(container);
|
|
|
|
|
return container;
|
|
|
|
|
|
|
|
|
|
onRedraw.reg(function () {
|
|
|
|
|
// Redraw if new tags have been added to items
|
|
|
|
|
var old = Sortify(existing);
|
|
|
|
|
var t = getTags();
|
|
|
|
|
existing = getExistingTags(kanban.options.boards);
|
|
|
|
|
if (old === Sortify(existing)) { return; } // No change
|
|
|
|
|
// New tags:
|
|
|
|
|
redrawList(existing);
|
|
|
|
|
setTags(t);
|
|
|
|
|
});
|
|
|
|
|
framework._.sfCommon.getPadAttribute('tagsFilter', function (err, res) {
|
|
|
|
|
if (!err && Array.isArray(res)) {
|
|
|
|
|
setTags(res);
|
|
|
|
|
commitTags();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
framework._.sfCommon.getPadAttribute('quickMode', function (err, res) {
|
|
|
|
|
if (!err && res) {
|
|
|
|
|
$container.addClass('cp-kanban-quick');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
addControls();
|
|
|
|
|
framework._.sfCommon.getPadAttribute('quickMode', function (err, res) {
|
|
|
|
|
if (!err && res) {
|
|
|
|
|
$container.addClass('cp-kanban-quick');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return kanban;
|
|
|
|
|
};
|
|
|
|
@ -795,7 +870,6 @@ define([
|
|
|
|
|
var end = input.selectionEnd;
|
|
|
|
|
|
|
|
|
|
var json = kanban.getBoardJSON(id) || kanban.getItemJSON(id);
|
|
|
|
|
// XXX only title for now...
|
|
|
|
|
var oldVal = json && json.title;
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|