Compare commits

...

68 Commits

Author SHA1 Message Date
Julius Härtl
e8e50a3e31 Fix more 14 layout issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-28 13:06:40 +02:00
Julius Härtl
769053b76d Merge pull request #545 from steav/issue-475-notifications-on-card-assignment
Add notification on card assignment to user, fixes #475
2018-07-28 12:32:54 +02:00
Julius Härtl
1948c303f2 Add missing import statement
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-28 12:25:23 +02:00
steav
476b15ee9d Fix tests for card assignment notification
Signed-off-by: steav <steav8@gmail.com>
2018-07-28 12:17:28 +02:00
steav
9595e00ae1 Do not send card assignment notifications to ourselves
Signed-off-by: steav <steav8@gmail.com>
2018-07-28 12:17:28 +02:00
steav
fdc1f275c5 Add tests for card assignment notification
Signed-off-by: steav <steav8@gmail.com>
2018-07-28 12:17:28 +02:00
steav
1276dddc37 Fix failing CardServiceTest
Signed-off-by: steav <steav8@gmail.com>
2018-07-28 12:17:28 +02:00
Steav
ed62a48ddd Add richsubject to notification on user assignment
Signed-off-by: Steav <steav8@gmail.com>
2018-07-28 12:17:28 +02:00
Steav
327c379ff3 Undo manual changes to l10n files
Signed-off-by: Steav <steav8@gmail.com>
2018-07-28 12:17:27 +02:00
Steav
77472b978d Add notification on card assignment to user
Signed-off-by: Steav <steav8@gmail.com>
2018-07-28 12:16:50 +02:00
Julius Härtl
e81c08f7f0 Create pull_request_template.md
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-28 12:07:34 +02:00
Nextcloud bot
1e24b3d774 [tx-robot] updated from transifex 2018-07-28 00:18:40 +00:00
Nextcloud bot
a4044eff30 [tx-robot] updated from transifex 2018-07-27 00:18:55 +00:00
Julius Härtl
31c690ebf8 Merge pull request #554 from nextcloud/bugfix/550/make-14-compatible
Compatibility for Nextcloud 14
2018-07-27 00:15:02 +02:00
Julius Härtl
b84f118b4d Fix eslint
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-27 00:06:34 +02:00
Julius Härtl
c33783ac81 Cleanup css
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-27 00:06:33 +02:00
Julius Härtl
725ba6ff72 Move app sidebar handling to angular/css
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-27 00:06:33 +02:00
Julius Härtl
bf9811bf11 Add CSS rules for 13 to be backward compatible
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-27 00:06:33 +02:00
Julius Härtl
e08c430422 Move app sidebar out of app content
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-27 00:06:33 +02:00
Nextcloud bot
c72000bfc0 [tx-robot] updated from transifex 2018-07-26 00:18:56 +00:00
Julius Härtl
a131e468c0 Merge pull request #544 from philippe-levan/assign_to_me_feature
"assign to me" feature
2018-07-25 21:53:20 +02:00
Julius Härtl
d4a16589af Merge branch 'master' into assign_to_me_feature 2018-07-25 21:45:32 +02:00
Philippe Le Van
5e69a453a2 added TODO comment for jquery calls 2018-07-25 20:57:51 +02:00
Julius Härtl
23d3425ca4 Merge pull request #541 from nextcloud/bugfix/532/4byte-description
Simly remove 4byte chars from the description if those are not supported
2018-07-25 18:51:57 +02:00
Julius Härtl
653a1ccd58 Merge pull request #555 from nextcloud/bugfix/543/permissions
Check when assigning users
2018-07-25 18:51:29 +02:00
Julius Härtl
09105d6e3d Check when assigning users
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-25 18:39:08 +02:00
Julius Härtl
4d8acecc57 Simly remove 4byte chars from the description if those are not supported
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-25 18:33:24 +02:00
Julius Härtl
8d54028b31 Remove stable12 from drone tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-24 19:45:15 +02:00
Julius Härtl
415acfce57 Bump development version and make NC13 a minimum
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-24 19:44:07 +02:00
Philippe Le Van
f25401e9fd assign to me feature
codacy fix

codacy fix #2

revert translation files

coding style : spaces to tabs

Signed-off-by: Philippe Le Van <philippe.levan@kibatic.com>
2018-07-24 09:40:57 +02:00
Nextcloud bot
bcf26cee53 [tx-robot] updated from transifex 2018-07-24 00:18:21 +00:00
Julius Härtl
161bfb0e91 Merge pull request #547 from nextcloud/dependabot/npm_and_yarn/js/webpack-cli-3.1.0
Bump webpack-cli from 3.0.8 to 3.1.0 in /js
2018-07-23 12:22:17 +02:00
Julius Härtl
c1e52d7837 Merge pull request #548 from nextcloud/dependabot/npm_and_yarn/js/@uirouter/angularjs-1.0.19
Bump @uirouter/angularjs from 1.0.18 to 1.0.19 in /js
2018-07-23 12:22:04 +02:00
Julius Härtl
9cb096046a Merge pull request #546 from nextcloud/dependabot/npm_and_yarn/js/markdown-it-8.4.2
Bump markdown-it from 8.4.1 to 8.4.2 in /js
2018-07-23 12:21:45 +02:00
dependabot[bot]
3c32f0533a Bump markdown-it from 8.4.1 to 8.4.2 in /js
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 8.4.1 to 8.4.2.
- [Release notes](https://github.com/markdown-it/markdown-it/releases)
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/8.4.1...8.4.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-23 09:57:39 +00:00
dependabot[bot]
3bf197bb32 Bump @uirouter/angularjs from 1.0.18 to 1.0.19 in /js
Bumps [@uirouter/angularjs](https://github.com/angular-ui/ui-router) from 1.0.18 to 1.0.19.
- [Release notes](https://github.com/angular-ui/ui-router/releases)
- [Changelog](https://github.com/angular-ui/ui-router/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular-ui/ui-router/compare/1.0.18...1.0.19)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-23 09:57:34 +00:00
dependabot[bot]
4dc5c7da18 Bump webpack-cli from 3.0.8 to 3.1.0 in /js
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 3.0.8 to 3.1.0.
- [Release notes](https://github.com/webpack/webpack-cli/releases)
- [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-cli/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-23 09:57:18 +00:00
Julius Härtl
9ad070f40a Merge pull request #549 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.16.1
Bump webpack from 4.16.0 to 4.16.1 in /js
2018-07-23 11:55:24 +02:00
dependabot[bot]
a806714f56 Bump webpack from 4.16.0 to 4.16.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.16.0 to 4.16.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.16.0...v4.16.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-23 01:14:57 +00:00
Nextcloud bot
bd630e31bc [tx-robot] updated from transifex 2018-07-23 00:18:16 +00:00
Nextcloud bot
6313f24dc9 [tx-robot] updated from transifex 2018-07-20 00:18:38 +00:00
Nextcloud bot
5a5cd23eb2 [tx-robot] updated from transifex 2018-07-19 00:18:20 +00:00
Nextcloud bot
7fda7c1a4a [tx-robot] updated from transifex 2018-07-17 00:18:29 +00:00
Julius Härtl
ab637c7c13 Merge pull request #538 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.16.0
Bump webpack from 4.15.1 to 4.16.0 in /js
2018-07-16 11:41:46 +02:00
dependabot[bot]
7f497d59bc Bump webpack from 4.15.1 to 4.16.0 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.15.1 to 4.16.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.15.1...v4.16.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-16 01:13:39 +00:00
Nextcloud bot
d794d61337 [tx-robot] updated from transifex 2018-07-16 00:18:17 +00:00
Julius Härtl
9f03854b3c Merge pull request #536 from philippe-levan/patch-1
click on assign user or the plus button
2018-07-15 15:13:41 +02:00
Nextcloud bot
17996822d3 [tx-robot] updated from transifex 2018-07-15 00:18:13 +00:00
Philippe Le Van (@plv)
ee438ad7b2 click on assign user or the plus button
Hi,

We often add users on cards. I believe the button to assign a user shoud be bigger.

I suggest with this PR to make all the header clickable to assign a new user (but I let the button with the hover to let the UI intuitive).

Best regards,
Phillippe
2018-07-14 16:46:37 +02:00
Julius Härtl
6bf4efbfe6 Merge pull request #527 from Nebri/issue_197
Add default board
2018-07-14 12:12:30 +02:00
Julius Härtl
3163563fce Merge branch 'master' into issue_197 2018-07-14 11:57:53 +02:00
Ryan Fletcher
04cb5f656d Mocked up $this->l10n calls in DefaultBoardServiceTest
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-13 08:53:21 -04:00
Ryan Fletcher
3863c7497b Used $l10n references in my unit test, this should allow it pass.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-12 12:15:46 -04:00
Ryan Fletcher
8d4dbd4d82 Fixed up code styles as per review by juliushaertl
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-12 11:17:11 -04:00
Julius Härtl
8f4fe1b05b Merge pull request #529 from nextcloud/bugfix/528/cast-inf
Cast uploadLimit to integer to catch possible INF result
2018-07-12 16:43:32 +02:00
Julius Härtl
7794fa065c Cast uploadLimit to integer to catch possible INF result
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-12 16:06:17 +02:00
Ryan Fletcher
af92da9a7c Removing translations I attempted to put in before knowing the process.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 16:18:00 -04:00
Ryan Fletcher
ba378ea00b First attempt at using l10n
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 15:00:08 -04:00
Ryan Fletcher
be8a3479ac Updated PageControllerTest.php to reflect new changes
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 13:33:04 -04:00
Ryan Fletcher
2002841c61 Wrote unit tests for checkFirstRun method in the default board service
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 12:59:40 -04:00
Ryan Fletcher
08f9874745 Updated constructor in PageControllerTest
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 11:50:11 -04:00
Ryan Fletcher
712ab9e0bc Corrected testCreateDefaultBoard()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 11:49:20 -04:00
Ryan Fletcher
e07fc0a2c7 Corrected missing import and missing parameter in defaultBoardServiceTest
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 10:49:46 -04:00
Ryan Fletcher
61fb68f4cf Added a unit test against DefaultBoardService->TestCreateDefaultBoard()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 10:20:42 -04:00
Ryan Fletcher
8a8cffc542 Completed checkFirstRun() in DefaultBoardService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-11 08:02:54 -04:00
Ryan Fletcher
a36dfcc144 first attempt at writing the checkFirstRun() in DefaultBoardService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-10 21:16:24 -04:00
Ryan Fletcher
683354da9d corrected null errors from first attempt.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-10 19:30:47 -04:00
Ryan Fletcher
e208fd8222 First Attempt at implementing createDefaultBoard()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-07-10 17:10:27 -04:00
58 changed files with 1044 additions and 301 deletions

View File

@@ -22,11 +22,11 @@ pipeline:
when:
matrix:
TESTS: check-app-compatbility
check-app-compatbility-12:
check-app-compatbility-13:
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=stable12
- CORE_BRANCH=stable13
- DB=sqlite
commands:
# Pre-setup steps
@@ -40,24 +40,6 @@ pipeline:
when:
matrix:
TESTS: check-app-compatbility-13
check-app-compatbility-12:
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=stable12
- DB=sqlite
commands:
# Pre-setup steps
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
- cd ../server
# Code checker
- ./occ app:check-code $APP_NAME -c strong-comparison
- ./occ app:check-code $APP_NAME -c deprecation
- cd apps/$APP_NAME/
when:
matrix:
TESTS: check-app-compatbility-12
signed-off-check:
image: nextcloudci/php7.0:php7.0-17
environment:
@@ -230,7 +212,6 @@ pipeline:
matrix:
include:
- TESTS: check-app-compatbility
- TESTS: check-app-compatbility-12
- TESTS: check-app-compatbility-13
- TESTS: signed-off-check
- TESTS: syntax-php5.6

17
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,17 @@
* Fixes issue: #
* Target version: master
### Summary
### TODO
- [ ] ...
### Checklist
- [ ] Code is properly formatted
- [ ] Sign-off message is added to all commits
- [ ] Tests (unit, integration, api and/or acceptance) are included
- [ ] Documentation (manuals or wiki) has been updated or is not required

View File

@@ -14,7 +14,7 @@
- 🚀 Get your project organized
</description>
<version>0.4.0</version>
<version>0.5.0-dev1</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<namespace>Deck</namespace>
@@ -26,7 +26,7 @@
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png</screenshot>
<dependencies>
<nextcloud min-version="12" max-version="14" />
<nextcloud min-version="13" max-version="14" />
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>

38
css/comp-13.scss Normal file
View File

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

View File

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

View File

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

View File

@@ -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"]'

View File

@@ -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);
}
};
});

View File

@@ -200,6 +200,29 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
CardService.archive(card);
StackService.removeCard(card);
};
$scope.isCurrentUserAssigned = function (card) {
if (! CardService.get(card.id).assignedUsers) {
return false;
}
var userList = CardService.get(card.id).assignedUsers.filter(function (obj) {
return obj.participant.uid === OC.getCurrentUser().uid;
});
return userList.length === 1;
};
$scope.cardAssignToMe = function (card) {
CardService.assignUser(card, OC.getCurrentUser().uid)
.then(
function() {StackService.updateCard(card);}
);
// TODO: remove this jquery call. Fix and use appPopoverMenuUtils instead
$('.popovermenu').addClass('hidden');
};
$scope.cardUnassignFromMe = function (card) {
CardService.unassignUser(card, OC.getCurrentUser().uid);
StackService.updateCard(card);
// TODO: remove this jquery call.Fix and use appPopoverMenuUtils instead
$('.popovermenu').addClass('hidden');
};
$scope.cardUnarchive = function (card) {
CardService.unarchive(card);
StackService.removeCard(card);

168
js/package-lock.json generated
View File

@@ -5,17 +5,17 @@
"requires": true,
"dependencies": {
"@uirouter/angularjs": {
"version": "1.0.18",
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.18.tgz",
"integrity": "sha512-tswhwMMBDnbGOZnnCVpnA0pbd7dXkBck1HO0WY7fw8GO3dKbWAAc/rL0479dLypR89UDDGym5leTvZCLW4cJnA==",
"version": "1.0.19",
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.19.tgz",
"integrity": "sha512-O+M3CB4en9OPMKqSrMC6hZsuMbtttYpGlALZoqAYqUmqdw1CJ5WBnuj7s/40svhZG338SfqxXN/Y2uKh5x+gPQ==",
"requires": {
"@uirouter/core": "5.0.19"
"@uirouter/core": "5.0.20"
}
},
"@uirouter/core": {
"version": "5.0.19",
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.19.tgz",
"integrity": "sha512-wow+CKRThUAQkiTLNQCBsKQIU3NbH8GGH/w/TrcjKdvkZQA2jQB9QSqmmZxj7XNoZXY7QVcSSc4DWmxuSeAWmQ=="
"version": "5.0.20",
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.20.tgz",
"integrity": "sha512-7MwtORbMF0UFCgMb+KcBAx+7EsYn/6sP5mEAjLNQq14AkHOJom5pPRE0N3nxduFbK3V2TXfsOX2UjtbkuXql+A=="
},
"@webassemblyjs/ast": {
"version": "1.5.13",
@@ -1705,14 +1705,15 @@
}
},
"browserify-des": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz",
"integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
"integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
"dev": true,
"requires": {
"cipher-base": "^1.0.1",
"des.js": "^1.0.0",
"inherits": "^2.0.1"
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
"browserify-rsa": {
@@ -2727,9 +2728,9 @@
}
},
"enhanced-resolve": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz",
"integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==",
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
"integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -2858,9 +2859,9 @@
}
},
"eslint-scope": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
"integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
"dev": true,
"requires": {
"esrecurse": "^4.1.0",
@@ -3061,17 +3062,6 @@
"chardet": "^0.5.0",
"iconv-lite": "^0.4.22",
"tmp": "^0.0.33"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
}
},
"extglob": {
@@ -4092,9 +4082,9 @@
}
},
"global-modules-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz",
"integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz",
"integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==",
"dev": true
},
"globals": {
@@ -4571,12 +4561,6 @@
"supports-color": "^5.3.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
@@ -5437,9 +5421,9 @@
}
},
"markdown-it": {
"version": "8.4.1",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz",
"integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==",
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
@@ -7207,9 +7191,9 @@
}
},
"rxjs": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz",
"integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz",
"integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -8481,9 +8465,9 @@
}
},
"webpack": {
"version": "4.15.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.15.1.tgz",
"integrity": "sha512-UwfFQ2plA5EMhhzwi/hl5xpLk7mNK7p0853Ml04z1Bqw553pY+oS8Xke3funcVy7eG/yMpZPvnlFTUyGKyKoyw==",
"version": "4.16.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.1.tgz",
"integrity": "sha512-6jpzObU18y7lXDJz7XCLvzgrqcJ0rZ2jhKvnTivza9gM2GvPW93xxtmEll2GgmdC0zVQAtbHrH/9BtyMjSDZfA==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.5.13",
@@ -8497,7 +8481,7 @@
"ajv-keywords": "^3.1.0",
"chrome-trace-event": "^1.0.0",
"enhanced-resolve": "^4.1.0",
"eslint-scope": "^3.7.1",
"eslint-scope": "^4.0.0",
"json-parse-better-errors": "^1.0.2",
"loader-runner": "^2.3.0",
"loader-utils": "^1.1.0",
@@ -8527,9 +8511,9 @@
}
},
"webpack-cli": {
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz",
"integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz",
"integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
@@ -8542,7 +8526,7 @@
"loader-utils": "^1.1.0",
"supports-color": "^5.4.0",
"v8-compile-cache": "^2.0.0",
"yargs": "^11.1.0"
"yargs": "^12.0.1"
},
"dependencies": {
"ansi-regex": {
@@ -8601,11 +8585,23 @@
"which": "^1.2.9"
}
},
"has-flag": {
"decamelize": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
"integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
"dev": true,
"requires": {
"xregexp": "4.0.0"
}
},
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
@@ -8613,6 +8609,16 @@
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"os-locale": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
@@ -8624,10 +8630,28 @@
"mem": "^1.1.0"
}
},
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
"p-limit": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
"integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
"integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
"dev": true
},
"string-width": {
@@ -8664,15 +8688,21 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"xregexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
"integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
"dev": true
},
"yargs": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz",
"integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==",
"version": "12.0.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz",
"integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==",
"dev": true,
"requires": {
"cliui": "^4.0.0",
"decamelize": "^1.1.1",
"find-up": "^2.1.0",
"decamelize": "^2.0.0",
"find-up": "^3.0.0",
"get-caller-file": "^1.0.1",
"os-locale": "^2.0.0",
"require-directory": "^2.1.1",
@@ -8680,14 +8710,14 @@
"set-blocking": "^2.0.0",
"string-width": "^2.0.0",
"which-module": "^2.0.0",
"y18n": "^3.2.1",
"yargs-parser": "^9.0.2"
"y18n": "^3.2.1 || ^4.0.0",
"yargs-parser": "^10.1.0"
}
},
"yargs-parser": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
"integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
"integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
"dev": true,
"requires": {
"camelcase": "^4.1.0"

View File

@@ -8,14 +8,14 @@
"test": "tests"
},
"dependencies": {
"@uirouter/angularjs": "^1.0.18",
"@uirouter/angularjs": "^1.0.19",
"angular": "^1.7.2",
"angular-animate": "^1.7.2",
"angular-file-upload": "^2.5.0",
"angular-markdown-it": "^0.6.1",
"angular-sanitize": "^1.7.2",
"babel-polyfill": "^6.26.0",
"markdown-it": "^8.4.1",
"markdown-it": "^8.4.2",
"markdown-it-link-target": "^1.0.2",
"ng-sortable": "^1.3.8",
"ui-select": "^0.19.8"
@@ -28,8 +28,8 @@
"karma": "^2.0.4",
"mini-css-extract-plugin": "^0.4.1",
"node-sass": "^4.9.2",
"webpack": "^4.15.1",
"webpack-cli": "^3.0.8",
"webpack": "^4.16.1",
"webpack-cli": "^3.1.0",
"webpack-merge": "^4.1.3"
},
"scripts": {

View File

@@ -106,11 +106,11 @@ app.factory('CardService', function (ApiService, $http, $q) {
CardService.prototype.assignUser = function (card, user) {
var deferred = $q.defer();
var self = this;
if (self.getCurrent().assignedUsers === null) {
self.getCurrent().assignedUsers = [];
if (self.get(card.id).assignedUsers === null) {
self.get(card.id).assignedUsers = [];
}
$http.post(this.baseUrl + '/' + card.id + '/assign', {'userId': user}).then(function (response) {
self.getCurrent().assignedUsers.push(response.data);
self.get(card.id).assignedUsers.push(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
@@ -123,7 +123,7 @@ app.factory('CardService', function (ApiService, $http, $q) {
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + card.id + '/assign/' + user, {}).then(function (response) {
self.getCurrent().assignedUsers = self.getCurrent().assignedUsers.filter(function (obj) {
self.get(card.id).assignedUsers = self.get(card.id).assignedUsers.filter(function (obj) {
return obj.participant.uid !== user;
});
deferred.resolve(response.data);
@@ -174,4 +174,4 @@ app.factory('CardService', function (ApiService, $http, $q) {
var service = new CardService($http, 'cards', $q);
return service;
});
});

View File

@@ -1,30 +0,0 @@
OC.L10N.register(
"deck",
{
"Delete" : "Desaniciar",
"Hours" : "Hores",
"Minutes" : "Minutos",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Deck" : "Deck",
"Submit" : "Unviar",
"Show archived cards" : "Amosar tarxetes archivaes",
"Close" : "Zarrar",
"Tags" : "Etiquetes",
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Xestionar",
"Discard share" : "Escartar compartición",
"Title" : "Títulu",
"Members" : "Miembros",
"More actions" : "Más aiciones",
"by" : "por",
"Click to set" : "Primi p'afitar",
"Description" : "Descripción",
"Saved" : "Guardóse"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,28 +0,0 @@
{ "translations": {
"Delete" : "Desaniciar",
"Hours" : "Hores",
"Minutes" : "Minutos",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Deck" : "Deck",
"Submit" : "Unviar",
"Show archived cards" : "Amosar tarxetes archivaes",
"Close" : "Zarrar",
"Tags" : "Etiquetes",
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Xestionar",
"Discard share" : "Escartar compartición",
"Title" : "Títulu",
"Members" : "Miembros",
"More actions" : "Más aiciones",
"by" : "por",
"Click to set" : "Primi p'afitar",
"Description" : "Descripción",
"Saved" : "Guardóse"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -6,20 +6,35 @@ OC.L10N.register(
"Remove user from card" : "Odebrat uživatele z karty",
"Hours" : "Hodiny",
"Minutes" : "Minuty",
"Maximum file size of {size} exceeded" : "U souboru {size} překročena nejvyšší umožněná velikost",
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
"Personal" : "Osobní",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
"No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"To do" : "Udělat",
"Doing" : "Provádím",
"Done" : "Hotovo",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"The file was uploaded" : "Soubor byl nahrán",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný ve formuláři HTML",
"The file was only partially uploaded" : "Soubor byl nahrán pouze z části",
"No file was uploaded" : "Nebyl nahrán žádný soubor",
"Missing a temporary folder" : "Chybí adresář pro dočasné soubory",
"Could not write file to disk" : "Nedaří se zapsat soubor do úložiště",
"A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.",
"No file uploaded or file size exceeds maximum of %s" : "Soubor nebyl nahrán nebo jeho velikost přesáhla %s",
"Deck" : "Balík",
"A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní management ve stylu Kanban.",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, jenž je zaintegrovaný do Nextcloudu.\n\n\n- 📥 Vložte a uspořádejte své úkoly do karet\n- 📄 Zapište si dodatečné poznámky \n- 🔖 Přilepte štítek pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přátely nebo rodinou\n- 🚀 Dostaťe svůj projekt pod kontrolu",
"Add a new stack" : "Přidat nový zásobník",
"Submit" : "Odeslat",
"Show archived cards" : "Zobrazit archivované karty",
@@ -27,6 +42,9 @@ OC.L10N.register(
"Board details" : "Detaily desky",
"All Boards" : "Všechny desky",
"Archived boards" : "Archivované desky",
"Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.",
"Assign to me" : "Přiřadit mě",
"Unassign from me" : "Zrušit přiřazení mě",
"Archive" : "Archiv",
"Unarchive" : "Zrušit archivování",
"Enter a card title" : "Zadejte nadpis karty",
@@ -55,9 +73,14 @@ OC.L10N.register(
"Delete board" : "Smazat desku",
"Reset" : "Obnovit",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
"Create new board" : "VYtvořit ovou desku",
"Create new board" : "Vytvořit novou desku",
"New board title" : "Nadpis nové desky",
"Select an attachment" : "Vybrat přílohu",
"Cancel upload" : "Zrušit nahrávání",
"by" : "od",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru - v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.",
"Undo file deletion" : "Vzít zpět smazání souboru",
"Insert the file into the description" : "Vložte soubor do popisku.",
"Modified:" : "Upraveno:",
"Created:" : "Vytvořeno:",
"Choose a tag" : "Vyberte štítek",

View File

@@ -4,20 +4,35 @@
"Remove user from card" : "Odebrat uživatele z karty",
"Hours" : "Hodiny",
"Minutes" : "Minuty",
"Maximum file size of {size} exceeded" : "U souboru {size} překročena nejvyšší umožněná velikost",
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
"Personal" : "Osobní",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
"No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.",
"Finished" : "Dokončeno",
"To review" : "K revizi",
"Action needed" : "Nutná akce",
"Later" : "Později",
"To do" : "Udělat",
"Doing" : "Provádím",
"Done" : "Hotovo",
"Example Task 3" : "Třetí úkol pro ukázku",
"Example Task 2" : "Druhý úkol pro ukázku",
"Example Task 1" : "První úkol pro ukázku",
"The file was uploaded" : "Soubor byl nahrán",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný ve formuláři HTML",
"The file was only partially uploaded" : "Soubor byl nahrán pouze z části",
"No file was uploaded" : "Nebyl nahrán žádný soubor",
"Missing a temporary folder" : "Chybí adresář pro dočasné soubory",
"Could not write file to disk" : "Nedaří se zapsat soubor do úložiště",
"A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.",
"No file uploaded or file size exceeds maximum of %s" : "Soubor nebyl nahrán nebo jeho velikost přesáhla %s",
"Deck" : "Balík",
"A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní management ve stylu Kanban.",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, jenž je zaintegrovaný do Nextcloudu.\n\n\n- 📥 Vložte a uspořádejte své úkoly do karet\n- 📄 Zapište si dodatečné poznámky \n- 🔖 Přilepte štítek pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přátely nebo rodinou\n- 🚀 Dostaťe svůj projekt pod kontrolu",
"Add a new stack" : "Přidat nový zásobník",
"Submit" : "Odeslat",
"Show archived cards" : "Zobrazit archivované karty",
@@ -25,6 +40,9 @@
"Board details" : "Detaily desky",
"All Boards" : "Všechny desky",
"Archived boards" : "Archivované desky",
"Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.",
"Assign to me" : "Přiřadit mě",
"Unassign from me" : "Zrušit přiřazení mě",
"Archive" : "Archiv",
"Unarchive" : "Zrušit archivování",
"Enter a card title" : "Zadejte nadpis karty",
@@ -53,9 +71,14 @@
"Delete board" : "Smazat desku",
"Reset" : "Obnovit",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
"Create new board" : "VYtvořit ovou desku",
"Create new board" : "Vytvořit novou desku",
"New board title" : "Nadpis nové desky",
"Select an attachment" : "Vybrat přílohu",
"Cancel upload" : "Zrušit nahrávání",
"by" : "od",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru - v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.",
"Undo file deletion" : "Vzít zpět smazání souboru",
"Insert the file into the description" : "Vložte soubor do popisku.",
"Modified:" : "Upraveno:",
"Created:" : "Vytvořeno:",
"Choose a tag" : "Vyberte štítek",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
"Personal" : "Persönlich",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich",
"Later" : "Später",
"To do" : "Offen",
"Doing" : "In Arbeit",
"Done" : "Erledigt",
"Example Task 3" : "Beispielaufgabe 3",
"Example Task 2" : "Beispielaufgabe 2",
"Example Task 1" : "Beispielaufgabe 1",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
"Assign to me" : "Mir zuweisen",
"Unassign from me" : "Nicht mir zuweisen",
"Archive" : "Archivieren",
"Unarchive" : "Dearchivieren",
"Enter a card title" : "Kartentitel eingeben",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
"Personal" : "Persönlich",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
@@ -14,6 +15,12 @@
"To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich",
"Later" : "Später",
"To do" : "Offen",
"Doing" : "In Arbeit",
"Done" : "Erledigt",
"Example Task 3" : "Beispielaufgabe 3",
"Example Task 2" : "Beispielaufgabe 2",
"Example Task 1" : "Beispielaufgabe 1",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
@@ -34,6 +41,8 @@
"All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
"Assign to me" : "Mir zuweisen",
"Unassign from me" : "Nicht mir zuweisen",
"Archive" : "Archivieren",
"Unarchive" : "Dearchivieren",
"Enter a card title" : "Kartentitel eingeben",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
"Personal" : "Persönlich",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich",
"Later" : "Später",
"To do" : "Offen",
"Doing" : "In Arbeit",
"Done" : "Erledigt",
"Example Task 3" : "Beispielaufgabe 3",
"Example Task 2" : "Beispielaufgabe 2",
"Example Task 1" : "Beispielaufgabe 1",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
@@ -27,7 +34,7 @@ OC.L10N.register(
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Zuweisung von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Add a new stack" : "Neuen Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
"Assign to me" : "Mir zuweisen",
"Unassign from me" : "Nicht mir zuweisen",
"Archive" : "Archivieren",
"Unarchive" : "Dearchivieren",
"Enter a card title" : "Kartentitel eingeben",
@@ -53,7 +62,7 @@ OC.L10N.register(
"Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Tag erstellen",
"Create a new tag" : "Schlagwort erstellen",
"Status" : "Status",
"Title" : "Titel",
"Members" : "Mitglieder",
@@ -77,9 +86,9 @@ OC.L10N.register(
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Benutzer zuordnen",
"Assign users" : "Benutzer zuweisen",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
"Due date" : "Zieltermin",
"Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
"Personal" : "Persönlich",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
@@ -14,6 +15,12 @@
"To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich",
"Later" : "Später",
"To do" : "Offen",
"Doing" : "In Arbeit",
"Done" : "Erledigt",
"Example Task 3" : "Beispielaufgabe 3",
"Example Task 2" : "Beispielaufgabe 2",
"Example Task 1" : "Beispielaufgabe 1",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
@@ -25,7 +32,7 @@
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Zuweisung von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Add a new stack" : "Neuen Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen",
@@ -34,6 +41,8 @@
"All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
"Assign to me" : "Mir zuweisen",
"Unassign from me" : "Nicht mir zuweisen",
"Archive" : "Archivieren",
"Unarchive" : "Dearchivieren",
"Enter a card title" : "Kartentitel eingeben",
@@ -51,7 +60,7 @@
"Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Tag erstellen",
"Create a new tag" : "Schlagwort erstellen",
"Status" : "Status",
"Title" : "Titel",
"Members" : "Mitglieder",
@@ -75,9 +84,9 @@
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Benutzer zuordnen",
"Assign users" : "Benutzer zuweisen",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
"Due date" : "Zieltermin",
"Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Tamaño máximo de archivo de {size} excedido",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro de que quieres eliminar el mazo con todos sus datos?",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alcanzado su fecha límite.",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Para revisar",
"Action needed" : "Acción necesaria",
"Later" : "Después",
"To do" : "Por hacer",
"Doing" : "Haciendo",
"Done" : "Hecho",
"Example Task 3" : "Tarea de ejemplo 3",
"Example Task 2" : "Tarea de ejemplo 2",
"Example Task 1" : "Tarea de ejemplo 1",
"The file was uploaded" : "Se ha subido el archivo",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo subido excede la directiva upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo subido excede la directiva MAX_FILE-SIZE directive que se especificó en el formulario web",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Tamaño máximo de archivo de {size} excedido",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro de que quieres eliminar el mazo con todos sus datos?",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alcanzado su fecha límite.",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo.",
@@ -14,6 +15,12 @@
"To review" : "Para revisar",
"Action needed" : "Acción necesaria",
"Later" : "Después",
"To do" : "Por hacer",
"Doing" : "Haciendo",
"Done" : "Hecho",
"Example Task 3" : "Tarea de ejemplo 3",
"Example Task 2" : "Tarea de ejemplo 2",
"Example Task 1" : "Tarea de ejemplo 1",
"The file was uploaded" : "Se ha subido el archivo",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo subido excede la directiva upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo subido excede la directiva MAX_FILE-SIZE directive que se especificó en el formulario web",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minutes",
"Maximum file size of {size} exceeded" : "Taille de fichier maximale de {size} dépassée",
"Are you sure you want to delete the stack with all of its data?" : "Êtes-vous sûr de vouloir supprimer la pile avec toutes ses données ?",
"Personal" : "Personnel",
"The card \"%s\" on \"%s\" has reached its due date." : "Le délais de la carte %s de %s est expiré.",
"The board \"%s\" has been shared with you by %s." : "Le tableau %s a été partagé avec vous par %s.",
"{user} has shared the board %s with you." : "{user} a partagé le tableau %s avec vous.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "A réviser",
"Action needed" : "Action requise",
"Later" : "Plus tard",
"To do" : "À faire",
"Doing" : "En cours",
"Done" : "Terminé",
"Example Task 3" : "Exemple de tâche 3",
"Example Task 2" : "Exemple de tâche 2",
"Example Task 1" : "Exemple de tâche 1",
"The file was uploaded" : "Le fichier a été téléchargé",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Tous les tableaux",
"Archived boards" : "Tableaux archivés",
"Drop your files here to upload it to the card" : "Déposez vos fichiers ici pour les téléverser sur la carte",
"Assign to me" : "Me l'assigner",
"Unassign from me" : "Me le désassigner",
"Archive" : "Archiver",
"Unarchive" : "Ne plus archiver",
"Enter a card title" : "Saisissez un titre de carte",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minutes",
"Maximum file size of {size} exceeded" : "Taille de fichier maximale de {size} dépassée",
"Are you sure you want to delete the stack with all of its data?" : "Êtes-vous sûr de vouloir supprimer la pile avec toutes ses données ?",
"Personal" : "Personnel",
"The card \"%s\" on \"%s\" has reached its due date." : "Le délais de la carte %s de %s est expiré.",
"The board \"%s\" has been shared with you by %s." : "Le tableau %s a été partagé avec vous par %s.",
"{user} has shared the board %s with you." : "{user} a partagé le tableau %s avec vous.",
@@ -14,6 +15,12 @@
"To review" : "A réviser",
"Action needed" : "Action requise",
"Later" : "Plus tard",
"To do" : "À faire",
"Doing" : "En cours",
"Done" : "Terminé",
"Example Task 3" : "Exemple de tâche 3",
"Example Task 2" : "Exemple de tâche 2",
"Example Task 1" : "Exemple de tâche 1",
"The file was uploaded" : "Le fichier a été téléchargé",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML",
@@ -34,6 +41,8 @@
"All Boards" : "Tous les tableaux",
"Archived boards" : "Tableaux archivés",
"Drop your files here to upload it to the card" : "Déposez vos fichiers ici pour les téléverser sur la carte",
"Assign to me" : "Me l'assigner",
"Unassign from me" : "Me le désassigner",
"Archive" : "Archiver",
"Unarchive" : "Ne plus archiver",
"Enter a card title" : "Saisissez un titre de carte",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minuti",
"Maximum file size of {size} exceeded" : "Dimensione massima dei file di {size} superata",
"Are you sure you want to delete the stack with all of its data?" : "Sei sicuro di voler eliminare questa pila con tutti i suoi dati?",
"Personal" : "Personale",
"The card \"%s\" on \"%s\" has reached its due date." : "La scheda \"%s\" in \"%s\" ha raggiunto la sua data di scadenza.",
"The board \"%s\" has been shared with you by %s." : "La lavagna \"%s\" è stata condivisa con te da %s.",
"{user} has shared the board %s with you." : "{user} ha condiviso la lavagna %s con te.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Da revisionare",
"Action needed" : "Azione necessaria",
"Later" : "Dopo",
"To do" : "Da fare",
"Doing" : "In corso",
"Done" : "Fatto",
"Example Task 3" : "Attività di esempio 3",
"Example Task 2" : "Attività di esempio 2",
"Example Task 1" : "Attività di esempio 1",
"The file was uploaded" : "Il file è stato caricato",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Tutte le lavagne",
"Archived boards" : "Lavagne archiviate",
"Drop your files here to upload it to the card" : "Rilascia qui i tuoi file per caricarli nella scheda",
"Assign to me" : "Assegna a me",
"Unassign from me" : "Rimuovi assegnazione da me",
"Archive" : "Archivio",
"Unarchive" : "Togli dall'archivio",
"Enter a card title" : "Inserisci un titolo alla scheda",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minuti",
"Maximum file size of {size} exceeded" : "Dimensione massima dei file di {size} superata",
"Are you sure you want to delete the stack with all of its data?" : "Sei sicuro di voler eliminare questa pila con tutti i suoi dati?",
"Personal" : "Personale",
"The card \"%s\" on \"%s\" has reached its due date." : "La scheda \"%s\" in \"%s\" ha raggiunto la sua data di scadenza.",
"The board \"%s\" has been shared with you by %s." : "La lavagna \"%s\" è stata condivisa con te da %s.",
"{user} has shared the board %s with you." : "{user} ha condiviso la lavagna %s con te.",
@@ -14,6 +15,12 @@
"To review" : "Da revisionare",
"Action needed" : "Azione necessaria",
"Later" : "Dopo",
"To do" : "Da fare",
"Doing" : "In corso",
"Done" : "Fatto",
"Example Task 3" : "Attività di esempio 3",
"Example Task 2" : "Attività di esempio 2",
"Example Task 1" : "Attività di esempio 1",
"The file was uploaded" : "Il file è stato caricato",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Il file caricato supera la direttiva upload_max_filesize in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML",
@@ -34,6 +41,8 @@
"All Boards" : "Tutte le lavagne",
"Archived boards" : "Lavagne archiviate",
"Drop your files here to upload it to the card" : "Rilascia qui i tuoi file per caricarli nella scheda",
"Assign to me" : "Assegna a me",
"Unassign from me" : "Rimuovi assegnazione da me",
"Archive" : "Archivio",
"Unarchive" : "Togli dall'archivio",
"Enter a card title" : "Inserisci un titolo alla scheda",

View File

@@ -1,14 +1,21 @@
OC.L10N.register(
"deck",
{
"Are you sure you want to delete this card with all of its data?" : "Ar tikrai norite ištrinti šią kortelę ir visus jos duomenis?",
"Delete" : "Ištrinti",
"Remove user from card" : "Šalinti naudotoją iš kortelės",
"Hours" : "Valandos",
"Minutes" : "Minutės",
"Finished" : "Baigta",
"To review" : "Peržiūrėti",
"Action needed" : "Reikalingas veiksmas",
"Later" : "Vėliau",
"Done" : "Atlikta",
"Example Task 3" : "Pavyzdinė užduotis 3",
"Example Task 2" : "Pavyzdinė užduotis 2",
"Example Task 1" : "Pavyzdinė užduotis 1",
"The file was uploaded" : "Failas buvo įkeltas",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Įkeliamas failas viršija upload_max_filesize direktyvą, esančią faile php.ini",
"The file was only partially uploaded" : "Failas buvo tik dalinai įkeltas",
"No file was uploaded" : "Nebuvo įkeltas joks failas",
"Missing a temporary folder" : "Trūksta laikinojo aplanko",
@@ -22,6 +29,7 @@ OC.L10N.register(
"Board details" : "Detalesnė informacija",
"All Boards" : "Visi užduočių sąrašai",
"Archived boards" : "Archyvuoti sąrašai",
"Drop your files here to upload it to the card" : "Vilkite savo failus čia, norėdami įkelti juos į kortelę",
"Archive" : "Archyvuoti",
"Unarchive" : "Išskleisti",
"Enter a card title" : "Įveskite kortelės vardą",
@@ -50,12 +58,15 @@ OC.L10N.register(
"Reset" : "Atstatyti",
"Create new board" : "Sukurti naują sąrašą",
"New board title" : "Naujas sąrašo vardas",
"Cancel upload" : "Atsisakyti įkėlimo",
"by" : " ",
"Undo file deletion" : "Atšaukti failo ištrynimą",
"Insert the file into the description" : "Įterpti failą į aprašą",
"Modified:" : "Keitimo laikas:",
"Created:" : "Sukūrimo laikas:",
"Add a tag" : "Pridėti žymę",
"Assign users" : "Priskirti naudotojus",
"Assign this card to a user" : "Priskirti šią kortelę naudotojui",
"Due date" : "Terminas",
"Click to set" : "Spustelėkite pakeitimams atlikti",
"Remove due date" : "Pašalinti terminą",

View File

@@ -1,12 +1,19 @@
{ "translations": {
"Are you sure you want to delete this card with all of its data?" : "Ar tikrai norite ištrinti šią kortelę ir visus jos duomenis?",
"Delete" : "Ištrinti",
"Remove user from card" : "Šalinti naudotoją iš kortelės",
"Hours" : "Valandos",
"Minutes" : "Minutės",
"Finished" : "Baigta",
"To review" : "Peržiūrėti",
"Action needed" : "Reikalingas veiksmas",
"Later" : "Vėliau",
"Done" : "Atlikta",
"Example Task 3" : "Pavyzdinė užduotis 3",
"Example Task 2" : "Pavyzdinė užduotis 2",
"Example Task 1" : "Pavyzdinė užduotis 1",
"The file was uploaded" : "Failas buvo įkeltas",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Įkeliamas failas viršija upload_max_filesize direktyvą, esančią faile php.ini",
"The file was only partially uploaded" : "Failas buvo tik dalinai įkeltas",
"No file was uploaded" : "Nebuvo įkeltas joks failas",
"Missing a temporary folder" : "Trūksta laikinojo aplanko",
@@ -20,6 +27,7 @@
"Board details" : "Detalesnė informacija",
"All Boards" : "Visi užduočių sąrašai",
"Archived boards" : "Archyvuoti sąrašai",
"Drop your files here to upload it to the card" : "Vilkite savo failus čia, norėdami įkelti juos į kortelę",
"Archive" : "Archyvuoti",
"Unarchive" : "Išskleisti",
"Enter a card title" : "Įveskite kortelės vardą",
@@ -48,12 +56,15 @@
"Reset" : "Atstatyti",
"Create new board" : "Sukurti naują sąrašą",
"New board title" : "Naujas sąrašo vardas",
"Cancel upload" : "Atsisakyti įkėlimo",
"by" : " ",
"Undo file deletion" : "Atšaukti failo ištrynimą",
"Insert the file into the description" : "Įterpti failą į aprašą",
"Modified:" : "Keitimo laikas:",
"Created:" : "Sukūrimo laikas:",
"Add a tag" : "Pridėti žymę",
"Assign users" : "Priskirti naudotojus",
"Assign this card to a user" : "Priskirti šią kortelę naudotojui",
"Due date" : "Terminas",
"Click to set" : "Spustelėkite pakeitimams atlikti",
"Remove due date" : "Pašalinti terminą",

View File

@@ -1,29 +0,0 @@
OC.L10N.register(
"deck",
{
"Delete" : "Устгах",
"Finished" : "Дуусгасан",
"To review" : "Дахин хянах",
"Action needed" : "Үйлдэл шаардлагатай",
"Later" : "Хойшлуулах",
"Deck" : "Ажлын талбар",
"Show archived cards" : "Архивлагдсан картуудыг харах",
"Hide archived cards" : "Архивлагдсан картуудыг нуух",
"Archive" : "Архивлах",
"Unarchive" : "Архиваас гаргах",
"Enter a card title" : "Картын нэр оруулах",
"Sharing" : "Түгээх",
"Select users or groups to share with" : "Түгээх хэрэглэгч, бүлэг сонгоно уу",
"No matching user or group found." : "Тохирох бүлэг эсвэл хэрэглэгч олдохгүй байна.",
"Share" : "Түгээх",
"Edit" : "Засварлах",
"Manage" : "Зохицуулах",
"Discard share" : "Түгээлтийг хүчингүй болгох",
"Members" : "Гишүүд",
"Modified:" : "Өөрчлөгдсөн:",
"Created:" : "Үүсгэсэн:",
"Description" : "Тайлбар",
"Saved" : "Хадгалсан",
"Add a card description…" : "Картын тайлбар..."
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,27 +0,0 @@
{ "translations": {
"Delete" : "Устгах",
"Finished" : "Дуусгасан",
"To review" : "Дахин хянах",
"Action needed" : "Үйлдэл шаардлагатай",
"Later" : "Хойшлуулах",
"Deck" : "Ажлын талбар",
"Show archived cards" : "Архивлагдсан картуудыг харах",
"Hide archived cards" : "Архивлагдсан картуудыг нуух",
"Archive" : "Архивлах",
"Unarchive" : "Архиваас гаргах",
"Enter a card title" : "Картын нэр оруулах",
"Sharing" : "Түгээх",
"Select users or groups to share with" : "Түгээх хэрэглэгч, бүлэг сонгоно уу",
"No matching user or group found." : "Тохирох бүлэг эсвэл хэрэглэгч олдохгүй байна.",
"Share" : "Түгээх",
"Edit" : "Засварлах",
"Manage" : "Зохицуулах",
"Discard share" : "Түгээлтийг хүчингүй болгох",
"Members" : "Гишүүд",
"Modified:" : "Өөрчлөгдсөн:",
"Created:" : "Үүсгэсэн:",
"Description" : "Тайлбар",
"Saved" : "Хадгалсан",
"Add a card description…" : "Картын тайлбар..."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -52,6 +52,7 @@ OC.L10N.register(
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Cofnij usunięcie tablicy - w innym przypadku tablica zostanie usunięta przy kolejnym wykonaniu zadania cron.",
"Create new board" : "Utwórz nową tablicę",
"New board title" : "Tytuł nowej tablicy",
"Cancel upload" : "Anuluj wysyłanie",
"by" : "przez",
"Modified:" : "Zmodyfikowano:",
"Created:" : "Utworzono:",

View File

@@ -50,6 +50,7 @@
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Cofnij usunięcie tablicy - w innym przypadku tablica zostanie usunięta przy kolejnym wykonaniu zadania cron.",
"Create new board" : "Utwórz nową tablicę",
"New board title" : "Tytuł nowej tablicy",
"Cancel upload" : "Anuluj wysyłanie",
"by" : "przez",
"Modified:" : "Zmodyfikowano:",
"Created:" : "Utworzono:",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Excedeu o tamanho máximo de arquivo de {size}",
"Are you sure you want to delete the stack with all of its data?" : "Quer realmente excluir a pilha com todos os seus dados?",
"Personal" : "Pessoal",
"The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.",
"The board \"%s\" has been shared with you by %s." : "O quadro \"%s\" foi compartilhado com você por %s.",
"{user} has shared the board %s with you." : "{user} compartilhou o quadro %s com você.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Para revisão",
"Action needed" : "Ação necessária",
"Later" : "Depois",
"To do" : "A fazer",
"Doing" : "Fazendo",
"Done" : "Feito",
"Example Task 3" : "Tarefa exemplo 3",
"Example Task 2" : "Tarefa exemplo 2",
"Example Task 1" : "Tarefa exemplo 1",
"The file was uploaded" : "O arquivo foi enviado",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O arquivo enviado excede a diretiva upload_max_filesize do php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O arquivo enviado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Todos os paineis",
"Archived boards" : "Painéis arquivados",
"Drop your files here to upload it to the card" : "Solte seus arquivos aqui para enviá-los para o cartão",
"Assign to me" : "Atribuir a mim",
"Unassign from me" : "Desatribuir de mim",
"Archive" : "Arquivar",
"Unarchive" : "Desarquivar",
"Enter a card title" : "Digite um título de cartão",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Excedeu o tamanho máximo de arquivo de {size}",
"Are you sure you want to delete the stack with all of its data?" : "Quer realmente excluir a pilha com todos os seus dados?",
"Personal" : "Pessoal",
"The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.",
"The board \"%s\" has been shared with you by %s." : "O quadro \"%s\" foi compartilhado com você por %s.",
"{user} has shared the board %s with you." : "{user} compartilhou o quadro %s com você.",
@@ -14,6 +15,12 @@
"To review" : "Para revisão",
"Action needed" : "Ação necessária",
"Later" : "Depois",
"To do" : "A fazer",
"Doing" : "Fazendo",
"Done" : "Feito",
"Example Task 3" : "Tarefa exemplo 3",
"Example Task 2" : "Tarefa exemplo 2",
"Example Task 1" : "Tarefa exemplo 1",
"The file was uploaded" : "O arquivo foi enviado",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O arquivo enviado excede a diretiva upload_max_filesize do php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O arquivo enviado excede a diretiva MAX_FILE_SIZE especificada no formulário HTML",
@@ -34,6 +41,8 @@
"All Boards" : "Todos os paineis",
"Archived boards" : "Painéis arquivados",
"Drop your files here to upload it to the card" : "Solte seus arquivos aqui para enviá-los para o cartão",
"Assign to me" : "Atribuir a mim",
"Unassign from me" : "Desatribuir de mim",
"Archive" : "Arquivar",
"Unarchive" : "Desarquivar",
"Enter a card title" : "Digite um título de cartão",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Минуты",
"Maximum file size of {size} exceeded" : "Максимальный размер файла {size} превышен",
"Are you sure you want to delete the stack with all of its data?" : "Вы действительно хотите удалить стек со всеми его данными?",
"Personal" : "Личное",
"The card \"%s\" on \"%s\" has reached its due date." : "Настал срок карточки «%s» в «%s» .",
"The board \"%s\" has been shared with you by %s." : "%s предоставил(а) Вам доступ к доске «%s».",
"{user} has shared the board %s with you." : "{user} предоставил(а) Вам доступ к доске «%s».",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Просмотреть",
"Action needed" : "Требуется действие",
"Later" : "Позже",
"To do" : "Надо сделать",
"Doing" : "В работе",
"Done" : "Готово",
"Example Task 3" : "Пример задачи 3",
"Example Task 2" : "Пример задачи 2",
"Example Task 1" : "Пример задачи 1",
"The file was uploaded" : "Файл был загружен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размер загруженного файла превышает установленный предел upload_max_filesize в php.ini:",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размер загруженного файла превышает установленный предел MAX_FILE_SIZE в HTML-форме",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Все доски",
"Archived boards" : "Архив досок",
"Drop your files here to upload it to the card" : "Перетащите файл сюда, чтобы загрузить его на карту",
"Assign to me" : "Назначить на меня",
"Unassign from me" : "Убрать с меня назначение",
"Archive" : "Архивировать",
"Unarchive" : "Разархивировать",
"Enter a card title" : "Введите заголовок карточки",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Минуты",
"Maximum file size of {size} exceeded" : "Максимальный размер файла {size} превышен",
"Are you sure you want to delete the stack with all of its data?" : "Вы действительно хотите удалить стек со всеми его данными?",
"Personal" : "Личное",
"The card \"%s\" on \"%s\" has reached its due date." : "Настал срок карточки «%s» в «%s» .",
"The board \"%s\" has been shared with you by %s." : "%s предоставил(а) Вам доступ к доске «%s».",
"{user} has shared the board %s with you." : "{user} предоставил(а) Вам доступ к доске «%s».",
@@ -14,6 +15,12 @@
"To review" : "Просмотреть",
"Action needed" : "Требуется действие",
"Later" : "Позже",
"To do" : "Надо сделать",
"Doing" : "В работе",
"Done" : "Готово",
"Example Task 3" : "Пример задачи 3",
"Example Task 2" : "Пример задачи 2",
"Example Task 1" : "Пример задачи 1",
"The file was uploaded" : "Файл был загружен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Размер загруженного файла превышает установленный предел upload_max_filesize в php.ini:",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размер загруженного файла превышает установленный предел MAX_FILE_SIZE в HTML-форме",
@@ -34,6 +41,8 @@
"All Boards" : "Все доски",
"Archived boards" : "Архив досок",
"Drop your files here to upload it to the card" : "Перетащите файл сюда, чтобы загрузить его на карту",
"Assign to me" : "Назначить на меня",
"Unassign from me" : "Убрать с меня назначение",
"Archive" : "Архивировать",
"Unarchive" : "Разархивировать",
"Enter a card title" : "Введите заголовок карточки",

View File

@@ -11,6 +11,7 @@ OC.L10N.register(
"To review" : "Na posúdenie",
"Action needed" : "Potrebná akcia",
"Later" : "Neskôr",
"The file was uploaded" : "Súbor bol nahraný",
"Deck" : "Tabuľa",
"Add a new stack" : "Pridať nový stoh",
"Submit" : "Odoslať",
@@ -61,6 +62,7 @@ OC.L10N.register(
"Click to set" : "Kliknite pre nastavenie",
"Remove due date" : "Odstrániť do dátumu",
"Description" : "Popis",
"Attachments" : "Prílohy",
"Saved" : "Uložené",
"Unsaved changes" : "Neuložené zmeny",
"Formatting help" : "Pomoc pri formátovaní",

View File

@@ -9,6 +9,7 @@
"To review" : "Na posúdenie",
"Action needed" : "Potrebná akcia",
"Later" : "Neskôr",
"The file was uploaded" : "Súbor bol nahraný",
"Deck" : "Tabuľa",
"Add a new stack" : "Pridať nový stoh",
"Submit" : "Odoslať",
@@ -59,6 +60,7 @@
"Click to set" : "Kliknite pre nastavenie",
"Remove due date" : "Odstrániť do dátumu",
"Description" : "Popis",
"Attachments" : "Prílohy",
"Saved" : "Uložené",
"Unsaved changes" : "Neuložené zmeny",
"Formatting help" : "Pomoc pri formátovaní",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Минути",
"Maximum file size of {size} exceeded" : "Премашена максимална величина фајла од {size}",
"Are you sure you want to delete the stack with all of its data?" : "Да ли стварно желите да обришете ову гомилу са свим подацима на њој?",
"Personal" : "Лично",
"The card \"%s\" on \"%s\" has reached its due date." : "Картици \"%s\" на табли \"%s\" је истекао рок.",
"The board \"%s\" has been shared with you by %s." : "Таблу \"%s\" је поделио \"%s\" са Вама. ",
"{user} has shared the board %s with you." : "{user} је поделио таблу %s са Вама.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "Треба прегледати",
"Action needed" : "Потребна акција",
"Later" : "После",
"To do" : "За урадити",
"Doing" : "Ради се",
"Done" : "Готово",
"Example Task 3" : "Пример задатка 3",
"Example Task 2" : "Пример задатка 2",
"Example Task 1" : "Пример задатка 1",
"The file was uploaded" : "Фајл је отпремљен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Фајл за отпремање премашује upload_max_filesize директиву у php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Фајл за отпремање премашује MAX_FILE_SIZE директиву наведену у HTML форми",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Све табле",
"Archived boards" : "Архивиране табле",
"Drop your files here to upload it to the card" : "Превуците Ваше фајлове овде да их отпремите у картицу",
"Assign to me" : "Додели мени",
"Unassign from me" : "Склони са мене",
"Archive" : "Архива",
"Unarchive" : "Врати из архиве",
"Enter a card title" : "Унесите назив картице",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Минути",
"Maximum file size of {size} exceeded" : "Премашена максимална величина фајла од {size}",
"Are you sure you want to delete the stack with all of its data?" : "Да ли стварно желите да обришете ову гомилу са свим подацима на њој?",
"Personal" : "Лично",
"The card \"%s\" on \"%s\" has reached its due date." : "Картици \"%s\" на табли \"%s\" је истекао рок.",
"The board \"%s\" has been shared with you by %s." : "Таблу \"%s\" је поделио \"%s\" са Вама. ",
"{user} has shared the board %s with you." : "{user} је поделио таблу %s са Вама.",
@@ -14,6 +15,12 @@
"To review" : "Треба прегледати",
"Action needed" : "Потребна акција",
"Later" : "После",
"To do" : "За урадити",
"Doing" : "Ради се",
"Done" : "Готово",
"Example Task 3" : "Пример задатка 3",
"Example Task 2" : "Пример задатка 2",
"Example Task 1" : "Пример задатка 1",
"The file was uploaded" : "Фајл је отпремљен",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Фајл за отпремање премашује upload_max_filesize директиву у php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Фајл за отпремање премашује MAX_FILE_SIZE директиву наведену у HTML форми",
@@ -34,6 +41,8 @@
"All Boards" : "Све табле",
"Archived boards" : "Архивиране табле",
"Drop your files here to upload it to the card" : "Превуците Ваше фајлове овде да их отпремите у картицу",
"Assign to me" : "Додели мени",
"Unassign from me" : "Склони са мене",
"Archive" : "Архива",
"Unarchive" : "Врати из архиве",
"Enter a card title" : "Унесите назив картице",

View File

@@ -8,6 +8,7 @@ OC.L10N.register(
"Minutes" : "Dakika",
"Maximum file size of {size} exceeded" : "{size} olan en büyük dosya boyutu sınırııldı",
"Are you sure you want to delete the stack with all of its data?" : "Bu yığını tüm bilgileri ile silmek istediğinize emin misiniz?",
"Personal" : "Kişisel",
"The card \"%s\" on \"%s\" has reached its due date." : "\"%s\" kartı \"%s\" zamanında son kullanma tarihine ulaştı.",
"The board \"%s\" has been shared with you by %s." : "\"%s\" panosu %s tarafından sizinle paylaşıldı.",
"{user} has shared the board %s with you." : "{user} sizinle %s panosunu paylaştı.",
@@ -16,6 +17,12 @@ OC.L10N.register(
"To review" : "İncelenecek",
"Action needed" : "İşlem yapılması gerekiyor",
"Later" : "Sonra",
"To do" : "Yapılacak işler",
"Doing" : "Yapılanlar",
"Done" : "Bitenler",
"Example Task 3" : "3. Örnek Görev",
"Example Task 2" : "2. Örnek Görev",
"Example Task 1" : "1. Örnek Görev",
"The file was uploaded" : "Dosya yüklendi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor",
@@ -36,6 +43,8 @@ OC.L10N.register(
"All Boards" : "Tüm Panolar",
"Archived boards" : "Arşivlenmiş panolar",
"Drop your files here to upload it to the card" : "Karta yüklemek istediğiniz dosyalarınızı sürükleyip buraya bırakın",
"Assign to me" : "Bana ata",
"Unassign from me" : "Benden atamasını kaldır",
"Archive" : "Arşivle",
"Unarchive" : "Arşivden Çıkar",
"Enter a card title" : "Bir kart başlığı yazın",

View File

@@ -6,6 +6,7 @@
"Minutes" : "Dakika",
"Maximum file size of {size} exceeded" : "{size} olan en büyük dosya boyutu sınırııldı",
"Are you sure you want to delete the stack with all of its data?" : "Bu yığını tüm bilgileri ile silmek istediğinize emin misiniz?",
"Personal" : "Kişisel",
"The card \"%s\" on \"%s\" has reached its due date." : "\"%s\" kartı \"%s\" zamanında son kullanma tarihine ulaştı.",
"The board \"%s\" has been shared with you by %s." : "\"%s\" panosu %s tarafından sizinle paylaşıldı.",
"{user} has shared the board %s with you." : "{user} sizinle %s panosunu paylaştı.",
@@ -14,6 +15,12 @@
"To review" : "İncelenecek",
"Action needed" : "İşlem yapılması gerekiyor",
"Later" : "Sonra",
"To do" : "Yapılacak işler",
"Doing" : "Yapılanlar",
"Done" : "Bitenler",
"Example Task 3" : "3. Örnek Görev",
"Example Task 2" : "2. Örnek Görev",
"Example Task 1" : "1. Örnek Görev",
"The file was uploaded" : "Dosya yüklendi",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Yüklenen dosya php.ini dosyasındaki yüklenebilecek dosya boyutunu belirten upload_max_filesize değişkeninin değerini aşıyor",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklenen dosya HTML formundaki yüklenebilecek dosya boyutunu belirten MAX_FILE_SIZE değişkeninin değerini aşıyor",
@@ -34,6 +41,8 @@
"All Boards" : "Tüm Panolar",
"Archived boards" : "Arşivlenmiş panolar",
"Drop your files here to upload it to the card" : "Karta yüklemek istediğiniz dosyalarınızı sürükleyip buraya bırakın",
"Assign to me" : "Bana ata",
"Unassign from me" : "Benden atamasını kaldır",
"Archive" : "Arşivle",
"Unarchive" : "Arşivden Çıkar",
"Enter a card title" : "Bir kart başlığı yazın",

View File

@@ -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();

View File

@@ -23,17 +23,30 @@
namespace OCA\Deck\Controller;
use OCA\Deck\Service\DefaultBoardService;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Controller;
use OCP\IL10N;
class PageController extends Controller {
private $defaultBoardService;
private $userId;
private $l10n;
public function __construct($AppName, IRequest $request, $userId) {
public function __construct(
$AppName,
IRequest $request,
DefaultBoardService $defaultBoardService,
IL10N $l10n,
$userId
) {
parent::__construct($AppName, $request);
$this->userId = $userId;
$this->defaultBoardService = $defaultBoardService;
$this->l10n = $l10n;
}
/**
@@ -46,8 +59,13 @@ class PageController extends Controller {
public function index() {
$params = [
'user' => $this->userId,
'maxUploadSize' => \OCP\Util::uploadLimit(),
'maxUploadSize' => (int)\OCP\Util::uploadLimit(),
];
if ($this->defaultBoardService->checkFirstRun($this->userId, $this->appName)) {
$this->defaultBoardService->createDefaultBoard($this->l10n->t('Personal'), $this->userId, '000000');
}
return new TemplateResponse('deck', 'main', $params);
}

View File

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

View File

@@ -94,6 +94,24 @@ class NotificationHelper {
$this->cardMapper->markNotified($card);
}
public function sendCardAssigned($card, $userId) {
$boardId = $this->cardMapper->findBoardId($card->getId());
$board = $this->getBoard($boardId);
$notification = $this->notificationManager->createNotification();
$notification
->setApp('deck')
->setUser((string) $userId)
->setDateTime(new DateTime())
->setObject('card', $card->getId())
->setSubject('card-assigned', [
$card->getTitle(),
$board->getTitle(),
$this->currentUser
]);
$this->notificationManager->notify($notification);
}
/**
* Send notifications that a board was shared with a user/group
*

View File

@@ -73,6 +73,30 @@ class Notifier implements INotifier {
$params = $notification->getSubjectParameters();
switch ($notification->getSubject()) {
case 'card-assigned':
$cardId = $notification->getObjectId();
$boardId = $this->cardMapper->findBoardId($cardId);
$initiator = $this->userManager->get($params[2]);
if ($initiator !== null) {
$dn = $initiator->getDisplayName();
} else {
$dn = $params[2];
}
$notification->setParsedSubject(
(string) $l->t('The card "%s" on "%s" has been assigned to you by %s.', [$params[0], $params[1], $dn])
);
$notification->setRichSubject(
(string) $l->t('{user} has assigned the card "%s" on "%s" to you.', [$params[0], $params[1]]),
[
'user' => [
'type' => 'user',
'id' => $params[2],
'name' => $dn,
]
]
);
$notification->setLink($this->url->linkToRouteAbsolute('deck.page.index') . '#!/board/' . $boardId . '//card/' . $cardId . '');
break;
case 'card-overdue':
$cardId = $notification->getObjectId();
$boardId = $this->cardMapper->findBoardId($cardId);

View File

@@ -29,6 +29,7 @@ use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\Acl;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Notification\NotificationHelper;
use OCA\Deck\NotFoundException;
use OCA\Deck\StatusException;
@@ -39,16 +40,20 @@ class CardService {
private $stackMapper;
private $permissionService;
private $boardService;
private $notificationHelper;
private $assignedUsersMapper;
private $attachmentService;
private $currentUser;
public function __construct(CardMapper $cardMapper, StackMapper $stackMapper, PermissionService $permissionService, BoardService $boardService, AssignedUsersMapper $assignedUsersMapper, AttachmentService $attachmentService) {
public function __construct(CardMapper $cardMapper, StackMapper $stackMapper, PermissionService $permissionService, BoardService $boardService, NotificationHelper $notificationHelper, AssignedUsersMapper $assignedUsersMapper, AttachmentService $attachmentService, $userId) {
$this->cardMapper = $cardMapper;
$this->stackMapper = $stackMapper;
$this->permissionService = $permissionService;
$this->boardService = $boardService;
$this->notificationHelper = $notificationHelper;
$this->assignedUsersMapper = $assignedUsersMapper;
$this->attachmentService = $attachmentService;
$this->currentUser = $userId;
}
public function find($cardId) {
@@ -195,12 +200,20 @@ 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) {
return false;
}
}
if ($userId !== $this->currentUser) {
/* Notifyuser about the card assignment */
$card = $this->cardMapper->find($cardId);
$this->notificationHelper->sendCardAssigned($card, $userId);
}
$assignment = new AssignedUsers();
$assignment->setCardId($cardId);
$assignment->setParticipant($userId);
@@ -208,6 +221,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) {

View File

@@ -0,0 +1,88 @@
<?php
/**
* @copyright Copyright (c) 2018 Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Deck\Service;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\StackService;
use OCA\Deck\Service\CardService;
use OCP\IConfig;
use OCP\IL10N;
class DefaultBoardService {
private $boardMapper;
private $boardService;
private $stackService;
private $cardService;
private $config;
private $l10n;
public function __construct(
IL10N $l10n,
BoardMapper $boardMapper,
BoardService $boardService,
StackService $stackService,
CardService $cardService,
IConfig $config
) {
$this->boardService = $boardService;
$this->stackService = $stackService;
$this->cardService = $cardService;
$this->config = $config;
$this->boardMapper = $boardMapper;
$this->l10n = $l10n;
}
public function checkFirstRun($userId, $appName) {
$firstRun = $this->config->getUserValue($userId, $appName, 'firstRun', 'yes');
$userBoards = $this->boardMapper->findAllByUser($userId);
if ($firstRun === 'yes' && count($userBoards) === 0) {
$this->config->setUserValue($userId, $appName, 'firstRun', 'no');
return true;
}
return false;
}
public function createDefaultBoard($title, $userId, $color) {
$defaultBoard = $this->boardService->create($title, $userId, $color);
$defaultStacks = [];
$defaultCards = [];
$boardId = $defaultBoard->getId();
$defaultStacks[] = $this->stackService->create($this->l10n->t('To do'), $boardId, 1);
$defaultStacks[] = $this->stackService->create($this->l10n->t('Doing'), $boardId, 1);
$defaultStacks[] = $this->stackService->create($this->l10n->t('Done'), $boardId, 1);
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 3'), $defaultStacks[0]->getId(), 'text', 0, $userId);
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 2'), $defaultStacks[1]->getId(), 'text', 0, $userId);
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 1'), $defaultStacks[2]->getId(), 'text', 0, $userId);
return $defaultBoard;
}
}

View File

@@ -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');
}
?>
<div id="app" class="app-deck" data-ng-app="Deck" ng-controller="AppController" ng-cloak config="<?php p(json_encode($_)); ?>">
<div class="app app-deck" data-ng-app="Deck" ng-controller="AppController" ng-cloak config="<?php p(json_encode($_)); ?>" ng-class="{'app-navigation-hide': appNavigationHide}">
<div id="app-navigation" data-ng-controller="ListController" ng-init="initSidebar()">
<?php print_unescaped($this->inc('part.navigation')); ?>
<?php /* print_unescaped($this->inc('part.settings')); */ ?>
</div>
<div id="app-content" ng-class="{ 'details-visible': sidebar.show }">
<div ui-view></div>
</div>
<div id="app-content" ng-class="{ 'details-visible': sidebar.show }"><div id="app-navigation-toggle-custom" class="icon-menu" ng-click="toggleSidebar()"></div><div ui-view></div></div>
<div id="app-sidebar" ng-class="{ 'details-visible': sidebar.show }" ng-if="sidebar.show" class="details-view scroll-container" ui-view="sidebarView"></div>
<route-loading-indicator></route-loading-indicator>
<script type="text/ng-template" id="/boardlist.mainView.html">
<?php print_unescaped($this->inc('part.boardlist')); ?>
</script>
<script type="text/ng-template" id="/board.sidebarView.html">
<?php print_unescaped($this->inc('part.board.sidebarView')); ?>
</script>
<script type="text/ng-template" id="/board.mainView.html">
<?php print_unescaped($this->inc('part.board.mainView')); ?>
</script>
<script type="text/ng-template" id="/board.html">
<?php print_unescaped($this->inc('part.board')); ?>
<?php print_unescaped($this->inc('part.board.mainView')); ?>
</script>
<script type="text/ng-template" id="/card.sidebarView.html">
<?php print_unescaped($this->inc('part.card')); ?>
@@ -62,4 +60,4 @@ Util::addScript('deck', 'build/deck');
<?php print_unescaped($this->inc('part.card.attachments')); ?>
</script>
</div>
</div>

View File

@@ -37,7 +37,6 @@
</div>
<div id="board" class="scroll-container" ng-click="sidebar.show=false" ui-sref="board" ng-class="{'card-selected': params.cardId}">
{{ cardOpen }}
<search on-search="search" class="ng-hide"></search>
<div id="innerBoard" data-ng-model="stacks" data-as-sortable="sortOptionsStack">
@@ -53,7 +52,7 @@
</form>
<button class="icon-delete button-inline stack-actions"
ng-if="!s.status.editStack"
ng-click="stackservice.delete(s.id)"></button>
ng-click="stackservice.delete(s.id)"></button>
</h3>
<ul data-as-sortable="sortOptions" is-disabled="!boardservice.canEdit() || filter==='archive'" data-ng-model="s.cards" class="card-list" ng-class="{emptyStack: !s.cards.length}">
<li class="card as-sortable-item"
@@ -101,6 +100,18 @@
<button class="button-inline card-options icon-more" ng-model="card"></button>
<div class="popovermenu hidden">
<ul>
<li ng-if="!isCurrentUserAssigned(c)">
<a class="menuitem action action-rename permanent"
data-action="AssignToMe"
ng-click="cardAssignToMe(c); $event.stopPropagation();"><span
class="icon icon-user"></span><span><?php p($l->t('Assign to me')); ?></span></a>
</li>
<li ng-if="isCurrentUserAssigned(c)">
<a class="menuitem action action-rename permanent"
data-action="UnassignFromMe"
ng-click="cardUnassignFromMe(c); $event.stopPropagation();"><span
class="icon icon-user"></span><span><?php p($l->t('Unassign from me')); ?></span></a>
</li>
<li ng-if="params.filter!=='archive'">
<a class="menuitem action action-rename permanent"
data-action="Archive"

View File

@@ -1,4 +0,0 @@
<?php print_unescaped($this->inc('part.board.mainView')); ?>
<div id="app-sidebar" class="details-view scroll-container"
ng-class="{ 'details-visible': sidebar.show }" ui-view="sidebarView">
</div>

View File

@@ -1,5 +1,5 @@
<div nv-file-drop="" uploader="uploader" class="drop-zone" options="{cardId: cardservice.getCurrent().id}">
<div class="drop-indicator" nv-file-over uploader="uploader">
<div nv-file-drop="" uploader="fileservice.uploader" class="drop-zone" options="{cardId: cardservice.getCurrent().id}">
<div class="drop-indicator" nv-file-over uploader="fileservice.uploader">
<p><?php p($l->t('Drop your files here to upload it to the card')); ?></p>
</div>
<div id="board-status" ng-if="statusservice.active">
@@ -53,9 +53,9 @@
</ui-select-choices>
</ui-select>
</div>
<div class="section-header">
<div class="section-header" ng-click="toggleAssignUser()">
<h4><?php p($l->t('Assign users')); ?></h4>
<button class="button icon-add" ng-click="toggleAssignUser()"></button>
<button class="button icon-add"></button>
</div>
<div class="section-content card-details-assign-users" ng-if="cardservice.getCurrent()">
<ui-select id="assignUserSelect" class="card-details-assign-user" ng-model="status.assignedUser" ng-show="status.showAssignUser" uis-open-close="assingUserOpenClose(isOpen)"
@@ -97,8 +97,8 @@
<span class="save-indicator saved"><?php p($l->t('Saved')); ?></span>
<span class="save-indicator unsaved"><?php p($l->t('Unsaved changes')); ?></span>
<a ng-if="params.tab === 0" href="https://github.com/nextcloud/deck/wiki/Markdown-Help" target="_blank" class="icon icon-help" data-toggle="tooltip" data-placement="left" title="<?php p($l->t('Formatting help')); ?>"><span class="hidden-visually"><?php p($l->t('Formatting help')); ?></span></a>
<label ng-if="params.tab === 1" for="attachment-upload" class="button icon-upload" ng-class="{'icon-loading-small': uploader.isUploading}" data-toggle="tooltip" data-placement="left" title="<?php p($l->t('Upload attachment')); ?>"></label>
<input id="attachment-upload" type="file" nv-file-select="" uploader="uploader" class="hidden" options="{cardId: cardservice.getCurrent().id}"/>
<label ng-if="params.tab === 1" for="attachment-upload" class="button icon-upload" ng-class="{'icon-loading-small': fileservice.uploader.isUploading}" data-toggle="tooltip" data-placement="left" title="<?php p($l->t('Upload attachment')); ?>"></label>
<input id="attachment-upload" type="file" nv-file-select="" uploader="fileservice.uploader" class="hidden" options="{cardId: cardservice.getCurrent().id}"/>
<input ng-if="status.cardEditDescription" type="button" ng-mousedown="status.continueEdit = true; status.selectAttachment = true;" class="icon-files-dark" data-toggle="tooltip" data-placement="left" title="<?php p($l->t('Insert attachment')); ?>"/>
</div>

View File

@@ -184,6 +184,49 @@ class NotificationHelperTest extends \Test\TestCase {
$this->notificationHelper->sendCardDuedate($card);
}
public function testSendCardAssignedUser() {
$board = new Board();
$board->setId(123);
$board->setTitle('MyBoardTitle');
$this->boardMapper->expects($this->once())
->method('find')
->with(123)
->willReturn($board);
$acl = new Acl();
$acl->setParticipant('admin');
$acl->setType(Acl::PERMISSION_TYPE_USER);
$card = new Card();
$card->setTitle('MyCardTitle');
$card->setOwner('admin');
$card->setStackId(123);
$card->setOrder(999);
$card->setType('text');
$card->setId(1337);
$card->setAssignedUsers(['userA']);
$this->cardMapper->expects($this->once())
->method('findBoardId')
->with(1337)
->willReturn(123);
$notification = $this->createMock(INotification::class);
$notification->expects($this->once())->method('setApp')->with('deck')->willReturn($notification);
$notification->expects($this->once())->method('setUser')->with('userA')->willReturn($notification);
$notification->expects($this->once())->method('setObject')->with('card', 1337)->willReturn($notification);
$notification->expects($this->once())->method('setSubject')->with('card-assigned', ['MyCardTitle', 'MyBoardTitle', 'admin'])->willReturn($notification);
$notification->expects($this->once())->method('setDateTime')->willReturn($notification);
$this->notificationManager->expects($this->at(0))
->method('createNotification')
->willReturn($notification);
$this->notificationManager->expects($this->at(1))
->method('notify')
->with($notification);
$this->notificationHelper->sendCardAssigned($card, 'userA');
}
public function testSendBoardSharedUser() {
$board = new Board();
$board->setId(123);

View File

@@ -129,11 +129,82 @@ class UnknownUserTest extends \Test\TestCase {
}
public function dataPrepareCardAssigned() {
return [
[true], [false]
];
}
/** @dataProvider dataPrepareCardAssigned */
public function testPrepareCardAssigned($withUserFound = true) {
/** @var INotification $notification */
$notification = $this->createMock(INotification::class);
$notification->expects($this->once())
->method('getApp')
->willReturn('deck');
$notification->expects($this->once())
->method('getSubjectParameters')
->willReturn(['Card title','Board title', 'otheruser']);
$notification->expects($this->once())
->method('getSubject')
->willReturn('card-assigned');
$notification->expects($this->once())
->method('getObjectId')
->willReturn('123');
if ($withUserFound) {
$user = $this->createMock(IUser::class);
$user->expects($this->any())
->method('getDisplayName')
->willReturn('Other User');
$dn = 'Other User';
} else {
$user = null;
$dn = 'otheruser';
}
$this->userManager->expects($this->once())
->method('get')
->with('otheruser')
->willReturn($user);
$expectedMessage = 'The card "Card title" on "Board title" has been assigned to you by '.$dn.'.';
$notification->expects($this->once())
->method('setParsedSubject')
->with($expectedMessage);
$notification->expects($this->once())
->method('setRichSubject')
->with('{user} has assigned the card "Card title" on "Board title" to you.', [
'user' => [
'type' => 'user',
'id' => 'otheruser',
'name' => $dn,
]
]);
$this->url->expects($this->once())
->method('imagePath')
->with('deck', 'deck-dark.svg')
->willReturn('deck-dark.svg');
$this->url->expects($this->once())
->method('getAbsoluteURL')
->with('deck-dark.svg')
->willReturn('/absolute/deck-dark.svg');
$notification->expects($this->once())
->method('setIcon')
->with('/absolute/deck-dark.svg');
$actualNotification = $this->notifier->prepare($notification, 'en_US');
$this->assertEquals($notification, $actualNotification);
}
public function dataPrepareBoardShared() {
return [
[true], [false]
];
}
/** @dataProvider dataPrepareBoardShared */
public function testPrepareBoardShared($withUserFound = true) {
/** @var INotification $notification */

View File

@@ -30,6 +30,7 @@ use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\NotFoundException;
use OCA\Deck\Notification\NotificationHelper;
use OCA\Deck\StatusException;
use Test\TestCase;
@@ -43,6 +44,8 @@ class CardServiceTest extends TestCase {
private $stackMapper;
/** @var PermissionService|\PHPUnit\Framework\MockObject\MockObject */
private $permissionService;
/** @var NotificationHelper */
private $notificationHelper;
/** @var AssignedUsersMapper|\PHPUnit\Framework\MockObject\MockObject */
private $assignedUsersMapper;
/** @var BoardService|\PHPUnit\Framework\MockObject\MockObject */
@@ -54,9 +57,10 @@ class CardServiceTest extends TestCase {
$this->stackMapper = $this->createMock(StackMapper::class);
$this->permissionService = $this->createMock(PermissionService::class);
$this->boardService = $this->createMock(BoardService::class);
$this->notificationHelper = $this->createMock(NotificationHelper::class);
$this->assignedUsersMapper = $this->createMock(AssignedUsersMapper::class);
$this->attachmentService = $this->createMock(AttachmentService::class);
$this->cardService = new CardService($this->cardMapper, $this->stackMapper, $this->permissionService, $this->boardService, $this->assignedUsersMapper, $this->attachmentService);
$this->cardService = new CardService($this->cardMapper, $this->stackMapper, $this->permissionService, $this->boardService, $this->notificationHelper, $this->assignedUsersMapper, $this->attachmentService, 'userXY');
}
public function testFind() {

View File

@@ -0,0 +1,195 @@
<?php
/**
* @copyright Copyright (c) 2018 Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Deck\Service;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\Stack;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Service\DefaultBoardService;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\StackService;
use OCA\Deck\Service\CardService;
use OCP\IConfig;
use OCP\IL10N;
use \Test\TestCase;
class DefaultBoardServiceTest extends TestCase {
/** @var DefaultBoardService */
private $service;
/** @var BoardService */
private $boardService;
/** @var StackService */
private $stackService;
/** @var CardService */
private $cardService;
/** @var BoardMapper */
private $boardMapper;
/** @var IConfig */
private $config;
private $l10n;
private $userId = 'admin';
public function setUp() {
parent::setUp();
$this->boardMapper = $this->createMock(BoardMapper::class);
$this->boardService = $this->createMock(BoardService::class);
$this->stackService = $this->createMock(StackService::class);
$this->cardService = $this->createMock(CardService::class);
$this->config = $this->createMock(IConfig::class);
$this->l10n = $this->createMock(IL10N::class);
$this->service = new DefaultBoardService(
$this->l10n,
$this->boardMapper,
$this->boardService,
$this->stackService,
$this->cardService,
$this->config
);
}
public function testCheckFirstRunCaseTrue() {
$appName = 'deck';
$userBoards = [];
$this->config->expects($this->once())
->method('getUserValue')
->willReturn('yes');
$this->boardMapper->expects($this->once())
->method('findAllByUser')
->willReturn($userBoards);
$this->config->expects($this->once())
->method('setUserValue');
$result = $this->service->checkFirstRun($this->userId, $appName);
$this->assertEquals($result, true);
}
public function testCheckFirstRunCaseFalse() {
$appName = 'deck';
$board = new Board();
$board->setTitle('Personal');
$board->setOwner($this->userId);
$board->setColor('000000');
$userBoards = [$board];
$this->config->expects($this->once())
->method('getUserValue')
->willReturn('no');
$this->boardMapper->expects($this->once())
->method('findAllByUser')
->willReturn($userBoards);
$result = $this->service->checkFirstRun($this->userId, $appName);
$this->assertEquals($result, false);
}
public function testCreateDefaultBoard() {
$title = 'Personal';
$color = '000000';
$boardId = 5;
$board = new Board();
$board->setId($boardId);
$board->setTitle($title);
$board->setOwner($this->userId);
$board->setColor($color);
$this->boardService->expects($this->once())
->method('create')
->willReturn($board);
$this->l10n->expects($this->any())
->method('t')
->willReturnCallback(function($text) { return $text; });
$stackToDoId = '123';
$stackToDo = $this->assembleTestStack('To do', $stackToDoId, $boardId);
$stackDoingId = '124';
$stackDoing = $this->assembleTestStack('Doing', $stackDoingId, $boardId);
$stackDoneId = '125';
$stackDone = $this->assembleTestStack('Done', $stackDoneId, $boardId);
$this->stackService->expects($this->exactly(3))
->method('create')
->withConsecutive(
[$this->l10n->t('To do'), $boardId, 1],
[$this->l10n->t('Doing'), $boardId, 1],
[$this->l10n->t('Done'), $boardId, 1]
)
->willReturnOnConsecutiveCalls($stackToDo, $stackDoing, $stackDone);
$cardExampleTask3 = $this->assembleTestCard('Example Task 3', $stackToDoId, $this->userId);
$cardExampleTask2 = $this->assembleTestCard('Example Task 2', $stackDoingId, $this->userId);
$cardExampleTask1 = $this->assembleTestCard('Example Task 1', $stackDoneId, $this->userId);
$this->cardService->expects($this->exactly(3))
->method('create')
->withConsecutive(
['Example Task 3', $stackToDoId, 'text', 0, $this->userId],
['Example Task 2', $stackDoingId, 'text', 0, $this->userId],
['Example Task 1', $stackDoneId, 'text', 0, $this->userId]
)
->willReturnonConsecutiveCalls($cardExampleTask3, $cardExampleTask2, $cardExampleTask1);
$result = $this->service->createDefaultBoard($title, $this->userId, $color);
$this->assertEquals($result->getTitle(), $title);
$this->assertEquals($result->getOwner(), $this->userId);
$this->assertEquals($result->getColor(), $color);
}
private function assembleTestStack($title, $id, $boardId) {
$stack = new Stack();
$stack->setId($id);
$stack->setTitle($title);
$stack->setBoardId($boardId);
$stack->setOrder(1);
return $stack;
}
private function assembleTestCard($title, $stackId, $userId) {
$card = new Card();
$card->setTitle($title);
$card->setStackId($stackId);
$card->setType('text');
$card->setOrder(0);
$card->setOwner($userId);
return $card;
}
}

View File

@@ -3,6 +3,7 @@
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
*
* @license GNU AGPL version 3 or any later version
*
@@ -24,6 +25,9 @@
namespace OCA\Deck\Controller;
use PHPUnit_Framework_TestCase;
use OCA\Deck\Service\DefaultBoardService;
use OCA\Deck\Db\Board;
use OCP\IConfig;
class PageControllerTest extends \Test\TestCase {
@@ -31,6 +35,8 @@ class PageControllerTest extends \Test\TestCase {
private $request;
private $l10n;
private $userId = 'john';
private $defaultBoardService;
private $config;
public function setUp() {
$this->l10n = $this->request = $this->getMockBuilder(
@@ -42,16 +48,43 @@ class PageControllerTest extends \Test\TestCase {
->disableOriginalConstructor()
->getMock();
$this->defaultBoardService = $this->createMock(DefaultBoardService::class);
$this->config = $this->createMock(IConfig::class);
$this->controller = new PageController(
'deck', $this->request, $this->l10n, $this->userId
'deck', $this->request, $this->defaultBoardService, $this->l10n, $this->userId
);
}
public function testIndexOnFirstRun() {
$board = new Board();
$board->setTitle('Personal');
$board->setOwner($this->userId);
$board->setColor('000000');
$this->defaultBoardService->expects($this->once())
->method('checkFirstRun')
->willReturn(true);
$this->defaultBoardService->expects($this->once())
->method('createDefaultBoard')
->willReturn($board);
$response = $this->controller->index();
$this->assertEquals('main', $response->getTemplateName());
}
public function testIndexOnSecondRun() {
$this->config->setUserValue($this->userId, 'deck', 'firstRun', 'no');
$this->defaultBoardService->expects($this->once())
->method('checkFirstRun')
->willReturn(false);
public function testIndex() {
$response = $this->controller->index();
$this->assertEquals('main', $response->getTemplateName());
}
}