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 @@