Merge branch 'bugfixes' into dev

This commit is contained in:
kiswa 2015-12-04 13:43:48 -05:00
commit 423fec24f5
12 changed files with 61 additions and 58 deletions

View File

@ -31,7 +31,7 @@ The server must have `sqlite` and `php5-sqlite` installed, as well as the `rewri
**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.
**Optional:** to build minimized JavaScript and CSS (Install step 3) you must have a jre installed, tested with `openjdk-7-jre` and `openjdk-8-jre`.
**Optional:** to build minimized JavaScript and CSS (Install step 3) you must have curl and a jre installed, tested with `openjdk-7-jre` and `openjdk-8-jre`.
###Install
@ -43,9 +43,9 @@ Installing TaskBoard is as easy as 1, 2, (3), 4!
git clone https://github.com/kiswa/TaskBoard.git
2. Install the PHP dependencies via composer. Open `TaskBoard/build/` in a terminal and run `./composer.phar install`
2. Install the PHP dependencies via composer. Open `TaskBoard/` in a terminal and run `./build/composer.phar install`
3. Open `TaskBoard/build/` in a terminal and run `./build-all`.
3. (Optional) Open `TaskBoard/build/` in a terminal and run `./build-all`.
4. Visit the site and log in with the username and password `admin` (and don't forget to change the password once you're in!).
@ -116,17 +116,17 @@ If you find a bug, please post it on the [Issue Tracker](https://github.com/kisw
It's silly to use [LOC](http://en.wikipedia.org/wiki/Source_lines_of_code) as a metric, but it can be interesting to see what goes into a project.
This is only for TaskBoard files (library code is excluded), using [CLOC](http://cloc.sourceforge.net/).
Count was done from parent directory of TaskBoard as `./cloc-1.62.pl TaskBoard --exclude-dir=lib,vendor`.
Count was done from parent directory of TaskBoard as `cloc TaskBoard --exclude-dir=lib,vendor`.
Language | Files | Blank Lines | Comments | Code
-------------------|-------:|-------------:|---------:|---------:
Javascript | 23 | 220 | 34 | 2092
PHP | 9 | 233 | 55 | 1216
Javascript | 23 | 220 | 34 | 2087
PHP | 9 | 235 | 55 | 1220
HTML | 24 | 12 | 10 | 1160
CSS | 1 | 13 | 26 | 703
Bourne Again Shell | 4 | 12 | 0 | 58
JSON | 1 | 0 | 0 | 17
XML | 1 | 0 | 0 | 12
__SUM:__ | __63__ | __490__ | __125__ | __5258__
__SUM:__ | __63__ | __492__ | __125__ | __5257__
Counts Last Updated: Jun 6, 2015
Counts Last Updated: Nov 8, 2015

22
VERSION
View File

@ -1,19 +1,9 @@
v0.3.0
v0.3.1
Changelog
* Adding a new Column to a board correctly shows it at the end of the columns.
* The list of boards can be sorted.
* Boards can be marked inactive to disallow using them without deleting.
* The list of boards can be filtered.
* Multiple logins per user are now possible.
* Additional setting to disable animations throughout.
* Expandable text inputs expand vertically and reset size on modal open.
* 'Move to Column' context menu improvements.
* Fix for missing Authorization header on some platforms.
* Fix for missing Automatic Action trigger 'category change'.
* Add ability to have emails sent on several status changes.
* Pulled some inline styles out (two remain, but are required for coloring tasks).
* Add setting to make new tasks appear at top or bottom of columns.
* Removed "No description" text from empty tasks.
* Add setting to hide "Assigned To: Unassigned" on tasks.
* Fix automatic action color change bug.
* Fix new user default board bug.
* Fix boards button bug.
* Fix modal display bug.
* Allow email to be reset to nothing.

View File

@ -26,6 +26,7 @@ function exceptionHandler($exception) {
set_exception_handler('exceptionHandler');
R::setup('sqlite:'.__DIR__.'/taskboard.db');
R::setAutoResolve(TRUE);
createInitialUser();
$app->notFound(function() use ($app, $jsonResponse) {

View File

@ -383,7 +383,7 @@ function createInitialUser() {
$options->showAnimations = true;
$options->showAssignee = true;
$admin->ownOptions[] = $options;
$admin->xownOptionList[] = $options;
R::store($admin);
}

View File

@ -145,6 +145,7 @@ $app->post('/items/positions', function() use ($app, $jsonResponse) {
}
$item->position = $posItem->position;
R::store($item);
runAutoActions($item);
R::store($item);
}

View File

@ -138,7 +138,7 @@ $app->get('/users/current', function() use($app, $jsonResponse) {
if (validateToken()) {
$user = getUser();
if (null != $user) {
$userOptions = R::exportAll($user->ownOption);
$userOptions = R::exportAll($user->xownOptionList);
$options = array(
'tasksOrder' => $userOptions[0]['tasks_order'],
'showAssignee' => $userOptions[0]['show_assignee'] == 1,
@ -163,9 +163,9 @@ $app->post('/users/current/options', function() use ($app, $jsonResponse) {
if (validateToken()) {
$user = getUser();
$user->ownOption[1]->tasksOrder = $data->tasksOrder;
$user->ownOption[1]->showAssignee = $data->showAssignee;
$user->ownOption[1]->showAnimations = $data->showAnimations;
$user->xownOptionList[0]->tasksOrder = $data->tasksOrder;
$user->xownOptionList[0]->showAssignee = $data->showAssignee;
$user->xownOptionList[0]->showAnimations = $data->showAnimations;
R::store($user);
$jsonResponse->data = $data;
@ -198,15 +198,20 @@ $app->post('/users', function() use($app, $jsonResponse) {
$user->defaultBoard = $data->defaultBoard;
$user->salt = password_hash($data->username . time(), PASSWORD_BCRYPT);
$user->password = password_hash($data->password, PASSWORD_BCRYPT, array('salt' => $user->salt));
$options = R::dispense('option');
$options->newTaskPosition = 0; // Bottom of column (1 == top of column)
$options->animate = true;
$user->ownOptions = $options;
$options->tasksOrder = 0; // Bottom of column (1 == top of column)
$options->showAnimations = true;
$options->showAssignee = true;
$user->xownOptionList[] = $options;
R::store($user);
addUserToBoard($data->defaultBoard, $user);
foreach($data->boardAccess as $board) {
addUserToBoard($board, $user);
if (property_exists($data, 'boardAccess') && is_array($data->boardAccess)) {
foreach($data->boardAccess as $board) {
addUserToBoard($board, $user);
}
}
$actor = getUser();

Binary file not shown.

18
composer.lock generated
View File

@ -135,16 +135,16 @@
},
{
"name": "phpmailer/phpmailer",
"version": "v5.2.10",
"version": "v5.2.14",
"source": {
"type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "07005ecbb80d11ec8c0f067bb37e8909cc7fcbb7"
"reference": "e774bc9152de85547336e22b8926189e582ece95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/07005ecbb80d11ec8c0f067bb37e8909cc7fcbb7",
"reference": "07005ecbb80d11ec8c0f067bb37e8909cc7fcbb7",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e774bc9152de85547336e22b8926189e582ece95",
"reference": "e774bc9152de85547336e22b8926189e582ece95",
"shasum": ""
},
"require": {
@ -152,12 +152,18 @@
},
"require-dev": {
"phpdocumentor/phpdocumentor": "*",
"phpunit/phpunit": "4.3.*"
"phpunit/phpunit": "4.7.*"
},
"suggest": {
"league/oauth2-client": "Needed for XOAUTH2 authentication",
"league/oauth2-google": "Needed for Gmail XOAUTH2"
},
"type": "library",
"autoload": {
"classmap": [
"class.phpmailer.php",
"class.phpmaileroauth.php",
"class.phpmaileroauthgoogle.php",
"class.smtp.php",
"class.pop3.php",
"extras/EasyPeasyICS.php",
@ -186,7 +192,7 @@
}
],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"time": "2015-05-04 12:37:21"
"time": "2015-11-01 10:15:28"
},
{
"name": "slim/slim",

View File

@ -550,6 +550,9 @@ span.filter {
float: left;
margin-bottom: 1em;
}
.board-options label {
font-weight: normal;
}
#changeUserSettings hr, .board-options hr {
clear: both;
}

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.3.0';
$rootScope.version = 'v0.3.1';
$rootScope.$on('$routeChangeStart', function(event, nextRoute, currentRoute) {
// Redirect to default path if authentication is required but not present.

View File

@ -135,20 +135,15 @@ function ($scope, $interval, UserService) {
$scope.changeEmail = function(newEmailFormData) {
$scope.emailFormData.isSaving = true;
if (newEmailFormData.newEmail === '') {
newEmailFormData.setAlert('Email cannot be blank.');
newEmailFormData.isSaving = false;
} else {
UserService.changeEmail(newEmailFormData.newEmail)
.success(function(data) {
$scope.alerts.showAlerts(data.alerts);
$scope.updateUsers(data.data);
$scope.loadCurrentUser();
UserService.changeEmail(newEmailFormData.newEmail)
.success(function(data) {
$scope.alerts.showAlerts(data.alerts);
$scope.updateUsers(data.data);
$scope.loadCurrentUser();
newEmailFormData.isSaving = false;
newEmailFormData.newUsername = '';
});
}
newEmailFormData.isSaving = false;
newEmailFormData.newUsername = '';
});
};
$scope.updatingDefaultBoard = false;

View File

@ -7,14 +7,16 @@
</select>
</p>
<p class="form-group form-inline">
Show animations?
<input type="checkbox" data-ng-model="currentUser.options.showAnimations"
<label>Show animations?
<input type="checkbox" data-ng-model="currentUser.options.showAnimations"
data-ng-change="saveOptions()">
</label>
</p>
<p class="form-group form-inline">
Show Assignee on item card?
<input type="checkbox" data-ng-model="currentUser.options.showAssignee"
<label>Show Assignee on item card?
<input type="checkbox" data-ng-model="currentUser.options.showAssignee"
data-ng-change="saveOptions()">
</label>
</p>
<hr>
</div>