Skip to content

Commit

Permalink
changes from master, fix card DND
Browse files Browse the repository at this point in the history
  • Loading branch information
erost committed Aug 12, 2016
1 parent 4930e44 commit 5adedf5
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 108 deletions.
14 changes: 7 additions & 7 deletions src/main/webapp/app/components/board/column/board-column.html
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,13 @@
</div>
</div>
<div class="lvg-board-column__content-wrapper"
data-ng-show="boardColumnCtrl.loaded"
lvg-dnd="boardColumnCtrl.cardsInColumn"
lvg-dnd-drop="boardColumnCtrl.dropCard($index)"
lvg-dnd-dragstart="boardColumnCtrl.dragStartCard($item)"
lvg-dnd-dragend="boardColumnCtrl.dragEndCard()"
lvg-dnd-opts="{group: 'card', animation: 0}">
<div class="lvg-board-column__content">
data-ng-show="boardColumnCtrl.loaded">
<div class="lvg-board-column__content"
lvg-dnd="boardColumnCtrl.cardsInColumn"
lvg-dnd-drop="boardColumnCtrl.dropCard($index)"
lvg-dnd-dragstart="boardColumnCtrl.dragStartCard($item)"
lvg-dnd-dragend="boardColumnCtrl.dragEndCard()"
lvg-dnd-opts="{group: 'card', animation: 0}">
<lvg-card-fragment-v2
ng-repeat="card in boardColumnCtrl.cardsInColumn | filter : boardColumnCtrl.searchFilter.cardFilter track by (card.hash+boardColumnCtrl.metadataRef().hash)"
view="board"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,63 @@
'use strict';

angular.module('lavagna.components').component('lvgCardFragmentV2DataInfo', {
template: '<div class="card-data"><ul class="data-info"></ul></div>',
require : {
lvgCardFragmentV2 : '^lvgCardFragmentV2'
},
controller: ['$filter', '$element', '$window', '$mdIcon', lvgCardFragmentV2DataInfoCtrl]
controller: ['$filter', '$element', '$window', '$mdIcon', '$state', '$rootScope', 'UserCache', 'CardCache', lvgCardFragmentV2DataInfoCtrl]
})



function lvgCardFragmentV2DataInfoCtrl($filter, $element, $window, $mdIcon) {
function lvgCardFragmentV2DataInfoCtrl($filter, $element, $window, $mdIcon, $state, $rootScope, UserCache, CardCache) {
const ctrl = this;

const ulElement = $element[0].querySelector('ul.data-info');

var card;
var projectMetadata;
var notClosed;

var listeners = [];

ctrl.$onInit = function lvgCardFragmentV2DataInfoCtrlOnInit() {
card = ctrl.lvgCardFragmentV2.card;
projectMetadata = ctrl.lvgCardFragmentV2.projectMetadata;
notClosed = card.columnDefinition !== 'CLOSED';
}

ctrl.$postLink = function lvgCardFragmentV2DataInfoCtrlPostLink() {
handleComment();
handleActionList();
handleFiles();
handleDueDate();
handleMilestone();
// metadata
const liComment = handleComment();
const liActionList = handleActionList();
const liFiles = handleFiles();
const liDueDate = handleDueDate();
const liMilestone = handleMilestone();
//

if(liComment || liActionList || liFiles || liDueDate || liMilestone) {
const divWrapper = angular.element(createElem('div')).addClass('card-data')[0];
const ul = angular.element(createElem('ul')).addClass('data-info')[0];
divWrapper.appendChild(ul);
$element[0].appendChild(divWrapper);
appendIfNotNull(ul, liComment);
appendIfNotNull(ul, liActionList);
appendIfNotNull(ul, liFiles);
appendIfNotNull(ul, liDueDate);
appendIfNotNull(ul, liMilestone);
}

handleAssigned();

handleLabels();
}

ctrl.$onDestroy = function lvgCardFragmentV2DataInfoCtrlOnDestroy() {
for(var i = 0; i < listeners.length; i++) {
listeners[i]();
}
}

function appendIfNotNull(parent, child) {
if(child) {
parent.appendChild(child);
}
}

//
Expand All @@ -52,21 +79,21 @@

function handleComment() {
if(!(card.counts && card.counts['COMMENT'] && card.counts['COMMENT'].count > 0)) {
return;
return null;
}

const li = createElem('li');

appendIconAndText(li, 'comment', card.counts['COMMENT'].count);
ulElement.appendChild(li);
return li;
}

function handleActionList() {

const hasActionListWithItems = hasCountGreaterThanZero('ACTION_CHECKED') || hasCountGreaterThanZero('ACTION_UNCHECKED');

if(!hasActionListWithItems) {
return;
return null;
}

const checkedCount = getCountOrZero('ACTION_CHECKED');
Expand All @@ -77,15 +104,16 @@
const $li = angular.element(li);

const counts = card.counts;
if(counts['ACTION_CHECKED'].count == counts['ACTION_CHECKED'].count + counts['ACTION_UNCHECKED'].count) {

if(checkedCount > 0 && uncheckedCount == 0) {
$li.addClass('lvg-action-full');
}
if(card.columnDefinition == 'CLOSED' && counts['ACTION_CHECKED'].count != counts['ACTION_CHECKED'].count + counts['ACTION_UNCHECKED'].count) {
if(card.columnDefinition == 'CLOSED' && uncheckedCount > 0) {
$li.addClass('lvg-action-not-done');
}

appendIconAndText(li, 'list', actionItemsSummary);
ulElement.appendChild(li);
return li;
}


Expand All @@ -94,22 +122,22 @@
function handleFiles() {
const hasFiles = hasCountGreaterThanZero('FILE');
if(!hasFiles) {
return;
return null;
}

const filesCount = hasFiles ? getCountOrZero('FILE') : '';
const li = createElem('li');

appendIconAndText(li, 'file', filesCount);

ulElement.appendChild(li);
return li;
}

function handleDueDate() {
const dueDateLabels = filterSystemLabelByName('DUE_DATE');
const hasDueDateLabel = dueDateLabels.length == 1;
if(!hasDueDateLabel) {
return;
return null;
}

const dueDateLabel = dueDateLabels[0];
Expand All @@ -130,18 +158,16 @@
const value = dueDateLabel.value || dueDateLabel;

appendIconAndText(li, 'clock', $filter('date')(value.valueTimestamp, 'dd.MM.yyyy'));
ulElement.appendChild(li);
return li;
}

function handleMilestone() {

const milestoneLabels = filterSystemLabelByName('MILESTONE');
const hasMilestoneLabel = milestoneLabels.length === 1;



if(!hasMilestoneLabel) {
return;
return null;
}

var milestoneLabel = '';
Expand Down Expand Up @@ -173,7 +199,87 @@
addDueDateClasses($li, milestoneClasses);

appendIconAndText(li, 'milestone', projectMetadata.labelListValues[milestoneLabel.labelValueList].value);
ulElement.appendChild(li);
return li;
}

//------------
function handleAssigned() {
const assignedLabels = filterSystemLabelByName('ASSIGNED');
if(assignedLabels.length === 0) {
return;
}

const divWrapper = angular.element(createElem('div')).addClass('card-info')[0];
const ul = angular.element(createElem('ul')).addClass('assigned-users')[0];
divWrapper.appendChild(ul);
for(var i = 0; i < assignedLabels.length; i++) {
const userId = assignedLabels[i].value.valueUser;
const a = handleUser(userId);
const li = angular.element(createElem('li')).addClass('assigned-user')[0];
li.appendChild(a);
ul.appendChild(li);
}
$element[0].appendChild(divWrapper);
}
//------------
const labelBackgroundClass = $filter('labelBackgroundClass');
const labelBackground = $filter('labelBackground');
function handleLabels() {
const userCreatedLabels = $filter('filter')(card.labels, {labelDomain:'USER'});
if(userCreatedLabels.length === 0) {
return;
}

const divWrapper = angular.element(createElem('div')).addClass('card-labels')[0];
const ul = angular.element(createElem('ul')).addClass('labels')[0];
divWrapper.appendChild(ul);
for(var i = 0; i < userCreatedLabels.length; i++) {
const value = userCreatedLabels[i];
const bg = labelBackground(projectMetadata.labels[value.labelId].color);


//
const addSeparator = (value.labelValueType || value.type) !== 'NULL';
const name = projectMetadata.labels[value.labelId].name;
var nameAndSeparator = name + (addSeparator ? ': ' : '' );
var userOrCardLink = null;
switch(value.labelValueType) {
case 'NULL':
break;
case 'STRING':
nameAndSeparator += ' ' + value.value.valueString;
break;
case 'INT':
nameAndSeparator += ' ' + value.value.valueInt;
break;
case 'LIST':
nameAndSeparator += ' ' + projectMetadata.labelListValues[value.value.valueList].value
break;
case 'TIMESTAMP':
nameAndSeparator += ' ' + $filter('date')(value.value.valueTimestamp, 'dd.MM.yyyy');
break;
case 'USER':
userOrCardLink = handleUser(value.value.valueUser);
break;
case 'CARD':
userOrCardLink = handleCard(value.value.valueCard);
break;
}

//
const li = angular.element(createElem('li'))
.addClass('lavagna-label')
.addClass('lavagna-label-no-controls')
.addClass(labelBackgroundClass(projectMetadata.labels[value.labelId].color))
.attr('style', 'background-color:' + bg['background-color'])
.text(nameAndSeparator)[0];
if(userOrCardLink) {
li.appendChild(userOrCardLink);
}

ul.appendChild(li);
}
$element[0].appendChild(divWrapper);
}

//------------
Expand All @@ -191,6 +297,54 @@
function createElem(name) {
return $window.document.createElement(name);
}

//-----------

function handleUser(userId) {
const a = createElem('a');
UserCache.user(userId).then(function (user) {
const element = angular.element(a);
element.attr('href', $state.href('user.dashboard', {provider: user.provider, username: user.username}));
element.text($filter('formatUser')(user));
if (!user.enabled) {
element.addClass('user-disabled');
}
});
return a;
}


function handleCard(cardId) {

const a = createElem('a');


CardCache.card(cardId).then(function (card) {
const element = angular.element(a);

a.textContent = card.boardShortName + '-' + card.sequence;
element.attr('href', $state.href('board.card', {projectName: card.projectShortName, shortName: card.boardShortName, seqNr: card.sequence}));

updateCardClass(card, element);

const toDismiss = $rootScope.$on('refreshCardCache-' + cardId, function () {
CardCache.card(cardId).then(function (card) {
updateCardClass(card, element);
});
});
listeners.push(toDismiss);
});

return a;
}
}

function updateCardClass(card, element) {
if (card.columnDefinition != 'CLOSED') {
element.removeClass('lavagna-closed-card');
} else {
element.addClass('lavagna-closed-card');
}
}

function addDueDateClasses($li, classes) {
Expand All @@ -204,6 +358,4 @@
$li.addClass('lvg-due-date-past')
}
}


})();
Loading

0 comments on commit 5adedf5

Please sign in to comment.