Compare commits

...

132 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
Julius Härtl
fde5096856 Merge pull request #524 from nextcloud/release/v0.4.0
Prepare 0.4.0 release
2018-07-11 18:37:17 +02: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
Julius Härtl
f3296dd443 Add compatibility check for 12,13
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-11 14:07:58 +02: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
Julius Härtl
820ad7c523 Update changelog
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-11 13:54:06 +02:00
Julius Härtl
9f66ce618e Bump version to 0.4.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-11 13:54:06 +02:00
Julius Härtl
2318425160 Add package target to Makefile
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-11 08:48:01 +02: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
Nextcloud bot
213e3083a1 [tx-robot] updated from transifex 2018-07-11 00:19:11 +00: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
Julius Härtl
4fc65c8302 Merge pull request #522 from nextcloud/dependabot/npm_and_yarn/js/css-loader-1.0.0
Bump css-loader from 0.28.11 to 1.0.0 in /js
2018-07-10 15:21:35 +02:00
dependabot[bot]
bcb54faeaf Bump css-loader from 0.28.11 to 1.0.0 in /js
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 0.28.11 to 1.0.0.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v0.28.11...v1.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-10 12:41:11 +00:00
Julius Härtl
f5753f3fde Merge pull request #521 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.15.1
Bump webpack from 4.14.0 to 4.15.1 in /js
2018-07-10 14:39:30 +02:00
dependabot[bot]
5ff8618c10 Bump webpack from 4.14.0 to 4.15.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.14.0 to 4.15.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.14.0...v4.15.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-10 12:35:38 +00:00
Julius Härtl
bee918e810 Merge pull request #520 from nextcloud/dependabot/npm_and_yarn/js/node-sass-4.9.2
Bump node-sass from 4.9.0 to 4.9.2 in /js
2018-07-10 14:33:59 +02:00
dependabot[bot]
37301ae92b Bump node-sass from 4.9.0 to 4.9.2 in /js
Bumps [node-sass](https://github.com/sass/node-sass) from 4.9.0 to 4.9.2.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.9.0...v4.9.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-09 07:50:44 +00:00
Julius Härtl
bd304d5f27 Merge pull request #523 from nextcloud/dependabot/npm_and_yarn/js/babel-loader-7.1.5
Bump babel-loader from 7.1.4 to 7.1.5 in /js
2018-07-09 09:47:27 +02:00
dependabot[bot]
827c69bd7b Bump babel-loader from 7.1.4 to 7.1.5 in /js
Bumps [babel-loader](https://github.com/babel/babel-loader) from 7.1.4 to 7.1.5.
- [Release notes](https://github.com/babel/babel-loader/releases)
- [Changelog](https://github.com/babel/babel-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel-loader/compare/v7.1.4...v7.1.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-09 01:15:28 +00:00
Nextcloud bot
812a225334 [tx-robot] updated from transifex 2018-07-08 00:12:30 +00:00
Julius Härtl
90c4e7818a Use ng-attr-value to support IE11
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-06 13:49:29 +02:00
Nextcloud bot
1299df539e [tx-robot] updated from transifex 2018-07-06 00:12:18 +00:00
Julius Härtl
20b25e0108 Bump version to 0.4.0-beta5
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-05 18:53:47 +02:00
Julius Härtl
e959afb2de Merge pull request #519 from nextcloud/bugfix/noid/stream-attachment-download
Fetch file from rootFolder instead of IAppData to use StreamResponse
2018-07-05 18:52:45 +02:00
Julius Härtl
cb25643741 Fetch file from rootFolder instead of IAppData to use StreamResponse when displaying
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-05 18:42:33 +02:00
Nextcloud bot
bbfb9e713a [tx-robot] updated from transifex 2018-07-04 00:12:38 +00:00
Nextcloud bot
e71a38fe96 [tx-robot] updated from transifex 2018-07-03 00:16:32 +00:00
Julius Härtl
120e4e13a6 Bump version to 0.4.0-beta4
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-02 12:16:02 +02:00
Julius Härtl
04aa9df45b Merge pull request #470 from nextcloud/feature/noid/export
Implement user data export via occ command
2018-07-02 12:06:53 +02:00
Julius Härtl
8d60a4379d Add rough test and fix card array
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-02 11:51:53 +02:00
Julius Härtl
4e96dec474 Implement user data export via occ command
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-02 11:06:13 +02:00
Julius Härtl
9727356d3b Merge pull request #514 from nextcloud/feature/noid/file-progress
File upload progress
2018-07-02 09:49:00 +02:00
Julius Härtl
c0c0cb8545 Implement file upload status and cancel button
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-02 09:34:57 +02:00
Julius Härtl
af646c1999 Reset FileService status when switching cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-02 09:34:57 +02:00
Julius Härtl
38bb4c7a3a Merge pull request #515 from nextcloud/dependabot/npm_and_yarn/js/mini-css-extract-plugin-0.4.1
Bump mini-css-extract-plugin from 0.4.0 to 0.4.1 in /js
2018-07-02 08:35:07 +02:00
dependabot[bot]
573fa2c457 Bump mini-css-extract-plugin from 0.4.0 to 0.4.1 in /js
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.4.0 to 0.4.1.
- [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v0.4.0...v0.4.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-02 06:29:23 +00:00
Julius Härtl
d7e7fd58b0 Merge pull request #516 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.14.0
Bump webpack from 4.12.1 to 4.14.0 in /js
2018-07-02 08:27:07 +02:00
dependabot[bot]
f5a234fd26 Bump webpack from 4.12.1 to 4.14.0 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.12.1 to 4.14.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.12.1...v4.14.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-02 01:14:11 +00:00
Nextcloud bot
f75c9e0d4a [tx-robot] updated from transifex 2018-07-02 00:14:13 +00:00
Nextcloud bot
5eca92a0ea [tx-robot] updated from transifex 2018-07-01 00:16:09 +00:00
Julius Härtl
384b7a41a9 Merge pull request #513 from nextcloud/bugfix/noid/img-colorpicker-dark
Add misisng colorpicker image
2018-06-30 10:59:19 +02:00
Julius Härtl
47e27a7a89 Add misisng colorpicker image
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-30 09:47:46 +02:00
Nextcloud bot
ac19621d5b [tx-robot] updated from transifex 2018-06-30 00:16:44 +00:00
Nextcloud bot
cf2e84873c [tx-robot] updated from transifex 2018-06-29 00:18:56 +00:00
Julius Härtl
c523474980 Merge pull request #508 from nextcloud/bugfix/502/markdown-newline
Fix markdownit configuration
2018-06-28 21:36:19 +02:00
Julius Härtl
754486673a Merge pull request #510 from nextcloud/bugfix/noid/upload-size-fontend
Add frontend check for file size before starting to upload
2018-06-28 21:34:54 +02:00
Julius Härtl
a7110082e7 Merge branch 'master' into bugfix/502/markdown-newline 2018-06-28 21:32:03 +02:00
Julius Härtl
db619e4cda Merge pull request #509 from nextcloud/bugfix/504/fix-inline-javascript-error
Do not prefix href of select2 with unsafe to avoid #504
2018-06-28 21:31:38 +02:00
Julius Härtl
34d05f2ac0 Merge pull request #511 from nextcloud/bugfix/501/colorpicker-invert
Invert color picker icon on bright backgrounds
2018-06-28 21:31:15 +02:00
Julius Härtl
fdb1dbf397 Invert color picker icon on bright backgrounds
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-28 16:02:24 +02:00
Julius Härtl
5c2925aeed Fix markdownit configuration
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-28 15:34:36 +02:00
Julius Härtl
dc5fbbf7eb Do not prefix href of select2 with unsafe to avoid #504
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-28 15:26:27 +02:00
Julius Härtl
e46844988e Add frontend check for file size before starting to upload
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-28 15:25:25 +02:00
Julius Härtl
9d98107f3a Merge pull request #506 from nextcloud/dependabot/npm_and_yarn/js/karma-2.0.4
Bump karma from 2.0.3 to 2.0.4 in /js
2018-06-28 10:55:53 +02:00
Nextcloud bot
681176c684 [tx-robot] updated from transifex 2018-06-28 00:18:52 +00:00
Nextcloud bot
5d4757ddf1 [tx-robot] updated from transifex 2018-06-27 00:18:47 +00:00
dependabot[bot]
9731e6811a Bump karma from 2.0.3 to 2.0.4 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 2.0.3 to 2.0.4.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v2.0.3...v2.0.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-26 08:43:48 +00:00
Julius Härtl
23c86a4fcc Merge pull request #507 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.12.1
Bump webpack from 4.12.0 to 4.12.1 in /js
2018-06-26 10:41:55 +02:00
Nextcloud bot
43ea0136c8 [tx-robot] updated from transifex 2018-06-26 00:18:51 +00:00
dependabot[bot]
2cc8eb1313 Bump webpack from 4.12.0 to 4.12.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.12.0 to 4.12.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.12.0...v4.12.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-25 22:19:43 +00:00
Julius Härtl
bfe71900d3 Bump version to 0.4.0-beta3
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-25 18:14:59 +02:00
Julius Härtl
c6a6b41193 Merge pull request #505 from nextcloud/bugfix/noid/upload-errors
Display attachment errors properly and fix uploading big files
2018-06-25 18:12:44 +02:00
Julius Härtl
b0f7bef279 Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-25 18:05:02 +02:00
Julius Härtl
014f76b2fb Provide resource of tmp file instead of putting all content in memory
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-25 17:55:40 +02:00
Julius Härtl
546928fb79 Throw proper StatusException
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-25 17:55:18 +02:00
Julius Härtl
b4ead5a2eb Display proper file upload errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-25 17:54:28 +02:00
Nextcloud bot
124918b744 [tx-robot] updated from transifex 2018-06-25 00:18:22 +00:00
Nextcloud bot
9308ad125a [tx-robot] updated from transifex 2018-06-23 00:19:28 +00:00
Nextcloud bot
7dc43829ab [tx-robot] updated from transifex 2018-06-22 00:19:11 +00:00
80 changed files with 2568 additions and 2149 deletions

View File

@@ -22,6 +22,24 @@ pipeline:
when:
matrix:
TESTS: check-app-compatbility
check-app-compatbility-13:
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=stable13
- 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-13
signed-off-check:
image: nextcloudci/php7.0:php7.0-17
environment:
@@ -194,6 +212,7 @@ pipeline:
matrix:
include:
- TESTS: check-app-compatbility
- TESTS: check-app-compatbility-13
- TESTS: signed-off-check
- TESTS: syntax-php5.6
- TESTS: syntax-php7.0

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

@@ -1,7 +1,7 @@
# Changelog
All notable changes to this project will be documented in this file.
## 0.4.0 - unreleased
## 0.4.0 - 2018-07-11
### Added
@@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
- Embed attachments into the card description
- Color picker to use any color value for board and labels
- Support for checkboxes inside the description
- occ command to export user data as JSON
### Fixed

View File

@@ -12,7 +12,7 @@ sign_dir=$(build_dir)/sign
cert_dir=$(HOME)/.nextcloud/certificates
default: build
default: package
clean-build:
rm -rf $(build_dir)
@@ -95,3 +95,5 @@ test-integration:
test-js: install-deps
cd js && run test
package:
krankerl package

View File

@@ -14,7 +14,7 @@
- 🚀 Get your project organized
</description>
<version>0.4.0-beta2</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>
@@ -37,4 +37,7 @@
<step>OCA\Deck\Migration\UnknownUsers</step>
</post-migration>
</repair-steps>
<commands>
<command>OCA\Deck\Command\UserExport</command>
</commands>
</info>

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 {
@@ -877,6 +886,9 @@ input.input-inline {
button.icon-history {
width: 44px;
}
progress {
margin-top: 3px;
}
}
}
@@ -911,24 +923,11 @@ input.input-inline {
}
}
#card-attachments {
ul {
margin: 5px;
}
.details {
font-size: 8pt;
padding-left: 15px;
}
}
#app-content {
overflow: hidden;
display: flex;
flex-direction: column;
&.details-visible {
margin-right: 500px;
.card-attachments {
.error {
padding-left: 38px;
margin-bottom: 5px;
background-position: 10px;
}
}
@@ -976,8 +975,8 @@ input.input-inline {
}
}
.colorselect-label {
background-image: url('../img/color_picker.svg');
.colorselect-label, .colorselect-label-white {
background-image: url('../img/color_picker-dark.svg');
background-position: center center;
background-repeat: no-repeat;
opacity: 1;
@@ -988,6 +987,9 @@ input.input-inline {
width: 40px;
}
}
.colorselect-label-white {
background-image: url('../img/color_picker.svg');
}
}
.labels {
@@ -1431,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

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 100 100"><path d="M91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727a5.015 5.015 0 1 0-7.093 7.093l3.727 3.727-41.51 41.508a11.411 11.411 0 0 0-3.329 7.324c-.073 1.087-.347 3.105-.675 5.292a1.748 1.748 0 0 1-.487.983l-3.105 3.106a2.546 2.546 0 0 0 0 3.6l3.493 3.493a2.546 2.546 0 0 0 3.6 0l3.106-3.105c.277-.275.622-.433.981-.486 2.187-.329 4.205-.602 5.293-.675a11.412 11.412 0 0 0 7.325-3.33l41.508-41.508 3.727 3.727a5.015 5.015 0 1 0 7.093-7.093L69.507 29.419l9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726.001-16.2zM65.051 42.749l-20.53 20.53a2.546 2.546 0 0 1-3.6 0l-3.27-3.27a2.545 2.545 0 0 0-3.599.001l-.616.616-.002-.002-14.728 14.727c-.337.337-.819.401-1.076.143s-.194-.74.143-1.076l23.841-23.841.004.004 15.633-15.633a2.546 2.546 0 0 1 3.6 0l4.2 4.201a2.546 2.546 0 0 1 0 3.6z"/></svg>

After

Width:  |  Height:  |  Size: 897 B

View File

@@ -1,5 +1 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg id="Layer_1" width="15" height="15" enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 100 100" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<path d="m91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727c-1.959-1.959-5.134-1.959-7.093 0s-1.959 5.134 0 7.093l3.727 3.727-41.51 41.508c-2.039 2.039-3.149 4.656-3.329 7.324-0.073 1.087-0.347 3.105-0.675 5.292-0.053 0.359-0.212 0.706-0.487 0.983l-3.105 3.106c-0.994 0.994-0.994 2.606 0 3.6l3.493 3.493c0.994 0.994 2.606 0.994 3.6 0l3.106-3.105c0.277-0.275 0.622-0.433 0.981-0.486 2.187-0.329 4.205-0.602 5.293-0.675 2.668-0.18 5.285-1.29 7.325-3.33l41.508-41.508 3.727 3.727c1.959 1.959 5.134 1.959 7.093 0s1.959-5.134 0-7.093l-12.365-12.366 9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726 1e-3 -16.2zm-26.594 34.394l-20.53 20.53c-0.994 0.994-2.606 0.994-3.6 0l-3.27-3.27c-0.994-0.993-2.605-0.993-3.599 1e-3l-0.616 0.616-2e-3 -2e-3 -14.728 14.727c-0.337 0.337-0.819 0.401-1.076 0.143s-0.194-0.74 0.143-1.076l23.841-23.841 4e-3 4e-3 15.633-15.633c0.994-0.994 2.606-0.994 3.6 0l4.2 4.201c0.994 0.994 0.994 2.606 0 3.6z" fill="#fff"/>
<metadata><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><cc:license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/><dc:publisher><cc:Agent rdf:about="http://openclipart.org/"><dc:title>Openclipart</dc:title></cc:Agent></dc:publisher></cc:Work><cc:License rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/><cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/><cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/></cc:License></rdf:RDF></metadata></svg>
<svg width="15" height="15" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="M91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727a5.015 5.015 0 1 0-7.093 7.093l3.727 3.727-41.51 41.508a11.411 11.411 0 0 0-3.329 7.324c-.073 1.087-.347 3.105-.675 5.292a1.748 1.748 0 0 1-.487.983l-3.105 3.106a2.546 2.546 0 0 0 0 3.6l3.493 3.493a2.546 2.546 0 0 0 3.6 0l3.106-3.105c.277-.275.622-.433.981-.486 2.187-.329 4.205-.602 5.293-.675a11.412 11.412 0 0 0 7.325-3.33l41.508-41.508 3.727 3.727a5.015 5.015 0 1 0 7.093-7.093L69.507 29.419l9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726.001-16.2zM65.051 42.749l-20.53 20.53a2.546 2.546 0 0 1-3.6 0l-3.27-3.27a2.545 2.545 0 0 0-3.599.001l-.616.616-.002-.002-14.728 14.727c-.337.337-.819.401-1.076.143s-.194-.74.143-1.076l23.841-23.841.004.004 15.633-15.633a2.546 2.546 0 0 1 3.6 0l4.2 4.201a2.546 2.546 0 0 1 0 3.6z" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 910 B

View File

@@ -33,12 +33,16 @@ app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterPr
$compileProvider.debugInfoEnabled(true);
// This should fix adding "unsafe:" prefix to ui-select href links containing javascript
// inline JS is blocked by CSP anyway and filtered out by our markdown renderer as well
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/);
markdownItConverterProvider.use(markdownitLinkTarget, {
markdownItConverterProvider.config({
breaks: true,
linkify: true,
xhtmlOut: true
}).use(markdownitCheckbox);
});
markdownItConverterProvider.use(markdownitLinkTarget).use(markdownitCheckbox);
$urlRouterProvider.otherwise('/');
@@ -67,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'
}
}
})
@@ -78,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

@@ -23,10 +23,20 @@
import app from '../app/App.js';
/** global: OC */
app.controller('AppController', function ($scope, $location, $http, $log, $rootScope) {
app.controller('AppController', function ($scope, $location, $http, $log, $rootScope, $attrs) {
$rootScope.sidebar = {
show: false
};
$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);

View File

@@ -43,6 +43,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
return $state.params;
}, function (params) {
$scope.params = params;
$scope.fileservice.reset();
}, true);
$scope.params = $state.params;

2602
js/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -8,28 +8,28 @@
"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"
},
"devDependencies": {
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-loader": "^7.1.5",
"babel-preset-env": "^1.7.0",
"css-loader": "^0.28.9",
"karma": "^2.0.3",
"mini-css-extract-plugin": "^0.4.0",
"node-sass": "^4.5.3",
"webpack": "^4.12.0",
"webpack-cli": "^3.0.8",
"css-loader": "^1.0.0",
"karma": "^2.0.4",
"mini-css-extract-plugin": "^0.4.1",
"node-sass": "^4.9.2",
"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,5 +1,5 @@
/*
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
@@ -25,18 +25,29 @@ import app from '../app/App.js';
/* global OC oc_requesttoken */
export default class FileService {
constructor ($http, FileUploader, CardService) {
constructor (FileUploader, CardService, $rootScope, $filter) {
this.$filter = $filter;
this.uploader = new FileUploader();
this.cardservice = CardService;
this.uploader.onAfterAddingFile = this.onAfterAddingFile.bind(this);
this.uploader.onSuccessItem = this.onSuccessItem.bind(this);
this.uploader.onErrorItem = this.onErrorItem.bind(this);
this.uploader.onCancelItem = this.onCancelItem.bind(this);
this.maxUploadSize = $rootScope.config.maxUploadSize;
this.progress = [];
this.status = null;
}
reset () {
this.status = null;
}
runUpload (fileItem, attachmentId) {
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment');
this.status = null;
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment?type=deck_file');
if (typeof attachmentId !== 'undefined') {
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment/' + attachmentId);
fileItem.url = OC.generateUrl('/apps/deck/cards/' + fileItem.cardId + '/attachment/' + attachmentId + '?type=deck_file');
} else {
fileItem.formData = [
{
@@ -51,8 +62,17 @@ export default class FileService {
}
onAfterAddingFile (fileItem) {
if (this.maxUploadSize > 0 && fileItem.file.size > this.maxUploadSize) {
this.status = {
error: t('deck', `Failed to upload {name}`, {name: fileItem.file.name}),
message: t('deck', 'Maximum file size of {size} exceeded', {size: this.$filter('bytes')(this.maxUploadSize)})
};
return;
}
// Fetch card details before trying to upload so we can detect filename collisions properly
let self = this;
this.progress.push(fileItem);
this.cardservice.fetchOne(fileItem.cardId).then(function (data) {
let attachments = self.cardservice.get(fileItem.cardId).attachments;
let existingFile = attachments.find((attachment) => {
@@ -81,7 +101,7 @@ export default class FileService {
self.runUpload(fileItem);
}
}, function (error) {
this.progress = this.progress.filter((item) => (fileItem.file.name !== item.file.name));
});
}
@@ -93,8 +113,25 @@ export default class FileService {
attachments = attachments.splice(index, 1);
}
this.cardservice.get(item.cardId).attachments.push(response);
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
}
onErrorItem (item, response) {
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
this.status = {
error: t('deck', `Failed to upload:`) + ' ' + item.file.name,
message: response.message
};
}
onCancelItem (item) {
this.progress = this.progress.filter((fileItem) => (fileItem.file.name !== item.file.name));
}
getProgressItemsForCard (cardId) {
return this.progress.filter((fileItem) => (fileItem.cardId === cardId));
}
}
app.service('FileService', FileService);
app.service('FileService', FileService);

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,15 +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",
@@ -22,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",
@@ -50,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",
@@ -65,9 +93,12 @@ OC.L10N.register(
"Click to set" : "Klikněte pro výběr",
"Remove due date" : "Odstranit termín",
"Description" : "Popis",
"Attachments" : "Přílohy",
"Saved" : "Uloženo",
"Unsaved changes" : "Neuložené změny",
"Formatting help" : "Nápověda k formátování",
"Upload attachment" : "Nahrát přílohu",
"Insert attachment" : "Vložit přílohu",
"Add a card description…" : "Přidat popis karty...",
"Shared boards" : "Sdílené desky",
"View more" : "Ukázat více",

View File

@@ -4,15 +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",
@@ -20,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",
@@ -48,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",
@@ -63,9 +91,12 @@
"Click to set" : "Klikněte pro výběr",
"Remove due date" : "Odstranit termín",
"Description" : "Popis",
"Attachments" : "Přílohy",
"Saved" : "Uloženo",
"Unsaved changes" : "Neuložené změny",
"Formatting help" : "Nápověda k formátování",
"Upload attachment" : "Nahrát přílohu",
"Insert attachment" : "Vložit přílohu",
"Add a card description…" : "Přidat popis karty...",
"Shared boards" : "Sdílené desky",
"View more" : "Ukázat více",

View File

@@ -6,20 +6,35 @@ OC.L10N.register(
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden",
"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.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen",
"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.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"No file uploaded" : "Keine Datei hochgeladen",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"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 Werkzeug 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üge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 🚀 Organisiere Dein Projekt",
"Add a new stack" : "Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen",
@@ -27,6 +42,9 @@ OC.L10N.register(
"Board details" : "Board-Details",
"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",
@@ -58,14 +76,18 @@ OC.L10N.register(
"Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel",
"Select an attachment" : "Anhang auswählen",
"Cancel upload" : "Hochladen abbrechen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:",
"Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Nutzer zuweisen",
"Choose a user to assign" : "Wähle einen Benutzer zum 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 zuweisen",
"Due date" : "Fälligkeitsdatum",
"Click to set" : "Klicken zum Übernehmen",

View File

@@ -4,20 +4,35 @@
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden",
"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.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen",
"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.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"No file uploaded" : "Keine Datei hochgeladen",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"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 Werkzeug 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üge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 🚀 Organisiere Dein Projekt",
"Add a new stack" : "Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen",
@@ -25,6 +40,9 @@
"Board details" : "Board-Details",
"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",
@@ -56,14 +74,18 @@
"Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel",
"Select an attachment" : "Anhang auswählen",
"Cancel upload" : "Hochladen abbrechen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:",
"Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Nutzer zuweisen",
"Choose a user to assign" : "Wähle einen Benutzer zum 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 zuweisen",
"Due date" : "Fälligkeitsdatum",
"Click to set" : "Klicken zum Übernehmen",

View File

@@ -6,26 +6,35 @@ OC.L10N.register(
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden",
"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.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen",
"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 erlaubt, die im HTML-Formular spezifiziert ist",
"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.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded" : "Keine Datei hochgeladen",
"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 sie ein.\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 +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",
@@ -51,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",
@@ -65,18 +76,19 @@ OC.L10N.register(
"Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel",
"Select an attachment" : "Wählen Sie einen Anhang",
"Cancel upload" : "Hochladen abbrechen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten Cronjob-Lauf gelöscht.",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Fügen Sie die Datei in die Beschreibung ein",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:",
"Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Benutzer zuordnen",
"Choose a user to assign" : "Wählen Sie einen Benutzer zum Zuweisen",
"Assign this card to a user" : "Diese Karte einem 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 zuweisen",
"Due date" : "Zieltermin",
"Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen",

View File

@@ -4,26 +4,35 @@
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden",
"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.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen",
"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 erlaubt, die im HTML-Formular spezifiziert ist",
"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.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded" : "Keine Datei hochgeladen",
"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 sie ein.\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",
@@ -32,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",
@@ -49,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",
@@ -63,18 +74,19 @@
"Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel",
"Select an attachment" : "Wählen Sie einen Anhang",
"Cancel upload" : "Hochladen abbrechen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten Cronjob-Lauf gelöscht.",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Fügen Sie die Datei in die Beschreibung ein",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:",
"Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen",
"Add a tag" : "Schlagwort hinzufügen",
"Select tags" : "Schlagworte auswählen",
"Assign users" : "Benutzer zuordnen",
"Choose a user to assign" : "Wählen Sie einen Benutzer zum Zuweisen",
"Assign this card to a user" : "Diese Karte einem 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 zuweisen",
"Due date" : "Zieltermin",
"Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen",

View File

@@ -6,14 +6,32 @@ OC.L10N.register(
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"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.",
"No data was provided to create an attachment." : "No se proporcionaron datos para crear un adjunto",
"Finished" : "Finalizado",
"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",
"The file was only partially uploaded" : "El archivo se ha subido solo parcialmente",
"No file was uploaded" : "No se ha subido ningún archivo",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Una herramienta de manejo de proyectos y personal al estilo kanban para 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" : "Deckes una herramienta de organización al estilo kanban enfocada en la planificación personal y en la organización de proyectos para equipos, integrada en Nextcloud.\n\n\n- 📥 Añade tus tareas a tarjetas y ordénalas\n- 📄 Escribe notas adicionales en markdown\n- 🔖 Asigna etiquetas para una organización aún mejor\n- 👥 Comparte con tu equipo, amigos o familia\n- 🚀 Organiza tu proyecto",
@@ -24,6 +42,7 @@ OC.L10N.register(
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los tableros",
"Archived boards" : "Tableros archivados",
"Drop your files here to upload it to the card" : "Arrastra tus archivos aquí para subirlos a la tarjeta",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Introducir título de tarjeta",
@@ -54,7 +73,12 @@ OC.L10N.register(
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado del tablero. Si no, el tablero será eliminado durante la próxima ejecución del cronjob.",
"Create new board" : "Crear nuevo tablero",
"New board title" : "Nuevo título de tablero",
"Select an attachment" : "Selecciona un adjunto",
"Cancel upload" : "Cancelar la subida",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Deshacer eliminación del archivo. De otra forma el archivo se borrará durante la próxima ejecución del trabajo cron.",
"Undo file deletion" : "Deshacer eliminación del archivo",
"Insert the file into the description" : "Introduce el archivo en la descripción",
"Modified:" : "Modificado: ",
"Created:" : "Creado: ",
"Choose a tag" : "Escoge una etiqueta",
@@ -67,9 +91,12 @@ OC.L10N.register(
"Click to set" : "Pinchar para establecer",
"Remove due date" : "Eliminar fecha límite",
"Description" : "Descripción",
"Attachments" : "Adjuntos",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Upload attachment" : "Subir adjunto",
"Insert attachment" : "Insertar adjunto",
"Add a card description…" : "Añadir una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",

View File

@@ -4,14 +4,32 @@
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"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.",
"No data was provided to create an attachment." : "No se proporcionaron datos para crear un adjunto",
"Finished" : "Finalizado",
"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",
"The file was only partially uploaded" : "El archivo se ha subido solo parcialmente",
"No file was uploaded" : "No se ha subido ningún archivo",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Una herramienta de manejo de proyectos y personal al estilo kanban para 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" : "Deckes una herramienta de organización al estilo kanban enfocada en la planificación personal y en la organización de proyectos para equipos, integrada en Nextcloud.\n\n\n- 📥 Añade tus tareas a tarjetas y ordénalas\n- 📄 Escribe notas adicionales en markdown\n- 🔖 Asigna etiquetas para una organización aún mejor\n- 👥 Comparte con tu equipo, amigos o familia\n- 🚀 Organiza tu proyecto",
@@ -22,6 +40,7 @@
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los tableros",
"Archived boards" : "Tableros archivados",
"Drop your files here to upload it to the card" : "Arrastra tus archivos aquí para subirlos a la tarjeta",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Introducir título de tarjeta",
@@ -52,7 +71,12 @@
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado del tablero. Si no, el tablero será eliminado durante la próxima ejecución del cronjob.",
"Create new board" : "Crear nuevo tablero",
"New board title" : "Nuevo título de tablero",
"Select an attachment" : "Selecciona un adjunto",
"Cancel upload" : "Cancelar la subida",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Deshacer eliminación del archivo. De otra forma el archivo se borrará durante la próxima ejecución del trabajo cron.",
"Undo file deletion" : "Deshacer eliminación del archivo",
"Insert the file into the description" : "Introduce el archivo en la descripción",
"Modified:" : "Modificado: ",
"Created:" : "Creado: ",
"Choose a tag" : "Escoge una etiqueta",
@@ -65,9 +89,12 @@
"Click to set" : "Pinchar para establecer",
"Remove due date" : "Eliminar fecha límite",
"Description" : "Descripción",
"Attachments" : "Adjuntos",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Upload attachment" : "Subir adjunto",
"Insert attachment" : "Insertar adjunto",
"Add a card description…" : "Añadir una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",

View File

@@ -6,6 +6,8 @@ OC.L10N.register(
"Remove user from card" : "Poista käyttäjä kortilta",
"Hours" : "Tunnit",
"Minutes" : "Minuutit",
"Maximum file size of {size} exceeded" : "Tiedoston enimmäiskoko {size} ylitetty",
"Are you sure you want to delete the stack with all of its data?" : "Haluatko varmasti poistaa pinon ja kaikki siinä olevat tiedot?",
"The card \"%s\" on \"%s\" has reached its due date." : "Kortin \"%s\" on \"%s\" eräpäivä on tullut vastaan.",
"The board \"%s\" has been shared with you by %s." : "Taulu \"%s\" on jaettu kanssasi käyttäjän %s toimesta.",
"{user} has shared the board %s with you." : "{user} on jakanut taulun %s kanssasi.",
@@ -13,12 +15,19 @@ OC.L10N.register(
"To review" : "Arvostella",
"Action needed" : "Toimia vaaditaan",
"Later" : "Myöhemmin",
"The file was uploaded" : "Tiedosto lähetettiin",
"The file was only partially uploaded" : "Tiedosto lähetettiin vain osittain",
"No file was uploaded" : "Tiedostoa ei lähetetty",
"Could not write file to disk" : "Tiedostoa ei voitu kirjoittaa levylle",
"Deck" : "Kansi",
"A kanban style project and personal management tool for Nextcloud" : "Kanban-tyylinen projektien ja henkilökohtaisten asioiden hallintatyökalu Nextcloudille",
"Add a new stack" : "Lisää uusi pino",
"Show archived cards" : "Näytä arkistoidut kortit",
"Hide archived cards" : "Piilota arkistoidut kortit",
"Board details" : "Taulun tiedot",
"All Boards" : "Kaikki taulut",
"Archived boards" : "Arkistoidut taulut",
"Drop your files here to upload it to the card" : "Pudota tiedostot tähän lähettääksesi ne kortille",
"Archive" : "Arkisto",
"Unarchive" : "Pois arkistosta",
"Enter a card title" : "Anna otsikko",
@@ -42,10 +51,13 @@ OC.L10N.register(
"More actions" : "Lisää toimintoja",
"Edit board" : "Muokkaa taulua",
"Archive board" : "Arkistoi taulu",
"Unarchive board" : "Kumoa taulun arkistointi",
"Delete board" : "Poista taulu",
"Create new board" : "Luo uusi taulu",
"New board title" : "Uusi taulun otsikko",
"Select an attachment" : "Valitse liite",
"by" : " Kirjoittaja:",
"Undo file deletion" : "Kumoa tiedoston luonti",
"Modified:" : "Muokattu:",
"Created:" : "Luotu:",
"Choose a tag" : "Valitse tunniste",
@@ -58,9 +70,11 @@ OC.L10N.register(
"Click to set" : "Napsauta asettaaksesi",
"Remove due date" : "Poista eräpäivä",
"Description" : "Kuvaus",
"Attachments" : "Liitteet",
"Saved" : "Tallennettu",
"Unsaved changes" : "Tallentamattomia muutoksia",
"Formatting help" : "Muotoiluapu",
"Upload attachment" : "Lähetä liite",
"Add a card description…" : "Lisää kortin kuvaus…",
"Shared boards" : "Jaetut taulut",
"View more" : "Näytä lisää",

View File

@@ -4,6 +4,8 @@
"Remove user from card" : "Poista käyttäjä kortilta",
"Hours" : "Tunnit",
"Minutes" : "Minuutit",
"Maximum file size of {size} exceeded" : "Tiedoston enimmäiskoko {size} ylitetty",
"Are you sure you want to delete the stack with all of its data?" : "Haluatko varmasti poistaa pinon ja kaikki siinä olevat tiedot?",
"The card \"%s\" on \"%s\" has reached its due date." : "Kortin \"%s\" on \"%s\" eräpäivä on tullut vastaan.",
"The board \"%s\" has been shared with you by %s." : "Taulu \"%s\" on jaettu kanssasi käyttäjän %s toimesta.",
"{user} has shared the board %s with you." : "{user} on jakanut taulun %s kanssasi.",
@@ -11,12 +13,19 @@
"To review" : "Arvostella",
"Action needed" : "Toimia vaaditaan",
"Later" : "Myöhemmin",
"The file was uploaded" : "Tiedosto lähetettiin",
"The file was only partially uploaded" : "Tiedosto lähetettiin vain osittain",
"No file was uploaded" : "Tiedostoa ei lähetetty",
"Could not write file to disk" : "Tiedostoa ei voitu kirjoittaa levylle",
"Deck" : "Kansi",
"A kanban style project and personal management tool for Nextcloud" : "Kanban-tyylinen projektien ja henkilökohtaisten asioiden hallintatyökalu Nextcloudille",
"Add a new stack" : "Lisää uusi pino",
"Show archived cards" : "Näytä arkistoidut kortit",
"Hide archived cards" : "Piilota arkistoidut kortit",
"Board details" : "Taulun tiedot",
"All Boards" : "Kaikki taulut",
"Archived boards" : "Arkistoidut taulut",
"Drop your files here to upload it to the card" : "Pudota tiedostot tähän lähettääksesi ne kortille",
"Archive" : "Arkisto",
"Unarchive" : "Pois arkistosta",
"Enter a card title" : "Anna otsikko",
@@ -40,10 +49,13 @@
"More actions" : "Lisää toimintoja",
"Edit board" : "Muokkaa taulua",
"Archive board" : "Arkistoi taulu",
"Unarchive board" : "Kumoa taulun arkistointi",
"Delete board" : "Poista taulu",
"Create new board" : "Luo uusi taulu",
"New board title" : "Uusi taulun otsikko",
"Select an attachment" : "Valitse liite",
"by" : " Kirjoittaja:",
"Undo file deletion" : "Kumoa tiedoston luonti",
"Modified:" : "Muokattu:",
"Created:" : "Luotu:",
"Choose a tag" : "Valitse tunniste",
@@ -56,9 +68,11 @@
"Click to set" : "Napsauta asettaaksesi",
"Remove due date" : "Poista eräpäivä",
"Description" : "Kuvaus",
"Attachments" : "Liitteet",
"Saved" : "Tallennettu",
"Unsaved changes" : "Tallentamattomia muutoksia",
"Formatting help" : "Muotoiluapu",
"Upload attachment" : "Lähetä liite",
"Add a card description…" : "Lisää kortin kuvaus…",
"Shared boards" : "Jaetut taulut",
"View more" : "Näytä lisää",

View File

@@ -6,18 +6,35 @@ OC.L10N.register(
"Remove user from card" : "Supprimer l'utilisateur de la carte",
"Hours" : "Heures",
"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.",
"No data was provided to create an attachment." : "Aucune donnée n'a été fournie pour créer une pièce jointe.",
"Finished" : "Terminé",
"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",
"The file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé",
"No file was uploaded" : "Aucun fichier n'a été téléchargé",
"Missing a temporary folder" : "Absence de dossier temporaire",
"Could not write file to disk" : "Impossible d'écrire le fichier sur le disque.",
"A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier",
"No file uploaded or file size exceeds maximum of %s" : "Aucun fichier téléversé ou la taille du fichier dépasse la maximum de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : " Un outil de style kanban pour Nextcloud, pour la gestion de votre vie personnelle et de vos projets.",
"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 est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 🚀 Organisez vos projets",
"Add a new stack" : "Ajouter une nouvelle pile",
"Submit" : "Envoyer",
"Show archived cards" : "Afficher les cartes archivées",
@@ -25,6 +42,9 @@ OC.L10N.register(
"Board details" : "Détails du tableau",
"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",
@@ -55,7 +75,12 @@ OC.L10N.register(
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Annuler la suppression du tableau - Autrement le tableau sera supprimé lors du prochain lancement de la tâche cron.",
"Create new board" : "Créer un nouveau tableau",
"New board title" : "Nouveau titre pour le tableau",
"Select an attachment" : "Sélectionner une pièce jointe",
"Cancel upload" : "Annuler le téléversement",
"by" : "par",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Annuler la suppression du fichier - Autrement le fichier sera supprimé lors du prochain lancement de la tâche cron.",
"Undo file deletion" : "Annuler la suppression du fichier",
"Insert the file into the description" : "Insérer le fichier dans la description",
"Modified:" : "Modifié le :",
"Created:" : "Créé le :",
"Choose a tag" : "Choisir une étiquette",
@@ -68,9 +93,12 @@ OC.L10N.register(
"Click to set" : "Cliquez pour définir",
"Remove due date" : "Supprimer la date d'échéance",
"Description" : "Description",
"Attachments" : "Pièces jointes",
"Saved" : "Enregistré",
"Unsaved changes" : "Modifications non sauvegardées",
"Formatting help" : "Aide sur la mise en forme",
"Upload attachment" : "Téléverser la pièce jointe",
"Insert attachment" : "Insérer une pièce jointe",
"Add a card description…" : "Ajouter une description pour la carte",
"Shared boards" : "Tableaux partagés",
"View more" : "Voir plus",

View File

@@ -4,18 +4,35 @@
"Remove user from card" : "Supprimer l'utilisateur de la carte",
"Hours" : "Heures",
"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.",
"No data was provided to create an attachment." : "Aucune donnée n'a été fournie pour créer une pièce jointe.",
"Finished" : "Terminé",
"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",
"The file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé",
"No file was uploaded" : "Aucun fichier n'a été téléchargé",
"Missing a temporary folder" : "Absence de dossier temporaire",
"Could not write file to disk" : "Impossible d'écrire le fichier sur le disque.",
"A PHP extension stopped the file upload" : "Une extension PHP a arrêté le téléversement du fichier",
"No file uploaded or file size exceeds maximum of %s" : "Aucun fichier téléversé ou la taille du fichier dépasse la maximum de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : " Un outil de style kanban pour Nextcloud, pour la gestion de votre vie personnelle et de vos projets.",
"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 est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 🚀 Organisez vos projets",
"Add a new stack" : "Ajouter une nouvelle pile",
"Submit" : "Envoyer",
"Show archived cards" : "Afficher les cartes archivées",
@@ -23,6 +40,9 @@
"Board details" : "Détails du tableau",
"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",
@@ -53,7 +73,12 @@
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Annuler la suppression du tableau - Autrement le tableau sera supprimé lors du prochain lancement de la tâche cron.",
"Create new board" : "Créer un nouveau tableau",
"New board title" : "Nouveau titre pour le tableau",
"Select an attachment" : "Sélectionner une pièce jointe",
"Cancel upload" : "Annuler le téléversement",
"by" : "par",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Annuler la suppression du fichier - Autrement le fichier sera supprimé lors du prochain lancement de la tâche cron.",
"Undo file deletion" : "Annuler la suppression du fichier",
"Insert the file into the description" : "Insérer le fichier dans la description",
"Modified:" : "Modifié le :",
"Created:" : "Créé le :",
"Choose a tag" : "Choisir une étiquette",
@@ -66,9 +91,12 @@
"Click to set" : "Cliquez pour définir",
"Remove due date" : "Supprimer la date d'échéance",
"Description" : "Description",
"Attachments" : "Pièces jointes",
"Saved" : "Enregistré",
"Unsaved changes" : "Modifications non sauvegardées",
"Formatting help" : "Aide sur la mise en forme",
"Upload attachment" : "Téléverser la pièce jointe",
"Insert attachment" : "Insérer une pièce jointe",
"Add a card description…" : "Ajouter une description pour la carte",
"Shared boards" : "Tableaux partagés",
"View more" : "Voir plus",

View File

@@ -6,14 +6,25 @@ OC.L10N.register(
"Remove user from card" : "הסרת משתמש מכרטיס",
"Hours" : "שעות",
"Minutes" : "דקות",
"Maximum file size of {size} exceeded" : "גודל הקבצים המרבי {size} הושג",
"Are you sure you want to delete the stack with all of its data?" : "למחוק את הערימה הזאת עם כל הנתונים שלה?",
"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." : "הלוח %s שותף אתך על ידי {user}",
"No data was provided to create an attachment." : "לא סופקו נתונים ליצירת קובץ מצורף",
"Finished" : "הסתיים",
"To review" : "לסקירה",
"Action needed" : "נדרשת פעולה",
"Later" : "מאוחר יותר",
"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",
"The file was only partially uploaded" : "הקובץ הועלה באופן חלקי בלבד",
"No file was uploaded" : "לא הועלה קובץ",
"Missing a temporary folder" : "חסרה תיקייה זמנית",
"Could not write file to disk" : "לא ניתן לכתוב לכונן",
"A PHP extension stopped the file upload" : "הרחבת PHP עצרה את העלאת הקובץ",
"No file uploaded or file size exceeds maximum of %s" : "לא הועלה אף קובץ או שגודל הקובץ חרג מהסף המרבי של %s",
"Deck" : "חפיסה",
"A kanban style project and personal management tool for Nextcloud" : "כלי ניהול למיזמים או לדברים אישיים עבור 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" : "חבילה היא כלי ניהול בסגנון קנבן שמיועד לתכנון אישי או לארגון מיזמים לצוותים בשילוב עם Nextcloud.\n\n\n- 📥 הוספת המשימות שלך וסידור שלהן\n- 📄 כתיבת הערות נוספות בתצורת markdown\n- 🔖 הקצאת תוויות למטרת ארגון טוב יותר\n- 👥 שיתוף עם הצוות, החברים או המשפחה שלך\n- 🚀 ארגון המיזם שלך כמו שצריך",
@@ -24,6 +35,7 @@ OC.L10N.register(
"Board details" : "פרטי לוח",
"All Boards" : "כל הלוחות",
"Archived boards" : "לוחות שנשמרו בארכיון",
"Drop your files here to upload it to the card" : "ניתן להשליך את הקבצים שלך כאן כדי להעלות אותם לכרטיס",
"Archive" : "לארכיון",
"Unarchive" : "הוצאה מהארכיון",
"Enter a card title" : "נא להקליד כותרת לכרטיס",
@@ -54,7 +66,12 @@ OC.L10N.register(
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "ביטול מחיקת לוח - אחרת הלוח יימחק במהלך ריצת ה־cronjob הבאה.",
"Create new board" : "יצירת לוח חדש",
"New board title" : "כותרת לוח חדשה",
"Select an attachment" : "נא לבחור קובץ מצורף",
"Cancel upload" : "ביטול העלאה",
"by" : "מאת",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "ביטול מחיקת קובץ - אחרת הקובץ יימחק עם ריצת משימת ה־cron הבאה.",
"Undo file deletion" : "ביטול מחיקת קובץ",
"Insert the file into the description" : "הוספת הקובץ לתיאור",
"Modified:" : "מועד השינוי",
"Created:" : "מועד היצירה:",
"Choose a tag" : "נא לבחור תגית",
@@ -67,9 +84,12 @@ OC.L10N.register(
"Click to set" : "יש ללחוץ להגדרה",
"Remove due date" : "הסרת מועד התפוגה",
"Description" : "תיאוג",
"Attachments" : "קבצים מצורפים",
"Saved" : "נשמר",
"Unsaved changes" : "שינויים שלא נשמרו",
"Formatting help" : "עזרה בסידור בתבנית",
"Upload attachment" : "העלאת קבצים מצורפים",
"Insert attachment" : "הוספת קובץ מצורף",
"Add a card description…" : "הוספת תיאור כרטיס…",
"Shared boards" : "לוחות משותפים",
"View more" : "הצגת עוד",

View File

@@ -4,14 +4,25 @@
"Remove user from card" : "הסרת משתמש מכרטיס",
"Hours" : "שעות",
"Minutes" : "דקות",
"Maximum file size of {size} exceeded" : "גודל הקבצים המרבי {size} הושג",
"Are you sure you want to delete the stack with all of its data?" : "למחוק את הערימה הזאת עם כל הנתונים שלה?",
"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." : "הלוח %s שותף אתך על ידי {user}",
"No data was provided to create an attachment." : "לא סופקו נתונים ליצירת קובץ מצורף",
"Finished" : "הסתיים",
"To review" : "לסקירה",
"Action needed" : "נדרשת פעולה",
"Later" : "מאוחר יותר",
"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",
"The file was only partially uploaded" : "הקובץ הועלה באופן חלקי בלבד",
"No file was uploaded" : "לא הועלה קובץ",
"Missing a temporary folder" : "חסרה תיקייה זמנית",
"Could not write file to disk" : "לא ניתן לכתוב לכונן",
"A PHP extension stopped the file upload" : "הרחבת PHP עצרה את העלאת הקובץ",
"No file uploaded or file size exceeds maximum of %s" : "לא הועלה אף קובץ או שגודל הקובץ חרג מהסף המרבי של %s",
"Deck" : "חפיסה",
"A kanban style project and personal management tool for Nextcloud" : "כלי ניהול למיזמים או לדברים אישיים עבור 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" : "חבילה היא כלי ניהול בסגנון קנבן שמיועד לתכנון אישי או לארגון מיזמים לצוותים בשילוב עם Nextcloud.\n\n\n- 📥 הוספת המשימות שלך וסידור שלהן\n- 📄 כתיבת הערות נוספות בתצורת markdown\n- 🔖 הקצאת תוויות למטרת ארגון טוב יותר\n- 👥 שיתוף עם הצוות, החברים או המשפחה שלך\n- 🚀 ארגון המיזם שלך כמו שצריך",
@@ -22,6 +33,7 @@
"Board details" : "פרטי לוח",
"All Boards" : "כל הלוחות",
"Archived boards" : "לוחות שנשמרו בארכיון",
"Drop your files here to upload it to the card" : "ניתן להשליך את הקבצים שלך כאן כדי להעלות אותם לכרטיס",
"Archive" : "לארכיון",
"Unarchive" : "הוצאה מהארכיון",
"Enter a card title" : "נא להקליד כותרת לכרטיס",
@@ -52,7 +64,12 @@
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "ביטול מחיקת לוח - אחרת הלוח יימחק במהלך ריצת ה־cronjob הבאה.",
"Create new board" : "יצירת לוח חדש",
"New board title" : "כותרת לוח חדשה",
"Select an attachment" : "נא לבחור קובץ מצורף",
"Cancel upload" : "ביטול העלאה",
"by" : "מאת",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "ביטול מחיקת קובץ - אחרת הקובץ יימחק עם ריצת משימת ה־cron הבאה.",
"Undo file deletion" : "ביטול מחיקת קובץ",
"Insert the file into the description" : "הוספת הקובץ לתיאור",
"Modified:" : "מועד השינוי",
"Created:" : "מועד היצירה:",
"Choose a tag" : "נא לבחור תגית",
@@ -65,9 +82,12 @@
"Click to set" : "יש ללחוץ להגדרה",
"Remove due date" : "הסרת מועד התפוגה",
"Description" : "תיאוג",
"Attachments" : "קבצים מצורפים",
"Saved" : "נשמר",
"Unsaved changes" : "שינויים שלא נשמרו",
"Formatting help" : "עזרה בסידור בתבנית",
"Upload attachment" : "העלאת קבצים מצורפים",
"Insert attachment" : "הוספת קובץ מצורף",
"Add a card description…" : "הוספת תיאור כרטיס…",
"Shared boards" : "לוחות משותפים",
"View more" : "הצגת עוד",

View File

@@ -6,14 +6,23 @@ OC.L10N.register(
"Remove user from card" : "Rimuovi utente dalla scheda",
"Hours" : "Ore",
"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.",
"No data was provided to create an attachment." : "Non è stato fornito alcun dato per creare un allegato.",
"Finished" : "Finito",
"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",
@@ -22,7 +31,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Manca una cartella temporanea",
"Could not write file to disk" : "Impossibile scrivere il file su disco",
"A PHP extension stopped the file upload" : "Un'estensione PHP ha fermato il caricamento del file",
"No file uploaded" : "Nessun file caricato",
"No file uploaded or file size exceeds maximum of %s" : "Nessun file caricato o la dimensione del file supera il massimo di %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Uno strumento in stile kanban di gestione progetti e personale per 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 è uno strumenti di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrata con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e mettile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Cindividi cin la tua squadra, amici o famiglia\n- 🚀 Organizza il tuo progetto",
@@ -34,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",
@@ -65,6 +76,7 @@ OC.L10N.register(
"Create new board" : "Crea una nuova lavagna",
"New board title" : "Titolo nuova lavagna",
"Select an attachment" : "Scegli un allegato",
"Cancel upload" : "Annulla caricamento",
"by" : "da",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Annulla eliminazione del file - Altrimenti il file sarà eliminato durante la prossima esecuzione del job di cron.",
"Undo file deletion" : "Annulla l'eliminazione della file",

View File

@@ -4,14 +4,23 @@
"Remove user from card" : "Rimuovi utente dalla scheda",
"Hours" : "Ore",
"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.",
"No data was provided to create an attachment." : "Non è stato fornito alcun dato per creare un allegato.",
"Finished" : "Finito",
"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",
@@ -20,7 +29,7 @@
"Missing a temporary folder" : "Manca una cartella temporanea",
"Could not write file to disk" : "Impossibile scrivere il file su disco",
"A PHP extension stopped the file upload" : "Un'estensione PHP ha fermato il caricamento del file",
"No file uploaded" : "Nessun file caricato",
"No file uploaded or file size exceeds maximum of %s" : "Nessun file caricato o la dimensione del file supera il massimo di %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Uno strumento in stile kanban di gestione progetti e personale per 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 è uno strumenti di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrata con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e mettile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Cindividi cin la tua squadra, amici o famiglia\n- 🚀 Organizza il tuo progetto",
@@ -32,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",
@@ -63,6 +74,7 @@
"Create new board" : "Crea una nuova lavagna",
"New board title" : "Titolo nuova lavagna",
"Select an attachment" : "Scegli un allegato",
"Cancel upload" : "Annulla caricamento",
"by" : "da",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Annulla eliminazione del file - Altrimenti il file sarà eliminato durante la prossima esecuzione del job di cron.",
"Undo file deletion" : "Annulla l'eliminazione della file",

View File

@@ -1,13 +1,26 @@
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",
"Could not write file to disk" : "Nepavyko įrašyti failą į diską",
"A PHP extension stopped the file upload" : "PHP plėtinys sustabdė failo įkėlimą",
"Deck" : "Užduočių saugykla",
"Add a new stack" : "Pridėti naują skiltį",
"Submit" : "Pateikti",
@@ -16,9 +29,11 @@ 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ą",
"Add card" : "Pridėti kortelę",
"Close" : "Užverti",
"Sharing" : "Bendrinimas",
"Tags" : "Žymės",
@@ -29,6 +44,8 @@ OC.L10N.register(
"Edit" : "Taisyti",
"Manage" : "Redaguoti",
"Discard share" : "Atšaukti dalinimąsi",
"Update" : "Atnaujinti",
"Create" : "Sukurti",
"Create a new tag" : "Sukurti naują žymę",
"Status" : "Būsena",
"Title" : "Pavadinimas",
@@ -41,17 +58,25 @@ 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ą",
"Description" : "Aprašas",
"Attachments" : "Priedai",
"Saved" : "Įrašyta",
"Unsaved changes" : "Neįrašyti pakeitimai",
"Formatting help" : "Formatavimo pagalba",
"Upload attachment" : "Įkelti priedą",
"Insert attachment" : "Įterpti priedą",
"Add a card description…" : "Pridėti elemento apibūdinimą...",
"Shared boards" : "Bendrinami sąrašai",
"View more" : "Rodyti daugiau",

View File

@@ -1,11 +1,24 @@
{ "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",
"Could not write file to disk" : "Nepavyko įrašyti failą į diską",
"A PHP extension stopped the file upload" : "PHP plėtinys sustabdė failo įkėlimą",
"Deck" : "Užduočių saugykla",
"Add a new stack" : "Pridėti naują skiltį",
"Submit" : "Pateikti",
@@ -14,9 +27,11 @@
"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ą",
"Add card" : "Pridėti kortelę",
"Close" : "Užverti",
"Sharing" : "Bendrinimas",
"Tags" : "Žymės",
@@ -27,6 +42,8 @@
"Edit" : "Taisyti",
"Manage" : "Redaguoti",
"Discard share" : "Atšaukti dalinimąsi",
"Update" : "Atnaujinti",
"Create" : "Sukurti",
"Create a new tag" : "Sukurti naują žymę",
"Status" : "Būsena",
"Title" : "Pavadinimas",
@@ -39,17 +56,25 @@
"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ą",
"Description" : "Aprašas",
"Attachments" : "Priedai",
"Saved" : "Įrašyta",
"Unsaved changes" : "Neįrašyti pakeitimai",
"Formatting help" : "Formatavimo pagalba",
"Upload attachment" : "Įkelti priedą",
"Insert attachment" : "Įterpti priedą",
"Add a card description…" : "Pridėti elemento apibūdinimą...",
"Shared boards" : "Bendrinami sąrašai",
"View more" : "Rodyti daugiau",

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

@@ -28,7 +28,7 @@ OC.L10N.register(
"Add card" : "Dodaj kartę",
"Close" : "Zamknij",
"Sharing" : "Współdzielenie",
"Tags" : "Tagi",
"Tags" : "Etykiety",
"Select users or groups to share with" : "Wybierz użytkowników lub grupy, żeby współdzielić z nimi",
"Access for" : "Dostęp dla",
"No matching user or group found." : "Nie znaleziono pasujących użytkowników lub grup",
@@ -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

@@ -26,7 +26,7 @@
"Add card" : "Dodaj kartę",
"Close" : "Zamknij",
"Sharing" : "Współdzielenie",
"Tags" : "Tagi",
"Tags" : "Etykiety",
"Select users or groups to share with" : "Wybierz użytkowników lub grupy, żeby współdzielić z nimi",
"Access for" : "Dostęp dla",
"No matching user or group found." : "Nie znaleziono pasujących użytkowników lub grup",
@@ -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

@@ -6,14 +6,23 @@ OC.L10N.register(
"Remove user from card" : "Remover usuário do cartão",
"Hours" : "Horas",
"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ê.",
"No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.",
"Finished" : "Terminado",
"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",
@@ -22,7 +31,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Falta uma pasta temporária",
"Could not write file to disk" : "Não foi possível escrever no disco",
"A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo",
"No file uploaded" : "Nenhum arquivo enviado",
"No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Um projeto no estilo kanban e uma ferramenta de gerenciamento pessoal para 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 é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização do projeto para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Anote notas adicionais no markdown\n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 🚀 Faça seu projeto organizado",
@@ -34,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",
@@ -65,6 +76,7 @@ OC.L10N.register(
"Create new board" : "Criar novo painel",
"New board title" : "Título do novo painel",
"Select an attachment" : "Selecionar um anexo",
"Cancel upload" : "Cancelar envio",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Desfazer exclusão de arquivo - Caso contrário será excluído na próxima execução do cronjob.",
"Undo file deletion" : "Desfazer exclusão de arquivo",

View File

@@ -4,14 +4,23 @@
"Remove user from card" : "Remover usuário do cartão",
"Hours" : "Horas",
"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ê.",
"No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.",
"Finished" : "Terminado",
"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",
@@ -20,7 +29,7 @@
"Missing a temporary folder" : "Falta uma pasta temporária",
"Could not write file to disk" : "Não foi possível escrever no disco",
"A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo",
"No file uploaded" : "Nenhum arquivo enviado",
"No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s",
"Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Um projeto no estilo kanban e uma ferramenta de gerenciamento pessoal para 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 é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização do projeto para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Anote notas adicionais no markdown\n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 🚀 Faça seu projeto organizado",
@@ -32,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",
@@ -63,6 +74,7 @@
"Create new board" : "Criar novo painel",
"New board title" : "Título do novo painel",
"Select an attachment" : "Selecionar um anexo",
"Cancel upload" : "Cancelar envio",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Desfazer exclusão de arquivo - Caso contrário será excluído na próxima execução do cronjob.",
"Undo file deletion" : "Desfazer exclusão de arquivo",

View File

@@ -6,14 +6,23 @@ OC.L10N.register(
"Remove user from card" : "Убрать пользователя из карточки",
"Hours" : "Часы",
"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».",
"No data was provided to create an attachment." : "Никаких данных для создания вложения не было.",
"Finished" : "Завершено",
"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-форме",
@@ -22,7 +31,7 @@ OC.L10N.register(
"Missing a temporary folder" : "Отсутствует временный каталог",
"Could not write file to disk" : "Невозможно записать файл на диск",
"A PHP extension stopped the file upload" : "Расширение PHP прервало загрузку файла",
"No file uploaded" : "Нет загруженных файлов",
"No file uploaded or file size exceeds maximum of %s" : "Файл не загружен или его размер превышает %s",
"Deck" : "Дека",
"A kanban style project and personal management tool for Nextcloud" : "Проект в стиле канбан и личный инструмент управления для 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 - инструмент, предназначенный для личного планирования и организации проекта в стиле канбан для команд , интегрированных в Nextcloud.\n\n\n- 📥 Добавьте свои задачи в карты и разместите их в нужном порядке\n- 📄 Записывайте дополнительные примечания в Markdown-формате\n- 🔖 Назначьте ярлыки для еще лучшей организации\n- 👥 Поделитесь с вашей командой, друзьями или семьей\n- 🚀 Сделайте свой проект более организованным",
@@ -34,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" : "Введите заголовок карточки",
@@ -65,6 +76,7 @@ OC.L10N.register(
"Create new board" : "Создать новую доску",
"New board title" : "Заголовок новой доски",
"Select an attachment" : "Выберите вложение",
"Cancel upload" : "Прервать загрузку",
"by" : "автор",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Отменить удаление файла, иначе он будет автоматически удалена при следующей обработке cronjob.",
"Undo file deletion" : "Отменить удаление файла",

View File

@@ -4,14 +4,23 @@
"Remove user from card" : "Убрать пользователя из карточки",
"Hours" : "Часы",
"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».",
"No data was provided to create an attachment." : "Никаких данных для создания вложения не было.",
"Finished" : "Завершено",
"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-форме",
@@ -20,7 +29,7 @@
"Missing a temporary folder" : "Отсутствует временный каталог",
"Could not write file to disk" : "Невозможно записать файл на диск",
"A PHP extension stopped the file upload" : "Расширение PHP прервало загрузку файла",
"No file uploaded" : "Нет загруженных файлов",
"No file uploaded or file size exceeds maximum of %s" : "Файл не загружен или его размер превышает %s",
"Deck" : "Дека",
"A kanban style project and personal management tool for Nextcloud" : "Проект в стиле канбан и личный инструмент управления для 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 - инструмент, предназначенный для личного планирования и организации проекта в стиле канбан для команд , интегрированных в Nextcloud.\n\n\n- 📥 Добавьте свои задачи в карты и разместите их в нужном порядке\n- 📄 Записывайте дополнительные примечания в Markdown-формате\n- 🔖 Назначьте ярлыки для еще лучшей организации\n- 👥 Поделитесь с вашей командой, друзьями или семьей\n- 🚀 Сделайте свой проект более организованным",
@@ -32,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" : "Введите заголовок карточки",
@@ -63,6 +74,7 @@
"Create new board" : "Создать новую доску",
"New board title" : "Заголовок новой доски",
"Select an attachment" : "Выберите вложение",
"Cancel upload" : "Прервать загрузку",
"by" : "автор",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Отменить удаление файла, иначе он будет автоматически удалена при следующей обработке cronjob.",
"Undo file deletion" : "Отменить удаление файла",

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

@@ -6,14 +6,32 @@ OC.L10N.register(
"Remove user from card" : "Уклони корисника са картице",
"Hours" : "Сати",
"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 са Вама.",
"No data was provided to create an attachment." : "Нису дати подаци за креирање прилога.",
"Finished" : "Завршено",
"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 форми",
"The file was only partially uploaded" : "Фајл је парцијално отпремљен",
"No file was uploaded" : "Ниједан фајл није отпремљен",
"Missing a temporary folder" : "Недостаје привремена фасцикла",
"Could not write file to disk" : "Не могу да пишем на диск",
"A PHP extension stopped the file upload" : "PHP екстензија је зауставила отпремање фајла",
"No file uploaded or file size exceeds maximum of %s" : "Ниједан фајл није отпремљен или величина фајла премашује максимум од %s",
"Deck" : "Шпил",
"A kanban style project and personal management tool for 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 је алатка канбан организационог стила намењена за лично планирање и организацију пројеката за тимове интегрисане са Некстклаудом.\n\n\n- 📥 Додајте Ваше задатке на картице и распоређујте их како желите\n- 📄 Допишите додатне белешке markdown синтаксом\n- 🔖 Додељујте ознаке за још боље организовање\n- 👥 Делите са Вашим тимом, пријатељима или породицом\n- 🚀 Организујте Ваше пројекте",
@@ -24,6 +42,9 @@ OC.L10N.register(
"Board details" : "Детаљи табле",
"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" : "Унесите назив картице",
@@ -54,7 +75,12 @@ OC.L10N.register(
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Врати брисање табле - у супротном ће табла бити обрисана за време следећег крон посла.",
"Create new board" : "Направи нову таблу",
"New board title" : "Назив нове табле",
"Select an attachment" : "Одаберите прилог",
"Cancel upload" : "Откажи отпремање",
"by" : "од",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Поништи брисање фајла - у супротном, фајл ће бити обрисан на следеће покретање крон посла.",
"Undo file deletion" : "Поништи брисање фајла",
"Insert the file into the description" : "Убаци фајл у опис",
"Modified:" : "Измењена:",
"Created:" : "Направљена:",
"Choose a tag" : "Одаберите ознаку",
@@ -67,9 +93,12 @@ OC.L10N.register(
"Click to set" : "Кликните да поставите",
"Remove due date" : "Уклони рок",
"Description" : "Опис",
"Attachments" : "Прилози",
"Saved" : "Сачувано",
"Unsaved changes" : "Несачуване измене",
"Formatting help" : "Помоћ око форматирања",
"Upload attachment" : "Отпреми прилог",
"Insert attachment" : "Убаци прилог",
"Add a card description…" : "Додај опис картице…",
"Shared boards" : "Дељене табле",
"View more" : "Види још",

View File

@@ -4,14 +4,32 @@
"Remove user from card" : "Уклони корисника са картице",
"Hours" : "Сати",
"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 са Вама.",
"No data was provided to create an attachment." : "Нису дати подаци за креирање прилога.",
"Finished" : "Завршено",
"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 форми",
"The file was only partially uploaded" : "Фајл је парцијално отпремљен",
"No file was uploaded" : "Ниједан фајл није отпремљен",
"Missing a temporary folder" : "Недостаје привремена фасцикла",
"Could not write file to disk" : "Не могу да пишем на диск",
"A PHP extension stopped the file upload" : "PHP екстензија је зауставила отпремање фајла",
"No file uploaded or file size exceeds maximum of %s" : "Ниједан фајл није отпремљен или величина фајла премашује максимум од %s",
"Deck" : "Шпил",
"A kanban style project and personal management tool for 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 је алатка канбан организационог стила намењена за лично планирање и организацију пројеката за тимове интегрисане са Некстклаудом.\n\n\n- 📥 Додајте Ваше задатке на картице и распоређујте их како желите\n- 📄 Допишите додатне белешке markdown синтаксом\n- 🔖 Додељујте ознаке за још боље организовање\n- 👥 Делите са Вашим тимом, пријатељима или породицом\n- 🚀 Организујте Ваше пројекте",
@@ -22,6 +40,9 @@
"Board details" : "Детаљи табле",
"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" : "Унесите назив картице",
@@ -52,7 +73,12 @@
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Врати брисање табле - у супротном ће табла бити обрисана за време следећег крон посла.",
"Create new board" : "Направи нову таблу",
"New board title" : "Назив нове табле",
"Select an attachment" : "Одаберите прилог",
"Cancel upload" : "Откажи отпремање",
"by" : "од",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Поништи брисање фајла - у супротном, фајл ће бити обрисан на следеће покретање крон посла.",
"Undo file deletion" : "Поништи брисање фајла",
"Insert the file into the description" : "Убаци фајл у опис",
"Modified:" : "Измењена:",
"Created:" : "Направљена:",
"Choose a tag" : "Одаберите ознаку",
@@ -65,9 +91,12 @@
"Click to set" : "Кликните да поставите",
"Remove due date" : "Уклони рок",
"Description" : "Опис",
"Attachments" : "Прилози",
"Saved" : "Сачувано",
"Unsaved changes" : "Несачуване измене",
"Formatting help" : "Помоћ око форматирања",
"Upload attachment" : "Отпреми прилог",
"Insert attachment" : "Убаци прилог",
"Add a card description…" : "Додај опис картице…",
"Shared boards" : "Дељене табле",
"View more" : "Види још",

View File

@@ -64,9 +64,12 @@ OC.L10N.register(
"Click to set" : "Klicka för att sätta",
"Remove due date" : "Ta bort slutdatum",
"Description" : "Beskrivning",
"Attachments" : "Bilagor",
"Saved" : "Sparad",
"Unsaved changes" : "Osparade ändringar",
"Formatting help" : "Formatteringshjälp",
"Upload attachment" : "Ladda upp bilaga",
"Insert attachment" : "Infoga bilaga",
"Add a card description…" : "Lägg till en kortbeskrivning...",
"Shared boards" : "Delade tavlor",
"View more" : "Titta mer",

View File

@@ -62,9 +62,12 @@
"Click to set" : "Klicka för att sätta",
"Remove due date" : "Ta bort slutdatum",
"Description" : "Beskrivning",
"Attachments" : "Bilagor",
"Saved" : "Sparad",
"Unsaved changes" : "Osparade ändringar",
"Formatting help" : "Formatteringshjälp",
"Upload attachment" : "Ladda upp bilaga",
"Insert attachment" : "Infoga bilaga",
"Add a card description…" : "Lägg till en kortbeskrivning...",
"Shared boards" : "Delade tavlor",
"View more" : "Titta mer",

View File

@@ -6,14 +6,32 @@ OC.L10N.register(
"Remove user from card" : "Kullanıcıyı karttan kaldır",
"Hours" : "Saat",
"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ı.",
"No data was provided to create an attachment." : "Bir ek dosyası oluşturmak için herhangi bir veri sağlanmadı.",
"Finished" : "Tamamlandı",
"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",
"The file was only partially uploaded" : "Dosyanın yalnız bir bölümü yüklendi",
"No file was uploaded" : "Herhangi bir dosya yüklenmedi",
"Missing a temporary folder" : "Geçici bir klasör eksik",
"Could not write file to disk" : "Dosya diske yazılamadı",
"A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi",
"No file uploaded or file size exceeds maximum of %s" : "Herhangi bir dosya yüklenmedi ya da %s olan en büyük dosya boyutu sınırııldı",
"Deck" : "Tahta",
"A kanban style project and personal management tool for Nextcloud" : "Nextcloud için Kanban tarzında bir proje ve kişisel yönetim uygulaması",
"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" : "Deste, Nextcloud ile bütünleştirilmiş takımlar için Kanban tarzında bir kişisel planlama ve proje yönetimi uygulamasıdır.\n\n\n- 📥 Görevleri kartlara ekleyerek sıralayabilirsiniz\n- 📄 Markdown ile biçimlendirilmiş notlar ekleyebilirsiniz\n- 🔖 Daha iyi düzenleme için etiketler atayabilirsiniz\n- 👥 Takımınız, arkadaşlarınız ya da aileniz ile paylaşabilirsiniz\n- 🚀 Projelerinizi düzenli tutarak izleyebilirsiniz",
@@ -24,6 +42,9 @@ OC.L10N.register(
"Board details" : "Pano ayrıntıları",
"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",
@@ -41,7 +62,7 @@ OC.L10N.register(
"Discard share" : "Paylaşımı kaldır",
"Update" : "Güncelle",
"Create" : "Ekle",
"Create a new tag" : "Yeni bir etiket ekle",
"Create a new tag" : "Etiket ekle",
"Status" : "Durum",
"Title" : "Başlık",
"Members" : "Üyeler",
@@ -52,9 +73,14 @@ OC.L10N.register(
"Delete board" : "Panoyu sil",
"Reset" : "Sıfırla",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Pano silme işlemini geri alır. Yoksa pano zamanlanmış görevin bir sonraki çalışmasında silinir.",
"Create new board" : "Yeni pano ekle",
"Create new board" : "Pano ekle",
"New board title" : "Yeni pano başlığı",
"Select an attachment" : "Bir ek dosyası seçin",
"Cancel upload" : "Yüklemeyi iptal et",
"by" : "Kişi:",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dosya silme işlemini geri alır. Yoksa dosya zamanlanmış görevin bir sonraki çalışmasında silinir.",
"Undo file deletion" : "Dosya silmeyi geri al",
"Insert the file into the description" : "Dosyayııklamaya ekle",
"Modified:" : "Değiştirilme:",
"Created:" : "Oluşturulma:",
"Choose a tag" : "Bir etiket seçin",
@@ -67,13 +93,16 @@ OC.L10N.register(
"Click to set" : "Ayarlamak için tıklayın",
"Remove due date" : "Bitiş tarihini kaldır",
"Description" : "Açıklama",
"Attachments" : "Ek dosyalar",
"Saved" : "Kaydedildi",
"Unsaved changes" : "Kaydedilmemiş değişiklikler",
"Formatting help" : "Biçimlendirme yardımı",
"Upload attachment" : "Ek dosya yükle",
"Insert attachment" : "Ek dosya ekle",
"Add a card description…" : "Bir kart açıklaması ekle...",
"Shared boards" : "Paylaşılmış panolar",
"View more" : "Diğerlerini görüntüle",
"Move board to archive" : "Panoyu arşive taşı",
"Create a new board" : "Yeni bir pano ekle"
"Create a new board" : "Pano ekle"
},
"nplurals=2; plural=(n > 1);");

View File

@@ -4,14 +4,32 @@
"Remove user from card" : "Kullanıcıyı karttan kaldır",
"Hours" : "Saat",
"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ı.",
"No data was provided to create an attachment." : "Bir ek dosyası oluşturmak için herhangi bir veri sağlanmadı.",
"Finished" : "Tamamlandı",
"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",
"The file was only partially uploaded" : "Dosyanın yalnız bir bölümü yüklendi",
"No file was uploaded" : "Herhangi bir dosya yüklenmedi",
"Missing a temporary folder" : "Geçici bir klasör eksik",
"Could not write file to disk" : "Dosya diske yazılamadı",
"A PHP extension stopped the file upload" : "Bir PHP eklentisi dosyanın yüklenmesini engelledi",
"No file uploaded or file size exceeds maximum of %s" : "Herhangi bir dosya yüklenmedi ya da %s olan en büyük dosya boyutu sınırııldı",
"Deck" : "Tahta",
"A kanban style project and personal management tool for Nextcloud" : "Nextcloud için Kanban tarzında bir proje ve kişisel yönetim uygulaması",
"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" : "Deste, Nextcloud ile bütünleştirilmiş takımlar için Kanban tarzında bir kişisel planlama ve proje yönetimi uygulamasıdır.\n\n\n- 📥 Görevleri kartlara ekleyerek sıralayabilirsiniz\n- 📄 Markdown ile biçimlendirilmiş notlar ekleyebilirsiniz\n- 🔖 Daha iyi düzenleme için etiketler atayabilirsiniz\n- 👥 Takımınız, arkadaşlarınız ya da aileniz ile paylaşabilirsiniz\n- 🚀 Projelerinizi düzenli tutarak izleyebilirsiniz",
@@ -22,6 +40,9 @@
"Board details" : "Pano ayrıntıları",
"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",
@@ -39,7 +60,7 @@
"Discard share" : "Paylaşımı kaldır",
"Update" : "Güncelle",
"Create" : "Ekle",
"Create a new tag" : "Yeni bir etiket ekle",
"Create a new tag" : "Etiket ekle",
"Status" : "Durum",
"Title" : "Başlık",
"Members" : "Üyeler",
@@ -50,9 +71,14 @@
"Delete board" : "Panoyu sil",
"Reset" : "Sıfırla",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Pano silme işlemini geri alır. Yoksa pano zamanlanmış görevin bir sonraki çalışmasında silinir.",
"Create new board" : "Yeni pano ekle",
"Create new board" : "Pano ekle",
"New board title" : "Yeni pano başlığı",
"Select an attachment" : "Bir ek dosyası seçin",
"Cancel upload" : "Yüklemeyi iptal et",
"by" : "Kişi:",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dosya silme işlemini geri alır. Yoksa dosya zamanlanmış görevin bir sonraki çalışmasında silinir.",
"Undo file deletion" : "Dosya silmeyi geri al",
"Insert the file into the description" : "Dosyayııklamaya ekle",
"Modified:" : "Değiştirilme:",
"Created:" : "Oluşturulma:",
"Choose a tag" : "Bir etiket seçin",
@@ -65,13 +91,16 @@
"Click to set" : "Ayarlamak için tıklayın",
"Remove due date" : "Bitiş tarihini kaldır",
"Description" : "Açıklama",
"Attachments" : "Ek dosyalar",
"Saved" : "Kaydedildi",
"Unsaved changes" : "Kaydedilmemiş değişiklikler",
"Formatting help" : "Biçimlendirme yardımı",
"Upload attachment" : "Ek dosya yükle",
"Insert attachment" : "Ek dosya ekle",
"Add a card description…" : "Bir kart açıklaması ekle...",
"Shared boards" : "Paylaşılmış panolar",
"View more" : "Diğerlerini görüntüle",
"Move board to archive" : "Panoyu arşive taşı",
"Create a new board" : "Yeni bir pano ekle"
"Create a new board" : "Pano ekle"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

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

119
lib/Command/UserExport.php Normal file
View File

@@ -0,0 +1,119 @@
<?php
/**
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @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\Command;
use OCA\Deck\Db\AssignedUsersMapper;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Service\BoardService;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\IGroupManager;
use OCP\IUserManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class UserExport extends Command {
protected $boardService;
protected $cardMapper;
private $userManager;
private $groupManager;
private $assignedUsersMapper;
public function __construct(BoardMapper $boardMapper,
BoardService $boardService,
StackMapper $stackMapper,
CardMapper $cardMapper,
AssignedUsersMapper $assignedUsersMapper,
IUserManager $userManager,
IGroupManager $groupManager) {
parent::__construct();
$this->cardMapper = $cardMapper;
$this->boardService = $boardService;
$this->stackMapper = $stackMapper;
$this->assignedUsersMapper = $assignedUsersMapper;
$this->boardMapper = $boardMapper;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
}
protected function configure() {
$this
->setName('deck:export')
->setDescription('Export a JSON dump of user data')
->addArgument(
'user-id',
InputArgument::REQUIRED,
'User ID of the user'
)
;
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return void
* @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
* @throws \ReflectionException
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$userId = $input->getArgument('user-id');
$groups = $this->groupManager->getUserGroupIds(
$this->userManager->get($userId)
);
$boards = $this->boardService->findAll([
'user' => $userId,
'groups' => $groups
]);
$data = [];
foreach ($boards as $board) {
$fullBoard = $this->boardMapper->find($board->getId(), true, true);
$data[$board->getId()] = (array)$fullBoard->jsonSerialize();
$stacks = $this->stackMapper->findAll($board->getId());
foreach ($stacks as $stack) {
$data[$board->getId()]['stacks'][] = (array)$stack->jsonSerialize();
$cards = $this->cardMapper->findAllByStack($stack->getId());
foreach ($cards as $card) {
$fullCard = $this->cardMapper->find($card->getId());
$assignedUsers = $this->assignedUsersMapper->find($card->getId());
$fullCard->setAssignedUsers($assignedUsers);
$data[$board->getId()]['stacks'][$stack->getId()]['cards'][] = (array)$fullCard->jsonSerialize();
}
}
}
$output->writeln(json_encode($data, JSON_PRETTY_PRINT));
}
}

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,7 +59,13 @@ class PageController extends Controller {
public function index() {
$params = [
'user' => $this->userId,
'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

@@ -32,9 +32,11 @@ use OCA\Deck\Db\CardMapper;
use OCA\Deck\InvalidAttachmentType;
use OCA\Deck\NoPermissionException;
use OCA\Deck\NotFoundException;
use OCA\Deck\StatusException;
use OCP\AppFramework\Http\Response;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IL10N;
class AttachmentService {
@@ -48,6 +50,8 @@ class AttachmentService {
private $application;
/** @var ICache */
private $cache;
/** @var IL10N */
private $l10n;
/**
* AttachmentService constructor.
@@ -58,16 +62,17 @@ class AttachmentService {
* @param Application $application
* @param ICacheFactory $cacheFactory
* @param $userId
* @param IL10N $l10n
* @throws \OCP\AppFramework\QueryException
*/
public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, PermissionService $permissionService, Application $application, ICacheFactory $cacheFactory, $userId) {
public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, PermissionService $permissionService, Application $application, ICacheFactory $cacheFactory, $userId, IL10N $l10n) {
$this->attachmentMapper = $attachmentMapper;
$this->cardMapper = $cardMapper;
$this->permissionService = $permissionService;
$this->userId = $userId;
$this->application = $application;
$this->cache = $cacheFactory->createDistributed('deck-card-attachments-');
$this->l10n = $l10n;
// Register shipped attachment services
// TODO: move this to a plugin based approach once we have different types of attachments
@@ -145,6 +150,9 @@ class AttachmentService {
} catch (InvalidAttachmentType $e) {
// just store the data
}
if ($attachment->getData() === null) {
throw new StatusException($this->l10n->t('No data was provided to create an attachment.'));
}
$attachment = $this->attachmentMapper->insert($attachment);
// extend data so the frontend can use it properly after creating

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

@@ -25,14 +25,20 @@ namespace OCA\Deck\Service;
use OC\Security\CSP\ContentSecurityPolicyManager;
use OCA\Deck\Db\Attachment;
use OCA\Deck\StatusException;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\EmptyContentSecurityPolicy;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\StreamResponse;
use OCP\Files\Cache\IScanner;
use OCP\Files\Folder;
use OCP\Files\IAppData;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IRequest;
@@ -43,17 +49,23 @@ class FileService implements IAttachmentService {
private $appData;
private $request;
private $logger;
private $rootFolder;
private $config;
public function __construct(
IL10N $l10n,
IAppData $appData,
IRequest $request,
ILogger $logger
ILogger $logger,
IRootFolder $rootFolder,
IConfig $config
) {
$this->l10n = $l10n;
$this->appData = $appData;
$this->request = $request;
$this->logger = $logger;
$this->rootFolder = $rootFolder;
$this->config = $config;
}
/**
@@ -100,6 +112,10 @@ class FileService implements IAttachmentService {
return $attachment;
}
/**
* @return array
* @throws StatusException
*/
private function getUploadedFile () {
$file = $this->request->getUploadedFile('file');
$error = null;
@@ -115,13 +131,13 @@ class FileService implements IAttachmentService {
];
if (empty($file)) {
$error = $this->l10n->t('No file uploaded');
$error = $this->l10n->t('No file uploaded or file size exceeds maximum of %s', [\OCP\Util::humanFileSize(\OCP\Util::uploadLimit())]);
}
if (!empty($file) && array_key_exists('error', $file) && $file['error'] !== UPLOAD_ERR_OK) {
$error = $phpFileUploadErrors[$file['error']];
}
if ($error !== null) {
throw new \Exception($error);
throw new StatusException($error);
}
return $file;
}
@@ -131,16 +147,21 @@ class FileService implements IAttachmentService {
$folder = $this->getFolder($attachment);
$fileName = $file['name'];
if ($folder->fileExists($fileName)) {
throw new \Exception('File already exists.');
throw new StatusException('File already exists.');
}
$target = $folder->newFile($fileName);
$target->putContent(file_get_contents($file['tmp_name'], 'r'));
$content = fopen($file['tmp_name'], 'rb');
$target->putContent($content);
fclose($content);
$attachment->setData($fileName);
}
/**
* This method requires to be used with POST so we can properly get the form data
*
* @throws \Exception
*/
public function update(Attachment $attachment) {
$file = $this->getUploadedFile();
@@ -148,7 +169,9 @@ class FileService implements IAttachmentService {
$attachment->setData($fileName);
$target = $this->getFileForAttachment($attachment);
$target->putContent(file_get_contents($file['tmp_name'], 'r'));
$content = fopen($file['tmp_name'], 'rb');
$target->putContent($content);
fclose($content);
$attachment->setLastModified(time());
}
@@ -161,9 +184,32 @@ class FileService implements IAttachmentService {
}
}
/**
* Workaround until ISimpleFile can be fetched as a resource
*
* @throws \Exception
*/
private function getFileFromRootFolder(Attachment $attachment) {
$folderName = 'file-card-' . (int)$attachment->getCardId();
$instanceId = $this->config->getSystemValue('instanceid', null);
if ($instanceId === null) {
throw new \Exception('no instance id!');
}
$name = 'appdata_' . $instanceId;
$appDataFolder = $this->rootFolder->get($name);
$appDataFolder = $appDataFolder->get('deck');
$cardFolder = $appDataFolder->get($folderName);
return $cardFolder->get($attachment->getData());
}
public function display(Attachment $attachment) {
$file = $this->getFileForAttachment($attachment);
$response = new FileDisplayResponse($file);
$file = $this->getFileFromRootFolder($attachment);
if (method_exists($file, 'fopen')) {
$response = new StreamResponse($file->fopen('r'));
$response->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
} else {
$response = new FileDisplayResponse($file);
}
if ($file->getMimeType() === 'application/pdf') {
// We need those since otherwise chrome won't show the PDF file with CSP rule object-src 'none'
// https://bugs.chromium.org/p/chromium/issues/detail?id=271452

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

@@ -86,7 +86,7 @@
</div>
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in defaultColors" ng-style="{'background-color':'#{{ c }}'}" ng-click="label=setColor(label,c);" ng-class="{'selected': (c == label.color) }"><br /></div>
<label class="colorselect-label color" ng-style="getCustomBackground(label.hashedColor)" ng-init="label.hashedColor='#' + label.color">
<label class="colorselect-label{{ label.color | iconWhiteFilter }} color" ng-style="getCustomBackground(label.hashedColor)" ng-init="label.hashedColor='#' + label.color">
<input class="color" type="color" ng-model="label.hashedColor" value="#{{label.color}}" ng-change="label=setHashedColor(label)"/>
</label>
</div>
@@ -104,7 +104,7 @@
</div>
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in defaultColors" ng-style="{'background-color':'#{{ c }}'}" ng-click="newLabel=setColor(newLabel,c)" ng-class="{'selected': (c == newLabel.color), 'dark': (newBoard.color | textColorFilter) === '#ffffff' }"><br /></div>
<label class="colorselect-label color" ng-style="getCustomBackground(newLabel.hashedColor)" ng-init="newLabel.hashedColor='#' + newLabel.color">
<label class="colorselect-label{{ newLabel.color | iconWhiteFilter }} color" ng-style="getCustomBackground(newLabel.hashedColor)" ng-init="newLabel.hashedColor='#' + newLabel.color">
<input class="color" type="color" ng-model="newLabel.hashedColor" value="#{{newLabel.color}}" ng-change="newLabel=setHashedColor(newLabel)"/>
</label>
</div>

View File

@@ -35,7 +35,7 @@
<input class="edit ng-valid ng-empty" type="text" autofocus-on-insert ng-model="b.title" maxlength="100" ng-model-options="{ debounce: 250 }">
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in ::colors" ng-style="{'background-color':'#{{ c }}'}" ng-click="b=setColor(b,c)" ng-class="{'selected': (c == b.color) }"></div>
<label class="colorselect-label color" ng-style="getCustomBackground(b.hashedColor)" ng-init="b.hashedColor='#' + b.color">
<label class="colorselect-label{{ b.color | iconWhiteFilter }} color" ng-style="getCustomBackground(b.hashedColor)" ng-init="b.hashedColor='#' + b.color">
<input class="color" type="color" ng-model="b.hashedColor" value="#{{b.color}}" ng-change="b=setHashedColor(b)"/>
</label>
</div>
@@ -107,7 +107,7 @@
autofocus-on-insert ng-model="newBoard.title" maxlength="100" ng-model-options="{ debounce: 250 }">
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in ::colors" ng-style="{'background-color':'#{{ c }}'}" ng-click="selectColor(c);b=setColor(b,c);"ng-class="{'selected': (c == newBoard.color), 'dark': (newBoard.color | textColorFilter) === '#ffffff' }"></div>
<label class="colorselect-label color" ng-style="getCustomBackground(newBoard.hashedColor)" ng-init="newBoard.hashedColor='#' + newBoard.color">
<label class="colorselect-label{{ newBoard.color | iconWhiteFilter }} color" ng-style="getCustomBackground(newBoard.hashedColor)" ng-init="newBoard.hashedColor='#' + newBoard.color">
<input class="color" type="color" ng-model="newBoard.hashedColor" value="#{{newBoard.color}}" ng-change="newBoard=setHashedColor(newBoard)"/>
</label>
</div>

View File

@@ -2,6 +2,19 @@
<div class="attachment-list" ng-class="{selector: $ctrl.isFileSelector}">
<h3 class="attachment-selector" ng-if="$ctrl.isFileSelector"><?php p($l->t('Select an attachment')); ?> <a class="icon-close" ng-click="$ctrl.abort()"></a></h3>
<ul>
<li class="attachment"
ng-repeat="attachment in $ctrl.fileservice.getProgressItemsForCard($ctrl.cardservice.getCurrent().id)">
<a class="fileicon icon-file"></a>
<div class="details">
<div class="filename">
<span class="basename">{{ attachment.file.name }}</span>
</div>
<progress ng-attr-value="{{ attachment.progress }}" max="100"></progress>
</div>
<button class="icon icon-close button-inline" ng-click="attachment.cancel()">
<span class="hidden-visually"><?php p($l->t('Cancel upload')); ?></span>
</button>
</li>
<li class="attachment"
ng-repeat="attachment in $ctrl.cardservice.getCurrent().attachments | filter: {type: 'deck_file'} | orderBy: ['deletedAt', '-lastModified']"
ng-class="{deleted: attachment.deletedAt > 0, selector: $ctrl.isFileSelector}"

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,13 +97,14 @@
<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>
</div>
<div class="section-content card-attachments">
<div class="error icon-error" ng-if="fileservice.status"><strong>{{ fileservice.status.error }}</strong><br />{{ fileservice.status.message }}</div>
<attachment-list-component ng-if="params.tab === 1 && cardservice.getCurrent() && isArray(cardservice.getCurrent().attachments)" attachments="cardservice.getCurrent().attachments"></attachment-list-component>
</div>

View File

@@ -40,7 +40,7 @@
</form>
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in ::colors" ng-style="{'background-color':'#{{ c }}'}" ng-click="b=setColor(b,c)" ng-class="{'selected': (c == b.color) }"></div>
<label class="colorselect-label color" ng-style="getCustomBackground(b.hashedColor)" ng-init="b.hashedColor='#' + b.color">
<label class="colorselect-label{{ b.color | iconWhiteFilter }} color" ng-style="getCustomBackground(b.hashedColor)" ng-init="b.hashedColor='#' + b.color">
<input class="color" type="color" ng-model="b.hashedColor" value="#{{b.color}}" ng-change="b=setHashedColor(b)"/>
</label>
</div>
@@ -58,7 +58,7 @@
</form>
<div class="colorselect" ng-controller="ColorPickerController">
<div class="color" ng-repeat="c in ::colors" ng-style="{'background-color':'#{{ c }}'}" ng-click="selectColor(c);newBoard=setColor(newBoard,c)" ng-class="{'selected': (c == newBoard.color), 'dark': (newBoard.color | textColorFilter) === '#ffffff' }"><br /></div>
<label class="colorselect-label color" ng-style="getCustomBackground(newBoard.hashedColor)" ng-init="newBoard.hashedColor='#' + newBoard.color">
<label class="colorselect-label{{ newBoard.color | iconWhiteFilter }} color" ng-style="getCustomBackground(newBoard.hashedColor)" ng-init="newBoard.hashedColor='#' + newBoard.color">
<input class="color" type="color" ng-model="newBoard.hashedColor" value="#{{newBoard.color}}" ng-change="newBoard=setHashedColor(newBoard)"/>
</label>
</div>

View File

@@ -0,0 +1,141 @@
<?php
/**
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @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\Command;
use OCA\Deck\Db\AssignedUsersMapper;
use OCA\Deck\Db\Attachment;
use OCA\Deck\Db\AttachmentMapper;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\InvalidAttachmentType;
use OCA\Deck\Service\AttachmentService;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\IAttachmentService;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserManager;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class UserExportTest extends \Test\TestCase {
protected $boardMapper;
protected $boardService;
protected $stackMapper;
protected $cardMapper;
protected $assignedUserMapper;
protected $userManager;
protected $groupManager;
private $userExport;
public function setUp() {
parent::setUp();
$this->boardMapper = $this->createMock(BoardMapper::class);
$this->boardService= $this->createMock(BoardService::class);
$this->stackMapper= $this->createMock(StackMapper::class);
$this->cardMapper= $this->createMock(CardMapper::class);
$this->assignedUserMapper= $this->createMock(AssignedUsersMapper::class);
$this->userManager = $this->createMock(IUserManager::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->userExport = new UserExport($this->boardMapper, $this->boardService, $this->stackMapper, $this->cardMapper, $this->assignedUserMapper, $this->userManager, $this->groupManager);
}
public function getBoard($id) {
$board = new Board();
$board->setId($id);
$board->setTitle('Board ' . $id);
return $board;
}
public function getStack($id) {
$stack = new Stack();
$stack->setId($id);
$stack->setTitle('Stack ' . $id);
return $stack;
}
public function getCard($id) {
$card = new Card();
$card->setId($id);
$card->setTitle('Card ' . $id);
return $card;
}
public function testExecute() {
$input = $this->createMock(InputInterface::class);
$input->expects($this->once())->method('getArgument')->with('user-id')->willReturn('admin');
$output = $this->createMock(OutputInterface::class);
$user = $this->createMock(IUser::class);
$this->userManager->expects($this->once())
->method('get')
->with('admin')
->willReturn($user);
$groups = [];
$this->groupManager->expects($this->once())
->method('getUserGroupIds')
->with($user)
->willReturn($groups);
$boards = [
$this->getBoard(1),
$this->getBoard(2),
];
$this->boardService->expects($this->once())
->method('findAll')
->with([
'user' => 'admin',
'groups' => $groups
])
->willReturn($boards);
$this->boardMapper->expects($this->exactly(count($boards)))
->method('find')
->willReturn($boards[0]);
$stacks = [
$this->getStack(1),
$this->getStack(2)
];
$this->stackMapper->expects($this->exactly(count($boards)))
->method('findAll')
->willReturn($stacks);
$cards = [
$this->getCard(1),
$this->getCard(2),
$this->getCard(3),
];
$this->cardMapper->expects($this->exactly(count($boards)*count($stacks)))
->method('findAllByStack')
->willReturn($cards);
$this->cardMapper->expects($this->exactly(count($boards)*count($stacks)*count($cards)))
->method('find')
->willReturn($cards[0]);
$this->assignedUserMapper->expects($this->exactly(count($boards)*count($stacks)*count($cards)))
->method('find')
->willReturn([]);
$result = $this->invokePrivate($this->userExport, 'execute', [$input, $output]);
}
}

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

@@ -34,6 +34,7 @@ use OCP\AppFramework\Http\Response;
use OCP\AppFramework\IAppContainer;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IL10N;
use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
@@ -67,6 +68,8 @@ class AttachmentServiceTest extends TestCase {
private $appContainer;
/** ICache */
private $cache;
/** @var IL10N */
private $l10n;
/**
* @throws \OCP\AppFramework\QueryException
@@ -91,7 +94,9 @@ class AttachmentServiceTest extends TestCase {
->method('getContainer')
->willReturn($this->appContainer);
$this->attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $this->application, $this->cacheFactory, $this->userId);
$this->l10n = $this->createMock(IL10N::class);
$this->attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $this->application, $this->cacheFactory, $this->userId, $this->l10n);
}
public function testRegisterAttachmentService() {
@@ -103,7 +108,7 @@ class AttachmentServiceTest extends TestCase {
$application->expects($this->any())
->method('getContainer')
->willReturn($appContainer);
$attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $application, $this->cacheFactory, $this->userId);
$attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $application, $this->cacheFactory, $this->userId, $this->l10n);
$attachmentService->registerAttachmentService('custom', MyAttachmentService::class);
$this->assertEquals($fileServiceMock, $attachmentService->getService('deck_file'));
$this->assertEquals(MyAttachmentService::class, get_class($attachmentService->getService('custom')));
@@ -121,7 +126,7 @@ class AttachmentServiceTest extends TestCase {
$application->expects($this->any())
->method('getContainer')
->willReturn($appContainer);
$attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $application, $this->cacheFactory, $this->userId);
$attachmentService = new AttachmentService($this->attachmentMapper, $this->cardMapper, $this->permissionService, $application, $this->cacheFactory, $this->userId, $this->l10n);
$attachmentService->registerAttachmentService('custom', MyAttachmentService::class);
$attachmentService->getService('deck_file_invalid');
}

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

@@ -38,11 +38,15 @@ use OCA\Deck\StatusException;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\StreamResponse;
use OCP\AppFramework\IAppContainer;
use OCP\Files\Folder;
use OCP\Files\IAppData;
use OCP\Files\IRootFolder;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IRequest;
@@ -61,6 +65,10 @@ class FileServiceTest extends TestCase {
private $logger;
/** @var FileService */
private $fileService;
/** @var IRootFolder */
private $rootFolder;
/** @var IConfig */
private $config;
public function setUp() {
parent::setUp();
@@ -68,7 +76,9 @@ class FileServiceTest extends TestCase {
$this->appData = $this->createMock(IAppData::class);
$this->l10n = $this->createMock(IL10N::class);
$this->logger = $this->createMock(ILogger::class);
$this->fileService = new FileService($this->l10n, $this->appData, $this->request, $this->logger);
$this->rootFolder = $this->createMock(IRootFolder::class);
$this->config = $this->createMock(IConfig::class);
$this->fileService = new FileService($this->l10n, $this->appData, $this->request, $this->logger, $this->rootFolder, $this->config);
}
public function mockGetFolder($cardId) {
@@ -184,8 +194,8 @@ class FileServiceTest extends TestCase {
->willReturn(false);
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->once())
->method('putContent')
->with(file_get_contents(__FILE__, 'r'));
->method('putContent');
// FIXME: test fopen call properly
$folder->expects($this->once())
->method('newFile')
->willReturn($file);
@@ -202,8 +212,8 @@ class FileServiceTest extends TestCase {
->willReturn(false);
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->once())
->method('putContent')
->with(file_get_contents(__FILE__, 'r'));
->method('putContent');
// FIXME: test fopen call properly
$folder->expects($this->once())
->method('newFile')
->willReturn($file);
@@ -231,8 +241,8 @@ class FileServiceTest extends TestCase {
$folder = $this->mockGetFolder(123);
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->once())
->method('putContent')
->with(file_get_contents(__FILE__, 'r'));
->method('putContent');
// FIXME: test fopen call properly
$folder->expects($this->once())
->method('getFile')
->willReturn($file);
@@ -253,33 +263,60 @@ class FileServiceTest extends TestCase {
}
public function testDisplay() {
$this->config->expects($this->once())
->method('getSystemValue')
->willReturn('123');
$appDataFolder = $this->createMock(Folder::class);
$deckAppDataFolder = $this->createMock(Folder::class);
$cardFolder = $this->createMock(Folder::class);
$this->rootFolder->expects($this->once())->method('get')->willReturn($appDataFolder);
$appDataFolder->expects($this->once())->method('get')->willReturn($deckAppDataFolder);
$deckAppDataFolder->expects($this->once())->method('get')->willReturn($cardFolder);
$attachment = $this->getAttachment();
$file = $this->createMock(ISimpleFile::class);
$folder = $this->mockGetFolder('123');
$folder->expects($this->once())
->method('getFile')
->willReturn($file);
$file->expects($this->exactly(2))
$file = $this->createMock(\OCP\Files\File::class);
$cardFolder->expects($this->once())->method('get')->willReturn($file);
$file->expects($this->any())
->method('getMimeType')
->willReturn('image/jpeg');
$file->expects($this->any())
->method('getName')
->willReturn('file1');
$file->expects($this->any())
->method('fopen')
->willReturn('fileresource');
$actual = $this->fileService->display($attachment);
$expected = new FileDisplayResponse($file);
$expected = new StreamResponse('fileresource');
$expected->addHeader('Content-Type', 'image/jpeg');
$expected->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
$this->assertEquals($expected, $actual);
}
public function testDisplayPdf() {
$this->config->expects($this->once())
->method('getSystemValue')
->willReturn('123');
$appDataFolder = $this->createMock(Folder::class);
$deckAppDataFolder = $this->createMock(Folder::class);
$cardFolder = $this->createMock(Folder::class);
$this->rootFolder->expects($this->once())->method('get')->willReturn($appDataFolder);
$appDataFolder->expects($this->once())->method('get')->willReturn($deckAppDataFolder);
$deckAppDataFolder->expects($this->once())->method('get')->willReturn($cardFolder);
$attachment = $this->getAttachment();
$file = $this->createMock(ISimpleFile::class);
$folder = $this->mockGetFolder('123');
$folder->expects($this->once())
->method('getFile')
->willReturn($file);
$file->expects($this->exactly(2))
$file = $this->createMock(\OCP\Files\File::class);
$cardFolder->expects($this->once())->method('get')->willReturn($file);
$file->expects($this->any())
->method('getMimeType')
->willReturn('application/pdf');
$file->expects($this->any())
->method('getName')
->willReturn('file1');
$file->expects($this->any())
->method('fopen')
->willReturn('fileresource');
$actual = $this->fileService->display($attachment);
$expected = new FileDisplayResponse($file);
$expected = new StreamResponse('fileresource');
$expected->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
$expected->addHeader('Content-Type', 'application/pdf');
$policy = new ContentSecurityPolicy();
$policy->addAllowedObjectDomain('\'self\'');

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