From c0a9f010a8925aa5a03c5c70403307809fdefa1d Mon Sep 17 00:00:00 2001 From: Julius Haertl Date: Mon, 20 Jun 2016 10:44:41 +0200 Subject: [PATCH] Add more --- appinfo/database.xml | 12 +- appinfo/info.xml | 2 +- appinfo/routes.php | 1 + appinfo/version | 2 +- controller/boardcontroller.php | 4 + controller/cardcontroller.php | 8 ++ css/style.css | 180 ++++++++++++++++++++++++------ db/board.php | 4 +- db/boardmapper.php | 10 +- db/card.php | 4 + db/cardmapper.php | 21 +++- db/deckmapper.php | 32 ++++++ db/label.php | 27 +++++ db/labelmapper.php | 48 ++++++++ js/controller/BoardController.js | 15 ++- js/controller/CardController.js | 16 ++- js/directive/avatar.js | 18 +++ js/directive/cardActionUtils.js | 29 +++++ js/public/app.js | 157 +++++++++++++++++++++++--- js/service/ApiService.js | 6 + js/service/CardService.js | 13 +++ js/service/StackService.js | 21 +++- js/service/StatusService.js | 38 +++++-- service/boardservice.php | 4 + service/cardservice.php | 5 + service/stackservice.php | 14 ++- templates/part.board.mainView.php | 64 +++++++---- templates/part.card.php | 42 ++++--- 28 files changed, 691 insertions(+), 106 deletions(-) create mode 100644 db/deckmapper.php create mode 100644 db/label.php create mode 100644 db/labelmapper.php create mode 100644 js/directive/avatar.js create mode 100644 js/directive/cardActionUtils.js diff --git a/appinfo/database.xml b/appinfo/database.xml index 7e517c92e..98c5e15a7 100644 --- a/appinfo/database.xml +++ b/appinfo/database.xml @@ -88,6 +88,12 @@ true 64 + + description + text + false + 4096 + stack_id integer @@ -207,10 +213,10 @@ false - owner - text + board_id + integer true - 64 + 8 diff --git a/appinfo/info.xml b/appinfo/info.xml index 525a4591c..0b544aee0 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -5,7 +5,7 @@ My first ownCloud app AGPL Julius Härtl - 0.0.1.7 + 0.0.1.9 Deck other diff --git a/appinfo/routes.php b/appinfo/routes.php index 67c5d4d43..2dd934a73 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -37,6 +37,7 @@ return [ ['name' => 'card#read', 'url' => '/cards/{cardId}/', 'verb' => 'GET'], ['name' => 'card#create', 'url' => '/cards/', 'verb' => 'POST'], ['name' => 'card#update', 'url' => '/cards/', 'verb' => 'PUT'], + ['name' => 'card#rename', 'url' => '/cards/rename/', 'verb' => 'PUT'], ['name' => 'card#reorder', 'url' => '/cards/reorder/', 'verb' => 'PUT'], ['name' => 'card#delete', 'url' => '/cards/{cardId}/', 'verb' => 'DELETE'], diff --git a/appinfo/version b/appinfo/version index 6acbf68f6..8038a9348 100644 --- a/appinfo/version +++ b/appinfo/version @@ -1 +1 @@ -0.0.1.4 \ No newline at end of file +0.0.1.5 \ No newline at end of file diff --git a/controller/boardcontroller.php b/controller/boardcontroller.php index d11c8d13b..664c3d848 100644 --- a/controller/boardcontroller.php +++ b/controller/boardcontroller.php @@ -53,4 +53,8 @@ class BoardController extends Controller { public function delete($boardId) { return $this->boardService->delete($this->userId, $boardId); } + + public function labels($boardId) { + return $this->boardService->labels($this->boardId); + } } diff --git a/controller/cardcontroller.php b/controller/cardcontroller.php index 0abfcde6b..7a5532c5f 100644 --- a/controller/cardcontroller.php +++ b/controller/cardcontroller.php @@ -35,6 +35,12 @@ class CardController extends Controller { */ public function reorder($cardId, $stackId, $order) { return $this->cardService->reorder($cardId, $stackId, $order); + } + /** + * @NoAdminRequired + */ + public function rename($cardId, $title) { + return $this->cardService->rename($cardId, $title); } /** * @NoAdminRequired @@ -54,4 +60,6 @@ class CardController extends Controller { public function delete($cardId) { return $this->cardService->delete($this->userId, $cardId); } + + } diff --git a/css/style.css b/css/style.css index 66d99b186..7868128e2 100644 --- a/css/style.css +++ b/css/style.css @@ -45,14 +45,45 @@ color: #333333; padding-right:250px; z-index:100; - background-color:#ffffff; + background-color:#f7f7f7; } -#board .board-actions { +#board-actions { position:absolute; right:5px; top:5px; z-index:999; } +#board-actions .filter { + margin-left:10px; + margin-right:10px; + position:relative; +} +#board-actions .filter:hover { + color:#333333; + cursor: pointer; +} + +.filter .filter-select { + position: absolute; + top: 42px; + right: -15px; + width: 100px; +} +.filter .filter-select li { + padding: 3px; + overflow: hidden; + width:auto; +} +.filter .filter-select li span { + display: block; + float: left; + width: 20px;height:20px; + margin-right:5px; +} +#board-actions div { + padding:5px; + float:left; +} .board-actions button { border: none; background-color: transparent; @@ -99,17 +130,34 @@ float:right; } .card { - background-color:#fafafa; - border: 1px solid #aaa; + background-color:#f6f6f6; margin:5px; - padding:5px; + white-space: normal; padding-bottom:4px; - overflow: hidden; position: relative; opacity: 1.0; } +.card-upper { + overflow: hidden; + position: relative; + padding:5px; +} +.card .card-options { + position: absolute; + bottom: 10px; + right:10px; +} +.card .popovermenu { + z-index:999; + opacity: 1; + margin-left: 10px; +} + +.card .card-assignees { + margin:5px; +} .card:hover { - opacity: 0.6; + background-color:#fcfcfc; } .card a { display:block; @@ -119,13 +167,43 @@ font-size:10pt; margin:0; padding:0; - margin-bottom:20px; + margin-bottom:-5px; + margin-top:15px; + display: inline-block; + float:left; } .card h3 .fa { font-size:18pt; line-height:10pt; vertical-align: middle; } +.card .labels { + position: absolute; + top:-5px; + left:5px; + +} +.card .labels li { + padding:0px; + width:15px; + height:20px; + -webkit-border-radius: 3px; + font-size:80%; + border-color: transparent; + border:none; + float:left; +} +.card .labels li span { + display: none; +} +.card .labels li:hover { + +} +.card .labels li:hover span { + position:absolute; + padding:3px; + background-color: inherit; +} .as-sortable-placeholder { margin:5px; @@ -133,23 +211,7 @@ border: 1px dashed #aaa; } -.labels { - position:absolute; - top:0px; - margin-top:3px; - right:0px; -} -.labels li { - padding:3px; - line-height:100%; - color:white; - font-size:10px; - font-weight:600; - text-align:right; - padding-left:3px; - pdading-right:5px; - border-right:5px solid #aaaaaa; -} + .info { padding-left:5px; padding-right:5px; @@ -166,7 +228,10 @@ .card.create { text-align:center; margin:0; + padding:0; + padding-top:4px; border: none; + overflow:hidden; } .card.create:hover { text-align:center; @@ -175,6 +240,7 @@ .card.create h3 { margin:0; padding:0; + width: 100%; } .card.create h3 input { width:100%; @@ -188,7 +254,7 @@ border-bottom:1px solid #ffffff; border-radius: 0px; color: #ffffff; - background-color: transparent; + background-color: transparent !important; } .card.create .fa { color:#ffffff; @@ -213,12 +279,25 @@ } #card-header h2 { font-weight:600; - background-color: #f3f3f3; padding:10px; overflow: hidden; + margin-bottom:0px; + background-color:#f0f0f0; } -#card-header h2 .icon-close { - float:right; +#card-header .icon-close { + position: absolute; + top:5px; + right:5px; +} +#card-meta { + padding-top:0px; +} +#card-dates { + font-size:80%; + color: #aaaaaa; + margin-bottom: 3px; +} +#card-dates span { } #card-description textarea { @@ -250,10 +329,18 @@ #app-content.details-visible { margin-right: 500px; } -#card-header .labels { - float:right; - position:relative; - +.labels { + display:block; + overflow:hidden; +} +.labels li { + padding:1px; + -webkit-border-radius: 3px; + margin:1px; + float:left; + color: #ffffff; + font-size:80%; + font-weight:900; } #assigned-users { padding:10px; @@ -312,4 +399,29 @@ #boardlist input { float:left; } -#boardlist .colorselect {margin-top:5px;} \ No newline at end of file +#boardlist .colorselect {margin-top:5px;} + +input.input-inline { + font-size: inherit !important; + font-weight: inherit; + background-color:transparent; + padding:0; + margin:0; + border:none; + width:100%; + border-bottom:1px solid #333333; + -webkit-border-radius: 0; + margin-top:-4px; + line-height:100%; + margin-bottom: -4px; + +} + +button { + border:0; + background-color: transparent; +} +button:hover { + border:0; + background-color: transparent; +} \ No newline at end of file diff --git a/db/board.php b/db/board.php index 40e6ad91c..4ab22fe62 100644 --- a/db/board.php +++ b/db/board.php @@ -12,6 +12,7 @@ class Board extends Entity implements JsonSerializable { protected $owner; protected $color; protected $archived; + protected $labels; public function __construct() { $this->addType('id','integer'); } @@ -20,7 +21,8 @@ class Board extends Entity implements JsonSerializable { 'id' => $this->id, 'title' => $this->title, 'owner' => $this->owner, - 'color' => $this->color + 'color' => $this->color, + 'labels' => $this->labels, ]; } } \ No newline at end of file diff --git a/db/boardmapper.php b/db/boardmapper.php index 936fdf345..94b4b5c8f 100644 --- a/db/boardmapper.php +++ b/db/boardmapper.php @@ -9,8 +9,11 @@ use OCP\AppFramework\Db\Mapper; class BoardMapper extends Mapper { - public function __construct(IDb $db) { + private $labelMapper; + + public function __construct(IDb $db, LabelMapper $labelMapper) { parent::__construct($db, 'deck_boards', '\OCA\Deck\Db\Board'); + $this->labelMapper = $labelMapper; } @@ -21,7 +24,10 @@ class BoardMapper extends Mapper { public function find($id) { $sql = 'SELECT * FROM `*PREFIX*deck_boards` ' . 'WHERE `id` = ?'; - return $this->findEntity($sql, [$id]); + $board = $this->findEntity($sql, [$id]); + $labels = $this->labelMapper->findAll($id); + $board->setLabels($labels); + return $board; } diff --git a/db/card.php b/db/card.php index b5e2f1ab4..811bb4038 100644 --- a/db/card.php +++ b/db/card.php @@ -9,10 +9,12 @@ class Card extends Entity implements JsonSerializable { public $id; protected $title; + protected $description; protected $stackId; protected $type; protected $lastModified; protected $createdAt; + protected $labels; protected $owner; protected $order; public function __construct() { @@ -25,12 +27,14 @@ class Card extends Entity implements JsonSerializable { return [ 'id' => $this->id, 'title' => $this->title, + 'description' => $this->description, 'type' => $this->type, 'lastModified' => $this->lastModified, 'createdAt' => $this->createdAt, 'owner' => $this->owner, 'order' => $this->order, 'stackId' => $this->stackId, + 'labels' => $this->labels, ]; } } \ No newline at end of file diff --git a/db/cardmapper.php b/db/cardmapper.php index 8c0293a57..181c1cbd7 100644 --- a/db/cardmapper.php +++ b/db/cardmapper.php @@ -13,6 +13,21 @@ class CardMapper extends Mapper { public function __construct(IDb $db) { parent::__construct($db, 'deck_cards', '\OCA\Deck\Db\Card'); } + + public function insert(Entity $entity) { + $entity->setCreatedAt(time()); + $entity->setLastModified(time()); + return parent::insert($entity); + } + + /** + * @param Entity $entity + * @return Entity + */ + public function update(Entity $entity) { + $entity->setLastModified(time()); + return parent::update($entity); + } /** @@ -25,10 +40,14 @@ class CardMapper extends Mapper { return $this->findEntity($sql, [$id]); } + public function findAllByBoard($boardId, $limit=null, $offset=null) { + + } public function findAll($stackId, $limit=null, $offset=null) { $sql = 'SELECT * FROM `*PREFIX*deck_cards` WHERE `stack_id` = ? ORDER BY `order`'; - return $this->findEntities($sql, [$stackId], $limit, $offset); + $entities = $this->findEntities($sql, [$stackId], $limit, $offset); + return $entities; } public function delete(Entity $entity) { diff --git a/db/deckmapper.php b/db/deckmapper.php new file mode 100644 index 000000000..d5f6d95b2 --- /dev/null +++ b/db/deckmapper.php @@ -0,0 +1,32 @@ +tableName . '` ' . 'WHERE `id` = ?'; + return $this->findEntity($sql, [$id]); + } + + /** + * Add relational data to an Entity by calling the related Mapper + * @param $entities + * @param $entityType + * @param $property + * addRelation($cards, $labels, function($one, $many) { + * if($one->id == $many->cardId) + * } + */ + public function addRelation($entities, $entityType, $property) { + + } + +} \ No newline at end of file diff --git a/db/label.php b/db/label.php new file mode 100644 index 000000000..6949faee4 --- /dev/null +++ b/db/label.php @@ -0,0 +1,27 @@ +addType('id','integer'); + } + public function jsonSerialize() { + return [ + 'id' => $this->id, + 'title' => $this->title, + 'boardId' => $this->boardId, + 'cardId' => $this->cardId, + 'color' => $this->color, + ]; + } +} \ No newline at end of file diff --git a/db/labelmapper.php b/db/labelmapper.php new file mode 100644 index 000000000..ec1dc984f --- /dev/null +++ b/db/labelmapper.php @@ -0,0 +1,48 @@ +findEntities($sql, [$boardId], $limit, $offset); + } + + public function delete(Entity $entity) { + // FIXME: delete linked elements, because owncloud doesn't support foreign keys for apps + return parent::delete($entity); + } + + public function findAssignedLabelsForCard($cardId) { + $sql = 'SELECT * FROM `*PREFIX*deck_assigned_labels` as al JOIN *PREFIX*deck_labels as l ON l.id = al.label_id WHERE `card_id` = ?'; + return $this->findEntities($sql, [$cardId], $limit, $offset); + } + public function findAssignedLabelsForBoard($boardId, $limit=null, $offset=null) { + $sql = "SELECT c.id as card_id, l.id as id, l.title as title, color FROM oc_deck_cards as c " . + "JOIN oc_deck_assigned_labels as al, oc_deck_labels as l ON al.card_id = c.id AND al.label_id = l.id WHERE board_id=?"; + $entities = $this->findEntities($sql, [$boardId], $limit, $offset); + return $entities; + } + + public function getAssignedLabelsForBoard($boardId) { + $labels = $this->findAssignedLabelsForBoard($boardId); + $result = array(); + foreach ($labels as $label) { + if(!is_array($result[$label->getCardId()])) { + $result[$label->getCardId()] = array(); + } + $result[$label->getCardId()][] = $label; + } + return $result; + } +} \ No newline at end of file diff --git a/js/controller/BoardController.js b/js/controller/BoardController.js index f1671a9bf..d01e52808 100644 --- a/js/controller/BoardController.js +++ b/js/controller/BoardController.js @@ -7,18 +7,25 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St $scope.stackservice = StackService; $scope.boardservice = BoardService; - $scope.statusservice = StatusService; + $scope.statusservice = StatusService.getInstance(); + // fetch data StackService.clear(); + $scope.statusservice.retainWaiting(); + $scope.statusservice.retainWaiting(); + console.log("foo"); StackService.fetchAll($scope.id).then(function(data) { + console.log(data); + $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); }); BoardService.fetchOne($scope.id).then(function(data) { + $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); @@ -48,6 +55,12 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St }); } + $scope.cardDelete = function(card) { + CardService.delete(card.id); + StackService.deleteCard(card); + + } + // Lighten Color of the board for background usage $scope.rgblight = function (hex) { var result = /^([A-Fa-f\d]{2})([A-Fa-f\d]{2})([A-Fa-f\d]{2})$/i.exec(hex); diff --git a/js/controller/CardController.js b/js/controller/CardController.js index 999cfefcd..547904c92 100644 --- a/js/controller/CardController.js +++ b/js/controller/CardController.js @@ -1,17 +1,31 @@ -app.controller('CardController', function ($scope, $rootScope, $routeParams, $location, $stateParams, CardService) { +app.controller('CardController', function ($scope, $rootScope, $routeParams, $location, $stateParams, BoardService, CardService, StackService, StatusService) { $scope.sidebar = $rootScope.sidebar; $scope.cardservice = CardService; $scope.cardId = $stateParams.cardId; + $scope.statusservice = StatusService.getInstance(); + $scope.boardservice = BoardService; + + $scope.statusservice.retainWaiting(); + CardService.fetchOne($scope.cardId).then(function(data) { + $scope.statusservice.releaseWaiting(); + console.log(data); }, function(error) { }); + // handle rename to update information on the board as well + $scope.renameCard = function(card) { + CardService.rename(card).then(function(data) { + StackService.updateCard(card); + $scope.status.renameCard = false; + }); + }; /*var menu = $('#app-content'); diff --git a/js/directive/avatar.js b/js/directive/avatar.js new file mode 100644 index 000000000..72433cf6d --- /dev/null +++ b/js/directive/avatar.js @@ -0,0 +1,18 @@ +app.directive('avatar', function() { + 'use strict'; + return { + restrict: 'A', + scope: false, + link: function(scope, elm, attr) { + return attr.$observe('user', function() { + if (attr.user) { + var url = OC.generateUrl('/avatar/{user}/{size}', + {user: attr.user, size: Math.ceil(attr.size * window.devicePixelRatio)}); + var inner = ''; + elm.html(inner); + //elm.avatar(attr.user, attr.size); + } + }); + } + }; +}); \ No newline at end of file diff --git a/js/directive/cardActionUtils.js b/js/directive/cardActionUtils.js new file mode 100644 index 000000000..d31432031 --- /dev/null +++ b/js/directive/cardActionUtils.js @@ -0,0 +1,29 @@ +// OwnCloud Click Handling +// https://doc.owncloud.org/server/8.0/developer_manual/app/css.html +app.directive('cardActionUtils', function () { + 'use strict'; + return { + restrict: 'C', + scope: { + ngModel : '=', + }, + link: function (scope, elm) { + console.log(scope); +/* + var menu = elm.siblings('.popovermenu'); + var button = $(elm) + .find('li a'); + + button.click(function () { + menu.toggleClass('open'); + }); + scope.$on('documentClicked', function (scope, event) { + if (event.target !== button[0]) { + menu.removeClass('open'); + } + }); + */ + } + }; +}); + diff --git a/js/public/app.js b/js/public/app.js index 0946b83c3..ddd4f768f 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -69,18 +69,25 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat $scope.stackservice = StackService; $scope.boardservice = BoardService; - $scope.statusservice = StatusService; + $scope.statusservice = StatusService.getInstance(); + // fetch data StackService.clear(); + $scope.statusservice.retainWaiting(); + $scope.statusservice.retainWaiting(); + console.log("foo"); StackService.fetchAll($scope.id).then(function(data) { + console.log(data); + $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); }); BoardService.fetchOne($scope.id).then(function(data) { + $scope.statusservice.releaseWaiting(); }, function(error) { $scope.statusservice.setError('Error occured', error); @@ -110,6 +117,12 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat }); } + $scope.cardDelete = function(card) { + CardService.delete(card.id); + StackService.deleteCard(card); + + } + // Lighten Color of the board for background usage $scope.rgblight = function (hex) { var result = /^([A-Fa-f\d]{2})([A-Fa-f\d]{2})([A-Fa-f\d]{2})$/i.exec(hex); @@ -176,18 +189,32 @@ app.controller('BoardController', ["$rootScope", "$scope", "$stateParams", "Stat -app.controller('CardController', ["$scope", "$rootScope", "$routeParams", "$location", "$stateParams", "CardService", function ($scope, $rootScope, $routeParams, $location, $stateParams, CardService) { +app.controller('CardController', ["$scope", "$rootScope", "$routeParams", "$location", "$stateParams", "BoardService", "CardService", "StackService", "StatusService", function ($scope, $rootScope, $routeParams, $location, $stateParams, BoardService, CardService, StackService, StatusService) { $scope.sidebar = $rootScope.sidebar; $scope.cardservice = CardService; $scope.cardId = $stateParams.cardId; + $scope.statusservice = StatusService.getInstance(); + $scope.boardservice = BoardService; + + $scope.statusservice.retainWaiting(); + CardService.fetchOne($scope.cardId).then(function(data) { + $scope.statusservice.releaseWaiting(); + console.log(data); }, function(error) { }); + // handle rename to update information on the board as well + $scope.renameCard = function(card) { + CardService.rename(card).then(function(data) { + StackService.updateCard(card); + $scope.status.renameCard = false; + }); + }; /*var menu = $('#app-content'); @@ -270,6 +297,54 @@ app.directive('autofocusOnInsert', function () { elm.focus(); }; }); +app.directive('avatar', function() { + 'use strict'; + return { + restrict: 'A', + scope: false, + link: function(scope, elm, attr) { + return attr.$observe('user', function() { + if (attr.user) { + var url = OC.generateUrl('/avatar/{user}/{size}', + {user: attr.user, size: Math.ceil(attr.size * window.devicePixelRatio)}); + var inner = ''; + elm.html(inner); + //elm.avatar(attr.user, attr.size); + } + }); + } + }; +}); +// OwnCloud Click Handling +// https://doc.owncloud.org/server/8.0/developer_manual/app/css.html +app.directive('cardActionUtils', function () { + 'use strict'; + return { + restrict: 'C', + scope: { + ngModel : '=', + }, + link: function (scope, elm) { + console.log(scope); +/* + var menu = elm.siblings('.popovermenu'); + var button = $(elm) + .find('li a'); + + button.click(function () { + menu.toggleClass('open'); + }); + scope.$on('documentClicked', function (scope, event) { + if (event.target !== button[0]) { + menu.removeClass('open'); + } + }); + */ + } + }; +}); + + app.factory('ApiService', ["$http", "$q", function($http, $q){ var ApiService = function(http, endpoint) { this.endpoint = endpoint; @@ -298,8 +373,14 @@ app.factory('ApiService', ["$http", "$q", function($http, $q){ } ApiService.prototype.fetchOne = function (id) { + this.id = id; var deferred = $q.defer(); + + if(id===undefined) { + return deferred.promise; + } + var self = this; $http.get(this.baseUrl + '/' + id).then(function (response) { data = response.data; @@ -422,6 +503,19 @@ app.factory('CardService', ["ApiService", "$http", "$q", function(ApiService, $h }); return deferred.promise; } + + CardService.prototype.rename = function(card) { + var deferred = $q.defer(); + var self = this; + $http.put(this.baseUrl + '/rename', {cardId: card.id, title: card.title}).then(function (response) { + self.data[card.id].title = card.title; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error while renaming ' + self.endpoint); + }); + return deferred.promise; + } + service = new CardService($http, 'cards', $q) return service; }]); @@ -444,30 +538,50 @@ app.factory('StackService', ["ApiService", "$http", "$q", function(ApiService, $ } StackService.prototype.addCard = function(entity) { - console.log(this.data[entity.stackId]); this.data[entity.stackId].cards.push(entity); } - service = new StackService($http, 'stacks', $q) + StackService.prototype.updateCard = function(entity) { + var self = this; + var cards = this.data[entity.stackId].cards; + for(var i=0;i0) this.counter--; if(this.counter<=0) { @@ -484,10 +598,25 @@ app.service('StatusService', function(){ } } - this.unsetStatus = function() { + StatusService.prototype.retainWaiting = function() { + this.active = true; + this.icon = 'loading'; + this.title = 'Please wait'; + this.text = 'Es dauert noch einen kleinen Moment'; + this.counter++; + } + + StatusService.prototype.unsetStatus = function() { this.active = false; } + return { + getInstance: function() { + return new StatusService(); + } + } + }); + diff --git a/js/service/ApiService.js b/js/service/ApiService.js index 2c173ab3f..241fbf0b8 100644 --- a/js/service/ApiService.js +++ b/js/service/ApiService.js @@ -26,8 +26,14 @@ app.factory('ApiService', function($http, $q){ } ApiService.prototype.fetchOne = function (id) { + this.id = id; var deferred = $q.defer(); + + if(id===undefined) { + return deferred.promise; + } + var self = this; $http.get(this.baseUrl + '/' + id).then(function (response) { data = response.data; diff --git a/js/service/CardService.js b/js/service/CardService.js index 1ff2b4f5d..36c60d518 100644 --- a/js/service/CardService.js +++ b/js/service/CardService.js @@ -15,6 +15,19 @@ app.factory('CardService', function(ApiService, $http, $q){ }); return deferred.promise; } + + CardService.prototype.rename = function(card) { + var deferred = $q.defer(); + var self = this; + $http.put(this.baseUrl + '/rename', {cardId: card.id, title: card.title}).then(function (response) { + self.data[card.id].title = card.title; + deferred.resolve(response.data); + }, function (error) { + deferred.reject('Error while renaming ' + self.endpoint); + }); + return deferred.promise; + } + service = new CardService($http, 'cards', $q) return service; }); \ No newline at end of file diff --git a/js/service/StackService.js b/js/service/StackService.js index aaf799df2..b60d3cac3 100644 --- a/js/service/StackService.js +++ b/js/service/StackService.js @@ -17,10 +17,27 @@ app.factory('StackService', function(ApiService, $http, $q){ } StackService.prototype.addCard = function(entity) { - console.log(this.data[entity.stackId]); this.data[entity.stackId].cards.push(entity); } - service = new StackService($http, 'stacks', $q) + StackService.prototype.updateCard = function(entity) { + var self = this; + var cards = this.data[entity.stackId].cards; + for(var i=0;i0) this.counter--; if(this.counter<=0) { @@ -30,9 +33,24 @@ app.service('StatusService', function(){ } } - this.unsetStatus = function() { + StatusService.prototype.retainWaiting = function() { + this.active = true; + this.icon = 'loading'; + this.title = 'Please wait'; + this.text = 'Es dauert noch einen kleinen Moment'; + this.counter++; + } + + StatusService.prototype.unsetStatus = function() { this.active = false; } + return { + getInstance: function() { + return new StatusService(); + } + } + }); + diff --git a/service/boardservice.php b/service/boardservice.php index da9df2763..0eaab0631 100644 --- a/service/boardservice.php +++ b/service/boardservice.php @@ -59,4 +59,8 @@ class BoardService { $board->setColor($color); return $this->boardMapper->update($board); } + + public function labels($boardId) { + + } } \ No newline at end of file diff --git a/service/cardservice.php b/service/cardservice.php index 2d5bd138b..f19b47c93 100644 --- a/service/cardservice.php +++ b/service/cardservice.php @@ -49,6 +49,11 @@ class CardService { return $this->cardMapper->update($card); } + public function rename($id, $title) { + $card = $this->cardMapper->find($id); + $card->setTitle($title); + return $this->cardMapper->update($card); + } public function reorder($id, $stackId, $order) { $cards = $this->cardMapper->findAll($stackId); $i = 0; diff --git a/service/stackservice.php b/service/stackservice.php index 69d735276..a55b63219 100644 --- a/service/stackservice.php +++ b/service/stackservice.php @@ -3,12 +3,14 @@ namespace OCA\Deck\Service; use OCA\Deck\Db\CardMapper; +use OCA\Deck\Db\LabelMapper; use OCP\ILogger; use OCP\IL10N; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Utility\ITimeFactory; use \OCA\Deck\Db\Stack; + use \OCA\Deck\Db\StackMapper; @@ -19,19 +21,27 @@ class StackService { private $logger; private $l10n; private $timeFactory; + private $labelMapper; - public function __construct(StackMapper $stackMapper, CardMapper $cardMapper,ILogger $logger, + public function __construct(StackMapper $stackMapper, CardMapper $cardMapper, LabelMapper $labelMapper, ILogger $logger, IL10N $l10n, ITimeFactory $timeFactory) { $this->stackMapper = $stackMapper; $this->cardMapper = $cardMapper; + $this->labelMapper = $labelMapper; $this->logger = $logger; } public function findAll($boardId) { $stacks = $this->stackMapper->findAll($boardId); + $labels = $this->labelMapper->getAssignedLabelsForBoard($boardId); + foreach ($stacks as $idx => $s) { - $stacks[$idx]->setCards($this->cardMapper->findAll($s->id)); + $cards = $this->cardMapper->findAll($s->id); + foreach ($cards as $idxc => $card) { + $cards[$idxc]->setLabels($labels[$card->id]); + } + $stacks[$idx]->setCards($cards); } return $stacks; } diff --git a/templates/part.board.mainView.php b/templates/part.board.mainView.php index 44cd00e70..11023d20b 100644 --- a/templates/part.board.mainView.php +++ b/templates/part.board.mainView.php @@ -5,21 +5,32 @@

{{ statusservice.text }}

-

+

{{ boardservice.data[id].title }}

- - - - -
*/ ?> +
+ +
Filter
+
by label +
    +
  • {{ label.title }}
  • +
+
+
by creator
+
by members
+ +
+
+
+ +
+
-
+

{{ s.title }}
- +
@@ -28,24 +39,39 @@

+ + //--> - - +
-

+

+ +

@@ -53,7 +79,7 @@

- +

diff --git a/templates/part.card.php b/templates/part.card.php index d31a607be..20d754e2a 100644 --- a/templates/part.card.php +++ b/templates/part.card.php @@ -1,14 +1,29 @@ +
+
+
+

{{ statusservice.title }}

+

{{ statusservice.text }}

+
+   +

+
+ +
+
{{ cardservice.getCurrent().title }}
+

+
-

{{ cardservice.getCurrent().title }}  

- Modified: {{ cardservice.getCurrent().modifiedAt }} - Created: {{ cardservice.getCurrent().createdAt }} -
    -
  • important
  • -
  • action-needed
  • -
  • action-needed
  • -
  • action-needed
  • -
+
+
+ Modified: {{ cardservice.getCurrent().lastModified*1000|date:'medium' }} + Created: {{ cardservice.getCurrent().createdAt*1000|date:'medium' }} +
+
    +
  • important
  • +
  • action-needed
  • +
  • action-needed
  • +
D
E
@@ -18,13 +33,12 @@
- + +
Saved
- + \ No newline at end of file