KB.component('task-move-position', function (containerElement, options) { function getSelectedValue(id) { var element = KB.dom(document).find('#' + id); if (element) { return parseInt(element.options[element.selectedIndex].value); } return null; } function getSwimlaneId() { var swimlaneId = getSelectedValue('form-swimlanes'); return swimlaneId === null ? options.board[0].id : swimlaneId; } function getColumnId() { var columnId = getSelectedValue('form-columns'); return columnId === null ? options.board[0].columns[0].id : columnId; } function getPosition() { var position = getSelectedValue('form-position'); return position === null ? 1 : position; } function getPositionChoice() { var element = KB.find('input[name=positionChoice]:checked'); if (element) { return element.value; } return 'before'; } function onSwimlaneChanged() { var columnSelect = KB.dom(document).find('#form-columns'); KB.dom(columnSelect).replace(buildColumnSelect()); var taskSection = KB.dom(document).find('#form-tasks'); KB.dom(taskSection).replace(buildTasks()); } function onColumnChanged() { var taskSection = KB.dom(document).find('#form-tasks'); KB.dom(taskSection).replace(buildTasks()); } function onError(message) { KB.trigger('modal.stop'); KB.find('#message-container') .replace(KB.dom('div') .attr('id', 'message-container') .attr('class', 'alert alert-error') .text(message) .build() ); } function onSubmit() { var position = getPosition(); var positionChoice = getPositionChoice(); if (positionChoice === 'after') { position++; } KB.find('#message-container').replace(KB.dom('div').attr('id', 'message-container').build()); KB.http.postJson(options.saveUrl, { "column_id": getColumnId(), "swimlane_id": getSwimlaneId(), "position": position }).error(function (response) { if (response) { onError(response.message); } }); } function buildSwimlaneSelect() { var swimlanes = []; options.board.forEach(function(swimlane) { swimlanes.push({'value': swimlane.id, 'text': swimlane.name}); }); return KB.dom('select') .attr('id', 'form-swimlanes') .change(onSwimlaneChanged) .for('option', swimlanes) .build(); } function buildColumnSelect() { var columns = []; var swimlaneId = getSwimlaneId(); options.board.forEach(function(swimlane) { if (swimlaneId === swimlane.id) { swimlane.columns.forEach(function(column) { columns.push({'value': column.id, 'text': column.title}); }); } }); return KB.dom('select') .attr('id', 'form-columns') .change(onColumnChanged) .for('option', columns) .build(); } function buildTasks() { var tasks = []; var swimlaneId = getSwimlaneId(); var columnId = getColumnId(); var container = KB.dom('div').attr('id', 'form-tasks'); options.board.forEach(function (swimlane) { if (swimlaneId === swimlane.id) { swimlane.columns.forEach(function (column) { if (columnId === column.id) { column.tasks.forEach(function (task) { tasks.push({'value': task.position, 'text': '#' + task.id + ' - ' + task.title}); }); } }); } }); if (tasks.length > 0) { container .add(KB.html.label(options.positionLabel, 'form-position')) .add(KB.dom('select').attr('id', 'form-position').for('option', tasks).build()) .add(KB.html.radio(options.beforeLabel, 'positionChoice', 'before')) .add(KB.html.radio(options.afterLabel, 'positionChoice', 'after')) ; } return container.build(); } this.render = function () { KB.on('modal.submit', onSubmit); KB.on('modal.close', function () { KB.removeListener('modal.submit', onSubmit); }); var form = KB.dom('div') .add(KB.dom('div').attr('id', 'message-container').build()) .add(KB.html.label(options.swimlaneLabel, 'form-swimlanes')) .add(buildSwimlaneSelect()) .add(KB.html.label(options.columnLabel, 'form-columns')) .add(buildColumnSelect()) .add(buildTasks()) .build(); containerElement.appendChild(form); }; });