Compare commits

..

13 Commits

Author SHA1 Message Date
Julius Härtl
ffb6a2de9c Bump version to 0.2.7
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-10 14:05:26 +01:00
Julius Härtl
13332ecef6 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-10 14:04:20 +01:00
Julius Härtl
4f090c5b6e Bump version to 0.2.6
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-10 12:02:00 +01:00
Julius Härtl
4dd9ad2fa3 Card: Set dbtype when updating
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-10 09:29:37 +01:00
Julius Härtl
1c4cc0f963 Bump version to 0.2.5
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-11-08 19:49:28 +01:00
Julius Härtl
a5b566edd0 Fix mysql datetime format
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-10 17:52:18 +02:00
Julius Härtl
3bd32e6c0d Update appstore building excludes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-08 11:51:37 +02:00
Julius Härtl
1633be74ca Bump release to 0.2.4
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-08 11:47:09 +02:00
Julius Härtl
1ede06fe45 Fix create card issue on NC12
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-08 11:45:17 +02:00
Julius Härtl
4e4d412717 Fix card action menu
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-10-03 15:26:30 +02:00
Julius Härtl
d590e9972b Bump version to 0.2.3
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-23 16:42:52 +02:00
Julius Härtl
91fb1533e6 Fix card positioning when draging them around
fixes #293

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-19 14:24:14 +02:00
Julius Härtl
04f17aad68 Acl: Fix wrong permission type being set
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2017-09-19 14:23:53 +02:00
264 changed files with 2327 additions and 23739 deletions

View File

@@ -5,7 +5,7 @@ clone:
pipeline: pipeline:
check-app-compatbility: check-app-compatbility:
image: nextcloudci/php7.0:php7.0-17 image: nextcloudci/php5.6:php5.6-3
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
@@ -23,71 +23,56 @@ pipeline:
matrix: matrix:
TESTS: check-app-compatbility TESTS: check-app-compatbility
signed-off-check: signed-off-check:
image: nextcloudci/php7.0:php7.0-17 image: nextcloudci/php7.0:php7.0-2
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
- DB=sqlite - DB=sqlite
commands: commands:
- wget https://raw.githubusercontent.com/nextcloud/server/master/build/signed-off-checker.php - wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
- php ./signed-off-checker.php - bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
secrets: [ github_token ] - cd ../server
- php ./build/signed-off-checker.php
when: when:
matrix: matrix:
TESTS: signed-off-check TESTS: signed-off-check
syntax-php5.6: syntax-php5.6:
image: nextcloudci/php5.6:php5.6-8 image: nextcloudci/php5.6:php5.6-3
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=stable13 - CORE_BRANCH=master
- DB=sqlite - DB=sqlite
commands: 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 - composer install
- ./vendor/bin/parallel-lint --exclude ./vendor/ . - ./lib/composer/bin/parallel-lint --exclude build/.phan/ --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 .
when: when:
matrix: matrix:
TESTS: syntax-php5.6 TESTS: syntax-php5.6
syntax-php7.0: syntax-php7.0:
image: nextcloudci/php7.0:php7.0-17 image: nextcloudci/php7.0:php7.0-2
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
- DB=sqlite - DB=sqlite
commands: 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 - composer install
- ./vendor/bin/parallel-lint --exclude ./vendor/ . - ./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 .
when: when:
matrix: matrix:
TESTS: syntax-php7.0 TESTS: syntax-php7.0
syntax-php7.1:
image: nextcloudci/php7.1:php7.1-15
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- 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=master
- DB=sqlite
commands:
- composer install
- ./vendor/bin/parallel-lint --exclude ./vendor/ .
when:
matrix:
TESTS: syntax-php7.2
php5.6: php5.6:
image: nextcloudci/php5.6:php5.6-8 image: nextcloudci/php5.6:php5.6-7
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=stable13 - CORE_BRANCH=master
- DB=sqlite - DB=sqlite
commands: commands:
- apt update && apt-get -y install php5-xdebug - apt update && apt-get -y install php5-xdebug
@@ -98,13 +83,19 @@ pipeline:
- cd ../server/ - cd ../server/
- ./occ app:enable $APP_NAME - ./occ app:enable $APP_NAME
- cd apps/$APP_NAME - cd apps/$APP_NAME
- phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml - 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 - 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: when:
matrix: matrix:
TESTS: php5.6 TESTS: php5.6
php7.0: php7.0:
image: nextcloudci/php7.0:php7.0-17 image: nextcloudci/php7.0:php7.0-8
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
@@ -123,13 +114,14 @@ pipeline:
matrix: matrix:
TESTS: php7.0 TESTS: php7.0
php7.1: php7.1:
image: nextcloudci/php7.1:php7.1-15 image: nextcloudci/php7.1:php7.1-11
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
- DB=sqlite - DB=sqlite
commands: commands:
# Pre-setup steps # Pre-setup steps
- yum -y install wget
- wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh - wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh
- bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB - bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB
- cd ../server/ - cd ../server/
@@ -140,26 +132,8 @@ pipeline:
when: when:
matrix: matrix:
TESTS: php7.1 TESTS: php7.1
php7.2:
image: nextcloudci/php7.2:php7.2-9
environment:
- APP_NAME=deck
- CORE_BRANCH=master
- 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
- 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: integration:
image: nextcloudci/integration-php7.0:integration-php7.0-6 image: nextcloudci/integration-php7.0:integration-php7.0-3
environment: environment:
- APP_NAME=deck - APP_NAME=deck
- CORE_BRANCH=master - CORE_BRANCH=master
@@ -176,18 +150,13 @@ pipeline:
when: when:
matrix: matrix:
TESTS: integration TESTS: integration
eslint:
image: nextcloudci/eslint:eslint-1
commands:
- ./run-eslint.sh
when:
matrix:
TESTS: eslint
jsbuild: jsbuild:
image: mhart/alpine-node:6.8.0 image: mhart/alpine-node:6.8.0
commands: commands:
- apk add --no-cache make - apk add --no-cache git
- make build-js - cd js
- npm install --deps
- ./node_modules/.bin/bower --allow-root install
when: when:
matrix: matrix:
TESTS: jsbuild TESTS: jsbuild
@@ -197,15 +166,11 @@ matrix:
- TESTS: signed-off-check - TESTS: signed-off-check
- TESTS: syntax-php5.6 - TESTS: syntax-php5.6
- TESTS: syntax-php7.0 - TESTS: syntax-php7.0
- TESTS: syntax-php7.1
- TESTS: syntax-php7.2
- TESTS: php5.6 - TESTS: php5.6
- TESTS: php7.0 - TESTS: php7.0
- TESTS: php7.1 - TESTS: php7.1
- TESTS: php7.2
- TESTS: eslint
- TESTS: jsbuild - TESTS: jsbuild
#- TESTS: integration - TESTS: integration
branches: [ master, stable* ] branches: [ master, stable* ]

View File

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

View File

@@ -1,42 +0,0 @@
root: true
extends:
- eslint:recommended
env:
browser: true
amd: 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,17 +0,0 @@
---
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.

3
.gitignore vendored
View File

@@ -1,10 +1,9 @@
js/node_modules/* js/node_modules/*
js/vendor/ js/vendor/
js/public/ js/public/
js/build/ js/package-lock.json
build/ build/
css/style.css css/style.css
css/vendor.css
tests/integration/vendor/ tests/integration/vendor/
tests/integration/composer.lock tests/integration/composer.lock
vendor/ vendor/

View File

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

View File

@@ -1,52 +1,6 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 0.4.0 - unreleased
### 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 ## 0.2.7 - 2017-11-10
### Fixed ### Fixed

View File

@@ -19,20 +19,22 @@ clean-build:
clean-dist: clean-dist:
rm -rf js/node_modules rm -rf js/node_modules
rm -rf js/vendor
install-deps: install-deps:
cd js && npm install cd js && npm install --deps
cd js && ./node_modules/.bin/bower install
build: build-js build: build-js build-css
build-js: install-deps build-js: install-deps
cd js && npm run build cd js && ./node_modules/.bin/grunt build
build-js-dev: install-deps build-css: install-deps
cd js && npm run dev ./js/node_modules/node-sass/bin/node-sass --output-style compressed css/legacy.scss css/style.css
watch: watch:
cd js && npm run watch cd js && ./node_modules/.bin/grunt watch
# appstore: clean install-deps # appstore: clean install-deps
appstore: clean-build build appstore: clean-build build
@@ -60,7 +62,6 @@ appstore: clean-build build
--exclude="../$(app_name)/protractor\.*" \ --exclude="../$(app_name)/protractor\.*" \
--exclude="../$(app_name)/.*" \ --exclude="../$(app_name)/.*" \
--exclude="../$(app_name)/*.lock" \ --exclude="../$(app_name)/*.lock" \
--exclude="../$(app_name)/run-eslint.sh" \
--exclude="../$(app_name)/js/.*" \ --exclude="../$(app_name)/js/.*" \
--exclude="../$(app_name)/vendor" \ --exclude="../$(app_name)/vendor" \
--exclude-vcs \ --exclude-vcs \

View File

@@ -1,6 +1,6 @@
# Deck # 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) [![Dependency Status](https://www.versioneye.com/user/projects/5af6c4090fb24f0e3a423c40/badge.svg)](https://www.versioneye.com/user/projects/5af6c4090fb24f0e3a423c40) [![#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) [![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)
Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud. Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.
@@ -14,9 +14,17 @@ Deck is a kanban style organization tool aimed at personal planning and project
![Deck - Manage cards on your board](https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png) ![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 ...
## Installation/Update ## Installation/Update
This app is supposed to work on Nextcloud version 12 or later. This app is supposed to work on Nextcloud version 11 or later.
### Install latest release ### Install latest release
@@ -47,7 +55,8 @@ Nothing to prepare, just dig into the code.
### JavaScript ### JavaScript
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. 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```.
### Running tests ### Running tests
You can use the provided Makefile to run all tests by using: You can use the provided Makefile to run all tests by using:

2
_config.yml Normal file
View File

@@ -0,0 +1,2 @@
theme: jekyll-theme-cayman
site: https://deck-app.com

View File

@@ -23,4 +23,3 @@
$app = new \OCA\Deck\AppInfo\Application(); $app = new \OCA\Deck\AppInfo\Application();
$app->registerNavigationEntry(); $app->registerNavigationEntry();
$app->registerNotifications();

View File

@@ -162,11 +162,6 @@
<type>timestamp</type> <type>timestamp</type>
<default>0</default> <default>0</default>
</field> </field>
<field>
<name>notified</name>
<type>boolean</type>
<default>false</default>
</field>
<index> <index>
<name>deck_cards_stack_id_index</name> <name>deck_cards_stack_id_index</name>
<field> <field>
@@ -198,6 +193,12 @@
<autoincrement>1</autoincrement> <autoincrement>1</autoincrement>
<length>4</length> <length>4</length>
</field> </field>
<field>
<name>title</name>
<type>text</type>
<notnull>true</notnull>
<length>100</length>
</field>
<field> <field>
<name>card_id</name> <name>card_id</name>
<type>integer</type> <type>integer</type>
@@ -212,12 +213,12 @@
</field> </field>
<field> <field>
<name>data</name> <name>data</name>
<type>text</type> <type>clob</type>
</field> </field>
<field> <field>
<name>last_modified</name> <name>last_modified</name>
<type>integer</type> <type>integer</type>
<default/> <default></default>
<length>8</length> <length>8</length>
<notnull>false</notnull> <notnull>false</notnull>
<unsigned>true</unsigned> <unsigned>true</unsigned>
@@ -225,21 +226,7 @@
<field> <field>
<name>created_at</name> <name>created_at</name>
<type>integer</type> <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> <length>8</length>
<notnull>false</notnull> <notnull>false</notnull>
<unsigned>true</unsigned> <unsigned>true</unsigned>
@@ -324,44 +311,6 @@
</index> </index>
</declaration> </declaration>
</table> </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> <table>
<name>*dbprefix*deck_board_acl</name> <name>*dbprefix*deck_board_acl</name>
<declaration> <declaration>

View File

@@ -13,31 +13,28 @@
- 👥 Share with your team, friends or family - 👥 Share with your team, friends or family
- 🚀 Get your project organized - 🚀 Get your project organized
💥 This is still alpha software: it may not be stable enough for production!
</description> </description>
<version>0.4.0-beta4</version> <version>0.2.7</version>
<licence>agpl</licence> <licence>agpl</licence>
<author>Julius Härtl</author> <author>Julius Härtl</author>
<namespace>Deck</namespace> <namespace>Deck</namespace>
<category>organization</category> <category>organization</category>
<category>office</category> <category>office</category>
<website>https://github.com/nextcloud/deck</website>
<bugs>https://github.com/nextcloud/deck/issues</bugs> <bugs>https://github.com/nextcloud/deck/issues</bugs>
<repository type="git">https://github.com/nextcloud/deck.git</repository> <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_Board.png</screenshot>
<screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png</screenshot> <screenshot>https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png</screenshot>
<dependencies> <dependencies>
<nextcloud min-version="12" max-version="14" /> <nextcloud min-version="11" max-version="13" />
</dependencies> </dependencies>
<background-jobs> <background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job> <job>OCA\Deck\Cron\DeleteCron</job>
<job>OCA\Deck\Cron\ScheduledNotifications</job>
</background-jobs> </background-jobs>
<repair-steps> <repair-steps>
<post-migration> <post-migration>
<step>OCA\Deck\Migration\UnknownUsers</step> <step>OCA\Deck\Migration\UnknownUsers</step>
</post-migration> </post-migration>
</repair-steps> </repair-steps>
<commands>
<command>OCA\Deck\Command\UserExport</command>
</commands>
</info> </info>

View File

@@ -56,18 +56,6 @@ return [
['name' => 'card#unarchive', 'url' => '/cards/{cardId}/unarchive', 'verb' => 'PUT'], ['name' => 'card#unarchive', 'url' => '/cards/{cardId}/unarchive', 'verb' => 'PUT'],
['name' => 'card#assignLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'POST'], ['name' => 'card#assignLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'POST'],
['name' => 'card#removeLabel', 'url' => '/cards/{cardId}/label/{labelId}', 'verb' => 'DELETE'], ['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 // labels
['name' => 'label#create', 'url' => '/labels', 'verb' => 'POST'], ['name' => 'label#create', 'url' => '/labels', 'verb' => 'POST'],

View File

@@ -1,16 +0,0 @@
{
"name": "nextcloud/deck",
"type": "project",
"license": "AGPLv3",
"authors": [
{
"name": "Julius Härtl",
"email": "jus@bitgrid.net"
}
],
"require": {},
"require-dev": {
"christophwurst/nextcloud": "^13.0",
"jakub-onderka/php-parallel-lint": "^1.0.0"
}
}

View File

@@ -1,113 +0,0 @@
/*
* @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;
}
}
}

View File

@@ -1,42 +0,0 @@
/**
* 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: url('../../../core/img/places/home.svg');
}
.icon-badge {
background-image: url('../../../core/img/places/calendar-dark.svg');
}

View File

@@ -1,6 +1,5 @@
<?php /*
/** * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
* @copyright Copyright (c) 2017 Julius Härtl <jus@bitgrid.net>
* *
* @author Julius Härtl <jus@bitgrid.net> * @author Julius Härtl <jus@bitgrid.net>
* *
@@ -17,24 +16,9 @@
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
namespace OCA\Deck\Db; @import '../../../core/css/variables.scss';
@import 'style.scss';
use JsonSerializable;
class AssignedUsers extends RelationalEntity implements JsonSerializable {
public $id;
protected $participant;
protected $cardId;
public function __construct() {
$this->addType('id', 'integer');
$this->addType('card_id', 'integer');
$this->addResolvable('participant');
}
}

File diff suppressed because it is too large Load Diff

View File

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

Before

Width:  |  Height:  |  Size: 897 B

View File

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

Before

Width:  |  Height:  |  Size: 910 B

View File

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

3
js/.bowerrc Normal file
View File

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

123
js/Gruntfile.js Normal file
View File

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

@@ -20,9 +20,6 @@
* *
*/ */
/* global angular */
angular.module('markdown', []) angular.module('markdown', [])
.provider('markdown', [function () { .provider('markdown', [function () {
var opts = {}; var opts = {};
@@ -41,20 +38,13 @@ 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';
var app = angular.module('Deck', [ var app = angular.module('Deck', [
ngsanitize, 'ngRoute',
uirouter, 'ngSanitize',
angularuiselect, 'ui.router',
ngsortable, md, nganimate, 'ui.select',
'angularFileUpload' 'as.sortable',
'mdMarkdownIt',
'ngAnimate'
]); ]);
export default app;

View File

@@ -20,97 +20,57 @@
* *
*/ */
/* global app oc_requesttoken markdownitLinkTarget */ app.config(function ($provide, $routeProvider, $interpolateProvider, $httpProvider, $urlRouterProvider, $stateProvider, $compileProvider, markdownItConverterProvider) {
'use strict';
$httpProvider.defaults.headers.common.requesttoken = oc_requesttoken;
import app from './App.js'; $compileProvider.debugInfoEnabled(true);
import md from 'angular-markdown-it';
import markdownitLinkTarget from 'markdown-it-link-target';
import markdownitCheckbox from 'legacy/markdown-it-checkbox.js';
app.config(function ($provide, $interpolateProvider, $httpProvider, $urlRouterProvider, $stateProvider, $compileProvider, markdownItConverterProvider) { markdownItConverterProvider.config({
'use strict'; breaks: true,
$httpProvider.defaults.headers.common.requesttoken = oc_requesttoken; linkify: true,
xhtmlOut: true
});
markdownItConverterProvider.use(markdownitLinkTarget);
$urlRouterProvider.otherwise('/');
$compileProvider.debugInfoEnabled(true); $stateProvider
// This should fix adding "unsafe:" prefix to ui-select href links containing javascript .state('list', {
// inline JS is blocked by CSP anyway and filtered out by our markdown renderer as well url: '/:filter',
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/); templateUrl: '/boardlist.mainView.html',
controller: 'ListController',
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, reloadOnSearch: false,
params: { params: {
filter: {value: '', dynamic: true} filter: { value: '', dynamic: true }
} }
}) })
.state('board', { .state('board', {
url: '/board/:boardId/:filter', url: '/board/:boardId/:filter',
templateUrl: '/board.html', templateUrl: '/board.html',
controller: 'BoardController', controller: 'BoardController',
params: { params: {
filter: {value: '', dynamic: true} filter: { value: '', dynamic: true }
} }
}) })
.state('board.detail', { .state('board.detail', {
url: '/detail/', url: '/detail/',
reloadOnSearch: false, reloadOnSearch : false,
params: { views: {
tab: {value: 0, dynamic: true}, 'sidebarView': {
}, templateUrl: '/board.sidebarView.html'
views: {
'sidebarView': {
templateUrl: '/board.sidebarView.html'
} }
} }
}) })
.state('board.card', { .state('board.card', {
url: '/card/:cardId', url: '/card/:cardId',
params: { views: {
tab: {value: 0, dynamic: true}, 'sidebarView': {
}, templateUrl: '/card.sidebarView.html',
views: { controller: 'CardController'
'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

@@ -19,66 +19,58 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * 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) { app.run(function ($document, $rootScope, $transitions, BoardService) {
'use strict'; 'use strict';
$document.click(function (event) {
$document.click(function (event) { $rootScope.$broadcast('documentClicked', event);
$rootScope.$broadcast('documentClicked', event); });
}); $transitions.onEnter({from: 'list'}, function($state, $transition$) {
$transitions.onEnter({from: 'list'}, function ($state, $transition$) { BoardService.unsetCurrrent();
BoardService.unsetCurrrent(); });
}); $transitions.onEnter({to: 'list'}, function($state, $transition$) {
$transitions.onEnter({to: 'list'}, function ($state, $transition$) {
BoardService.unsetCurrrent(); BoardService.unsetCurrrent();
document.title = "Deck - " + oc_defaults.name; document.title = "Deck - " + oc_defaults.name;
}); });
$transitions.onEnter({to: 'board.card'}, function ($state, $transition$) { $transitions.onEnter({to: 'board.card'}, function ($state, $transition$) {
$rootScope.sidebar.show = true; $rootScope.sidebar.show = true;
}); });
$transitions.onEnter({to: 'board.detail'}, function ($state, $transition$) { $transitions.onEnter({to: 'board.detail'}, function ($state, $transition$) {
$rootScope.sidebar.show = true; $rootScope.sidebar.show = true;
}); });
$transitions.onEnter({to: 'board'}, function ($state) { $transitions.onEnter({to: 'board'}, function ($state) {
$rootScope.sidebar.show = false; $rootScope.sidebar.show = false;
}); });
$transitions.onExit({from: 'board.card'}, function ($state) { $transitions.onExit({from: 'board.card'}, function ($state) {
$rootScope.sidebar.show = false; $rootScope.sidebar.show = false;
}); });
$transitions.onExit({from: 'board.detail'}, function ($state) { $transitions.onExit({from: 'board.detail'}, function ($state) {
$rootScope.sidebar.show = false; $rootScope.sidebar.show = false;
}); });
$('link[rel="shortcut icon"]').attr( $('link[rel="shortcut icon"]').attr(
'href', 'href',
OC.filePath('deck', 'img', 'app-512.png') OC.filePath('deck', 'img', 'app-512.png')
); );
$('#app-navigation-toggle').off('click'); $('#app-navigation-toggle').off('click');
// App sidebar on mobile // App sidebar on mobile
var snapper = new Snap({ var snapper = new Snap({
element: document.getElementById('app-content'), element: document.getElementById('app-content'),
disable: 'right', disable: 'right',
maxPosition: 250, maxPosition: 250,
touchToDrag: false touchToDrag: false
}); });
$('#app-navigation-toggle').click(function () {
if ($(window).width() > 768) {
$('#app-navigation').toggle('hidden');
} else {
if (snapper.state().state === 'left') {
snapper.close();
} else {
snapper.open('left');
}
}
});
// Select all elements with data-toggle="tooltips" in the document
$('body').tooltip({
selector: '[data-toggle="tooltip"]'
});
$('#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');
}
}
});
}); });

29
js/bower.json Normal file
View File

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

@@ -20,14 +20,10 @@
* *
*/ */
import app from '../app/App.js'; app.controller('AppController', function ($scope, $location, $http, $route, $log, $rootScope, $stateParams) {
$rootScope.sidebar = {
/** global: OC */ show: false
app.controller('AppController', function ($scope, $location, $http, $log, $rootScope, $attrs) { };
$rootScope.sidebar = { $scope.sidebar = $rootScope.sidebar;
show: false $scope.user = oc_current_user;
}; });
$scope.sidebar = $rootScope.sidebar;
$scope.user = oc_current_user;
$rootScope.config = JSON.parse($attrs.config);
});

View File

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

@@ -20,9 +20,7 @@
* *
*/ */
import app from '../app/App.js'; app.controller('BoardController', function ($rootScope, $scope, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter) {
/* global oc_defaults OC */
app.controller('BoardController', function ($rootScope, $scope, $stateParams, StatusService, BoardService, StackService, CardService, LabelService, $state, $transitions, $filter, FileService) {
$scope.sidebar = $rootScope.sidebar; $scope.sidebar = $rootScope.sidebar;
@@ -31,88 +29,58 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
addCard: [], addCard: [],
}; };
$scope.newLabel = {}; $scope.newLabel = {};
$scope.status.boardtab = $stateParams.detailTab;
$scope.OC = OC;
$scope.stackservice = StackService; $scope.stackservice = StackService;
$scope.boardservice = BoardService; $scope.boardservice = BoardService;
$scope.cardservice = CardService; $scope.cardservice = CardService;
$scope.statusservice = StatusService.getInstance(); $scope.statusservice = StatusService.getInstance();
$scope.labelservice = LabelService; $scope.labelservice = LabelService;
$scope.defaultColors = ['31CC7C', '317CCC', 'FF7A66', 'F1DB50', '7C31CC', 'CC317C', '3A3B3D', 'CACBCD']; $scope.defaultColors = ['31CC7C', '317CCC', 'FF7A66', 'F1DB50', '7C31CC', 'CC317C', '3A3B3D', 'CACBCD'];
$scope.board = BoardService.getCurrent();
$scope.uploader = FileService.uploader;
// 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|\_|\-)\]\s(.*)/ig;
const regFinished = /\[(X|\_|\-)\]\s(.*)/ig;
return [
((text || '').match(regFinished) || []).length,
((text || '').match(regTotal) || []).length
];
};
$scope.search = function (searchText) { $scope.search = function (searchText) {
$scope.searchText = searchText; $scope.searchText = searchText;
$scope.refreshData(); $scope.refreshData();
}; };
$scope.$watch(function () { $scope.board = BoardService.getCurrent();
if (typeof BoardService.getCurrent() !== 'undefined') { StackService.clear(); //FIXME: Is this still needed?
return BoardService.getCurrent().title; $scope.setPageTitle = function() {
if(BoardService.getCurrent()) {
document.title = BoardService.getCurrent().title + " | Deck - " + oc_defaults.name;
} else { } else {
return null; document.title = "Deck - " + oc_defaults.name;
} }
}, function () { };
$scope.setPageTitle(); $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;
}); });
$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();
// handle filter parameter for switching between archived/unarchived cards
$scope.switchFilter = function (filter) { $scope.switchFilter = function (filter) {
$state.go('.', {filter: filter}); $state.go('.', {filter: filter}, {notify: false});
$scope.filter = filter;
}; };
$scope.$watch(function() { $scope.$watch('filter', function (name) {
return $scope.params.filter; if (name === "archive") {
}, function (filter) {
if (filter === 'archive') {
$scope.loadArchived(); $scope.loadArchived();
} else { } else {
$scope.loadDefault(); $scope.loadDefault();
} }
}); });
$scope.stacksData = StackService; $scope.stacksData = StackService;
$scope.stacks = []; $scope.stacks = [];
$scope.$watch('stacksData', function () { $scope.$watch('stacksData', function (value) {
$scope.refreshData(); $scope.refreshData();
}, true); }, true);
$scope.refreshData = function () { $scope.refreshData = function () {
if ($scope.params.filter === 'archive') { if ($scope.filter === "archive") {
$scope.filterData('-lastModified', $scope.searchText); $scope.filterData('-lastModified', $scope.searchText);
} else { } else {
$scope.filterData('order', $scope.searchText); $scope.filterData('order', $scope.searchText);
@@ -124,9 +92,8 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// filter cards here, as ng-sortable will not work nicely with html-inline filters // filter cards here, as ng-sortable will not work nicely with html-inline filters
$scope.filterData = function (order, text) { $scope.filterData = function (order, text) {
if ($scope.stacks === undefined) { if ($scope.stacks === undefined)
return; return;
}
angular.copy(StackService.getData(), $scope.stacks); angular.copy(StackService.getData(), $scope.stacks);
$scope.stacks = $filter('orderBy')($scope.stacks, 'order'); $scope.stacks = $filter('orderBy')($scope.stacks, 'order');
angular.forEach($scope.stacks, function (value, key) { angular.forEach($scope.stacks, function (value, key) {
@@ -170,7 +137,7 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
// Create a new Stack // Create a new Stack
$scope.createStack = function () { $scope.createStack = function () {
StackService.create($scope.newStack).then(function (data) { StackService.create($scope.newStack).then(function (data) {
$scope.newStack.title = ''; $scope.newStack.title = "";
}); });
}; };
@@ -182,19 +149,13 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
}; };
CardService.create(newCard).then(function (data) { CardService.create(newCard).then(function (data) {
$scope.stackservice.addCard(data); $scope.stackservice.addCard(data);
$scope.newCard.title = ''; $scope.newCard.title = "";
}); });
}; };
$scope.cardDelete = function (card) { $scope.cardDelete = function (card) {
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete this card with all of its data?'), t('deck', 'Delete'), function(state) { CardService.delete(card.id);
if (!state) { StackService.removeCard(card);
return;
}
CardService.delete(card.id).then(function () {
StackService.removeCard(card);
});
});
}; };
$scope.cardArchive = function (card) { $scope.cardArchive = function (card) {
CardService.archive(card); CardService.archive(card);
@@ -214,12 +175,10 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
}; };
$scope.labelCreate = function (label) { $scope.labelCreate = function (label) {
label.boardId = $scope.id; label.boardId = $scope.id;
LabelService.create(label).then(function (data) { LabelService.create(label);
$scope.newStack.title = ''; BoardService.getCurrent().labels.push(label);
BoardService.getCurrent().labels.push(data); $scope.status.createLabel = false;
$scope.status.createLabel = false; $scope.newLabel = {};
$scope.newLabel = {};
});
}; };
$scope.labelUpdate = function (label) { $scope.labelUpdate = function (label) {
label.edit = false; label.edit = false;
@@ -232,28 +191,12 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.status.addSharee = null; $scope.status.addSharee = null;
}; };
$scope.aclDelete = function (acl) { $scope.aclDelete = function (acl) {
BoardService.deleteAcl(acl).then(function(data) { BoardService.deleteAcl(acl);
$scope.loadDefault();
$scope.refreshData();
});
}; };
$scope.aclUpdate = function (acl) { $scope.aclUpdate = function (acl) {
BoardService.updateAcl(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 // settings for card sorting
$scope.sortOptions = { $scope.sortOptions = {
@@ -284,26 +227,26 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
$scope.refreshData(); $scope.refreshData();
}); });
}, },
scrollableContainer: '#innerBoard', scrollableContainer: '#board',
containerPositioning: 'relative', containerPositioning: 'relative',
containment: '#innerBoard', containment: '#board',
longTouch: true, longTouch: true,
// auto scroll on drag // auto scroll on drag
dragMove: function (itemPosition, containment, eventObj) { dragMove: function (itemPosition, containment, eventObj) {
if (eventObj) { if (eventObj) {
var container = $('#board'); var container = $("#board");
var offset = container.offset(); var offset = container.offset();
var targetX = eventObj.pageX - (offset.left || container.scrollLeft()); var targetX = eventObj.pageX - (offset.left || container.scrollLeft());
var targetY = eventObj.pageY - (offset.top || container.scrollTop()); var targetY = eventObj.pageY - (offset.top || container.scrollTop());
if (targetX < offset.left) { if (targetX < offset.left) {
container.scrollLeft(container.scrollLeft() - 25); container.scrollLeft(container.scrollLeft() - 50);
} else if (targetX > container.width()) { } else if (targetX > container.width()) {
container.scrollLeft(container.scrollLeft() + 25); container.scrollLeft(container.scrollLeft() + 50);
} }
if (targetY < offset.top) { if (targetY < offset.top) {
container.scrollTop(container.scrollTop() - 25); container.scrollTop(container.scrollTop() - 50);
} else if (targetY > container.height()) { } else if (targetY > container.height()) {
container.scrollTop(container.scrollTop() + 25); container.scrollTop(container.scrollTop() + 50);
} }
} }
}, },
@@ -323,10 +266,11 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
}, },
scrollableContainer: '#board', scrollableContainer: '#board',
containerPositioning: 'relative', containerPositioning: 'relative',
containment: '#innerBoard', containment: '#board',
longTouch: true,
dragMove: function (itemPosition, containment, eventObj) { dragMove: function (itemPosition, containment, eventObj) {
if (eventObj) { if (eventObj) {
var container = $('#board'); var container = $("#board");
var offset = container.offset(); var offset = container.offset();
var targetX = eventObj.pageX - (offset.left || container.scrollLeft()); var targetX = eventObj.pageX - (offset.left || container.scrollLeft());
var targetY = eventObj.pageY - (offset.top || container.scrollTop()); var targetY = eventObj.pageY - (offset.top || container.scrollTop());
@@ -347,18 +291,4 @@ app.controller('BoardController', function ($rootScope, $scope, $stateParams, St
} }
}; };
$scope.labelStyle = function (color) {
return {
'background-color': '#' + color,
'color': $filter('textColorFilter')(color)
};
};
$scope.attachmentCount = function(card) {
if (Array.isArray(card.attachments)) {
return card.attachments.filter((obj) => obj.deletedAt === 0).length;
}
return card.attachmentCount;
};
}); });

View File

@@ -20,175 +20,69 @@
* *
*/ */
/* global app moment angular OC */ /* global app */
import app from '../app/App.js'; /* global moment */
app.controller('CardController', function ($scope, $rootScope, $sce, $location, $stateParams, $state, $interval, $timeout, $filter, BoardService, CardService, StackService, StatusService, markdownItConverter, FileService) { app.controller('CardController', function ($scope, $rootScope, $routeParams, $location, $stateParams, BoardService, CardService, StackService, StatusService) {
$scope.sidebar = $rootScope.sidebar; $scope.sidebar = $rootScope.sidebar;
$scope.status = { $scope.status = {};
lastEdit: 0,
lastSave: Date.now()
};
$scope.cardservice = CardService; $scope.cardservice = CardService;
$scope.fileservice = FileService;
$scope.cardId = $stateParams.cardId; $scope.cardId = $stateParams.cardId;
$scope.statusservice = StatusService.getInstance(); $scope.statusservice = StatusService.getInstance();
$scope.boardservice = BoardService; $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.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) { CardService.fetchOne($scope.cardId).then(function (data) {
$scope.statusservice.releaseWaiting(); $scope.statusservice.releaseWaiting();
$scope.archived = CardService.getCurrent().archived; $scope.archived = CardService.getCurrent().archived;
$scope.updateMarkdown(CardService.getCurrent().description);
}, function (error) { }, function (error) {
}); });
$scope.cardRenameShow = function () { $scope.cardRenameShow = function () {
if ($scope.archived || !BoardService.canEdit()) if ($scope.archived || !BoardService.canEdit())
{return false;} return false;
else { else {
$scope.status.cardRename = true; $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|\_|\-)\]\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 = $('.section-header-tabbed .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);
return;
}
if ($event.target.tagName === 'INPUT') {
$scope.toggleCheckbox(checkboxId);
return;
}
if (BoardService.isArchived() || CardService.getCurrent().archived) { if (BoardService.isArchived() || CardService.getCurrent().archived) {
return false; return false;
} }
var node = $event.target.nodeName;
if ($scope.card.archived || !$scope.boardservice.canEdit()) { if ($scope.card.archived || !$scope.boardservice.canEdit()) {
return false; console.log(node);
} else {
console.log("edit");
$scope.status.cardEditDescription = true;
} }
$scope.status.cardEditDescription = true; console.log($scope.status.canEditDescription);
$scope.status.edit = angular.copy(CardService.getCurrent());
return true;
}; };
$scope.cardEditDescriptionChanged = function ($event) {
$scope.status.lastEdit = Date.now();
var header = $('.section-header-tabbed .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 = $('.section-header-tabbed .tabDetails');
header.find('.save-indicator.unsaved').fadeIn(500);
CardService.update($scope.status.edit).then(function (data) {
var header = $('.section-header-tabbed .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 // handle rename to update information on the board as well
$scope.cardRename = function (card) { $scope.cardRename = function (card) {
CardService.rename(card).then(function (data) { CardService.rename(card).then(function (data) {
StackService.updateCard(card);
$scope.status.renameCard = false; $scope.status.renameCard = false;
}); });
}; };
$scope.cardUpdate = function (card) { $scope.cardUpdate = function (card) {
CardService.update(card).then(function (data) { CardService.update(CardService.getCurrent()).then(function (data) {
$scope.status.cardEditDescription = false; $scope.status.cardEditDescription = false;
$scope.updateMarkdown($scope.status.edit.description); $('#card-description').find('.save-indicator').fadeIn(500).fadeOut(1000);
var header = $('.section-header-tabbed .tabDetails');
header.find('.save-indicator.unsaved').hide();
header.find('.save-indicator.saved').fadeIn(500).fadeOut(1000);
}); });
}; };
$scope.labelAssign = function (element, model) { $scope.labelAssign = function (element, model) {
CardService.assignLabel($scope.cardId, element.id).then(function (data) { CardService.assignLabel($scope.cardId, element.id);
}); var card = CardService.getCurrent();
StackService.updateCard(card);
}; };
$scope.labelRemove = function (element, model) { $scope.labelRemove = function (element, model) {
CardService.removeLabel($scope.cardId, element.id).then(function (data) { CardService.removeLabel($scope.cardId, element.id)
});
}; };
$scope.setDuedate = function (duedate) { $scope.setDuedate = function (duedate) {
@@ -202,6 +96,7 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
newDate.year(duedate.year()); newDate.year(duedate.year());
element.duedate = newDate.toISOString(); element.duedate = newDate.toISOString();
CardService.update(element); CardService.update(element);
StackService.updateCard(element);
}; };
$scope.setDuedateTime = function (time) { $scope.setDuedateTime = function (time) {
var element = CardService.getCurrent(); var element = CardService.getCurrent();
@@ -213,49 +108,13 @@ app.controller('CardController', function ($scope, $rootScope, $sce, $location,
newDate.minute(time.minute()); newDate.minute(time.minute());
element.duedate = newDate.toISOString(); element.duedate = newDate.toISOString();
CardService.update(element); CardService.update(element);
StackService.updateCard(element);
}; };
$scope.resetDuedate = function () { $scope.resetDuedate = function () {
var element = CardService.getCurrent(); var element = CardService.getCurrent();
element.duedate = null; element.duedate = null;
CardService.update(element); 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)
};
};
}); });

View File

@@ -1,44 +0,0 @@
/*
* @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,29 +22,7 @@
/* global app angular */ /* global app angular */
var ListController = function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state, StatusService) { app.controller('ListController', function ($scope, $location, $filter, BoardService, $element, $timeout, $stateParams, $state) {
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.boards = [];
$scope.newBoard = {}; $scope.newBoard = {};
$scope.status = { $scope.status = {
@@ -54,73 +32,44 @@ var ListController = function ($scope, $location, $filter, BoardService, $elemen
}; };
$scope.colors = ['0082c9', '00c9c6','00c906', 'c92b00', 'F1DB50', '7C31CC', '3A3B3D', 'CACBCD']; $scope.colors = ['0082c9', '00c9c6','00c906', 'c92b00', 'F1DB50', '7C31CC', '3A3B3D', 'CACBCD'];
$scope.boardservice = BoardService; $scope.boardservice = BoardService;
$scope.newBoard.color = $scope.colors[0];
$scope.updatingBoard = null; $scope.updatingBoard = null;
var filterData = function () { // FIXME: not nice, but we want to load this only once
if($element.attr('id') === 'app-navigation') { if($element.attr('id') === 'app-navigation') {
$scope.boardservice.sidebar = $scope.boardservice.getData(); BoardService.fetchAll().then(function(data) {
$scope.boardservice.sidebar = $filter('orderBy')($scope.boardservice.sidebar, 'title'); $scope.filterData();
$scope.boardservice.sidebar = $filter('cardFilter')($scope.boardservice.sidebar, {archived: false}); }, function (error) {
} else { // TODO: show error when loading fails
$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']);
}
};
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();
}); });
}
$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);
} else {
$scope.boardservice.sorted = $filter('cardFilter')($scope.boardservice.sorted, {archived: false});
}
$scope.boardservice.sorted = $filter('orderBy')($scope.boardservice.sorted, ['deletedAt', 'title']);
}; };
initialize();
$scope.$watchCollection(function(){
return $state.params;
}, function(){
$scope.status.filter = $state.params.filter;
$scope.filterData();
});
$scope.selectColor = function(color) { $scope.selectColor = function(color) {
$scope.newBoard.color = color; $scope.newBoard.color = color;
@@ -141,9 +90,9 @@ var ListController = function ($scope, $location, $filter, BoardService, $elemen
BoardService.create($scope.newBoard) BoardService.create($scope.newBoard)
.then(function (response) { .then(function (response) {
$scope.newBoard = {}; $scope.newBoard = {};
$scope.newBoard.color = calculateNewColor(); $scope.newBoard.color = $scope.colors[0];
$scope.status.addBoard=false; $scope.status.addBoard=false;
filterData(); $scope.filterData();
}, function(error) { }, function(error) {
$scope.status.createBoard = 'Unable to insert board: ' + error.message; $scope.status.createBoard = 'Unable to insert board: ' + error.message;
}); });
@@ -151,48 +100,47 @@ var ListController = function ($scope, $location, $filter, BoardService, $elemen
$scope.boardUpdate = function(board) { $scope.boardUpdate = function(board) {
BoardService.update(board).then(function(data) { BoardService.update(board).then(function(data) {
$scope.filterData();
board.status.edit = false; board.status.edit = false;
filterData();
}); });
}; };
$scope.boardUpdateBegin = function(board) { $scope.boardUpdateBegin = function(board) {
$scope.updatingBoard = angular.copy(board); $scope.updatingBoard = board;
}; };
$scope.boardUpdateReset = function(board) { $scope.boardUpdateReset = function(board) {
board.title = $scope.updatingBoard.title; board.title = $scope.updatingBoard.title;
board.color = $scope.updatingBoard.color; board.color = $scope.updatingBoard.color;
filterData(); $scope.filterData();
board.status.edit = false; board.status.edit = false;
}; };
$scope.boardArchive = function (board) { $scope.boardArchive = function (board) {
board.archived = true; board.archived = true;
BoardService.update(board).then(function(data) { BoardService.update(board).then(function(data) {
filterData(); $scope.filterData();
}); });
}; };
$scope.boardUnarchive = function (board) { $scope.boardUnarchive = function (board) {
board.archived = false; board.archived = false;
BoardService.update(board).then(function(data) { BoardService.update(board).then(function(data) {
filterData(); $scope.filterData();
}); });
}; };
$scope.boardDelete = function(board) { $scope.boardDelete = function(board) {
BoardService.delete(board.id).then(function (data) { BoardService.delete(board.id).then(function (data) {
filterData(); $scope.filterData();
}); });
}; };
$scope.boardDeleteUndo = function (board) { $scope.boardDeleteUndo = function (board) {
BoardService.deleteUndo(board.id).then(function (data) { BoardService.deleteUndo(board.id).then(function (data) {
filterData(); $scope.filterData();
}); });
}; };
}; });
export default ListController;

View File

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

View File

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

View File

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

View File

@@ -19,33 +19,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
import app from '../app/App.js';
app.directive('avatar', function() { app.directive('avatar', function() {
'use strict'; 'use strict';
return { return {
restrict: 'AEC', restrict: 'A',
transclude: true, scope: 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){ link: function(scope, element, attr){
scope.uid = attr.displayname; attr.$observe('displayname', function(value){
scope.displayname = attr.displayname; if(value!==undefined) {
var value = attr.user; $(element).avatar(value, 32);
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, 32, false, false, false, attr.displayname);
},
controller: function () {}
}; };
}); });

View File

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

@@ -19,7 +19,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
import app from '../app/App.js';
/* global app */ /* global app */
/* gloabl t */ /* gloabl t */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,46 +0,0 @@
/*
* @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;
};
});

View File

@@ -1,28 +0,0 @@
'use strict';
// 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';
app.controller('ListController', ListController);
app.component('attachmentListComponent', attachmentListComponent);
// 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

@@ -1,57 +0,0 @@
/*
* 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; }

File diff suppressed because it is too large Load Diff

View File

@@ -1,114 +0,0 @@
/**
* 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|\_|\-)\]\s(.*)/i;
createTokens = function(checked, label, Token) {
var id, idNumeric, nodes, token;
nodes = [];
/**
* <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"]);
}
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;
text = original.content;
matches = text.match(pattern);
if (matches === null) {
return original;
}
checked = false;
value = matches[1];
label = matches[2];
if (value === "X" || value === "x") {
checked = true;
}
return createTokens(checked, label, Token);
};
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 = tokens.length - 1;
while (i >= 0) {
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));
};

9749
js/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +1,29 @@
{ {
"name": "deck", "name": "deck",
"description": "Frontend for the Nextcloud Deck app",
"repository": "https://github.com/nextcloud/deck",
"version": "1.0.0", "version": "1.0.0",
"main": "Gruntfile.js", "main": "Gruntfile.js",
"directories": { "directories": {
"test": "tests" "test": "tests"
}, },
"dependencies": { "dependencies": {},
"@uirouter/angularjs": "^1.0.18",
"angular": "^1.7.2",
"angular-animate": "^1.7.2",
"angular-file-upload": "^2.5.0",
"angular-markdown-it": "^0.6.1",
"angular-sanitize": "^1.7.2",
"babel-polyfill": "^6.26.0",
"markdown-it": "^8.4.1",
"markdown-it-link-target": "^1.0.2",
"ng-sortable": "^1.3.8",
"ui-select": "^0.19.8"
},
"devDependencies": { "devDependencies": {
"babel-core": "^6.26.0", "bower": "^1.8.0",
"babel-loader": "^7.1.2", "grunt": "^1.0.1",
"babel-preset-env": "^1.7.0", "grunt-contrib-concat": "^1.0.1",
"css-loader": "^0.28.9", "grunt-contrib-jshint": "^1.1.0",
"karma": "^2.0.4", "grunt-contrib-watch": "^1.0.0",
"mini-css-extract-plugin": "^0.4.1", "grunt-karma": "^2.0.0",
"node-sass": "^4.5.3", "grunt-phpunit": "^0.3.6",
"webpack": "^4.14.0", "grunt-wrap": "^0.3.0",
"webpack-cli": "^3.0.8", "jshint-stylish": "^2.2.1",
"webpack-merge": "^4.1.3" "karma": "^1.4.1",
"node-sass": "^4.5.3"
}, },
"scripts": { "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" "test": "echo \"Warning: no test specified\" && exit 0"
}, },
"author": "", "author": "",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"keywords": [] "keywords": [],
"description": ""
} }

View File

@@ -19,160 +19,153 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * 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){
app.factory('ApiService', function ($http, $q) { var ApiService = function(http, endpoint) {
var ApiService = function (http, endpoint) { this.endpoint = endpoint;
this.endpoint = endpoint; this.baseUrl = OC.generateUrl('/apps/deck/' + endpoint);
this.baseUrl = OC.generateUrl('/apps/deck/' + endpoint); this.http = http;
this.http = http; this.q = $q;
this.q = $q; this.data = {};
this.data = {}; this.id = null;
this.id = null; this.sorted = [];
this.sorted = []; };
};
ApiService.prototype.fetchAll = function () { ApiService.prototype.fetchAll = function(){
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.get(this.baseUrl).then(function (response) { $http.get(this.baseUrl).then(function (response) {
var objects = response.data; var objects = response.data;
objects.forEach(function (obj) { objects.forEach(function (obj) {
self.data[obj.id] = obj; self.data[obj.id] = obj;
}); });
deferred.resolve(self.data); deferred.resolve(self.data);
}, function (error) { }, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed'); deferred.reject('Fetching ' + self.endpoint + ' failed');
}); });
return deferred.promise; return deferred.promise;
}; };
ApiService.prototype.fetchOne = function (id) { ApiService.prototype.fetchOne = function (id) {
this.id = id; this.id = id;
var deferred = $q.defer(); var deferred = $q.defer();
if (id === undefined) { if(id===undefined) {
return deferred.promise; return deferred.promise;
} }
var self = this; var self = this;
$http.get(this.baseUrl + '/' + id).then(function (response) { $http.get(this.baseUrl + '/' + id).then(function (response) {
var data = response.data; data = response.data;
if (self.data[data.id] === undefined) { if(self.data[data.id]===undefined) {
self.data[data.id] = response.data; self.data[data.id] = response.data;
} }
$.each(response.data, function (key, value) { $.each(response.data, function(key, value) {
self.data[data.id][key] = value; self.data[data.id][key] = value;
}); });
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Fetching ' + self.endpoint + ' failed'); deferred.reject('Fetching ' + self.endpoint + ' failed');
}); });
return deferred.promise; return deferred.promise;
}; };
ApiService.prototype.create = function (entity) { ApiService.prototype.create = function (entity) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.post(this.baseUrl, entity).then(function (response) { $http.post(this.baseUrl, entity).then(function (response) {
self.add(response.data); self.add(response.data);
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Fetching' + self.endpoint + ' failed'); deferred.reject('Fetching' + self.endpoint + ' failed');
}); });
return deferred.promise; return deferred.promise;
}; };
ApiService.prototype.update = function (entity) { ApiService.prototype.update = function (entity) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.put(this.baseUrl + '/' + entity.id, entity).then(function (response) { $http.put(this.baseUrl + '/' + entity.id, entity).then(function (response) {
self.add(response.data); self.add(response.data);
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Updating ' + self.endpoint + ' failed'); deferred.reject('Updating ' + self.endpoint + ' failed');
}); });
return deferred.promise; return deferred.promise;
}; };
ApiService.prototype.delete = function (id) { ApiService.prototype.delete = function (id) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.delete(this.baseUrl + '/' + id).then(function (response) { $http.delete(this.baseUrl + '/' + id).then(function (response) {
self.remove(id); self.remove(id);
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed'); deferred.reject('Deleting ' + self.endpoint + ' failed');
}); });
return deferred.promise; 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);
});
};
// methods for managing data ApiService.prototype.getCurrent = function () {
ApiService.prototype.clear = function () { return this.data[this.id];
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.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.unsetCurrrent = function () { ApiService.prototype.unsetCurrrent = function () {
this.id = null; this.id = null;
}; };
ApiService.prototype.getData = function () {
return $.map(this.data, function (value, index) {
return [value];
});
};
ApiService.prototype.getAll = function () { ApiService.prototype.getData = function() {
return this.data; return $.map(this.data, function(value, index) {
}; return [value];
});
};
ApiService.prototype.get = function (id) { ApiService.prototype.getAll = function () {
return this.data[id]; return this.data;
}; };
ApiService.prototype.getName = function () { ApiService.prototype.getName = function() {
var funcNameRegex = /function (.{1,})\(/; var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec((this).constructor.toString()); var results = (funcNameRegex).exec((this).constructor.toString());
return (results && results.length > 1) ? results[1] : ''; return (results && results.length > 1) ? results[1] : "";
}; };
return ApiService; return ApiService;
}); });

View File

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

View File

@@ -19,159 +19,83 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * 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) { app.factory('CardService', function(ApiService, $http, $q){
var CardService = function ($http, ep, $q) { var CardService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q); ApiService.call(this, $http, ep, $q);
}; };
CardService.prototype = angular.copy(ApiService.prototype); CardService.prototype = angular.copy(ApiService.prototype);
CardService.prototype.reorder = function (card, order) { CardService.prototype.reorder = function(card, order) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.put(this.baseUrl + '/' + card.id + '/reorder', { $http.put(this.baseUrl + '/' + card.id + '/reorder', {cardId: card.id, order: order, stackId: card.stackId}).then(function (response) {
cardId: card.id, deferred.resolve(response.data);
order: order, }, function (error) {
stackId: card.stackId deferred.reject('Error while update ' + self.endpoint);
}).then(function (response) { });
deferred.resolve(response.data); return deferred.promise;
}, function (error) { };
deferred.reject('Error while update ' + self.endpoint);
});
return deferred.promise;
};
CardService.prototype.rename = function (card) { CardService.prototype.rename = function(card) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.put(this.baseUrl + '/' + card.id + '/rename', { $http.put(this.baseUrl + '/' + card.id + '/rename', {cardId: card.id, title: card.title}).then(function (response) {
cardId: card.id, self.data[card.id].title = card.title;
title: card.title deferred.resolve(response.data);
}).then(function (response) { }, function (error) {
self.data[card.id].title = card.title; deferred.reject('Error while renaming ' + self.endpoint);
deferred.resolve(response.data); });
}, function (error) { return deferred.promise;
deferred.reject('Error while renaming ' + self.endpoint); };
});
return deferred.promise;
};
CardService.prototype.assignLabel = function (card, label) { CardService.prototype.assignLabel = function(card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label; var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.post(url).then(function (response) { $http.post(url).then(function (response) {
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Error while update ' + self.endpoint); deferred.reject('Error while update ' + self.endpoint);
}); });
return deferred.promise; return deferred.promise;
}; };
CardService.prototype.removeLabel = function (card, label) { CardService.prototype.removeLabel = function(card, label) {
var url = this.baseUrl + '/' + card + '/label/' + label; var url = this.baseUrl + '/' + card + '/label/' + label;
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.delete(url).then(function (response) { $http.delete(url).then(function (response) {
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Error while update ' + self.endpoint); deferred.reject('Error while update ' + self.endpoint);
}); });
return deferred.promise; return deferred.promise;
}; };
CardService.prototype.archive = function (card) { CardService.prototype.archive = function (card) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.put(this.baseUrl + '/' + card.id + '/archive', {}).then(function (response) { $http.put(this.baseUrl + '/' + card.id + '/archive', {}).then(function (response) {
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Error while update ' + self.endpoint); deferred.reject('Error while update ' + self.endpoint);
}); });
return deferred.promise; return deferred.promise;
}; };
CardService.prototype.unarchive = function (card) { CardService.prototype.unarchive = function (card) {
var deferred = $q.defer(); var deferred = $q.defer();
var self = this; var self = this;
$http.put(this.baseUrl + '/' + card.id + '/unarchive', {}).then(function (response) { $http.put(this.baseUrl + '/' + card.id + '/unarchive', {}).then(function (response) {
deferred.resolve(response.data); deferred.resolve(response.data);
}, function (error) { }, function (error) {
deferred.reject('Error while update ' + self.endpoint); deferred.reject('Error while update ' + self.endpoint);
}); });
return deferred.promise; return deferred.promise;
};
CardService.prototype.assignUser = function (card, user) { };
var deferred = $q.defer();
var self = this;
if (self.getCurrent().assignedUsers === null) {
self.getCurrent().assignedUsers = [];
}
$http.post(this.baseUrl + '/' + card.id + '/assign', {'userId': user}).then(function (response) {
self.getCurrent().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.getCurrent().assignedUsers = self.getCurrent().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;
}); });

View File

@@ -1,137 +0,0 @@
/*
* @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/>. * 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) { app.factory('LabelService', function(ApiService, $http, $q){
var LabelService = function ($http, ep, $q) { var LabelService = function($http, ep, $q) {
ApiService.call(this, $http, ep, $q); ApiService.call(this, $http, ep, $q);
}; };
LabelService.prototype = angular.copy(ApiService.prototype); LabelService.prototype = angular.copy(ApiService.prototype);
return new LabelService($http, 'labels', $q); service = new LabelService($http, 'labels', $q);
return service;
}); });

View File

@@ -19,63 +19,49 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
import app from '../app/App.js';
/* global app angular */ app.factory('StackService', function(ApiService, $http, $q){
app.factory('StackService', function (ApiService, CardService, $http, $q) { var StackService = function($http, ep, $q) {
var StackService = function ($http, ep, $q) { ApiService.call(this, $http, ep, $q);
ApiService.call(this, $http, ep, $q); };
}; StackService.prototype = angular.copy(ApiService.prototype);
StackService.prototype = angular.copy(ApiService.prototype); StackService.prototype.fetchAll = function(boardId) {
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;
};
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.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 deferred = $q.defer();
var self = this; var self = this;
$http.get(this.baseUrl + '/' + boardId).then(function (response) { $http.put(this.baseUrl + '/' + stack.id + '/reorder', {stackId: stack.id, order: order}).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) { angular.forEach(response.data, function (value, key) {
var id = value.id; var id = value.id;
self.data[id].order = value.order; self.data[id].order = value.order;
@@ -87,69 +73,49 @@ app.factory('StackService', function (ApiService, CardService, $http, $q) {
return deferred.promise; return deferred.promise;
}; };
StackService.prototype.reorderCard = function (entity, order) { StackService.prototype.reorderCard = function(entity, order) {
// assign new order // assign new order
for (var i = 0, j = 0; i < this.data[entity.stackId].cards.length; i++) { for(var i=0, j=0;i<this.data[entity.stackId].cards.length;i++) {
if (this.data[entity.stackId].cards[i].id === entity.id) { if(this.data[entity.stackId].cards[i].id === entity.id) {
this.data[entity.stackId].cards[i].order = order; this.data[entity.stackId].cards[i].order = order;
} }
if (j === order) { if(j === order) {
j++; j++;
} }
if (this.data[entity.stackId].cards[i].id !== entity.id) { if(this.data[entity.stackId].cards[i].id !== entity.id) {
this.data[entity.stackId].cards[i].order = j++; this.data[entity.stackId].cards[i].order = j++;
} }
} }
// sort array by order // sort array by order
this.data[entity.stackId].cards.sort(function (a, b) { this.data[entity.stackId].cards.sort(function(a,b) {
if (a.order < b.order) if (a.order < b.order)
{return -1;} return -1;
if (a.order > b.order) if (a.order > b.order)
{return 1;} return 1;
return 0; return 0;
}); });
}; };
StackService.prototype.updateCard = function (entity) { StackService.prototype.updateCard = function(entity) {
var self = this; var self = this;
var cards = this.data[entity.stackId].cards; var cards = this.data[entity.stackId].cards;
for (var i = 0; i < cards.length; i++) { for(var i=0;i<cards.length;i++) {
if (cards[i].id === entity.id) { if(cards[i].id == entity.id) {
cards[i] = entity; cards[i] = entity;
} }
} }
}; };
StackService.prototype.removeCard = function (entity) { StackService.prototype.removeCard = function(entity) {
var self = this; var self = this;
var cards = this.data[entity.stackId].cards; var cards = this.data[entity.stackId].cards;
for (var i = 0; i < cards.length; i++) { for(var i=0;i<cards.length;i++) {
if (cards[i].id === entity.id) { if(cards[i].id == entity.id) {
cards.splice(i, 1); cards.splice(i, 1);
} }
} }
}; };
// FIXME: Should not show popup but proper undo mechanism service = new StackService($http, 'stacks', $q);
StackService.prototype.delete = function (id) { return service;
var deferred = $q.defer();
var self = this;
OC.dialogs.confirm(t('deck', 'Are you sure you want to delete the stack with all of its data?'), t('deck', 'Delete'), function(state) {
if (!state) {
return;
}
$http.delete(self.baseUrl + '/' + id).then(function (response) {
self.remove(id);
deferred.resolve(response.data);
}, function (error) {
deferred.reject('Deleting ' + self.endpoint + ' failed');
});
});
return deferred.promise;
};
var service = new StackService($http, 'stacks', $q);
return service;
}); });

View File

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

View File

@@ -1,68 +0,0 @@
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: ['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'
})
]
};

View File

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

View File

@@ -1,15 +0,0 @@
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
})
]
}});

View File

@@ -1,37 +0,0 @@
[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",
"tests",
".codecov.yml",
"composer.json",
"composer.lock",
"_config.yml",
".drone.yml",
".travis.yml",
".eslintignore",
".eslintrc.yml",
".gitignore",
"issue_template.md",
"krankerl.toml",
"Makefile",
"run-eslint.sh"
]
before_cmds = [
'make clean-build',
'make build'
]

View File

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 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] [nextcloud.deck]
file_filter = translationfiles/<lang>/deck.po file_filter = <lang>/deck.po
source_file = translationfiles/templates/deck.pot source_file = templates/deck.pot
source_lang = en source_lang = en
type = PO type = PO

View File

@@ -1,20 +1,17 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Delete" : "Desaniciar",
"Hours" : "Hores", "Hours" : "Hores",
"Minutes" : "Minutos", "Minutes" : "Minutos",
"Finished" : "Finó", "Finished" : "Finó",
"Action needed" : "Precísase aición", "Action needed" : "Precísase aición",
"Later" : "Más sero", "Later" : "Más sero",
"Deck" : "Deck", "Deck" : "Deck",
"Submit" : "Unviar",
"Show archived cards" : "Amosar tarxetes archivaes", "Show archived cards" : "Amosar tarxetes archivaes",
"Close" : "Zarrar", "Delete" : "Desaniciar",
"Tags" : "Etiquetes", "Tags" : "Etiquetes",
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir", "Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.", "No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
"Loading" : "Cargando",
"Share" : "Compartir", "Share" : "Compartir",
"Edit" : "Editar", "Edit" : "Editar",
"Manage" : "Xestionar", "Manage" : "Xestionar",

View File

@@ -1,18 +1,15 @@
{ "translations": { { "translations": {
"Delete" : "Desaniciar",
"Hours" : "Hores", "Hours" : "Hores",
"Minutes" : "Minutos", "Minutes" : "Minutos",
"Finished" : "Finó", "Finished" : "Finó",
"Action needed" : "Precísase aición", "Action needed" : "Precísase aición",
"Later" : "Más sero", "Later" : "Más sero",
"Deck" : "Deck", "Deck" : "Deck",
"Submit" : "Unviar",
"Show archived cards" : "Amosar tarxetes archivaes", "Show archived cards" : "Amosar tarxetes archivaes",
"Close" : "Zarrar", "Delete" : "Desaniciar",
"Tags" : "Etiquetes", "Tags" : "Etiquetes",
"Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir", "Select users or groups to share with" : "Esbilla usuarios o grupos colos que compartir",
"No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.", "No matching user or group found." : "Nun s'alcontró dengún usuariu o grupu que concasara.",
"Loading" : "Cargando",
"Share" : "Compartir", "Share" : "Compartir",
"Edit" : "Editar", "Edit" : "Editar",
"Manage" : "Xestionar", "Manage" : "Xestionar",

25
l10n/bg.js Normal file
View File

@@ -0,0 +1,25 @@
OC.L10N.register(
"deck",
{
"Finished" : "Завършен",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"Archive" : "Архивиране",
"Unarchive" : "Разархивиране",
"Delete" : "Изтриване",
"Sharing" : "Споделяне",
"Select users or groups to share with" : "Избор на потребители и групи за споделяне",
"No matching user or group found." : "Не са намерени съвпадащи потребители или групи",
"Share" : "Сподели",
"Edit" : "Редакция",
"Manage" : "Управление",
"Discard share" : "Отхвърляне на споделяне",
"Members" : "Членове",
"Modified:" : "Променен на:",
"Created:" : "Създаден на:",
"by" : "от",
"Saved" : "Запазено",
"Shared with you" : "Споделено с Вас"
},
"nplurals=2; plural=(n != 1);");

23
l10n/bg.json Normal file
View File

@@ -0,0 +1,23 @@
{ "translations": {
"Finished" : "Завършен",
"To review" : "За преглед",
"Action needed" : "Необходимо е действие",
"Later" : "По-късно",
"Archive" : "Архивиране",
"Unarchive" : "Разархивиране",
"Delete" : "Изтриване",
"Sharing" : "Споделяне",
"Select users or groups to share with" : "Избор на потребители и групи за споделяне",
"No matching user or group found." : "Не са намерени съвпадащи потребители или групи",
"Share" : "Сподели",
"Edit" : "Редакция",
"Manage" : "Управление",
"Discard share" : "Отхвърляне на споделяне",
"Members" : "Членове",
"Modified:" : "Променен на:",
"Created:" : "Създаден на:",
"by" : "от",
"Saved" : "Запазено",
"Shared with you" : "Споделено с Вас"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,54 +1,20 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Delete" : "Esborra",
"Remove user from card" : "Esborra usuari de la targeta",
"Hours" : "Hores",
"Minutes" : "Minuts",
"Finished" : "Acabat", "Finished" : "Acabat",
"To review" : "Per revisar", "To review" : "Per revisar",
"Action needed" : "Acció necessaria", "Action needed" : "Acció necessaria",
"Later" : "Més tard", "Later" : "Més tard",
"Deck" : "Coberta",
"Add a new stack" : "Afegeix una nova pila",
"Show archived cards" : "Mostra les targetes arxivades",
"Hide archived cards" : "Amaga les targetes arxivades",
"Board details" : "Detalls de la junta",
"All Boards" : "Totes les juntes",
"Archived boards" : "Taulers arxivats",
"Archive" : "Arxiu", "Archive" : "Arxiu",
"Unarchive" : "Desbloquejar", "Delete" : "Esborra",
"Enter a card title" : "Introduïu un títol de la targeta",
"Sharing" : "Compartir", "Sharing" : "Compartir",
"Tags" : "Etiquetes",
"Select users or groups to share with" : "Seleccioneu usuaris o grups per compartir",
"No matching user or group found." : "No s'ha trobat cap usuari o grup coincident.",
"Share" : "Comparteix", "Share" : "Comparteix",
"Edit" : "Edita", "Edit" : "Edita",
"Manage" : "Gestor",
"Discard share" : "Descarta la compartició",
"Create a new tag" : "Crea una nova etiqueta",
"Title" : "Title",
"Members" : "Membres", "Members" : "Membres",
"More actions" : "Més accions",
"Edit board" : "Edita el tauler",
"Archive board" : "Arxiu",
"Unarchive board" : "Desbloquejar",
"Delete board" : "Eliminat",
"Create new board" : "Crear nova",
"New board title" : "Nou títol",
"by" : "per",
"Modified:" : "Modificat:", "Modified:" : "Modificat:",
"Created:" : "Creat:", "Created:" : "Creat:",
"Due date" : "Per la data", "by" : "per",
"Click to set" : "Feu clic per configurar",
"Remove due date" : "Elimina la data de venciment",
"Description" : "Descripció",
"Saved" : "Desat", "Saved" : "Desat",
"Formatting help" : "Format d'ajuda", "Shared with you" : "Us han compartit"
"Add a card description…" : "Afegeix una descripció de la targeta ...",
"Shared boards" : "Taulers compartits",
"Move board to archive" : "Mou la placa a l'arxiu",
"Create a new board" : "Crear nova"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");

View File

@@ -1,52 +1,18 @@
{ "translations": { { "translations": {
"Delete" : "Esborra",
"Remove user from card" : "Esborra usuari de la targeta",
"Hours" : "Hores",
"Minutes" : "Minuts",
"Finished" : "Acabat", "Finished" : "Acabat",
"To review" : "Per revisar", "To review" : "Per revisar",
"Action needed" : "Acció necessaria", "Action needed" : "Acció necessaria",
"Later" : "Més tard", "Later" : "Més tard",
"Deck" : "Coberta",
"Add a new stack" : "Afegeix una nova pila",
"Show archived cards" : "Mostra les targetes arxivades",
"Hide archived cards" : "Amaga les targetes arxivades",
"Board details" : "Detalls de la junta",
"All Boards" : "Totes les juntes",
"Archived boards" : "Taulers arxivats",
"Archive" : "Arxiu", "Archive" : "Arxiu",
"Unarchive" : "Desbloquejar", "Delete" : "Esborra",
"Enter a card title" : "Introduïu un títol de la targeta",
"Sharing" : "Compartir", "Sharing" : "Compartir",
"Tags" : "Etiquetes",
"Select users or groups to share with" : "Seleccioneu usuaris o grups per compartir",
"No matching user or group found." : "No s'ha trobat cap usuari o grup coincident.",
"Share" : "Comparteix", "Share" : "Comparteix",
"Edit" : "Edita", "Edit" : "Edita",
"Manage" : "Gestor",
"Discard share" : "Descarta la compartició",
"Create a new tag" : "Crea una nova etiqueta",
"Title" : "Title",
"Members" : "Membres", "Members" : "Membres",
"More actions" : "Més accions",
"Edit board" : "Edita el tauler",
"Archive board" : "Arxiu",
"Unarchive board" : "Desbloquejar",
"Delete board" : "Eliminat",
"Create new board" : "Crear nova",
"New board title" : "Nou títol",
"by" : "per",
"Modified:" : "Modificat:", "Modified:" : "Modificat:",
"Created:" : "Creat:", "Created:" : "Creat:",
"Due date" : "Per la data", "by" : "per",
"Click to set" : "Feu clic per configurar",
"Remove due date" : "Elimina la data de venciment",
"Description" : "Descripció",
"Saved" : "Desat", "Saved" : "Desat",
"Formatting help" : "Format d'ajuda", "Shared with you" : "Us han compartit"
"Add a card description…" : "Afegeix una descripció de la targeta ...",
"Shared boards" : "Taulers compartits",
"Move board to archive" : "Mou la placa a l'arxiu",
"Create a new board" : "Crear nova"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }

View File

@@ -1,51 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Opravdu chcete smazat tuto kartu a všechna její data?",
"Delete" : "Smazat",
"Remove user from card" : "Odebrat uživatele z karty",
"Hours" : "Hodiny", "Hours" : "Hodiny",
"Minutes" : "Minuty", "Minutes" : "Minuty",
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
"Finished" : "Dokončeno", "Finished" : "Dokončeno",
"To review" : "K revizi", "To review" : "K revizi",
"Action needed" : "Nutná akce", "Action needed" : "Nutná akce",
"Later" : "Později", "Later" : "Později",
"The file was uploaded" : "Soubor byl nahrán",
"No file was uploaded" : "Nebyl nahrán žádný soubor",
"Missing a temporary folder" : "Chybí adresář pro dočasné soubory",
"Could not write file to disk" : "Nedaří se zapsat soubor do úložiště",
"A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.",
"Deck" : "Balík", "Deck" : "Balík",
"Add a new stack" : "Přidat nový zásobník", "Add a new stack" : "Přidat nový zásobník",
"Submit" : "Odeslat",
"Show archived cards" : "Zobrazit archivované karty", "Show archived cards" : "Zobrazit archivované karty",
"Hide archived cards" : "Skrýt archivované karty", "Hide archived cards" : "Skrýt archivované karty",
"Board details" : "Detaily desky", "Board details" : "Detaily desky",
"All Boards" : "Všechny desky", "All Boards" : "Všechny desky",
"Archived boards" : "Archivované desky",
"Archive" : "Archiv", "Archive" : "Archiv",
"Unarchive" : "Zrušit archivování", "Unarchive" : "Zrušit archivování",
"Delete" : "Smazat",
"Enter a card title" : "Zadejte nadpis karty", "Enter a card title" : "Zadejte nadpis karty",
"Add card" : "Přidat kartu",
"Close" : "Zavřít",
"Sharing" : "Sdílení", "Sharing" : "Sdílení",
"Tags" : "Značky", "Tags" : "Značky",
"Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení", "Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení",
"Access for" : "Přístup pro",
"No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina", "No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina",
"Loading" : "Načítání",
"Share" : "Sdílet", "Share" : "Sdílet",
"Edit" : "Upravit", "Edit" : "Upravit",
"Manage" : "Spravovat", "Manage" : "Spravovat",
"Discard share" : "Zrušit sdílení", "Discard share" : "Zrušit sdílení",
"Update" : "Aktualizovat", "Create a new tag" : "Vytvořit novou značku",
"Create" : "Vytvořit",
"Create a new tag" : "Vytvořit nový štítek",
"Status" : "Stav",
"Title" : "Název", "Title" : "Název",
"Members" : "Členové", "Members" : "Členové",
"More actions" : "Více akcí", "More actions" : "Více akcí",
@@ -53,33 +33,25 @@ OC.L10N.register(
"Archive board" : "Archivovaná deska", "Archive board" : "Archivovaná deska",
"Unarchive board" : "Odarchivovat desku", "Unarchive board" : "Odarchivovat desku",
"Delete board" : "Smazat desku", "Delete board" : "Smazat desku",
"Reset" : "Obnovit",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
"Create new board" : "VYtvořit ovou desku", "Create new board" : "VYtvořit ovou desku",
"New board title" : "Nadpis nové desky", "New board title" : "Nadpis nové desky",
"by" : "od",
"Modified:" : "Upraveno:", "Modified:" : "Upraveno:",
"Created:" : "Vytvořeno:", "Created:" : "Vytvořeno:",
"Choose a tag" : "Vyberte štítek", "by" : "od",
"Add a tag" : "Přidat štítek", "Choose a label" : "Vybrat popisek",
"Select tags" : "Výběr štítků", "Add a label" : "Přidat popisek",
"Assign users" : "Přiřadit uživatele", "Select labels…" : "Vybrat popisky...",
"Choose a user to assign" : "Zvolte uživatele kterého přiřadit",
"Assign this card to a user" : "Přiřadit kartu uživateli",
"Due date" : "Termín", "Due date" : "Termín",
"Click to set" : "Klikněte pro výběr", "Click to set" : "Klikněte pro výběr",
"Remove due date" : "Odstranit termín", "Remove due date" : "Odstranit termín",
"Description" : "Popis", "Description" : "Popis",
"Attachments" : "Přílohy",
"Saved" : "Uloženo",
"Unsaved changes" : "Neuložené změny",
"Formatting help" : "Nápověda k formátování", "Formatting help" : "Nápověda k formátování",
"Upload attachment" : "Nahrát přílohu", "Saved" : "Uloženo",
"Insert attachment" : "Vložit přílohu",
"Add a card description…" : "Přidat popis karty...", "Add a card description…" : "Přidat popis karty...",
"Archived boards" : "Archivované desky",
"Shared boards" : "Sdílené desky", "Shared boards" : "Sdílené desky",
"View more" : "Ukázat více", "Shared with you" : "Sdíleno s vámi",
"Move board to archive" : "Přesunout desku do archivu", "Move board to archive" : "Přesunout desku do archivu",
"Create a new board" : "Vytvořit novou desku" "Create a new board" : "Vytvořit novou desku"
}, },
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");

View File

@@ -1,49 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Opravdu chcete smazat tuto kartu a všechna její data?",
"Delete" : "Smazat",
"Remove user from card" : "Odebrat uživatele z karty",
"Hours" : "Hodiny", "Hours" : "Hodiny",
"Minutes" : "Minuty", "Minutes" : "Minuty",
"Are you sure you want to delete the stack with all of its data?" : "Opravdu chcete smazat stack a všechna data v něm?",
"The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.",
"The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.",
"{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.",
"Finished" : "Dokončeno", "Finished" : "Dokončeno",
"To review" : "K revizi", "To review" : "K revizi",
"Action needed" : "Nutná akce", "Action needed" : "Nutná akce",
"Later" : "Později", "Later" : "Později",
"The file was uploaded" : "Soubor byl nahrán",
"No file was uploaded" : "Nebyl nahrán žádný soubor",
"Missing a temporary folder" : "Chybí adresář pro dočasné soubory",
"Could not write file to disk" : "Nedaří se zapsat soubor do úložiště",
"A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.",
"Deck" : "Balík", "Deck" : "Balík",
"Add a new stack" : "Přidat nový zásobník", "Add a new stack" : "Přidat nový zásobník",
"Submit" : "Odeslat",
"Show archived cards" : "Zobrazit archivované karty", "Show archived cards" : "Zobrazit archivované karty",
"Hide archived cards" : "Skrýt archivované karty", "Hide archived cards" : "Skrýt archivované karty",
"Board details" : "Detaily desky", "Board details" : "Detaily desky",
"All Boards" : "Všechny desky", "All Boards" : "Všechny desky",
"Archived boards" : "Archivované desky",
"Archive" : "Archiv", "Archive" : "Archiv",
"Unarchive" : "Zrušit archivování", "Unarchive" : "Zrušit archivování",
"Delete" : "Smazat",
"Enter a card title" : "Zadejte nadpis karty", "Enter a card title" : "Zadejte nadpis karty",
"Add card" : "Přidat kartu",
"Close" : "Zavřít",
"Sharing" : "Sdílení", "Sharing" : "Sdílení",
"Tags" : "Značky", "Tags" : "Značky",
"Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení", "Select users or groups to share with" : "Vyberte uživatele nebo skupiny pro sdílení",
"Access for" : "Přístup pro",
"No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina", "No matching user or group found." : "Nevyhovuje žádný uživatel ani skupina",
"Loading" : "Načítání",
"Share" : "Sdílet", "Share" : "Sdílet",
"Edit" : "Upravit", "Edit" : "Upravit",
"Manage" : "Spravovat", "Manage" : "Spravovat",
"Discard share" : "Zrušit sdílení", "Discard share" : "Zrušit sdílení",
"Update" : "Aktualizovat", "Create a new tag" : "Vytvořit novou značku",
"Create" : "Vytvořit",
"Create a new tag" : "Vytvořit nový štítek",
"Status" : "Stav",
"Title" : "Název", "Title" : "Název",
"Members" : "Členové", "Members" : "Členové",
"More actions" : "Více akcí", "More actions" : "Více akcí",
@@ -51,33 +31,25 @@
"Archive board" : "Archivovaná deska", "Archive board" : "Archivovaná deska",
"Unarchive board" : "Odarchivovat desku", "Unarchive board" : "Odarchivovat desku",
"Delete board" : "Smazat desku", "Delete board" : "Smazat desku",
"Reset" : "Obnovit",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.",
"Create new board" : "VYtvořit ovou desku", "Create new board" : "VYtvořit ovou desku",
"New board title" : "Nadpis nové desky", "New board title" : "Nadpis nové desky",
"by" : "od",
"Modified:" : "Upraveno:", "Modified:" : "Upraveno:",
"Created:" : "Vytvořeno:", "Created:" : "Vytvořeno:",
"Choose a tag" : "Vyberte štítek", "by" : "od",
"Add a tag" : "Přidat štítek", "Choose a label" : "Vybrat popisek",
"Select tags" : "Výběr štítků", "Add a label" : "Přidat popisek",
"Assign users" : "Přiřadit uživatele", "Select labels…" : "Vybrat popisky...",
"Choose a user to assign" : "Zvolte uživatele kterého přiřadit",
"Assign this card to a user" : "Přiřadit kartu uživateli",
"Due date" : "Termín", "Due date" : "Termín",
"Click to set" : "Klikněte pro výběr", "Click to set" : "Klikněte pro výběr",
"Remove due date" : "Odstranit termín", "Remove due date" : "Odstranit termín",
"Description" : "Popis", "Description" : "Popis",
"Attachments" : "Přílohy",
"Saved" : "Uloženo",
"Unsaved changes" : "Neuložené změny",
"Formatting help" : "Nápověda k formátování", "Formatting help" : "Nápověda k formátování",
"Upload attachment" : "Nahrát přílohu", "Saved" : "Uloženo",
"Insert attachment" : "Vložit přílohu",
"Add a card description…" : "Přidat popis karty...", "Add a card description…" : "Přidat popis karty...",
"Archived boards" : "Archivované desky",
"Shared boards" : "Sdílené desky", "Shared boards" : "Sdílené desky",
"View more" : "Ukázat více", "Shared with you" : "Sdíleno s vámi",
"Move board to archive" : "Přesunout desku do archivu", "Move board to archive" : "Přesunout desku do archivu",
"Create a new board" : "Vytvořit novou desku" "Create a new board" : "Vytvořit novou desku"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} }

View File

@@ -1,48 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Er du sikker på, at du vil slette dette kort med alle dets data?",
"Delete" : "Slet",
"Remove user from card" : "Fjern bruger fra kort",
"Hours" : "Timer", "Hours" : "Timer",
"Minutes" : "Minutter", "Minutes" : "Minutter",
"Are you sure you want to delete the stack with all of its data?" : "Er du sikker på, at du ønsker at slette denne stak med alle data?",
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin udløbsdato.",
"The board \"%s\" has been shared with you by %s." : "Brættet \"%s\" er blevet delt med dig af %s.",
"{user} has shared the board %s with you." : "{user} har delt brættet %s med dig.",
"Finished" : "Færdiggjort", "Finished" : "Færdiggjort",
"To review" : "Gennemse", "To review" : "Efterse",
"Action needed" : "Handling påkrævet", "Action needed" : "Handling påkrævet",
"Later" : "Senere", "Later" : "Senere",
"Deck" : "Deck", "Deck" : "Tavle",
"A kanban style project and personal management tool for Nextcloud" : "Et Kanban-inspireret projekt- og styringsværktøj til Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck er et Kanban-inspireret organisationsværktøj beregnet til personlig planlægning og projektstyring for teams - integreret med Nextcloud.\n\n\n- 📥 Tilføj dine opgaver til kort og organiser dem\n- 📄 Skriv yderligere noter i Markdown\n- 🔖 Marker opgaver med tags for bedre organisering\n- 👥 Del med team, venner eller familie\n- 🚀 Organiser dit projekt",
"Add a new stack" : "Tilføj en ny stak", "Add a new stack" : "Tilføj en ny stak",
"Submit" : "Tilføj",
"Show archived cards" : "Vis arkiverede kort", "Show archived cards" : "Vis arkiverede kort",
"Hide archived cards" : "Skjul arkiverede kort", "Hide archived cards" : "Skjul arkiverede kort",
"Board details" : "Liste detaljer", "Board details" : "Liste detaljer",
"All Boards" : "Alle lister", "All Boards" : "Alle lister",
"Archived boards" : "Arkiverede lister",
"Archive" : "Arkivér", "Archive" : "Arkivér",
"Unarchive" : "Annuller arkivering", "Unarchive" : "Annuller arkivering",
"Delete" : "Slet",
"Enter a card title" : "Angiv titel på kort", "Enter a card title" : "Angiv titel på kort",
"Add card" : "Tilføj kort",
"Close" : "Luk",
"Sharing" : "Deling", "Sharing" : "Deling",
"Tags" : "Mærkat", "Tags" : "Mærkat",
"Select users or groups to share with" : "Vælg brugere eller grupper og dele med", "Select users or groups to share with" : "Vælg brugere eller grupper og dele med",
"Access for" : "Adgang for",
"No matching user or group found." : "Ingen bruger eller gruppe fundet", "No matching user or group found." : "Ingen bruger eller gruppe fundet",
"Loading" : "Loader",
"Share" : "Del", "Share" : "Del",
"Edit" : "Redigér", "Edit" : "Redigér",
"Manage" : "Administrer ", "Manage" : "Administrer ",
"Discard share" : "Kasser deling", "Discard share" : "Kasser deling",
"Update" : "Opdatér",
"Create" : "Opret",
"Create a new tag" : "Opret et nyt mærkat", "Create a new tag" : "Opret et nyt mærkat",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Medlemmer", "Members" : "Medlemmer",
"More actions" : "Flere handlinger", "More actions" : "Flere handlinger",
@@ -50,29 +33,24 @@ OC.L10N.register(
"Archive board" : "Arkivér liste", "Archive board" : "Arkivér liste",
"Unarchive board" : "Annuller arkivering af liste", "Unarchive board" : "Annuller arkivering af liste",
"Delete board" : "Slet liste", "Delete board" : "Slet liste",
"Reset" : "Nulstil",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Fortryd sletning af board - Ellers vil boardet blive slettet ved næste cronjob kørsel.",
"Create new board" : "Opret ny liste", "Create new board" : "Opret ny liste",
"New board title" : "Ny titel på liste", "New board title" : "Ny titel på liste",
"by" : "af",
"Modified:" : "Ændret:", "Modified:" : "Ændret:",
"Created:" : "Oprettet:", "Created:" : "Oprettet:",
"Choose a tag" : "Vælg et tag", "by" : "af",
"Add a tag" : "Tilføj et tag", "Choose a label" : "Opret et label",
"Select tags" : "Vælg tags", "Add a label" : "Tilføj et label",
"Assign users" : "Tildel brugere", "Select labels…" : "Vælg labeler...",
"Choose a user to assign" : "Vælg en bruger at tildele til",
"Assign this card to a user" : "Tildel dette kort til en bruger",
"Due date" : "Forfaldsdato", "Due date" : "Forfaldsdato",
"Click to set" : "Klik for at sætte", "Click to set" : "Klik for at sætte",
"Remove due date" : "Fjern forfaldsdato", "Remove due date" : "Fjern forfaldsdato",
"Description" : "Beskrivelse", "Description" : "Beskrivelse",
"Saved" : "Gemt",
"Unsaved changes" : "Ikke gemte ændringer",
"Formatting help" : "Hjælp til formatering", "Formatting help" : "Hjælp til formatering",
"Saved" : "Gemt",
"Add a card description…" : "Tilføj en beskrivelse...", "Add a card description…" : "Tilføj en beskrivelse...",
"Archived boards" : "Arkiverede lister",
"Shared boards" : "Delte lister", "Shared boards" : "Delte lister",
"View more" : "Vis mere", "Shared with you" : "Delt med dig",
"Move board to archive" : "Flyt liste til arkiv", "Move board to archive" : "Flyt liste til arkiv",
"Create a new board" : "Opret ny liste" "Create a new board" : "Opret ny liste"
}, },

View File

@@ -1,46 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Er du sikker på, at du vil slette dette kort med alle dets data?",
"Delete" : "Slet",
"Remove user from card" : "Fjern bruger fra kort",
"Hours" : "Timer", "Hours" : "Timer",
"Minutes" : "Minutter", "Minutes" : "Minutter",
"Are you sure you want to delete the stack with all of its data?" : "Er du sikker på, at du ønsker at slette denne stak med alle data?",
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin udløbsdato.",
"The board \"%s\" has been shared with you by %s." : "Brættet \"%s\" er blevet delt med dig af %s.",
"{user} has shared the board %s with you." : "{user} har delt brættet %s med dig.",
"Finished" : "Færdiggjort", "Finished" : "Færdiggjort",
"To review" : "Gennemse", "To review" : "Efterse",
"Action needed" : "Handling påkrævet", "Action needed" : "Handling påkrævet",
"Later" : "Senere", "Later" : "Senere",
"Deck" : "Deck", "Deck" : "Tavle",
"A kanban style project and personal management tool for Nextcloud" : "Et Kanban-inspireret projekt- og styringsværktøj til Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck er et Kanban-inspireret organisationsværktøj beregnet til personlig planlægning og projektstyring for teams - integreret med Nextcloud.\n\n\n- 📥 Tilføj dine opgaver til kort og organiser dem\n- 📄 Skriv yderligere noter i Markdown\n- 🔖 Marker opgaver med tags for bedre organisering\n- 👥 Del med team, venner eller familie\n- 🚀 Organiser dit projekt",
"Add a new stack" : "Tilføj en ny stak", "Add a new stack" : "Tilføj en ny stak",
"Submit" : "Tilføj",
"Show archived cards" : "Vis arkiverede kort", "Show archived cards" : "Vis arkiverede kort",
"Hide archived cards" : "Skjul arkiverede kort", "Hide archived cards" : "Skjul arkiverede kort",
"Board details" : "Liste detaljer", "Board details" : "Liste detaljer",
"All Boards" : "Alle lister", "All Boards" : "Alle lister",
"Archived boards" : "Arkiverede lister",
"Archive" : "Arkivér", "Archive" : "Arkivér",
"Unarchive" : "Annuller arkivering", "Unarchive" : "Annuller arkivering",
"Delete" : "Slet",
"Enter a card title" : "Angiv titel på kort", "Enter a card title" : "Angiv titel på kort",
"Add card" : "Tilføj kort",
"Close" : "Luk",
"Sharing" : "Deling", "Sharing" : "Deling",
"Tags" : "Mærkat", "Tags" : "Mærkat",
"Select users or groups to share with" : "Vælg brugere eller grupper og dele med", "Select users or groups to share with" : "Vælg brugere eller grupper og dele med",
"Access for" : "Adgang for",
"No matching user or group found." : "Ingen bruger eller gruppe fundet", "No matching user or group found." : "Ingen bruger eller gruppe fundet",
"Loading" : "Loader",
"Share" : "Del", "Share" : "Del",
"Edit" : "Redigér", "Edit" : "Redigér",
"Manage" : "Administrer ", "Manage" : "Administrer ",
"Discard share" : "Kasser deling", "Discard share" : "Kasser deling",
"Update" : "Opdatér",
"Create" : "Opret",
"Create a new tag" : "Opret et nyt mærkat", "Create a new tag" : "Opret et nyt mærkat",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Medlemmer", "Members" : "Medlemmer",
"More actions" : "Flere handlinger", "More actions" : "Flere handlinger",
@@ -48,29 +31,24 @@
"Archive board" : "Arkivér liste", "Archive board" : "Arkivér liste",
"Unarchive board" : "Annuller arkivering af liste", "Unarchive board" : "Annuller arkivering af liste",
"Delete board" : "Slet liste", "Delete board" : "Slet liste",
"Reset" : "Nulstil",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Fortryd sletning af board - Ellers vil boardet blive slettet ved næste cronjob kørsel.",
"Create new board" : "Opret ny liste", "Create new board" : "Opret ny liste",
"New board title" : "Ny titel på liste", "New board title" : "Ny titel på liste",
"by" : "af",
"Modified:" : "Ændret:", "Modified:" : "Ændret:",
"Created:" : "Oprettet:", "Created:" : "Oprettet:",
"Choose a tag" : "Vælg et tag", "by" : "af",
"Add a tag" : "Tilføj et tag", "Choose a label" : "Opret et label",
"Select tags" : "Vælg tags", "Add a label" : "Tilføj et label",
"Assign users" : "Tildel brugere", "Select labels…" : "Vælg labeler...",
"Choose a user to assign" : "Vælg en bruger at tildele til",
"Assign this card to a user" : "Tildel dette kort til en bruger",
"Due date" : "Forfaldsdato", "Due date" : "Forfaldsdato",
"Click to set" : "Klik for at sætte", "Click to set" : "Klik for at sætte",
"Remove due date" : "Fjern forfaldsdato", "Remove due date" : "Fjern forfaldsdato",
"Description" : "Beskrivelse", "Description" : "Beskrivelse",
"Saved" : "Gemt",
"Unsaved changes" : "Ikke gemte ændringer",
"Formatting help" : "Hjælp til formatering", "Formatting help" : "Hjælp til formatering",
"Saved" : "Gemt",
"Add a card description…" : "Tilføj en beskrivelse...", "Add a card description…" : "Tilføj en beskrivelse...",
"Archived boards" : "Arkiverede lister",
"Shared boards" : "Delte lister", "Shared boards" : "Delte lister",
"View more" : "Vis mere", "Shared with you" : "Delt med dig",
"Move board to archive" : "Flyt liste til arkiv", "Move board to archive" : "Flyt liste til arkiv",
"Create a new board" : "Opret ny liste" "Create a new board" : "Opret ny liste"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,60 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Möchtest Du wirklich diese Karte mit all ihren Daten löschen?",
"Delete" : "Löschen",
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden", "Hours" : "Stunden",
"Minutes" : "Minuten", "Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen", "Finished" : "Abgeschlossen",
"To review" : "Zu überprüfen", "To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich", "Action needed" : "Handlung erforderlich",
"Later" : "Später", "Later" : "Später",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 🚀 Organisiere Dein Projekt",
"Add a new stack" : "Stapel hinzufügen", "Add a new stack" : "Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen", "Show archived cards" : "Archivierte Karten anzeigen",
"Hide archived cards" : "Archivierte Karten ausblenden", "Hide archived cards" : "Archivierte Karten ausblenden",
"Board details" : "Board-Details", "Board details" : "Board-Details",
"All Boards" : "Alle Boards", "All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
"Archive" : "Archivieren", "Archive" : "Archivieren",
"Unarchive" : "Dearchivieren", "Unarchive" : "Dearchivieren",
"Delete" : "Löschen",
"Enter a card title" : "Kartentitel eingeben", "Enter a card title" : "Kartentitel eingeben",
"Add card" : "Karte hinzufügen",
"Close" : "Schließen",
"Sharing" : "Teilen", "Sharing" : "Teilen",
"Tags" : "Schlagworte", "Tags" : "Etiketten",
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll", "Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
"Access for" : "Zugriff für",
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.", "No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
"Loading" : "Lade",
"Share" : "Teilen", "Share" : "Teilen",
"Edit" : "Bearbeiten", "Edit" : "Bearbeiten",
"Manage" : "Verwalten", "Manage" : "Verwalten",
"Discard share" : "Teilen beenden", "Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Neues Etikett erstellen", "Create a new tag" : "Neues Etikett erstellen",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Mitglieder", "Members" : "Mitglieder",
"More actions" : "Weitere Aktionen", "More actions" : "Weitere Aktionen",
@@ -62,36 +33,24 @@ OC.L10N.register(
"Archive board" : "Board archivieren", "Archive board" : "Board archivieren",
"Unarchive board" : "Board dearchivieren", "Unarchive board" : "Board dearchivieren",
"Delete board" : "Board löschen", "Delete board" : "Board löschen",
"Reset" : "Zurücksetzen",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
"Create new board" : "Neues Board erstellen", "Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel", "New board title" : "Neuer Board-Titel",
"Select an attachment" : "Anhang auswählen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:", "Modified:" : "Geändert:",
"Created:" : "Erstellt:", "Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen", "by" : "von",
"Add a tag" : "Schlagwort hinzufügen", "Choose a label" : "Etikett wählen",
"Select tags" : "Schlagworte auswählen", "Add a label" : "Etikett hinzufügen",
"Assign users" : "Nutzer zuweisen", "Select labels…" : "Etiketten auswählen...",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
"Due date" : "Fälligkeitsdatum", "Due date" : "Fälligkeitsdatum",
"Click to set" : "Klicken zum Übernehmen", "Click to set" : "Klicken zum Übernehmen",
"Remove due date" : "Ablaufdatum löschen", "Remove due date" : "Ablaufdatum löschen",
"Description" : "Beschreibung", "Description" : "Beschreibung",
"Attachments" : "Anhänge",
"Saved" : "Gespeichert",
"Unsaved changes" : "Ungesicherte Änderungen",
"Formatting help" : "Formatierungshilfe", "Formatting help" : "Formatierungshilfe",
"Upload attachment" : "Anhang hochladen", "Saved" : "Gespeichert",
"Insert attachment" : "Anhang einfügen",
"Add a card description…" : "Eine Kartenbeschreibung hinzufügen…", "Add a card description…" : "Eine Kartenbeschreibung hinzufügen…",
"Archived boards" : "Archivierte Boards",
"Shared boards" : "Geteilte Boards", "Shared boards" : "Geteilte Boards",
"View more" : "Mehr anzeigen", "Shared with you" : "Mit Dir geteilt",
"Move board to archive" : "Board ins Archiv verschieben", "Move board to archive" : "Board ins Archiv verschieben",
"Create a new board" : "Neues Board erstellen" "Create a new board" : "Neues Board erstellen"
}, },

View File

@@ -1,58 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Möchtest Du wirklich diese Karte mit all ihren Daten löschen?",
"Delete" : "Löschen",
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden", "Hours" : "Stunden",
"Minutes" : "Minuten", "Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchtest du diesen Stapel mit allen Daten wirklich löschen?",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Dir geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Dir geteilt.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen", "Finished" : "Abgeschlossen",
"To review" : "Zu überprüfen", "To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich", "Action needed" : "Handlung erforderlich",
"Later" : "Später", "Later" : "Später",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werkzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Füge Deine Aufgaben zu den Karten hinzu und ordne diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teile mit Deinem Team, Freunden oder der Familie\n- 🚀 Organisiere Dein Projekt",
"Add a new stack" : "Stapel hinzufügen", "Add a new stack" : "Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen", "Show archived cards" : "Archivierte Karten anzeigen",
"Hide archived cards" : "Archivierte Karten ausblenden", "Hide archived cards" : "Archivierte Karten ausblenden",
"Board details" : "Board-Details", "Board details" : "Board-Details",
"All Boards" : "Alle Boards", "All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Lege Deine Dateien hier ab, um sie auf die Karte hochzuladen",
"Archive" : "Archivieren", "Archive" : "Archivieren",
"Unarchive" : "Dearchivieren", "Unarchive" : "Dearchivieren",
"Delete" : "Löschen",
"Enter a card title" : "Kartentitel eingeben", "Enter a card title" : "Kartentitel eingeben",
"Add card" : "Karte hinzufügen",
"Close" : "Schließen",
"Sharing" : "Teilen", "Sharing" : "Teilen",
"Tags" : "Schlagworte", "Tags" : "Etiketten",
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll", "Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
"Access for" : "Zugriff für",
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.", "No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
"Loading" : "Lade",
"Share" : "Teilen", "Share" : "Teilen",
"Edit" : "Bearbeiten", "Edit" : "Bearbeiten",
"Manage" : "Verwalten", "Manage" : "Verwalten",
"Discard share" : "Teilen beenden", "Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Neues Etikett erstellen", "Create a new tag" : "Neues Etikett erstellen",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Mitglieder", "Members" : "Mitglieder",
"More actions" : "Weitere Aktionen", "More actions" : "Weitere Aktionen",
@@ -60,36 +31,24 @@
"Archive board" : "Board archivieren", "Archive board" : "Board archivieren",
"Unarchive board" : "Board dearchivieren", "Unarchive board" : "Board dearchivieren",
"Delete board" : "Board löschen", "Delete board" : "Board löschen",
"Reset" : "Zurücksetzen",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
"Create new board" : "Neues Board erstellen", "Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel", "New board title" : "Neuer Board-Titel",
"Select an attachment" : "Anhang auswählen",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:", "Modified:" : "Geändert:",
"Created:" : "Erstellt:", "Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen", "by" : "von",
"Add a tag" : "Schlagwort hinzufügen", "Choose a label" : "Etikett wählen",
"Select tags" : "Schlagworte auswählen", "Add a label" : "Etikett hinzufügen",
"Assign users" : "Nutzer zuweisen", "Select labels…" : "Etiketten auswählen...",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuweisen",
"Due date" : "Fälligkeitsdatum", "Due date" : "Fälligkeitsdatum",
"Click to set" : "Klicken zum Übernehmen", "Click to set" : "Klicken zum Übernehmen",
"Remove due date" : "Ablaufdatum löschen", "Remove due date" : "Ablaufdatum löschen",
"Description" : "Beschreibung", "Description" : "Beschreibung",
"Attachments" : "Anhänge",
"Saved" : "Gespeichert",
"Unsaved changes" : "Ungesicherte Änderungen",
"Formatting help" : "Formatierungshilfe", "Formatting help" : "Formatierungshilfe",
"Upload attachment" : "Anhang hochladen", "Saved" : "Gespeichert",
"Insert attachment" : "Anhang einfügen",
"Add a card description…" : "Eine Kartenbeschreibung hinzufügen…", "Add a card description…" : "Eine Kartenbeschreibung hinzufügen…",
"Archived boards" : "Archivierte Boards",
"Shared boards" : "Geteilte Boards", "Shared boards" : "Geteilte Boards",
"View more" : "Mehr anzeigen", "Shared with you" : "Mit Dir geteilt",
"Move board to archive" : "Board ins Archiv verschieben", "Move board to archive" : "Board ins Archiv verschieben",
"Create a new board" : "Neues Board erstellen" "Create a new board" : "Neues Board erstellen"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,60 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Möchten Sie wirklich diese Karte mit all ihren Daten löschen?",
"Delete" : "Löschen",
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden", "Hours" : "Stunden",
"Minutes" : "Minuten", "Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen", "Finished" : "Abgeschlossen",
"To review" : "Zu überprüfen", "To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich", "Action needed" : "Handlung erforderlich",
"Later" : "Später", "Later" : "Später",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Add a new stack" : "Neuen Stapel hinzufügen", "Add a new stack" : "Neuen Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen", "Show archived cards" : "Archivierte Karten anzeigen",
"Hide archived cards" : "Archivierte Karten ausblenden", "Hide archived cards" : "Archivierte Karten ausblenden",
"Board details" : "Board-Details", "Board details" : "Board-Details",
"All Boards" : "Alle Boards", "All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
"Archive" : "Archivieren", "Archive" : "Archivieren",
"Unarchive" : "Dearchivieren", "Unarchive" : "Dearchivieren",
"Delete" : "Löschen",
"Enter a card title" : "Kartentitel eingeben", "Enter a card title" : "Kartentitel eingeben",
"Add card" : "Karte hinzufügen",
"Close" : "Schließen",
"Sharing" : "Teilen", "Sharing" : "Teilen",
"Tags" : "Schlagworte", "Tags" : "Tags",
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll", "Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
"Access for" : "Zugriff für",
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.", "No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
"Loading" : "Lade",
"Share" : "Teilen", "Share" : "Teilen",
"Edit" : "Bearbeiten", "Edit" : "Bearbeiten",
"Manage" : "Verwalten", "Manage" : "Verwalten",
"Discard share" : "Teilen beenden", "Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Tag erstellen", "Create a new tag" : "Tag erstellen",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Mitglieder", "Members" : "Mitglieder",
"More actions" : "Weitere Aktionen", "More actions" : "Weitere Aktionen",
@@ -62,36 +33,24 @@ OC.L10N.register(
"Archive board" : "Board archivieren", "Archive board" : "Board archivieren",
"Unarchive board" : "Board dearchivieren", "Unarchive board" : "Board dearchivieren",
"Delete board" : "Board löschen", "Delete board" : "Board löschen",
"Reset" : "Zurücksetzen",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
"Create new board" : "Neues Board erstellen", "Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel", "New board title" : "Neuer Board-Titel",
"Select an attachment" : "Wählen Sie einen Anhang",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:", "Modified:" : "Geändert:",
"Created:" : "Erstellt:", "Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen", "by" : "von",
"Add a tag" : "Schlagwort hinzufügen", "Choose a label" : "Tag auswählen",
"Select tags" : "Schlagworte auswählen", "Add a label" : "Tag hinzufügen",
"Assign users" : "Benutzer zuordnen", "Select labels…" : "Tags auswählen",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
"Due date" : "Zieltermin", "Due date" : "Zieltermin",
"Click to set" : "Setzen", "Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen", "Remove due date" : "Zieltermin entfernen",
"Description" : "Beschreibung", "Description" : "Beschreibung",
"Attachments" : "Anhänge",
"Saved" : "Gespeichert",
"Unsaved changes" : "Ungesicherte Änderungen",
"Formatting help" : "Formatierungshilfe", "Formatting help" : "Formatierungshilfe",
"Upload attachment" : "Anhang hochladen", "Saved" : "Gespeichert",
"Insert attachment" : "Anhang einfügen",
"Add a card description…" : "Beschreibung hinzufügen…", "Add a card description…" : "Beschreibung hinzufügen…",
"Archived boards" : "Archivierte Boards",
"Shared boards" : "Geteilte Boards", "Shared boards" : "Geteilte Boards",
"View more" : "Mehr anzeigen", "Shared with you" : "Mit Ihnen geteilt",
"Move board to archive" : "Board ins Archiv verschieben", "Move board to archive" : "Board ins Archiv verschieben",
"Create a new board" : "Neues Board erstellen" "Create a new board" : "Neues Board erstellen"
}, },

View File

@@ -1,58 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Möchten Sie wirklich diese Karte mit all ihren Daten löschen?",
"Delete" : "Löschen",
"Remove user from card" : "Benutzer von Karte entfernen",
"Hours" : "Stunden", "Hours" : "Stunden",
"Minutes" : "Minuten", "Minutes" : "Minuten",
"Maximum file size of {size} exceeded" : "Maximale Dateigröße von {size} überschritten",
"Are you sure you want to delete the stack with all of its data?" : "Möchten Sie diesen Stapel mit allen Daten wirklich löschen?",
"The card \"%s\" on \"%s\" has reached its due date." : "Die Karte \"%s\" auf \"%s\" ist überfällig.",
"The board \"%s\" has been shared with you by %s." : "Das Board \"%s\" wurde von %s mit Ihnen geteilt.",
"{user} has shared the board %s with you." : "{user} hat das Board %s mit Ihnen geteilt.",
"No data was provided to create an attachment." : "Es wurde keine Daten zum Erstellen eines Anhangs bereitgestellt.",
"Finished" : "Abgeschlossen", "Finished" : "Abgeschlossen",
"To review" : "Zu überprüfen", "To review" : "Zu überprüfen",
"Action needed" : "Handlung erforderlich", "Action needed" : "Handlung erforderlich",
"Later" : "Später", "Later" : "Später",
"The file was uploaded" : "Die Datei wurde hochgeladen",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Die hochgeladene Datei überschreitet die upload_max_filesize-Vorgabe in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist größer, als die MAX_FILE_SIZE-Vorgabe, die im HTML-Formular angegeben ist.",
"The file was only partially uploaded" : "Die Datei konnte nur teilweise hochgeladen werden",
"No file was uploaded" : "Es wurde keine Datei hochgeladen",
"Missing a temporary folder" : "Kein temporärer Ordner vorhanden",
"Could not write file to disk" : "Die Datei konnte nicht auf die Festplatte geschrieben werden",
"A PHP extension stopped the file upload" : "Eine PHP-Erweiterung hat das Hochladen der Datei gestoppt",
"No file uploaded or file size exceeds maximum of %s" : "Keine Datei hochgeladen oder die Dateigröße überschreitet %s",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Ein Kanban Werzeug für Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck ist ein Organisationstool im Kanban-Stil für die persönliche Planung und Projektorganisation von Teams, die in Nextcloud integriert sind.\n\n\n- 📥 Fügen Sie Ihre Aufgaben zu den Karten hinzu und ordnen Sie diese\n- 📄 Zusätzliche Hinweise in der Abschrift notieren\n- 🔖 Vergabe von Labels für noch bessere Organisation\n- 👥 Teilen Sie mit Ihrem Team, Ihren Freunden oder Ihrer Familie\n- 🚀 Organisieren Sie Ihr Projekt",
"Add a new stack" : "Neuen Stapel hinzufügen", "Add a new stack" : "Neuen Stapel hinzufügen",
"Submit" : "Übermitteln",
"Show archived cards" : "Archivierte Karten anzeigen", "Show archived cards" : "Archivierte Karten anzeigen",
"Hide archived cards" : "Archivierte Karten ausblenden", "Hide archived cards" : "Archivierte Karten ausblenden",
"Board details" : "Board-Details", "Board details" : "Board-Details",
"All Boards" : "Alle Boards", "All Boards" : "Alle Boards",
"Archived boards" : "Archivierte Boards",
"Drop your files here to upload it to the card" : "Legen Sie Ihre Dateien hier ab, um sie auf die Karte hochzuladen",
"Archive" : "Archivieren", "Archive" : "Archivieren",
"Unarchive" : "Dearchivieren", "Unarchive" : "Dearchivieren",
"Delete" : "Löschen",
"Enter a card title" : "Kartentitel eingeben", "Enter a card title" : "Kartentitel eingeben",
"Add card" : "Karte hinzufügen",
"Close" : "Schließen",
"Sharing" : "Teilen", "Sharing" : "Teilen",
"Tags" : "Schlagworte", "Tags" : "Tags",
"Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll", "Select users or groups to share with" : "Benutzer oder Gruppen auswählen, mit denen das Board geteilt werden soll",
"Access for" : "Zugriff für",
"No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.", "No matching user or group found." : "Keine passenden Benutzer oder Gruppen gefunden.",
"Loading" : "Lade",
"Share" : "Teilen", "Share" : "Teilen",
"Edit" : "Bearbeiten", "Edit" : "Bearbeiten",
"Manage" : "Verwalten", "Manage" : "Verwalten",
"Discard share" : "Teilen beenden", "Discard share" : "Teilen beenden",
"Update" : "Aktualisieren",
"Create" : "Erstellen",
"Create a new tag" : "Tag erstellen", "Create a new tag" : "Tag erstellen",
"Status" : "Status",
"Title" : "Titel", "Title" : "Titel",
"Members" : "Mitglieder", "Members" : "Mitglieder",
"More actions" : "Weitere Aktionen", "More actions" : "Weitere Aktionen",
@@ -60,36 +31,24 @@
"Archive board" : "Board archivieren", "Archive board" : "Board archivieren",
"Unarchive board" : "Board dearchivieren", "Unarchive board" : "Board dearchivieren",
"Delete board" : "Board löschen", "Delete board" : "Board löschen",
"Reset" : "Zurücksetzen",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Löschen des Boards rückgängig machen - Andernfalls wird das Board beim nächsten CronJob-Lauf gelöscht.",
"Create new board" : "Neues Board erstellen", "Create new board" : "Neues Board erstellen",
"New board title" : "Neuer Board-Titel", "New board title" : "Neuer Board-Titel",
"Select an attachment" : "Wählen Sie einen Anhang",
"by" : "von",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Dateilöschung rückgängig machen - Andernfalls wird die Datei beim nächsten CronJob-Lauf gelöscht.",
"Undo file deletion" : "Dateilöschung rückgängig machen",
"Insert the file into the description" : "Füge die Datei in die Beschreibung ein",
"Modified:" : "Geändert:", "Modified:" : "Geändert:",
"Created:" : "Erstellt:", "Created:" : "Erstellt:",
"Choose a tag" : "Schlagwort auswählen", "by" : "von",
"Add a tag" : "Schlagwort hinzufügen", "Choose a label" : "Tag auswählen",
"Select tags" : "Schlagworte auswählen", "Add a label" : "Tag hinzufügen",
"Assign users" : "Benutzer zuordnen", "Select labels…" : "Tags auswählen",
"Choose a user to assign" : "Wähle einen Benutzer für die Zuweisung aus",
"Assign this card to a user" : "Diese Karte einem Benutzer zuordnen",
"Due date" : "Zieltermin", "Due date" : "Zieltermin",
"Click to set" : "Setzen", "Click to set" : "Setzen",
"Remove due date" : "Zieltermin entfernen", "Remove due date" : "Zieltermin entfernen",
"Description" : "Beschreibung", "Description" : "Beschreibung",
"Attachments" : "Anhänge",
"Saved" : "Gespeichert",
"Unsaved changes" : "Ungesicherte Änderungen",
"Formatting help" : "Formatierungshilfe", "Formatting help" : "Formatierungshilfe",
"Upload attachment" : "Anhang hochladen", "Saved" : "Gespeichert",
"Insert attachment" : "Anhang einfügen",
"Add a card description…" : "Beschreibung hinzufügen…", "Add a card description…" : "Beschreibung hinzufügen…",
"Archived boards" : "Archivierte Boards",
"Shared boards" : "Geteilte Boards", "Shared boards" : "Geteilte Boards",
"View more" : "Mehr anzeigen", "Shared with you" : "Mit Ihnen geteilt",
"Move board to archive" : "Board ins Archiv verschieben", "Move board to archive" : "Board ins Archiv verschieben",
"Create a new board" : "Neues Board erstellen" "Create a new board" : "Neues Board erstellen"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,40 +1,30 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κάρτα με όλα τα δεδομένα της;",
"Delete" : "Διαγραφή",
"Remove user from card" : "Αφαίρεση χρήστη από την κάρτα",
"Hours" : "Ώρες", "Hours" : "Ώρες",
"Minutes" : "Λεπτά", "Minutes" : "Λεπτά",
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
"Finished" : "Ολοκληρώθηκε", "Finished" : "Ολοκληρώθηκε",
"To review" : "Προς επισκόπηση", "To review" : "Προς επισκόπηση",
"Action needed" : "Απαιτείται ενέργεια", "Action needed" : "Απαιτείται ενέργεια",
"Later" : "Αργότερα", "Later" : "Αργότερα",
"Deck" : "Deck", "Deck" : "Deck",
"Add a new stack" : "Πρόσθεσε νέα συστοιχία", "Add a new stack" : "Πρόσθεσε νέα συστοιχία",
"Submit" : "Υποβολή",
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν", "Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν", "Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
"Board details" : "Λεπτομέριες πίνακα", "Board details" : "Λεπτομέριες πίνακα",
"All Boards" : "Όλοι οι πίνακες", "All Boards" : "Όλοι οι πίνακες",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Archive" : "Αρχειοθέτηση", "Archive" : "Αρχειοθέτηση",
"Unarchive" : "Αναίρεση αρχειοθέτησης", "Unarchive" : "Αναίρεση αρχειοθέτησης",
"Delete" : "Διαγραφή",
"Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας", "Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας",
"Add card" : "Προσθήκη κάρτας",
"Close" : "Κλείσιμο",
"Sharing" : "Διαμοιρασμός", "Sharing" : "Διαμοιρασμός",
"Tags" : "Ετικέτες", "Tags" : "Ετικέτες",
"Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε", "Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε",
"No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.", "No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.",
"Loading" : "Γίνεται φόρτωση",
"Share" : "Διαμοιρασμός", "Share" : "Διαμοιρασμός",
"Edit" : "Επεξεργασία", "Edit" : "Επεξεργασία",
"Manage" : "Διαχείριση", "Manage" : "Διαχείριση",
"Discard share" : "Απόρριψη διαμοιρασμού", "Discard share" : "Απόρριψη διαμοιρασμού",
"Update" : "Ενημέρωση",
"Create" : "Δημιουργία",
"Create a new tag" : "Δημιούργησε νέα ετικέτα", "Create a new tag" : "Δημιούργησε νέα ετικέτα",
"Title" : "Τίτλος", "Title" : "Τίτλος",
"Members" : "Μέλη", "Members" : "Μέλη",
@@ -45,18 +35,22 @@ OC.L10N.register(
"Delete board" : "Διαγραφή πίνακα", "Delete board" : "Διαγραφή πίνακα",
"Create new board" : "Δημιουργία νέου πίνακα", "Create new board" : "Δημιουργία νέου πίνακα",
"New board title" : "Νέος τίτλος πίνακα", "New board title" : "Νέος τίτλος πίνακα",
"by" : "από",
"Modified:" : "Τροποποιήθηκε:", "Modified:" : "Τροποποιήθηκε:",
"Created:" : "Δημιουργήθηκε:", "Created:" : "Δημιουργήθηκε:",
"by" : "από",
"Choose a label" : "Διάλεξε μια επιγραφή",
"Add a label" : "Πρόσθεσε μια επιγραφή",
"Select labels…" : "Επέλεξε επιγραφές",
"Due date" : "Ημερομηνία λήξης", "Due date" : "Ημερομηνία λήξης",
"Click to set" : "Κλικ για να ορίσετε", "Click to set" : "Κλικ για να ορίσετε",
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης", "Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
"Description" : "Περιγραφή", "Description" : "Περιγραφή",
"Saved" : "Αποθηκεύτηκε",
"Formatting help" : "Βοήθεια μορφοποίησης", "Formatting help" : "Βοήθεια μορφοποίησης",
"Saved" : "Αποθηκεύτηκε",
"Add a card description…" : "Προσθήκη περιγραφής κάρτας...", "Add a card description…" : "Προσθήκη περιγραφής κάρτας...",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Shared boards" : "Διαμοιρασμένοι πίνακες", "Shared boards" : "Διαμοιρασμένοι πίνακες",
"View more" : "Προβολή περισσοτέρων", "Shared with you" : "Διαμοιρασμένα με εσάς",
"Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη", "Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη",
"Create a new board" : "Δημιουργία νέου πίνακα" "Create a new board" : "Δημιουργία νέου πίνακα"
}, },

View File

@@ -1,38 +1,28 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την κάρτα με όλα τα δεδομένα της;",
"Delete" : "Διαγραφή",
"Remove user from card" : "Αφαίρεση χρήστη από την κάρτα",
"Hours" : "Ώρες", "Hours" : "Ώρες",
"Minutes" : "Λεπτά", "Minutes" : "Λεπτά",
"The card \"%s\" on \"%s\" has reached its due date." : "Η κάρτα \"1%s\" στο \"1%s\" έχει λήξει.",
"Finished" : "Ολοκληρώθηκε", "Finished" : "Ολοκληρώθηκε",
"To review" : "Προς επισκόπηση", "To review" : "Προς επισκόπηση",
"Action needed" : "Απαιτείται ενέργεια", "Action needed" : "Απαιτείται ενέργεια",
"Later" : "Αργότερα", "Later" : "Αργότερα",
"Deck" : "Deck", "Deck" : "Deck",
"Add a new stack" : "Πρόσθεσε νέα συστοιχία", "Add a new stack" : "Πρόσθεσε νέα συστοιχία",
"Submit" : "Υποβολή",
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν", "Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν", "Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
"Board details" : "Λεπτομέριες πίνακα", "Board details" : "Λεπτομέριες πίνακα",
"All Boards" : "Όλοι οι πίνακες", "All Boards" : "Όλοι οι πίνακες",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Archive" : "Αρχειοθέτηση", "Archive" : "Αρχειοθέτηση",
"Unarchive" : "Αναίρεση αρχειοθέτησης", "Unarchive" : "Αναίρεση αρχειοθέτησης",
"Delete" : "Διαγραφή",
"Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας", "Enter a card title" : "Καταχωρίστε έναν τίτλο κάρτας",
"Add card" : "Προσθήκη κάρτας",
"Close" : "Κλείσιμο",
"Sharing" : "Διαμοιρασμός", "Sharing" : "Διαμοιρασμός",
"Tags" : "Ετικέτες", "Tags" : "Ετικέτες",
"Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε", "Select users or groups to share with" : "Επιλέξτε χρήστες ή ομάδες με τις οποίες θα μοιραστείτε",
"No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.", "No matching user or group found." : "Δεν βρέθηκε χρήστης ή ομάδα να ταιριάζει.",
"Loading" : "Γίνεται φόρτωση",
"Share" : "Διαμοιρασμός", "Share" : "Διαμοιρασμός",
"Edit" : "Επεξεργασία", "Edit" : "Επεξεργασία",
"Manage" : "Διαχείριση", "Manage" : "Διαχείριση",
"Discard share" : "Απόρριψη διαμοιρασμού", "Discard share" : "Απόρριψη διαμοιρασμού",
"Update" : "Ενημέρωση",
"Create" : "Δημιουργία",
"Create a new tag" : "Δημιούργησε νέα ετικέτα", "Create a new tag" : "Δημιούργησε νέα ετικέτα",
"Title" : "Τίτλος", "Title" : "Τίτλος",
"Members" : "Μέλη", "Members" : "Μέλη",
@@ -43,18 +33,22 @@
"Delete board" : "Διαγραφή πίνακα", "Delete board" : "Διαγραφή πίνακα",
"Create new board" : "Δημιουργία νέου πίνακα", "Create new board" : "Δημιουργία νέου πίνακα",
"New board title" : "Νέος τίτλος πίνακα", "New board title" : "Νέος τίτλος πίνακα",
"by" : "από",
"Modified:" : "Τροποποιήθηκε:", "Modified:" : "Τροποποιήθηκε:",
"Created:" : "Δημιουργήθηκε:", "Created:" : "Δημιουργήθηκε:",
"by" : "από",
"Choose a label" : "Διάλεξε μια επιγραφή",
"Add a label" : "Πρόσθεσε μια επιγραφή",
"Select labels…" : "Επέλεξε επιγραφές",
"Due date" : "Ημερομηνία λήξης", "Due date" : "Ημερομηνία λήξης",
"Click to set" : "Κλικ για να ορίσετε", "Click to set" : "Κλικ για να ορίσετε",
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης", "Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
"Description" : "Περιγραφή", "Description" : "Περιγραφή",
"Saved" : "Αποθηκεύτηκε",
"Formatting help" : "Βοήθεια μορφοποίησης", "Formatting help" : "Βοήθεια μορφοποίησης",
"Saved" : "Αποθηκεύτηκε",
"Add a card description…" : "Προσθήκη περιγραφής κάρτας...", "Add a card description…" : "Προσθήκη περιγραφής κάρτας...",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Shared boards" : "Διαμοιρασμένοι πίνακες", "Shared boards" : "Διαμοιρασμένοι πίνακες",
"View more" : "Προβολή περισσοτέρων", "Shared with you" : "Διαμοιρασμένα με εσάς",
"Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη", "Move board to archive" : "Μετακίνηση πίνακα στην αρχειοθήκη",
"Create a new board" : "Δημιουργία νέου πίνακα" "Create a new board" : "Δημιουργία νέου πίνακα"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,48 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "Are you sure you want to delete this card with all of its data?",
"Delete" : "Delete",
"Remove user from card" : "Remove user from card",
"Hours" : "Hours", "Hours" : "Hours",
"Minutes" : "Minutes", "Minutes" : "Minutes",
"Are you sure you want to delete the stack with all of its data?" : "Are you sure you want to delete the stack with all of its data?",
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
"{user} has shared the board %s with you." : "{user} has shared the board %s with you.",
"Finished" : "Finished", "Finished" : "Finished",
"To review" : "To review", "To review" : "To review",
"Action needed" : "Action needed", "Action needed" : "Action needed",
"Later" : "Later", "Later" : "Later",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "A kanban style project and personal management tool for Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organisation for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organised",
"Add a new stack" : "Add a new stack", "Add a new stack" : "Add a new stack",
"Submit" : "Submit",
"Show archived cards" : "Show archived cards", "Show archived cards" : "Show archived cards",
"Hide archived cards" : "Hide archived cards", "Hide archived cards" : "Hide archived cards",
"Board details" : "Board details", "Board details" : "Board details",
"All Boards" : "All Boards", "All Boards" : "All Boards",
"Archived boards" : "Archived boards",
"Archive" : "Archive", "Archive" : "Archive",
"Unarchive" : "Unarchive", "Unarchive" : "Unarchive",
"Delete" : "Delete",
"Enter a card title" : "Enter a card title", "Enter a card title" : "Enter a card title",
"Add card" : "Add card",
"Close" : "Close",
"Sharing" : "Sharing", "Sharing" : "Sharing",
"Tags" : "Tags", "Tags" : "Tags",
"Select users or groups to share with" : "Select users or groups to share with", "Select users or groups to share with" : "Select users or groups to share with",
"Access for" : "Access for",
"No matching user or group found." : "No matching user or group found.", "No matching user or group found." : "No matching user or group found.",
"Loading" : "Loading",
"Share" : "Share", "Share" : "Share",
"Edit" : "Edit", "Edit" : "Edit",
"Manage" : "Manage", "Manage" : "Manage",
"Discard share" : "Discard share", "Discard share" : "Discard share",
"Update" : "Update",
"Create" : "Create",
"Create a new tag" : "Create a new tag", "Create a new tag" : "Create a new tag",
"Status" : "Status",
"Title" : "Title", "Title" : "Title",
"Members" : "Members", "Members" : "Members",
"More actions" : "More actions", "More actions" : "More actions",
@@ -50,29 +33,24 @@ OC.L10N.register(
"Archive board" : "Archive board", "Archive board" : "Archive board",
"Unarchive board" : "Unarchive board", "Unarchive board" : "Unarchive board",
"Delete board" : "Delete board", "Delete board" : "Delete board",
"Reset" : "Reset",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Undo board deletion - Otherwise the board will be deleted during the next cronjob run.",
"Create new board" : "Create new board", "Create new board" : "Create new board",
"New board title" : "New board title", "New board title" : "New board title",
"by" : "by",
"Modified:" : "Modified:", "Modified:" : "Modified:",
"Created:" : "Created:", "Created:" : "Created:",
"Choose a tag" : "Choose a tag", "by" : "by",
"Add a tag" : "Add a tag", "Choose a label" : "Choose a label",
"Select tags" : "Select tags", "Add a label" : "Add a label",
"Assign users" : "Assign users", "Select labels…" : "Select labels…",
"Choose a user to assign" : "Choose a user to assign",
"Assign this card to a user" : "Assign this card to a user",
"Due date" : "Due date", "Due date" : "Due date",
"Click to set" : "Click to set", "Click to set" : "Click to set",
"Remove due date" : "Remove due date", "Remove due date" : "Remove due date",
"Description" : "Description", "Description" : "Description",
"Saved" : "Saved",
"Unsaved changes" : "Unsaved changes",
"Formatting help" : "Formatting help", "Formatting help" : "Formatting help",
"Saved" : "Saved",
"Add a card description…" : "Add a card description…", "Add a card description…" : "Add a card description…",
"Archived boards" : "Archived boards",
"Shared boards" : "Shared boards", "Shared boards" : "Shared boards",
"View more" : "View more", "Shared with you" : "Shared with you",
"Move board to archive" : "Move board to archive", "Move board to archive" : "Move board to archive",
"Create a new board" : "Create a new board" "Create a new board" : "Create a new board"
}, },

View File

@@ -1,46 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "Are you sure you want to delete this card with all of its data?",
"Delete" : "Delete",
"Remove user from card" : "Remove user from card",
"Hours" : "Hours", "Hours" : "Hours",
"Minutes" : "Minutes", "Minutes" : "Minutes",
"Are you sure you want to delete the stack with all of its data?" : "Are you sure you want to delete the stack with all of its data?",
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
"{user} has shared the board %s with you." : "{user} has shared the board %s with you.",
"Finished" : "Finished", "Finished" : "Finished",
"To review" : "To review", "To review" : "To review",
"Action needed" : "Action needed", "Action needed" : "Action needed",
"Later" : "Later", "Later" : "Later",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "A kanban style project and personal management tool for Nextcloud",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organisation for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organised",
"Add a new stack" : "Add a new stack", "Add a new stack" : "Add a new stack",
"Submit" : "Submit",
"Show archived cards" : "Show archived cards", "Show archived cards" : "Show archived cards",
"Hide archived cards" : "Hide archived cards", "Hide archived cards" : "Hide archived cards",
"Board details" : "Board details", "Board details" : "Board details",
"All Boards" : "All Boards", "All Boards" : "All Boards",
"Archived boards" : "Archived boards",
"Archive" : "Archive", "Archive" : "Archive",
"Unarchive" : "Unarchive", "Unarchive" : "Unarchive",
"Delete" : "Delete",
"Enter a card title" : "Enter a card title", "Enter a card title" : "Enter a card title",
"Add card" : "Add card",
"Close" : "Close",
"Sharing" : "Sharing", "Sharing" : "Sharing",
"Tags" : "Tags", "Tags" : "Tags",
"Select users or groups to share with" : "Select users or groups to share with", "Select users or groups to share with" : "Select users or groups to share with",
"Access for" : "Access for",
"No matching user or group found." : "No matching user or group found.", "No matching user or group found." : "No matching user or group found.",
"Loading" : "Loading",
"Share" : "Share", "Share" : "Share",
"Edit" : "Edit", "Edit" : "Edit",
"Manage" : "Manage", "Manage" : "Manage",
"Discard share" : "Discard share", "Discard share" : "Discard share",
"Update" : "Update",
"Create" : "Create",
"Create a new tag" : "Create a new tag", "Create a new tag" : "Create a new tag",
"Status" : "Status",
"Title" : "Title", "Title" : "Title",
"Members" : "Members", "Members" : "Members",
"More actions" : "More actions", "More actions" : "More actions",
@@ -48,29 +31,24 @@
"Archive board" : "Archive board", "Archive board" : "Archive board",
"Unarchive board" : "Unarchive board", "Unarchive board" : "Unarchive board",
"Delete board" : "Delete board", "Delete board" : "Delete board",
"Reset" : "Reset",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Undo board deletion - Otherwise the board will be deleted during the next cronjob run.",
"Create new board" : "Create new board", "Create new board" : "Create new board",
"New board title" : "New board title", "New board title" : "New board title",
"by" : "by",
"Modified:" : "Modified:", "Modified:" : "Modified:",
"Created:" : "Created:", "Created:" : "Created:",
"Choose a tag" : "Choose a tag", "by" : "by",
"Add a tag" : "Add a tag", "Choose a label" : "Choose a label",
"Select tags" : "Select tags", "Add a label" : "Add a label",
"Assign users" : "Assign users", "Select labels…" : "Select labels…",
"Choose a user to assign" : "Choose a user to assign",
"Assign this card to a user" : "Assign this card to a user",
"Due date" : "Due date", "Due date" : "Due date",
"Click to set" : "Click to set", "Click to set" : "Click to set",
"Remove due date" : "Remove due date", "Remove due date" : "Remove due date",
"Description" : "Description", "Description" : "Description",
"Saved" : "Saved",
"Unsaved changes" : "Unsaved changes",
"Formatting help" : "Formatting help", "Formatting help" : "Formatting help",
"Saved" : "Saved",
"Add a card description…" : "Add a card description…", "Add a card description…" : "Add a card description…",
"Archived boards" : "Archived boards",
"Shared boards" : "Shared boards", "Shared boards" : "Shared boards",
"View more" : "View more", "Shared with you" : "Shared with you",
"Move board to archive" : "Move board to archive", "Move board to archive" : "Move board to archive",
"Create a new board" : "Create a new board" "Create a new board" : "Create a new board"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,59 +1,31 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro de que quieres eliminar esta tarjeta con todos sus datos?",
"Delete" : "Eliminar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas", "Hours" : "Horas",
"Minutes" : "Minutos", "Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Tamaño máximo de archivo de {size} excedido",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro de que quieres eliminar el mazo con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alcanzado su fecha límite.",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo.",
"No data was provided to create an attachment." : "No se proporcionaron datos para crear un adjunto",
"Finished" : "Finalizado", "Finished" : "Finalizado",
"To review" : "Para revisar", "To review" : "Para revisar",
"Action needed" : "Acción necesaria", "Action needed" : "Acción necesaria",
"Later" : "Después", "Later" : "Después",
"The file was uploaded" : "Se ha subido el archivo",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo subido excede la directiva upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo subido excede la directiva MAX_FILE-SIZE directive que se especificó en el formulario web",
"The file was only partially uploaded" : "El archivo se ha subido solo parcialmente",
"No file was uploaded" : "No se ha subido ningún archivo",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Una herramienta de manejo de proyectos y personal al estilo kanban para Nextcloud.",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deckes una herramienta de organización al estilo kanban enfocada en la planificación personal y en la organización de proyectos para equipos, integrada en Nextcloud.\n\n\n- 📥 Añade tus tareas a tarjetas y ordénalas\n- 📄 Escribe notas adicionales en markdown\n- 🔖 Asigna etiquetas para una organización aún mejor\n- 👥 Comparte con tu equipo, amigos o familia\n- 🚀 Organiza tu proyecto",
"Add a new stack" : "Añadir nuevo montón", "Add a new stack" : "Añadir nuevo montón",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas", "Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas", "Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero", "Board details" : "Detalles del tablero",
"All Boards" : "Todos los tableros", "All Boards" : "Todos los tableros",
"Archived boards" : "Tableros archivados",
"Drop your files here to upload it to the card" : "Arrastra tus archivos aquí para subirlos a la tarjeta",
"Archive" : "Archivar", "Archive" : "Archivar",
"Unarchive" : "Desarchivar", "Unarchive" : "Desarchivar",
"Delete" : "Eliminar",
"Enter a card title" : "Introducir título de tarjeta", "Enter a card title" : "Introducir título de tarjeta",
"Add card" : "Añadir tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartir", "Sharing" : "Compartir",
"Tags" : "Etiquetas", "Tags" : "Etiquetas",
"Select users or groups to share with" : "Seleccionar usuarios o grupos con los que compartir", "Select users or groups to share with" : "Seleccionar usuarios o grupos con los que compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron usuarios o grupos coincidentes.", "No matching user or group found." : "No se encontraron usuarios o grupos coincidentes.",
"Loading" : "Cargando",
"Share" : "Compartir", "Share" : "Compartir",
"Edit" : "Editar", "Edit" : "Editar",
"Manage" : "Organizar", "Manage" : "Organizar",
"Discard share" : "Descartar compartición", "Discard share" : "Descartar compartición",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una etiqueta nueva", "Create a new tag" : "Crear una etiqueta nueva",
"Status" : "Estado",
"Title" : "Título", "Title" : "Título",
"Members" : "Miembros", "Members" : "Miembros",
"More actions" : "Más acciones", "More actions" : "Más acciones",
@@ -61,36 +33,24 @@ OC.L10N.register(
"Archive board" : "Archivar tablero", "Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero", "Unarchive board" : "Desarchivar tablero",
"Delete board" : "Eliminar tablero", "Delete board" : "Eliminar tablero",
"Reset" : "Resetear",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado del tablero. Si no, el tablero será eliminado durante la próxima ejecución del cronjob.",
"Create new board" : "Crear nuevo tablero", "Create new board" : "Crear nuevo tablero",
"New board title" : "Nuevo título de tablero", "New board title" : "Nuevo título de tablero",
"Select an attachment" : "Selecciona un adjunto",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Deshacer eliminación del archivo. De otra forma el archivo se borrará durante la próxima ejecución del trabajo cron.",
"Undo file deletion" : "Deshacer eliminación del archivo",
"Insert the file into the description" : "Introduce el archivo en la descripción",
"Modified:" : "Modificado: ", "Modified:" : "Modificado: ",
"Created:" : "Creado: ", "Created:" : "Creado: ",
"Choose a tag" : "Escoge una etiqueta", "by" : "por",
"Add a tag" : "Añade una etiqueta", "Choose a label" : "Escoger etiqueta",
"Select tags" : "Selecciona etiquetas", "Add a label" : "Añadir etiqueta",
"Assign users" : "Asignar usuarios", "Select labels…" : "Seleccionar etiquetas...",
"Choose a user to assign" : "Escoge un usuario al que asignar",
"Assign this card to a user" : "Asignar esta tarjeta a un usuario",
"Due date" : "Fecha límite", "Due date" : "Fecha límite",
"Click to set" : "Pinchar para establecer", "Click to set" : "Pinchar para establecer",
"Remove due date" : "Eliminar fecha límite", "Remove due date" : "Eliminar fecha límite",
"Description" : "Descripción", "Description" : "Descripción",
"Attachments" : "Adjuntos",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato", "Formatting help" : "Ayuda de formato",
"Upload attachment" : "Subir adjunto", "Saved" : "Guardado",
"Insert attachment" : "Insertar adjunto",
"Add a card description…" : "Añadir una descripción de tarjeta...", "Add a card description…" : "Añadir una descripción de tarjeta...",
"Archived boards" : "Tableros archivados",
"Shared boards" : "Tableros compartidos", "Shared boards" : "Tableros compartidos",
"View more" : "Ver más", "Shared with you" : "Compartido contigo",
"Move board to archive" : "Mover tablero al archivo", "Move board to archive" : "Mover tablero al archivo",
"Create a new board" : "Crear un tablero nuevo" "Create a new board" : "Crear un tablero nuevo"
}, },

View File

@@ -1,57 +1,29 @@
{ "translations": { { "translations": {
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro de que quieres eliminar esta tarjeta con todos sus datos?",
"Delete" : "Eliminar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas", "Hours" : "Horas",
"Minutes" : "Minutos", "Minutes" : "Minutos",
"Maximum file size of {size} exceeded" : "Tamaño máximo de archivo de {size} excedido",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro de que quieres eliminar el mazo con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alcanzado su fecha límite.",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo.",
"No data was provided to create an attachment." : "No se proporcionaron datos para crear un adjunto",
"Finished" : "Finalizado", "Finished" : "Finalizado",
"To review" : "Para revisar", "To review" : "Para revisar",
"Action needed" : "Acción necesaria", "Action needed" : "Acción necesaria",
"Later" : "Después", "Later" : "Después",
"The file was uploaded" : "Se ha subido el archivo",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El archivo subido excede la directiva upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El archivo subido excede la directiva MAX_FILE-SIZE directive que se especificó en el formulario web",
"The file was only partially uploaded" : "El archivo se ha subido solo parcialmente",
"No file was uploaded" : "No se ha subido ningún archivo",
"Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
"Deck" : "Deck", "Deck" : "Deck",
"A kanban style project and personal management tool for Nextcloud" : "Una herramienta de manejo de proyectos y personal al estilo kanban para Nextcloud.",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Deckes una herramienta de organización al estilo kanban enfocada en la planificación personal y en la organización de proyectos para equipos, integrada en Nextcloud.\n\n\n- 📥 Añade tus tareas a tarjetas y ordénalas\n- 📄 Escribe notas adicionales en markdown\n- 🔖 Asigna etiquetas para una organización aún mejor\n- 👥 Comparte con tu equipo, amigos o familia\n- 🚀 Organiza tu proyecto",
"Add a new stack" : "Añadir nuevo montón", "Add a new stack" : "Añadir nuevo montón",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas", "Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas", "Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero", "Board details" : "Detalles del tablero",
"All Boards" : "Todos los tableros", "All Boards" : "Todos los tableros",
"Archived boards" : "Tableros archivados",
"Drop your files here to upload it to the card" : "Arrastra tus archivos aquí para subirlos a la tarjeta",
"Archive" : "Archivar", "Archive" : "Archivar",
"Unarchive" : "Desarchivar", "Unarchive" : "Desarchivar",
"Delete" : "Eliminar",
"Enter a card title" : "Introducir título de tarjeta", "Enter a card title" : "Introducir título de tarjeta",
"Add card" : "Añadir tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartir", "Sharing" : "Compartir",
"Tags" : "Etiquetas", "Tags" : "Etiquetas",
"Select users or groups to share with" : "Seleccionar usuarios o grupos con los que compartir", "Select users or groups to share with" : "Seleccionar usuarios o grupos con los que compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron usuarios o grupos coincidentes.", "No matching user or group found." : "No se encontraron usuarios o grupos coincidentes.",
"Loading" : "Cargando",
"Share" : "Compartir", "Share" : "Compartir",
"Edit" : "Editar", "Edit" : "Editar",
"Manage" : "Organizar", "Manage" : "Organizar",
"Discard share" : "Descartar compartición", "Discard share" : "Descartar compartición",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una etiqueta nueva", "Create a new tag" : "Crear una etiqueta nueva",
"Status" : "Estado",
"Title" : "Título", "Title" : "Título",
"Members" : "Miembros", "Members" : "Miembros",
"More actions" : "Más acciones", "More actions" : "Más acciones",
@@ -59,36 +31,24 @@
"Archive board" : "Archivar tablero", "Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero", "Unarchive board" : "Desarchivar tablero",
"Delete board" : "Eliminar tablero", "Delete board" : "Eliminar tablero",
"Reset" : "Resetear",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado del tablero. Si no, el tablero será eliminado durante la próxima ejecución del cronjob.",
"Create new board" : "Crear nuevo tablero", "Create new board" : "Crear nuevo tablero",
"New board title" : "Nuevo título de tablero", "New board title" : "Nuevo título de tablero",
"Select an attachment" : "Selecciona un adjunto",
"by" : "por",
"Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Deshacer eliminación del archivo. De otra forma el archivo se borrará durante la próxima ejecución del trabajo cron.",
"Undo file deletion" : "Deshacer eliminación del archivo",
"Insert the file into the description" : "Introduce el archivo en la descripción",
"Modified:" : "Modificado: ", "Modified:" : "Modificado: ",
"Created:" : "Creado: ", "Created:" : "Creado: ",
"Choose a tag" : "Escoge una etiqueta", "by" : "por",
"Add a tag" : "Añade una etiqueta", "Choose a label" : "Escoger etiqueta",
"Select tags" : "Selecciona etiquetas", "Add a label" : "Añadir etiqueta",
"Assign users" : "Asignar usuarios", "Select labels…" : "Seleccionar etiquetas...",
"Choose a user to assign" : "Escoge un usuario al que asignar",
"Assign this card to a user" : "Asignar esta tarjeta a un usuario",
"Due date" : "Fecha límite", "Due date" : "Fecha límite",
"Click to set" : "Pinchar para establecer", "Click to set" : "Pinchar para establecer",
"Remove due date" : "Eliminar fecha límite", "Remove due date" : "Eliminar fecha límite",
"Description" : "Descripción", "Description" : "Descripción",
"Attachments" : "Adjuntos",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato", "Formatting help" : "Ayuda de formato",
"Upload attachment" : "Subir adjunto", "Saved" : "Guardado",
"Insert attachment" : "Insertar adjunto",
"Add a card description…" : "Añadir una descripción de tarjeta...", "Add a card description…" : "Añadir una descripción de tarjeta...",
"Archived boards" : "Tableros archivados",
"Shared boards" : "Tableros compartidos", "Shared boards" : "Tableros compartidos",
"View more" : "Ver más", "Shared with you" : "Compartido contigo",
"Move board to archive" : "Mover tablero al archivo", "Move board to archive" : "Mover tablero al archivo",
"Create a new board" : "Crear un tablero nuevo" "Create a new board" : "Crear un tablero nuevo"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -1,73 +0,0 @@
OC.L10N.register(
"deck",
{
"Delete" : "Borrar",
"Hours" : "Horas",
"Minutes" : "Minutos",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,71 +0,0 @@
{ "translations": {
"Delete" : "Borrar",
"Hours" : "Horas",
"Minutes" : "Minutos",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,7 +1,6 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"Delete" : "Borrar",
"Finished" : "Terminado", "Finished" : "Terminado",
"To review" : "Para revisar", "To review" : "Para revisar",
"Action needed" : "Acción requerida", "Action needed" : "Acción requerida",
@@ -13,6 +12,7 @@ OC.L10N.register(
"All Boards" : "Todos los Tablero", "All Boards" : "Todos los Tablero",
"Archive" : "Archivar", "Archive" : "Archivar",
"Unarchive" : "Desarchivar", "Unarchive" : "Desarchivar",
"Delete" : "Borrar",
"Enter a card title" : "Ingrese el títilo de la tarjeta", "Enter a card title" : "Ingrese el títilo de la tarjeta",
"Sharing" : "Compartiendo", "Sharing" : "Compartiendo",
"Select users or groups to share with" : "Seleccione los usuarios o grupos con los cuales compartir", "Select users or groups to share with" : "Seleccione los usuarios o grupos con los cuales compartir",
@@ -24,13 +24,14 @@ OC.L10N.register(
"Members" : "Miembros", "Members" : "Miembros",
"Create new board" : "Crear un nuevo tablero", "Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título de tablero", "New board title" : "Nuevo título de tablero",
"by" : "por",
"Modified:" : "Modificado:", "Modified:" : "Modificado:",
"Created:" : "Creado:", "Created:" : "Creado:",
"by" : "por",
"Description" : "Descripción", "Description" : "Descripción",
"Saved" : "Guardado",
"Formatting help" : "Ayuda de formato", "Formatting help" : "Ayuda de formato",
"Saved" : "Guardado",
"Add a card description…" : "Agregar una descripción de tarjeta...", "Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared with you" : "Compartido con usted",
"Create a new board" : "Crear nuevo tablero" "Create a new board" : "Crear nuevo tablero"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");

View File

@@ -1,5 +1,4 @@
{ "translations": { { "translations": {
"Delete" : "Borrar",
"Finished" : "Terminado", "Finished" : "Terminado",
"To review" : "Para revisar", "To review" : "Para revisar",
"Action needed" : "Acción requerida", "Action needed" : "Acción requerida",
@@ -11,6 +10,7 @@
"All Boards" : "Todos los Tablero", "All Boards" : "Todos los Tablero",
"Archive" : "Archivar", "Archive" : "Archivar",
"Unarchive" : "Desarchivar", "Unarchive" : "Desarchivar",
"Delete" : "Borrar",
"Enter a card title" : "Ingrese el títilo de la tarjeta", "Enter a card title" : "Ingrese el títilo de la tarjeta",
"Sharing" : "Compartiendo", "Sharing" : "Compartiendo",
"Select users or groups to share with" : "Seleccione los usuarios o grupos con los cuales compartir", "Select users or groups to share with" : "Seleccione los usuarios o grupos con los cuales compartir",
@@ -22,13 +22,14 @@
"Members" : "Miembros", "Members" : "Miembros",
"Create new board" : "Crear un nuevo tablero", "Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título de tablero", "New board title" : "Nuevo título de tablero",
"by" : "por",
"Modified:" : "Modificado:", "Modified:" : "Modificado:",
"Created:" : "Creado:", "Created:" : "Creado:",
"by" : "por",
"Description" : "Descripción", "Description" : "Descripción",
"Saved" : "Guardado",
"Formatting help" : "Ayuda de formato", "Formatting help" : "Ayuda de formato",
"Saved" : "Guardado",
"Add a card description…" : "Agregar una descripción de tarjeta...", "Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared with you" : "Compartido con usted",
"Create a new board" : "Crear nuevo tablero" "Create a new board" : "Crear nuevo tablero"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }

View File

@@ -1,77 +0,0 @@
OC.L10N.register(
"deck",
{
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro que deseas borrar esta tarjeta con todos sus datos? ",
"Delete" : "Borrar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"Minutes" : "Minutos",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro que deseas borrar la pila con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Choose a user to assign" : "Elige un usuario a asignar",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,75 +0,0 @@
{ "translations": {
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro que deseas borrar esta tarjeta con todos sus datos? ",
"Delete" : "Borrar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"Minutes" : "Minutos",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro que deseas borrar la pila con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Choose a user to assign" : "Elige un usuario a asignar",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -1,77 +0,0 @@
OC.L10N.register(
"deck",
{
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro que deseas borrar esta tarjeta con todos sus datos? ",
"Delete" : "Borrar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"Minutes" : "Minutos",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro que deseas borrar la pila con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Choose a user to assign" : "Elige un usuario a asignar",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,75 +0,0 @@
{ "translations": {
"Are you sure you want to delete this card with all of its data?" : "¿Estás seguro que deseas borrar esta tarjeta con todos sus datos? ",
"Delete" : "Borrar",
"Remove user from card" : "Eliminar usuario de la tarjeta",
"Hours" : "Horas",
"Minutes" : "Minutos",
"Are you sure you want to delete the stack with all of its data?" : "¿Estás seguro que deseas borrar la pila con todos sus datos?",
"The card \"%s\" on \"%s\" has reached its due date." : "La tarjeta \"%s\" en \"%s\" ha alacanzado su fecha de entrega",
"The board \"%s\" has been shared with you by %s." : "El tablero \"%s\" ha sido compartido contigo por %s.",
"{user} has shared the board %s with you." : "{user} ha compartido el tablero %s contigo. ",
"Finished" : "Terminado",
"To review" : "Para revisar",
"Action needed" : "Acción requerida",
"Later" : "Después",
"Deck" : "Deck",
"Add a new stack" : "Agregar una nueva pila",
"Submit" : "Enviar",
"Show archived cards" : "Mostrar tarjetas archivadas",
"Hide archived cards" : "Ocultar tarjetas archivadas",
"Board details" : "Detalles del tablero",
"All Boards" : "Todos los Tableros",
"Archived boards" : "Tableros archivados",
"Archive" : "Archivar",
"Unarchive" : "Desarchivar",
"Enter a card title" : "Ingresa el título de la tarjeta",
"Add card" : "Agregar tarjeta",
"Close" : "Cerrar",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetas",
"Select users or groups to share with" : "Selecciona los usuarios o grupos con los cuales compartir",
"Access for" : "Acceso para",
"No matching user or group found." : "No se encontraron coincidencias de usuarios o grupos.",
"Loading" : "Cargando",
"Share" : "Compartir",
"Edit" : "Editar",
"Manage" : "Administrar",
"Discard share" : "Descartar elemento compartido",
"Update" : "Actualizar",
"Create" : "Crear",
"Create a new tag" : "Crear una nueva etiqueta",
"Status" : "Estatus",
"Title" : "Título",
"Members" : "Miembros",
"More actions" : "Más acciones",
"Edit board" : "Editar el tablero",
"Archive board" : "Archivar tablero",
"Unarchive board" : "Desarchivar tablero",
"Delete board" : "Borrar tableros",
"Reset" : "Reiniciar",
"Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Deshacer borrado de tablero - De lo contrario el tablero se borrará durante la siguiente ejecución del cronjob. ",
"Create new board" : "Crear un nuevo tablero",
"New board title" : "Nuevo título del tablero",
"by" : "por",
"Modified:" : "Modificado:",
"Created:" : "Creado:",
"Choose a tag" : "Elije una etiqueta",
"Add a tag" : "Agrega una etiqueta",
"Select tags" : "Selecciona las etiquetas",
"Assign users" : "Asingar usuarios",
"Choose a user to assign" : "Elige un usuario a asignar",
"Assign this card to a user" : "Asignar esta tarjeta al usuario",
"Due date" : "Fecha de vencimiento",
"Click to set" : "Da click aquí para establecer",
"Remove due date" : "Eliminar fecha de expiración",
"Description" : "Descripción",
"Saved" : "Guardado",
"Unsaved changes" : "Cambios no guardados",
"Formatting help" : "Ayuda de formato",
"Add a card description…" : "Agregar una descripción de tarjeta...",
"Shared boards" : "Tableros compartidos",
"View more" : "Ver más",
"Move board to archive" : "Mover el tablero al archivo",
"Create a new board" : "Crear un nuevo tablero"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

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