Merge pull request #113 from kiswa/master

Merge master into demo
This commit is contained in:
Matthew Ross 2014-12-05 08:59:58 -05:00
commit dd0597e18d
13 changed files with 101 additions and 40 deletions

16
VERSION
View File

@ -1,10 +1,12 @@
v0.2.6
v0.2.7
Changelog
* Settings Updates
* Choose to hide items on filter
* Choose boards when creating/editing a user
* Comments can be edited
* Dates show up on comments and attachments without reload
* Opening login page redirects to boards if a valid token is found
* Additional way to dismiss Activity Log in Settings
* Image attachments resize to fit preview pane
* Uploaded files show username immediately
* Items can be moved to collapsed columns with new context menu item
* Automatic actions bugfix.
* The color picker has a pre-defined palette to choose from
* Edit Board Columns and Categories input box bugfix

View File

@ -496,6 +496,9 @@ p.detail {
.list-group-item.small {
padding: 3px;
}
.list-group.editable > .list-group-item {
overflow: hidden;
}
td > .list-group {
margin: 0;
padding: 0;
@ -572,6 +575,10 @@ input.custom-inline {
}
/* #FilesPage */
.files-wrapper {
height: 100%;
}
.files-widget {
border: 1px solid rgba(51,51,51,.2);
border-radius: 5px;
@ -580,6 +587,10 @@ input.custom-inline {
height: 100%;
}
.files-widget .widget-content {
height: 90%;
}
.files-widget .small.pull-right {
margin-top: .3em;
}
@ -593,7 +604,6 @@ input.custom-inline {
border: 1px solid rgba(51,51,51,.3);
width: 100%;
height: 100%;
min-height: 500px;
}
/* #3rdParty */
@ -633,6 +643,9 @@ input.custom-inline {
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.sp-container {
width: 202px;
}
.sp-disabled {
background-color: #eee;
}
@ -650,6 +663,10 @@ input.custom-inline {
.sp-cf:before, .sp-cf:after {
display: none !important;
}
.sp-palette-container {
border: none;
padding-bottom: 290px;
}
/* jQueryUI Datepicker */
.ui-datepicker {
border: 1px solid rgba(51,51,51,.5);

View File

@ -53,7 +53,7 @@ function($routeProvider, $httpProvider) {
// Custom handlers for route authentication and rejection of invalid board id
taskBoard.run(['$rootScope', '$location', '$window', 'AuthenticationService',
function($rootScope, $location, $window, AuthenticationService) {
$rootScope.version = 'v0.2.6';
$rootScope.version = 'v0.2.7';
$rootScope.$on('$routeChangeStart', function(event, nextRoute, currentRoute) {
// Redirect to default path if authentication is required but not present.

View File

@ -71,6 +71,13 @@ function ($scope, $routeParams, $location, $interval, $window,
$scope.deleteItem();
};
$scope.changeItemLane = function() {
$scope.itemFormData.loadItem($scope.contextItem);
$scope.itemFormData.isAdd = false;
$scope.submitItem($scope.itemFormData);
};
$scope.contextItem = {}; // Needs to exist prior to onContextMenu call.
$scope.onContextMenu = function(laneId, item) {
$scope.contextItem = item;

View File

@ -68,7 +68,7 @@ function ($scope, BoardService) {
allowEmpty: false,
localStorageKey: 'taskboard.colorPalette',
showPalette: true,
palette: [[]],
palette: [ ['#fff', '#ececec', '#ffffe0', '#ffe0fa', '#bee7f4', '#c3f4b5', '#debee8', '#ffdea9', '#ffbaba'] ],
showSelectionPalette: true,
showButtons: false,
showInput: true,
@ -120,6 +120,7 @@ function ($scope, BoardService) {
});
}
};
$scope.$parent.submitItem = $scope.submitItem;
var isSuccess = function(data) {
$scope.alerts.showAlerts(data.alerts);

View File

@ -27,20 +27,12 @@ function ($scope, $interval, BoardService) {
{ id: 2, action: 'Set item assignee' },
{ id: 3, action: 'Clear item due date' }
];
$scope.actionOptions = {
triggers: [
{
id: 0,
trigger: 'Item moves to column'
},
{
id: 1,
trigger: 'Item assigned to user'
},
{
id: 2,
trigger: 'Item set to category'
}
{ id: 0, trigger: 'Item moves to column' },
{ id: 1, trigger: 'Item assigned to user' },
{ id: 2, trigger: 'Item set to category' }
]
};
@ -63,10 +55,21 @@ function ($scope, $interval, BoardService) {
getCategories = function(boardData) {
var categories = [{ id: '0', name: 'Uncategorized' }];
if (boardData) {
if (boardData && boardData.ownCategory) {
boardData.ownCategory.forEach(function(category) {
categories.push(category);
});
} else {
$scope.actionOptions.triggers.forEach(function(trigger, index) {
if (trigger.id === 2) {
$scope.actionOptions.triggers.splice(index, 1);
}
});
$scope.actionTypes.forEach(function(type, index) {
if (type.id === 1) {
$scope.actionTypes.splice(index, 1);
}
});
}
return categories;
},
@ -144,16 +147,29 @@ function ($scope, $interval, BoardService) {
updateAutoActions = function(actions) {
if (!actions) {
$scope.actions = [];
return;
}
var mappedActions = [];
actions.forEach(function(action) {
var actionTrigger, actionType;
$scope.actionOptions.triggers.forEach(function(trigger) {
if (trigger.id === parseInt(action.trigger_id)) {
actionTrigger = trigger.trigger;
}
});
$scope.actionTypes.forEach(function(type) {
if (type.id === parseInt(action.action_id)) {
actionType = type.action;
}
});
mappedActions.push({
id: action.id,
board: $scope.boardLookup[action.board_id],
trigger: $scope.actionOptions.triggers[action.trigger_id].trigger + getSecondaryText(action),
action: $scope.actionTypes[action.action_id].action + getActionText(action)
trigger: actionTrigger + getSecondaryText(action),
action: actionType + getActionText(action)
});
});
@ -256,7 +272,7 @@ function ($scope, $interval, BoardService) {
allowEmpty: false,
localStorageKey: 'taskboard.colorPalette',
showPalette: true,
palette: [[]],
palette: [ ['#fff', '#ececec', '#ffffe0', '#ffe0fa', '#bee7f4', '#c3f4b5', '#debee8', '#ffdea9', '#ffbaba'] ],
showSelectionPalette: true,
showButtons: false,
showInput: true,
@ -274,13 +290,13 @@ function ($scope, $interval, BoardService) {
$scope.actionData.color = null;
};
// Check every 250ms to see if a board has been chosen.
// Check every 500ms to see if a board has been chosen.
var updateIfBoardChosen = function() {
if ($scope.actionData.board !== null) {
$interval.cancel($scope.interval); // Stop checking once it has.
$interval.cancel($scope.interval);
$scope.getTriggerWord();
}
};
$scope.interval = $interval(updateIfBoardChosen, 250);
$scope.interval = $interval(updateIfBoardChosen, 500);
$scope.$on('$destroy', function () { $interval.cancel($scope.interval); });
}]);

View File

@ -105,6 +105,15 @@
</a>
</li>
<li role="presentation" class="divider"></li>
<li role="presentation">
Move to Column:<br />
<select class="form-control"
data-ng-model="contextItem.lane_id"
data-ng-change="changeItemLane()"
data-ng-options="lane.id as lane.name for lane in currentBoard.ownLane | orderBy:'position':false">
</select>
</li>
<li role="presentation" class="divider"></li>
<li role="presentation">
<a role="menuitem" style="cursor: default" data-ng-click="openAddItem()">
Add New Item

View File

@ -45,7 +45,7 @@
data-ng-repeat="attachment in viewItem.ownAttachment" data-ng-class-even="'alternate'">
{{ attachment.name }}
<span class="detail">
Uploaded by {{ userNames[attachment.userId] }} on {{ attachment.date }}
Uploaded by {{ userNames[attachment.user_id] }} on {{ attachment.date }}
</span>
<span class="links pull-right" data-ng-show="attachmentDeleting[attachment.id]">
<span class="fa fa-refresh fa-spin"></span> Deleting...

View File

@ -1,7 +1,7 @@
<div include-replace="partials/header.html"></div>
<div class="content">
<div id="widget-container">
<div class="col-md-8 col-md-offset-2 min-padding">
<div class="col-md-10 col-md-offset-1 min-padding files-wrapper">
<div class="files-widget">
<h3 data-ng-if="!file.loading && !file.error" class="widget-header">
Attachment: {{ file.data.name }}

View File

@ -1,7 +1,9 @@
<div data-include-replace="partials/header.html"></div>
<div class="slide-menu" data-ng-class="{ 'slide-menu-open': slide.open }" data-ng-if="currentUser.isAdmin">
<div class="settings-widget">
<h3 class="widget-header text-center">Activity Log</h3>
<h3 class="widget-header text-center">Activity Log
<a class="pull-left fa fa-times small" data-ng-click="slide.open = false"></a>
</h3>
<div class="widget-content">
<p data-ng-if="actionsLoading" class="text-center">
<span class="fa fa-refresh fa-spin"></span> Loading...

View File

@ -19,7 +19,7 @@
<div class="form-group half-width" data-ng-class="{ 'has-error': boardFormData.lanesError }">
<form role="form" class="form form-inline" data-ng-submit="boardFormData.addLane()">
<h5>Columns</h5>
<ul class="list-group lanes">
<ul class="list-group lanes editable">
<li class="list-group-item small" data-ng-class="{ disabled: boardFormData.isSaving }"
data-ng-repeat="lane in boardFormData.lanes | orderBy:'position':false">
<span class="fa fa-arrows-v"></span>
@ -42,7 +42,7 @@
<div class="form-group half-width" data-ng-class="{ 'has-error': boardFormData.categoriesError }">
<form role="form" class="form form-inline" data-ng-submit="boardFormData.addCategory()">
<h5>Categories</h5>
<ul class="list-group">
<ul class="list-group editable">
<li class="list-group-item small" data-ng-class="{ disabled: boardFormData.isSaving }"
data-ng-repeat="category in boardFormData.categories | orderBy:'category':false">
<span class="item-text">{{ category.name }}</span>

View File

@ -35,6 +35,10 @@
</tbody>
</table>
<div data-ng-if="currentUser.isAdmin == '1'">
<p><a role="button" id="addUser" class="btn btn-info" data-toggle="modal" data-target=".userModal" data-ng-click="userFormData.reset()" title="Add User"><span class="fa fa-plus"></span> Add User</a></p>
<p>
<a role="button" id="addUser" class="btn btn-info" data-toggle="modal" data-target=".userModal" data-ng-click="userFormData.reset()" title="Add User">
<span class="fa fa-plus"></span> Add User
</a>
</p>
</div>
</div>

View File

@ -29,6 +29,8 @@ A web server running PHP with sqlite enabled. Developed and tested under Apache2
The server must have `sqlite` and `php5-sqlite` installed, as well as the `rewrite` and `expires` Apache modules.
**Note:** For Apache v2.3.9 and later, virtual host for a site should have [`AllowOverride All`](http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride) for TaskBoard root directory. Otherwise, .htaccess files will be completely ignored.
###Install
Installing TaskBoard is as easy as 1, 2, 3!
@ -99,12 +101,13 @@ Count was done from parent directory of TaskBoard as `./cloc-1.62.pl TaskBoard -
Language | Files | Blank Lines | Comments | Code
-------------------|-------:|-------------:|---------:|---------:
Javascript | 23 | 194 | 34 | 1915
HTML | 17 | 10 | 10 | 1015
Javascript | 23 | 198 | 34 | 1935
HTML | 17 | 10 | 10 | 1030
PHP | 6 | 156 | 58 | 875
CSS | 1 | 11 | 33 | 636
CSS | 1 | 13 | 33 | 651
Bourne Again Shell | 4 | 10 | 0 | 53
XML | 1 | 0 | 0 | 12
__SUM:__ | __52__ | __381__ | __135__ | __4506__
__SUM:__ | __52__ | __387__ | __135__ | __4556__
Counts Last Updated: Dec. 4, 2014
Counts Last Updated: Nov. 10, 2014