diff --git a/CHANGELOG.md b/CHANGELOG.md index 92dc70c47..61ee9d9cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog All notable changes to this project will be documented in this file. +## 0.4.1 - 2018-07-28 + +### Added + +- Make app compatible with Nextcloud 14 + +### Fixed + +- Fix bug with file upload on unlimited quota +- Fix issue on MySQL databases that don't support 4-byte characters +- Fix check when assigning users + ## 0.4.0 - 2018-07-11 ### Added diff --git a/appinfo/info.xml b/appinfo/info.xml index 5eee182f6..c2bc201f4 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -14,7 +14,7 @@ - 🚀 Get your project organized - 0.4.1-dev1 + 0.4.1 agpl Julius Härtl Deck diff --git a/css/comp-13.scss b/css/comp-13.scss new file mode 100644 index 000000000..770fd8727 --- /dev/null +++ b/css/comp-13.scss @@ -0,0 +1,38 @@ +#content-wrapper #content { + height: 100%; +} +#app-content { + flex-grow: 1; + height: 100%; + + &.details-visible { + margin-right: 500px; + } +} + +#app-sidebar { + right: -500px; + max-width: 100%; + width: 500px; + display:flex; + flex-direction: column; + + &.details-visible { + right: 0; + } +} + +#content[class*='app-'] * { + box-sizing: border-box; +} + +body:not(.snapjs-left) { + .app-navigation-hide { + #app-content { + margin-left: 0 !important; + } + #app-navigation { + display: none; + } + } +} \ No newline at end of file diff --git a/css/style.scss b/css/style.scss index 673c4b45c..bc863506f 100644 --- a/css/style.scss +++ b/css/style.scss @@ -70,6 +70,26 @@ input.input-inline { cursor: text; } +/** + * Generic app layout + */ + +#content { + height: 100%; + min-height: initial; +} + +.app.app-deck { + width: 100%; + height: 100%; + display: flex; +} + +#app-content { + display: flex; + flex-direction: column; +} + /** * Navigation sidebar */ @@ -238,7 +258,7 @@ input.input-inline { } } -#app-navigation-toggle { +#app-navigation-toggle-custom { width: 44px; height: 44px; cursor: pointer; @@ -617,17 +637,6 @@ input.input-inline { /** * App sidebar */ -#app-sidebar { - right: -500px; - max-width: 100%; - width: 500px; - display:flex; - flex-direction: column; - - &.details-visible { - right: 0; - } -} #sidebar-header { h3 { @@ -922,16 +931,6 @@ input.input-inline { } } -#app-content { - overflow: hidden; - display: flex; - flex-direction: column; - - &.details-visible { - margin-right: 500px; - } -} - .labels { display: block; overflow: hidden; @@ -1434,3 +1433,22 @@ input.input-inline { .ui-select-dropdown.select2-drop-active { opacity: 1 !important; } + +/** + * Custom app sidebar handling + */ +body:not(.snapjs-left) { + .app-navigation-hide { + #app-content { + margin-left: 0 !important; /* overwrite margin since we want the translateX to handle it*/ + } + #app-navigation { + transform: translateX(-300px); + } + } +} +@media only screen and (max-width: 768px) { + #app-navigation-toggle-custom { + display: none; + } +} \ No newline at end of file diff --git a/js/app/Config.js b/js/app/Config.js index 8a8510496..fcb2203fe 100644 --- a/js/app/Config.js +++ b/js/app/Config.js @@ -71,8 +71,9 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr tab: {value: 0, dynamic: true}, }, views: { - 'sidebarView': { - templateUrl: '/board.sidebarView.html' + 'sidebarView@': { + templateUrl: '/board.sidebarView.html', + controller: 'BoardController' } } }) @@ -82,7 +83,7 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr tab: {value: 0, dynamic: true}, }, views: { - 'sidebarView': { + 'sidebarView@': { templateUrl: '/card.sidebarView.html', controller: 'CardController' } diff --git a/js/app/Run.js b/js/app/Run.js index 6fef22355..60523305c 100644 --- a/js/app/Run.js +++ b/js/app/Run.js @@ -56,26 +56,6 @@ app.run(function ($document, $rootScope, $transitions, BoardService) { OC.filePath('deck', 'img', 'app-512.png') ); - $('#app-navigation-toggle').off('click'); - // App sidebar on mobile - var snapper = new Snap({ - element: document.getElementById('app-content'), - disable: 'right', - maxPosition: 250, - touchToDrag: false - }); - - $('#app-navigation-toggle').click(function () { - if ($(window).width() > 768) { - $('#app-navigation').toggle('hidden'); - } else { - if (snapper.state().state === 'left') { - snapper.close(); - } else { - snapper.open('left'); - } - } - }); // Select all elements with data-toggle="tooltips" in the document $('body').tooltip({ selector: '[data-toggle="tooltip"]' diff --git a/js/controller/AppController.js b/js/controller/AppController.js index 62f4e088a..c2e4ef4cf 100644 --- a/js/controller/AppController.js +++ b/js/controller/AppController.js @@ -30,4 +30,13 @@ app.controller('AppController', function ($scope, $location, $http, $log, $rootS $scope.sidebar = $rootScope.sidebar; $scope.user = oc_current_user; $rootScope.config = JSON.parse($attrs.config); + + $scope.appNavigationHide = false; + + $scope.toggleSidebar = function() { + if ($(window).width() > 768) { + $scope.appNavigationHide = !$scope.appNavigationHide; + console.log($scope.appNavigationHide); + } + }; }); diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index aac44b52d..528c1e416 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -61,6 +61,10 @@ class Application extends App { return $container->getServer()->getConfig()->getSystemValue('dbtype', 'sqlite'); }); + $container->registerService('database4ByteSupport', function($container) { + return $container->getServer()->getDatabaseConnection()->supports4ByteText(); + }); + // Delete user/group acl entries when they get deleted /** @var IUserManager $userManager */ $userManager = $server->getUserManager(); diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 6e06db25d..b8a8449ae 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -46,7 +46,7 @@ class PageController extends Controller { public function index() { $params = [ 'user' => $this->userId, - 'maxUploadSize' => \OCP\Util::uploadLimit(), + 'maxUploadSize' => (int)\OCP\Util::uploadLimit(), ]; return new TemplateResponse('deck', 'main', $params); } diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 7c5e78462..e0234fc43 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -38,29 +38,40 @@ class CardMapper extends DeckMapper implements IPermissionMapper { /** @var IManager */ private $notificationManager; private $databaseType; + private $database4ByteSupport; public function __construct( IDBConnection $db, LabelMapper $labelMapper, IUserManager $userManager, IManager $notificationManager, - $databaseType = 'sqlite' + $databaseType = 'sqlite', + $database4ByteSupport = true ) { parent::__construct($db, 'deck_cards', Card::class); $this->labelMapper = $labelMapper; $this->userManager = $userManager; $this->notificationManager = $notificationManager; $this->databaseType = $databaseType; + $this->database4ByteSupport = $database4ByteSupport; } public function insert(Entity $entity) { $entity->setDatabaseType($this->databaseType); $entity->setCreatedAt(time()); $entity->setLastModified(time()); + if (!$this->database4ByteSupport) { + $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); + $entity->setDescription($description); + } return parent::insert($entity); } public function update(Entity $entity, $updateModified = true) { + if (!$this->database4ByteSupport) { + $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); + $entity->setDescription($description); + } $entity->setDatabaseType($this->databaseType); if ($updateModified) { diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index f76ce220e..26fa3753c 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -195,6 +195,7 @@ class CardService { } public function assignUser($cardId, $userId) { + $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $assignments = $this->assignedUsersMapper->find($cardId); foreach ($assignments as $assignment) { if ($assignment->getParticipant() === $userId) { @@ -208,6 +209,7 @@ class CardService { } public function unassignUser($cardId, $userId) { + $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $assignments = $this->assignedUsersMapper->find($cardId); foreach ($assignments as $assignment) { if ($assignment->getParticipant() === $userId) { diff --git a/templates/main.php b/templates/main.php index 0dc3b7fb8..2cd2310e6 100644 --- a/templates/main.php +++ b/templates/main.php @@ -28,32 +28,30 @@ Util::addScript('deck', 'build/vendor'); Util::addStyle('deck', 'style'); Util::addScript('deck', 'build/deck'); + +if (\OC_Util::getVersion()[0] < 14) { + Util::addStyle('deck', 'comp-13'); +} ?> -
+
inc('part.navigation')); ?> inc('part.settings')); */ ?>
-
-
-
+
+
- - - -
+
\ No newline at end of file diff --git a/templates/part.board.mainView.php b/templates/part.board.mainView.php index 717770d59..28d366af1 100644 --- a/templates/part.board.mainView.php +++ b/templates/part.board.mainView.php @@ -37,7 +37,6 @@
- {{ cardOpen }}
diff --git a/templates/part.board.php b/templates/part.board.php deleted file mode 100644 index 7fe90db85..000000000 --- a/templates/part.board.php +++ /dev/null @@ -1,4 +0,0 @@ -inc('part.board.mainView')); ?> -
-
diff --git a/templates/part.card.php b/templates/part.card.php index 1b8a4920a..6b7146bd7 100644 --- a/templates/part.card.php +++ b/templates/part.card.php @@ -1,5 +1,5 @@ -
-
+
+

t('Drop your files here to upload it to the card')); ?>

@@ -97,8 +97,8 @@ t('Saved')); ?> t('Unsaved changes')); ?> t('Formatting help')); ?> - - + +