diff --git a/appinfo/database.xml b/appinfo/database.xml index 056055a19..28e832e67 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -135,6 +135,11 @@ 8 false + + archived + boolean + false + diff --git a/appinfo/info.xml b/appinfo/info.xml index b31ac149f..ac96842f3 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -5,7 +5,7 @@ My first ownCloud appAGPLJulius Härtl - 0.0.1.13 + 0.0.1.14Deckother diff --git a/appinfo/routes.php b/appinfo/routes.php index 13387d157..ac84404e8 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -22,10 +22,10 @@ return [ ['name' => 'board#read', 'url' => '/boards/{boardId}/', 'verb' => 'GET'], ['name' => 'board#update', 'url' => '/boards/', 'verb' => 'PUT'], ['name' => 'board#delete', 'url' => '/boards/{boardId}/', 'verb' => 'DELETE'], - // boards - sharees - ['name' => 'board#addSharee', 'url' => '/boards/sharee', 'verb' => 'POST'], - ['name' => 'board#removeSharee', 'url' => '/boards/sharee', 'verb' => 'DELETE'], - ['name' => 'board#updateSharee', 'url' => '/boards/sharee', 'verb' => 'PUT'], + // boards - acl + ['name' => 'board#addAcl', 'url' => '/boards/acl', 'verb' => 'POST'], + ['name' => 'board#updateAcl', 'url' => '/boards/acl', 'verb' => 'PUT'], + ['name' => 'board#deleteAcl', 'url' => '/boards/acl/{id}', 'verb' => 'DELETE'], // stacks ['name' => 'stack#index', 'url' => '/stacks/{boardId}/', 'verb' => 'GET'], diff --git a/controller/boardcontroller.php b/controller/boardcontroller.php index 5a7d4b5a5..708a0f2f9 100644 --- a/controller/boardcontroller.php +++ b/controller/boardcontroller.php @@ -64,7 +64,14 @@ class BoardController extends Controller { return $this->boardService->labels($this->boardId); } - public function addSharee($boardId, $type, $participant, $write, $invite, $manage) { - return $this->boardService->addParticipant($boardId, $type, $participant, $write, $invite, $manage); + public function addAcl($boardId, $type, $participant, $write, $invite, $manage) { + return $this->boardService->addAcl($boardId, $type, $participant, $write, $invite, $manage); } + public function updateAcl($id, $permissionWrite, $permissionInvite, $permissionManage) { + return $this->boardService->updateAcl($id, $permissionWrite, $permissionInvite, $permissionManage); + } + public function deleteAcl($id) { + return $this->boardService->deleteAcl($id); + } + } \ No newline at end of file diff --git a/controller/stylecontroller.php b/controller/stylecontroller.php index 1985bd9b9..f8d50d0b4 100644 --- a/controller/stylecontroller.php +++ b/controller/stylecontroller.php @@ -5,7 +5,7 @@ namespace OCA\Deck\Controller; use OCP\IRequest; use OCP\AppFramework\ApiController as BaseApiController; -class ApiController extends BaseApiController { +class StyleController extends Controller { private $defaults; public function __construct($appName, IRequest $request, OC_Defaults $defaults){ @@ -15,9 +15,11 @@ class ApiController extends BaseApiController { /** * @PublicPage * @NoCSRFRequired - * @CORS */ public function generateCss() { - return + + $color = $this->config->getAppValue($this->appName, 'color'); + $responseCss .= ''; + $response = new Http\DataDownloadResponse($responseCss, 'style', 'text/css'); } } diff --git a/css/style.css b/css/style.css index 3f15d6067..c61b8ab9a 100644 --- a/css/style.css +++ b/css/style.css @@ -634,4 +634,22 @@ margin-bottom:2px; width:100%; #markdown pre { background-color:#eeeeee; padding:3px; +} + + +.shareWithList .icon { + display: inline-block; + background-size: 16px 16px; + width:16px; + height:16px; +} + +.shareWithList .fa { + font-size:12pt; + width:16px; + text-align:center; +} + +.shareOption { + margin-top:4px; } \ No newline at end of file diff --git a/db/acl.php b/db/acl.php index e1e37f83f..b1376cfc9 100644 --- a/db/acl.php +++ b/db/acl.php @@ -17,6 +17,9 @@ class Acl extends Entity implements JsonSerializable { public function __construct() { $this->addType('id','integer'); $this->addType('boardId','integer'); + $this->addType('permissionWrite', 'boolean'); + $this->addType('permissionInvite', 'boolean'); + $this->addType('permissionManage', 'boolean'); } public function jsonSerialize() { return [ diff --git a/db/board.php b/db/board.php index 74f9f662a..033b092f4 100644 --- a/db/board.php +++ b/db/board.php @@ -11,8 +11,8 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { protected $owner; protected $color; protected $archived; - public $acl = array(); protected $labels; + protected $acl; public function __construct() { $this->addType('id','integer'); @@ -30,4 +30,16 @@ class Board extends \OCA\Deck\Db\Entity implements JsonSerializable { 'acl' => $this->acl, ]; } + + public function setLabels($labels) { + foreach ($labels as $l) { + $this->labels[$l->id] = $l; + } + } + + public function setAcl($acl) { + foreach ($acl as $a) { + $this->acl[$a->id] = $a; + } + } } \ No newline at end of file diff --git a/db/boardmapper.php b/db/boardmapper.php index a306c6b97..0e07fd0da 100644 --- a/db/boardmapper.php +++ b/db/boardmapper.php @@ -30,12 +30,15 @@ class BoardMapper extends Mapper { $sql = 'SELECT * FROM `*PREFIX*deck_boards` ' . 'WHERE `id` = ?'; $board = $this->findEntity($sql, [$id]); + // Add labels $labels = $this->labelMapper->findAll($id); $board->setLabels($labels); - // Add sharees + + // Add acl $acl = $this->aclMapper->findAll($id); $board->setAcl($acl); + return $board; } diff --git a/db/card.php b/db/card.php index 874aadc1b..b43744a7d 100644 --- a/db/card.php +++ b/db/card.php @@ -16,6 +16,8 @@ class Card extends Entity implements JsonSerializable { protected $labels; protected $owner; protected $order; + protected $archived; + public function __construct() { $this->addType('id','integer'); $this->addType('stackId','integer'); @@ -35,6 +37,7 @@ class Card extends Entity implements JsonSerializable { 'order' => $this->order, 'stackId' => $this->stackId, 'labels' => $this->labels, + 'archived' => $this->archived, ]; } } diff --git a/db/cardmapper.php b/db/cardmapper.php index 94c23f3d8..d1a92d2cc 100644 --- a/db/cardmapper.php +++ b/db/cardmapper.php @@ -51,7 +51,16 @@ class CardMapper extends Mapper { } public function findAll($stackId, $limit=null, $offset=null) { - $sql = 'SELECT * FROM `*PREFIX*deck_cards` WHERE `stack_id` = ? ORDER BY `order`'; + $sql = 'SELECT * FROM `*PREFIX*deck_cards` + WHERE `stack_id` = ? AND NOT archived ORDER BY `order`'; + $entities = $this->findEntities($sql, [$stackId], $limit, $offset); + return $entities; + } + + // TODO: test + public function findAllArchived($boardId, $limit=null, $offset=null) { + $sql = 'SELECT * FROM `*PREFIX*deck_cards` as c, `*PREFIX*deck_stacks` as s + WHERE `s.board_id` = ? AND c.stack_id = s.id AND archived ORDER BY `last_modified`'; $entities = $this->findEntities($sql, [$stackId], $limit, $offset); return $entities; } diff --git a/js/app/Config.js b/js/app/Config.js index 506d15aa0..687cb83b1 100644 --- a/js/app/Config.js +++ b/js/app/Config.js @@ -49,4 +49,6 @@ app.config(function ($provide, $routeProvider, $interpolateProvider, $httpProvid .state('board.sharing', { }); + + }); \ No newline at end of file diff --git a/js/controller/BoardController.js b/js/controller/BoardController.js index 444d6ff55..bd3877d4c 100644 --- a/js/controller/BoardController.js +++ b/js/controller/BoardController.js @@ -86,14 +86,16 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St LabelService.update(label); } - $scope.addSharee = function(sharee) { + $scope.addAcl = function(sharee) { sharee.boardId = $scope.id; - BoardService.addSharee(sharee); + BoardService.addAcl(sharee); $scope.status.addSharee = null; } $scope.deleteAcl = function(acl) { - acl.boardId = $scope.id; - BoardService.removeAcl(acl); + BoardService.deleteAcl(acl.id); + } + $scope.updateAcl = function(acl) { + BoardService.updateAcl(acl); } // TODO: move to filter? // Lighten Color of the board for background usage diff --git a/js/package.json b/js/package.json index e3d858e10..0f7dcc526 100644 --- a/js/package.json +++ b/js/package.json @@ -8,7 +8,9 @@ "type": "git", "url": "git@github.com:juliushaertl/deck.git" }, - "dependencies": {}, + "dependencies": { + "karma": "^1.1.1" + }, "devDependencies": { "bower": "*", "grunt": "*", diff --git a/js/public/app.js b/js/public/app.js index cfebc3819..017fe6248 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -79,6 +79,8 @@ app.config(["$provide", "$routeProvider", "$interpolateProvider", "$httpProvider .state('board.sharing', { }); + + }]); app.run(["$document", "$rootScope", "$transitions", function ($document, $rootScope, $transitions) { 'use strict'; @@ -203,14 +205,16 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat LabelService.update(label); } - $scope.addSharee = function(sharee) { + $scope.addAcl = function(sharee) { sharee.boardId = $scope.id; - BoardService.addSharee(sharee); + BoardService.addAcl(sharee); $scope.status.addSharee = null; } $scope.deleteAcl = function(acl) { - acl.boardId = $scope.id; - BoardService.removeAcl(acl); + BoardService.deleteAcl(acl.id); + } + $scope.updateAcl = function(acl) { + BoardService.updateAcl(acl); } // TODO: move to filter? // Lighten Color of the board for background usage @@ -675,28 +679,59 @@ app.factory('BoardService', ["ApiService", "$http", "$q", function(ApiService, $ this.sharees = []; $http.get(url).then(function (response) { self.sharees = response.data; - console.log(self.sharees); deferred.resolve(response.data); }, function (error) { deferred.reject('Error while update ' + self.endpoint); }); return deferred.promise; - } + }; - BoardService.prototype.addSharee = function(sharee) { + BoardService.prototype.addAcl = function(acl) { var board = this.getCurrent(); - board.acl.push(sharee); var deferred = $q.defer(); var self = this; - $http.post(this.baseUrl + '/sharee', sharee).then(function (response) { - console.log("Add sharee " + response); + var _acl = acl; + $http.post(this.baseUrl + '/acl', _acl).then(function (response) { + if(!board.acl) { + board.acl = {}; + } + board.acl[response.data.id] = response.data; deferred.resolve(response.data); }, function (error) { - deferred.reject('Error while insert ' + self.endpoint); + deferred.reject('Error creating ACL ' + _acl); }); - sharee = null; + acl = null; return deferred.promise; - } + }; + + BoardService.prototype.deleteAcl = function(id) { + var board = this.getCurrent(); + var deferred = $q.defer(); + var self = this; + $http.delete(this.baseUrl + '/acl/' + id).then(function (response) { + delete board.acl[response.data.id]; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error deleting ACL ' + id); + }); + acl = null; + return deferred.promise; + }; + + BoardService.prototype.updateAcl = function(acl) { + var board = this.getCurrent(); + var deferred = $q.defer(); + var self = this; + var _acl = acl; + $http.put(this.baseUrl + '/acl', _acl).then(function (response) { + board.acl[_acl.id] = response.data; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error updating ACL ' + _acl); + }); + acl = null; + return deferred.promise; + }; service = new BoardService($http, 'boards', $q) return service; diff --git a/js/service/BoardService.js b/js/service/BoardService.js index 4c265679f..5d436f3e5 100644 --- a/js/service/BoardService.js +++ b/js/service/BoardService.js @@ -11,28 +11,59 @@ app.factory('BoardService', function(ApiService, $http, $q){ this.sharees = []; $http.get(url).then(function (response) { self.sharees = response.data; - console.log(self.sharees); deferred.resolve(response.data); }, function (error) { deferred.reject('Error while update ' + self.endpoint); }); return deferred.promise; - } + }; - BoardService.prototype.addSharee = function(sharee) { + BoardService.prototype.addAcl = function(acl) { var board = this.getCurrent(); - board.acl.push(sharee); var deferred = $q.defer(); var self = this; - $http.post(this.baseUrl + '/sharee', sharee).then(function (response) { - console.log("Add sharee " + response); + var _acl = acl; + $http.post(this.baseUrl + '/acl', _acl).then(function (response) { + if(!board.acl) { + board.acl = {}; + } + board.acl[response.data.id] = response.data; deferred.resolve(response.data); }, function (error) { - deferred.reject('Error while insert ' + self.endpoint); + deferred.reject('Error creating ACL ' + _acl); }); - sharee = null; + acl = null; return deferred.promise; - } + }; + + BoardService.prototype.deleteAcl = function(id) { + var board = this.getCurrent(); + var deferred = $q.defer(); + var self = this; + $http.delete(this.baseUrl + '/acl/' + id).then(function (response) { + delete board.acl[response.data.id]; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error deleting ACL ' + id); + }); + acl = null; + return deferred.promise; + }; + + BoardService.prototype.updateAcl = function(acl) { + var board = this.getCurrent(); + var deferred = $q.defer(); + var self = this; + var _acl = acl; + $http.put(this.baseUrl + '/acl', _acl).then(function (response) { + board.acl[_acl.id] = response.data; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error updating ACL ' + _acl); + }); + acl = null; + return deferred.promise; + }; service = new BoardService($http, 'boards', $q) return service; diff --git a/js/tests/unit/boardcontrollerspec.js b/js/tests/unit/boardcontrollerspec.js new file mode 100644 index 000000000..8c8ccf110 --- /dev/null +++ b/js/tests/unit/boardcontrollerspec.js @@ -0,0 +1,19 @@ +describe('BoardController', function() { + 'use strict'; + + var $controller; + + beforeEach(inject(function(_$controller_){ + // The injector unwraps the underscores (_) from around the parameter names when matching + $controller = _$controller_; + })); + + describe('$scope.rgblight', function() { + it('converts rbg color to a lighter color', function() { + var $scope = {}; + var controller = $controller('BoardController', { $scope: $scope }); + var hex = $scope.rgblight('red'); + expect(hex).toEqual('#red'); + }); + }); +}); diff --git a/service/boardservice.php b/service/boardservice.php index 1edcd6331..3fbe3b2bf 100644 --- a/service/boardservice.php +++ b/service/boardservice.php @@ -81,12 +81,9 @@ class BoardService { $board->setColor($color); return $this->boardMapper->update($board); } + - public function labels($boardId) { - - } - - public function addParticipant($boardId, $type, $participant, $write, $invite, $manage) { + public function addAcl($boardId, $type, $participant, $write, $invite, $manage) { $acl = new Acl(); $acl->setBoardId($boardId); $acl->setType($type); @@ -94,6 +91,19 @@ class BoardService { $acl->setPermissionWrite($write); $acl->setPermissionInvite($invite); $acl->setPermissionManage($manage); - return $this-$this->aclMapper->insert($acl); + return $this->aclMapper->insert($acl); + } + + public function updateAcl($id, $write, $invite, $manage) { + $acl = $this->aclMapper->find($id); + $acl->setPermissionWrite($write); + $acl->setPermissionInvite($invite); + $acl->setPermissionManage($manage); + return $this->aclMapper->update($acl); + } + + public function deleteAcl($id) { + $acl = $this->aclMapper->find($id); + return $this->aclMapper->delete($acl); } } \ No newline at end of file diff --git a/templates/part.board.sidebarView.php b/templates/part.board.sidebarView.php index f99ab330b..739d8762e 100644 --- a/templates/part.board.sidebarView.php +++ b/templates/part.board.sidebarView.php @@ -18,7 +18,7 @@
- + {{ $item.participant }} @@ -32,25 +32,25 @@
    -
  • +
  • D
    - - {{ sharee.participant }} + + {{ acl.participant }} - - + + - - + + - - + + -   + Freigabe aufheben