diff --git a/.drone.yml b/.drone.yml index bbdcbaa52..5f42a21a2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -22,11 +22,11 @@ pipeline: when: matrix: TESTS: check-app-compatbility - check-app-compatbility-12: + check-app-compatbility-13: image: nextcloudci/php7.0:php7.0-17 environment: - APP_NAME=deck - - CORE_BRANCH=stable12 + - CORE_BRANCH=stable13 - DB=sqlite commands: # Pre-setup steps @@ -40,24 +40,6 @@ pipeline: when: matrix: TESTS: check-app-compatbility-13 - check-app-compatbility-12: - image: nextcloudci/php7.0:php7.0-17 - environment: - - APP_NAME=deck - - CORE_BRANCH=stable12 - - DB=sqlite - commands: - # Pre-setup steps - - wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh - - bash ./before_install.sh $APP_NAME $CORE_BRANCH $DB - - cd ../server - # Code checker - - ./occ app:check-code $APP_NAME -c strong-comparison - - ./occ app:check-code $APP_NAME -c deprecation - - cd apps/$APP_NAME/ - when: - matrix: - TESTS: check-app-compatbility-12 signed-off-check: image: nextcloudci/php7.0:php7.0-17 environment: @@ -230,7 +212,6 @@ pipeline: matrix: include: - TESTS: check-app-compatbility - - TESTS: check-app-compatbility-12 - TESTS: check-app-compatbility-13 - TESTS: signed-off-check - TESTS: syntax-php5.6 diff --git a/appinfo/info.xml b/appinfo/info.xml index eb0bb642d..f2ff32e48 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -14,7 +14,7 @@ - 🚀 Get your project organized - 0.4.0 + 0.5.0-dev1 agpl Julius Härtl Deck @@ -26,7 +26,7 @@ https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Board.png https://download.bitgrid.net/nextcloud/deck/screenshots/Deck_Details.png - + OCA\Deck\Cron\DeleteCron diff --git a/js/package-lock.json b/js/package-lock.json index 3c8c8369d..14b59d531 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -5,17 +5,17 @@ "requires": true, "dependencies": { "@uirouter/angularjs": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.18.tgz", - "integrity": "sha512-tswhwMMBDnbGOZnnCVpnA0pbd7dXkBck1HO0WY7fw8GO3dKbWAAc/rL0479dLypR89UDDGym5leTvZCLW4cJnA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.19.tgz", + "integrity": "sha512-O+M3CB4en9OPMKqSrMC6hZsuMbtttYpGlALZoqAYqUmqdw1CJ5WBnuj7s/40svhZG338SfqxXN/Y2uKh5x+gPQ==", "requires": { - "@uirouter/core": "5.0.19" + "@uirouter/core": "5.0.20" } }, "@uirouter/core": { - "version": "5.0.19", - "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.19.tgz", - "integrity": "sha512-wow+CKRThUAQkiTLNQCBsKQIU3NbH8GGH/w/TrcjKdvkZQA2jQB9QSqmmZxj7XNoZXY7QVcSSc4DWmxuSeAWmQ==" + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.20.tgz", + "integrity": "sha512-7MwtORbMF0UFCgMb+KcBAx+7EsYn/6sP5mEAjLNQq14AkHOJom5pPRE0N3nxduFbK3V2TXfsOX2UjtbkuXql+A==" }, "@webassemblyjs/ast": { "version": "1.5.13", @@ -2728,9 +2728,9 @@ } }, "enhanced-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", - "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -2859,9 +2859,9 @@ } }, "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -3062,17 +3062,6 @@ "chardet": "^0.5.0", "iconv-lite": "^0.4.22", "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "extglob": { @@ -4093,9 +4082,9 @@ } }, "global-modules-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz", - "integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", "dev": true }, "globals": { @@ -4572,12 +4561,6 @@ "supports-color": "^5.3.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -5438,9 +5421,9 @@ } }, "markdown-it": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz", - "integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", @@ -7208,9 +7191,9 @@ } }, "rxjs": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", - "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -8482,9 +8465,9 @@ } }, "webpack": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.0.tgz", - "integrity": "sha512-oNx9djAd6uAcccyfqN3hyXLNMjZHiRySZmBQ4c8FNmf1SNJGhx7n9TSvHNyXxgToRdH65g/Q97s94Ip9N6F7xg==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.1.tgz", + "integrity": "sha512-6jpzObU18y7lXDJz7XCLvzgrqcJ0rZ2jhKvnTivza9gM2GvPW93xxtmEll2GgmdC0zVQAtbHrH/9BtyMjSDZfA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.5.13", @@ -8498,7 +8481,7 @@ "ajv-keywords": "^3.1.0", "chrome-trace-event": "^1.0.0", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^3.7.1", + "eslint-scope": "^4.0.0", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.3.0", "loader-utils": "^1.1.0", @@ -8528,9 +8511,9 @@ } }, "webpack-cli": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz", - "integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", + "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -8543,7 +8526,7 @@ "loader-utils": "^1.1.0", "supports-color": "^5.4.0", "v8-compile-cache": "^2.0.0", - "yargs": "^11.1.0" + "yargs": "^12.0.1" }, "dependencies": { "ansi-regex": { @@ -8602,11 +8585,23 @@ "which": "^1.2.9" } }, - "has-flag": { + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -8614,6 +8609,16 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -8625,10 +8630,28 @@ "mem": "^1.1.0" } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, "string-width": { @@ -8665,15 +8688,21 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", + "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^2.0.0", "require-directory": "^2.1.1", @@ -8681,14 +8710,14 @@ "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { "camelcase": "^4.1.0" diff --git a/js/package.json b/js/package.json index 5b3e3d490..51f5babba 100644 --- a/js/package.json +++ b/js/package.json @@ -8,14 +8,14 @@ "test": "tests" }, "dependencies": { - "@uirouter/angularjs": "^1.0.18", + "@uirouter/angularjs": "^1.0.19", "angular": "^1.7.2", "angular-animate": "^1.7.2", "angular-file-upload": "^2.5.0", "angular-markdown-it": "^0.6.1", "angular-sanitize": "^1.7.2", "babel-polyfill": "^6.26.0", - "markdown-it": "^8.4.1", + "markdown-it": "^8.4.2", "markdown-it-link-target": "^1.0.2", "ng-sortable": "^1.3.8", "ui-select": "^0.19.8" @@ -28,8 +28,8 @@ "karma": "^2.0.4", "mini-css-extract-plugin": "^0.4.1", "node-sass": "^4.9.2", - "webpack": "^4.16.0", - "webpack-cli": "^3.0.8", + "webpack": "^4.16.1", + "webpack-cli": "^3.1.0", "webpack-merge": "^4.1.3" }, "scripts": { diff --git a/l10n/cs.js b/l10n/cs.js index 299b1a4df..fe21b3356 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -12,21 +12,29 @@ OC.L10N.register( "The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.", "The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.", "{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.", + "No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.", "Finished" : "Dokončeno", "To review" : "K revizi", "Action needed" : "Nutná akce", "Later" : "Později", + "To do" : "Udělat", + "Doing" : "Provádím", "Done" : "Hotovo", "Example Task 3" : "Třetí úkol pro ukázku", "Example Task 2" : "Druhý úkol pro ukázku", "Example Task 1" : "První úkol pro ukázku", "The file was uploaded" : "Soubor byl nahrán", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný ve formuláři HTML", "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", "No file was uploaded" : "Nebyl nahrán žádný soubor", "Missing a temporary folder" : "Chybí adresář pro dočasné soubory", "Could not write file to disk" : "Nedaří se zapsat soubor do úložiště", "A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.", + "No file uploaded or file size exceeds maximum of %s" : "Soubor nebyl nahrán nebo jeho velikost přesáhla %s", "Deck" : "Balík", + "A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní management ve stylu Kanban.", + "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, jenž je zaintegrovaný do Nextcloudu.\n\n\n- 📥 Vložte a uspořádejte své úkoly do karet\n- 📄 Zapište si dodatečné poznámky \n- 🔖 Přilepte štítek pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přátely nebo rodinou\n- 🚀 Dostaťe svůj projekt pod kontrolu", "Add a new stack" : "Přidat nový zásobník", "Submit" : "Odeslat", "Show archived cards" : "Zobrazit archivované karty", @@ -34,6 +42,7 @@ OC.L10N.register( "Board details" : "Detaily desky", "All Boards" : "Všechny desky", "Archived boards" : "Archivované desky", + "Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.", "Archive" : "Archiv", "Unarchive" : "Zrušit archivování", "Enter a card title" : "Zadejte nadpis karty", @@ -62,12 +71,14 @@ OC.L10N.register( "Delete board" : "Smazat desku", "Reset" : "Obnovit", "Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.", - "Create new board" : "VYtvořit ovou desku", + "Create new board" : "Vytvořit novou desku", "New board title" : "Nadpis nové desky", "Select an attachment" : "Vybrat přílohu", "Cancel upload" : "Zrušit nahrávání", "by" : "od", + "Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru - v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.", "Undo file deletion" : "Vzít zpět smazání souboru", + "Insert the file into the description" : "Vložte soubor do popisku.", "Modified:" : "Upraveno:", "Created:" : "Vytvořeno:", "Choose a tag" : "Vyberte štítek", diff --git a/l10n/cs.json b/l10n/cs.json index 57a657233..917e9b800 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -10,21 +10,29 @@ "The card \"%s\" on \"%s\" has reached its due date." : "U karty \"%s\" z tabule \"%s\" nastalo plánované datum dokončení.", "The board \"%s\" has been shared with you by %s." : "Tabule \"%s\" s vámi byla nasdílena uživatelem %s.", "{user} has shared the board %s with you." : "{user} s vámi nasdílel tabuli %s.", + "No data was provided to create an attachment." : "Žádná data k vytvoření přílohy.", "Finished" : "Dokončeno", "To review" : "K revizi", "Action needed" : "Nutná akce", "Later" : "Později", + "To do" : "Udělat", + "Doing" : "Provádím", "Done" : "Hotovo", "Example Task 3" : "Třetí úkol pro ukázku", "Example Task 2" : "Druhý úkol pro ukázku", "Example Task 1" : "První úkol pro ukázku", "The file was uploaded" : "Soubor byl nahrán", + "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Nahrávaný soubor přesahuje nastavení upload_max_filesize v php.ini", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný ve formuláři HTML", "The file was only partially uploaded" : "Soubor byl nahrán pouze z části", "No file was uploaded" : "Nebyl nahrán žádný soubor", "Missing a temporary folder" : "Chybí adresář pro dočasné soubory", "Could not write file to disk" : "Nedaří se zapsat soubor do úložiště", "A PHP extension stopped the file upload" : "Rozšíření PHP zastavilo nahrávání souboru.", + "No file uploaded or file size exceeds maximum of %s" : "Soubor nebyl nahrán nebo jeho velikost přesáhla %s", "Deck" : "Balík", + "A kanban style project and personal management tool for Nextcloud" : "Nástroj pro projektový a osobní management ve stylu Kanban.", + "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 🚀 Get your project organized" : "Karty jsou nástroj zacílený na osobní nebo projektové plánování týmů v Kanban stylu, jenž je zaintegrovaný do Nextcloudu.\n\n\n- 📥 Vložte a uspořádejte své úkoly do karet\n- 📄 Zapište si dodatečné poznámky \n- 🔖 Přilepte štítek pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přátely nebo rodinou\n- 🚀 Dostaťe svůj projekt pod kontrolu", "Add a new stack" : "Přidat nový zásobník", "Submit" : "Odeslat", "Show archived cards" : "Zobrazit archivované karty", @@ -32,6 +40,7 @@ "Board details" : "Detaily desky", "All Boards" : "Všechny desky", "Archived boards" : "Archivované desky", + "Drop your files here to upload it to the card" : "Přetáhněte soubor sem, pokud jej chcete připojit ke kartě.", "Archive" : "Archiv", "Unarchive" : "Zrušit archivování", "Enter a card title" : "Zadejte nadpis karty", @@ -60,12 +69,14 @@ "Delete board" : "Smazat desku", "Reset" : "Obnovit", "Undo board deletion - Otherwise the board will be deleted during the next cronjob run." : "Vrátit smazání tabule - Tabule bude jinak trvale odstraněna během příštího běhu cronjobu.", - "Create new board" : "VYtvořit ovou desku", + "Create new board" : "Vytvořit novou desku", "New board title" : "Nadpis nové desky", "Select an attachment" : "Vybrat přílohu", "Cancel upload" : "Zrušit nahrávání", "by" : "od", + "Undo file deletion - Otherwise the file will be deleted during the next cronjob run." : "Vrátit smazání souboru - v opačném případě bude soubor trvale smazán při dalším běhu cronjobu.", "Undo file deletion" : "Vzít zpět smazání souboru", + "Insert the file into the description" : "Vložte soubor do popisku.", "Modified:" : "Upraveno:", "Created:" : "Vytvořeno:", "Choose a tag" : "Vyberte štítek", diff --git a/l10n/fr.js b/l10n/fr.js index 55b7b8065..04caa6e90 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -18,6 +18,11 @@ OC.L10N.register( "Action needed" : "Action requise", "Later" : "Plus tard", "To do" : "À faire", + "Doing" : "En cours", + "Done" : "Terminé", + "Example Task 3" : "Exemple de tâche 3", + "Example Task 2" : "Exemple de tâche 2", + "Example Task 1" : "Exemple de tâche 1", "The file was uploaded" : "Le fichier a été téléchargé", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML", diff --git a/l10n/fr.json b/l10n/fr.json index e6a5adb40..e3d056cf2 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -16,6 +16,11 @@ "Action needed" : "Action requise", "Later" : "Plus tard", "To do" : "À faire", + "Doing" : "En cours", + "Done" : "Terminé", + "Example Task 3" : "Exemple de tâche 3", + "Example Task 2" : "Exemple de tâche 2", + "Example Task 1" : "Exemple de tâche 1", "The file was uploaded" : "Le fichier a été téléchargé", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Le fichier téléversé dépasse la valeur upload_max_filesize située dans le fichier php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui était spécifiée dans le formulaire HTML", diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index aac44b52d..528c1e416 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -61,6 +61,10 @@ class Application extends App { return $container->getServer()->getConfig()->getSystemValue('dbtype', 'sqlite'); }); + $container->registerService('database4ByteSupport', function($container) { + return $container->getServer()->getDatabaseConnection()->supports4ByteText(); + }); + // Delete user/group acl entries when they get deleted /** @var IUserManager $userManager */ $userManager = $server->getUserManager(); diff --git a/lib/Db/CardMapper.php b/lib/Db/CardMapper.php index 7c5e78462..e0234fc43 100644 --- a/lib/Db/CardMapper.php +++ b/lib/Db/CardMapper.php @@ -38,29 +38,40 @@ class CardMapper extends DeckMapper implements IPermissionMapper { /** @var IManager */ private $notificationManager; private $databaseType; + private $database4ByteSupport; public function __construct( IDBConnection $db, LabelMapper $labelMapper, IUserManager $userManager, IManager $notificationManager, - $databaseType = 'sqlite' + $databaseType = 'sqlite', + $database4ByteSupport = true ) { parent::__construct($db, 'deck_cards', Card::class); $this->labelMapper = $labelMapper; $this->userManager = $userManager; $this->notificationManager = $notificationManager; $this->databaseType = $databaseType; + $this->database4ByteSupport = $database4ByteSupport; } public function insert(Entity $entity) { $entity->setDatabaseType($this->databaseType); $entity->setCreatedAt(time()); $entity->setLastModified(time()); + if (!$this->database4ByteSupport) { + $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); + $entity->setDescription($description); + } return parent::insert($entity); } public function update(Entity $entity, $updateModified = true) { + if (!$this->database4ByteSupport) { + $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); + $entity->setDescription($description); + } $entity->setDatabaseType($this->databaseType); if ($updateModified) { diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index f76ce220e..26fa3753c 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -195,6 +195,7 @@ class CardService { } public function assignUser($cardId, $userId) { + $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $assignments = $this->assignedUsersMapper->find($cardId); foreach ($assignments as $assignment) { if ($assignment->getParticipant() === $userId) { @@ -208,6 +209,7 @@ class CardService { } public function unassignUser($cardId, $userId) { + $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $assignments = $this->assignedUsersMapper->find($cardId); foreach ($assignments as $assignment) { if ($assignment->getParticipant() === $userId) {