From e087aa2a4d7c7a3c0b7daec25267f19947d1a257 Mon Sep 17 00:00:00 2001 From: kiswa Date: Sat, 5 Nov 2016 11:32:19 +0000 Subject: [PATCH] Board edit WIP - Can add to a board now --- src/api/controllers/Boards.php | 33 +++++++--- .../board-admin/board-admin.component.html | 8 ++- .../board-admin/board-admin.component.ts | 38 ++++++++--- .../board-admin/board-admin.service.ts | 63 +++++++++++++++++-- .../settings/board-admin/board-data.model.ts | 3 +- src/app/shared/index.ts | 8 +-- src/app/shared/models/board.model.ts | 15 ++--- src/app/shared/models/index.ts | 5 +- src/app/shared/models/issue-tracker.model.ts | 1 + test/api/controllers/BoardsTest.php | 25 ++++++++ test/api/controllers/UsersTest.php | 5 +- 11 files changed, 163 insertions(+), 41 deletions(-) diff --git a/src/api/controllers/Boards.php b/src/api/controllers/Boards.php index c121ab1..e5105f2 100644 --- a/src/api/controllers/Boards.php +++ b/src/api/controllers/Boards.php @@ -61,12 +61,7 @@ class Boards extends BaseController { $board = new Board($this->container); $board->loadFromJson($request->getBody()); - // All admins are members of every added board - $admins = R::findAll('user', ' WHERE security_level = 1 '); - foreach($admins as $admin) { - $user = new User($this->container, $admin->id); - $board->users[] = $user; - } + $this->includeAdmins($board); if (!$board->save()) { $this->logger->addError('Add Board: ', [$board]); @@ -96,13 +91,22 @@ class Boards extends BaseController { return $this->jsonResponse($response, $status); } + $data = json_decode($request->getBody()); $board = new Board($this->container, (int)$args['id']); if (!$this->checkBoardAccess($board->id, $request)) { return $this->jsonResponse($response, 403); } - $update = new Board($this->container); + if (!property_exists($data, 'id')) { + $this->logger->addError('Update Board: ', [$board, $data]); + $this->apiJson->addAlert('error', 'Error updating board. ' . + 'Please check your entries and try again.'); + + return $this->jsonResponse($response); + } + + $update = new Board($this->container, (int)$args['id']); $update->loadFromJson($request->getBody()); if ($board->id !== $update->id) { @@ -113,6 +117,7 @@ class Boards extends BaseController { return $this->jsonResponse($response); } + $this->includeAdmins($update); $update->save(); $actor = new User($this->container, Auth::GetUserId($request)); @@ -124,6 +129,7 @@ class Boards extends BaseController { $this->apiJson->setSuccess(); $this->apiJson->addAlert('success', 'Board ' . $update->name . ' updated.'); + $this->apiJson->addData($this->loadAllBoards($request)); return $this->jsonResponse($response); } @@ -157,10 +163,23 @@ class Boards extends BaseController { $this->apiJson->setSuccess(); $this->apiJson->addAlert('success', 'Board ' . $before->name . ' removed.'); + $this->apiJson->addData($this->loadAllBoards($request)); return $this->jsonResponse($response); } + private function includeAdmins($board) { + $admins = R::findAll('user', ' WHERE security_level = 1 '); + + foreach($admins as $admin) { + $user = new User($this->container, $admin->id); + + if (!in_array($user, $board->users)) { + $board->users[] = $user; + } + } + } + private function loadAllBoards($request) { $boards = []; $boardBeans = R::findAll('board'); diff --git a/src/app/settings/board-admin/board-admin.component.html b/src/app/settings/board-admin/board-admin.component.html index faf9f09..a4cc394 100644 --- a/src/app/settings/board-admin/board-admin.component.html +++ b/src/app/settings/board-admin/board-admin.component.html @@ -105,8 +105,12 @@ modal-id="{{ MODAL_CONFIRM_ID }}">
Removing a board cannot be undone.
Continue?
- - + +
diff --git a/src/app/settings/board-admin/board-admin.component.ts b/src/app/settings/board-admin/board-admin.component.ts index 9c77ef0..9c1f93b 100644 --- a/src/app/settings/board-admin/board-admin.component.ts +++ b/src/app/settings/board-admin/board-admin.component.ts @@ -102,6 +102,8 @@ export class BoardAdmin { } addEditBoard(): void { + let isAdd = this.modalProps.title === 'Add'; + this.saving = true; this.setBoardUsers(); @@ -110,16 +112,21 @@ export class BoardAdmin { return; } - this.boardService.addBoard(this.modalProps) - .subscribe((response: ApiResponse) => { - response.alerts.forEach(note => this.notes.add(note)); + if (isAdd) { + this.boardService.addBoard(this.modalProps) + .subscribe(this.handleResponse); + return; + } - if (response.status === 'success') { - this.modal.close(this.MODAL_ID); - this.settings.updateBoards(response.data[1]); - this.saving = false; - } - }); + this.boardService.editBoard(this.modalProps) + .subscribe(this.handleResponse); + } + + removeBoard() { + this.saving = true; + + this.boardService.removeBoard(this.boardToRemove.id) + .subscribe(this.handleResponse); } private validateBoard(): boolean { @@ -138,6 +145,18 @@ export class BoardAdmin { return true; } + private handleResponse = (response: ApiResponse) => { + response.alerts.forEach(note => this.notes.add(note)); + + if (response.status === 'success') { + this.modal.close(this.MODAL_ID); + this.modal.close(this.MODAL_CONFIRM_ID); + + this.settings.updateBoards(response.data[1]); + this.saving = false; + } + } + private setBoardUsers(): void { this.modalProps.users = []; @@ -175,6 +194,7 @@ export class BoardAdmin { user.selected = false; }); } else { + this.modalProps.id = board.id; this.modalProps.boardName = board.name; this.modalProps.columns = board.columns; this.modalProps.categories = board.categories; diff --git a/src/app/settings/board-admin/board-admin.service.ts b/src/app/settings/board-admin/board-admin.service.ts index 6542873..6466eab 100644 --- a/src/app/settings/board-admin/board-admin.service.ts +++ b/src/app/settings/board-admin/board-admin.service.ts @@ -6,7 +6,14 @@ import 'rxjs/add/observable/of'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; -import { ApiResponse, Board, User } from '../../shared/index'; +import { + ApiResponse, + Board, + Column, + Category, + IssueTracker, + User +} from '../../shared/index'; import { BoardData } from './board-data.model'; @Injectable() @@ -28,21 +35,67 @@ export class BoardAdminService { }); } + editBoard(board: BoardData): Observable { + let updateBoard = this.convertForApi(board); + + return this.http.post('api/boards/' + updateBoard.id, updateBoard) + .map(res => { + let response: ApiResponse = res.json(); + return response; + }) + .catch((res, caught) => { + let response: ApiResponse = res.json(); + return Observable.of(response); + }); + } + + removeBoard(boardId: number): Observable { + return this.http.delete('api/boards/' + boardId) + .map(res => { + let response: ApiResponse = res.json(); + return response; + }) + .catch((res, caught) => { + let response: ApiResponse = res.json(); + return Observable.of(response); + }); + } + private convertForApi(board: BoardData): Board { let newBoard = new Board(); + newBoard.id = board.id; newBoard.name = board.boardName; - board.columns.forEach(column => { - newBoard.addColumn(column.name); + board.columns.forEach((column, index) => { + if (column.id) { + let existing = new Column(column.id, column.name, index, + board.id, column.tasks); + newBoard.columns.push(existing); + } else { + newBoard.addColumn(column.name); + } }); board.categories.forEach(category => { - newBoard.addCategory(category.name, category.defaultColor); + if (category.id) { + let existing = new Category(category.id, category.name, + category.default_task_color, + board.id); + newBoard.categories.push(existing); + } else { + newBoard.addCategory(category.name, category.defaultColor); + } }); board.issueTrackers.forEach(tracker => { - newBoard.addIssueTracker(tracker.url, tracker.regex); + if (tracker.id) { + let existing = new IssueTracker(tracker.id, tracker.url, + tracker.regex); + newBoard.issue_trackers.push(existing); + } else { + newBoard.addIssueTracker(tracker.url, tracker.regex); + } }); board.users.forEach(user => { diff --git a/src/app/settings/board-admin/board-data.model.ts b/src/app/settings/board-admin/board-data.model.ts index fb6af0e..4c84a32 100644 --- a/src/app/settings/board-admin/board-data.model.ts +++ b/src/app/settings/board-admin/board-data.model.ts @@ -1,5 +1,6 @@ export class BoardData { constructor(public title = '', + public id = 0, public boardName = '', public columns = [], public categories = [], @@ -16,7 +17,7 @@ export class BoardData { return; } - this.columns.push({ name: this.newColumnName }); + this.columns.push({ name: this.newColumnName, tasks: [] }); this.newColumnName = ''; } diff --git a/src/app/shared/index.ts b/src/app/shared/index.ts index badbe12..5d22fcb 100644 --- a/src/app/shared/index.ts +++ b/src/app/shared/index.ts @@ -1,8 +1,8 @@ -export * from './top-nav/top-nav.component'; -export * from './inline-edit/inline-edit.component'; export * from './auth/index'; +export * from './constants'; +export * from './inline-edit/inline-edit.component'; +export * from './modal/index'; export * from './models/index'; export * from './notifications/index'; -export * from './constants'; -export * from './modal/index' +export * from './top-nav/top-nav.component'; diff --git a/src/app/shared/models/board.model.ts b/src/app/shared/models/board.model.ts index dc0dde2..48d18b0 100644 --- a/src/app/shared/models/board.model.ts +++ b/src/app/shared/models/board.model.ts @@ -6,23 +6,20 @@ export class Board { constructor(public id: number = 0, public name: string = '', public is_active: boolean = true, - public columns = [], - public categories = [], - public auto_actions = [], - public issue_trackers = [], + public columns: Array = [], + public categories: Array = [], + public auto_actions = [], // TODO: Add typing + public issue_trackers: Array = [], public users = []) { } addColumn(name: string): void { - let column = new Column(); - column.name = name; - column.position = this.columns.length; - + let column = new Column(0, name, this.columns.length); this.columns.push(column); } addCategory(name: string, color: string): void { - this.categories.push(new Category(0, name, color, 0)); + this.categories.push(new Category(0, name, color)); } addIssueTracker(url: string, regex: string): void { diff --git a/src/app/shared/models/index.ts b/src/app/shared/models/index.ts index 26e1ac7..b1a2858 100644 --- a/src/app/shared/models/index.ts +++ b/src/app/shared/models/index.ts @@ -1,8 +1,9 @@ -export * from './user.model'; +export * from './api-response.model'; export * from './board.model'; +export * from './category.model'; export * from './column.model'; export * from './issue-tracker.model'; -export * from './api-response.model'; export * from './notification.model'; export * from './user-options.model'; +export * from './user.model'; diff --git a/src/app/shared/models/issue-tracker.model.ts b/src/app/shared/models/issue-tracker.model.ts index fb6501d..f146097 100644 --- a/src/app/shared/models/issue-tracker.model.ts +++ b/src/app/shared/models/issue-tracker.model.ts @@ -4,3 +4,4 @@ export class IssueTracker { public regex: string = '') { } } + diff --git a/test/api/controllers/BoardsTest.php b/test/api/controllers/BoardsTest.php index d756b3d..5bbecb4 100644 --- a/test/api/controllers/BoardsTest.php +++ b/test/api/controllers/BoardsTest.php @@ -171,12 +171,24 @@ class BoardsTest extends PHPUnit_Framework_TestCase { $this->assertEquals('failure', $response->status); } + /** + * @group single + */ public function testUpdateBoard() { $this->createBoard(); $board = DataMock::getBoard(); $board->is_active = false; + $column = new stdClass(); + $column->id = 0; + $column->name = 'col2'; + $column->position = 1; + $column->board_id = 0; + $column->tasks = []; + + $board->columns[] = $column; + $args = []; $args['id'] = $board->id; @@ -189,6 +201,10 @@ class BoardsTest extends PHPUnit_Framework_TestCase { new ResponseMock(), $args); $this->assertEquals('success', $response->status); + $board = $response->data[1][0]; + var_dump($board); + $this->assertEquals(2, count($board->columns)); + $this->boards = new Boards(new ContainerMock()); $request->payload = new stdClass(); $request->header = [DataMock::getJwt()]; @@ -197,6 +213,15 @@ class BoardsTest extends PHPUnit_Framework_TestCase { new ResponseMock(), $args); $this->assertEquals('error', $response->alerts[0]['type']); + $this->boards = new Boards(new ContainerMock()); + $board->id = 3; + $request->payload = $board; + $request->header = [DataMock::getJwt()]; + + $response = $this->boards->updateBoard($request, + new ResponseMock(), $args); + $this->assertEquals('error', $response->alerts[0]['type']); + $this->boards = new Boards(new ContainerMock()); $request->header = null; diff --git a/test/api/controllers/UsersTest.php b/test/api/controllers/UsersTest.php index 7489507..e629bbe 100644 --- a/test/api/controllers/UsersTest.php +++ b/test/api/controllers/UsersTest.php @@ -229,8 +229,8 @@ class UsersTest extends PHPUnit_Framework_TestCase { $user = DataMock::getUser(); $user->username = 'newname'; - $user->default_board_id = 0; - $user->boardAccess = [1]; + $user->default_board_id = 1; + $user->boardAccess = [2]; $args = []; $args['id'] = $user->id; @@ -295,6 +295,7 @@ class UsersTest extends PHPUnit_Framework_TestCase { $this->users = new Users(new ContainerMock()); $user->default_board_id = 1; + $user->boardAccess = [0]; $request->payload = $user; $request->header = [DataMock::getJwt(2)];