Compare commits

...

988 Commits

Author SHA1 Message Date
Julius Härtl
16c7e409d7 Fix event message
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-15 09:55:18 +01:00
Julius Härtl
6064fe71a0 Bump version to 0.5.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-15 09:29:47 +01:00
Nextcloud bot
360f01a07b [tx-robot] updated from transifex 2018-11-15 01:18:44 +00:00
Nextcloud bot
3db56ca93e [tx-robot] updated from transifex 2018-11-13 01:20:17 +00:00
Julius Härtl
c69fc9ec77 Merge pull request #690 from cloud2018/unify-title-icons-more
Papercut: unifiy title icon-more
2018-11-12 14:31:06 +01:00
Julius Härtl
87b56ec111 Bump version to 0.5.0-rc2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-12 14:09:11 +01:00
Julius Härtl
74abc499d8 Merge pull request #693 from nextcloud/dependabot/npm_and_yarn/js/@babel/preset-env-7.1.5
Bump @babel/preset-env from 7.1.0 to 7.1.5 in /js
2018-11-12 14:07:58 +01:00
Julius Härtl
7c04602cc7 Merge pull request #694 from nextcloud/dependabot/npm_and_yarn/js/@babel/core-7.1.5
Bump @babel/core from 7.1.2 to 7.1.5 in /js
2018-11-12 14:07:45 +01:00
Julius Härtl
daed799fa7 Merge pull request #697 from nextcloud/bugfix/noid/noitification-length
Fix issue with comments longer than 64 chars
2018-11-12 13:26:18 +01:00
Julius Härtl
65e192efc3 Merge pull request #695 from nextcloud/bugfix/noid/tabdetails
Fix tab details alignment
2018-11-12 12:56:29 +01:00
Julius Härtl
e1c700878a Fix issue with comments longer than 64 chars
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-12 12:55:11 +01:00
Julius Härtl
81a0c62308 Fix tab details alignment
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-12 10:35:37 +01:00
Nextcloud bot
470538ac91 [tx-robot] updated from transifex 2018-11-12 01:19:13 +00:00
dependabot[bot]
c6e7d621f0 Bump @babel/core from 7.1.2 to 7.1.5 in /js
Bumps [@babel/core](https://github.com/babel/babel) from 7.1.2 to 7.1.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.1.2...v7.1.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-11 20:18:46 +00:00
dependabot[bot]
99ca1ecf8c Bump @babel/preset-env from 7.1.0 to 7.1.5 in /js
Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.1.0 to 7.1.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.1.0...v7.1.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-11 20:18:17 +00:00
Nextcloud bot
4a0398923f [tx-robot] updated from transifex 2018-11-11 01:19:53 +00:00
cloud2018
c7816b5a1f Papercut: unifiy title icon-more
Signed-off-by: Markus Eckstein eckstein-markus@gmx.de
2018-11-10 12:06:00 +01:00
Julius Härtl
6c5f09e1f9 Merge pull request #686 from nextcloud/release/0.5.0-rc1
Release 0.5.0-rc1
2018-11-10 11:16:02 +01:00
Julius Härtl
4aea8817df Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 11:11:03 +01:00
Julius Härtl
b4929e1b45 Conditional loading for activity templates
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 11:09:20 +01:00
Julius Härtl
a56907862c Fix loading and activity warning
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 11:04:15 +01:00
Julius Härtl
24db3fbdc9 Add dependencies to info.xml
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 10:54:05 +01:00
Julius Härtl
9cf30dc77b Merge pull request #681 from nextcloud/design-fixes
Design fixes
2018-11-10 10:49:08 +01:00
Julius Härtl
b42c80b464 Fix assign user click target
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 10:43:12 +01:00
Julius Härtl
8dd310cee2 Fix datepicker on 13
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 10:42:32 +01:00
Julius Härtl
4d1e6100db Bump version to 0.5.0-rc1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-10 09:56:16 +01:00
Nextcloud bot
dc5eb9e815 [tx-robot] updated from transifex 2018-11-10 01:19:05 +00:00
Julius Härtl
e1b5efcd79 Fix card highlight state
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 17:29:08 +01:00
Julius Härtl
644c64aa4b Fix diff of large descriptions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 17:21:36 +01:00
Julius Härtl
3c706c8009 Fix eslint
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 17:00:41 +01:00
Julius Härtl
7234050447 Set min height for markdown area (fixes #655)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:52:39 +01:00
Julius Härtl
6a7ceee75f Fix table rendering in markdown (fixes #363)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:47:41 +01:00
Julius Härtl
7d64784dc4 Fix tab headers on 15
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:43:19 +01:00
Julius Härtl
21b7f08e18 Move activity template overriding to the constructor
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:43:19 +01:00
Julius Härtl
47fc2eb20d Fix css variable usage on Nextcloud 13
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:43:19 +01:00
Julius Härtl
fc5cabedd0 Fix design issues on 15
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:43:19 +01:00
Julius Härtl
b60abba6e4 Clear deleted stack/card list after switch (fixes #683)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:42:04 +01:00
Julius Härtl
5371a02653 Merge pull request #680 from nextcloud/bugfix/noid/activity-plain-subject
Replace subject parameters in plain subject string as well
2018-11-09 16:03:46 +01:00
Julius Härtl
a6da1ded25 13: force app sidebar on top (fixes #575)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 16:01:45 +01:00
Julius Härtl
4e5f4df29a Properly trigger checkbox toggle on label click only
fixes #577

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 15:49:06 +01:00
Julius Härtl
2b74da9d30 Replace subject parameters in plain subject string as well
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 15:36:18 +01:00
Julius Härtl
924d4bd01f Merge pull request #642 from nextcloud/bugfix/noid/checkboxes
Checkbox fixes
2018-11-09 14:45:04 +01:00
Julius Härtl
a8173b045d Merge pull request #682 from nextcloud/bugfix/621
Only call fclose if resource is still available
2018-11-09 12:40:07 +01:00
Julius Härtl
71e6ff1b79 Make checkbox id order ascending (fixes #678)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 12:39:12 +01:00
Julius Härtl
2bd77fd2ce Fix checkbox matching
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-09 12:38:50 +01:00
Julius Härtl
aee5fb7a98 Only call fclose if resource is still available
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-08 18:55:48 +01:00
Julius Härtl
733f17d59a Merge pull request #675 from nextcloud/activity-15
Fix activity view on 15
2018-11-08 18:32:12 +01:00
Julius Härtl
785bc08d7f Fix activity view on 15
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:55:17 +01:00
Julius Härtl
7cb5045dff Update README.md 2018-11-06 19:53:53 +01:00
Julius Härtl
2b0954951d Merge pull request #676 from nextcloud/fix-duplicate-register
Do not call register for comment entities twice
2018-11-06 19:45:42 +01:00
Julius Härtl
ad1e0c91ec Merge pull request #677 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.25.1
Bump webpack from 4.24.0 to 4.25.1 in /js
2018-11-06 19:44:55 +01:00
Julius Härtl
9cf30bf5fd Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:44:29 +01:00
Julius Härtl
a22c152bd7 Merge pull request #648 from nextcloud/documentation
Documentation
2018-11-06 19:43:17 +01:00
Julius Härtl
ec1faad4ab Add note about bad request response
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:41:44 +01:00
Julius Härtl
35991b7448 Add data examples to the docs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:39:09 +01:00
Julius Härtl
89cb797250 More api docs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:55 +01:00
Julius Härtl
26ab4a950d Add database structure docs
thanks to @desperateCoder for drawing an er diagram

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:55 +01:00
Julius Härtl
31273a31b7 Fix typo
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:55 +01:00
Julius Härtl
c83952ad00 Use config for old mkdocs version of readthedocs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:54 +01:00
Julius Härtl
31cf89d874 Restructure docs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:54 +01:00
Julius Härtl
b494e9e1b0 Change level of api docs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:54 +01:00
Julius Härtl
fdd248b7d5 Add documentation with list of API endpoints
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-06 19:08:52 +01:00
dependabot[bot]
580bff4643 Bump webpack from 4.24.0 to 4.25.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.24.0 to 4.25.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.24.0...v4.25.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-06 16:49:27 +00:00
Nextcloud bot
f1c19023e8 [tx-robot] updated from transifex 2018-11-06 01:19:26 +00:00
Julius Härtl
927b96219c Merge pull request #665 from nextcloud/enhancement/659
Implement modification changes for REST API
2018-11-05 15:07:35 +01:00
Julius Härtl
2673bada6a Update stack lastModified as well
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-05 14:56:36 +01:00
Julius Härtl
a026ebf094 Add change database helper
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-05 14:53:01 +01:00
Julius Härtl
d830c5006c 0.5 will support 15 as well
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-05 14:36:17 +01:00
Julius Härtl
d74138837e Do not call register for comment entities twice
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-05 14:33:44 +01:00
Julius Härtl
413875b697 Merge pull request #673 from nextcloud/dependabot/npm_and_yarn/js/node-sass-4.10.0
Bump node-sass from 4.9.4 to 4.10.0 in /js
2018-11-05 13:45:31 +01:00
Julius Härtl
a068d6e1c6 Add last_modified to board/stack database and add check on index methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-11-05 13:23:26 +01:00
dependabot[bot]
25f543d3ad Bump node-sass from 4.9.4 to 4.10.0 in /js
Bumps [node-sass](https://github.com/sass/node-sass) from 4.9.4 to 4.10.0.
- [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.4...v4.10.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-05 12:19:25 +00:00
Julius Härtl
38bc02c07e Merge pull request #672 from nextcloud/dependabot/npm_and_yarn/js/css-loader-1.0.1
Bump css-loader from 1.0.0 to 1.0.1 in /js
2018-11-05 13:17:42 +01:00
Julius Härtl
2921a07f29 Merge pull request #671 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.24.0
Bump webpack from 4.23.1 to 4.24.0 in /js
2018-11-05 13:17:30 +01:00
dependabot[bot]
0c8e6d0e60 Bump css-loader from 1.0.0 to 1.0.1 in /js
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 1.0.0 to 1.0.1.
- [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/v1.0.0...v1.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-05 01:22:07 +00:00
dependabot[bot]
ac7fda0e5a Bump webpack from 4.23.1 to 4.24.0 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.23.1 to 4.24.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.23.1...v4.24.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-11-05 01:21:01 +00:00
Nextcloud bot
e66aa2e988 [tx-robot] updated from transifex 2018-11-05 01:19:10 +00:00
Nextcloud bot
aa0fa5a18d [tx-robot] updated from transifex 2018-11-04 01:21:08 +00:00
Nextcloud bot
68976883cc [tx-robot] updated from transifex 2018-11-02 01:20:30 +00:00
Julius Härtl
d7bc382331 Merge pull request #667 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.23.1
Bump webpack from 4.22.0 to 4.23.1 in /js
2018-10-29 12:40:19 +01:00
Julius Härtl
b38ef8fab0 Merge pull request #666 from nextcloud/dependabot/npm_and_yarn/js/karma-3.1.1
Bump karma from 3.1.0 to 3.1.1 in /js
2018-10-29 12:40:10 +01:00
dependabot[bot]
bdca96c460 Bump webpack from 4.22.0 to 4.23.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.22.0 to 4.23.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.22.0...v4.23.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-29 01:16:17 +00:00
dependabot[bot]
8dd2d88ff2 Bump karma from 3.1.0 to 3.1.1 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 3.1.0 to 3.1.1.
- [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/v3.1.0...v3.1.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-29 01:15:31 +00:00
Nextcloud bot
280d97c40c [tx-robot] updated from transifex 2018-10-27 00:19:07 +00:00
Nextcloud bot
771e8e7db3 [tx-robot] updated from transifex 2018-10-26 00:19:28 +00:00
Julius Härtl
ef4235bbdc Merge pull request #651 from nextcloud/bugfix/csp
Fix webpack build with new CSP on 15
2018-10-25 16:05:31 +02:00
Julius Härtl
513147c18a Merge pull request #643 from nextcloud/bugfix/noid/style-accessibility
General styling and accessibility fixes
2018-10-25 14:44:04 +02:00
Julius Härtl
65c263c7d8 Merge pull request #656 from cloud2018/consistent-pop-up
consistent-pop-up
2018-10-25 14:20:46 +02:00
Julius Härtl
32726af9c6 Fix icon inversion
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-25 14:17:10 +02:00
Julius Härtl
b72dca6536 General styling and accessibility fixes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-25 14:00:07 +02:00
Julius Härtl
0a52cdfe6b Fix webpack build with new CSP on 15
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-25 13:38:00 +02:00
Nextcloud bot
bdace3159f [tx-robot] updated from transifex 2018-10-24 00:19:17 +00:00
Julius Härtl
cd69c2fd71 Merge pull request #641 from nextcloud/design/noid/simplify
General design improvements
2018-10-23 09:29:49 +02:00
Julius Härtl
658ab485aa Merge pull request #658 from nextcloud/dependabot/npm_and_yarn/js/node-sass-4.9.4
Bump node-sass from 4.9.3 to 4.9.4 in /js
2018-10-23 09:29:11 +02:00
Julius Härtl
0632551c65 Merge pull request #661 from nextcloud/dependabot/npm_and_yarn/js/karma-3.1.0
Bump karma from 3.0.0 to 3.1.0 in /js
2018-10-23 09:28:12 +02:00
Nextcloud bot
5b385822dc [tx-robot] updated from transifex 2018-10-23 00:13:03 +00:00
dependabot[bot]
5aefdd2302 Bump node-sass from 4.9.3 to 4.9.4 in /js
Bumps [node-sass](https://github.com/sass/node-sass) from 4.9.3 to 4.9.4.
- [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.3...v4.9.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-22 21:14:53 +00:00
dependabot[bot]
b691b1a382 Bump karma from 3.0.0 to 3.1.0 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 3.0.0 to 3.1.0.
- [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/v3.0.0...v3.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-22 20:51:44 +00:00
Julius Härtl
d029067849 Merge pull request #657 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.22.0
Bump webpack from 4.20.2 to 4.22.0 in /js
2018-10-22 20:27:35 +02:00
Nextcloud bot
162c47ef60 [tx-robot] updated from transifex 2018-10-22 00:13:05 +00:00
dependabot[bot]
8b626251c1 Bump webpack from 4.20.2 to 4.22.0 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.20.2 to 4.22.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.20.2...v4.22.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-21 11:35:34 +00:00
Nextcloud bot
6aee11ef6f [tx-robot] updated from transifex 2018-10-21 00:13:25 +00:00
Nextcloud bot
1c9774a659 [tx-robot] updated from transifex 2018-10-20 00:12:53 +00:00
cloud2018
f3f75fb1d4 consistent-pop-up
fixes #429 
add delete icon to left pop-ups more (3 dots)
change some blanks to tabs
Signed-off-by: Markus Eckstein <eckstein-markus@gmx.de>
2018-10-19 21:02:59 +02:00
Nextcloud bot
b320ef8818 [tx-robot] updated from transifex 2018-10-19 00:12:52 +00:00
Julius Härtl
33a2c5e403 Merge branch 'master' into design/noid/simplify 2018-10-18 16:27:15 +02:00
Nextcloud bot
dc4245ca11 [tx-robot] updated from transifex 2018-10-18 00:12:42 +00:00
Julius Härtl
4b4f597d3e Merge pull request #653 from nextcloud/bugfix/649
Fix comment mention subject
2018-10-17 11:39:34 +02:00
rakekniven
2a3b4a8e3b Update NotifierTest.php
Fixed tests
2018-10-17 10:57:29 +02:00
Nextcloud bot
8f6e8d9004 [tx-robot] updated from transifex 2018-10-17 00:12:37 +00:00
Julius Härtl
0a4a58cddc Fix comment mention subject
fixes #649

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-16 10:16:30 +02:00
Julius Härtl
c025d1b5fd Add tooltip to sidebar sections
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-16 10:14:06 +02:00
Julius Härtl
5cc65cac6e Remove author since it is availiable in the activity stream (fixes #647)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-16 10:14:06 +02:00
Julius Härtl
e9a320e528 New sidebar layout
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-16 10:14:06 +02:00
Julius Härtl
7500a179c0 Make sidebar a bit cleaner
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-16 10:14:06 +02:00
Nextcloud bot
8bf3aed9a7 [tx-robot] updated from transifex 2018-10-16 00:12:31 +00:00
Julius Härtl
612a65d2e6 Merge pull request #650 from nextcloud/dependabot/npm_and_yarn/js/mini-css-extract-plugin-0.4.4
Bump mini-css-extract-plugin from 0.4.3 to 0.4.4 in /js
2018-10-15 08:56:27 +02:00
dependabot[bot]
0cb3c9c1f8 Bump mini-css-extract-plugin from 0.4.3 to 0.4.4 in /js
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.4.3 to 0.4.4.
- [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.3...v0.4.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-15 01:15:53 +00:00
Nextcloud bot
61c9a76c73 [tx-robot] updated from transifex 2018-10-15 00:12:49 +00:00
Nextcloud bot
93d0f9b3b8 [tx-robot] updated from transifex 2018-10-14 00:12:34 +00:00
Nextcloud bot
4e59d386dc [tx-robot] updated from transifex 2018-10-13 00:12:18 +00:00
Nextcloud bot
118fc0b0cc [tx-robot] updated from transifex 2018-10-12 00:12:19 +00:00
Nextcloud bot
4f39b76573 [tx-robot] updated from transifex 2018-10-11 00:11:52 +00:00
Nextcloud bot
80ba6314ee [tx-robot] updated from transifex 2018-10-10 00:19:55 +00:00
Julius Härtl
6f1a0b0aef Merge pull request #638 from nextcloud/release/0.5.0-beta1
v0.5.0-beta1
2018-10-09 21:30:04 +02:00
Julius Härtl
3255b8c4c6 Update description in appinfo
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 20:51:28 +02:00
Julius Härtl
4bd7f4fd39 Fix adding comment when no activity entry is present
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 20:38:08 +02:00
Julius Härtl
8e3fa71a2d Fix comment entity registration
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 19:18:44 +02:00
Julius Härtl
8b161927da Adapt tests for stable branch
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 19:02:55 +02:00
Julius Härtl
b0eee23ef2 Add changelog and set proper max-version
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 19:02:54 +02:00
Julius Härtl
09dc403b0e Bump version to v0.5.0-beta1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 19:02:54 +02:00
Julius Härtl
6754cfe73b Merge pull request #639 from nextcloud/bugfix/noid/comment-compatibility
Bugfix/noid/comment compatibility
2018-10-09 19:01:17 +02:00
Julius Härtl
59e8d9b4cf Add annotation for global variables
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 18:52:52 +02:00
Julius Härtl
d11d033360 Update README.md 2018-10-09 18:13:51 +02:00
Julius Härtl
8cad06f702 Update README.md 2018-10-09 18:06:15 +02:00
Julius Härtl
f0118c0848 Unify deleted entry tabs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 17:50:24 +02:00
Julius Härtl
33dbbd0d62 Fix loading if no comments are available
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 17:41:41 +02:00
Julius Härtl
72fd0fcc9b Fix 13 compatibility issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 17:41:09 +02:00
Julius Härtl
43b5571315 Fix loading of comments type
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 17:40:35 +02:00
Julius Härtl
29756e1e8c Make timeline tab only available if comments/activity apps are enabled
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 17:15:38 +02:00
Julius Härtl
1d777550ed Merge pull request #632 from nextcloud/feature/10/comments
Comments support
2018-10-09 16:44:19 +02:00
Julius Härtl
4779d3ae0c Tests: Comment actrivity parsing
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 14:52:55 +02:00
Julius Härtl
68880fc4be Add test for mention notifications
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 14:47:18 +02:00
Julius Härtl
da0cfdb1dc Add unit tests for comment handling
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:29 +02:00
Julius Härtl
5edb95fc6b Fix codacy issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:29 +02:00
Julius Härtl
27f9707058 Allow submit of comments using shift+enter
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:29 +02:00
Julius Härtl
cb3c083d8b Fix user id in mention notification
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:29 +02:00
Julius Härtl
3a36f7da2f Fix racecondition during loading of comments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:29 +02:00
Julius Härtl
3e8451e1e1 Fix unread comment count
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
5f8c46b146 Fix issue when switching between cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
9363f8667c Add UI feedback for comment deletion
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
dcc3601bd7 Implement editing comments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
46720dc37b Fix jslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
691c72d717 Use board users for @-mentioning
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:28 +02:00
Julius Härtl
f66f4e0be0 Send notification on user mention
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
93c3c542e8 Fix styling and proper template rendering
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
97b7bca255 Fix eslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
e0ac86ac1f Inject user manager
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
310af37d67 Implement user mentioning in frontend
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
e29efe8935 Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:27 +02:00
Julius Härtl
63a34e7018 Properly inject ICommentsManager
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
ddeefd5bf3 Move contenteditable directive to separate file
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
630a5badf8 Sidebar design improvements
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
f5520d3087 Implement comment deletion and loading indicator
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
e547a5d2b9 Add comment action menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
ffd32a803f Enhance activity list with comment data
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:26 +02:00
Julius Härtl
63337c1d26 Add comment event handler for activities
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:25 +02:00
Julius Härtl
2e824f0c80 Add backbone comment classes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:25 +02:00
Julius Härtl
339bc34f9b Add basic comments frontend
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:25 +02:00
Julius Härtl
41db5d0024 Load comments entity for app
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:25 +02:00
Julius Härtl
d3027acd37 Add backend support for comments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 13:08:25 +02:00
Julius Härtl
10c09927e2 Merge pull request #630 from nextcloud/dependabot/npm_and_yarn/js/babel-loader-8.0.4
Bump babel-loader from 7.1.5 to 8.0.4 in /js
2018-10-09 13:07:19 +02:00
Julius Härtl
014e7e4cbe Merge pull request #611 from nextcloud/bug/589/empty-titles
Don't allow empty card titles
2018-10-09 12:22:50 +02:00
Julius Härtl
884de2b4f2 Merge pull request #609 from nextcloud/feature/195/print-css
Printing CSS styles
2018-10-09 12:21:40 +02:00
Julius Härtl
a5a836450e Bump babel to 7.x.x
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 11:55:00 +02:00
Julius Härtl
da2e3add9d Adjust print css
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 11:43:20 +02:00
Dubidubiduu
e9a505f273 add import print.scss
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 11:34:08 +02:00
Dubidubiduu
8ec4a8e2bb add print file
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-10-09 11:34:08 +02:00
Michael Weimann
a02bd5ab52 Implements a validation for empty titles input in the card directly
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2018-10-09 11:28:19 +02:00
Michael Weimann
df43e07057 Implements a validation for empty titles input at the side bar
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2018-10-09 11:28:19 +02:00
Michael Weimann
d17cd78605 Implements validation when adding new cards
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2018-10-09 11:28:16 +02:00
dependabot[bot]
fe6caf094b Bump babel-loader from 7.1.5 to 8.0.4 in /js
Bumps [babel-loader](https://github.com/babel/babel-loader) from 7.1.5 to 8.0.4.
- [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.5...v8.0.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-08 12:04:47 +00:00
Julius Härtl
84969180e2 Merge pull request #635 from nextcloud/dependabot/npm_and_yarn/js/angular-1.7.5
Bump angular from 1.7.4 to 1.7.5 in /js
2018-10-08 14:03:06 +02:00
dependabot[bot]
7008745395 Bump angular from 1.7.4 to 1.7.5 in /js
Bumps [angular](https://github.com/angular/angular.js) from 1.7.4 to 1.7.5.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.4...v1.7.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-08 09:14:47 +00:00
Julius Härtl
34d5f05821 Merge pull request #636 from nextcloud/dependabot/npm_and_yarn/js/angular-animate-1.7.5
Bump angular-animate from 1.7.4 to 1.7.5 in /js
2018-10-08 11:12:36 +02:00
Julius Härtl
b96038c049 Merge pull request #637 from nextcloud/dependabot/npm_and_yarn/js/angular-sanitize-1.7.5
Bump angular-sanitize from 1.7.4 to 1.7.5 in /js
2018-10-08 11:12:20 +02:00
dependabot[bot]
0d21df347b Bump angular-sanitize from 1.7.4 to 1.7.5 in /js
Bumps [angular-sanitize](https://github.com/angular/angular.js) from 1.7.4 to 1.7.5.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.4...v1.7.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-08 01:16:25 +00:00
dependabot[bot]
f865149d35 Bump angular-animate from 1.7.4 to 1.7.5 in /js
Bumps [angular-animate](https://github.com/angular/angular.js) from 1.7.4 to 1.7.5.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.4...v1.7.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-08 01:15:59 +00:00
Nextcloud bot
5898428fb9 [tx-robot] updated from transifex 2018-10-05 00:19:46 +00:00
Julius Härtl
792b05dfdf Merge pull request #628 from nextcloud/dependabot/npm_and_yarn/js/webpack-cli-3.1.2
Bump webpack-cli from 3.1.0 to 3.1.2 in /js
2018-10-01 14:19:29 +02:00
Julius Härtl
08b6274131 Merge pull request #613 from nextcloud/dependabot/npm_and_yarn/js/angular-1.7.4
Bump angular from 1.7.3 to 1.7.4 in /js
2018-10-01 14:18:52 +02:00
dependabot[bot]
d8db1c9019 Bump webpack-cli from 3.1.0 to 3.1.2 in /js
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 3.1.0 to 3.1.2.
- [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/v3.1.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-01 11:58:30 +00:00
dependabot[bot]
f089c552e0 Bump angular from 1.7.3 to 1.7.4 in /js
Bumps [angular](https://github.com/angular/angular.js) from 1.7.3 to 1.7.4.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.3...v1.7.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-01 11:57:42 +00:00
Julius Härtl
61978088fc Merge pull request #626 from nextcloud/dependabot/npm_and_yarn/js/mini-css-extract-plugin-0.4.3
Bump mini-css-extract-plugin from 0.4.2 to 0.4.3 in /js
2018-10-01 13:56:19 +02:00
Julius Härtl
a9d7095354 Merge pull request #616 from nextcloud/dependabot/npm_and_yarn/js/angular-sanitize-1.7.4
Bump angular-sanitize from 1.7.3 to 1.7.4 in /js
2018-10-01 13:56:09 +02:00
Julius Härtl
353fd792a4 Merge pull request #615 from nextcloud/dependabot/npm_and_yarn/js/angular-animate-1.7.4
Bump angular-animate from 1.7.3 to 1.7.4 in /js
2018-10-01 13:55:47 +02:00
dependabot[bot]
e7d535e0c0 Bump mini-css-extract-plugin from 0.4.2 to 0.4.3 in /js
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.4.2 to 0.4.3.
- [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.2...v0.4.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-01 10:43:19 +00:00
dependabot[bot]
dc756991ae Bump angular-sanitize from 1.7.3 to 1.7.4 in /js
Bumps [angular-sanitize](https://github.com/angular/angular.js) from 1.7.3 to 1.7.4.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.3...v1.7.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-01 10:40:59 +00:00
dependabot[bot]
7529cfb892 Bump angular-animate from 1.7.3 to 1.7.4 in /js
Bumps [angular-animate](https://github.com/angular/angular.js) from 1.7.3 to 1.7.4.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.3...v1.7.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-10-01 10:28:46 +00:00
Julius Härtl
08485b0381 Merge pull request #623 from nextcloud/dependabot/composer/christophwurst/nextcloud-tw-14.0
Update christophwurst/nextcloud requirement from ^13.0 to ^14.0
2018-10-01 12:22:17 +02:00
Julius Härtl
1283c41283 Merge pull request #629 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.20.2
Bump webpack from 4.17.1 to 4.20.2 in /js
2018-10-01 12:21:49 +02:00
dependabot[bot]
774809a3a8 Bump webpack from 4.17.1 to 4.20.2 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.17.1 to 4.20.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.17.1...v4.20.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-09-30 08:31:22 +00:00
Nextcloud bot
5a0227a339 [tx-robot] updated from transifex 2018-09-29 00:17:55 +00:00
Nextcloud bot
3cb0e8fc2d [tx-robot] updated from transifex 2018-09-28 00:13:12 +00:00
Nextcloud bot
7026c2ca88 [tx-robot] updated from transifex 2018-09-26 00:18:56 +00:00
Nextcloud bot
ed5d57d474 [tx-robot] updated from transifex 2018-09-25 00:19:35 +00:00
dependabot[bot]
61ead7dc66 Update christophwurst/nextcloud requirement from ^13.0 to ^14.0
Updates the requirements on [christophwurst/nextcloud](https://github.com/ChristophWurst/nextcloud_composer) to permit the latest version.
- [Release notes](https://github.com/ChristophWurst/nextcloud_composer/releases)
- [Commits](https://github.com/ChristophWurst/nextcloud_composer/commits/14.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-09-24 01:12:38 +00:00
Nextcloud bot
1bb185c8f0 [tx-robot] updated from transifex 2018-09-24 00:19:07 +00:00
Nextcloud bot
0ea5a5b7d6 [tx-robot] updated from transifex 2018-09-23 00:19:40 +00:00
Nextcloud bot
9f8533b96c [tx-robot] updated from transifex 2018-09-22 00:19:14 +00:00
Nextcloud bot
4fd8add19c [tx-robot] updated from transifex 2018-09-21 00:19:44 +00:00
Nextcloud bot
cf8926952a [tx-robot] updated from transifex 2018-09-20 00:19:49 +00:00
Nextcloud bot
47fe8913c4 [tx-robot] updated from transifex 2018-09-18 00:19:08 +00:00
Nextcloud bot
bdd07ec31e [tx-robot] updated from transifex 2018-09-17 00:19:41 +00:00
Nextcloud bot
4fbbb6aa79 [tx-robot] updated from transifex 2018-09-16 00:19:36 +00:00
Nextcloud bot
57193181d1 [tx-robot] updated from transifex 2018-09-15 00:18:54 +00:00
Nextcloud bot
cbbeb394c1 [tx-robot] updated from transifex 2018-09-14 00:19:36 +00:00
Nextcloud bot
1174b8f7ca [tx-robot] updated from transifex 2018-09-13 00:19:12 +00:00
Nextcloud bot
cca9390555 [tx-robot] updated from transifex 2018-09-12 00:18:47 +00:00
Nextcloud bot
b9531ce684 [tx-robot] updated from transifex 2018-09-09 00:20:35 +00:00
Nextcloud bot
e0decdf55e [tx-robot] updated from transifex 2018-09-08 00:19:34 +00:00
Julius Härtl
f5691e6d7f Merge pull request #607 from nextcloud/feature/211/activity
Activity integration
2018-09-07 16:18:39 +02:00
Julius Härtl
b979e37ad6 Fix deps in Makefile
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 16:12:23 +02:00
Julius Härtl
41f254af74 Run composer on build
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 15:36:14 +02:00
Julius Härtl
d95a8e8975 Do not run apply after $http promise resolve
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 15:21:53 +02:00
Julius Härtl
28f58ee5f3 Fix activity rendering in the sidebar
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 15:04:42 +02:00
Julius Härtl
df4f8dda60 Frontend code cleanup
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 13:18:59 +02:00
Julius Härtl
4441075f49 Add tests for param parsing
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 12:53:58 +02:00
Julius Härtl
56f9b5b6e6 Code cleanup
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-07 08:51:52 +02:00
Julius Härtl
f686b1e75b Activity: trigger activity on board share/unshare
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 21:09:21 +02:00
Julius Härtl
7e88d246c0 Tests: Add tests for ActivityManager
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 20:01:26 +02:00
Julius Härtl
80aadb2717 Tests: More coverage for DeckProvider->parse()
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 15:05:35 +02:00
Julius Härtl
0cc4fffd08 Add tests for activity classes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 13:19:54 +02:00
Julius Härtl
4ba47045b2 Run composer on travis as well
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:14:57 +02:00
Julius Härtl
a6dceb2e64 Fix eslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:03 +02:00
Julius Härtl
eea5803ae5 Fix existing service tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:03 +02:00
Julius Härtl
e06a5ad44f Use proper trigger methods for activities
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:03 +02:00
Julius Härtl
f8f36dac09 Run composer install before on drone tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:03 +02:00
Julius Härtl
4c300bf432 Adjust tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
2d545aafa5 Fix service update methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
8d384c7c5c Fix some styling issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
790ea6ff63 Fix info.xml order
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
bc15b48ea2 Properly fetch activities for board and fix refresh of lists
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
3319f9c3b3 Add activity list to sidebars
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:02 +02:00
Julius Härtl
18f92f7b54 Implement remaining activity types
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:01 +02:00
Julius Härtl
b5cf3709c2 Emit activity events in StackService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:01 +02:00
Julius Härtl
df8c1984ca Emit activity events in CardService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:01 +02:00
Julius Härtl
c32ab5648c Emit activity events in BoardService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:01 +02:00
Julius Härtl
6a5b4fe40c WIP: Activity integration
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 10:05:01 +02:00
Julius Härtl
0ee0a5840b Merge pull request #608 from nextcloud/tests/stable14
Adjust tests for stable14 / 15 on master
2018-09-06 10:04:26 +02:00
Julius Härtl
6f883d1417 Set max-version to 15 for development
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 09:57:43 +02:00
Julius Härtl
8e974111ba Add app compatibility check for 14
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-09-06 09:57:22 +02:00
Nextcloud bot
45ee875646 [tx-robot] updated from transifex 2018-09-06 00:19:57 +00:00
Nextcloud bot
1877340cd3 [tx-robot] updated from transifex 2018-09-01 00:18:36 +00:00
Nextcloud bot
bcebec10bc [tx-robot] updated from transifex 2018-08-31 00:18:30 +00:00
Nextcloud bot
dfbe15319c [tx-robot] updated from transifex 2018-08-30 00:18:08 +00:00
Julius Härtl
33764f645b Merge pull request #602 from nextcloud/feature/587/compact-mode
Adds the compact mode
2018-08-29 17:47:35 +02:00
Michael Weimann
b20ea4dea1 Stores the compact mode state in the local storage
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2018-08-29 17:34:42 +02:00
Michael Weimann
e53c623759 Implements the compact toggle
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2018-08-29 16:04:59 +02:00
Nextcloud bot
2c12a99020 [tx-robot] updated from transifex 2018-08-28 00:19:16 +00:00
Julius Härtl
a4105d22dc Merge pull request #600 from nextcloud/dependabot/npm_and_yarn/js/mini-css-extract-plugin-0.4.2
Bump mini-css-extract-plugin from 0.4.1 to 0.4.2 in /js
2018-08-27 15:23:49 +02:00
dependabot[bot]
c7a058e575 Bump mini-css-extract-plugin from 0.4.1 to 0.4.2 in /js
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.4.1 to 0.4.2.
- [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.1...v0.4.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-27 12:18:48 +00:00
Julius Härtl
b603c31398 Merge pull request #599 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.17.1
Bump webpack from 4.16.5 to 4.17.1 in /js
2018-08-27 14:16:41 +02:00
dependabot[bot]
f650e52f6a Bump webpack from 4.16.5 to 4.17.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.16.5 to 4.17.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.16.5...v4.17.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-27 01:16:16 +00:00
Nextcloud bot
07ea4a1b4f [tx-robot] updated from transifex 2018-08-27 00:18:42 +00:00
Julius Härtl
a5ae5b3e26 Merge pull request #596 from willianveiga/feature/due-date-input-use-local-date-format
Due date input uses user's local date format
2018-08-26 16:19:46 +02:00
Julius Härtl
adf9e057b4 Merge pull request #597 from nextcloud/acc_workshop
Fix some small accessibility issues
2018-08-26 16:12:50 +02:00
Tobia De Koninck
c432f89424 Fix some small accessibility issues
Signed-off-by: Tobia De Koninck <LEDfan@users.noreply.github.com>
2018-08-26 12:00:14 +02:00
Nextcloud bot
410654b766 [tx-robot] updated from transifex 2018-08-26 00:19:15 +00:00
Willian Gustavo Veiga
9e49064847 Use tabs instead of spaces
Signed-off-by: Willian Gustavo Veiga <beberveiga@gmail.com>
2018-08-25 12:36:23 -03:00
Willian Gustavo Veiga
f8239f4e8a Due date input uses user's local date format
Signed-off-by: Willian Gustavo Veiga <beberveiga@gmail.com>
2018-08-25 11:57:56 -03:00
Nextcloud bot
b3b16f8fbd [tx-robot] updated from transifex 2018-08-25 00:18:54 +00:00
Julius Härtl
939f5fa621 Merge pull request #592 from nextcloud/251-card-title-inline
editable inline card titles
2018-08-24 15:57:25 +02:00
Ryan Fletcher
d17d0ec16f removing whitespaces
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-24 14:56:37 +02:00
Julius Härtl
f1ebe01e5e Fix inline input sizing for card title edit
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-24 14:56:37 +02:00
Ryan Fletcher
1949dae8d4 attempt at solving css "jumps" on inline edits.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-24 14:56:37 +02:00
Ryan Fletcher
7c6d36fde1 Added class input-inline
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-24 14:56:36 +02:00
Ryan Fletcher
5fd8ff003b editable inline card titles
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-24 14:56:36 +02:00
Julius Härtl
abb5290baa Merge pull request #593 from nextcloud/250-emptycontent-views
#250-emptycontent-views
2018-08-23 13:47:14 +02:00
Ryan Fletcher
fd7dd9c3b4 cleaning up whitespace / unused css style.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-23 07:10:17 -04:00
Nextcloud bot
4a4c787de2 [tx-robot] updated from transifex 2018-08-22 00:18:37 +00:00
Ryan Fletcher
6fb4525754 sending strings through translation code.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-21 17:25:09 -04:00
Ryan Fletcher
001609982d adjusting solution based on standards shown to me by jancborchardt
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-21 17:11:47 -04:00
Ryan Fletcher
9353e4852c Added empty message to board list when there are no boards present.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-21 14:35:03 -04:00
Nextcloud bot
eb29baef4b [tx-robot] updated from transifex 2018-08-21 00:18:50 +00:00
Nextcloud bot
031d20199e [tx-robot] updated from transifex 2018-08-18 00:19:12 +00:00
Nextcloud bot
adf0b7b68b [tx-robot] updated from transifex 2018-08-17 00:18:31 +00:00
Nextcloud bot
7296302af2 [tx-robot] updated from transifex 2018-08-16 00:18:57 +00:00
Julius Härtl
f040df785d Merge pull request #535 from nextcloud/feature/83/json-api
REST API
2018-08-15 21:21:25 +02:00
Julius Härtl
5639bd1274 Fix controller deleted at parameter
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:23 +02:00
Julius Härtl
babfcbddd8 Fix imports
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:23 +02:00
Julius Härtl
0c9b1f5338 Mapper can be null if provided id is a board id
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:23 +02:00
Julius Härtl
81d333243d Fix comparison
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:23 +02:00
Julius Härtl
47a7e76a4d Catch DoesNotExistException to return proper API repsonses
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:23 +02:00
Ryan Fletcher
4391bf4eb8 added missing BadRequestException checks to StackService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
aba7d02cfe Added BadRequestException checks in DefaultBoardService. Fixed bug in DefaultBoardService BadRequestException checks.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
6f5c0a2816 Added in BadRequestException checks in CardService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
e8571454d9 Added BadRequestException checks into BoardService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
7930fec5d7 Added in BadRequestException tests into AttachmentService.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
37a2858d5f wrote attachment api controller, fixed bug caught by unit test in CardService
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:22 +02:00
Ryan Fletcher
e88c9a760d Wrote unit tests for AttachmentApiController and stubbed out AttachmentApicontroller. Trying out test driven development.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
172a80fa5d Added additional endpoints for cards / stacks
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
3e965d0cfb Implemented additional CardApiController endpoints
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
72aeb723a5 fixed up missing checks from labelService, BadRequestException is now extending StatusException
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
507a7fd243 Code cleanup, removing unused code from older iteration.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
184cd00a8b Wrote initial unit tests for LabelApiControllerTest.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:21 +02:00
Ryan Fletcher
9c81584b02 Wrote tests for CardApiControllerTest.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
5bc8a363b9 Split Card Update in CardApiController as it was gigantic and broke codacy complexity rules by a lot. Also moved validation checks into respective services.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
f1169b9c7e finished writing StackApiControllerTest.php
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
f2268c7f58 Moved Data Response checks into stack serivice, cleaned up related unit tests.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
d33dd3e0fc Moved BadRequestException checks to middleware, removed uneeded unit tests in BoardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
8cac183af6 simple code style changes according to codacy standards.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:20 +02:00
Ryan Fletcher
570ac81848 added the create tests in StackApiControllerTest
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:19 +02:00
Ryan Fletcher
5719e9f134 Wrote unit tests against StackApiController -> get()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:19 +02:00
Ryan Fletcher
891fa7b7d5 Created index tests for StackApiTestController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:19 +02:00
Ryan Fletcher
54f110f7c6 first attempt at BoardApiControllerTest->testGetNoPermission()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:19 +02:00
Julius Härtl
dcfb9f3903 Properly annotate exceptions thrown by services
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:19 +02:00
Julius Härtl
2482dc963a Fix BoardServiceTest
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
6d57b1081a BoardApiControllerTest wrote delete tests
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
8dd732631a BoardApiController wrote update tests
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
1fe70568cb Wrote unit tests for the BoardApiController -> create tests
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
bd254fd261 BoardApiControllerTest wrote get() tests.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
fad579c4d3 Wrote first unit test for BoardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:18 +02:00
Ryan Fletcher
e8c53d71aa fixed more unit tests.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
e0049cf07b Resolved unit tests errors, down from 36 to 9.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
881b05aeb1 fixed BoardControllerTest from errors
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
cfd9ab98c6 Implemented StackApiController Get Function.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
dd1d4246fe Finished Error handling across the API
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
2668f6b80c committing WIP (improving error validation across the api's)
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:17 +02:00
Ryan Fletcher
a388d199dc Refactored error handling in StackApiController and moved it into ApiHelper.php, this will allow me to use the same checks in all controllers.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
d9f3d492dc Better variable name for stackService in StackApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
a14ca3d1f5 Better error handling in StackApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
7d9fc83dc9 Code style fixings.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
f97c7c3f7b Added in Create + Delete functions to the LabelApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
6002067b64 Created LabelApiController and it's get / update methods.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:16 +02:00
Ryan Fletcher
7e4d24236a Updated the CardApiController->update method to allow updating of archive state and assigned user,.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
b82591a0bc Added delete operation to CardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
e5f7f89ed9 Wrote update method for CardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
a68e888654 Started CardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
0c0910ee81 Co authored for my changes.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
ced87edfa5 Put in validation responses in BoardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:15 +02:00
Ryan Fletcher
5415ec21dc Validation Checking against StackApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
3cb496daa2 Cleaned up StackApiController to use proper route parameters, removed route parameters from request payloads as per rest standards.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
03e0559afe StackApiController->delete($boardId, $id) added in error handling
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
be91ff641c StackApiController added the update put route.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
cec06493c0 Error handling for StackApiController->Index()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
0da84a3e8c Corrected comment in BoardApiController from copy / paste.
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:14 +02:00
Ryan Fletcher
6822d7d099 Error handling in undelete function and created the update function in BoardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Ryan Fletcher
d82746be97 Error handling for undoDelete and created an update method in BoardApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Ryan Fletcher
3b49c7f262 Added exception handling to BoardApiController -> Delete
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Ryan Fletcher
9bc9569a0d Added checks to see if the entity is not found in BoardApiController -> get($id)
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Ryan Fletcher
8771e35f11 Added exception handling to StackApiController->create()
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Ryan Fletcher
656e8efa43 quick test in StackApiController
Signed-off-by: Ryan Fletcher <ryan.fletcher@codepassion.ca>
2018-08-15 21:15:13 +02:00
Julius Härtl
9fc01eb51f Move DI of IUserManager, IGroupManager, userId to the BoardService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:12 +02:00
Steven R. Baker
e32adb17f2 Don't need to pass around the userInfo with it encapsulated in BoardService.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:12 +02:00
Steven R. Baker
1ffa3211ba Extract getBoardPererequisites() so it can be re-used.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:11 +02:00
Steven R. Baker
41cf623bb8 This should be 200 on deletion, so we can tell whether a deletion succeeds or not.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:10 +02:00
Steven R. Baker
8ec97032b1 Re-format code according to the coding style.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:08 +02:00
Steven R. Baker
40f34eb3bc Fix the routing and the stacks API endpoint.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:07 +02:00
Steven R. Baker
a4b348488b Add Stack support to API.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:05 +02:00
Steven R. Baker
8316a0b25f Board creation via API.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:04 +02:00
Steven R. Baker
86dde2d6b8 These parens are not needed.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:15:03 +02:00
Steven R. Baker
84a8db7b75 Change the API version to 1.0, and fix the preflighted_cors version.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:14:59 +02:00
Steven R. Baker
975b6f3572 Update the documentation.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 21:14:43 +02:00
Steven R. Baker
b4224dadfb Undo deletion of boards via API.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 20:53:07 +02:00
Steven R. Baker
7dcd49c485 Delete boards via the API.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 20:53:07 +02:00
Steven R. Baker
0c266d4a1f List boards, and fetch a specific board.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 20:53:07 +02:00
Julius Härtl
a3a70f67b4 Merge pull request #557 from nextcloud/feature/undo-delete-cards-and-stacks
Feature/undo delete cards and stacks
2018-08-15 20:52:01 +02:00
Julius Härtl
43e76ecca3 Bump development version
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-15 20:46:58 +02:00
Manuel Arno Korfmann
241a654f28 codacy fix
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:31 +02:00
Manuel Arno Korfmann
94e1b86eaf fixed bugs where labels would dissappear
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:31 +02:00
Manuel Arno Korfmann
4d5353b8d4 renaming and more codacy
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:31 +02:00
Manuel Arno Korfmann
5ddfb66633 Card,Stack undo delete: CardServiceTest fix
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Stack,Card undo delete: Test Fix 2

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Card, Stack undo delete: Test fix 3

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Card,Stack undo delete: Test fix 4

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Stack, Card undo delete: Relative time in deleted entity listings

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Card, Stack undo delete: Test Fix 5

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Test Fix 6

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

Test Fix 7

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

fix codacy

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:31 +02:00
Manuel Arno Korfmann
41d30d4fd4 stack, card undo delete: refactoring
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack undo delete: serve cards with deleted and delete actions

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack, cards undo delete: codacy

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

card undo delete: 526#discussion_r204501758, refactoring

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

card, stack undo delete: code review fixes #1

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

undo card, stack delete: show deleted stacks name in deleted card listing

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:31 +02:00
Manuel Arno Korfmann
95548fba54 Conditional restoration of deleted stacks on card undo delete
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:30 +02:00
Manuel Arno Korfmann
ef4ce31c47 refactoring and stack undo delete early wip
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack soft delete done

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack undo delete done

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

stack undo: code review remarks and fixes

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:30 +02:00
Manuel Arno Korfmann
f2795f120b show deleted cards in sidebar tab (styling still wip)
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

card undo delete done, styling still wip

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

fix Codacy findings

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:30 +02:00
Manuel Arno Korfmann
2ef4b55af4 cards soft delete wip
Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

cards: softdelete done; undo delete wip

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

show deleted cards in board settings sidebar wip

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>

CardMapper#findDeleted: fix bug in entity property assigning

Signed-off-by: Manuel Arno Korfmann <manu@korfmann.info>
2018-08-15 20:33:30 +02:00
Julius Härtl
3e4dedf397 Merge pull request #581 from nextcloud/dependabot/npm_and_yarn/js/angular-1.7.3
Bump angular from 1.7.2 to 1.7.3 in /js
2018-08-14 21:38:47 +02:00
dependabot[bot]
ebcb86ff3e Bump angular from 1.7.2 to 1.7.3 in /js
Bumps [angular](https://github.com/angular/angular.js) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.2...v1.7.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 19:32:43 +00:00
Julius Härtl
c0defcab9b Merge pull request #578 from nextcloud/dependabot/npm_and_yarn/js/angular-animate-1.7.3
Bump angular-animate from 1.7.2 to 1.7.3 in /js
2018-08-14 21:30:02 +02:00
Julius Härtl
25f6f16718 Merge pull request #580 from nextcloud/dependabot/npm_and_yarn/js/angular-sanitize-1.7.3
Bump angular-sanitize from 1.7.2 to 1.7.3 in /js
2018-08-14 21:29:50 +02:00
Julius Härtl
34767cdd13 Merge pull request #572 from nextcloud/dependabot/npm_and_yarn/js/webpack-merge-4.1.4
Bump webpack-merge from 4.1.3 to 4.1.4 in /js
2018-08-14 21:29:38 +02:00
Julius Härtl
9975d2b483 Merge pull request #583 from nextcloud/dependabot/npm_and_yarn/js/node-sass-4.9.3
Bump node-sass from 4.9.2 to 4.9.3 in /js
2018-08-14 21:29:28 +02:00
dependabot[bot]
3f77c99544 Bump angular-animate from 1.7.2 to 1.7.3 in /js
Bumps [angular-animate](https://github.com/angular/angular.js) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.2...v1.7.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 19:24:12 +00:00
dependabot[bot]
9eab136f53 Bump webpack-merge from 4.1.3 to 4.1.4 in /js
Bumps [webpack-merge](https://github.com/survivejs/webpack-merge) from 4.1.3 to 4.1.4.
- [Release notes](https://github.com/survivejs/webpack-merge/releases)
- [Changelog](https://github.com/survivejs/webpack-merge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/survivejs/webpack-merge/compare/v4.1.3...v4.1.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 19:23:39 +00:00
dependabot[bot]
998d993102 Bump node-sass from 4.9.2 to 4.9.3 in /js
Bumps [node-sass](https://github.com/sass/node-sass) from 4.9.2 to 4.9.3.
- [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.2...v4.9.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 19:23:18 +00:00
dependabot[bot]
f27d399dfc Bump angular-sanitize from 1.7.2 to 1.7.3 in /js
Bumps [angular-sanitize](https://github.com/angular/angular.js) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.2...v1.7.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 19:23:13 +00:00
Julius Härtl
a117cc8e0c Merge pull request #579 from nextcloud/dependabot/npm_and_yarn/js/@uirouter/angularjs-1.0.20
Bump @uirouter/angularjs from 1.0.19 to 1.0.20 in /js
2018-08-14 21:21:26 +02:00
dependabot[bot]
2c59a4148d Bump @uirouter/angularjs from 1.0.19 to 1.0.20 in /js
Bumps [@uirouter/angularjs](https://github.com/angular-ui/ui-router) from 1.0.19 to 1.0.20.
- [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.19...1.0.20)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-14 18:44:36 +00:00
Julius Härtl
dc20ff52d8 Merge pull request #582 from nextcloud/dependabot/npm_and_yarn/js/karma-3.0.0
Bump karma from 2.0.5 to 3.0.0 in /js
2018-08-14 20:41:53 +02:00
dependabot[bot]
1764e6e0fe Bump karma from 2.0.5 to 3.0.0 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 2.0.5 to 3.0.0.
- [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.5...v3.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-13 11:09:23 +00:00
Julius Härtl
e65d2f2a85 Merge pull request #584 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.16.5
Bump webpack from 4.16.4 to 4.16.5 in /js
2018-08-13 12:39:59 +02:00
dependabot[bot]
2d26b24b10 Bump webpack from 4.16.4 to 4.16.5 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.16.4 to 4.16.5.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.16.4...v4.16.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-13 01:21:41 +00:00
Nextcloud bot
990a70e958 [tx-robot] updated from transifex 2018-08-13 00:18:56 +00:00
Nextcloud bot
2868391cf6 [tx-robot] updated from transifex 2018-08-12 00:18:53 +00:00
Julius Härtl
4050cddd12 Merge pull request #571 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.16.4
Bump webpack from 4.16.3 to 4.16.4 in /js
2018-08-09 17:13:45 +02:00
dependabot[bot]
92cee7b441 Bump webpack from 4.16.3 to 4.16.4 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.16.3 to 4.16.4.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.16.3...v4.16.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-08-06 01:16:08 +00:00
Nextcloud bot
8e0f6c6e83 [tx-robot] updated from transifex 2018-08-05 00:19:19 +00:00
Nextcloud bot
e7eb1dfbf0 [tx-robot] updated from transifex 2018-08-01 00:18:12 +00:00
Julius Härtl
f8a0b6c0c6 Update pull_request_template.md 2018-07-31 09:58:59 +02:00
Julius Härtl
9f7bef9447 Merge pull request #561 from nextcloud/551_show_tag_title_on_cards_overview
551_show_tag_title_on_cards_overview
2018-07-31 09:57:03 +02:00
Philippe Le Van
508674f404 little more bottom margin after review
Signed-off-by: Philippe Le Van <philippe.levan@kibatic.com>
2018-07-31 09:21:19 +02:00
Philippe Le Van
25fa1a0e69 First proposition of label styling
Signed-off-by: Philippe Le Van <philippe.levan@kibatic.com>
2018-07-31 09:21:18 +02:00
Nextcloud bot
2453f27284 [tx-robot] updated from transifex 2018-07-31 00:18:57 +00:00
Julius Härtl
05598d1445 Merge pull request #559 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.16.3
Bump webpack from 4.16.1 to 4.16.3 in /js
2018-07-30 23:28:13 +02:00
Julius Härtl
c82d99a656 Merge pull request #558 from nextcloud/dependabot/npm_and_yarn/js/karma-2.0.5
Bump karma from 2.0.4 to 2.0.5 in /js
2018-07-30 23:26:51 +02:00
dependabot[bot]
619acbed15 Bump webpack from 4.16.1 to 4.16.3 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.16.1 to 4.16.3.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.16.1...v4.16.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-30 01:14:09 +00:00
dependabot[bot]
fef5bb6342 Bump karma from 2.0.4 to 2.0.5 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 2.0.4 to 2.0.5.
- [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.4...v2.0.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-07-30 01:13:49 +00:00
Nextcloud bot
4e91e06c64 [tx-robot] updated from transifex 2018-07-30 00:18:37 +00:00
Julius Härtl
0057c2be84 Update README.md
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-07-28 14:36:41 +02:00
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
Julius Härtl
63ac985f15 Add proper polyfill for IE11
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-21 14:55:28 +02:00
Julius Härtl
93725e481d Bump version to 0.4.0-beta2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-21 14:35:42 +02:00
Nextcloud bot
8e976cb2a6 [tx-robot] updated from transifex 2018-06-21 12:30:45 +00:00
Julius Härtl
58a89374e2 Properly use babel to fix IE11 support
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-21 14:13:39 +02:00
Julius Härtl
313bbca462 Add proper controller method annotations
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-21 11:44:45 +02:00
Nextcloud bot
f0c22370e0 [tx-robot] updated from transifex 2018-06-21 00:20:04 +00:00
Julius Härtl
00554c218b Merge pull request #499 from nextcloud/release/v0.4.0-beta1
Prepare for release of v0.4.0-beta1
2018-06-20 09:36:53 +02:00
Julius Härtl
b0222a2d11 Merge pull request #500 from nextcloud/bugfix/441/fix-opacity
Fix opacity issue with the popover menu
2018-06-20 09:35:52 +02:00
Julius Härtl
03ba692f69 Fix opacity issue with the popover menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-20 09:21:42 +02:00
Julius Härtl
7147368ce1 Prepare for release of v0.4.0-beta1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-20 09:07:29 +02:00
Julius Härtl
c938fdd806 Merge pull request #488 from nextcloud/feature/109/file-attachments
File attachments for cards
2018-06-20 08:34:57 +02:00
Julius Härtl
49d7f8c522 Merge branch 'master' into feature/109/file-attachments 2018-06-20 08:19:10 +02:00
Nextcloud bot
6357080f89 [tx-robot] updated from transifex 2018-06-20 00:19:26 +00:00
Julius Härtl
147c317a46 Create proper parameters with QueryBuilder
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 20:08:02 +02:00
Julius Härtl
dd1a03f243 Limit images in height
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 19:56:17 +02:00
Julius Härtl
dfa409bd68 Merge pull request #494 from nextcloud/dependabot/npm_and_yarn/js/angular-1.7.2
Bump angular from 1.7.1 to 1.7.2 in /js
2018-06-19 19:43:31 +02:00
Julius Härtl
c2c0bae3d6 Fix scrutinizer issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 19:40:12 +02:00
Julius Härtl
56412498f1 Fix missing index and double quotes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 19:03:28 +02:00
Julius Härtl
c720f964bb Add AttachmentMapperTest
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:41:14 +02:00
Julius Härtl
6ac3066dc8 Add more spacing to attachment list
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:40:47 +02:00
Julius Härtl
63ad39dd2d Unit tests for missing service methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:07 +02:00
Julius Härtl
7955a19149 Add some logging
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
a83b50bb97 return empty result
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
0f50f8d1d9 Use generic Exception
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
5b95beb153 Insert attachments to description
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
7ad8080f82 Add unit tests for new classes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
1972edc38d Fix CardTest
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
06ea03689b Fix codacy warnings
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:06 +02:00
Julius Härtl
22190b90cf Fix button styling
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
5bc65a6eb3 Use object-src self/blob for pdf files
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
0b5ded2860 Use tabbed headers for description and attachments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
48c622d19e Add file upload indicator
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
581fa011e3 Implement updating files
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
c816b15bfa Fix race condition when loading the user list
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
2bcd5d35c0 Fix chrome hovering bug
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:05 +02:00
Julius Härtl
8229fbacea Move uploading logic to dedicated FileService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
7b230d567e Add field for user count
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
344ed6d928 Fix code style and PHP5.6 errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
94397dedb1 Fix delete cron test
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
04b0807a12 Adapt existing unit tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
757b041f73 Use card data from CardService so we don't need to store objects twice
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
0137b882c5 Add attachment indicator
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
ee5a54a575 Allow to undo file deletions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:04 +02:00
Julius Härtl
0c711b2b0b Update package-lock.json to remove option param
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 18:00:03 +02:00
Julius Härtl
b08d416c51 Include angular-file-upload and add a fix for its dragleave issue
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 17:59:20 +02:00
Julius Härtl
bfda3e7623 Implement file attachments frontend
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 17:59:00 +02:00
Julius Härtl
f152f32952 Update database schema for attachments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 17:59:00 +02:00
Julius Härtl
45c7241daf Implement attachment backend with a first module for app data file upload
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-19 17:59:00 +02:00
dependabot[bot]
cfc32c0b74 Bump angular from 1.7.1 to 1.7.2 in /js
Bumps [angular](https://github.com/angular/angular.js) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.1...v1.7.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-19 13:04:08 +00:00
Julius Härtl
e4863b6d8d Merge pull request #493 from nextcloud/dependabot/npm_and_yarn/js/webpack-merge-4.1.3
Bump webpack-merge from 4.1.2 to 4.1.3 in /js
2018-06-19 15:02:31 +02:00
Julius Härtl
8f5d0c3f76 Merge pull request #495 from nextcloud/dependabot/npm_and_yarn/js/angular-sanitize-1.7.2
Bump angular-sanitize from 1.7.1 to 1.7.2 in /js
2018-06-19 15:01:12 +02:00
Julius Härtl
38feba1740 Merge pull request #496 from nextcloud/dependabot/npm_and_yarn/js/angular-animate-1.7.2
Bump angular-animate from 1.7.1 to 1.7.2 in /js
2018-06-19 15:00:30 +02:00
dependabot[bot]
9973eef488 Bump angular-animate from 1.7.1 to 1.7.2 in /js
Bumps [angular-animate](https://github.com/angular/angular.js) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.1...v1.7.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-19 07:57:51 +00:00
dependabot[bot]
77b906e884 Bump webpack-merge from 4.1.2 to 4.1.3 in /js
Bumps [webpack-merge](https://github.com/survivejs/webpack-merge) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/survivejs/webpack-merge/releases)
- [Changelog](https://github.com/survivejs/webpack-merge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/survivejs/webpack-merge/compare/v4.1.2...v4.1.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-19 07:57:45 +00:00
dependabot[bot]
962724f0dc Bump angular-sanitize from 1.7.1 to 1.7.2 in /js
Bumps [angular-sanitize](https://github.com/angular/angular.js) from 1.7.1 to 1.7.2.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.1...v1.7.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-19 07:57:15 +00:00
Julius Härtl
55440c47cf Merge pull request #497 from nextcloud/dependabot/npm_and_yarn/js/karma-2.0.3
Bump karma from 2.0.2 to 2.0.3 in /js
2018-06-19 09:56:12 +02:00
Julius Härtl
002ffc4b99 Merge pull request #498 from nextcloud/dependabot/npm_and_yarn/js/webpack-cli-3.0.8
Bump webpack-cli from 3.0.3 to 3.0.8 in /js
2018-06-19 09:55:35 +02:00
dependabot[bot]
97952d775c Bump webpack-cli from 3.0.3 to 3.0.8 in /js
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 3.0.3 to 3.0.8.
- [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/compare/v3.0.3...v3.0.8)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-18 22:16:14 +00:00
dependabot[bot]
a5130d8032 Bump karma from 2.0.2 to 2.0.3 in /js
Bumps [karma](https://github.com/karma-runner/karma) from 2.0.2 to 2.0.3.
- [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.2...v2.0.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-18 22:15:32 +00:00
Nextcloud bot
5b3f1f847d [tx-robot] updated from transifex 2018-06-14 00:20:30 +00:00
Nextcloud bot
5be62756ed [tx-robot] updated from transifex 2018-06-12 00:20:18 +00:00
Julius Härtl
be2d0010f7 Merge pull request #463 from nextcloud/markdown-checkboxes
Implement github flavored markdown checkboxes
2018-06-10 21:21:59 +02:00
Julius Härtl
ab5d2c79ec [markdown-it-checkbox] add licence details
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 21:10:48 +02:00
Julius Härtl
1de3dc2f6c Merge pull request #468 from nextcloud/feature/405/color-picker
Implemented a colorpicker for all color selectors
2018-06-10 21:06:39 +02:00
Julius Härtl
3413e7694a [markdown-it-checkbox] remove underscore.js requirement
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 21:05:49 +02:00
Julius Härtl
57f58e5e68 Code style fixes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:55:12 +02:00
Julius Härtl
1a4b2e5f01 Add fork of markdown-it-checkboxes to legacy scripts folder
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:55:12 +02:00
Julius Härtl
20490dbd39 Add indicator for tasks
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:55:12 +02:00
Julius Härtl
f3088b5b48 Add support for checkboxes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:55:11 +02:00
Julius Härtl
40536a0097 Merge pull request #481 from nextcloud/dependabot/npm_and_yarn/js/webpack-cli-3.0.3
Bump webpack-cli from 2.1.4 to 3.0.3 in /js
2018-06-10 20:51:02 +02:00
Julius Härtl
6c93e99b9b Use tabs instead of spaces
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:49:06 +02:00
Julius Härtl
00ae0e6963 Fix webpack-cli
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:47:22 +02:00
dependabot[bot]
25edef4fb9 Bump webpack-cli from 2.1.4 to 3.0.3 in /js
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 2.1.4 to 3.0.3.
- [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/compare/v2.1.4...v3.0.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-10 20:47:22 +02:00
Julius Härtl
9f58b1ea07 Fix invisible picker and webpack migration
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-06-10 20:43:31 +02:00
Oskar Kurz
4a9ef92e5d Fixed color-picker width. #204, #395
Signed-off-by: oskar <oskar.kurz@gmail.com>
2018-06-10 20:38:01 +02:00
Oskar Kurz
2cc961dcdf Implemented a colorpicker for all color selectors. #204, #395
Signed-off-by: oskar <oskar.kurz@gmail.com>
2018-06-10 20:38:01 +02:00
Julius Härtl
fe383a3485 Merge pull request #482 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.12.0
Bump webpack from 4.11.1 to 4.12.0 in /js
2018-06-09 12:44:43 +02:00
dependabot[bot]
264ae7bac6 Bump webpack from 4.11.1 to 4.12.0 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.11.1 to 4.12.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.11.1...v4.12.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-09 10:41:12 +00:00
Julius Härtl
f6de432bcc Merge pull request #484 from nextcloud/dependabot/npm_and_yarn/js/angular-sanitize-1.7.1
Bump angular-sanitize from 1.7.0 to 1.7.1 in /js
2018-06-09 12:37:47 +02:00
dependabot[bot]
1ed28ff563 Bump angular-sanitize from 1.7.0 to 1.7.1 in /js
Bumps [angular-sanitize](https://github.com/angular/angular.js) from 1.7.0 to 1.7.1.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.0...v1.7.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-09 10:31:00 +00:00
Julius Härtl
23492745f7 Merge pull request #483 from nextcloud/dependabot/npm_and_yarn/js/angular-animate-1.7.1
Bump angular-animate from 1.7.0 to 1.7.1 in /js
2018-06-09 12:29:13 +02:00
dependabot[bot]
a56c82928c Bump angular-animate from 1.7.0 to 1.7.1 in /js
Bumps [angular-animate](https://github.com/angular/angular.js) from 1.7.0 to 1.7.1.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.0...v1.7.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-09 10:20:51 +00:00
Julius Härtl
78f5d24a5d Merge pull request #485 from nextcloud/dependabot/npm_and_yarn/js/angular-1.7.1
Bump angular from 1.7.0 to 1.7.1 in /js
2018-06-09 12:18:58 +02:00
dependabot[bot]
aeac40e37e Bump angular from 1.7.0 to 1.7.1 in /js
Bumps [angular](https://github.com/angular/angular.js) from 1.7.0 to 1.7.1.
- [Release notes](https://github.com/angular/angular.js/releases)
- [Changelog](https://github.com/angular/angular.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular.js/compare/v1.7.0...v1.7.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-08 22:15:33 +00:00
Nextcloud bot
6b1015e99f [tx-robot] updated from transifex 2018-06-08 00:20:09 +00:00
Julius Härtl
6d8b856728 Merge pull request #479 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.11.1
Bump webpack from 4.10.1 to 4.11.1 in /js
2018-06-07 14:35:51 +02:00
dependabot[bot]
8c77f1bc8a Bump webpack from 4.10.1 to 4.11.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.10.1 to 4.11.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.10.1...v4.11.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-06-06 22:14:31 +00:00
Nextcloud bot
7714b1e83b [tx-robot] updated from transifex 2018-06-04 00:19:15 +00:00
Nextcloud bot
8ad1496eff [tx-robot] updated from transifex 2018-06-02 00:19:18 +00:00
Nextcloud bot
a5683add3a [tx-robot] updated from transifex 2018-06-01 00:19:34 +00:00
Nextcloud bot
3a155a3004 [tx-robot] updated from transifex 2018-05-31 00:19:44 +00:00
Julius Härtl
67a482cc6f Merge pull request #473 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.10.1
Bump webpack from 4.8.3 to 4.10.1 in /js
2018-05-30 16:49:07 +02:00
Nextcloud bot
fd154fafb3 [tx-robot] updated from transifex 2018-05-30 00:19:24 +00:00
dependabot[bot]
51949fa179 Bump webpack from 4.8.3 to 4.10.1 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.8.3 to 4.10.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.8.3...v4.10.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-29 22:13:42 +00:00
Nextcloud bot
614ddf1023 [tx-robot] updated from transifex 2018-05-29 00:19:27 +00:00
Nextcloud bot
401a7db3e9 [tx-robot] updated from transifex 2018-05-28 00:20:14 +00:00
Nextcloud bot
d52c727b92 [tx-robot] updated from transifex 2018-05-26 00:20:38 +00:00
Nextcloud bot
7ff5fb64c3 [tx-robot] updated from transifex 2018-05-25 00:22:55 +00:00
Julius Härtl
d28a408994 Merge pull request #467 from nextcloud/dependabot/npm_and_yarn/js/webpack-cli-2.1.4
Bump webpack-cli from 2.1.3 to 2.1.4 in /js
2018-05-24 11:35:23 +02:00
Nextcloud bot
541b8cc9e7 [tx-robot] updated from transifex 2018-05-24 00:21:38 +00:00
dependabot[bot]
11f78403dd Bump webpack-cli from 2.1.3 to 2.1.4 in /js
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 2.1.3 to 2.1.4.
- [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/compare/v2.1.3...v2.1.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-23 22:13:48 +00:00
Nextcloud bot
3db63d1761 [tx-robot] updated from transifex 2018-05-23 00:23:29 +00:00
Julius Härtl
24b00f0a85 Merge pull request #465 from nextcloud/dependabot/npm_and_yarn/js/@uirouter/angularjs-1.0.18
Bump @uirouter/angularjs from 1.0.17 to 1.0.18 in /js
2018-05-22 08:23:18 +02:00
dependabot[bot]
f711a0214b Bump @uirouter/angularjs from 1.0.17 to 1.0.18 in /js
Bumps [@uirouter/angularjs](https://github.com/angular-ui/ui-router) from 1.0.17 to 1.0.18.
- [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.17...1.0.18)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-21 22:12:16 +00:00
Nextcloud bot
7facc2593e [tx-robot] updated from transifex 2018-05-18 00:21:18 +00:00
Nextcloud bot
bd32f51451 [tx-robot] updated from transifex 2018-05-17 00:21:25 +00:00
Julius Härtl
3b6c04dad9 Merge pull request #461 from nextcloud/dependabot/npm_and_yarn/js/@uirouter/angularjs-1.0.17
Bump @uirouter/angularjs from 1.0.16 to 1.0.17 in /js
2018-05-16 09:58:34 +02:00
dependabot[bot]
99f845d746 Bump @uirouter/angularjs from 1.0.16 to 1.0.17 in /js
Bumps [@uirouter/angularjs](https://github.com/angular-ui/ui-router) from 1.0.16 to 1.0.17.
- [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.16...1.0.17)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-15 07:26:17 +00:00
Julius Härtl
22f39d28e4 Merge pull request #462 from nextcloud/dependabot/npm_and_yarn/js/webpack-4.8.3
Bump webpack from 4.8.2 to 4.8.3 in /js
2018-05-15 09:24:07 +02:00
dependabot[bot]
aa0d8b6026 Bump webpack from 4.8.2 to 4.8.3 in /js
Bumps [webpack](https://github.com/webpack/webpack) from 4.8.2 to 4.8.3.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.8.2...v4.8.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-14 22:14:18 +00:00
Julius Härtl
dd008f0895 Use single quotes and update krankerl.toml
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 13:19:03 +02:00
Julius Härtl
c4dfb75b3a Merge pull request #460 from nextcloud/scrutinizer-patch-1
Scrutinizer Auto-Fixes
2018-05-12 13:16:30 +02:00
Scrutinizer Auto-Fixer
b633d82c5e Scrutinizer Auto-Fixes
This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com
2018-05-12 11:10:23 +00:00
Julius Härtl
08d9d51bea Update README.md 2018-05-12 12:49:14 +02:00
Julius Härtl
e21c12f23d Merge pull request #459 from nextcloud/dependabot/npm_and_yarn/js/webpack-tw-4.8.2
Update webpack requirement to ^4.8.2 in /js
2018-05-12 12:30:45 +02:00
Julius Härtl
101f20095d Ignore node global in eslint
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:24:01 +02:00
Julius Härtl
701b5c5a5b Add package-lock.json to repo
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:19:14 +02:00
Julius Härtl
e92c99fe22 Fix eslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:13:49 +02:00
Julius Härtl
893734dff9 Update makefile to use npm commands
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:06:45 +02:00
Julius Härtl
43babf82b0 Cleanup dependencies
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:03:47 +02:00
Julius Härtl
bd5ce84c65 Migrate to webpack 4.8 and use proper jquery timepicker
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-12 12:03:47 +02:00
dependabot[bot]
37851bad6f Update webpack requirement to ^4.8.2 in /js
Updates the requirements on [webpack](https://github.com/webpack/webpack) to permit the latest version.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/commits/v4.8.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-12 12:03:47 +02:00
Julius Härtl
13c7be9dc2 Merge pull request #453 from nextcloud/fix-di
Remove unused parameter that caused failures in card view
2018-05-12 11:58:50 +02:00
Nextcloud bot
2433703fa5 [tx-robot] updated from transifex 2018-05-12 00:19:57 +00:00
Julius Härtl
e320b52b48 Merge pull request #458 from nextcloud/dependabot/composer/jakub-onderka/php-parallel-lint-tw-1.0.0
Update jakub-onderka/php-parallel-lint requirement to ^1.0.0
2018-05-11 19:23:51 +02:00
Julius Härtl
73b91246e9 Delete _config.yml 2018-05-11 18:46:24 +02:00
dependabot[bot]
822cc1aaa5 Update jakub-onderka/php-parallel-lint requirement to ^1.0.0
Updates the requirements on [jakub-onderka/php-parallel-lint](https://github.com/JakubOnderka/PHP-Parallel-Lint) to permit the latest version.
- [Release notes](https://github.com/JakubOnderka/PHP-Parallel-Lint/releases)
- [Commits](https://github.com/JakubOnderka/PHP-Parallel-Lint/commits/v1.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-11 15:58:23 +00:00
Julius Härtl
83e62a9bc9 Delete issue_template.md
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-11 17:58:04 +02:00
Julius Härtl
4057be32e8 Merge pull request #457 from nextcloud/dependabot/composer/christophwurst/nextcloud-tw-13.0
Update christophwurst/nextcloud requirement to ^13.0
2018-05-11 17:56:52 +02:00
Julius Härtl
764a28a1dd Update issue templates 2018-05-11 17:55:51 +02:00
dependabot[bot]
5565589ebf Update christophwurst/nextcloud requirement to ^13.0
Updates the requirements on [christophwurst/nextcloud](https://github.com/ChristophWurst/nextcloud_composer) to permit the latest version.
- [Release notes](https://github.com/ChristophWurst/nextcloud_composer/releases)
- [Commits](https://github.com/ChristophWurst/nextcloud_composer/commits/13.0.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-05-11 15:29:31 +00:00
Julius Härtl
cd5d23bacc Remove unused parameter that caused failures in card view
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-05-11 08:48:56 +02:00
Nextcloud bot
b7bc38376f [tx-robot] updated from transifex 2018-05-10 00:20:04 +00:00
Nextcloud bot
3e0de1bfba [tx-robot] updated from transifex 2018-04-22 00:18:33 +00:00
Morris Jobke
8ddc21e403 Fix drone config
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2018-04-12 16:37:14 +02:00
Julius Härtl
9cf8ab1efb Merge pull request #410 from nextcloud/move-to-webpack
Move to webpack
2018-04-11 13:59:29 +02:00
Julius Härtl
6f254510c1 Fix eslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-04-11 13:00:22 +02:00
Julius Härtl
2cd5606d40 Fix jsbuild
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-04-11 12:57:31 +02:00
Julius Härtl
4f0c05f536 Fix js build in drone
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-04-11 11:54:37 +02:00
Julius Härtl
24f4f84eb6 Move to webpack
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-04-11 11:54:37 +02:00
Nextcloud bot
e94986744d [tx-robot] updated from transifex 2018-04-05 00:18:12 +00:00
Nextcloud bot
7b15c04976 [tx-robot] updated from transifex 2018-03-26 00:19:41 +00:00
Nextcloud bot
b9ff4ef305 [tx-robot] updated from transifex 2018-03-25 01:16:28 +00:00
Nextcloud bot
5d0173f755 [tx-robot] updated from transifex 2018-03-15 01:17:47 +00:00
Nextcloud bot
405f23f660 [tx-robot] updated from transifex 2018-03-14 01:17:53 +00:00
Nextcloud bot
6cefa20ec7 [tx-robot] updated from transifex 2018-03-13 01:18:32 +00:00
Nextcloud bot
20a2f53745 [tx-robot] updated from transifex 2018-03-12 01:19:05 +00:00
Nextcloud bot
bd7fdf7934 [tx-robot] updated from transifex 2018-03-10 01:18:11 +00:00
Nextcloud bot
8042d50d4c [tx-robot] updated from transifex 2018-03-09 01:19:11 +00:00
Nextcloud bot
2999d96a22 [tx-robot] updated from transifex 2018-03-06 01:19:05 +00:00
Nextcloud bot
9920546ec8 [tx-robot] updated from transifex 2018-03-05 01:19:10 +00:00
Nextcloud bot
eeceda539f [tx-robot] updated from transifex 2018-03-04 01:19:20 +00:00
Julius Härtl
ee262291ce Merge pull request #436 from nextcloud/fix-translations-dialog
Fix translations of the delete confirmation
2018-03-03 15:02:03 +01:00
Julius Härtl
858952a56f Fix translations of the delete confirmation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-03 14:09:21 +01:00
Julius Härtl
ad9ce6cd26 Merge pull request #432 from nextcloud/auto-remove-assignments
Auto remove assignments
2018-03-02 19:30:49 +01:00
Julius Härtl
d362e0ad0e No typehinting in deck yet
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-02 19:16:03 +01:00
Julius Härtl
31965bf40c Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-02 19:00:18 +01:00
Julius Härtl
691bbda056 Update view when removing sharees and track by correct property
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-02 17:54:16 +01:00
Julius Härtl
9b82779513 Remove deleted users from assignments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-02 17:54:16 +01:00
Julius Härtl
8cb92934b1 Merge pull request #428 from nextcloud/fix-assign-user-list
Fix assign user list
2018-03-02 17:52:54 +01:00
Julius Härtl
1b471b0fe8 Disable integration tests for now
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-03-02 16:14:39 +01:00
Nextcloud bot
537e9b35da [tx-robot] updated from transifex 2018-03-02 01:19:06 +00:00
Nextcloud bot
ad5967859e [tx-robot] updated from transifex 2018-03-01 01:18:59 +00:00
Julius Härtl
afa2d247aa Merge pull request #427 from nextcloud/workaround-delete-confirmation
Add confirmation dialog to delete options
2018-02-28 17:07:15 +01:00
Julius Härtl
76e3cc5061 Do not overwrite emtpy values
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-28 16:54:30 +01:00
Julius Härtl
8f5ded6a28 Track by correct property
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-28 16:49:00 +01:00
Julius Härtl
0e092d3495 Only return updated properties not resolvable ones
fixes #406

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-28 16:48:40 +01:00
Julius Härtl
f32721d1e6 Fix popover position of assigned users
fixes #385

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-28 12:10:05 +01:00
Julius Härtl
19a3466b18 Add confirmation dialog to delete options
this is only a temporary solution but it will probably safe some users from deleting their data by accident

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-28 10:01:39 +01:00
Julius Härtl
5d3f952d92 Merge pull request #423 from nextcloud/fix-userlist-limit
Force limit of users that do not match exactly
2018-02-25 10:40:44 +01:00
Nextcloud bot
d1b8e3cc5f [tx-robot] updated from transifex 2018-02-21 01:18:26 +00:00
Julius Härtl
efb7da6ca5 Force limit of users that do not match exactly
fixes #422

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-20 12:42:30 +01:00
Nextcloud bot
cc737cf250 [tx-robot] updated from transifex 2018-02-17 01:18:31 +00:00
Nextcloud bot
da373bafe0 [tx-robot] updated from transifex 2018-02-16 01:18:03 +00:00
Nextcloud bot
9e4d48ae36 [tx-robot] updated from transifex 2018-02-15 01:18:14 +00:00
Nextcloud bot
4d84d77d27 [tx-robot] updated from transifex 2018-02-14 01:18:02 +00:00
Nextcloud bot
0a82689284 [tx-robot] updated from transifex 2018-02-12 22:34:38 +00:00
Morris Jobke
a3e14ec732 Add l10n dir
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2018-02-12 23:28:17 +01:00
Morris Jobke
4a56995326 Fix tx config
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2018-02-12 22:57:14 +01:00
Nextcloud bot
eb262a13e4 [tx-robot] updated from transifex 2018-02-12 21:40:03 +00:00
Julius Härtl
21d84343ec Merge pull request #419 from nextcloud/unperl-app
Move transifex config for updated l10n script
2018-02-12 17:58:18 +01:00
Morris Jobke
431dfe3b15 Move transifex config for updated l10n script
See nextcloud/docker-ci#78 for details

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2018-02-12 16:54:50 +01:00
Julius Härtl
9bb474638d Update user list when acl is changed
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-09 09:28:08 +01:00
Julius Härtl
220adf708f Use actual acl list for assigning users
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-09 09:28:08 +01:00
Julius Härtl
f616f38e67 Fix bug when user selection was staying hidden
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-09 09:28:08 +01:00
Julius Härtl
8e51fdbb88 Only digest on card update not for every interval
and add various track by statements

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-09 09:27:22 +01:00
Nextcloud bot
d5bec8d19e [tx-robot] updated from transifex 2018-02-08 01:16:15 +00:00
Nextcloud bot
742c02cbbb [tx-robot] updated from transifex 2018-02-05 01:16:02 +00:00
Julius Härtl
27aa2adf0f Merge pull request #415 from nextcloud/add-homepage-389
Add Repo as homepage
2018-02-02 10:31:18 +01:00
Julius Härtl
79550fc843 Add Repo as homepage (fixes #389)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-02-01 23:28:18 +01:00
Nextcloud bot
ac982a72a4 [tx-robot] updated from transifex 2018-01-29 01:17:04 +00:00
Nextcloud bot
de0aeaa084 [tx-robot] updated from transifex 2018-01-24 01:16:50 +00:00
Nextcloud bot
e6f4929cea [tx-robot] updated from transifex 2018-01-23 01:17:07 +00:00
Nextcloud bot
f8fbcee618 [tx-robot] updated from transifex 2018-01-20 01:17:10 +00:00
Nextcloud bot
7ffe11e8cd [tx-robot] updated from transifex 2018-01-17 01:17:09 +00:00
Nextcloud bot
99fffe750d [tx-robot] updated from transifex 2018-01-16 01:17:11 +00:00
Nextcloud bot
ae4857b75e [tx-robot] updated from transifex 2018-01-15 01:16:37 +00:00
Nextcloud bot
27bab0ec4d [tx-robot] updated from transifex 2018-01-14 01:16:40 +00:00
Julius Härtl
8ca3e5d32e Bump drone images (#391)
* Bump drone images

Signed-off-by: Julius Härtl <jus@bitgrid.net>

* Use travis for codecov

Signed-off-by: Julius Härtl <jus@bitgrid.net>

* Just test against master in travis

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-13 12:26:27 +01:00
Julius Härtl
6227583917 Merge pull request #388 from cloud2018/translation
translate attributes in templates/part.card.php
2018-01-13 11:36:44 +01:00
cloud2018
5d10f834c5 translate attributes in templates/part.card.php
translate attributes title and placeholder in class "section-content card-details-assign-users" in templates/part.card.php
2018-01-12 21:38:47 +01:00
Julius Härtl
009734295c Add tests for stable13
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-12 15:24:59 +01:00
Julius Härtl
74c7530a4f Bump maser branch version and nc dependencies
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-12 15:18:13 +01:00
Julius Härtl
acc168e174 Merge pull request #384 from nextcloud/prepare-0.3.0
Prepare 0.3.0
2018-01-12 15:12:36 +01:00
Julius Härtl
6998a4a643 Fix jquery exclude
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-12 14:17:01 +01:00
Julius Härtl
2a6db83804 Bump version to 0.3.0 final and update CHANGELOG
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-12 10:31:16 +01:00
Julius Härtl
31e4d370c3 Exclude more files from build
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-12 10:28:04 +01:00
Julius Härtl
ce3e979452 Merge pull request #382 from nextcloud/small-prerelease-fixes
Small fixes
2018-01-12 10:16:53 +01:00
Nextcloud bot
4ec2ae2a61 [tx-robot] updated from transifex 2018-01-12 01:17:41 +00:00
Nextcloud bot
904eecd155 [tx-robot] updated from transifex 2018-01-11 01:17:43 +00:00
Julius Härtl
e70045f7d3 Hide "no actions" from current users avatar menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-10 10:54:12 +01:00
Julius Härtl
75f95db0b1 Fix undelete description not being translated
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-10 10:39:31 +01:00
Nextcloud bot
63d29ae533 [tx-robot] updated from transifex 2018-01-10 01:17:12 +00:00
Julius Härtl
59ac632d0e Merge pull request #377 from nextcloud/fix-label-style
Fix label style issue when list of labels is updated
2018-01-08 14:52:17 +01:00
Julius Härtl
b57e8e56fa Merge branch 'master' into fix-label-style 2018-01-08 14:38:42 +01:00
Julius Härtl
5b28365444 Merge pull request #376 from nextcloud/fix-avatar-stuff
Fix avatar issues
2018-01-08 14:38:05 +01:00
Julius Härtl
f55fb90cfa Fix label style issue when list of labels is updated
fixes #373

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-08 14:37:44 +01:00
Julius Härtl
c517dbdb77 Merge pull request #371 from nextcloud/minor-fixes
Various fixes
2018-01-08 13:44:46 +01:00
Julius Härtl
14d5af683e Show contacts menu for board owner
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-08 13:42:37 +01:00
Julius Härtl
e1e01c0e0d Unify avatar directive
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-08 13:35:49 +01:00
Julius Härtl
403629c91a Move unassign button to avatar menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-01-08 12:44:15 +01:00
Nextcloud bot
15d642efa4 [tx-robot] updated from transifex 2018-01-04 01:07:56 +00:00
Nextcloud bot
d3d888fb43 [tx-robot] updated from transifex 2017-12-31 01:07:33 +00:00
Nextcloud bot
5ac2b91542 [tx-robot] updated from transifex 2017-12-30 01:07:44 +00:00
Julius Härtl
de4e90b52e Check for undefined type when getting the acl string representation
fixes #367

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-22 12:40:31 +01:00
Julius Härtl
dc37dd2c60 Use separate object when editing card descriptions (fixes #369)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-22 12:37:57 +01:00
Julius Härtl
5d38f6a176 Fix board bullet opacity (fixes #364)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-22 12:20:21 +01:00
Julius Härtl
70d28ec376 Remove duplicate and unused id
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-22 12:16:29 +01:00
Julius Härtl
8cec7cb571 Check if board is undefined (fixes #366)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-22 12:16:08 +01:00
Nextcloud bot
52ac77ea90 [tx-robot] updated from transifex 2017-12-21 01:07:11 +00:00
Nextcloud bot
dd0c26b298 [tx-robot] updated from transifex 2017-12-19 01:07:09 +00:00
Julius Härtl
19dda17e71 Merge pull request #361 from nextcloud/prepare-0.3.0-beta1
Prepare 0.3.0 beta1
2017-12-17 19:36:27 +01:00
Julius Härtl
cd6f661dc9 Merge pull request #362 from nextcloud/php-7.2
Add drone test for php 7.2
2017-12-17 19:36:09 +01:00
Julius Härtl
5dcf52b489 Allow failure for stable12/php7.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 19:15:19 +01:00
Julius Härtl
ea5203049b Only test syntax of the app
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:56:10 +01:00
Julius Härtl
a388a04a06 Update drone matrix
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:45:08 +01:00
Julius Härtl
4393b44e0d Add php version to travis
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:34:36 +01:00
Julius Härtl
d3b34fc3f6 Add drone test for php 7.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:33:05 +01:00
Julius Härtl
cd81192cae Merge branch 'master' into prepare-0.3.0-beta1 2017-12-17 18:25:52 +01:00
Julius Härtl
d33cce3725 Fix remaining bug with save indicator
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:20:52 +01:00
Julius Härtl
5ffef2fd3a Fix section headers being shrinked
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:10:22 +01:00
Julius Härtl
d7da990a55 Fix small styling bugs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 18:00:16 +01:00
Julius Härtl
95f4e4b014 Update stack data after label update request has been processed
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 17:59:55 +01:00
Julius Härtl
66cfa72839 Remove apha warning
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 17:45:55 +01:00
Julius Härtl
f707bed675 Update changelog and krankerl exclude list
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 17:45:02 +01:00
Julius Härtl
173b0f4756 Move building to krankerl
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 17:45:01 +01:00
Julius Härtl
2425018897 Bump version to 0.3.0-beta1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-17 17:45:01 +01:00
Julius Härtl
415e5b5a1a Merge pull request #358 from nextcloud/add-tooltips
Add tooltips and support for contacts menu at avatars
2017-12-17 17:44:35 +01:00
Julius Härtl
eb0810de27 Merge pull request #359 from nextcloud/fix-autosave
Fix save indicator for description (fixes #354)
2017-12-17 17:44:23 +01:00
Julius Härtl
0af0124c12 Merge pull request #360 from nextcloud/stable12-fixes
Add breadcrumb flex css to keep styles correct on stable12
2017-12-17 17:44:06 +01:00
Julius Härtl
ebe3666b9f Add breadcrumb flex css to keep styles correct on stable12
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 17:36:32 +01:00
Julius Härtl
183c2665eb Show tooltip with displayname and add contactsmenu to avatars
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 17:07:30 +01:00
Julius Härtl
63da73600f Add tooltip to assigned users and info button
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 11:21:59 +01:00
Julius Härtl
253e60f88a Fix save indicator for description (fixes #354)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 10:48:02 +01:00
Julius Härtl
1d5ed11a8c Make the whole stack a drop target
fixes #307

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 10:47:48 +01:00
Julius Härtl
28208f168d Improve card positioning when dragging
fixes #307
fixes #236

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 10:47:48 +01:00
Julius Härtl
84502db00b Fix scrolling on mobile browsers
fixes #164

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-16 10:47:48 +01:00
Nextcloud bot
6d8afe6252 [tx-robot] updated from transifex 2017-12-15 14:53:55 +00:00
Nextcloud bot
d674abb7b6 [tx-robot] updated from transifex 2017-12-09 01:16:06 +00:00
Julius Härtl
7200e17d33 Fix some codestyle issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
1ace5de9e6 Make sure both board lists are initialized
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
5394d0f59b Do some cleanup
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
d386ab80d4 Fix eslint errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
9fa88cac6b Use settings icon in board list as well
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
827aceecda Adjust board header actions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
9cefecb45d Add share icon and archived view state to the breadcrumbs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
a48169de18 Rework parameter handling, highlight active card and allow switching tabs in the board sidebar
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
fbf48e1be0 Fix color loading
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
c8d5f179be Adapt new breadcrumb layout
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
137f429cfa Fix tests for acl type
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
367873beaa Add avatars to share selection
fix #208

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
a8aab8d049 Move to numeric acl types
fixes #297

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
ef64dfc5a2 Fix bug when board list was not in sync when adding a new one
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-08 20:12:53 +01:00
Julius Härtl
7c552e9a52 Only send overdue notifications for unarchived cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-12-07 20:20:47 +01:00
Nextcloud bot
02724fd4eb [tx-robot] updated from transifex 2017-12-04 01:16:01 +00:00
Nextcloud bot
89643fb681 [tx-robot] updated from transifex 2017-12-01 01:16:14 +00:00
Julius Härtl
1b19ba2385 Propagate card update to StackService
fixes #203

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-29 23:05:43 +01:00
Nextcloud bot
8b9ae38303 [tx-robot] updated from transifex 2017-11-28 01:15:10 +00:00
Julius Härtl
175f47be5b Remove legacy css build and move scss imports to the top
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
8cfaca8a75 Fix overlooked rebasing error
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
03fc1fd0f2 Fix popover hiding
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
066f67ef7b Fix popovermenus on 13
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
081b3520a0 CSS: restore variables that are not part of the server
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
8324410578 CSS: Move icons to separate file
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
b3db3daf91 Add fix for nc<13 app menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
aa5e0a1d5e Move variables to legacy scss
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
c38039ad80 Fix menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
a9a5b6a52a Fix board updating reset
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
e1793b5c31 Performance optimizations in list template
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
f533f2bd80 Refactor boardlist loading process
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
35fc02734f Navigation: make editing work again
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Julius Härtl
91261f2e4e Frontend: Update app menu to fit new NC13 flex layout
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-27 21:14:04 +01:00
Nextcloud bot
c519e1b841 [tx-robot] updated from transifex 2017-11-19 01:14:54 +00:00
Nextcloud bot
8668a900b1 [tx-robot] updated from transifex 2017-11-18 01:15:45 +00:00
Nextcloud bot
4ca45a5629 [tx-robot] updated from transifex 2017-11-17 01:14:55 +00:00
Nextcloud bot
78020635c8 [tx-robot] updated from transifex 2017-11-14 01:14:49 +00:00
Julius Härtl
abc039a634 Fix issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-13 09:40:28 +01:00
Julius Härtl
afec4f211c eslint auto fix
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-13 09:40:28 +01:00
Julius Härtl
47b51c512d Add eslintrc
Signed-off-by: Julius Härtl <jus@bitgrid.net>

Make run-eslint.sh executable

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-13 09:40:28 +01:00
Julius Härtl
f8f755f31e Add eslint drone test
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-13 09:40:28 +01:00
Julius Härtl
a2adcf2487 Add default for injected value since out app container is not queried during update
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-11 12:05:46 +01:00
Nextcloud bot
650313254f [tx-robot] updated from transifex 2017-11-11 01:16:12 +00:00
Julius Härtl
5dd91f4261 Tests: remove NC11 from travis
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-10 11:13:47 +01:00
Julius Härtl
8499a28921 Drop support for NC11
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-10 11:13:47 +01:00
Nextcloud bot
c1bc287fe1 [tx-robot] updated from transifex 2017-11-10 01:15:37 +00:00
Nextcloud bot
68b3c0216d [tx-robot] updated from transifex 2017-11-08 01:14:39 +00:00
Nextcloud bot
58885f6598 [tx-robot] updated from transifex 2017-11-07 01:13:46 +00:00
Nextcloud bot
af3201b293 [tx-robot] updated from transifex 2017-11-05 01:13:35 +00:00
Jan-Christoph Borchardt
d2dde30098 Change style of add card buttons to be less distracting
Signed-off-by: Jan-Christoph Borchardt <hey@jancborchardt.net>
2017-11-03 15:05:45 +01:00
Nextcloud bot
10c836d864 [tx-robot] updated from transifex 2017-11-03 01:14:22 +00:00
Nextcloud bot
ff2503f857 [tx-robot] updated from transifex 2017-11-01 01:13:21 +00:00
Nextcloud bot
fcd5918686 [tx-robot] updated from transifex 2017-10-31 01:13:00 +00:00
Riccardo Padovani
8213b39949 Fix #308 - Document title doesn't update when renaming active board
Signed-off-by: Riccardo Padovani riccardo@rpadovani.com
2017-10-28 17:12:28 +02:00
Nextcloud bot
88474bb11b [tx-robot] updated from transifex 2017-10-27 00:12:59 +00:00
Nextcloud bot
546b71926a [tx-robot] updated from transifex 2017-10-26 00:13:13 +00:00
Riccardo Padovani
37967f5bfb Simplify code
Signed-off-by: Riccardo Padovani <riccardo@rpadovani.com>
2017-10-25 22:27:26 +02:00
Riccardo Padovani
cd651ebda5 When creating a board, choose the less used color
Fix issue #245

Signed-off-by: Riccardo Padovani <riccardo@rpadovani.com>
2017-10-25 22:27:26 +02:00
Nextcloud bot
5f69c56c3a [tx-robot] updated from transifex 2017-10-25 00:13:25 +00:00
Brandon Raitt
3f8806c81f Remove empty title tags.
Signed-off-by: Brandon Raitt <npm.pxoink@gmail.com>
2017-10-24 12:11:46 +02:00
Brandon Raitt
32a7c5f765 Update requested changes for accessibility. 2017-10-24 12:11:46 +02:00
Brandon Raitt
7b45a92a60 Update various template files to increase accessibility support.
Signed-off-by: Brandon Raitt <npm.pxoink@gmail.com>
2017-10-24 12:11:46 +02:00
Nextcloud bot
7b88d56e7a [tx-robot] updated from transifex 2017-10-24 00:13:35 +00:00
Julius Härtl
19b13456a5 Notifications: Fix sending notifications to users with numeric uid
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:33 +02:00
Julius Härtl
53b1af9dbe Frontend: Remove unrequired css and fix language strings
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
3037effb5a Card: Fix styling issue when only duedate is set
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Marin Treselj
8357599361 Add some space between multiple assignees
Signed-off-by: Marin Treselj <marin.treselj@forlagshuset.no>
2017-10-23 22:12:08 +02:00
Marin Treselj
5d54772b1b Give 44*44px clickable area for the icon-more button
Signed-off-by: Marin Treselj <marin.treselj@forlagshuset.no>
2017-10-23 22:12:08 +02:00
Marin Treselj
afa16ee3ba Use default (larger) avatar size, default (smaller) action bar height
Signed-off-by: Marin Treselj <marin.treselj@forlagshuset.no>
2017-10-23 22:12:08 +02:00
Julius Härtl
090d99a360 Frontend: fix warnings in withoutAssignedUsers filter
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
a322c7a3b5 Tests: Add integration test for user assignment
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
1f3276acee Card: Only show users that are not already assigned
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
dc917b1e5d Fix inspection issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
ff2d96a1fb Fix tests that invoke findUsers
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
a56ceb348d Fix issue with new findUser implementation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
8cb95c4105 Frontend: Fix codacy errors
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
28d6f4196e Tests: Fix tests for user assignment
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
99c31d3c00 Card: Show assigned users on board
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
02ec4ae9d1 Frontend: cleanup dom structure and css
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
f42e3eb857 Frontend: Fix assigning/removing users
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
447cb80573 Backend: assign/remove user impelementation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
01f11d1be9 Frontend: Add UI for user assignment
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
f746588111 Backend: Get list of users to assign
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
458a795460 Fix card headings
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Julius Härtl
4cf746dd6f WIP: assign users
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-23 22:12:08 +02:00
Morris Jobke
4fa37f0548 Border-radius does not need the vendor prefixes anymore
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2017-10-23 21:04:26 +02:00
Nextcloud bot
fa70d329cd [tx-robot] updated from transifex 2017-10-21 00:12:48 +00:00
Nextcloud bot
98978b019a [tx-robot] updated from transifex 2017-10-20 00:13:00 +00:00
Julius Härtl
07da13bdf9 Fix assigning newly created labels
fixes #252

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-19 11:46:41 +02:00
Riccardo Padovani
794fcb76b8 Update part.board.sidebarView.php
Don't use ng-keyup as per merge review

Signed-off-by: Riccardo Padovani riccardo@rpadovani.com
2017-10-19 11:41:35 +02:00
Riccardo Padovani
2ca1e1eed8 Ability to save tag changes with enter
Fix issue #306

Signed-off-by: Riccardo Padovani <riccardo@rpadovani.com>
2017-10-19 11:41:35 +02:00
Nextcloud bot
063bf59ddb [tx-robot] updated from transifex 2017-10-18 00:12:47 +00:00
Nextcloud bot
5fde7a19bf [tx-robot] updated from transifex 2017-10-17 00:12:51 +00:00
Julius Härtl
6901314382 Remove unused code
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
c45bb71084 Fix phpstorm inspection issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
320f2bf5c8 JS: Fix scrutinizer warnings and indentation for services
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
9014ae1490 JS: Fix scrutinizer warnings and indentation for filters
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
516e396a58 JS: Fix scrutinizer warnings and indentation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
9b9c1432f2 Tests: Add Nextcloud public api for better scrutinizer inspection
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-17 01:17:37 +02:00
Julius Härtl
8d39fd9ad1 Card: Auto save while typing
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-16 22:39:45 +02:00
Nextcloud bot
3d54d129b9 [tx-robot] updated from transifex 2017-10-14 02:33:28 +00:00
Julius Härtl
05395dbfbe Fix mysql datetime format
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-10 17:50:01 +02:00
Julius Härtl
1b0ac8c1e2 Update appstore building excludes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-08 11:51:04 +02:00
Nextcloud bot
4fc96e40ff [tx-robot] updated from transifex 2017-10-07 00:12:56 +00:00
Nextcloud bot
8b4eac0854 [tx-robot] updated from transifex 2017-10-06 00:13:00 +00:00
Nextcloud bot
1d4c019588 [tx-robot] updated from transifex 2017-10-05 00:12:52 +00:00
Nextcloud bot
dbef69e9ce [tx-robot] updated from transifex 2017-10-04 00:12:43 +00:00
Julius Härtl
7c6e48d15b Notifications: Fix issues with user fetching
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
d9c3aa44b9 Tests: Add tests for sharing a board notifications
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
ac1b1e826f Fix scritinizer issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
3c2ee00ad7 Notifications: Add more tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
6a575baadd Notifications: remove pending notifications if duedate is changed
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
f8c9bc1c7c Cron: Ignore unused parameters in codacy
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
e1ac6b0a9e Notifications: Add test for Notifier
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
ed55b0db51 Notifications: Do not use rich text for board/card
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
e8ecfce134 Notifications: Workaround to use announcement type for now
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
07132126a9 Add separate NotificationHelper to keep code together
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
a346e215cd Send notifications when a card is overdue
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Julius Härtl
52fc971529 Send notifications when a board gets shared
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 23:00:09 +02:00
Nextcloud bot
e0bab217a0 [tx-robot] updated from transifex 2017-10-03 00:12:45 +00:00
Julius Härtl
f770b2e7af Fix card action menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-01 17:06:16 +02:00
Julius Härtl
0d3916d450 Fix issues with new header levels
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-01 17:05:56 +02:00
Nextcloud bot
8fbd400c3c [tx-robot] updated from transifex 2017-10-01 00:12:46 +00:00
Nextcloud bot
fa9067b47a [tx-robot] updated from transifex 2017-09-30 00:12:53 +00:00
Nextcloud bot
af83e8a3d0 [tx-robot] updated from transifex 2017-09-29 00:12:52 +00:00
Julius Härtl
e8ba47564c Merge pull request #304 from nextcloud/remove-console-log
Frontend: remove javascript console.log statements
2017-09-28 13:27:30 +02:00
Julius Härtl
ea1b597fc0 Frontend: remove javascript console.log statements
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-28 11:48:18 +02:00
Regina M. Sipos
5312751cb8 Fix further uses of the word label to tag 2017-09-28 11:47:28 +02:00
Regina M. Sipos
a2bef30759 Change the word labels to tags for consistency 2017-09-28 11:47:28 +02:00
Nextcloud bot
b2f58b3404 [tx-robot] updated from transifex 2017-09-27 00:12:46 +00:00
Nextcloud bot
d212a426f2 [tx-robot] updated from transifex 2017-09-19 00:12:52 +00:00
Julius Härtl
4689619ba4 Bump version to 0.3.0 development
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-18 19:29:40 +02:00
Nextcloud bot
e2e8e98c1f [tx-robot] updated from transifex 2017-09-18 00:14:45 +00:00
Julius Härtl
f9b9973c29 Fix positioning of card description heading
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-16 15:55:30 +02:00
Julius Härtl
c3ba8fa536 Use proper heading levels
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-16 15:55:30 +02:00
Julius Härtl
e1d1e0c2c8 Align stacks to start (fixes #290)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-16 15:55:20 +02:00
Julius Härtl
aaf04ffbd4 Fix card positioning when draging them around
fixes #293

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-16 15:55:06 +02:00
Nextcloud bot
1d08c67353 [tx-robot] updated from transifex 2017-09-12 00:12:25 +00:00
Julius Härtl
2706dfaf4e Acl: Fix wrong permission type being set
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-07 23:57:03 +02:00
Julius Härtl
830f8a13fc Prepare 0.2.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-07 13:03:23 +02:00
Nextcloud bot
a15997a2c8 [tx-robot] updated from transifex 2017-09-07 00:12:26 +00:00
Nextcloud bot
287e1fe2d0 [tx-robot] updated from transifex 2017-09-03 00:12:19 +00:00
Julius Härtl
ec5389beb3 Disable draging of the sidebar
Fixes #262 #241

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-01 16:21:25 +02:00
Julius Härtl
8d8c7587d7 Use archive state to disable datepicker/labels
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-01 16:20:17 +02:00
Julius Härtl
c67b5eab6b Fix datepicker layout
closes #283

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-01 16:20:17 +02:00
Julius Härtl
daee347ea5 Add site url to jekyll config
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-27 10:26:48 +02:00
Robert Korulczyk
1765ab2c34 Add scrollbar for too wide pre tags.
Signed-off-by: Robert Korulczyk <robert@korulczyk.pl>
2017-08-26 18:07:44 +02:00
Robert Korulczyk
0cc322f133 Fix white-space styles for pre code blocks
Signed-off-by: Robert Korulczyk <robert@korulczyk.pl>
2017-08-26 18:07:44 +02:00
Nextcloud bot
857e22a8c9 [tx-robot] updated from transifex 2017-08-25 00:13:01 +00:00
Nextcloud bot
a8f3119d26 [tx-robot] updated from transifex 2017-08-22 00:12:33 +00:00
Nextcloud bot
ef52ab5bca [tx-robot] updated from transifex 2017-08-21 00:12:26 +00:00
Nextcloud bot
22c20426b3 [tx-robot] updated from transifex 2017-08-19 00:12:33 +00:00
Nextcloud bot
42fa3fa039 [tx-robot] updated from transifex 2017-08-12 00:12:16 +00:00
Morris Jobke
2a8a6784f1 Merge pull request #280 from nextcloud/drone-update
Update syntax to drone 0.8
2017-08-09 12:17:04 +02:00
Morris Jobke
d50cdcb343 Update syntax to drone 0.8
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2017-08-09 11:15:25 +02:00
Julius Härtl
1cbfd1b6bf Use ISO8601 date format for duedate
Fixes issues with Date.parse on webkit based browsers
closes #240

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-08 22:12:38 +02:00
Artem Anufrij
38ec1abfa5 Merge pull request #278 from nextcloud/fix-card-editing-placeholder
Fix card description placeholder
2017-08-08 20:29:53 +02:00
Julius Härtl
ac453636a9 Fix card description placeholder
fixes #261

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-08 16:20:31 +02:00
Julius Härtl
698f1eea25 Fix shared icon in sidebar
closes #247

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-08 16:11:36 +02:00
Nextcloud bot
8e858fac5c [tx-robot] updated from transifex 2017-08-08 00:12:09 +00:00
Artem Anufrij
ce7c5d6196 Merge pull request #275 from nextcloud/fix-tests
Fix tests
2017-08-08 00:15:35 +02:00
Julius Härtl
9cfb561c1c Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-06 14:25:10 +02:00
Nextcloud bot
bf06ec29ca [tx-robot] updated from transifex 2017-08-05 00:12:06 +00:00
jacestk
1ec13802af IE11 Fixes
Fixes for displaying AngularJS style in IE11
replace style="css{angular}" by ng-style="{angular}css"
2017-08-04 15:46:21 +01:00
Julius Härtl
86385f0d6f Fix drag-zone when sorting cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-08-04 12:55:32 +01:00
Nextcloud bot
3c12c84c7b [tx-robot] updated from transifex 2017-08-02 00:12:19 +00:00
Nextcloud bot
168c83fea0 [tx-robot] updated from transifex 2017-08-01 00:12:33 +00:00
Nextcloud bot
04ba531e2f [tx-robot] updated from transifex 2017-07-30 00:11:58 +00:00
Nextcloud bot
460b55f002 [tx-robot] updated from transifex 2017-07-29 00:12:29 +00:00
Morris Jobke
850cecb0b9 Run drone push only on specific branches
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
2017-07-27 17:44:34 +02:00
Nextcloud bot
ba6e980cba [tx-robot] updated from transifex 2017-07-27 00:11:59 +00:00
Nextcloud bot
b28e549353 [tx-robot] updated from transifex 2017-07-25 00:11:56 +00:00
Nextcloud bot
b3c16a5a92 [tx-robot] updated from transifex 2017-07-23 00:11:26 +00:00
Jan-Christoph Borchardt
2b7d1b1085 Merge pull request #238 from nextcloud/fix-drag-empty-stack
Add min-height to card list and merge duplicate rules for .card
2017-07-14 10:24:19 +02:00
Nextcloud bot
c8c32eba8c [tx-robot] updated from transifex 2017-07-14 00:12:19 +00:00
Nextcloud bot
124403f8aa [tx-robot] updated from transifex 2017-07-13 00:12:12 +00:00
Nextcloud bot
f61377d95f [tx-robot] updated from transifex 2017-07-11 00:12:21 +00:00
Nextcloud bot
ec2b0d2c7d [tx-robot] updated from transifex 2017-07-08 00:12:00 +00:00
Marin Treselj
c68275c325 Merge branch 'master' into fix-drag-empty-stack 2017-07-07 23:01:43 +02:00
Nextcloud bot
e67aee4019 [tx-robot] updated from transifex 2017-07-07 00:11:51 +00:00
Julius Härtl
cfcaa6939b Add min-height to card list and merge duplicate rules for .card
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-07-06 16:51:07 +02:00
Julius Härtl
631a96f8da Add viewbox to icon
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-07-06 13:42:43 +02:00
Artem Anufrij
de800f79fb fixed margin for DnD class
Signed-off-by: Artem Anufrij <artem.anufrij@live.de>
2017-07-06 13:32:41 +02:00
Artem Anufrij
43d46830d1 changed space between cards
Signed-off-by: Artem Anufrij <artem.anufrij@live.de>
2017-07-06 13:32:41 +02:00
Artem Anufrij
14c90e53ce fix for due date control
Signed-off-by: Artem Anufrij <artem.anufrij@live.de>
2017-07-06 13:27:34 +02:00
Nextcloud bot
a14b74223b [tx-robot] updated from transifex 2017-07-06 00:12:19 +00:00
325 changed files with 35711 additions and 2948 deletions

View File

@@ -1,12 +1,14 @@
pipeline:
clone:
clone:
git:
image: plugins/git
depth: 1
pipeline:
check-app-compatbility:
image: nextcloudci/php5.6:php5.6-3
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- DB=sqlite
commands:
# Pre-setup steps
@@ -20,57 +22,108 @@ pipeline:
when:
matrix:
TESTS: check-app-compatbility
signed-off-check:
image: nextcloudci/php7.0:php7.0-2
check-app-compatbility-14:
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- 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
- php ./build/signed-off-checker.php
# 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-14
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:
- APP_NAME=deck
- CORE_BRANCH=stable14
- DB=sqlite
commands:
- wget https://raw.githubusercontent.com/nextcloud/server/master/build/signed-off-checker.php
- php ./signed-off-checker.php
secrets: [ github_token ]
when:
matrix:
TESTS: signed-off-check
syntax-php5.6:
image: nextcloudci/php5.6:php5.6-3
image: nextcloudci/php5.6:php5.6-8
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- 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
- composer install
- ./lib/composer/bin/parallel-lint --exclude lib/composer/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude lib/composer/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
when:
matrix:
TESTS: syntax-php5.6
syntax-php7.0:
image: nextcloudci/php7.0:php7.0-2
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- 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
- composer install
- ./lib/composer/bin/parallel-lint --exclude lib/composer/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude lib/composer/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
when:
matrix:
TESTS: syntax-php7.0
php5.6:
image: nextcloudci/php5.6:php5.6-7
syntax-php7.1:
image: nextcloudci/php7.1:php7.1-15
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- DB=sqlite
commands:
- composer install
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
when:
matrix:
TESTS: syntax-php7.1
syntax-php7.2:
image: nextcloudci/php7.2:php7.2-9
environment:
- APP_NAME=deck
- CORE_BRANCH=stable14
- DB=sqlite
commands:
- composer install
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
when:
matrix:
TESTS: syntax-php7.2
php5.6:
image: nextcloudci/php5.6:php5.6-8
environment:
- APP_NAME=deck
- CORE_BRANCH=stable13
- DB=sqlite
commands:
- apt update && apt-get -y install php5-xdebug
@@ -81,22 +134,17 @@ pipeline:
- cd ../server/
- ./occ app:enable $APP_NAME
- cd apps/$APP_NAME
- composer install
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
# Create coverage report
- wget https://codecov.io/bash -O codecov.sh
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t f6375299-4832-487e-b831-091772ab0384; fi"
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t f6375299-4832-487e-b831-091772ab0384; fi"
when:
matrix:
TESTS: php5.6
php7.0:
image: nextcloudci/php7.0:php7.0-8
image: nextcloudci/php7.0:php7.0-17
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- DB=sqlite
commands:
# Pre-setup steps
@@ -106,35 +154,55 @@ pipeline:
- php occ app:enable deck
- cd apps/$APP_NAME
# Run phpunit tests
- composer install
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
when:
matrix:
TESTS: php7.0
php7.1:
image: nextcloudci/php7.1:php7.1-11
image: nextcloudci/php7.1:php7.1-15
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- DB=sqlite
commands:
# Pre-setup steps
- yum -y install wget
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
- cd ../server/
- php occ app:enable deck
- cd apps/$APP_NAME
- composer install
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
when:
matrix:
TESTS: php7.1
integration:
image: nextcloudci/integration-php7.0:integration-php7.0-3
php7.2:
image: nextcloudci/php7.2:php7.2-9
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- CORE_BRANCH=stable14
- 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/
- php occ app:enable deck
- cd apps/$APP_NAME
- composer install
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml
- phpunit -c tests/phpunit.integration.xml --coverage-clover build/php-integration.coverage.xml
when:
matrix:
TESTS: php7.2
integration:
image: nextcloudci/integration-php7.0:integration-php7.0-6
environment:
- APP_NAME=deck
- CORE_BRANCH=stable14
- DB=sqlite
commands:
# Pre-setup steps
@@ -148,26 +216,38 @@ pipeline:
when:
matrix:
TESTS: integration
eslint:
image: nextcloudci/eslint:eslint-1
commands:
- ./run-eslint.sh
when:
matrix:
TESTS: eslint
jsbuild:
image: mhart/alpine-node:6.8.0
commands:
- apk add --no-cache git
- cd js
- npm install --deps
- ./node_modules/.bin/bower --allow-root install
- apk add --no-cache make
- make build-js
when:
matrix:
TESTS: jsbuild
matrix:
include:
- TESTS: check-app-compatbility
- TESTS: check-app-compatbility-13
- TESTS: check-app-compatbility-14
- TESTS: signed-off-check
- TESTS: syntax-php5.6
- TESTS: syntax-php7.0
- TESTS: syntax-php7.1
- TESTS: syntax-php7.2
- TESTS: php5.6
- TESTS: php7.0
- TESTS: php7.1
- TESTS: php7.2
- TESTS: eslint
- TESTS: jsbuild
- TESTS: integration
#- TESTS: integration
branches: [ master, stable* ]

9
.eslintignore Normal file
View File

@@ -0,0 +1,9 @@
/js/tests/*
/js/vendor/*
/js/legacy/*
/js/node_modules/*
/js/public/*
/karma.conf.js
/tests/*
/l10n/*

43
.eslintrc.yml Normal file
View File

@@ -0,0 +1,43 @@
root: true
extends:
- eslint:recommended
env:
browser: true
amd: true
es6: true
globals:
global: false
app: false
angular: false
$: false
escapeHTML: false
OC: false
OCA: false
t: false
oc_current_user: false
oc_requesttoken: false
Clipboard: false
oc_defaults: false
parserOptions:
ecmaVersion: 6
sourceType: "module"
rules:
curly: error
eqeqeq: ["error", "smart"]
guard-for-in: error
no-console: off
no-fallthrough: error
no-mixed-spaces-and-tabs: error
no-unused-vars: warn
no-useless-escape: warn
no-use-before-define: error
semi: ["error", "always"]
indent:
- error
- tab
- SwitchCase: 1

View File

@@ -1,79 +1,97 @@
### Steps to reproduce
1.
2.
3.
### Expected behaviour
Tell us what should happen
### Actual behaviour
Tell us what happens instead
### Server configuration
<!--
You can use the Issue Template application to prefill most of the required information: https://apps.nextcloud.com/apps/issuetemplate
-->
**Operating system**:
**Web server:**
**Database:**
**PHP version:**
**Nextcloud version:** (see Nextcloud admin page)
**Where did you install Nextcloud from:**
**Signing status:**
```
Login as admin user into your Nextcloud and access
http://example.com/index.php/settings/integrity/failed
paste the results here.
```
**List of activated apps:**
```
If you have access to your command line run e.g.:
sudo -u www-data php occ app:list
from within your Nextcloud installation folder
```
**Nextcloud configuration:**
```
If you have access to your command line run e.g.:
sudo -u www-data php occ config:list system
from within your Nextcloud installation folder
or
Insert your config.php content here
Make sure to remove all sensitive content such as passwords. (e.g. database password, passwordsalt, secret, smtp password, …)
```
**Are you using an external user-backend, if yes which one:** LDAP/ActiveDirectory/Webdav/...
### Client configuration
**Browser:**
**Operating system:**
### Logs
#### Nextcloud log (data/nextcloud.log)
```
Insert your Nextcloud log here
```
#### Browser log
```
Insert your browser log here, this could for example include:
a) The javascript console log
b) The network log
c) ...
```
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Client details:**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
- Device: [e.g. iPhone6, desktop]
<details>
<summary>Server details</summary>
<!--
You can use the Issue Template application to prefill most of the required information: https://apps.nextcloud.com/apps/issuetemplate
-->
**Operating system**:
**Web server:**
**Database:**
**PHP version:**
**Nextcloud version:** (see Nextcloud admin page)
**Where did you install Nextcloud from:**
**Signing status:**
```
Login as admin user into your Nextcloud and access
http://example.com/index.php/settings/integrity/failed
paste the results here.
```
**List of activated apps:**
```
If you have access to your command line run e.g.:
sudo -u www-data php occ app:list
from within your Nextcloud installation folder
```
**Nextcloud configuration:**
```
If you have access to your command line run e.g.:
sudo -u www-data php occ config:list system
from within your Nextcloud installation folder
or
Insert your config.php content here
Make sure to remove all sensitive content such as passwords. (e.g. database password, passwordsalt, secret, smtp password, …)
```
**Are you using an external user-backend, if yes which one:** LDAP/ActiveDirectory/Webdav/...
</details>
<details>
<summary>Logs</summary>
#### Nextcloud log (data/nextcloud.log)
```
Insert your Nextcloud log here
```
#### Browser log
```
Insert your browser log here, this could for example include:
a) The javascript console log
b) The network log
c) ...
```
</details>

View File

@@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

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

@@ -0,0 +1,17 @@
* Resolves: # <!-- related github 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

6
.gitignore vendored
View File

@@ -1,7 +1,11 @@
js/node_modules/*
js/vendor/
build/
js/public/
js/build/
build/
css/style.css
css/vendor.css
tests/integration/vendor/
tests/integration/composer.lock
vendor/
*.lock

View File

@@ -1,36 +1,35 @@
language: php
dist: trusty
sudo: required
services:
- mysql
php:
- 5.6
- 7
- 7.0
- 7.1
- 7.2
env:
matrix:
- CORE_BRANCH=master DB=mysql
- CORE_BRANCH=stable12 DB=mysql
- CORE_BRANCH=stable11 DB=mysql
- CORE_BRANCH=stable14 DB=mysql
before_install:
- wget https://phar.phpunit.de/phpunit-5.7.phar
- chmod +x phpunit-5.7.phar
- mkdir bin
- sudo mv phpunit-5.7.phar bin/phpunit
- mv phpunit-5.7.phar bin/phpunit
- export PATH="$PWD/bin:$PATH"
- phpunit --version
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
- bash ./before_install.sh deck $CORE_BRANCH $DB
- cd ../server
- ./occ app:enable deck
- php -S localhost:8080 &
before_script:
- cd apps/deck
script:
- composer install
- make test-unit
after_success:
- bash <(curl -s https://codecov.io/bash)
after_failure:
- cat ../../data/nextcloud.log

View File

@@ -3,7 +3,7 @@ host = https://www.transifex.com
lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja
[nextcloud.deck]
file_filter = <lang>/deck.po
source_file = templates/deck.pot
file_filter = translationfiles/<lang>/deck.po
source_file = translationfiles/templates/deck.pot
source_lang = en
type = PO

View File

@@ -1,6 +1,111 @@
# Changelog
All notable changes to this project will be documented in this file.
## 0.5.0 - 2018-11-15
### Added
- Activity stream for board and cards
- Comments on cards
- Use users locale format on date picker
- Compact display mode
- Card title inline editing
- REST API
- Empty content view for board lists
- Undo for card and stack deletion
- Show tag name on board
- Notify users about card assignments
- Add shortcut to assign a card to yourself
- Improved view for printing
- Support for Nextcloud 15
### Fixed
- Accesibility improvements
- Don't allow empty card titles
- Improved checkbox handling in markdown
## 0.4.0 - 2018-07-11
### Added
- Attach files to cards
- 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
- Improve frontend data management
- Fix bug the user list being empty on some occasions
## 0.3.0 - 2018-01-12
### Added
- Allow to assign users to cards
- Emit notifications for overdue cards
- Emit notifications if boards gets shared to a user
- Add support for Nextcloud 13
- Simplify layout for cleaner user experience
- Add contacts menu to avatars
- Automatically save card description on inactivity
### Fixed
- Fix card dragging behaviour
- Fix scrolling and dragging on mobile
- Various fixes when data is not syncronized between different views
- Improved performance
- Update document title when renaming a board
- Automatically chose the least used color
- Improve accessibility
- Fix issue when assigning labels after creating them
- Allow to save tag changes with enter
- Fix bug when removing labels changed the color of the remaining ones
- Fix issues with auto saving of card descriptions
## 0.2.8 - 2017-11-26
### Fixed
- Drop support for NC 13, since that will only be supported by the next version of Deck
## 0.2.7 - 2017-11-10
### Fixed
- Fix bug that caused update to fail
## 0.2.6 - 2017-11-10
### Fixed
- Fix duedates not being updated with MySQL databases
## 0.2.5 - 2017-11-08
### Fixed
- Fix duedates not being saved with MySQL databases
## 0.2.4 - 2017-10-08
### Fixed
- Fix card action menu not being accessible
## 0.2.3 - 2017-09-23
### Fixed
- Fix delete stack button being not available
- Fix acl issues with PostgreSQL
## 0.2.2 - 2017-09-07
### Fixed
- Various frontend fixes
- Fix sidebar drag issues
- Improvements for IE11
- Fix bug when draging a card to an empty stack
## 0.2.1 - 2017-07-04
### Added

View File

@@ -12,29 +12,30 @@ sign_dir=$(build_dir)/sign
cert_dir=$(HOME)/.nextcloud/certificates
default: build
default: package
clean-build:
rm -rf $(build_dir)
clean-dist:
rm -rf js/node_modules
rm -rf js/vendor
install-deps:
cd js && npm install --deps
cd js && ./node_modules/.bin/bower install
install-deps: install-deps-js
composer install
build: build-js build-css
install-deps-js:
cd js && npm install
build-js: install-deps
cd js && ./node_modules/.bin/grunt build
build: install-deps build-js
build-css: install-deps
./js/node_modules/node-sass/bin/node-sass --output-style compressed css/legacy.scss css/style.css
build-js: install-deps-js
cd js && npm run build
build-js-dev: install-deps
cd js && npm run dev
watch:
cd js && ./node_modules/.bin/grunt watch
cd js && npm run watch
# appstore: clean install-deps
appstore: clean-build build
@@ -51,6 +52,7 @@ appstore: clean-build build
--exclude="../$(app_name)/js/tests" \
--exclude="../$(app_name)/js/test" \
--exclude="../$(app_name)/js/*.log" \
--exclude="../$(app_name)/js/package-lock.json" \
--exclude="../$(app_name)/js/package.json" \
--exclude="../$(app_name)/js/bower.json" \
--exclude="../$(app_name)/js/karma.*" \
@@ -60,7 +62,10 @@ appstore: clean-build build
--exclude="../$(app_name)/karma.*" \
--exclude="../$(app_name)/protractor\.*" \
--exclude="../$(app_name)/.*" \
--exclude="../$(app_name)/*.lock" \
--exclude="../$(app_name)/run-eslint.sh" \
--exclude="../$(app_name)/js/.*" \
--exclude="../$(app_name)/vendor" \
--exclude-vcs \
../$(app_name)
@@ -93,3 +98,5 @@ test-integration:
test-js: install-deps
cd js && run test
package:
krankerl package

View File

@@ -1,6 +1,6 @@
# Deck
[![Build Status](https://travis-ci.org/nextcloud/deck.svg?branch=master)](https://travis-ci.org/nextcloud/deck) [![CodeCov](https://codecov.io/github/nextcloud/deck/coverage.svg?branch=master)](https://codecov.io/github/nextcloud/deck) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/deck/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=master) [![Dependency Status](https://www.versioneye.com/user/projects/58ad558f4ca76f004ed475b3/badge.svg?style=flat)](https://www.versioneye.com/user/projects/58ad558f4ca76f004ed475b3) [![#nextcloud-deck](https://img.shields.io/badge/IRC-%23nextcloud--deck%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=nextcloud-deck)
[![Build Status](https://travis-ci.org/nextcloud/deck.svg?branch=master)](https://travis-ci.org/nextcloud/deck) [![CodeCov](https://codecov.io/github/nextcloud/deck/coverage.svg?branch=master)](https://codecov.io/github/nextcloud/deck) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/e403f723f42a4abd93b2cfe36cbd7eee)](https://www.codacy.com/app/juliushaertl/deck?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nextcloud/deck&amp;utm_campaign=Badge_Grade) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/deck/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/deck/?branch=master) [![#nextcloud-deck](https://img.shields.io/badge/IRC-%23nextcloud--deck%20on%20freenode-blue.svg)](https://webchat.freenode.net/?channels=nextcloud-deck)
Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.
@@ -9,22 +9,17 @@ Deck is a kanban style organization tool aimed at personal planning and project
- :page_facing_up: Write down additional notes in markdown
- :bookmark: Assign labels for even better organization
- :busts_in_silhouette: Share with your team, friends or family
- :paperclip: Attach files and embed them in your markdown description
- :speech_balloon: Discuss with your team using comments
- :zap: Keep track of changes in the activity stream
- :rocket: Get your project organized
![Deck - Manage cards on your board](https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png)
### Planned features
- :file_folder: Attach files directly from your Nextcloud
- :earth_africa: Share boards with the public
- :calendar: Integration with Nextcloud calendar and other apps
- :speech_balloon: Comments integration
- :exclamation: Checkout the project milestones for more ...
![Deck - Manage cards on your board](https://download.bitgrid.net/nextcloud/deck/screenshots/Deck.png)
## Installation/Update
This app is supposed to work on Nextcloud version 11 or later.
This app is supposed to work on the two latest Nextcloud versions.
### Install latest release
@@ -38,10 +33,10 @@ If you want to run the latest development version from git source, you need to c
git clone https://github.com/nextcloud/deck.git
cd deck
make install-deps
make
make build
```
Please make sure you have installed the following dependencies: `make, which, tar, npm, curl`
Please make sure you have installed the following dependencies: `make, which, tar, npm, curl, composer`
### Install the nightly builds
@@ -55,15 +50,16 @@ Nothing to prepare, just dig into the code.
### JavaScript
When `'debug'=>true` is set in your config.php files will get loaded automatically. Otherwise you need to ensure that `public/app.js` is generated by running `make` or `make watch` to regenerate it on every change.
Make sure you have installed the dependencies with ```make install-deps```.
Deck requires running a `make build-js` to install npm dependencies and build the JavaScript code using webpack. While developing you can also use `make watch` to rebuild everytime the code changes.
### Running tests
You can use the provided Makefile to run all tests by using:
make test
### Documentation
The documentation for our REST API can be found at https://deck.readthedocs.io/en/latest/API/
## Contribution Guidelines

View File

@@ -1 +0,0 @@
theme: jekyll-theme-cayman

View File

@@ -21,5 +21,14 @@
*
*/
if ((@include_once __DIR__ . '/../vendor/autoload.php')===false) {
throw new Exception('Cannot include autoload. Did you run install dependencies using composer?');
}
$app = new \OCA\Deck\AppInfo\Application();
$app->registerNavigationEntry();
$app->registerNotifications();
$app->registerCommentsEntity();
/** Load activity style global so it is availabile in the activity app as well */
\OC_Util::addStyle('deck', 'activity');

View File

@@ -5,20 +5,20 @@
* @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\AppInfo;
@@ -28,4 +28,4 @@ use OCP\AppFramework\App;
/**
* Additional autoloader registration, e.g. registering composer autoloaders
*/
// require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../vendor/autoload.php';

View File

@@ -46,6 +46,13 @@
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<field>
<name>last_modified</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
</declaration>
</table>
<table>
@@ -77,6 +84,21 @@
<length>8</length>
<notnull>false</notnull>
</field>
<field>
<name>deleted_at</name>
<type>integer</type>
<default>0</default>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<field>
<name>last_modified</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<index>
<name>deck_stacks_board_id_index</name>
<field>
@@ -162,6 +184,19 @@
<type>timestamp</type>
<default>0</default>
</field>
<field>
<name>notified</name>
<type>boolean</type>
<default>false</default>
</field>
<field>
<name>deleted_at</name>
<type>integer</type>
<default>0</default>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<index>
<name>deck_cards_stack_id_index</name>
<field>
@@ -193,12 +228,6 @@
<autoincrement>1</autoincrement>
<length>4</length>
</field>
<field>
<name>title</name>
<type>text</type>
<notnull>true</notnull>
<length>100</length>
</field>
<field>
<name>card_id</name>
<type>integer</type>
@@ -213,12 +242,12 @@
</field>
<field>
<name>data</name>
<type>clob</type>
<type>text</type>
</field>
<field>
<name>last_modified</name>
<type>integer</type>
<default></default>
<default/>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
@@ -226,7 +255,21 @@
<field>
<name>created_at</name>
<type>integer</type>
<default></default>
<default/>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
</field>
<field>
<name>created_by</name>
<type>text</type>
<notnull>true</notnull>
<length>64</length>
</field>
<field>
<name>deleted_at</name>
<type>integer</type>
<default>0</default>
<length>8</length>
<notnull>false</notnull>
<unsigned>true</unsigned>
@@ -311,6 +354,44 @@
</index>
</declaration>
</table>
<table>
<name>*dbprefix*deck_assigned_users</name>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<length>4</length>
</field>
<field>
<name>participant</name>
<type>text</type>
<notnull>true</notnull>
<length>64</length>
</field>
<field>
<name>card_id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<length>4</length>
</field>
<index>
<name>deck_assigned_users_idx_p</name>
<field>
<name>participant</name>
</field>
</index>
<index>
<name>deck_assigned_users_idx_c</name>
<field>
<name>card_id</name>
</field>
</index>
</declaration>
</table>
<table>
<name>*dbprefix*deck_board_acl</name>
<declaration>

View File

@@ -11,30 +11,54 @@
- 📄 Write down additional notes in markdown
- 🔖 Assign labels for even better organization
- 👥 Share with your team, friends or family
- 📎 Attach files and embed them in your markdown description
- 💬 Discuss with your team using comments
- ⚡ Keep track of changes in the activity stream
- 🚀 Get your project organized
💥 This is still alpha software: it may not be stable enough for production!
</description>
<version>0.2.1</version>
<version>0.5.0</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<namespace>Deck</namespace>
<types>
<logging/>
</types>
<category>organization</category>
<category>office</category>
<website>https://github.com/nextcloud/deck</website>
<bugs>https://github.com/nextcloud/deck/issues</bugs>
<repository type="git">https://github.com/nextcloud/deck.git</repository>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/0.5/deck-notifications.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/0.5/deck-comment2.png</screenshot>
<dependencies>
<nextcloud min-version="11" max-version="13" />
<php min-version="5.6"/>
<database min-version="9.4">pgsql</database>
<database>sqlite</database>
<database min-version="5.5">mysql</database>
<nextcloud min-version="13" max-version="15" />
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>
<job>OCA\Deck\Cron\ScheduledNotifications</job>
</background-jobs>
<repair-steps>
<post-migration>
<step>OCA\Deck\Migration\UnknownUsers</step>
</post-migration>
</repair-steps>
<commands>
<command>OCA\Deck\Command\UserExport</command>
</commands>
<activity>
<settings>
<setting>OCA\Deck\Activity\Setting</setting>
</settings>
<filters>
<filter>OCA\Deck\Activity\Filter</filter>
</filters>
<providers>
<provider>OCA\Deck\Activity\DeckProvider</provider>
</providers>
</activity>
</info>

View File

@@ -3,22 +3,23 @@
* @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
*
*
* 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/>.
*
*
*/
return [
@@ -43,6 +44,7 @@ return [
['name' => 'stack#update', 'url' => '/stacks/{stackId}', 'verb' => 'PUT'],
['name' => 'stack#reorder', 'url' => '/stacks/{stackId}/reorder', 'verb' => 'PUT'],
['name' => 'stack#delete', 'url' => '/stacks/{stackId}', 'verb' => 'DELETE'],
['name' => 'stack#deleted', 'url' => '/{boardId}/stacks/deleted', 'verb' => 'GET'],
['name' => 'stack#archived', 'url' => '/stacks/{boardId}/archived', 'verb' => 'GET'],
// cards
@@ -50,17 +52,68 @@ return [
['name' => 'card#create', 'url' => '/cards', 'verb' => 'POST'],
['name' => 'card#update', 'url' => '/cards/{cardId}', 'verb' => 'PUT'],
['name' => 'card#delete', 'url' => '/cards/{cardId}', 'verb' => 'DELETE'],
['name' => 'card#deleted', 'url' => '/{boardId}/cards/deleted', 'verb' => 'GET'],
['name' => 'card#rename', 'url' => '/cards/{cardId}/rename', 'verb' => 'PUT'],
['name' => 'card#reorder', 'url' => '/cards/{cardId}/reorder', 'verb' => 'PUT'],
['name' => 'card#archive', 'url' => '/cards/{cardId}/archive', 'verb' => 'PUT'],
['name' => 'card#unarchive', 'url' => '/cards/{cardId}/unarchive', 'verb' => 'PUT'],
['name' => 'card#assignLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'POST'],
['name' => 'card#removeLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'],
['name' => 'card#assignUser', 'url' => '/cards/{cardId}/assign', 'verb' => 'POST'],
['name' => 'card#unassignUser', 'url' => '/cards/{cardId}/assign/{userId}', 'verb' => 'DELETE'],
['name' => 'attachment#getAll', 'url' => '/cards/{cardId}/attachments', 'verb' => 'GET'],
['name' => 'attachment#create', 'url' => '/cards/{cardId}/attachment', 'verb' => 'POST'],
['name' => 'attachment#display', 'url' => '/cards/{cardId}/attachment/{attachmentId}', 'verb' => 'GET'],
['name' => 'attachment#update', 'url' => '/cards/{cardId}/attachment/{attachmentId}', 'verb' => 'PUT'],
// also allow to use POST for updates so we can properly access files when using application/x-www-form-urlencoded
['name' => 'attachment#update', 'url' => '/cards/{cardId}/attachment/{attachmentId}', 'verb' => 'POST'],
['name' => 'attachment#delete', 'url' => '/cards/{cardId}/attachment/{attachmentId}', 'verb' => 'DELETE'],
['name' => 'attachment#restore', 'url' => '/cards/{cardId}/attachment/{attachmentId}/restore', 'verb' => 'GET'],
// labels
['name' => 'label#create', 'url' => '/labels', 'verb' => 'POST'],
['name' => 'label#update', 'url' => '/labels/{labelId}', 'verb' => 'PUT'],
['name' => 'label#delete', 'url' => '/labels/{labelId}', 'verb' => 'DELETE'],
// api
['name' => 'board_api#index', 'url' => '/api/v1.0/boards', 'verb' => 'GET'],
['name' => 'board_api#get', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'GET'],
['name' => 'board_api#create', 'url' => '/api/v1.0/boards', 'verb' => 'POST'],
['name' => 'board_api#delete', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'DELETE'],
['name' => 'board_api#update', 'url' => '/api/v1.0/boards/{boardId}', 'verb' => 'PUT'],
['name' => 'board_api#undo_delete', 'url' => '/api/v1.0/boards/{boardId}/undo_delete', 'verb' => 'POST'],
['name' => 'stack_api#index', 'url' => '/api/v1.0/boards/{boardId}/stacks', 'verb' => 'GET'],
['name' => 'stack_api#getArchived', 'url' => '/api/v1.0/boards/{boardId}/stacks/archived', 'verb' => 'GET'],
['name' => 'stack_api#get', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'GET'],
['name' => 'stack_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks', 'verb' => 'POST'],
['name' => 'stack_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'PUT'],
['name' => 'stack_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}', 'verb' => 'DELETE'],
['name' => 'card_api#get', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'GET'],
['name' => 'card_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards', 'verb' => 'POST'],
['name' => 'card_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'PUT'],
['name' => 'card_api#assignLabel', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignLabel', 'verb' => 'PUT'],
['name' => 'card_api#removeLabel', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/removeLabel', 'verb' => 'PUT'],
['name' => 'card_api#assignUser', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignUser', 'verb' => 'PUT'],
['name' => 'card_api#unassignUser', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/unassignUser', 'verb' => 'PUT'],
['name' => 'card_api#reorder', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/reorder', 'verb' => 'PUT'],
['name' => 'card_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}', 'verb' => 'DELETE'],
['name' => 'label_api#get', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'GET'],
['name' => 'label_api#create', 'url' => '/api/v1.0/boards/{boardId}/labels', 'verb' => 'POST'],
['name' => 'label_api#update', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'PUT'],
['name' => 'label_api#delete', 'url' => '/api/v1.0/boards/{boardId}/labels/{labelId}', 'verb' => 'DELETE'],
['name' => 'attachment_api#getAll', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments', 'verb' => 'GET'],
['name' => 'attachment_api#display', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'GET'],
['name' => 'attachment_api#create', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments', 'verb' => 'POST'],
['name' => 'attachment_api#update', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'PUT'],
['name' => 'attachment_api#delete', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}', 'verb' => 'DELETE'],
['name' => 'attachment_api#restore', 'url' => '/api/v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}/restore', 'verb' => 'PUT'],
['name' => 'board_api#preflighted_cors', 'url' => '/api/v1.0/{path}','verb' => 'OPTIONS', 'requirements' => ['path' => '.+']],
]
];

19
composer.json Normal file
View File

@@ -0,0 +1,19 @@
{
"name": "nextcloud/deck",
"type": "project",
"license": "AGPLv3",
"authors": [
{
"name": "Julius Härtl",
"email": "jus@bitgrid.net"
}
],
"require": {
"cogpowered/finediff": "0.3.*"
},
"require-dev": {
"roave/security-advisories": "dev-master",
"christophwurst/nextcloud": "^14.0",
"jakub-onderka/php-parallel-lint": "^1.0.0"
}
}

28
css/activity.css Normal file
View File

@@ -0,0 +1,28 @@
.activitymessage .visualdiff ins {
background-color: rgba(70, 186, 97, 0.2);
text-decoration: none;
}
.activitymessage .visualdiff del {
background-color: rgba(233, 50, 45, 0.2);
text-decoration: none;
}
.activitymessage .visualdiff {
overflow: scroll;
max-height: 200px;
}
.activityTabView .avatardiv-container {
display: inline-block;
bottom: -3px;
margin-left: 3px;
}
.activityTabView .avatar-name-wrapper {
font-weight: bold;
}
.activityTabView .activitysubject a {
font-weight: bold;
}

43
css/animations.scss Normal file
View File

@@ -0,0 +1,43 @@
/*
* @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu>
*
* @author 2018 Michael Weimann <mail@michael-weimann.eu>
*
* @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/>.
*
*/
.compact-item.ng-enter,
.compact-item.ng-leave {
overflow: hidden;
transition: all 250ms linear;
}
.compact-item.ng-enter {
max-height: 0;
&.ng-enter-active {
max-height: 50px;
}
}
.compact-item.ng-leave {
max-height: 50px;
&.ng-leave-active {
max-height: 0;
}
}

77
css/autocomplete.scss Normal file
View File

@@ -0,0 +1,77 @@
/**
* based upon apps/comments/js/vendor/At.js/dist/css/jquery.atwho.css,
* only changed colors and font-weight
*/
.atwho-view {
position:absolute;
top: 0;
left: 0;
display: none;
margin-top: 18px;
background: var(--color-main-background);
color: var(--color-main-text);
border: 1px solid var(--color-border);
border-radius: var(--border-radius);
box-shadow: 0 0 5px var(--color-box-shadow);
min-width: 120px;
z-index: 11110 !important;
}
.atwho-view .atwho-header {
padding: 5px;
margin: 5px;
cursor: pointer;
border-bottom: solid 1px var(--color-border);
color: var(--color-main-text);
font-size: 11px;
font-weight: bold;
}
.atwho-view .atwho-header .small {
color: var(--color-main-text);
float: right;
padding-top: 2px;
margin-right: -5px;
font-size: 12px;
font-weight: normal;
}
.atwho-view .atwho-header:hover {
cursor: default;
}
.atwho-view .cur {
background: var(--color-primary);
color: var(--color-primary-text);
}
.atwho-view .cur small {
color: var(--color-primary-text);
}
.atwho-view strong {
color: var(--color-main-text);
font-weight: normal;
}
.atwho-view .cur strong {
color: var(--color-primary-text);
font-weight: normal;
}
.atwho-view ul {
/* width: 100px; */
list-style:none;
padding:0;
margin:auto;
max-height: 200px;
overflow-y: auto;
}
.atwho-view ul li {
display: block;
padding: 5px 10px;
border-bottom: 1px solid var(--color-border);
cursor: pointer;
}
.atwho-view small {
font-size: smaller;
color: var(--color-main-text);
font-weight: normal;
}

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

@@ -0,0 +1,50 @@
#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;
z-index: 1000;
&.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;
}
}
}
#commentsTabView .newCommentForm .message {
width: 100%;
margin-left: 0;
padding-right: 0;
display: block;
}
#commentsTabView .comment {
margin-bottom: 0;
}

113
css/comp-appnav.scss Normal file
View File

@@ -0,0 +1,113 @@
/*
* @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net>
* @copyright Copyright (c) 2016, John Molakvoæ <skjnldsv@protonmail.com>
*
* @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/>.
*
*/
/**
* Hotfix for support <NC13 with new app sidebar
*/
#app-navigation {
.app-navigation-entry-menu.open {
ul li a {
background-position: 10px center;
padding: 0 10px 0 36px !important;
}
}
.app-navigation-entry-edit {
display: none;
}
.editing {
.app-navigation-entry-edit {
display: block;
position: absolute;
background: $color-main-background;
height: auto;
z-index: 250;
}
}
}
/**
* copied styles from core/css/styles.scss
* to have the same breadcrumb styling in NC12
*/
.breadcrumb {
display: inline-flex;
}
div.crumb {
display: inline-flex;
background-repeat: no-repeat;
background-position: right center;
height: 44px;
background-size: auto 24px;
flex: 0 0 auto;
order: 1;
padding-right: 7px;
&.crumbmenu {
order: 2;
position: relative;
a {
opacity: 0.5
}
}
&.hidden {
display: none;
~ .crumb {
order: 3;
}
}
> a,
> span {
position: relative;
padding: 12px;
opacity: 0.5;
top: 0 !important;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
flex: 0 0 auto;
&.icon-home {
// Hide home text
text-indent: -9999px;
}
}
> a[class^='icon-'] {
padding: 0;
width: 44px;
}
&:not(:first-child) a {
}
&:last-child {
font-weight: 600;
margin-right: 10px;
// Allow multiple span next to the main 'a'
a ~ span {
padding-left: 0;
}
}
&:hover, &:focus, a:focus, &:active {
> a,
> span {
opacity: .7;
}
}
}

41
css/compact-mode.scss Normal file
View File

@@ -0,0 +1,41 @@
/*
* @copyright Copyright (c) 2018 Michael Weimann <mail@michael-weimann.eu>
*
* @author 2018 Michael Weimann <mail@michael-weimann.eu>
*
* @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/>.
*
*/
.compact-mode {
.card {
margin: $compact-board-item-margin;
&:last-child {
margin: $compact-board-last-item-margin;
}
}
.stack {
.as-sortable-placeholder {
margin: $compact-board-item-margin;
&:last-child {
margin: $compact-board-last-item-margin;
}
}
}
}

70
css/icons.scss Normal file
View File

@@ -0,0 +1,70 @@
/**
* Custom icons
*/
.icon-deck {
background-image: url('../img/deck-dark.svg');
}
.icon-group {
background-image: url('../../../settings/img/users.svg');
}
.icon-help {
background-image: url('../../../settings/img/help.svg');
}
.icon-add-white {
background-image: url('../img/add-white.svg');
}
.icon-archive {
background-image: url('../img/archive.svg');
}
.icon-archive-white {
background-image: url('../img/archive-white.svg');
}
.icon-details {
background-image: url('../img/details.svg');
}
.icon-details-white {
background-image: url('../img/details-white.svg');
}
.icon-home {
background-image: var(--icon-home-000, url('../../../core/img/places/home.svg'));
}
.icon-description {
background-image: var(--icon-text-000, url('../img/description.svg'));
}
.icon-badge {
background-image: url('../img/calendar-dark.svg');
}
.icon-toggle-compact-collapsed {
background-image: url('../img/toggle-view-expand.svg');
}
.icon-toggle-compact-expanded {
background-image: url('../img/toggle-view-collapse.svg');
}
@if mixin-exists('icon-black-white') {
@include icon-black-white('deck', 'deck', 1);
@include icon-black-white('archive', 'deck', 1);
.icon-toggle-compact-collapsed {
@include icon-color('toggle-view-expand', 'deck', $color-black);
}
.icon-toggle-compact-expanded {
@include icon-color('toggle-view-collapse', 'deck', $color-black);
}
.icon-activity {
@include icon-color('activity-dark', 'activity', $color-black);
}
}

90
css/print.scss Normal file
View File

@@ -0,0 +1,90 @@
@media print {
/* hide stuff */
#body-user {
#header,
div#app-navigation,
div.board-header-controls,
#app-navigation-toggle,
#app-navigation-toggle-custom,
div#controls.ng-scope div.crumb:not(.title),
div#controls.ng-scope div.crumb a.bullet,
a.ng-binding + a,
div.card.create,
button.card-options {
display: none !important;
}
#content {
margin: 0;
padding: 0;
}
#app-content {
margin: 0 !important;
}
}
div#app-navigation-toggle.icon-menu {
display:block;
width:0px;
height:0px;
background:none;
}
/* title */
div#controls.ng-scope {padding-left:20px;}
div#controls.ng-scope div.crumb.title {
display:inline;
font-size: 2em;
line-height:2.5em;
background:none;
}
div#controls.ng-scope div.crumb.title a.ng-binding {
color:#000;
opacity:1;
}
/*Due, assigned-users and description*/
div.card-controls {
flex-direction:row;
flex-wrap:wrap;
}
div.card-controls i.icon.icon-filetype-text {background:none;}
div.card-controls i.icon.icon-filetype-text:after {
content: attr(title);
display:block;
width:289px;
height:1.5em;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
span.due { }
div.card-assigned-users {
margin-right:10px;
}
ul.labels li.ng-scope span.ng-binding {
color:#000;
display:inline;
padding-left:5px;
}
/* Layout */
@page {
size: A4 landscape;
margin: 2cm;
}
div#innerBoard {
display:flex;
flex-wrap: wrap;
}
div.stack.ng-scope.as-sortable-item {border-right: 1px solid #000;}
div#innerBoard.ng-pristine.ng-untouched.ng-valid.ng-scope.ng-not-empty div.stack.ng-scope.as-sortable-item:nth-child(6n) {
page-break-after: always;
}
}

File diff suppressed because it is too large Load Diff

27
docs/API-Nextcloud.md Normal file
View File

@@ -0,0 +1,27 @@
# Nextcloud APIs
## Comments
Comments are stored using the Nextcloud Comments API. You can use the WebDAV endpoint of Nextcloud to fetch, update and delete comments.
### List comments
PROPFIND`remote.php/dav/comments/deckCard/{cardId}`
### Create comment
POST `remote.php/dav/comments/deckCard/{cardId}`
### Update comment
PROPPATCH `remote.php/dav/comments/deckCard/{cardId}/{commentId}`
### Delete comment
DELETE `remote.php/dav/comments/deckCard/{cardId}/{commentId}`
## Activity
The Nextcloud activity app provides an API to fetch activities filtered for deck: [Activity app API documentation](https://github.com/nextcloud/activity/blob/master/docs/endpoint-v2.md)
The deck app offers a filter `deck` to only request activity events that are relevant.

833
docs/API.md Normal file
View File

@@ -0,0 +1,833 @@
The REST API provides access for authenticated users to their data inside the Deck app. To get a better understand of Decks data models and their relations, please have a look at the [data structure](structure.md) documentation.
# Prequisited
- All requests require a `OCS-APIRequest` HTTP header to be set to `true` and a `Content-Type` of `application/json`.
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
## Naming
- Board is the the project like grouping of tasks that can be shared to different users and groups
- Stack is the grouping of cards which is rendered in vertical columns in the UI
- Card is the representation of a single task
- Labels are defined on a board level and can be assigned to any number of cards
## Global responses
### 400 Bad request
In case the request is invalid, e.g. because a parameter is missing, a 400 error will be returned:
```json
{
"status": 400,
"message": "title must be provided"
}
```
### 403 Permission denied
In any case a user doesn't have access to a requested entity, a 403 error will be returned:
```json
{
"status": 403,
"message": "Permission denied"
}
```
## Headers
### If-Modified-Since
Some index endpoints support limiting the result set to entries that have been changed since the given time.
Example curl request:
```bash
curl -u admin:admin -X GET \
'http://localhost:8000/index.php/apps/deck/api/v1.0/boards/2/stacks' \
-H "OCS-APIRequest: true" \
-H "If-Modified-Since: Mon, 5 Nov 2018 09:28:00 GMT"
```
# Endpoints
## Boards
### GET /boards - Get a list of boards
#### Headers
The board list endpoint supports setting an `If-Modified-Since` header to limit the results to entities that are changed after the provided time.
#### Response
##### 200 Success
Returns an array of board items
```json
[
{
"title": "Board title",
"owner": {
"primaryKey": "admin",
"uid": "admin",
"displayname": "Administrator"
},
"color": "ff0000",
"archived": false,
"labels": [],
"acl": [],
"permissions": {
"PERMISSION_READ": true,
"PERMISSION_EDIT": true,
"PERMISSION_MANAGE": true,
"PERMISSION_SHARE": true
},
"users": [],
"shared": 0,
"deletedAt": 0,
"id": 10
}
]
```
### POST /boards - Create a new board
#### Request body
| Parameter | Type | Description |
| --------- | ------ | ---------------------------------------------------- |
| title | String | The title of the new board |
| color | String | The hexadecimal color of the new board (e.g. FF0000) |
```json
{
"title": "Board title",
"color": "ff0000"
}
```
#### Response
##### 200 Success
```json
{
"title": "Board title",
"owner": {
"primaryKey": "admin",
"uid": "admin",
"displayname": "Administrator"
},
"color": "ff0000",
"archived": false,
"labels": [
{
"title": "Finished",
"color": "31CC7C",
"boardId": 10,
"cardId": null,
"id": 37
},
{
"title": "To review",
"color": "317CCC",
"boardId": 10,
"cardId": null,
"id": 38
},
{
"title": "Action needed",
"color": "FF7A66",
"boardId": 10,
"cardId": null,
"id": 39
},
{
"title": "Later",
"color": "F1DB50",
"boardId": 10,
"cardId": null,
"id": 40
}
],
"acl": [],
"permissions": {
"PERMISSION_READ": true,
"PERMISSION_EDIT": true,
"PERMISSION_MANAGE": true,
"PERMISSION_SHARE": true
},
"users": [],
"deletedAt": 0,
"id": 10
}
```
### GET /boards/{boardId} - Get board details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
##### 200 Success
```json
{
"title": "Board title",
"owner": {
"primaryKey": "admin",
"uid": "admin",
"displayname": "Administrator"
},
"color": "ff0000",
"archived": false,
"labels": [
{
"title": "Finished",
"color": "31CC7C",
"boardId": "10",
"cardId": null,
"id": 37
},
{
"title": "To review",
"color": "317CCC",
"boardId": "10",
"cardId": null,
"id": 38
},
{
"title": "Action needed",
"color": "FF7A66",
"boardId": "10",
"cardId": null,
"id": 39
},
{
"title": "Later",
"color": "F1DB50",
"boardId": "10",
"cardId": null,
"id": 40
}
],
"acl": [],
"permissions": {
"PERMISSION_READ": true,
"PERMISSION_EDIT": true,
"PERMISSION_MANAGE": true,
"PERMISSION_SHARE": true
},
"users": [
{
"primaryKey": "admin",
"uid": "admin",
"displayname": "Administrator"
}
],
"deletedAt": 0,
"id": 10
}
```
### PUT /boards/{boardId} - Update board details
#### Request body
| Parameter | Type | Description |
| --------- | ------ | ---------------------------------------------------- |
| title | String | The title of the new board |
| color | String | The hexadecimal color of the new board (e.g. FF0000) |
| archived | Bool | The hexadecimal color of the new board (e.g. FF0000) |
```json
{
"title": "Board title",
"color": "ff0000",
"archived": false
}
```
#### Response
##### 200 Success
### DELETE /boards/{boardId} - Delete a board
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
##### 200 Success
### POST /boards/{boardId}/undo_delete - Restore a deleted board
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
##### 200 Success
## Stacks
### GET /board/{boardId}/stacks - Get stacks
#### Headers
The board list endpoint supports setting an `If-Modified-Since` header to limit the results to entities that are changed after the provided time.
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
```json
[
{
"title": "ToDo",
"boardId": 2,
"deletedAt": 0,
"lastModified": 1541426139,
"cards": [...],
"order": 999,
"id": 4
}
]
```
##### 200 Success
### GET /board/{boardId}/stacks/archived - Get list of archived stacks
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
```json
[
{
"title": "ToDo",
"boardId": 2,
"deletedAt": 0,
"lastModified": 1541426139,
"cards": [...],
"order": 999,
"id": 4
}
]
```
##### 200 Success
### GET /board/{boardId}/stacks/{stackId} - Get stack details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the stack belongs to |
| stackId | Integer | The id of the stack |
#### Response
##### 200 Success
### POST /board/{boardId}/stacks - Create a new stack
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------- |
| boardId | Integer | The id of the board to fetch |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId} - Update stack details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the stack belongs to |
| stackId | Integer | The id of the stack |
#### Request body
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------------------- |
| title | String | The title of the new stack |
| order | Integer | Order for sorting the stacks |
#### Response
##### 200 Success
### DELETE /board/{boardId}/stacks/{stackId} - Delete a stack
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the stack belongs to |
| stackId | Integer | The id of the stack |
#### Response
##### 200 Success
## Cards
### GET /board/{boardId}/stacks/{stackId}/cards/{cardId} - Get card details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Response
##### 200 Success
### POST /board/{boardId}/stacks/{stackId}/cards - Create a new card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
#### Request body
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------------------- |
| title | String | The title of the new stack |
| type | String | Type of the card (for later use) use 'plain' for now |
| order | Integer | Order for sorting the stacks |
#### Response
```json
{
"title":"Test",
"description":null,
"stackId":6,
"type":"plain",
"lastModified":1541528026,
"createdAt":1541528026,
"labels":null,
"assignedUsers":null,
"attachments":null,
"attachmentCount":null,
"owner":"admin",
"order":999,
"archived":false,
"duedate":null,
"deletedAt":0,
"commentsUnread":0,
"id":10,
"overdue":0
}
```
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId} - Update card details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
|-------------|-----------|------------------------------------------------------|
| title | String | The card title |
| description | String | The markdown description of the card |
| type | String | Type of the card (for later use) use 'plain' for now |
| order | Integer | Order for sorting the stacks |
| duedate | timestamp | The duedate of the card or null |
```
{
"title": "Test card",
"description": "A card description",
"type": "plain",
"order": 999,
"duedate": null,
}
```
#### Response
##### 200 Success
### DELETE /board/{boardId}/stacks/{stackId}/cards/{cardId} - Delete a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/assignLabel - Assign a label to a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| labelId | Integer | The label id to assign to the card |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/removeLabel - Remove a label to a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| labelId | Integer | The label id to remove to the card |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/assignUser - Assign a user to a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| userId | String | The user id to assign to the card |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/unassignUser - Assign a user to a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| userId | String | The user id to assign to the card |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/reorder - Change the sorting order of a card
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | ----------------------------------------------------------- |
| order | Integer | The position in the stack where the card should be moved to |
| stackId | Integer | The id of the stack where the card should be moved to |
#### Response
##### 200 Success
## Labels
### GET /board/{boardId}/labels/{labelId} - Get label details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the label belongs to |
| labelId | Integer | The id of the label |
#### Response
##### 200 Success
```json
{
"title": "Abgeschlossen",
"color": "31CC7C",
"boardId": "2",
"cardId": null,
"id": 5
}
```
### POST /board/{boardId}/labels - Create a new label
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the label belongs to |
#### Request data
```json
{
"title": "Finished",
"color": "31CC7C"
}
```
#### Response
##### 200 Success
### PUT /board/{boardId}/labels/{labelId} - Update label details
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the label belongs to |
| labelId | Integer | The id of the label |
#### Request data
```json
{
"title": "Finished",
"color": "31CC7C"
}
```
#### Response
##### 200 Success
### DELETE /board/{boardId}/labels/{labelId} - Delete a label
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | ---------------------------------------- |
| boardId | Integer | The id of the board the label belongs to |
| labelId | Integer | The id of the label |
#### Response
##### 200 Success
## Attachments
### GET /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments - Get a list of attachments
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------- |
| boardId | Integer | The id of the board the card belongs to |
| stackId | Integer | The id of the stack the card belongs to |
| cardId | Integer | The id of the card |
#### Response
##### 200 Success
```json
[
{
"cardId": 5,
"type": "deck_file",
"data": "6DADC2C69F4.eml",
"lastModified": 1541529048,
"createdAt": 1541529048,
"createdBy": "admin",
"deletedAt": 0,
"extendedData": {
"filesize": 922258,
"mimetype": "application/octet-stream",
"info": {
"dirname": ".",
"basename": "6DADC2C69F4.eml",
"extension": "eml",
"filename": "6DADC2C69F4"
}
},
"id": 6
}
]
```
### GET /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Get the attachment file
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| boardId | Integer | The id of the board the attachment belongs to |
| stackId | Integer | The id of the stack the attachment belongs to |
| cardId | Integer | The id of the card the attachment belongs to |
| attachmentId | Integer | The id of the attachment |
#### Response
##### 200 Success
### POST /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments - Upload an attachment
#### Request parameters
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| boardId | Integer | The id of the board the attachment belongs to |
| stackId | Integer | The id of the stack the attachment belongs to |
| cardId | Integer | The id of the card the attachment belongs to |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
For now only `deck_file` is supported as an attachment type.
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Update an attachment
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| boardId | Integer | The id of the board the attachment belongs to |
| stackId | Integer | The id of the stack the attachment belongs to |
| cardId | Integer | The id of the card the attachment belongs to |
| attachmentId | Integer | The id of the attachment |
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
For now only `deck_file` is supported as an attachment type.
#### Response
##### 200 Success
### DELETE /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId} - Delete an attachment
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| boardId | Integer | The id of the board the attachment belongs to |
| stackId | Integer | The id of the stack the attachment belongs to |
| cardId | Integer | The id of the card the attachment belongs to |
| attachmentId | Integer | The id of the attachment |
#### Response
##### 200 Success
### PUT /board/{boardId}/stacks/{stackId}/cards/{cardId}/attachments/{attachmentId}/restore - Resore a deleted attachment
#### Request parameters
| Parameter | Type | Description |
| ------------ | ------- | --------------------------------------------- |
| boardId | Integer | The id of the board the attachment belongs to |
| stackId | Integer | The id of the stack the attachment belongs to |
| cardId | Integer | The id of the card the attachment belongs to |
| attachmentId | Integer | The id of the attachment |
#### Response
##### 200 Success

27
docs/Markdown.md Normal file
View File

@@ -0,0 +1,27 @@
## What is Markdown
The [wikipedia markdown entry](https://en.wikipedia.org/wiki/Markdown) introduced markdown as :
> Markdown is a lightweight markup language with plain text formatting syntax. It is designed so that it can be converted to HTML and many other formats using a tool by the same name. Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. As the initial description of Markdown contained ambiguities and unanswered questions, many implementations and extensions of Markdown appeared over the years to answer these issues.
## Markdown in Deck
The Deck application plugin uses the [markdown-it](https://github.com/markdown-it/markdown-it) script to offer support for markdown in the cards description field.
## Supported Markdown
Markdown comes in may flavors. The best way to learn markdown and understand how to use it, is simply to [try it](https://markdown-it.github.io) on the original script official playground.
That same link offers also a comprehensive list of what is supported, and what is not - rendering it unnecessary to duplicate that content in here.
[CommonMark Markdown Reference](http://commonmark.org/help/)
## Known Issues
As per [issue #127](https://github.com/nextcloud/deck/issues/127) Due to a known limitation of the current script to support markdown, Links that contain the `")"` character will not display well, or will break.
The recommended solution is to use `"<"` and `">"` to wrap those links. It should assure their integrity.
If you come by another case of broken link, or broken display of links, please report it by opening a new issue.

3
docs/extra.css Normal file
View File

@@ -0,0 +1,3 @@
.subnav ul {
padding-left: 20px;
}

1
docs/index.md Symbolic link
View File

@@ -0,0 +1 @@
../README.md

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

6
docs/structure.md Normal file
View File

@@ -0,0 +1,6 @@
## Database structure
Deck stores most of its data inside of the database. The structure and relationships between entities is documented in the following ER diagram:
![Screenshot](resources/er-diagram.jpg)

1
img/calendar-dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" version="1.1" height="32" viewbox="0 0 32 32"><path fill="#000" d="m8 2c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm16 0c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-13 4v2c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1.875a3.993 3.993 0 0 0 -3 3.875v16c0 2.216 1.784 4 4 4h20c2.216 0 4-1.784 4-4v-16a3.993 3.993 0 0 0 -3 -3.875v1.875c0 1.662-1.338 3-3 3s-3-1.338-3-3v-2zm-4.906 10h19.812a0.09 0.09 0 0 1 0.094 0.094v9.812a0.09 0.09 0 0 1 -0.094 0.094h-19.812a0.09 0.09 0 0 1 -0.094 -0.094v-9.812a0.09 0.09 0 0 1 0.094 -0.094z"/></svg>

After

Width:  |  Height:  |  Size: 646 B

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

1
img/color_picker.svg Normal file
View File

@@ -0,0 +1 @@
<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>

After

Width:  |  Height:  |  Size: 910 B

View File

@@ -1,4 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<g fill="#fff">
<rect ry="1" height="8" width="14" y="7" x="1"/>
<rect ry=".5" height="1" width="12" y="5" x="2"/>

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 364 B

1
img/description.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path fill="#000" d="m2.5 1c-0.28 0-0.5 0.22-0.5 0.5v13c0 0.28 0.22 0.5 0.5 0.5h11c0.28 0 0.5-0.22 0.5-0.5v-10.5l-3-3h-8.5zm1.5 2h6v1h-6v-1zm0 3h5v1h-5v-1zm0 3h8v1h-8v-1zm0 3h4v1h-4v-1z"/></svg>

After

Width:  |  Height:  |  Size: 292 B

View File

@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -292.77)" display="none" stroke-width=".23666"><rect x=".28112" y="293.43" width="3.7042" height="1.1906" ry=".20225"/><rect x=".26458" y="295.15" width="3.7042" height="1.1906" ry=".20225"/></g><g transform="translate(0 -292.77)"><g transform="matrix(.040404 0 0 .040404 -3.0978 290.01)"><rect x="83.629" y="114.13" width="91.678" height="13.097" stroke-width="3.9049"/><path d="m155.25 81.388-26.194 26.194-26.194-26.154z" stroke-width="6.5484"/><path d="m155.25 159.97-26.194-26.194-26.194 26.154z" stroke-width="6.5484"/></g></g></svg>

After

Width:  |  Height:  |  Size: 671 B

View File

@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333 4.2333" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -292.77)" display="none" stroke-width=".23666"><rect x=".28112" y="293.43" width="3.7042" height="1.1906" ry=".20225"/><rect x=".26458" y="295.15" width="3.7042" height="1.1906" ry=".20225"/></g><g transform="translate(0 -292.77)"><g transform="matrix(.040404 0 0 .040404 -3.0978 290.01)"><rect x="83.629" y="114.13" width="91.678" height="13.097" stroke-width="3.9049"/><path d="m155.25 107.58-26.194-26.194-26.194 26.154z" stroke-width="6.5484"/><path d="m155.25 133.78-26.194 26.194-26.194-26.154z" stroke-width="6.5484"/></g></g></svg>

After

Width:  |  Height:  |  Size: 671 B

View File

@@ -1,3 +0,0 @@
{
"directory": "vendor"
}

View File

@@ -1,123 +0,0 @@
/*
* @copyright Copyright (c) 2016 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/>.
*
*/
module.exports = function(grunt) {
'use strict';
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-wrap');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-phpunit');
grunt.initConfig({
meta: {
pkg: grunt.file.readJSON('package.json'),
version: '<%= meta.pkg.version %>',
configJS: 'config/',
buildJS: [
'app/**/*.js',
'controller/**/*.js',
'filters/**/*.js',
'directive/**/*.js',
'service/**/*.js'
],
productionJS: 'public/',
testsJS: '../tests/js/'
},
concat: {
options: {
stripBanners: true
},
dist: {
src: ['<%= meta.buildJS %>'],
dest: '<%= meta.productionJS %>app.js'
}
},
wrap: {
app: {
src: ['<%= meta.productionJS %>app.js'],
dest: '<%= meta.productionJS %>app.js',
option: {
wrapper: [
'(function(angular, $, oc_requesttoken, undefined){\n\n\'use strict\';\n\n',
'\n})(angular, jQuery, oc_requesttoken);'
]
}
}
},
jshint: {
files: [
'Gruntfile.js',
'<%= meta.buildJS %>**/*.js',
'<%= meta.testsJS %>**/*.js'
],
options: {
jshintrc: '.jshintrc',
reporter: require('jshint-stylish')
}
},
watch: {
concat: {
files: ['<%=meta.buildJS%>'],
options: {
livereload: true
},
tasks: ['build']
}
},
phpunit: {
classes: {
dir: '../tests/unit'
},
options: {
bootstrap: '../tests/bootstrap.php',
colors: true
}
},
karma: {
unit: {
configFile: '<%= meta.testsJS %>config/karma.js'
},
continuous: {
configFile: '<%= meta.testsJS %>config/karma.js',
browsers: ['Firefox'],
singleRun: true,
reporters: ['progress']
}
},
});
// make tasks available under simpler commands
grunt.registerTask('build', ['jshint', 'concat', 'wrap']);
grunt.registerTask('js-unit', ['karma:continuous']);
};

View File

@@ -4,22 +4,25 @@
* @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/>.
*
*
*/
/* global angular */
angular.module('markdown', [])
.provider('markdown', [function () {
var opts = {};
@@ -38,13 +41,24 @@ angular.module('markdown', [])
};
}]);
import uirouter from '@uirouter/angularjs';
import ngsanitize from 'angular-sanitize';
import angularuiselect from 'ui-select';
import ngsortable from 'ng-sortable';
import md from 'angular-markdown-it';
import nganimate from 'angular-animate';
import 'angular-file-upload';
import ngInfiniteScroll from 'ng-infinite-scroll';
import '../legacy/jquery.atwho.min';
import '../legacy/jquery.caret.min';
var app = angular.module('Deck', [
'ngRoute',
'ngSanitize',
'ui.router',
'ui.select',
'as.sortable',
'mdMarkdownIt',
'ngAnimate'
ngsanitize,
uirouter,
angularuiselect,
ngsortable, md, nganimate,
'angularFileUpload',
ngInfiniteScroll
]);
export default app;

View File

@@ -20,57 +20,98 @@
*
*/
app.config(function ($provide, $routeProvider, $interpolateProvider, $httpProvider, $urlRouterProvider, $stateProvider, $compileProvider, markdownItConverterProvider) {
'use strict';
$httpProvider.defaults.headers.common.requesttoken = oc_requesttoken;
/* global app oc_requesttoken markdownitLinkTarget */
$compileProvider.debugInfoEnabled(true);
import app from './App.js';
import md from 'angular-markdown-it';
import markdownitLinkTarget from 'markdown-it-link-target';
import markdownitCheckbox from 'legacy/markdown-it-checkbox.js';
markdownItConverterProvider.config({
breaks: true,
linkify: true,
xhtmlOut: true
});
markdownItConverterProvider.use(markdownitLinkTarget);
app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterProvider, $stateProvider, $compileProvider, markdownItConverterProvider) {
'use strict';
$httpProvider.defaults.headers.common.requesttoken = oc_requesttoken;
$urlRouterProvider.otherwise('/');
$stateProvider
.state('list', {
url: '/:filter',
templateUrl: '/boardlist.mainView.html',
controller: 'ListController',
$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.config({
breaks: true,
linkify: true,
xhtmlOut: true
});
markdownItConverterProvider.use(markdownitLinkTarget).use(markdownitCheckbox);
$urlRouterProvider.otherwise('/');
$stateProvider
.state('list', {
url: '/:filter',
templateUrl: '/boardlist.mainView.html',
controller: 'ListController',
reloadOnSearch: false,
params: {
filter: { value: '', dynamic: true }
}
filter: {value: '', dynamic: true}
}
})
.state('board', {
url: '/board/:boardId/:filter',
templateUrl: '/board.html',
controller: 'BoardController',
params: {
filter: { value: '', dynamic: true }
}
})
.state('board.detail', {
url: '/detail/',
reloadOnSearch : false,
views: {
'sidebarView': {
templateUrl: '/board.sidebarView.html'
.state('board', {
url: '/board/:boardId/:filter',
templateUrl: '/board.html',
controller: 'BoardController',
params: {
filter: {value: '', dynamic: true}
}
})
.state('board.detail', {
url: '/detail/',
reloadOnSearch: false,
params: {
tab: {value: 0, dynamic: true},
},
views: {
'sidebarView@': {
templateUrl: '/board.sidebarView.html',
controller: 'BoardController'
}
}
}
})
.state('board.card', {
url: '/card/:cardId',
views: {
'sidebarView': {
templateUrl: '/card.sidebarView.html',
controller: 'CardController'
}
}
});
.state('board.card', {
url: '/card/:cardId',
params: {
tab: {value: 0, dynamic: true},
},
views: {
'sidebarView@': {
templateUrl: '/card.sidebarView.html',
controller: 'CardController'
}
}
});
$provide.decorator('nvFileOverDirective', function ($delegate) {
var directive = $delegate[0],
link = directive.link;
});
directive.compile = function () {
return function (scope, element, attrs) {
var overClass = attrs.overClass || 'nv-file-over';
link.apply(this, arguments);
let counter = 0;
element.on('dragenter', function (event) {
counter++;
});
element.on('dragleave', function (event) {
counter--;
if (counter <= 0) {
$('.' + overClass).removeClass(overClass);
}
});
};
};
return $delegate;
});
});

View File

@@ -4,73 +4,61 @@
* @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/>.
*
*
*/
import app from './App.js';
/* global Snap */
app.run(function ($document, $rootScope, $transitions, BoardService) {
'use strict';
$document.click(function (event) {
$rootScope.$broadcast('documentClicked', event);
});
$transitions.onEnter({from: 'list'}, function($state, $transition$) {
BoardService.unsetCurrrent();
});
$transitions.onEnter({to: 'list'}, function($state, $transition$) {
'use strict';
$document.click(function (event) {
$rootScope.$broadcast('documentClicked', event);
});
$transitions.onEnter({from: 'list'}, function ($state, $transition$) {
BoardService.unsetCurrrent();
});
$transitions.onEnter({to: 'list'}, function ($state, $transition$) {
BoardService.unsetCurrrent();
document.title = "Deck - " + oc_defaults.name;
});
$transitions.onEnter({to: 'board.card'}, function ($state, $transition$) {
$rootScope.sidebar.show = true;
});
$transitions.onEnter({to: 'board.detail'}, function ($state, $transition$) {
$rootScope.sidebar.show = true;
});
$transitions.onEnter({to: 'board'}, function ($state) {
$rootScope.sidebar.show = false;
});
$transitions.onExit({from: 'board.card'}, function ($state) {
$rootScope.sidebar.show = false;
});
$transitions.onExit({from: 'board.detail'}, function ($state) {
$rootScope.sidebar.show = false;
});
$transitions.onEnter({to: 'board.card'}, function ($state, $transition$) {
$rootScope.sidebar.show = true;
});
$transitions.onEnter({to: 'board.detail'}, function ($state, $transition$) {
$rootScope.sidebar.show = true;
});
$transitions.onEnter({to: 'board'}, function ($state) {
$rootScope.sidebar.show = false;
});
$transitions.onExit({from: 'board.card'}, function ($state) {
$rootScope.sidebar.show = false;
});
$transitions.onExit({from: 'board.detail'}, function ($state) {
$rootScope.sidebar.show = false;
});
$('link[rel="shortcut icon"]').attr(
'href',
OC.filePath('deck', 'img', 'app-512.png')
);
$('link[rel="shortcut icon"]').attr(
'href',
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,
minDragDistance: 100
});
// Select all elements with data-toggle="tooltips" in the document
$('body').tooltip({
selector: '[data-toggle="tooltip"]'
});
$('#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');
}
}
});
});

View File

@@ -1,29 +0,0 @@
{
"name": "deck",
"version": "0.0.1",
"dependencies": {
"angular": "~1.6.1",
"angular-route": "~1.6.1",
"angular-mocks": "~1.6.1",
"angular-sanitize": "~1.6.1",
"angular-animate": "~1.6.1",
"ng-sortable": "1.3.8",
"jquery": "3.2.x",
"es6-shim": "~0.*",
"js-url": "~2.*",
"angular-ui-select": "~0.19.6",
"angular-markdown-it": "~0.6.1",
"angular-ui-router": "~1.0.0",
"markdown-it-link-target": "~1.0.1",
"jquery-timepicker": "883bb2cd94"
},
"license": "AGPL-3.0",
"private": true,
"ignore": [
"'**/.*",
"node_modules",
"bower_components",
"test",
"tests"
]
}

View File

@@ -0,0 +1,342 @@
/*
* @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/>.
*
*/
/* global OC OCA OCP t escapeHTML Handlebars */
import CommentCollection from '../legacy/commentcollection';
import CommentModel from '../legacy/commentmodel';
class ActivityController {
constructor ($scope, CardService, ActivityService, BoardService) {
'ngInject';
this.cardservice = CardService;
this.boardservice = BoardService;
this.activityservice = ActivityService;
this.$scope = $scope;
this.type = '';
this.loading = false;
this.status = {
commentCreateLoading: false
};
this.$scope.newComment = '';
this.currentUser = OC.getCurrentUser();
const self = this;
this.$scope.$watch(function () {
return self.element.id;
}, function (params) {
if (self.getData(self.element.id).length === 0) {
if (self.type === 'deck_card') {
self.activityservice.loadComments(self.element.id);
}
self.loading = true;
self.fetchUntilResults();
}
self.activityservice.fetchNewerActivities(self.type, self.element.id).then(function () {});
if (self.type === 'deck_card') {
self.cardservice.getCurrent().commentsUnread = 0;
}
}, true);
let $target = $('.newCommentForm .message');
this.applyAtWho($target);
this.activityservice.subscribe(this.$scope, function() {
self.$scope.$apply();
});
if (typeof OCA.Activity.Templates !== 'undefined') {
OCA.Activity.Templates.userLocal = Handlebars.template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) {
var helper;
// Compiled handlesbars template
// '<span class="avatar-name-wrapper"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user="{{ id }}" ng-attr-displayname="{{name}}" ng-attr-size="16"></avatar> {{ name }}</span>';
return "<span class=\"avatar-name-wrapper\"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user=\""
+ container.escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"id","hash":{},"data":data}) : helper)))
+ "\" ng-attr-displayname=\""
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"name","hash":{},"data":data}) : helper)))
+ "\" ng-attr-size=\"16\"></avatar> "
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"name","hash":{},"data":data}) : helper)))
+ "</span>";
},"useData":true});
} else {
OCA.Activity.RichObjectStringParser._userLocalTemplate = '<span class="avatar-name-wrapper"><avatar ng-attr-contactsmenu ng-attr-tooltip ng-attr-user="{{ id }}" ng-attr-displayname="{{name}}" ng-attr-size="16"></avatar> {{ name }}</span>';
}
}
applyAtWho($target) {
const self = this;
if (!$target) {
return;
}
$target.atwho({
at: '@',
callbacks: {
remoteFilter: function(query, callback) {
let uids = self.boardservice.getUsers();
uids = uids.filter((x) => x.uid.toLowerCase().includes(query.toLowerCase()) || x.displayname.toLowerCase().includes(query.toLowerCase()));
callback(uids);
},
highlighter: function (li) {
// misuse the highlighter callback to instead of
// highlighting loads the avatars.
var $li = $(li);
$li.find('.avatar').avatar(undefined, 32);
return $li;
},
sorter: function (q, items) { return items; }
},
displayTpl: function (item) {
return '<li>' +
'<span class="avatar-name-wrapper">' +
'<span class="avatar" ' +
'data-username="' + escapeHTML(item.uid) + '" ' + // for avatars
'data-user="' + escapeHTML(item.uid) + '" ' + // for contactsmenu
'data-user-display-name="' + escapeHTML(item.displayname) + '">' +
'</span>' +
'<strong>' + escapeHTML(item.displayname) + '</strong>' +
'</span></li>';
},
insertTpl: function (item) {
return '' +
'<span class="avatar-name-wrapper">' +
'<span class="avatar" ' +
'data-username="' + escapeHTML(item.uid) + '" ' + // for avatars
'data-user="' + escapeHTML(item.uid) + '" ' + // for contactsmenu
'data-user-display-name="' + escapeHTML(item.displayname) + '">' +
'</span>' +
'<strong>' + escapeHTML(item.displayname) + '</strong>' +
'</span>';
},
searchKey: 'displayname'
});
$target.on('inserted.atwho', function (je, $el) {
$(je.target).find(
'span[data-username="' + $el.find('[data-username]').data('username') + '"]'
).avatar(undefined, 16);
});
$target.on('shown.atwho', function (je) {
$target.find('.avatar').avatar(undefined, 16);
});
}
commentBodyToPlain(content) {
let $comment = $('<div/>').html(content);
$comment.find('.avatar-name-wrapper').each(function () {
var $this = $(this);
var $inserted = $this.parent();
$inserted.html('@' + $this.find('.avatar').data('username'));
});
$comment.html(OCP.Comments.richToPlain($comment.html()));
$comment.html($comment.html().replace(/<br\s*[\/]?>/gi, '\n'));
return $comment.text();
}
static _composeHTMLMention(uid, displayName) {
var avatar = '' +
'<span class="avatar" data-username="' + escapeHTML(uid) + '" data-user="' + escapeHTML(uid) + '" ng-attr-size="16" ' +
'ng-attr-user="' + escapeHTML(uid) + '" ' +
'ng-attr-displayname="' + escapeHTML(displayName) + '" ng-attr-contactsmenu="true">' +
'</span>';
var isCurrentUser = (uid === OC.getCurrentUser().uid);
return '' +
'<span class="atwho-inserted" contenteditable="false">' +
'<span class="avatar-name-wrapper' + (isCurrentUser ? ' currentUser' : '') + '">' +
avatar +
'<strong>' + escapeHTML(displayName) + '</strong>' +
'</span>' +
'</span>';
}
formatMessage(activity) {
let message = activity.message;
let mentions = activity.commentModel.get('mentions');
const editMode = false;
message = escapeHTML(message).replace(/\n/g, '<br/>');
for(var i in mentions) {
if(!mentions.hasOwnProperty(i)) {
return;
}
var mention = '@' + mentions[i].mentionId;
// escape possible regex characters in the name
mention = mention.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const displayName = ActivityController._composeHTMLMention(mentions[i].mentionId, mentions[i].mentionDisplayName);
// replace every mention either at the start of the input or after a whitespace
// followed by a non-word character.
message = message.replace(new RegExp('(^|\\s)(' + mention + ')\\b', 'g'),
function(match, p1) {
// to get number of whitespaces (0 vs 1) right
return p1+displayName;
}
);
}
if(editMode !== true) {
message = OCP.Comments.plainToRich(message);
}
return message;
}
postComment() {
const self = this;
this.status.commentCreateLoading = true;
let content = this.commentBodyToPlain(self.$scope.newComment);
if (content.length < 1) {
self.status.commentCreateLoading = false;
OC.Notification.showTemporary(t('deck', 'Please provide a content for your comment.'));
return;
}
var model = this.activityservice.commentCollection.create({
actorId: OC.getCurrentUser().uid,
actorDisplayName: OC.getCurrentUser().displayName,
actorType: 'users',
verb: 'comment',
message: content,
creationDateTime: (new Date()).toUTCString()
}, {
at: 0,
// wait for real creation before adding
wait: true,
success: function() {
self.$scope.newComment = '';
self.activityservice.fetchNewerActivities(self.type, self.element.id).then(function () {});
self.status.commentCreateLoading = false;
},
error: function() {
self.status.commentCreateLoading = false;
OC.Notification.showTemporary(t('deck', 'Posting the comment failed.'));
}
});
}
updateComment(item) {
item.commentEdit = this.formatMessage(item);
let $target = $('.newCommentForm .message');
this.applyAtWho($target);
/** Workaround to trigger avatar rendering after the view has been updated */
window.setTimeout(function () {
$target.find('.avatar').avatar(undefined, 16);
}, 0);
}
editComment(item) {
const self = this;
let content = this.commentBodyToPlain(item.commentEdit);
if (content.length < 1) {
OC.Notification.showTemporary(t('deck', 'Please provide a content for your comment.'));
return;
}
/** We need to save the model and afterwards run a fetch to update the mentions
* and call apply to propagate the changes to angular
*/
item.commentModel.on('sync', function() {
item.commentModel.off('sync');
item.commentModel.fetch({
success: function() {
self.$scope.$apply();
}
});
});
item.commentModel.save({
message: content,
});
item.message = content;
item.commentEdit = undefined;
}
deleteComment(item) {
item.commentModel.destroy();
item.deleted = true;
item.commentModel = undefined;
item.message = t('deck', 'The comment has been deleted');
}
getData(id) {
return this.activityservice.getData(this.type, id);
}
parseMessage(subject, parameters) {
return OCA.Activity.RichObjectStringParser.parseMessage(subject, parameters);
}
fetchUntilResults () {
const self = this;
let dataLengthBefore = self.getData(self.element.id).length;
let _executeFetch = function() {
let promise = self.activityservice.fetchMoreActivities(self.type, self.element.id);
promise.then(function (data) {
let dataLengthAfter = self.getData(self.element.id).length;
if (data !== null && (dataLengthAfter <= dataLengthBefore || dataLengthAfter < self.activityservice.RESULT_PER_PAGE)) {
_executeFetch();
} else {
self.loading = false;
}
}, function () {
self.loading = false;
self.$scope.$apply();
});
};
_executeFetch();
}
getComments() {
return this.activityservice.comments;
}
getActivityStream() {
let activities = this.activityservice.getData(this.type, this.element.id);
return activities;
}
page() {
if (!this.activityservice.since[this.type][this.element.id].finished) {
this.loading = true;
this.fetchUntilResults();
} else {
this.loading = false;
}
}
loadingNewer() {
return this.activityservice.runningNewer;
}
t(text) {
return t('deck', text);
}
}
let activityComponent = {
templateUrl: OC.linkTo('deck', 'templates/part.card.activity.html'),
controller: ActivityController,
bindings: {
type: '@',
element: '='
}
};
export default activityComponent;

View File

@@ -4,26 +4,41 @@
* @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/>.
*
*
*/
app.controller('AppController', function ($scope, $location, $http, $route, $log, $rootScope, $stateParams) {
$rootScope.sidebar = {
show: false
};
$scope.sidebar = $rootScope.sidebar;
$scope.user = oc_current_user;
});
import app from '../app/App.js';
/** global: OC */
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);
$rootScope.compactMode = localStorage.getItem('deck.compactMode') === 'true';
$scope.appNavigationHide = false;
$scope.toggleSidebar = function() {
if ($(window).width() > 768) {
$scope.appNavigationHide = !$scope.appNavigationHide;
console.log($scope.appNavigationHide);
}
};
});

View File

@@ -0,0 +1,78 @@
/*
* @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/>.
*
*/
/* global OC */
class AttachmentListController {
constructor ($scope, CardService, FileService) {
'ngInject';
this.cardservice = CardService;
this.fileservice = FileService;
this.attachments = CardService.getCurrent().attachments;
}
mimetypeForAttachment(attachment) {
let url = OC.MimeType.getIconUrl(attachment.extendedData.mimetype);
let styles = {
'background-image': `url("${url}")`,
};
return styles;
}
attachmentUrl(attachment) {
let cardId = this.cardservice.getCurrent().id;
let attachmentId = attachment.id;
return OC.generateUrl(`/apps/deck/cards/${cardId}/attachment/${attachmentId}`);
}
getAttachmentMarkdown(attachment) {
const inlineMimetypes = ['image/png', 'image/jpg', 'image/jpeg'];
let url = this.attachmentUrl(attachment);
let filename = attachment.data;
let insertText = `[📎 ${filename}](${url})`;
if (inlineMimetypes.indexOf(attachment.extendedData.mimetype) > -1) {
insertText = `![📎 ${filename}](${url})`;
}
return insertText;
}
select(attachment) {
this.onSelect({attachment: this.getAttachmentMarkdown(attachment)});
}
abort() {
this.onAbort();
}
}
let attachmentListComponent = {
templateUrl: '/card.attachments.html',
controller: AttachmentListController,
bindings: {
isFileSelector: '<',
attachments: '=',
onSelect: '&',
onAbort: '&'
}
};
export default attachmentListComponent;

View File

@@ -4,23 +4,25 @@
* @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/>.
*
*
*/
app.controller('BoardController', function ($rootScope, $scope, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter) {
import app from '../app/App.js';
/* global oc_defaults OC OCP OCA */
app.controller('BoardController', function ($rootScope, $scope, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter, FileService) {
$scope.sidebar = $rootScope.sidebar;
@@ -29,58 +31,134 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
addCard: [],
};
$scope.newLabel = {};
$scope.status.boardtab = $stateParams.detailTab;
$scope.OC = OC;
$scope.stackservice = StackService;
$scope.boardservice = BoardService;
$scope.cardservice = CardService;
$scope.statusservice = StatusService.getInstance();
$scope.labelservice = LabelService;
$scope.defaultColors = ['31CC7C', '317CCC', 'FF7A66', 'F1DB50', '7C31CC', 'CC317C', '3A3B3D', 'CACBCD'];
$scope.board = BoardService.getCurrent();
$scope.uploader = FileService.uploader;
$scope.startTitleEdit = function(card) {
card.renameTitle = card.title;
card.status = card.status || {};
card.status.editCard = true;
};
$scope.finishTitleEdit = function(card) {
var newTitle;
if (!card.renameTitle || !card.renameTitle.trim()) {
newTitle = '';
} else {
newTitle = card.renameTitle.trim();
}
if (newTitle === card.title) {
// title unchanged
card.status.editCard = false;
delete card.renameTitle;
} else if (newTitle !== '') {
// title changed
card.title = newTitle;
CardService.update(card).then(function (data) {
card.status.editCard = false;
delete card.renameTitle;
});
} else {
// empty title
card.status.editCard = false;
delete card.renameTitle;
}
};
$scope.$watch(function() {
return $scope.params.tab;
}, function (newTab, oldTab) {
if (newTab === 2 && oldTab !== 2) {
CardService.fetchDeleted($scope.id);
StackService.fetchDeleted($scope.id);
}
});
// workaround for $stateParams changes not being propagated
$scope.$watch(function() {
return $state.params;
}, function (params) {
$scope.params = params;
}, true);
$scope.params = $state.params;
/**
* Check for markdown checkboxes in description to render the counter
*
* This should probably be moved to the backend at some point
*
* @param text
* @returns array of [finished, total] checkboxes
*/
$scope.getCheckboxes = function(text) {
const regTotal = /\[(X|\s|\_|\-)\]/igm;
const regFinished = /\[(X|\_|\-)\]/igm;
return [
((text || '').match(regFinished) || []).length,
((text || '').match(regTotal) || []).length
];
};
$scope.search = function (searchText) {
$scope.searchText = searchText;
$scope.refreshData();
};
$scope.board = BoardService.getCurrent();
StackService.clear(); //FIXME: Is this still needed?
$scope.setPageTitle = function() {
if(BoardService.getCurrent()) {
document.title = BoardService.getCurrent().title + " | Deck - " + oc_defaults.name;
$scope.$watch(function () {
if (typeof BoardService.getCurrent() !== 'undefined') {
return BoardService.getCurrent().title;
} else {
document.title = "Deck - " + oc_defaults.name;
return null;
}
}, function () {
$scope.setPageTitle();
});
$scope.setPageTitle = function () {
if (BoardService.getCurrent()) {
document.title = BoardService.getCurrent().title + ' | Deck - ' + oc_defaults.name;
} else {
document.title = 'Deck - ' + oc_defaults.name;
}
};
$scope.statusservice.retainWaiting();
$scope.statusservice.retainWaiting();
// FIXME: ugly solution for archive
$scope.$state = $stateParams;
$scope.filter = $stateParams.filter;
$scope.$watch('$state.filter', function (name) {
$scope.filter = name;
});
// handle filter parameter for switching between archived/unarchived cards
$scope.switchFilter = function (filter) {
$state.go('.', {filter: filter}, {notify: false});
$scope.filter = filter;
$state.go('.', {filter: filter});
};
$scope.$watch('filter', function (name) {
if (name === "archive") {
$scope.$watch(function() {
return $scope.params.filter;
}, function (filter) {
if (filter === 'archive') {
$scope.loadArchived();
} else {
$scope.loadDefault();
}
});
$scope.toggleCompactMode = function() {
$rootScope.compactMode = !$rootScope.compactMode;
localStorage.setItem('deck.compactMode', JSON.stringify($rootScope.compactMode));
};
$scope.stacksData = StackService;
$scope.stacks = [];
$scope.$watch('stacksData', function (value) {
$scope.$watch('stacksData', function () {
$scope.refreshData();
}, true);
$scope.refreshData = function () {
if ($scope.filter === "archive") {
if ($scope.params.filter === 'archive') {
$scope.filterData('-lastModified', $scope.searchText);
} else {
$scope.filterData('order', $scope.searchText);
@@ -92,8 +170,9 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// filter cards here, as ng-sortable will not work nicely with html-inline filters
$scope.filterData = function (order, text) {
if ($scope.stacks === undefined)
if ($scope.stacks === undefined) {
return;
}
angular.copy(StackService.getData(), $scope.stacks);
$scope.stacks = $filter('orderBy')($scope.stacks, 'order');
angular.forEach($scope.stacks, function (value, key) {
@@ -137,30 +216,101 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// Create a new Stack
$scope.createStack = function () {
StackService.create($scope.newStack).then(function (data) {
$scope.newStack.title = "";
$scope.newStack.title = '';
});
};
$scope.createCard = function (stack, title) {
var newCard = {
'title': title,
'stackId': stack,
'type': 'plain'
};
CardService.create(newCard).then(function (data) {
$scope.stackservice.addCard(data);
$scope.newCard.title = "";
});
if (this['addCardForm' + stack].$valid) {
var newCard = {
'title': title,
'stackId': stack,
'type': 'plain'
};
CardService.create(newCard).then(function (data) {
$scope.stackservice.addCard(data);
$scope.newCard.title = '';
});
}
};
$scope.stackDelete = function (stack) {
$scope.stackservice.delete(stack.id);
};
$scope.stackUndoDelete = function (deletedStack) {
return StackService.undoDelete(deletedStack);
};
$scope.cardDelete = function (card) {
CardService.delete(card.id);
StackService.removeCard(card);
CardService.delete(card.id).then(function () {
StackService.removeCard(card);
});
};
$scope.cardOrCardAndStackUndoDelete = function (deletedCard) {
var associatedDeletedStack = $scope.stackservice.deleted[deletedCard.stackId];
if(associatedDeletedStack !== undefined) {
$scope.cardAndStackUndoDeleteAskForConfirmation(deletedCard, associatedDeletedStack);
} else {
$scope.cardUndoDelete(deletedCard);
}
};
$scope.cardAndStackUndoDeleteAskForConfirmation = function(deletedCard, associatedDeletedStack) {
OC.dialogs.confirm(
t('deck', 'The associated stack is deleted as well, it will be restored as well.'),
t('deck', 'Restore associated stack'),
function(state) {
if (state) {
$scope.cardAndStackUndoDelete(deletedCard, associatedDeletedStack);
}
}
);
};
$scope.cardAndStackUndoDelete = function(deletedCard, associatedDeletedStack) {
$scope.stackUndoDelete(associatedDeletedStack).then(function() {
$scope.cardUndoDelete(deletedCard);
});
};
$scope.cardUndoDelete = function(deletedCard) {
CardService.undoDelete(deletedCard).then(function() {
StackService.addCard(deletedCard);
});
};
$scope.cardArchive = function (card) {
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);
@@ -173,12 +323,15 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
BoardService.getCurrent().labels.splice(i, 1);
// TODO: remove from cards
};
$scope.labelCreate = function (label) {
label.boardId = $scope.id;
LabelService.create(label);
BoardService.getCurrent().labels.push(label);
$scope.status.createLabel = false;
$scope.newLabel = {};
LabelService.create(label).then(function (data) {
$scope.newStack.title = '';
BoardService.getCurrent().labels.push(data);
$scope.status.createLabel = false;
$scope.newLabel = {};
});
};
$scope.labelUpdate = function (label) {
label.edit = false;
@@ -190,13 +343,31 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
BoardService.addAcl(sharee);
$scope.status.addSharee = null;
};
$scope.aclDelete = function (acl) {
BoardService.deleteAcl(acl);
BoardService.deleteAcl(acl).then(function(data) {
$scope.loadDefault();
$scope.refreshData();
});
};
$scope.aclUpdate = function (acl) {
BoardService.updateAcl(acl);
};
$scope.aclTypeString = function (acl) {
if (typeof acl === 'undefined') {
return '';
}
switch (acl.type) {
case OC.Share.SHARE_TYPE_USER:
return 'user';
case OC.Share.SHARE_TYPE_GROUP:
return 'group';
default:
return '';
}
};
// settings for card sorting
$scope.sortOptions = {
@@ -204,7 +375,7 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
itemMoved: function (event) {
event.source.itemScope.modelValue.status = event.dest.sortableScope.$parent.column;
var order = event.dest.index;
var card = event.source.itemScope.c;
var card = $scope.cardservice.get(event.source.itemScope.c.id);
var newStack = event.dest.sortableScope.$parent.s.id;
var oldStack = card.stackId;
card.stackId = newStack;
@@ -220,33 +391,33 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
},
orderChanged: function (event) {
var order = event.dest.index;
var card = event.source.itemScope.c;
var card = $scope.cardservice.get(event.source.itemScope.c.id);
var stack = event.dest.sortableScope.$parent.s.id;
CardService.reorder(card, order).then(function (data) {
StackService.reorderCard(card, order);
$scope.refreshData();
});
},
scrollableContainer: '#board',
scrollableContainer: '#innerBoard',
containerPositioning: 'relative',
containment: '#board',
containment: '#innerBoard',
longTouch: true,
// auto scroll on drag
dragMove: function (itemPosition, containment, eventObj) {
if (eventObj) {
var container = $("#board");
var container = $('#board');
var offset = container.offset();
var targetX = eventObj.pageX - (offset.left || container.scrollLeft());
var targetY = eventObj.pageY - (offset.top || container.scrollTop());
if (targetX < offset.left) {
container.scrollLeft(container.scrollLeft() - 50);
container.scrollLeft(container.scrollLeft() - 25);
} else if (targetX > container.width()) {
container.scrollLeft(container.scrollLeft() + 50);
container.scrollLeft(container.scrollLeft() + 25);
}
if (targetY < offset.top) {
container.scrollTop(container.scrollTop() - 50);
container.scrollTop(container.scrollTop() - 25);
} else if (targetY > container.height()) {
container.scrollTop(container.scrollTop() + 50);
container.scrollTop(container.scrollTop() + 25);
}
}
},
@@ -266,11 +437,10 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
},
scrollableContainer: '#board',
containerPositioning: 'relative',
containment: '#board',
longTouch: true,
containment: '#innerBoard',
dragMove: function (itemPosition, containment, eventObj) {
if (eventObj) {
var container = $("#board");
var container = $('#board');
var offset = container.offset();
var targetX = eventObj.pageX - (offset.left || container.scrollLeft());
var targetY = eventObj.pageY - (offset.top || container.scrollTop());
@@ -291,4 +461,34 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
}
};
$scope.labelStyle = function (color) {
return {
'background-color': '#' + color,
'color': $filter('textColorFilter')(color)
};
};
$scope.colorValue = function(color) {
const re = /^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/;
if (re.test(color)) {
return color;
}
return '';
};
$scope.attachmentCount = function(card) {
if (Array.isArray(card.attachments)) {
return card.attachments.filter((obj) => obj.deletedAt === 0).length;
}
return card.attachmentCount;
};
$scope.unreadCommentCount = function(card) {
return card.commentsUnread;
};
$scope.isTimelineEnabled = function() {
return OCP.Comments && OCA.Activity;
};
});

View File

@@ -4,85 +4,212 @@
* @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/>.
*
*
*/
/* global app */
/* global moment */
/* global app moment angular OC OCP OCA */
import app from '../app/App.js';
app.controller('CardController', function ($scope, $rootScope, $routeParams, $location, $stateParams, BoardService, CardService, StackService, StatusService) {
app.controller('CardController', function ($scope, $rootScope, $sce, $location, $stateParams, $state, $interval, $timeout, $filter, BoardService, CardService, StackService, StatusService, markdownItConverter, FileService) {
$scope.sidebar = $rootScope.sidebar;
$scope.status = {};
$scope.status = {
renameTitle: '',
lastEdit: 0,
lastSave: Date.now()
};
$scope.cardservice = CardService;
$scope.fileservice = FileService;
$scope.cardId = $stateParams.cardId;
$scope.statusservice = StatusService.getInstance();
$scope.boardservice = BoardService;
$scope.isArray = angular.isArray;
// workaround for $stateParams changes not being propagated
$scope.$watch(function() {
return $state.params;
}, function (params) {
$scope.params = params;
$scope.fileservice.reset();
}, true);
$scope.params = $state.params;
$scope.addAttachmentToDescription = function(insertText) {
let el = document.querySelectorAll('textarea')[0];
let start = el.selectionStart;
let end = el.selectionEnd;
let text = $scope.status.edit.description || '';
let before = text.substring(0, start);
let after = text.substring(end, text.length);
let newText = before + '\n' + insertText + '\n' + after;
$scope.status.edit.description = newText;
el.selectionStart = el.selectionEnd = start + newText.length;
el.focus();
$scope.status.continueEdit = false;
$scope.cardEditDescriptionChanged();
$scope.status.selectAttachment = false;
};
$scope.abortAttachmentSelection = function() {
$scope.status.continueEdit = false;
$scope.status.selectAttachment = false;
let el = document.querySelectorAll('textarea')[0];
el.focus();
};
$scope.statusservice.retainWaiting();
$scope.description = function() {
return $scope.rendered;
};
$scope.updateMarkdown = function(content) {
// only trust the html from markdown-it-checkbox
$scope.rendered = $sce.trustAsHtml(markdownItConverter.render(content || ''));
};
CardService.fetchOne($scope.cardId).then(function (data) {
$scope.statusservice.releaseWaiting();
$scope.archived = CardService.getCurrent().archived;
$scope.updateMarkdown(CardService.getCurrent().description);
}, function (error) {
});
$scope.cardRenameShow = function () {
if ($scope.archived || !BoardService.canEdit())
if ($scope.archived || !BoardService.canEdit()) {
return false;
else {
} else {
$scope.status.renameTitle = CardService.getCurrent().title;
$scope.status.cardRename = true;
}
};
$scope.cardEditDescriptionShow = function ($event) {
$scope.toggleCheckbox = function (id) {
$('#markdown input[type=checkbox]').attr('disabled', true);
$scope.status.edit = angular.copy(CardService.getCurrent());
var reg = /\[(X|\s|\_|\-)\]/ig;
var nth = 0;
$scope.status.edit.description = $scope.status.edit.description.replace(reg, function (match, i, original) {
var result = match;
if ('' + nth++ === '' + id) {
if (match.match(/^\[\s\]/i)) {
result = match.replace(/\[\s\]/i, '[x]');
}
if (match.match(/^\[x\]/i)) {
result = match.replace(/\[x\]/i, '[ ]');
}
return result;
}
return match;
});
CardService.update($scope.status.edit).then(function (data) {
var header = $('.tabDetails');
header.find('.save-indicator.unsaved').hide();
header.find('.save-indicator.saved').fadeIn(250).fadeOut(1000);
});
$('#markdown input[type=checkbox]').removeAttr('disabled');
};
$scope.clickCardDescription = function ($event) {
var checkboxId = $($event.target).data('id');
if ($event.target.tagName === 'LABEL') {
$scope.toggleCheckbox(checkboxId);
$event.stopPropagation();
return false;
}
if ($event.target.tagName === 'INPUT') {
$event.stopPropagation();
return;
}
if (BoardService.isArchived() || CardService.getCurrent().archived) {
return false;
}
var node = $event.target.nodeName;
if ($scope.card.archived || !$scope.boardservice.canEdit()) {
console.log(node);
} else {
console.log("edit");
$scope.status.cardEditDescription = true;
return false;
}
console.log($scope.status.canEditDescription);
$scope.status.cardEditDescription = true;
$scope.status.edit = angular.copy(CardService.getCurrent());
return true;
};
$scope.cardEditDescriptionChanged = function ($event) {
$scope.status.lastEdit = Date.now();
var header = $('.tabDetails');
header.find('.save-indicator.unsaved').show();
header.find('.save-indicator.saved').hide();
};
$interval(function() {
var currentTime = Date.now();
var timeSinceEdit = currentTime-$scope.status.lastEdit;
if (timeSinceEdit > 1000 && $scope.status.lastEdit > $scope.status.lastSave && !$scope.status.saving) {
$scope.status.lastSave = currentTime;
$scope.status.saving = true;
var header = $('.tabDetails');
header.find('.save-indicator.unsaved').fadeIn(500);
CardService.update($scope.status.edit).then(function (data) {
var header = $('.tabDetails');
header.find('.save-indicator.unsaved').hide();
header.find('.save-indicator.saved').fadeIn(250).fadeOut(1000);
$scope.status.saving = false;
});
}
}, 500, 0, false);
// handle rename to update information on the board as well
$scope.cardRename = function (card) {
CardService.rename(card).then(function (data) {
StackService.updateCard(card);
var newTitle;
if (!$scope.status.renameTitle || !$scope.status.renameTitle.trim()) {
newTitle = '';
} else {
newTitle = $scope.status.renameTitle.trim();
}
if (newTitle === card.title) {
// title unchanged
$scope.status.renameCard = false;
});
} else if (newTitle !== '') {
// title changed
card.title = newTitle;
CardService.rename(card).then(function (data) {
$scope.status.renameCard = false;
});
} else {
// empty title
$scope.status.renameTitle = card.title;
$scope.status.renameCard = false;
}
};
$scope.cardUpdate = function (card) {
CardService.update(CardService.getCurrent()).then(function (data) {
CardService.update(card).then(function (data) {
$scope.status.cardEditDescription = false;
$('#card-description').find('.save-indicator').fadeIn(500).fadeOut(1000);
$scope.updateMarkdown($scope.status.edit.description);
var header = $('.tabDetails');
header.find('.save-indicator.unsaved').hide();
header.find('.save-indicator.saved').fadeIn(500).fadeOut(1000);
});
};
$scope.labelAssign = function (element, model) {
CardService.assignLabel($scope.cardId, element.id);
var card = CardService.getCurrent();
StackService.updateCard(card);
CardService.assignLabel($scope.cardId, element.id).then(function (data) {
});
};
$scope.labelRemove = function (element, model) {
CardService.removeLabel($scope.cardId, element.id)
CardService.removeLabel($scope.cardId, element.id).then(function (data) {
});
};
$scope.setDuedate = function (duedate) {
@@ -94,9 +221,8 @@ app.controller('CardController', function ($scope, $rootScope, $routeParams, $lo
newDate.date(duedate.date());
newDate.month(duedate.month());
newDate.year(duedate.year());
element.duedate = newDate.format('YYYY-MM-DD HH:mm:ss');
element.duedate = newDate.toISOString();
CardService.update(element);
StackService.updateCard(element);
};
$scope.setDuedateTime = function (time) {
var element = CardService.getCurrent();
@@ -106,15 +232,55 @@ app.controller('CardController', function ($scope, $rootScope, $routeParams, $lo
}
newDate.hour(time.hour());
newDate.minute(time.minute());
element.duedate = newDate.format('YYYY-MM-DD HH:mm:ss');
element.duedate = newDate.toISOString();
CardService.update(element);
StackService.updateCard(element);
};
$scope.resetDuedate = function () {
var element = CardService.getCurrent();
element.duedate = null;
CardService.update(element);
StackService.updateCard(element);
};
/**
* Show ui-select field when clicking the add button
*/
$scope.toggleAssignUser = function() {
$scope.status.showAssignUser = !$scope.status.showAssignUser;
if ($scope.status.showAssignUser === true) {
$timeout(function () {
$('#assignUserSelect').find('a').click();
});
}
};
/**
* Hide ui-select when select list is closed
*/
$scope.assingUserOpenClose = function(isOpen) {
$scope.status.showAssignUser = isOpen;
};
$scope.addAssignedUser = function(item) {
CardService.assignUser(CardService.getCurrent(), item.uid).then(function (data) {
});
$scope.status.showAssignUser = false;
};
$scope.removeAssignedUser = function(uid) {
CardService.unassignUser(CardService.getCurrent(), uid).then(function (data) {
});
};
$scope.labelStyle = function (color) {
return {
'background-color': '#' + color,
'color': $filter('textColorFilter')(color)
};
};
$scope.isTimelineEnabled = function() {
return OCP.Comments && OCA.Activity;
};
});

View File

@@ -0,0 +1,44 @@
/*
* @copyright Copyright (c) 2018 Oskar Kurz <oskar.kurz@gmail.com>
*
* @author Oskar Kurz <oskar.kurz@gmail.com>
*
* @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/>.
*
*/
import app from '../app/App.js';
/* global oc_defaults OC */
app.controller('ColorPickerController', ['$scope', function ($scope) {
$scope.hashedColor = '';
$scope.setColor = function (object, color) {
object.color = color;
object.hashedColor = '#' + color;
return object;
};
$scope.setHashedColor = function (object) {
object.color = object.hashedColor.substr(1);
return object;
};
$scope.getCustomBackground = function (color) {
return {'background-color': color};
};
}]);

View File

@@ -22,7 +22,29 @@
/* global app angular */
app.controller('ListController', function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state) {
var ListController = function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state, StatusService) {
function calculateNewColor() {
var boards = BoardService.getAll();
var boardKeys = Object.keys(boards);
var colorOccurrences = [];
for (var i = 0; i < $scope.colors.length; i++) {
colorOccurrences.push(0);
}
for (var j = 0; j < boardKeys.length; j++) {
var key = boardKeys[j];
var board = boards[key];
if (board && $scope.colors.indexOf(board.color) !== -1) {
colorOccurrences[$scope.colors.indexOf(board.color)]++;
}
}
return $scope.colors[colorOccurrences.indexOf(Math.min.apply(Math, colorOccurrences))];
}
$scope.boards = [];
$scope.newBoard = {};
$scope.status = {
@@ -32,44 +54,73 @@ app.controller('ListController', function ($scope, $location, $filter, BoardServ
};
$scope.colors = ['0082c9', '00c9c6','00c906', 'c92b00', 'F1DB50', '7C31CC', '3A3B3D', 'CACBCD'];
$scope.boardservice = BoardService;
$scope.newBoard.color = $scope.colors[0];
$scope.updatingBoard = null;
// FIXME: not nice, but we want to load this only once
if($element.attr('id') === 'app-navigation') {
BoardService.fetchAll().then(function(data) {
$scope.filterData();
}, function (error) {
// TODO: show error when loading fails
});
}
$scope.filterData = function () {
angular.copy($scope.boardservice.getData(), $scope.boardservice.sorted);
angular.copy($scope.boardservice.sorted, $scope.boardservice.sidebar);
$scope.boardservice.sidebar = $filter('orderBy')($scope.boardservice.sidebar, 'title');
$scope.boardservice.sidebar = $filter('cardFilter')($scope.boardservice.sidebar, {archived: false});
if ($scope.status.filter === 'archived') {
var filter = {};
filter[$scope.status.filter] = true;
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, filter);
} else if ($scope.status.filter === 'shared') {
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, {archived: false});
$scope.boardservice.sorted = $filter('boardFilterAcl')($scope.boardservice.sorted);
var filterData = function () {
if($element.attr('id') === 'app-navigation') {
$scope.boardservice.sidebar = $scope.boardservice.getData();
$scope.boardservice.sidebar = $filter('orderBy')($scope.boardservice.sidebar, 'title');
$scope.boardservice.sidebar = $filter('cardFilter')($scope.boardservice.sidebar, {archived: false});
} else {
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, {archived: false});
$scope.boardservice.sorted = $scope.boardservice.getData();
if ($scope.status.filter === 'archived') {
var filter = {};
filter[$scope.status.filter] = true;
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, filter);
} else if ($scope.status.filter === 'shared') {
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, {archived: false});
$scope.boardservice.sorted = $filter('boardFilterAcl')($scope.boardservice.sorted);
} else {
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, {archived: false});
}
$scope.boardservice.sorted = $filter('orderBy')($scope.boardservice.sorted, ['deletedAt', 'title']);
}
$scope.boardservice.sorted = $filter('orderBy')($scope.boardservice.sorted, ['deletedAt', 'title']);
};
$scope.$watchCollection(function(){
return $state.params;
}, function(){
$scope.status.filter = $state.params.filter;
$scope.filterData();
});
var finishedLoading = function() {
filterData();
$scope.newBoard.color = calculateNewColor();
};
var initialize = function () {
$scope.statusservice = StatusService.listStatus;
if($element.attr('id') === 'app-navigation') {
$scope.statusservice.retainWaiting();
BoardService.fetchAll().then(function(data) {
finishedLoading();
$scope.statusservice.releaseWaiting();
BoardService.loaded = true;
}, function (error) {
$scope.statusservice.setError('Error occured', error);
});
} else {
/* initialize main list controller when board list is loaded */
var boardDataWatch = $scope.$watch(function () {
return $scope.boardservice.loaded;
}, function () {
if (BoardService.loaded === true) {
boardDataWatch();
finishedLoading();
}
});
}
$scope.$watch(function () {
return $scope.boardservice.data;
}, function () {
filterData();
}, true);
/* Watch for board filter change */
$scope.$watchCollection(function(){
return $state.params;
}, function(){
$scope.status.filter = $state.params.filter;
filterData();
});
};
initialize();
$scope.selectColor = function(color) {
$scope.newBoard.color = color;
@@ -90,9 +141,9 @@ app.controller('ListController', function ($scope, $location, $filter, BoardServ
BoardService.create($scope.newBoard)
.then(function (response) {
$scope.newBoard = {};
$scope.newBoard.color = $scope.colors[0];
$scope.newBoard.color = calculateNewColor();
$scope.status.addBoard=false;
$scope.filterData();
filterData();
}, function(error) {
$scope.status.createBoard = 'Unable to insert board: ' + error.message;
});
@@ -100,47 +151,48 @@ app.controller('ListController', function ($scope, $location, $filter, BoardServ
$scope.boardUpdate = function(board) {
BoardService.update(board).then(function(data) {
$scope.filterData();
board.status.edit = false;
filterData();
});
};
$scope.boardUpdateBegin = function(board) {
$scope.updatingBoard = board;
$scope.updatingBoard = angular.copy(board);
};
$scope.boardUpdateReset = function(board) {
board.title = $scope.updatingBoard.title;
board.color = $scope.updatingBoard.color;
$scope.filterData();
filterData();
board.status.edit = false;
};
$scope.boardArchive = function (board) {
board.archived = true;
BoardService.update(board).then(function(data) {
$scope.filterData();
filterData();
});
};
$scope.boardUnarchive = function (board) {
board.archived = false;
BoardService.update(board).then(function(data) {
$scope.filterData();
filterData();
});
};
$scope.boardDelete = function(board) {
BoardService.delete(board.id).then(function (data) {
$scope.filterData();
filterData();
});
};
$scope.boardDeleteUndo = function (board) {
BoardService.deleteUndo(board.id).then(function (data) {
$scope.filterData();
filterData();
});
};
});
};
export default ListController;

View File

@@ -19,31 +19,30 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.directive('appPopoverMenuUtils', function () {
'use strict';
return {
restrict: 'C',
link: function (scope, elm) {
var menu = elm.find('.popovermenu');
var button = elm.find('button');
button.click(function (e) {
$('.popovermenu').addClass('hidden');
menu.toggleClass('hidden');
if(!menu.hasClass('hidden')) {
button.css('display','block');
} else {
button.css('display','');
}
'use strict';
return {
restrict: 'C',
link: function (scope, elm) {
var menu = elm.find('.popovermenu');
var button = elm.find('button');
button.click(function (e) {
var popovermenus = $('.popovermenu');
var shouldShow = menu.hasClass('hidden');
popovermenus.addClass('hidden');
if (shouldShow) {
menu.toggleClass('hidden');
}
e.stopPropagation();
});
scope.$on('documentClicked', function (scope, event) {
/* prevent closing popover if target has no-close class */
if (event.target !== button && !$(event.target).hasClass('no-close')) {
menu.addClass('hidden');
}
button.css('display','');
});
}
};
scope.$on('documentClicked', function (scope, event) {
/* prevent closing popover if target has no-close class */
if (event.target !== button && !$(event.target).hasClass('no-close')) {
menu.addClass('hidden');
}
});
}
};
});

View File

@@ -20,27 +20,28 @@
*
*/
import app from '../app/App.js';
// OwnCloud Click Handling
// https://doc.owncloud.org/server/8.0/developer_manual/app/css.html
app.directive('appNavigationEntryUtils', function () {
'use strict';
return {
restrict: 'C',
link: function (scope, elm) {
'use strict';
return {
restrict: 'C',
link: function (scope, elm) {
var menu = elm.siblings('.app-navigation-entry-menu');
var button = $(elm)
.find('.app-navigation-entry-utils-menu-button button');
var menu = elm.siblings('.app-navigation-entry-menu');
var button = $(elm)
.find('.app-navigation-entry-utils-menu-button button');
button.click(function () {
menu.toggleClass('open');
});
scope.$on('documentClicked', function (scope, event) {
if (event.target !== button[0]) {
menu.removeClass('open');
}
});
}
};
button.click(function () {
menu.toggleClass('open');
});
scope.$on('documentClicked', function (scope, event) {
if (event.target !== button[0]) {
menu.removeClass('open');
}
});
}
};
});

View File

@@ -19,10 +19,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.directive('autofocusOnInsert', function () {
'use strict';
return function (scope, elm) {
elm.focus();
};
'use strict';
return function (scope, elm) {
elm.focus();
};
});

View File

@@ -4,33 +4,52 @@
* @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/>.
*
*
*/
import app from '../app/App.js';
app.directive('avatar', function() {
'use strict';
return {
restrict: 'A',
scope: true,
restrict: 'AEC',
transclude: true,
replace: true,
template: '<div class="avatardiv-container"><div class="avatardiv" data-toggle="tooltip" ng-transclude></div></div>',
scope: { attr: '=' },
link: function(scope, element, attr){
attr.$observe('displayname', function(value){
if(value!==undefined) {
$(element).avatar(value, 32);
}
});
}
scope.uid = attr.displayname;
scope.displayname = attr.displayname;
scope.size = attr.size;
if (typeof scope.size === 'undefined') {
scope.size = 32;
}
var value = attr.user;
var avatardiv = $(element).find('.avatardiv');
if(typeof attr.contactsmenu !== 'undefined' && attr.contactsmenu !== 'false') {
avatardiv.contactsMenu(value, 0, $(element));
avatardiv.addClass('has-contactsmenu');
}
if(typeof attr.tooltip !== 'undefined' && attr.tooltip !== 'false') {
$(element).tooltip({
title: scope.displayname,
placement: 'top'
});
}
avatardiv.avatar(value, scope.size, false, false, false, attr.displayname);
},
controller: function () {}
};
});
});

View File

@@ -0,0 +1,38 @@
/*
* @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/>.
*
*/
import app from '../app/App.js';
app.directive('bindHtmlCompile', function ($compile) {
'use strict';
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(function () {
return scope.$eval(attrs.bindHtmlCompile);
}, function (value) {
element.html(value);
$compile(element.contents())(scope);
});
}
};
});

View File

@@ -0,0 +1,42 @@
/*
* @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/>.
*
*/
import app from '../app/App.js';
app.directive('contactsmenudelete', function() {
'use strict';
return {
restrict: 'A',
priority: 1,
link: function(scope, element, attr){
var user = attr.user;
var menu = $(element).parent().find('.contactsmenu-popover');
if (oc_current_user === user) {
menu.children(':first').remove();
}
var menuEntry = $('<li><a><span class="icon icon-delete"></span><span>' + t('deck', 'Remove user from card') + '</span></a></li>');
menuEntry.on('click', function () {
scope.removeAssignedUser(user);
});
$(menu).append(menuEntry);
}
};
});

View File

@@ -0,0 +1,59 @@
/*
* @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/>.
*
*/
import app from '../app/App';
app.directive('ngContenteditable', function($compile) {
return {
require: 'ngModel',
restrict: 'A',
scope: {
submit: '&ngSubmit'
},
link: function(scope, element, attrs, ngModel) {
//read the text typed in the div (syncing model with the view)
function read() {
ngModel.$setViewValue(element.html());
}
//render the data now in your model into your view
//$render is invoked when the modelvalue differs from the viewvalue
//see documentation: https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#
ngModel.$render = function() {
element.html(ngModel.$viewValue || '');
};
//do this whenever someone starts typing
element.bind('blur keyup change', function(event) {
scope.$apply(read);
});
element.bind('keydown', function(event) {
if(event.which === 13 && event.shiftKey) {
scope.submit();
}
});
}
};
});

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
/* global app */
/* gloabl t */
@@ -29,9 +30,10 @@ app.directive('datepicker', function () {
return {
link: function (scope, elm, attr) {
return elm.datepicker({
dateFormat: 'yy-mm-dd',
dateFormat: moment.localeData().longDateFormat('L').replace('YYYY', 'YY').toLowerCase(),
onSelect: function(date, inst) {
scope.setDuedate(moment(date));
var selectedDate = $(this).datepicker('getDate');
scope.setDuedate(moment(selectedDate));
scope.$apply();
},
beforeShow: function(input, inst) {

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
// original idea from blockloop: http://stackoverflow.com/a/24090733
app.directive('elastic', [

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.directive('search', function ($document, $location) {
'use strict';

View File

@@ -19,6 +19,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
import '../legacy/jquery.ui.timepicker.js';
import 'legacy/jquery.ui.timepicker.css';
/* global app */
/* global t */
@@ -29,7 +32,7 @@ app.directive('timepicker', function() {
return {
restrict: 'A',
link: function(scope, elm, attr) {
return elm.timepicker({
return $(elm).timepicker({
onSelect: function(date, inst) {
scope.setDuedateTime(moment('2000-01-01 ' + date));
scope.$apply();

View File

@@ -19,9 +19,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('boardFilterAcl', function() {
return function(boards) {
return function(boards) {
var _result = [];
angular.forEach(boards, function(board){
if(board.acl !== null && Object.keys(board.acl).length > 0) {
@@ -29,5 +30,5 @@ app.filter('boardFilterAcl', function() {
}
});
return _result;
};
};
});

37
js/filters/bytesFilter.js Normal file
View File

@@ -0,0 +1,37 @@
/*
* @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/>.
*
*/
import app from '../app/App.js';
app.filter('bytes', function () {
return function (bytes, precision) {
if (isNaN(parseFloat(bytes, 10)) || !isFinite(bytes)) {
return '-';
}
if (typeof precision === 'undefined') {
precision = 2;
}
var units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'],
number = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number];
};
});

View File

@@ -19,11 +19,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
// usage | cardFilter({ member: 'admin'})
app.filter('cardFilter', function() {
return function(cards, rules) {
return function(cards, rules) {
var _result = [];
angular.forEach(cards, function(card){
var _card = card;
@@ -35,5 +36,5 @@ app.filter('cardFilter', function() {
});
});
return _result;
};
};
});

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('cardSearchFilter', function() {
return function(cards, searchString) {

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
/* global app */
/* global OC */
@@ -27,28 +28,29 @@
app.filter('relativeDateFilter', function() {
return function (timestamp) {
return OC.Util.relativeModifiedDate(timestamp*1000);
}
};
});
app.filter('relativeDateFilterString', function() {
return function (date) {
return OC.Util.relativeModifiedDate(Date.parse(date));
}
};
});
app.filter('dateToTimestamp', function() {
return function (date) {
return Date.parse(date);
}
};
});
app.filter('parseDate', function() {
return function (date) {
if(moment(date).isValid()) {
return moment(date).format('YYYY-MM-DD');
var dateFormat = moment.localeData().longDateFormat('L');
return moment(date).format(dateFormat);
}
return '';
}
};
});
app.filter('parseTime', function() {
@@ -57,5 +59,5 @@ app.filter('parseTime', function() {
return moment(date).format('HH:mm');
}
return '';
}
};
});

View File

@@ -19,8 +19,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('iconWhiteFilter', function() {
app.filter('iconWhiteFilter', function () {
return function (hex) {
// RGB2HLS by Garry Tan
// http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
@@ -30,36 +31,37 @@ app.filter('iconWhiteFilter', function() {
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
if(result !== null) {
var r = color.r/255;
var g = color.g/255;
var b = color.b/255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
// TODO: Maybe just darken/lighten the color
if(l<0.5) {
return "-white";
} else {
return "";
}
//var rgba = "rgba(" + color.r + "," + color.g + "," + color.b + ",0.7)";
//return rgba;
} else {
return "";
if (result === null) {
return '';
}
var r = color.r / 255;
var g = color.g / 255;
var b = color.b / 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
}
if (max === min) {
h = s = 0; // achromatic
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
if (l < 0.5) {
return '-white';
} else {
return '';
}
};
});

View File

@@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('lightenColorFilter', function() {
return function (hex) {
@@ -29,9 +30,9 @@ app.filter('lightenColorFilter', function() {
b: parseInt(result[3], 16)
} : null;
if (result !== null) {
return "rgba(" + color.r + "," + color.g + "," + color.b + ",0.7)";
return 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',0.7)';
} else {
return "#" + hex;
return '#' + hex;
}
}
});
};
});

View File

@@ -19,13 +19,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('orderObjectBy', function(){
return function(input, attribute) {
if (!angular.isObject(input)) return input;
if (!angular.isObject(input)) {
return input;
}
var array = [];
for(var objectKey in input) {
array.push(input[objectKey]);
if ({}.hasOwnProperty.call(input, objectKey)) {
array.push(input[objectKey]);
}
}
array.sort(function(a, b){
@@ -34,5 +39,5 @@ app.filter('orderObjectBy', function(){
return a < b;
});
return array;
}
};
});

View File

@@ -19,8 +19,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.filter('textColorFilter', function() {
app.filter('textColorFilter', function () {
return function (hex) {
// RGB2HLS by Garry Tan
// http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
@@ -30,33 +31,39 @@ app.filter('textColorFilter', function() {
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
if(result !== null) {
var r = color.r/255;
var g = color.g/255;
var b = color.b/255;
if (result !== null) {
var r = color.r / 255;
var g = color.g / 255;
var b = color.b / 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
if (max === min) {
h = s = 0; // achromatic
}else{
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0);
break;
case g:
h = (b - r) / d + 2;
break;
case b:
h = (r - g) / d + 4;
break;
}
h /= 6;
}
if(l<0.5) {
return "#ffffff";
if (l < 0.5) {
return '#ffffff';
} else {
return "#000000";
return '#000000';
}
} else {
return "#000000";
return '#000000';
}
}
};
});

View File

@@ -0,0 +1,46 @@
/*
* @copyright Copyright (c) 2017 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/>.
*
*/
import app from '../app/App.js';
/* global app */
/* global angular */
/*
* Remove all assignedUsers from users list
*/
app.filter('withoutAssignedUsers', function () {
return function (users, assignedUsers) {
var _result = [];
angular.forEach(users, function (user) {
var _found = false;
angular.forEach(assignedUsers, function (assignedUser) {
if (assignedUser.participant.uid === user.uid) {
_found = true;
}
});
if (_found === false) {
_result.push(user);
}
});
return _result;
};
});

33
js/init.js Normal file
View File

@@ -0,0 +1,33 @@
'use strict';
/* global __webpack_nonce__ OC */
__webpack_nonce__ = btoa(OC.requestToken); // eslint-disable-line no-native-reassign
// used for building a vendor stylesheet
import 'ng-sortable/dist/ng-sortable.css';
import angular from 'angular';
import markdownit from 'markdown-it';
global.markdownit = markdownit;
import app from './app/App.js';
import './app/Config.js';
import './app/Run.js';
import ListController from 'controller/ListController.js';
import attachmentListComponent from './controller/AttachmentController.js';
import activityComponent from './controller/ActivityController.js';
app.controller('ListController', ListController);
app.component('attachmentListComponent', attachmentListComponent);
app.component('activityComponent', activityComponent);
// require all the js files from subdirectories
var context = require.context('.', true, /(controller|service|filters|directive)\/(.*)\.js$/);
context.keys().forEach(function (key) {
context(key);
});

View File

@@ -0,0 +1,161 @@
/**
* @licence
*/
import CommentModel from './commentmodel.js';
import CommentSummaryModel from './commentsummarymodel.js';
/**
* @class CommentCollection
* @classdesc
*
* Collection of comments assigned to a file
*
*/
var CommentCollection = OC.Backbone.Collection.extend(
/** @lends OCA.AnnouncementCenter.Comments.CommentCollection.prototype */ {
sync: OC.Backbone.davSync,
model: CommentModel,
/**
* Object type
*
* @type string
*/
_objectType: 'deckCard',
/**
* Object id
*
* @type string
*/
_objectId: null,
/**
* True if there are no more page results left to fetch
*
* @type bool
*/
_endReached: false,
/**
* Number of comments to fetch per page
*
* @type int
*/
_limit : 5,
/**
* Initializes the collection
*
* @param {string} [options.objectType] object type
* @param {string} [options.objectId] object id
*/
initialize: function(models, options) {
options = options || {};
if (options.objectType) {
this._objectType = options.objectType;
}
if (options.objectId) {
this._objectId = options.objectId;
}
},
url: function() {
return OC.linkToRemote('dav') + '/comments/' +
encodeURIComponent(this._objectType) + '/' +
encodeURIComponent(this._objectId) + '/';
},
setObjectId: function(objectId) {
this._objectId = objectId;
},
hasMoreResults: function() {
return !this._endReached;
},
reset: function() {
this._endReached = false;
this._summaryModel = null;
return OC.Backbone.Collection.prototype.reset.apply(this, arguments);
},
/**
* Fetch the next set of results
*/
fetchNext: function(options) {
var self = this;
if (!this.hasMoreResults()) {
return null;
}
var body = '<?xml version="1.0" encoding="utf-8" ?>\n' +
'<oc:filter-comments xmlns:D="DAV:" xmlns:oc="http://owncloud.org/ns">\n' +
// load one more so we know there is more
' <oc:limit>' + (this._limit + 1) + '</oc:limit>\n' +
' <oc:offset>' + this.length + '</oc:offset>\n' +
'</oc:filter-comments>\n';
options = options || {};
var success = options.success;
options = _.extend({
remove: false,
parse: true,
data: body,
davProperties: CommentCollection.prototype.model.prototype.davProperties,
success: function(resp) {
if (resp.length <= self._limit) {
// no new entries, end reached
self._endReached = true;
} else {
// remove last entry, for next page load
resp = _.initial(resp);
}
if (!self.set(resp, options)) {
return false;
}
if (success) {
success.apply(null, arguments);
}
self.trigger('sync', 'REPORT', self, options);
}
}, options);
return this.sync('REPORT', this, options);
},
/**
* Returns the matching summary model
*
* @return {OCA.AnnouncementCenter.Comments.CommentSummaryModel} summary model
*/
getSummaryModel: function() {
if (!this._summaryModel) {
this._summaryModel = new CommentSummaryModel({
id: this._objectId,
objectType: this._objectType
});
}
return this._summaryModel;
},
/**
* Updates the read marker for this comment thread
*
* @param {Date} [date] optional date, defaults to now
* @param {Object} [options] backbone options
*/
updateReadMarker: function(date, options) {
options = options || {};
return this.getSummaryModel().save({
readMarker: (date || new Date()).toUTCString()
}, options);
}
});
export default CommentCollection;

119
js/legacy/commentmodel.js Normal file
View File

@@ -0,0 +1,119 @@
/*
* Copyright (c) 2016
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
var NS_OWNCLOUD = 'http://owncloud.org/ns';
/**
* @class CommentModel
* @classdesc
*
* Comment
*
*/
var CommentModel = OC.Backbone.Model.extend(
/** @lends OCA.Comments.CommentModel.prototype */ {
sync: OC.Backbone.davSync,
/**
* Object type
*
* @type string
*/
_objectType: 'deckCard',
/**
* Object id
*
* @type string
*/
_objectId: null,
initialize: function(model, options) {
options = options || {};
if (options.objectType) {
this._objectType = options.objectType;
}
if (options.objectId) {
this._objectId = options.objectId;
}
},
defaults: {
actorType: 'users',
objectType: 'deckCard'
},
davProperties: {
'id': '{' + NS_OWNCLOUD + '}id',
'message': '{' + NS_OWNCLOUD + '}message',
'actorType': '{' + NS_OWNCLOUD + '}actorType',
'actorId': '{' + NS_OWNCLOUD + '}actorId',
'actorDisplayName': '{' + NS_OWNCLOUD + '}actorDisplayName',
'creationDateTime': '{' + NS_OWNCLOUD + '}creationDateTime',
'objectType': '{' + NS_OWNCLOUD + '}objectType',
'objectId': '{' + NS_OWNCLOUD + '}objectId',
'isUnread': '{' + NS_OWNCLOUD + '}isUnread',
'mentions': '{' + NS_OWNCLOUD + '}mentions'
},
parse: function(data) {
return {
id: data.id,
message: data.message,
actorType: data.actorType,
actorId: data.actorId,
actorDisplayName: data.actorDisplayName,
creationDateTime: data.creationDateTime,
objectType: data.objectType,
objectId: data.objectId,
isUnread: (data.isUnread === 'true'),
mentions: this._parseMentions(data.mentions)
};
},
_parseMentions: function(mentions) {
if(_.isUndefined(mentions)) {
return {};
}
var result = {};
for(var i in mentions) {
var mention = mentions[i];
if(_.isUndefined(mention.localName) || mention.localName !== 'mention') {
continue;
}
result[i] = {};
for (var child = mention.firstChild; child; child = child.nextSibling) {
if(_.isUndefined(child.localName) || !child.localName.startsWith('mention')) {
continue;
}
result[i][child.localName] = child.textContent;
}
}
return result;
},
url: function() {
let baseUrl;
if (typeof this.collection === 'undefined') {
baseUrl = OC.linkToRemote('dav') + '/comments/' +
encodeURIComponent(this.get('objectType')) + '/' +
encodeURIComponent(this.get('objectId')) + '/';
} else {
baseUrl = this.collection.url();
}
if (typeof this.get('id') !== 'undefined') {
return baseUrl + this.get('id');
} else {
return baseUrl;
}
}
});
export default CommentModel;

View File

@@ -0,0 +1,54 @@
var NS_OWNCLOUD = 'http://owncloud.org/ns';
/**
* @class OCA.AnnouncementCenter.Comments.CommentSummaryModel
* @classdesc
*
* Model containing summary information related to comments
* like the read marker.
*
*/
var CommentSummaryModel = OC.Backbone.Model.extend(
/** @lends OCA.AnnouncementCenter.Comments.CommentSummaryModel.prototype */ {
sync: OC.Backbone.davSync,
/**
* Object type
*
* @type string
*/
_objectType: 'deckCard',
/**
* Object id
*
* @type string
*/
_objectId: null,
davProperties: {
'readMarker': '{' + NS_OWNCLOUD + '}readMarker'
},
/**
* Initializes the summary model
*
* @param {string} [options.objectType] object type
* @param {string} [options.objectId] object id
*/
initialize: function(attrs, options) {
options = options || {};
if (options.objectType) {
this._objectType = options.objectType;
}
},
url: function() {
return OC.linkToRemote('dav') + '/comments/' +
encodeURIComponent(this._objectType) + '/' +
encodeURIComponent(this.id) + '/';
}
});
export default CommentSummaryModel;

1
js/legacy/jquery.atwho.min.js vendored Normal file

File diff suppressed because one or more lines are too long

561
js/legacy/jquery.caret.min.js vendored Normal file
View File

@@ -0,0 +1,561 @@
/*
* @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/>.
*
*/
(function($, undefined) {
var _input = document.createElement('input');
var _support = {
setSelectionRange: ('setSelectionRange' in _input) || ('selectionStart' in _input),
createTextRange: ('createTextRange' in _input) || ('selection' in document)
};
var _rNewlineIE = /\r\n/g,
_rCarriageReturn = /\r/g;
var _getValue = function(input) {
if (typeof(input.value) !== 'undefined') {
return input.value;
}
return $(input).text();
};
var _setValue = function(input, value) {
if (typeof(input.value) !== 'undefined') {
input.value = value;
} else {
$(input).text(value);
}
};
var _getIndex = function(input, pos) {
var norm = _getValue(input).replace(_rCarriageReturn, '');
var len = norm.length;
if (typeof(pos) === 'undefined') {
pos = len;
}
pos = Math.floor(pos);
// Negative index counts backward from the end of the input/textarea's value
if (pos < 0) {
pos = len + pos;
}
// Enforce boundaries
if (pos < 0) { pos = 0; }
if (pos > len) { pos = len; }
return pos;
};
var _hasAttr = function(input, attrName) {
return input.hasAttribute ? input.hasAttribute(attrName) : (typeof(input[attrName]) !== 'undefined');
};
/**
* @class
* @constructor
*/
var Range = function(start, end, length, text) {
this.start = start || 0;
this.end = end || 0;
this.length = length || 0;
this.text = text || '';
};
Range.prototype.toString = function() {
return JSON.stringify(this, null, ' ');
};
var _getCaretW3 = function(input) {
return input.selectionStart;
};
/**
* @see http://stackoverflow.com/q/6943000/467582
*/
var _getCaretIE = function(input) {
var caret, range, textInputRange, rawValue, len, endRange;
// Yeah, you have to focus twice for IE 7 and 8. *cries*
input.focus();
input.focus();
range = document.selection.createRange();
if (range && range.parentElement() === input) {
rawValue = _getValue(input);
len = rawValue.length;
// Create a working TextRange that lives only in the input
textInputRange = input.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = input.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
caret = rawValue.replace(_rNewlineIE, '\n').length;
} else {
caret = -textInputRange.moveStart("character", -len);
}
return caret;
}
// NOTE: This occurs when you highlight part of a textarea and then click in the middle of the highlighted portion in IE 6-10.
// There doesn't appear to be anything we can do about it.
// alert("Your browser is incredibly stupid. I don't know what else to say.");
// alert(range + '\n\n' + range.parentElement().tagName + '#' + range.parentElement().id);
return 0;
};
/**
* Gets the position of the caret in the given input.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @returns {Number}
* @see http://stackoverflow.com/questions/263743/how-to-get-cursor-position-in-textarea/263796#263796
*/
var _getCaret = function(input) {
if (!input) {
return undefined;
}
// Mozilla, et al.
if (_support.setSelectionRange) {
return _getCaretW3(input);
}
// IE
else if (_support.createTextRange) {
return _getCaretIE(input);
}
return undefined;
};
var _setCaretW3 = function(input, pos) {
input.setSelectionRange(pos, pos);
};
var _setCaretIE = function(input, pos) {
var range = input.createTextRange();
range.move('character', pos);
range.select();
};
/**
* Sets the position of the caret in the given input.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @param {Number} pos
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
*/
var _setCaret = function(input, pos) {
input.focus();
pos = _getIndex(input, pos);
// Mozilla, et al.
if (_support.setSelectionRange) {
_setCaretW3(input, pos);
}
// IE
else if (_support.createTextRange) {
_setCaretIE(input, pos);
}
};
/**
* Inserts the specified text at the current caret position in the given input.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @param {String} text
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
*/
var _insertAtCaret = function(input, text) {
var curPos = _getCaret(input);
var oldValueNorm = _getValue(input).replace(_rCarriageReturn, '');
var newLength = +(curPos + text.length + (oldValueNorm.length - curPos));
var maxLength = +input.getAttribute('maxlength');
if(_hasAttr(input, 'maxlength') && newLength > maxLength) {
var delta = text.length - (newLength - maxLength);
text = text.substr(0, delta);
}
_setValue(input, oldValueNorm.substr(0, curPos) + text + oldValueNorm.substr(curPos));
_setCaret(input, curPos + text.length);
};
var _getInputRangeW3 = function(input) {
var range = new Range();
range.start = input.selectionStart;
range.end = input.selectionEnd;
var min = Math.min(range.start, range.end);
var max = Math.max(range.start, range.end);
range.length = max - min;
range.text = _getValue(input).substring(min, max);
return range;
};
/** @see http://stackoverflow.com/a/3648244/467582 */
var _getInputRangeIE = function(input) {
var range = new Range();
input.focus();
var selection = document.selection.createRange();
if (selection && selection.parentElement() === input) {
var len, normalizedValue, textInputRange, endRange, start = 0, end = 0;
var rawValue = _getValue(input);
len = rawValue.length;
normalizedValue = rawValue.replace(/\r\n/g, "\n");
// Create a working TextRange that lives only in the input
textInputRange = input.createTextRange();
textInputRange.moveToBookmark(selection.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = input.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
start = end = len;
} else {
start = -textInputRange.moveStart("character", -len);
start += normalizedValue.slice(0, start).split("\n").length - 1;
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
end = len;
} else {
end = -textInputRange.moveEnd("character", -len);
end += normalizedValue.slice(0, end).split("\n").length - 1;
}
}
/// normalize newlines
start -= (rawValue.substring(0, start).split('\r\n').length - 1);
end -= (rawValue.substring(0, end).split('\r\n').length - 1);
/// normalize newlines
range.start = start;
range.end = end;
range.length = range.end - range.start;
range.text = normalizedValue.substr(range.start, range.length);
}
return range;
};
/**
* Gets the selected text range of the given input.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @returns {Range}
* @see http://stackoverflow.com/a/263796/467582
* @see http://stackoverflow.com/a/2966703/467582
*/
var _getInputRange = function(input) {
if (!input) {
return undefined;
}
// Mozilla, et al.
if (_support.setSelectionRange) {
return _getInputRangeW3(input);
}
// IE
else if (_support.createTextRange) {
return _getInputRangeIE(input);
}
return undefined;
};
var _setInputRangeW3 = function(input, startPos, endPos) {
input.setSelectionRange(startPos, endPos);
};
var _setInputRangeIE = function(input, startPos, endPos) {
var tr = input.createTextRange();
tr.moveEnd('textedit', -1);
tr.moveStart('character', startPos);
tr.moveEnd('character', endPos - startPos);
tr.select();
};
/**
* Sets the selected text range of (i.e., highlights text in) the given input.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @param {Number} startPos Zero-based index
* @param {Number} endPos Zero-based index
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
* @see http://stackoverflow.com/a/2966703/467582
*/
var _setInputRange = function(input, startPos, endPos) {
startPos = _getIndex(input, startPos);
endPos = _getIndex(input, endPos);
// Mozilla, et al.
if (_support.setSelectionRange) {
_setInputRangeW3(input, startPos, endPos);
}
// IE
else if (_support.createTextRange) {
_setInputRangeIE(input, startPos, endPos);
}
};
/**
* Replaces the currently selected text with the given string.
* @param {HTMLInputElement|HTMLTextAreaElement} input input or textarea element
* @param {String} text New text that will replace the currently selected text.
* @see http://parentnode.org/javascript/working-with-the-cursor-position/
*/
var _replaceInputRange = function(input, text) {
var $input = $(input);
var oldValue = $input.val();
var selection = _getInputRange(input);
var newLength = +(selection.start + text.length + (oldValue.length - selection.end));
var maxLength = +$input.attr('maxlength');
if($input.is('[maxlength]') && newLength > maxLength) {
var delta = text.length - (newLength - maxLength);
text = text.substr(0, delta);
}
// Now that we know what the user selected, we can replace it
var startText = oldValue.substr(0, selection.start);
var endText = oldValue.substr(selection.end);
$input.val(startText + text + endText);
// Reset the selection
var startPos = selection.start;
var endPos = startPos + text.length;
_setInputRange(input, selection.length ? startPos : endPos, endPos);
};
var _selectAllW3 = function(elem) {
var selection = window.getSelection();
var range = document.createRange();
range.selectNodeContents(elem);
selection.removeAllRanges();
selection.addRange(range);
};
var _selectAllIE = function(elem) {
var range = document.body.createTextRange();
range.moveToElementText(elem);
range.select();
};
/**
* Select all text in the given element.
* @param {HTMLElement} elem Any block or inline element other than a form element.
*/
var _selectAll = function(elem) {
var $elem = $(elem);
if ($elem.is('input, textarea') || elem.select) {
$elem.select();
return;
}
// Mozilla, et al.
if (_support.setSelectionRange) {
_selectAllW3(elem);
}
// IE
else if (_support.createTextRange) {
_selectAllIE(elem);
}
};
var _deselectAll = function() {
if (document.selection) {
document.selection.empty();
}
else if (window.getSelection) {
window.getSelection().removeAllRanges();
}
};
$.extend($.fn, {
/**
* Gets or sets the position of the caret or inserts text at the current caret position in an input or textarea element.
* @returns {Number|jQuery} The current caret position if invoked as a getter (with no arguments)
* or this jQuery object if invoked as a setter or inserter.
* @see http://web.archive.org/web/20080704185920/http://parentnode.org/javascript/working-with-the-cursor-position/
* @since 1.0.0
* @example
* <pre>
* // Get position
* var pos = $('input:first').caret();
* </pre>
* @example
* <pre>
* // Set position
* $('input:first').caret(15);
* $('input:first').caret(-3);
* </pre>
* @example
* <pre>
* // Insert text at current position
* $('input:first').caret('Some text');
* </pre>
*/
caret: function() {
var $inputs = this.filter('input, textarea');
// getCaret()
if (arguments.length === 0) {
var input = $inputs.get(0);
return _getCaret(input);
}
// setCaret(position)
else if (typeof arguments[0] === 'number') {
var pos = arguments[0];
$inputs.each(function(_i, input) {
_setCaret(input, pos);
});
}
// insertAtCaret(text)
else {
var text = arguments[0];
$inputs.each(function(_i, input) {
_insertAtCaret(input, text);
});
}
return this;
},
/**
* Gets or sets the selection range or replaces the currently selected text in an input or textarea element.
* @returns {Range|jQuery} The current selection range if invoked as a getter (with no arguments)
* or this jQuery object if invoked as a setter or replacer.
* @see http://stackoverflow.com/a/2966703/467582
* @since 1.0.0
* @example
* <pre>
* // Get selection range
* var range = $('input:first').range();
* </pre>
* @example
* <pre>
* // Set selection range
* $('input:first').range(15);
* $('input:first').range(15, 20);
* $('input:first').range(-3);
* $('input:first').range(-8, -3);
* </pre>
* @example
* <pre>
* // Replace the currently selected text
* $('input:first').range('Replacement text');
* </pre>
*/
range: function() {
var $inputs = this.filter('input, textarea');
// getRange() = { start: pos, end: pos }
if (arguments.length === 0) {
var input = $inputs.get(0);
return _getInputRange(input);
}
// setRange(startPos, endPos)
else if (typeof arguments[0] === 'number') {
var startPos = arguments[0];
var endPos = arguments[1];
$inputs.each(function(_i, input) {
_setInputRange(input, startPos, endPos);
});
}
// replaceRange(text)
else {
var text = arguments[0];
$inputs.each(function(_i, input) {
_replaceInputRange(input, text);
});
}
return this;
},
/**
* Selects all text in each element of this jQuery object.
* @returns {jQuery} This jQuery object
* @see http://stackoverflow.com/a/11128179/467582
* @since 1.5.0
* @example
* <pre>
* // Select the contents of span elements when clicked
* $('span').on('click', function() { $(this).highlight(); });
* </pre>
*/
selectAll: function() {
return this.each(function(_i, elem) {
_selectAll(elem);
});
}
});
$.extend($, {
/**
* Deselects all text on the page.
* @returns {jQuery} The jQuery function
* @since 1.5.0
* @example
* <pre>
* // Select some text
* $('span').selectAll();
*
* // Deselect the text
* $.deselectAll();
* </pre>
*/
deselectAll: function() {
_deselectAll();
return this;
}
});
}(window.jQuery || window.Zepto || window.$));

57
js/legacy/jquery.ui.timepicker.css vendored Normal file
View File

@@ -0,0 +1,57 @@
/*
* Timepicker stylesheet
* Highly inspired from datepicker
* FG - Nov 2010 - Web3R
*
* version 0.0.3 : Fixed some settings, more dynamic
* version 0.0.4 : Removed width:100% on tables
* version 0.1.1 : set width 0 on tables to fix an ie6 bug
*/
.ui-timepicker-inline { display: inline; }
#ui-timepicker-div { padding: 0.2em; }
.ui-timepicker-table { display: inline-table; width: 0; }
.ui-timepicker-table table { margin:0.15em 0 0 0; border-collapse: collapse; }
.ui-timepicker-hours, .ui-timepicker-minutes { padding: 0.2em; }
.ui-timepicker-table .ui-timepicker-title { line-height: 1.8em; text-align: center; }
.ui-timepicker-table td { padding: 0.1em; width: 2.2em; }
.ui-timepicker-table th.periods { padding: 0.1em; width: 2.2em; }
/* span for disabled cells */
.ui-timepicker-table td span {
display:block;
padding:0.2em 0.3em 0.2em 0.5em;
width: 1.2em;
text-align:right;
text-decoration:none;
}
/* anchors for clickable cells */
.ui-timepicker-table td a {
display:block;
padding:0.2em 0.3em 0.2em 0.5em;
width: 1.2em;
cursor: pointer;
text-align:right;
text-decoration:none;
}
/* buttons and button pane styling */
.ui-timepicker .ui-timepicker-buttonpane {
background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0;
}
.ui-timepicker .ui-timepicker-buttonpane button { margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
/* The close button */
.ui-timepicker .ui-timepicker-close { float: right }
/* the now button */
.ui-timepicker .ui-timepicker-now { float: left; }
/* the deselect button */
.ui-timepicker .ui-timepicker-deselect { float: left; }

1496
js/legacy/jquery.ui.timepicker.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,120 @@
/**
* Original source code from https://github.com/mcecot/markdown-it-checkbox
* © 2015 Markus Cecot
* licenced under MIT
* https://github.com/mcecot/markdown-it-checkbox/blob/master/LICENSE
*/
var checkboxReplace;
checkboxReplace = function(md, options, Token) {
"use strict";
var arrayReplaceAt, createTokens, defaults, lastId, pattern, splitTextToken;
arrayReplaceAt = md.utils.arrayReplaceAt;
lastId = 0;
defaults = {
divWrap: false,
divClass: 'checkbox',
idPrefix: 'checkbox'
};
options = Object.assign(defaults, options);
pattern = /(.*?)(\[(X|\s|\_|\-)\])(.*)/igm;
createTokens = function(checked, label, Token, before) {
var id, idNumeric, nodes, token;
nodes = [];
token = new Token("text", "", 0);
token.content = before;
nodes.push(token);
/**
* <div class="checkbox">
*/
if (options.divWrap) {
token = new Token("checkbox_open", "div", 1);
token.attrs = [["class", options.divClass]];
nodes.push(token);
}
/**
* <input type="checkbox" id="checkbox{n}" checked="true">
*/
id = options.idPrefix + lastId;
idNumeric = lastId;
lastId += 1;
token = new Token("checkbox_input", "input", 0);
token.attrs = [["type", "checkbox"], ["id", id], ["data-id", idNumeric]];
if (checked === true) {
token.attrs.push(["checked", "true"]);
}
token.attrs.push(["class", "checkbox"]);
nodes.push(token);
/**
* <label for="checkbox{n}">
*/
token = new Token("label_open", "label", 1);
token.attrs = [["for", id], ["data-id", idNumeric]];
nodes.push(token);
/**
* content of label tag
*/
token = new Token("text", "", 0);
token.content = label;
nodes.push(token);
/**
* closing tags
*/
nodes.push(new Token("label_close", "label", -1));
if (options.divWrap) {
nodes.push(new Token("checkbox_close", "div", -1));
}
return nodes;
};
splitTextToken = function(original, Token) {
var checked, label, matches, text, value, before;
text = original.content;
matches = pattern.exec(text);
if (matches === null) {
return original;
}
checked = false;
before = matches[1];
value = matches[3];
label = matches[4];
if (value === "X" || value === "x") {
checked = true;
}
return createTokens(checked, label, Token, before);
};
return function(state) {
lastId = 0;
var blockTokens, i, j, l, token, tokens;
blockTokens = state.tokens;
j = 0;
l = blockTokens.length;
while (j < l) {
if (blockTokens[j].type !== "inline") {
j++;
continue;
}
tokens = blockTokens[j].children;
i = 0;
while (i < tokens.length) {
token = tokens[i];
blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, splitTextToken(token, state.Token));
i++;
}
j++;
}
};
};
/*global module */
module.exports = function(md, options) {
"use strict";
md.core.ruler.push("checkbox", checkboxReplace(md, options));
};

7965
js/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,46 @@
{
"name": "deck",
"description": "Frontend for the Nextcloud Deck app",
"repository": "https://github.com/nextcloud/deck",
"version": "1.0.0",
"main": "Gruntfile.js",
"directories": {
"test": "tests"
},
"dependencies": {},
"dependencies": {
"@uirouter/angularjs": "^1.0.20",
"angular": "^1.7.5",
"angular-animate": "^1.7.5",
"angular-file-upload": "^2.5.0",
"angular-markdown-it": "^0.6.1",
"angular-sanitize": "^1.7.5",
"babel-polyfill": "^6.26.0",
"markdown-it": "^8.4.2",
"markdown-it-link-target": "^1.0.2",
"ng-infinite-scroll": "^1.3.0",
"ng-sortable": "^1.3.8",
"ui-select": "^0.19.8"
},
"devDependencies": {
"bower": "^1.8.0",
"grunt": "^1.0.1",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-jshint": "^1.1.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-karma": "^2.0.0",
"grunt-phpunit": "^0.3.6",
"grunt-wrap": "^0.3.0",
"jshint-stylish": "^2.2.1",
"karma": "^1.4.1",
"node-sass": "^4.5.3"
"@babel/core": "^7.1.5",
"@babel/polyfill": "^7.0.0",
"@babel/preset-env": "^7.1.5",
"babel-loader": "^8.0.4",
"css-loader": "^1.0.1",
"karma": "^3.1.1",
"mini-css-extract-plugin": "^0.4.4",
"node-sass": "^4.10.0",
"webpack": "^4.25.1",
"webpack-cli": "^3.1.2",
"webpack-merge": "^4.1.4"
},
"scripts": {
"build": "./node_modules/webpack-cli/bin/cli.js --mode production --config webpack.prod.config.js",
"dev": "./node_modules/webpack-cli/bin/cli.js --mode development --config webpack.dev.config.js",
"watch": "./node_modules/webpack-cli/bin/cli.js --mode development --config webpack.dev.config.js --watch",
"test": "echo \"Warning: no test specified\" && exit 0"
},
"author": "",
"license": "AGPL-3.0",
"keywords": [],
"description": ""
"keywords": []
}

View File

@@ -0,0 +1,253 @@
/*
* @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/>.
*
*/
import app from '../app/App.js';
import CommentCollection from '../legacy/commentcollection';
import CommentModel from '../legacy/commentmodel';
const DECK_ACTIVITY_TYPE_BOARD = 'deck_board';
const DECK_ACTIVITY_TYPE_CARD = 'deck_card';
/* global OC oc_requesttoken */
class ActivityService {
static get RESULT_PER_PAGE() { return 50; }
constructor ($rootScope, $filter, $http, $q) {
this.running = false;
this.runningNewer = false;
this.$filter = $filter;
this.$http = $http;
this.$q = $q;
this.$rootScope = $rootScope;
this.data = {};
this.data[DECK_ACTIVITY_TYPE_BOARD] = {};
this.data[DECK_ACTIVITY_TYPE_CARD] = {};
this.toEnhanceWithComments = [];
this.commentCollection = new CommentCollection();
this.commentCollection._limit = ActivityService.RESULT_PER_PAGE;
this.commentCollection.on('request', function() {
}, this);
this.commentCollection.on('sync', function(a) {
for (let index in this.toEnhanceWithComments) {
if (this.toEnhanceWithComments.hasOwnProperty(index)) {
let item = this.toEnhanceWithComments[index];
item.commentModel = this.commentCollection.get(item.subject_rich[1].comment);
if (typeof item.commentModel !== 'undefined') {
this.toEnhanceWithComments = this.toEnhanceWithComments.filter((entry) => entry.activity_id !== item.activity_id);
}
}
}
var firstUnread = this.commentCollection.findWhere({isUnread: true});
if (typeof firstUnread !== 'undefined') {
this.commentCollection.updateReadMarker();
}
this.notify();
}, this);
this.commentCollection.on('add', function(model, collection, options) {
// we need to update the model, because it consists of client data
// only, but the server might add meta data, e.g. about mentions
model.fetch();
}, this);
this.since = {
deck_card: {
},
deck_board: {
},
};
}
/**
* We need a event here to properly update scope once the external data from
* the comments backbone js code has changed
*/
subscribe(scope, callback) {
let handler = this.$rootScope.$on('notify-comment-update', callback);
scope.$on('$destroy', handler);
}
notify() {
this.$rootScope.$emit('notify-comment-update');
}
static getUrl(type, id, since) {
if (type === DECK_ACTIVITY_TYPE_CARD) {
return OC.linkToOCS('apps/activity/api/v2/activity', 2) + 'filter?format=json&object_type=deck_card&object_id=' + id + '&limit=' + this.RESULT_PER_PAGE + '&since=' + since;
}
if (type === DECK_ACTIVITY_TYPE_BOARD) {
return OC.linkToOCS('apps/activity/api/v2/activity', 2) + 'deck?format=json&limit=' + this.RESULT_PER_PAGE + '&since=' + since;
}
}
fetchCardActivities(type, id, since) {
this.running = true;
this.checkData(type, id);
const self = this;
return this.$http.get(ActivityService.getUrl(type, id, since)).then(function (response) {
const objects = response.data.ocs.data;
for (let index in objects) {
if (objects.hasOwnProperty(index)) {
let item = objects[index];
self.addItem(type, id, item);
if (item.activity_id > self.since[type][id].latest) {
self.since[type][id].latest = item.activity_id;
}
}
}
self.data[type][id].sort(function(a, b) {
return b.activity_id - a.activity_id;
});
self.since[type][id].oldest = response.headers('X-Activity-Last-Given');
self.running = false;
return response;
}, function (error) {
if (error.status === 304 || error.status === 404) {
self.since[type][id].finished = true;
}
self.running = false;
});
}
fetchMoreActivities(type, id, success) {
const self = this;
this.checkData(type, id);
if (this.running === true) {
return this.runningPromise;
}
if (!this.since[type][id].finished) {
this.runningPromise = this.fetchCardActivities(type, id, this.since[type][id].oldest);
this.runningPromise.then(function() {
if (type === 'deck_card') {
self.commentCollection.fetchNext();
}
});
return this.runningPromise;
}
return Promise.reject();
}
checkData(type, id) {
if (!Array.isArray(this.data[type][id])) {
this.data[type][id] = [];
}
if (typeof this.since[type][id] === 'undefined') {
this.since[type][id] = {
latest: -1,
oldestCatchedUp: false,
oldest: '0',
finished: false,
};
}
}
addItem(type, id, item) {
const self = this;
const existingEntry = this.data[type][id].findIndex((entry) => { return entry.activity_id === item.activity_id; });
if (existingEntry !== -1) {
return;
}
/** check if the fetched item from all deck activities is actually related */
const isUnrelatedBoard = (item.object_type === DECK_ACTIVITY_TYPE_BOARD && item.object_id !== id);
const isUnrelatedCard = (item.object_type === DECK_ACTIVITY_TYPE_CARD && item.subject_rich[1].board && item.subject_rich[1].board.id !== id);
if (type === DECK_ACTIVITY_TYPE_BOARD && (isUnrelatedBoard || isUnrelatedCard)) {
return;
}
item.timestamp = new Date(item.datetime).getTime();
item.type = 'activity';
if (item.subject_rich[1].comment) {
item.type = 'comment';
item.commentModel = this.commentCollection.get(item.subject_rich[1].comment);
if (typeof item.commentModel === 'undefined') {
this.toEnhanceWithComments.push(item);
}
}
this.data[type][id].push(item);
}
/**
* Fetch newer activities starting from the latest ones that are in cache
*
* @param type
* @param id
*/
fetchNewerActivities(type, id) {
if (this.since[type][id].latest === 0) {
return Promise.resolve();
}
let self = this;
return this.fetchNewer(type, id).then(function() {
return self.fetchNewerActivities(type, id);
});
}
fetchNewer(type, id) {
const deferred = this.$q.defer();
this.running = true;
this.runningNewer = true;
const self = this;
this.$http.get(ActivityService.getUrl(type, id, this.since[type][id].latest) + '&sort=asc').then(function (response) {
let objects = response.data.ocs.data;
let data = [];
for (let index in objects) {
if (objects.hasOwnProperty(index)) {
let item = objects[index];
self.addItem(type, id, item);
}
}
self.data[type][id].sort(function(a, b) {
return b.activity_id - a.activity_id;
});
self.since[type][id].latest = response.headers('X-Activity-Last-Given');
self.data[type][id] = data.concat(self.data[type][id]);
self.running = false;
self.runningNewer = false;
deferred.resolve(objects);
}, function (error) {
self.runningNewer = false;
self.running = false;
});
return deferred.promise;
}
getData(type, id) {
if (!Array.isArray(this.data[type][id])) {
return [];
}
return this.data[type][id];
}
loadComments(id) {
this.commentCollection.reset();
this.commentCollection.setObjectId(id);
}
}
app.service('ActivityService', ActivityService);
export default ActivityService;
export {DECK_ACTIVITY_TYPE_BOARD, DECK_ACTIVITY_TYPE_CARD};

View File

@@ -4,168 +4,229 @@
* @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/>.
*
*
*/
import app from '../app/App.js';
/** global: oc_defaults */
app.factory('ApiService', function ($http, $q) {
var ApiService = function (http, endpoint) {
// Consider renaming endpoint to resource
this.endpoint = endpoint;
this.baseUrl = this.generateUrl(this.endpoint);
this.http = http;
this.q = $q;
this.data = {};
this.deleted = {};
this.id = null;
this.sorted = [];
};
app.factory('ApiService', function($http, $q){
var ApiService = function(http, endpoint) {
this.endpoint = endpoint;
this.baseUrl = OC.generateUrl('/apps/deck/' + endpoint);
this.http = http;
this.q = $q;
this.data = {};
this.id = null;
this.sorted = [];
};
ApiService.prototype.generateUrl = function(path) {
return OC.generateUrl('/apps/deck/' + path);
};
ApiService.prototype.fetchAll = function(){
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl).then(function (response) {
var objects = response.data;
objects.forEach(function (obj) {
self.data[obj.id] = obj;
});
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.tryAllThenDeleted = function(id) {
let object = this.data[id];
if (object === undefined) {
object = this.deleted[id];
}
return object;
};
ApiService.prototype.fetchOne = function (id) {
ApiService.prototype.fetchAll = function () {
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl).then(function (response) {
var objects = response.data;
objects.forEach(function (obj) {
self.data[obj.id] = obj;
});
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
this.id = id;
var deferred = $q.defer();
ApiService.prototype.fetchDeleted = function (scopeId) {
var deferred = $q.defer();
var self = this;
self.deleted = {};
$http.get(this.generateUrl(scopeId + '/' + this.endpoint + '/deleted')).then(function (response) {
var objects = response.data;
objects.forEach(function (obj) {
if(self.deleted[obj.id] !== undefined) {
return;
}
if(id===undefined) {
return deferred.promise;
}
self.deleted[obj.id] = obj;
var self = this;
$http.get(this.baseUrl + '/' + id).then(function (response) {
data = response.data;
if(self.data[data.id]===undefined) {
self.data[data.id] = response.data;
}
$.each(response.data, function(key, value) {
self.data[data.id][key] = value;
});
deferred.resolve(response.data);
if(self.afterFetch !== undefined) {
self.afterFetch(obj);
}
});
deferred.resolve(objects);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.create = function (entity) {
var deferred = $q.defer();
var self = this;
$http.post(this.baseUrl, entity).then(function (response) {
self.add(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Fetching' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.fetchOne = function (id) {
ApiService.prototype.update = function (entity) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + entity.id, entity).then(function (response) {
self.add(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Updating ' + self.endpoint + ' failed');
});
return deferred.promise;
this.id = id;
var deferred = $q.defer();
};
if (id === undefined) {
return deferred.promise;
}
ApiService.prototype.delete = function (id) {
var deferred = $q.defer();
var self = this;
var self = this;
$http.get(this.baseUrl + '/' + id).then(function (response) {
var data = response.data;
if (self.data[data.id] === undefined) {
self.data[data.id] = response.data;
}
$.each(response.data, function (key, value) {
self.data[data.id][key] = value;
});
deferred.resolve(response.data);
$http.delete(this.baseUrl + '/' + id).then(function (response) {
self.remove(id);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed');
});
return deferred.promise;
};
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
});
return deferred.promise;
ApiService.prototype.create = function (entity) {
var deferred = $q.defer();
var self = this;
$http.post(this.baseUrl, entity).then(function (response) {
self.add(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Fetching' + self.endpoint + ' failed');
});
return deferred.promise;
};
};
ApiService.prototype.update = function (entity) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + entity.id, entity).then(function (response) {
self.add(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Updating ' + self.endpoint + ' failed');
});
return deferred.promise;
// methods for managing data
ApiService.prototype.clear = function() {
this.data = {};
};
ApiService.prototype.add = function (entity) {
var element = this.data[entity.id];
if(element===undefined) {
this.data[entity.id] = entity;
} else {
Object.keys(entity).forEach(function (key) {
element[key] = entity[key];
});
element.status = {};
}
};
ApiService.prototype.remove = function(id) {
if (this.data[id] !== undefined) {
delete this.data[id];
}
};
ApiService.prototype.addAll = function (entities) {
var self = this;
angular.forEach(entities, function(entity) {
self.add(entity);
});
};
};
ApiService.prototype.getCurrent = function () {
return this.data[this.id];
};
ApiService.prototype.delete = function (id) {
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + id).then(function (response) {
self.deleted[id] = self.data[id];
delete self.data[id];
let deletedAt = response.data.deletedAt;
if (deletedAt !== undefined) {
self.deleted[id].deletedAt = deletedAt;
}
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
});
return deferred.promise;
};
ApiService.prototype.undoDelete = function(entity) {
var self = this;
entity.deletedAt = 0;
var promise = this.update(entity);
promise.then(() => {
self.data[entity.id] = entity;
delete this.deleted[entity.id];
});
return promise;
};
// methods for managing data
ApiService.prototype.clear = function () {
this.data = {};
};
ApiService.prototype.add = function (entity) {
var element = this.data[entity.id];
if (element === undefined) {
this.data[entity.id] = entity;
} else {
Object.keys(entity).forEach(function (key) {
if (entity[key] !== null && element[key] !== entity[key]) {
element[key] = entity[key];
}
});
element.status = {};
}
};
ApiService.prototype.addAll = function (entities) {
var self = this;
angular.forEach(entities, function (entity) {
self.add(entity);
});
};
ApiService.prototype.getCurrent = function () {
return this.data[this.id];
};
ApiService.prototype.unsetCurrrent = function () {
this.id = null;
};
ApiService.prototype.getData = function () {
return $.map(this.data, function (value, index) {
return [value];
});
};
ApiService.prototype.getData = function() {
return $.map(this.data, function(value, index) {
return [value];
});
};
ApiService.prototype.getAll = function () {
return this.data;
};
ApiService.prototype.getAll = function () {
return this.data;
};
ApiService.prototype.get = function (id) {
return this.data[id];
};
ApiService.prototype.getName = function() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec((this).constructor.toString());
return (results && results.length > 1) ? results[1] : "";
};
ApiService.prototype.getName = function () {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec((this).constructor.toString());
return (results && results.length > 1) ? results[1] : '';
};
return ApiService;
return ApiService;
});

View File

@@ -19,12 +19,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
app.factory('BoardService', function(ApiService, $http, $q){
var BoardService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
BoardService.prototype = angular.copy(ApiService.prototype);
import app from '../app/App.js';
/* global app OC */
app.factory('BoardService', function (ApiService, $http, $q) {
var BoardService = function ($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
BoardService.prototype = angular.copy(ApiService.prototype);
BoardService.prototype.delete = function (id) {
var deferred = $q.defer();
@@ -45,7 +46,6 @@ app.factory('BoardService', function(ApiService, $http, $q){
var _id = id;
$http.post(this.baseUrl + '/' + id + '/deleteUndo').then(function (response) {
self.data[_id].deletedAt = 0;
console.log(self.data[_id]);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
@@ -77,12 +77,12 @@ app.factory('BoardService', function(ApiService, $http, $q){
}
self.sharees = [];
var users = response.ocs.data.exact.users.concat(response.ocs.data.users);
var groups = response.ocs.data.exact.groups.concat(response.ocs.data.groups);
var users = response.ocs.data.exact.users.concat(response.ocs.data.users.slice(0, 4));
var groups = response.ocs.data.exact.groups.concat(response.ocs.data.groups.slice(0, 4));
// filter out everyone who is already in the share list
angular.forEach(users, function (item) {
var acl = self.generateAcl('user', item);
var acl = self.generateAcl(OC.Share.SHARE_TYPE_USER, item);
var exists = false;
angular.forEach(self.getCurrent().acl, function (acl) {
if (acl.participant.primaryKey === item.value.shareWith) {
@@ -94,7 +94,7 @@ app.factory('BoardService', function(ApiService, $http, $q){
}
});
angular.forEach(groups, function (item) {
var acl = self.generateAcl('group', item);
var acl = self.generateAcl(OC.Share.SHARE_TYPE_GROUP, item);
var exists = false;
angular.forEach(self.getCurrent().acl, function (acl) {
if (acl.participant.primaryKey === item.value.shareWith) {
@@ -114,7 +114,7 @@ app.factory('BoardService', function(ApiService, $http, $q){
return deferred.promise;
};
BoardService.prototype.generateAcl = function(type, ocsItem) {
BoardService.prototype.generateAcl = function (type, ocsItem) {
return {
boardId: null,
id: null,
@@ -128,7 +128,7 @@ app.factory('BoardService', function(ApiService, $http, $q){
permissionManage: true,
permissionShare: true,
type: type
}
};
};
BoardService.prototype.addAcl = function (acl) {
@@ -141,6 +141,11 @@ app.factory('BoardService', function(ApiService, $http, $q){
board.acl = {};
}
board.acl[response.data.id] = response.data;
if (response.data.type === OC.Share.SHARE_TYPE_USER) {
self._updateUsers();
} else {
self.fetchOne(response.data.boardId);
}
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error creating ACL ' + _acl);
@@ -149,74 +154,104 @@ app.factory('BoardService', function(ApiService, $http, $q){
return deferred.promise;
};
BoardService.prototype.deleteAcl = function(acl) {
var board = this.getCurrent();
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + acl.boardId + '/acl/' + acl.id).then(function (response) {
delete board.acl[response.data.id];
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error deleting ACL ' + acl.id);
});
acl = null;
return deferred.promise;
};
BoardService.prototype.deleteAcl = function (acl) {
var board = this.getCurrent();
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + acl.boardId + '/acl/' + acl.id).then(function (response) {
delete board.acl[response.data.id];
if (response.data.type === OC.Share.SHARE_TYPE_USER) {
self._updateUsers();
} else {
self.fetchOne(response.data.boardId);
}
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error deleting ACL ' + acl.id);
});
acl = null;
return deferred.promise;
};
BoardService.prototype.updateAcl = function(acl) {
var board = this.getCurrent();
var deferred = $q.defer();
var self = this;
var _acl = acl;
$http.put(this.baseUrl + '/' + acl.boardId + '/acl', _acl).then(function (response) {
board.acl[_acl.id] = response.data;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error updating ACL ' + _acl);
});
acl = null;
return deferred.promise;
};
BoardService.prototype.updateAcl = function (acl) {
var board = this.getCurrent();
var deferred = $q.defer();
var self = this;
var _acl = acl;
$http.put(this.baseUrl + '/' + acl.boardId + '/acl', _acl).then(function (response) {
board.acl[_acl.id] = response.data;
if (response.data.type === OC.Share.SHARE_TYPE_USER) {
self._updateUsers();
} else {
self.fetchOne(response.data.boardId);
}
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error updating ACL ' + _acl);
});
acl = null;
return deferred.promise;
};
BoardService.prototype.canRead = function() {
if(!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_READ'];
};
BoardService.prototype._updateUsers = function () {
if (!this.getCurrent() || !this.getCurrent().acl) {
return [];
}
BoardService.prototype.canEdit = function() {
if(!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_EDIT'];
};
this.getCurrent().users = [this.getCurrent().owner];
let self = this;
angular.forEach(this.getCurrent().acl, function(value, key) {
if (value.type === OC.Share.SHARE_TYPE_USER) {
self.getCurrent().users.push(value.participant);
}
});
};
BoardService.prototype.canManage = function(board) {
if(board !== null && board !== undefined) {
BoardService.prototype.getUsers = function () {
if (this.getCurrent() && !this.getCurrent().users) {
this._updateUsers();
}
return this.getCurrent().users;
};
BoardService.prototype.canRead = function () {
if (!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_READ'];
};
BoardService.prototype.canEdit = function () {
if (!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_EDIT'];
};
BoardService.prototype.canManage = function (board) {
if (board !== null && board !== undefined) {
return board.permissions['PERMISSION_MANAGE'];
}
if(!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_MANAGE'];
};
if (!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_MANAGE'];
};
BoardService.prototype.canShare = function() {
if(!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_SHARE'];
};
BoardService.prototype.canShare = function () {
if (!this.getCurrent() || !this.getCurrent().permissions) {
return false;
}
return this.getCurrent().permissions['PERMISSION_SHARE'];
};
BoardService.prototype.isArchived = function () {
if(!this.getCurrent() || this.getCurrent().archived) {
BoardService.prototype.isArchived = function () {
if (!this.getCurrent() || this.getCurrent().archived) {
return true;
}
return false;
};
service = new BoardService($http, 'boards', $q);
return service;
});
return new BoardService($http, 'boards', $q);
});

View File

@@ -4,98 +4,174 @@
* @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/>.
*
*
*/
import app from '../app/App.js';
app.factory('CardService', function(ApiService, $http, $q){
var CardService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
CardService.prototype = angular.copy(ApiService.prototype);
app.factory('CardService', function (ApiService, $http, $q) {
var CardService = function ($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
CardService.prototype = angular.copy(ApiService.prototype);
CardService.prototype.reorder = function(card, order) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/reorder', {cardId: card.id, order: order, stackId: card.stackId}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.reorder = function (card, order) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/reorder', {
cardId: card.id,
order: order,
stackId: card.stackId
}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.rename = function(card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/rename', {cardId: card.id, title: card.title}).then(function (response) {
self.data[card.id].title = card.title;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while renaming ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.rename = function (card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/rename', {
cardId: card.id,
title: card.title
}).then(function (response) {
self.data[card.id].title = card.title;
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while renaming ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.assignLabel = function(card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer();
var self = this;
$http.post(url).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.removeLabel = function(card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer();
var self = this;
$http.delete(url).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.assignLabel = function (card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer();
var self = this;
$http.post(url).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.removeLabel = function (card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer();
var self = this;
$http.delete(url).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.archive = function (card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/archive', {}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
CardService.prototype.archive = function (card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/archive', {}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
};
CardService.prototype.unarchive = function (card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/unarchive', {}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
CardService.prototype.unarchive = function (card) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + card.id + '/unarchive', {}).then(function (response) {
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
};
CardService.prototype.assignUser = function (card, user) {
var deferred = $q.defer();
var self = this;
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.get(card.id).assignedUsers.push(response.data);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
service = new CardService($http, 'cards', $q);
return service;
});
};
CardService.prototype.unassignUser = function (card, user) {
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + card.id + '/assign/' + user, {}).then(function (response) {
self.get(card.id).assignedUsers = self.get(card.id).assignedUsers.filter(function (obj) {
return obj.participant.uid !== user;
});
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.attachmentRemove = function (attachment) {
var deferred = $q.defer();
var self = this;
$http.delete(this.baseUrl + '/' + this.getCurrent().id + '/attachment/' + attachment.id, {}).then(function (response) {
if (response.data.deletedAt > 0) {
let currentAttachment = self.getCurrent().attachments.find(function (obj) {
if (obj.id === attachment.id) {
obj.deletedAt = response.data.deletedAt;
}
});
} else {
self.getCurrent().attachments = self.getCurrent().attachments.filter(function (obj) {
return obj.id !== attachment.id;
});
}
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error when removing the attachment');
});
return deferred.promise;
};
CardService.prototype.attachmentRemoveUndo = function (attachment) {
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl + '/' + this.getCurrent().id + '/attachment/' + attachment.id + '/restore', {}).then(function (response) {
let currentAttachment = self.getCurrent().attachments.find(function (obj) {
if (obj.id === attachment.id) {
obj.deletedAt = response.data.deletedAt;
}
});
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Error when restoring the attachment');
});
return deferred.promise;
};
var service = new CardService($http, 'cards', $q);
return service;
});

137
js/service/FileService.js Normal file
View File

@@ -0,0 +1,137 @@
/*
* @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/>.
*
*/
import app from '../app/App.js';
/* global OC oc_requesttoken */
export default class FileService {
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) {
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 + '?type=deck_file');
} else {
fileItem.formData = [
{
requesttoken: oc_requesttoken,
type: 'deck_file',
}
];
}
fileItem.headers = {requesttoken: oc_requesttoken};
this.uploader.uploadItem(fileItem);
}
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) => {
return attachment.data === fileItem.file.name;
});
if (typeof existingFile !== 'undefined') {
OC.dialogs.confirm(
`A file with the name ${fileItem.file.name} already exists. Do you want to overwrite it?`,
'File already exists',
function (result) {
if (result) {
self.runUpload(fileItem, existingFile.id);
} else {
let fileName = existingFile.extendedData.info.filename;
let foundFilesMatching = attachments.filter((attachment) => {
return attachment.extendedData.info.extension === existingFile.extendedData.info.extension
&& attachment.extendedData.info.filename.startsWith(fileName);
});
let nextIndex = foundFilesMatching.length + 1;
fileItem.file.name = fileName + ' (' + nextIndex + ').' + existingFile.extendedData.info.extension;
self.runUpload(fileItem);
}
}
);
} else {
self.runUpload(fileItem);
}
}, function (error) {
this.progress = this.progress.filter((item) => (fileItem.file.name !== item.file.name));
});
}
onSuccessItem (item, response) {
let attachments = this.cardservice.get(item.cardId).attachments;
let index = attachments.indexOf(attachments.find((attachment) => attachment.id === response.id));
if (~index) {
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);

View File

@@ -19,12 +19,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.factory('LabelService', function(ApiService, $http, $q){
var LabelService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
LabelService.prototype = angular.copy(ApiService.prototype);
service = new LabelService($http, 'labels', $q);
return service;
app.factory('LabelService', function (ApiService, $http, $q) {
var LabelService = function ($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
LabelService.prototype = angular.copy(ApiService.prototype);
return new LabelService($http, 'labels', $q);
});

View File

@@ -4,64 +4,83 @@
* @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/>.
*
*
*/
import app from '../app/App.js';
app.factory('StackService', function(ApiService, $http, $q){
var StackService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
StackService.prototype = angular.copy(ApiService.prototype);
StackService.prototype.fetchAll = function(boardId) {
var deferred = $q.defer();
var self=this;
$http.get(this.baseUrl +'/'+boardId).then(function (response) {
self.clear();
self.addAll(response.data);
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Error while loading stacks');
});
return deferred.promise;
};
/* global app angular */
app.factory('StackService', function (ApiService, CardService, $http, $q) {
var StackService = function ($http, ep, $q) {
ApiService.call(this, $http, ep, $q);
};
StackService.prototype = angular.copy(ApiService.prototype);
StackService.prototype.fetchArchived = function(boardId) {
var deferred = $q.defer();
var self=this;
$http.get(this.baseUrl +'/'+boardId+'/archived').then(function (response) {
self.clear();
self.addAll(response.data);
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Error while loading stacks');
});
return deferred.promise;
};
StackService.prototype.afterFetch = function(stack) {
CardService.addAll(stack.cards);
};
StackService.prototype.addCard = function(entity) {
if(!this.data[entity.stackId].cards) {
this.data[entity.stackId].cards = [];
}
this.data[entity.stackId].cards.push(entity);
};
StackService.prototype.reorder = function(stack, order) {
StackService.prototype.fetchAll = function (boardId) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + stack.id + '/reorder', {stackId: stack.id, order: order}).then(function (response) {
$http.get(this.baseUrl + '/' + boardId).then(function (response) {
self.clear();
self.addAll(response.data);
// When loading a stack add cards to the CardService so we can fetch
// information from there. That way we don't need to refresh the whole
// stack data during digest if some value changes
angular.forEach(response.data, function (entity) {
CardService.addAll(entity.cards);
});
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Error while loading stacks');
});
return deferred.promise;
};
StackService.prototype.fetchArchived = function (boardId) {
var deferred = $q.defer();
var self = this;
$http.get(this.baseUrl + '/' + boardId + '/archived').then(function (response) {
self.clear();
self.addAll(response.data);
angular.forEach(response.data, function (entity) {
CardService.addAll(entity.cards);
});
deferred.resolve(self.data);
}, function (error) {
deferred.reject('Error while loading stacks');
});
return deferred.promise;
};
StackService.prototype.addCard = function (entity) {
if (!this.data[entity.stackId].cards) {
this.data[entity.stackId].cards = [];
}
this.data[entity.stackId].cards.push(entity);
};
StackService.prototype.reorder = function (stack, order) {
var deferred = $q.defer();
var self = this;
$http.put(this.baseUrl + '/' + stack.id + '/reorder', {
stackId: stack.id,
order: order
}).then(function (response) {
angular.forEach(response.data, function (value, key) {
var id = value.id;
self.data[id].order = value.order;
@@ -73,49 +92,48 @@ app.factory('StackService', function(ApiService, $http, $q){
return deferred.promise;
};
StackService.prototype.reorderCard = function(entity, order) {
// assign new order
for(var i=0, j=0;i<this.data[entity.stackId].cards.length;i++) {
if(this.data[entity.stackId].cards[i].id === entity.id) {
this.data[entity.stackId].cards[i].order = order;
}
if(j === order) {
j++;
}
if(this.data[entity.stackId].cards[i].id !== entity.id) {
this.data[entity.stackId].cards[i].order = j++;
}
}
// sort array by order
this.data[entity.stackId].cards.sort(function(a,b) {
if (a.order < b.order)
return -1;
if (a.order > b.order)
return 1;
return 0;
});
};
StackService.prototype.reorderCard = function (entity, order) {
// assign new order
for (var i = 0, j = 0; i < this.data[entity.stackId].cards.length; i++) {
if (this.data[entity.stackId].cards[i].id === entity.id) {
this.data[entity.stackId].cards[i].order = order;
}
if (j === order) {
j++;
}
if (this.data[entity.stackId].cards[i].id !== entity.id) {
this.data[entity.stackId].cards[i].order = j++;
}
}
// sort array by order
this.data[entity.stackId].cards.sort(function (a, b) {
if (a.order < b.order)
{return -1;}
if (a.order > b.order)
{return 1;}
return 0;
});
};
StackService.prototype.updateCard = function(entity) {
var self = this;
var cards = this.data[entity.stackId].cards;
for(var i=0;i<cards.length;i++) {
if(cards[i].id == entity.id) {
cards[i] = entity;
}
}
};
StackService.prototype.removeCard = function(entity) {
var self = this;
var cards = this.data[entity.stackId].cards;
for(var i=0;i<cards.length;i++) {
if(cards[i].id == entity.id) {
cards.splice(i, 1);
}
}
};
service = new StackService($http, 'stacks', $q);
return service;
StackService.prototype.updateCard = function (entity) {
var self = this;
var cards = this.data[entity.stackId].cards;
for (var i = 0; i < cards.length; i++) {
if (cards[i].id === entity.id) {
cards[i] = entity;
}
}
};
StackService.prototype.removeCard = function (entity) {
var self = this;
var cards = this.data[entity.stackId].cards;
for (var i = 0; i < cards.length; i++) {
if (cards[i].id === entity.id) {
cards.splice(i, 1);
}
}
};
var service = new StackService($http, 'stacks', $q);
return service;
});

View File

@@ -19,59 +19,63 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import app from '../app/App.js';
app.factory('StatusService', function(){
// Status Helper
var StatusService = function() {
this.active = true;
this.icon = 'loading';
this.title = '';
this.text = '';
this.counter = 0;
};
app.factory('StatusService', function () {
// Status Helper
var StatusService = function () {
this.active = true;
this.icon = 'loading';
this.title = '';
this.text = '';
this.counter = 0;
};
StatusService.prototype.setStatus = function($icon, $title, $text) {
this.active = true;
this.icon = $icon;
this.title = $title;
this.text = $text;
};
StatusService.prototype.setStatus = function ($icon, $title, $text) {
this.active = true;
this.icon = $icon;
this.title = $title;
this.text = $text;
};
StatusService.prototype.setError = function($title, $text) {
this.active = true;
this.icon = 'error';
this.title = $title;
this.text = $text;
this.counter = 0;
};
StatusService.prototype.setError = function ($title, $text) {
this.active = true;
this.icon = 'error';
this.title = $title;
this.text = $text;
this.counter = 0;
};
StatusService.prototype.releaseWaiting = function() {
if(this.counter>0)
this.counter--;
if(this.counter<=0) {
this.active = false;
this.counter = 0;
}
};
StatusService.prototype.releaseWaiting = function () {
if (this.counter > 0) {
this.counter--;
}
if (this.counter <= 0) {
this.active = false;
this.counter = 0;
}
};
StatusService.prototype.retainWaiting = function() {
this.active = true;
this.icon = 'loading';
this.title = '';
this.text = '';
this.counter++;
};
StatusService.prototype.retainWaiting = function () {
this.active = true;
this.icon = 'loading';
this.title = '';
this.text = '';
this.counter++;
};
StatusService.prototype.unsetStatus = function() {
this.active = false;
};
StatusService.prototype.unsetStatus = function () {
this.active = false;
};
return {
getInstance: function() {
return new StatusService();
}
}
return {
getInstance: function () {
return new StatusService();
},
/* Shared StatusService instance between both ListController instances */
listStatus: new StatusService()
};
});

68
js/webpack.config.js Normal file
View File

@@ -0,0 +1,68 @@
const path = require('path');
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
require('babel-polyfill');
module.exports = {
node: {
fs: 'empty',
},
entry: {
deck: ['babel-polyfill', './init.js'],
},
output: {
filename: '[name].js',
path: __dirname + '/build'
},
resolve: {
modules: [path.resolve(__dirname), 'node_modules'],
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['@babel/preset-env'],
}
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
}
]
},
optimization: {
splitChunks: {
cacheGroups: {
/* separate vendor chunk for node_modules and legacy scripts */
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendor',
chunks: 'all'
},
legacy: {
test: /[\\/]legacy[\\/]/,
name: 'vendor',
chunks: 'all'
}
}
}
},
/* use external jQuery from server */
externals: {
'jquery': 'jQuery'
},
plugins: [
new MiniCssExtractPlugin('[name].css'),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
};

7
js/webpack.dev.config.js Normal file
View File

@@ -0,0 +1,7 @@
const merge = require('webpack-merge');
const baseConfig = require('./webpack.config.js');
module.exports = merge(baseConfig, {
mode: 'development',
devtool: 'source-map',
});

15
js/webpack.prod.config.js Normal file
View File

@@ -0,0 +1,15 @@
const webpack = require('webpack');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.config.js');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = merge(baseConfig, {
mode: 'production',
optimization: {
minimizer: [
new UglifyJsPlugin({
test: /(vendor\.js)+/i
})
]
}});

39
krankerl.toml Normal file
View File

@@ -0,0 +1,39 @@
[package]
exclude = [
"build/",
".git",
"js/node_modules",
"js/tests",
"js/legacy",
"js/controller",
"js/directive",
"js/filters",
"js/service",
"js/bower.json",
"js/.bowerrc",
"js/.jshintrc",
"js/Gruntfile.js",
"js/package.json",
"js/package-lock.json",
"docs/",
"tests",
".codecov.yml",
"composer.json",
"composer.lock",
"_config.yml",
".drone.yml",
".travis.yml",
".eslintignore",
".eslintrc.yml",
".gitignore",
"issue_template.md",
"krankerl.toml",
"Makefile",
"mkdocs.yml",
"run-eslint.sh"
]
before_cmds = [
'make clean-build',
'make build'
]

Some files were not shown because too many files have changed in this diff Show More