├── l10n ├── .gitkeep ├── si.json ├── si.js ├── kab.json ├── kab.js ├── gd.json ├── gd.js ├── km.json ├── bs.json ├── km.js ├── sr@latin.json ├── bs.js ├── sr@latin.js ├── hy.json ├── hy.js ├── ta.json ├── ta.js ├── nn_NO.json ├── nn_NO.js ├── bn_BD.json ├── bn_BD.js ├── mn.json ├── mn.js ├── az.json ├── az.js ├── lb.json ├── lb.js ├── ia.json ├── ia.js ├── af.json ├── af.js ├── th.json ├── th.js ├── ka_GE.json ├── br.json ├── ka_GE.js ├── br.js ├── es_419.json ├── es_CR.json ├── es_DO.json ├── es_HN.json ├── es_NI.json ├── es_PA.json ├── es_PR.json ├── es_SV.json ├── es_419.js ├── es_CR.js ├── es_DO.js ├── es_HN.js ├── es_NI.js ├── es_PA.js ├── es_PR.js ├── es_SV.js ├── es_GT.json ├── es_PE.json ├── es_GT.js ├── es_PE.js ├── es_PY.json ├── es_CL.json ├── es_PY.js ├── es_CL.js ├── es_UY.json ├── es_UY.js ├── sq.json ├── es_CO.json ├── es_CO.js ├── sq.js ├── oc.json ├── oc.js ├── es_AR.json └── es_AR.js ├── .prettierrc.js ├── .stylelintignore ├── img ├── tasks.png ├── favicon.ico ├── favicon.png ├── favicon-touch.png ├── tasks-dark.svg ├── tasks.svg ├── favicon.svg ├── favicon-touch.svg └── image-optimization.sh ├── screenshots └── tasks-1.png ├── templates └── main.php ├── babel.config.cjs ├── tests ├── javascript │ └── unit │ │ ├── .eslintrc.cjs │ │ ├── components │ │ └── Colorpicker.spec.js │ │ ├── OC.js │ │ ├── setup.js │ │ └── utils │ │ └── url.spec.js └── php │ ├── bootstrap.php │ ├── unit │ └── Controller │ │ ├── PageControllerTest.php │ │ └── SettingsControllerTest.php │ └── integration │ └── AppInfo │ └── ApplicationTest.php ├── .eslintrc.cjs ├── css └── tasks-icon.css ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── feature_request.yml ├── dependabot.yml └── workflows │ ├── lint-info-xml.yml │ ├── codeql.yml │ ├── lint-php-cs.yml │ └── lint-php.yml ├── .tx └── config ├── .codecov.yml ├── .php-cs-fixer.dist.php ├── .editorconfig ├── stylelint.config.js ├── .gitattributes ├── phpunit.xml ├── phpunit.integration.xml ├── vite.config.mjs ├── composer.json ├── src ├── models │ ├── consts.js │ ├── syncStatus.js │ └── principal.js ├── dashboard.js ├── utils │ ├── url.js │ ├── router.js │ ├── crypto.js │ ├── color.js │ ├── textToTask.js │ └── logger.js ├── services │ ├── requests.js │ └── cdav.js ├── views │ └── AppContent │ │ ├── Collections.vue │ │ └── task-list.scss ├── store │ └── store.js ├── helpers │ └── selector.js ├── components │ ├── TaskIcon.vue │ └── AppSidebar │ │ ├── Alarm │ │ ├── AlarmRelationDeletionModal.vue │ │ └── AlarmTimeUnitSelect.vue │ │ ├── MultiselectOption.vue │ │ └── CheckboxItem.vue ├── mixins │ └── openNewTask.js └── main.js ├── lib ├── Controller │ ├── Response.php │ ├── SettingsController.php │ ├── CollectionsController.php │ └── PageController.php ├── AppInfo │ └── Application.php ├── Listeners │ └── BeforeTemplateRenderedListener.php └── Dashboard │ └── TasksWidget.php ├── appinfo ├── info.xml └── routes.php └── package.json /l10n/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /.stylelintignore: -------------------------------------------------------------------------------- 1 | vendor/**/*.css 2 | coverage/**/*.css 3 | -------------------------------------------------------------------------------- /img/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/tasks/HEAD/img/tasks.png -------------------------------------------------------------------------------- /img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/tasks/HEAD/img/favicon.ico -------------------------------------------------------------------------------- /img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/tasks/HEAD/img/favicon.png -------------------------------------------------------------------------------- /img/favicon-touch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/tasks/HEAD/img/favicon-touch.png -------------------------------------------------------------------------------- /screenshots/tasks-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/tasks/HEAD/screenshots/tasks-1.png -------------------------------------------------------------------------------- /templates/main.php: -------------------------------------------------------------------------------- 1 | { 4 | 'use strict' 5 | 6 | it('simulates test', () => { 7 | // const wrapper = shallowMount(Colorpicker) 8 | expect(true).toBe(true) 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: ❓ Question 4 | url: https://help.nextcloud.com/ 5 | about: I have a question … 6 | - name: 🔒 Security Vulnerability 7 | url: https://hackerone.com/nextcloud 8 | about: Found a security vulnerability? 9 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu 4 | 5 | [o:nextcloud:p:nextcloud:r:tasks] 6 | file_filter = translationfiles//tasks.po 7 | source_file = translationfiles/templates/tasks.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /img/tasks-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/tasks.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/php/bootstrap.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright Bernhard Posselt 2016 10 | */ 11 | 12 | require_once __DIR__ . '/../../../../tests/bootstrap.php'; 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | day: saturday 8 | time: "03:00" 9 | timezone: Europe/Paris 10 | open-pull-requests-limit: 10 11 | - package-ecosystem: "github-actions" 12 | directory: "/" 13 | schedule: 14 | interval: weekly 15 | open-pull-requests-limit: 10 16 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | notify: 3 | require_ci_to_pass: yes 4 | 5 | coverage: 6 | precision: 2 7 | round: down 8 | range: "70...100" 9 | 10 | status: 11 | project: yes 12 | patch: yes 13 | changes: no 14 | 15 | comment: 16 | layout: "header, diff, changes, sunburst, uncovered" 17 | behavior: default 18 | require_changes: no 19 | 20 | fixes: 21 | - "apps/tasks/::" 22 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 12 | ->ignoreVCSIgnored(true) 13 | ->exclude('config') 14 | ->exclude('data') 15 | ->notPath('3rdparty') 16 | ->notPath('composer') 17 | ->notPath('vendor') 18 | ->in(__DIR__); 19 | return $config; 20 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | # Unix-style newlines with a newline ending every file 5 | [*] 6 | end_of_line = lf 7 | insert_final_newline = true 8 | 9 | # Set default charset and indentation 10 | [*.{php,js,scss,vue}] 11 | charset = utf-8 12 | indent_style = tab 13 | tab_width = 4 14 | indent_size = 4 15 | 16 | # Indentation override for PHP templates 17 | [templates/**.php] 18 | indent_style = space 19 | indent_size = 4 20 | -------------------------------------------------------------------------------- /stylelint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: '@nextcloud/stylelint-config', 3 | rules: { 4 | 'no-eol-whitespace': true, 5 | 'length-zero-no-unit': true, 6 | 'block-opening-brace-space-before': 'always', 7 | 'number-leading-zero': 'never', 8 | 'selector-combinator-space-before': 'always', 9 | 'selector-combinator-space-after': 'always', 10 | 'declaration-colon-space-after': 'always', 11 | 'declaration-colon-space-before': 'never' 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /img/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /img/favicon-touch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/javascript/unit/OC.js: -------------------------------------------------------------------------------- 1 | export class OC { 2 | 3 | generateUrl(url) { 4 | return '' 5 | } 6 | 7 | imagePath(app, img) { 8 | return '' 9 | } 10 | 11 | linkToRemote(app) { 12 | return '' 13 | } 14 | 15 | getLanguage() { 16 | return 'en-GB' 17 | } 18 | 19 | getLocale() { 20 | return 'en_GB' 21 | } 22 | 23 | isUserAdmin() { 24 | return false 25 | } 26 | 27 | L10N = { 28 | translate(app, text) { 29 | return text 30 | }, 31 | 32 | translatePlural(app, text) { 33 | return text 34 | }, 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /img/image-optimization.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function recursive_optimize_images() { 4 | cd $1; 5 | optipng -o6 -strip all *.png; 6 | jpegoptim --strip-all *.jpg; 7 | for svg in `ls *.svg`; 8 | do 9 | mv $svg $svg.opttmp; 10 | scour -i $svg.opttmp -o $svg --create-groups --enable-id-stripping --enable-comment-stripping --shorten-ids --remove-metadata --strip-xml-prolog --no-line-breaks; 11 | done; 12 | rm *.opttmp 13 | for dir in `ls -d */`; 14 | do 15 | recursive_optimize_images $dir; 16 | cd ..; 17 | done; 18 | } 19 | 20 | recursive_optimize_images ../ 21 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "වැදගත්", 3 | "Today" : "අද", 4 | "Week" : "සතිය", 5 | "All" : "සියල්ල", 6 | "Completed" : "සම්පුර්ණයි", 7 | "Tasks" : "කාර්යයන්", 8 | "Edit" : "සංස්කරණය", 9 | "Copy private link" : "පුද්ගලික සබැඳිය පිටපත් කරන්න", 10 | "Name" : "නම", 11 | "Restore" : "ප්‍රතිෂ්ථාපනය", 12 | "Cancel" : "අවලංගු කරන්න", 13 | "Go back" : "ආපසු යන්න", 14 | "Close" : "වසන්න", 15 | "Tomorrow" : "හෙට", 16 | "Details" : "විස්තර", 17 | "Notes" : "සටහන්" 18 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 19 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "වැදගත්", 5 | "Today" : "අද", 6 | "Week" : "සතිය", 7 | "All" : "සියල්ල", 8 | "Completed" : "සම්පුර්ණයි", 9 | "Tasks" : "කාර්යයන්", 10 | "Edit" : "සංස්කරණය", 11 | "Copy private link" : "පුද්ගලික සබැඳිය පිටපත් කරන්න", 12 | "Name" : "නම", 13 | "Restore" : "ප්‍රතිෂ්ථාපනය", 14 | "Cancel" : "අවලංගු කරන්න", 15 | "Go back" : "ආපසු යන්න", 16 | "Close" : "වසන්න", 17 | "Tomorrow" : "හෙට", 18 | "Details" : "විස්තර", 19 | "Notes" : "සටහන්" 20 | }, 21 | "nplurals=2; plural=(n != 1);"); 22 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | ./lib 9 | 10 | 11 | 12 | 13 | 14 | 15 | ./tests/php/unit 16 | 17 | 18 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Today" : "Ass-a", 3 | "Week" : "Amalas", 4 | "All" : "Akk", 5 | "Current" : "Amiran", 6 | "Completed" : "Yemmed", 7 | "Edit" : "Ẓreg", 8 | "Delete" : "Kkes", 9 | "Name" : "Nom", 10 | "Deleted" : "Yettwakkes", 11 | "Delete permanently" : "Kkes-it i lebda", 12 | "Cancel" : "Sefsex", 13 | "Notification" : "Ilɣa", 14 | "Email" : "Imayl", 15 | "Go back" : "Tuɣalin", 16 | "Close" : "Mdel", 17 | "Tags" : "Tibzimin", 18 | "Delete task" : "Kkes tawuri", 19 | "Details" : "Talqayt" 20 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 21 | } -------------------------------------------------------------------------------- /tests/javascript/unit/setup.js: -------------------------------------------------------------------------------- 1 | import { OC } from './OC.js' 2 | 3 | // eslint-disable-next-line n/no-unpublished-import 4 | import MockDate from 'mockdate' 5 | 6 | import { afterAll } from 'vitest' 7 | 8 | // Set date to fixed value 9 | MockDate.set(new Date('2019-01-01T12:34:56')) 10 | 11 | global.OC = new OC() 12 | 13 | // Mock nextcloud translate functions 14 | global.t = function(app, string) { 15 | return string 16 | } 17 | 18 | global.n = function(app, singular, plural, count) { 19 | return singular 20 | } 21 | 22 | global.OCA = {} 23 | global.OCA.Tasks = {} 24 | 25 | afterAll(() => { 26 | MockDate.reset() 27 | }) 28 | -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Today" : "Ass-a", 5 | "Week" : "Amalas", 6 | "All" : "Akk", 7 | "Current" : "Amiran", 8 | "Completed" : "Yemmed", 9 | "Edit" : "Ẓreg", 10 | "Delete" : "Kkes", 11 | "Name" : "Nom", 12 | "Deleted" : "Yettwakkes", 13 | "Delete permanently" : "Kkes-it i lebda", 14 | "Cancel" : "Sefsex", 15 | "Notification" : "Ilɣa", 16 | "Email" : "Imayl", 17 | "Go back" : "Tuɣalin", 18 | "Close" : "Mdel", 19 | "Tags" : "Tibzimin", 20 | "Delete task" : "Kkes tawuri", 21 | "Details" : "Talqayt" 22 | }, 23 | "nplurals=2; plural=(n != 1);"); 24 | -------------------------------------------------------------------------------- /phpunit.integration.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | ./lib 9 | 10 | 11 | 12 | 13 | 14 | 15 | ./tests/php/integration 16 | 17 | 18 | -------------------------------------------------------------------------------- /vite.config.mjs: -------------------------------------------------------------------------------- 1 | import { createAppConfig } from '@nextcloud/vite-config' 2 | import { resolve } from 'node:path' 3 | 4 | export default createAppConfig({ 5 | main: 'src/main.js', 6 | dashboard: 'src/dashboard.js', 7 | talk: 'src/talk.js', 8 | }, { 9 | config: { 10 | test: { 11 | coverage: { 12 | include: ['src/**'], 13 | provider: 'istanbul', 14 | reporter: ['lcov', 'text'], 15 | }, 16 | environment: 'happy-dom', 17 | setupFiles: resolve(__dirname, './tests/javascript/unit/setup.js'), 18 | server: { 19 | deps: { 20 | inline: ['@nextcloud/vue', '@nextcloud/dialogs'], 21 | } 22 | }, 23 | }, 24 | } 25 | }) 26 | -------------------------------------------------------------------------------- /l10n/gd.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Today" : "An-diugh", 3 | "Current" : "Làithreach", 4 | "Completed" : "Coileanta", 5 | "Edit" : "Deasaich", 6 | "Delete" : "Sguab às", 7 | "Unshare" : "Na co-roinn tuilleadh", 8 | "Empty trash bin" : "Falamhaich an sgudal", 9 | "Name" : "Ainm", 10 | "Deleted" : "Chaidh a sguabadh às", 11 | "Cancel" : "Sguir dheth", 12 | "Email" : "Post-d", 13 | "Close" : "Dùin", 14 | "Tags" : "Tagaichean", 15 | "Details" : "Mion-fhiosrachadh", 16 | "Notes" : "Nòtaichean" 17 | },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" 18 | } -------------------------------------------------------------------------------- /l10n/gd.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Today" : "An-diugh", 5 | "Current" : "Làithreach", 6 | "Completed" : "Coileanta", 7 | "Edit" : "Deasaich", 8 | "Delete" : "Sguab às", 9 | "Unshare" : "Na co-roinn tuilleadh", 10 | "Empty trash bin" : "Falamhaich an sgudal", 11 | "Name" : "Ainm", 12 | "Deleted" : "Chaidh a sguabadh às", 13 | "Cancel" : "Sguir dheth", 14 | "Email" : "Post-d", 15 | "Close" : "Dùin", 16 | "Tags" : "Tagaichean", 17 | "Details" : "Mion-fhiosrachadh", 18 | "Notes" : "Nòtaichean" 19 | }, 20 | "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); 21 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "សំខាន់", 3 | "Today" : "ថ្ងៃ​នេះ", 4 | "Week" : "សប្ដាហ៍", 5 | "All" : "ទាំងអស់", 6 | "Tasks" : "ភារកិច្ច", 7 | "Can edit" : "Can edit", 8 | "Edit" : "កែប្រែ", 9 | "Export" : "នាំចេញ", 10 | "Delete" : "លុប", 11 | "Unshare" : "លែង​ចែក​រំលែក", 12 | "Name" : "ឈ្មោះ", 13 | "Deleted" : "បាន​លុប", 14 | "Restore" : "ស្ដារ​មក​វិញ", 15 | "Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍", 16 | "Cancel" : "បោះបង់", 17 | "Email" : "អ៊ីមែល", 18 | "Close" : "បិទ", 19 | "Tags" : "ស្លាក", 20 | "Details" : "ព័ត៌មាន​លម្អិត", 21 | "Notes" : "កំណត់​ចំណាំ" 22 | },"pluralForm" :"nplurals=1; plural=0;" 23 | } -------------------------------------------------------------------------------- /l10n/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Važno", 3 | "Today" : "Danas", 4 | "Week" : "Sedmica", 5 | "All" : "Svi", 6 | "Current" : "Trenutno", 7 | "Completed" : "Zavrženo", 8 | "Tasks" : "Zadaci", 9 | "Can edit" : "Can edit", 10 | "Edit" : "Izmjeni", 11 | "Export" : "Izvezi", 12 | "Delete" : "Obriši", 13 | "Unshare" : "Prestani dijeliti", 14 | "Name" : "Ime", 15 | "Restore" : "Obnovi", 16 | "Cancel" : "Odustani", 17 | "Email" : "E-pošta", 18 | "Close" : "Zatvori", 19 | "Tomorrow" : "Sutra", 20 | "Notes" : "Notes" 21 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 22 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "សំខាន់", 5 | "Today" : "ថ្ងៃ​នេះ", 6 | "Week" : "សប្ដាហ៍", 7 | "All" : "ទាំងអស់", 8 | "Tasks" : "ភារកិច្ច", 9 | "Can edit" : "Can edit", 10 | "Edit" : "កែប្រែ", 11 | "Export" : "នាំចេញ", 12 | "Delete" : "លុប", 13 | "Unshare" : "លែង​ចែក​រំលែក", 14 | "Name" : "ឈ្មោះ", 15 | "Deleted" : "បាន​លុប", 16 | "Restore" : "ស្ដារ​មក​វិញ", 17 | "Delete permanently" : "លុប​ជា​អចិន្ត្រៃយ៍", 18 | "Cancel" : "បោះបង់", 19 | "Email" : "អ៊ីមែល", 20 | "Close" : "បិទ", 21 | "Tags" : "ស្លាក", 22 | "Details" : "ព័ត៌មាន​លម្អិត", 23 | "Notes" : "កំណត់​ចំណាំ" 24 | }, 25 | "nplurals=1; plural=0;"); 26 | -------------------------------------------------------------------------------- /l10n/sr@latin.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Today" : "Today", 3 | "All" : "Sve", 4 | "Current" : "Tekuće", 5 | "Completed" : "Završeno", 6 | "Can edit" : "Can edit", 7 | "Edit" : "Uredi", 8 | "Delete" : "Delete", 9 | "Unshare" : "Ukini deljenje", 10 | "Empty trash bin" : "Isprazni kantu", 11 | "Name" : "Ime", 12 | "Deleted" : "Obrisano", 13 | "Delete permanently" : "Obriši zauvek", 14 | "Cancel" : "Cancel", 15 | "Close" : "Zatvori", 16 | "Due date" : "Rok", 17 | "Tags" : "Oznake", 18 | "Details" : "Detalji", 19 | "Notes" : "Beleške" 20 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 21 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Važno", 5 | "Today" : "Danas", 6 | "Week" : "Sedmica", 7 | "All" : "Svi", 8 | "Current" : "Trenutno", 9 | "Completed" : "Zavrženo", 10 | "Tasks" : "Zadaci", 11 | "Can edit" : "Can edit", 12 | "Edit" : "Izmjeni", 13 | "Export" : "Izvezi", 14 | "Delete" : "Obriši", 15 | "Unshare" : "Prestani dijeliti", 16 | "Name" : "Ime", 17 | "Restore" : "Obnovi", 18 | "Cancel" : "Odustani", 19 | "Email" : "E-pošta", 20 | "Close" : "Zatvori", 21 | "Tomorrow" : "Sutra", 22 | "Notes" : "Notes" 23 | }, 24 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 25 | -------------------------------------------------------------------------------- /l10n/sr@latin.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Today" : "Today", 5 | "All" : "Sve", 6 | "Current" : "Tekuće", 7 | "Completed" : "Završeno", 8 | "Can edit" : "Can edit", 9 | "Edit" : "Uredi", 10 | "Delete" : "Delete", 11 | "Unshare" : "Ukini deljenje", 12 | "Empty trash bin" : "Isprazni kantu", 13 | "Name" : "Ime", 14 | "Deleted" : "Obrisano", 15 | "Delete permanently" : "Obriši zauvek", 16 | "Cancel" : "Cancel", 17 | "Close" : "Zatvori", 18 | "Due date" : "Rok", 19 | "Tags" : "Oznake", 20 | "Details" : "Detalji", 21 | "Notes" : "Beleške" 22 | }, 23 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 24 | -------------------------------------------------------------------------------- /l10n/hy.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Today" : "Այսօր", 3 | "Week" : "Շաբաթ", 4 | "Current" : "Ընթացիկ", 5 | "Completed" : "Ավարտվեց", 6 | "Share with users or groups" : "Կիսվել օգտատերերի կամ խմբերի հետ", 7 | "Can edit" : "Can edit", 8 | "Edit" : "Խմբագրել", 9 | "Export" : "Արտահանում", 10 | "Delete" : "Ջնջել", 11 | "Unshare" : "Չկիսվել", 12 | "Name" : "Անուն", 13 | "Deleted" : "Ջնջված", 14 | "Restore" : "Վերականգնել", 15 | "Delete permanently" : "Ջնջել ընդմիշտ", 16 | "Cancel" : "Չեղարկել", 17 | "Notification" : "Ծանուցում", 18 | "Email" : "Էլ․փոստ", 19 | "Close" : "Փակել", 20 | "Details" : "Մանրամասներ", 21 | "Notes" : "Notes" 22 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 23 | } -------------------------------------------------------------------------------- /l10n/hy.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Today" : "Այսօր", 5 | "Week" : "Շաբաթ", 6 | "Current" : "Ընթացիկ", 7 | "Completed" : "Ավարտվեց", 8 | "Share with users or groups" : "Կիսվել օգտատերերի կամ խմբերի հետ", 9 | "Can edit" : "Can edit", 10 | "Edit" : "Խմբագրել", 11 | "Export" : "Արտահանում", 12 | "Delete" : "Ջնջել", 13 | "Unshare" : "Չկիսվել", 14 | "Name" : "Անուն", 15 | "Deleted" : "Ջնջված", 16 | "Restore" : "Վերականգնել", 17 | "Delete permanently" : "Ջնջել ընդմիշտ", 18 | "Cancel" : "Չեղարկել", 19 | "Notification" : "Ծանուցում", 20 | "Email" : "Էլ․փոստ", 21 | "Close" : "Փակել", 22 | "Details" : "Մանրամասներ", 23 | "Notes" : "Notes" 24 | }, 25 | "nplurals=2; plural=(n != 1);"); 26 | -------------------------------------------------------------------------------- /l10n/ta.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "முக்கியமான ", 3 | "Today" : "இன்று", 4 | "Week" : "வாரம்", 5 | "All" : "எல்லாம்", 6 | "Tasks" : "கடமைகள்", 7 | "Can edit" : "Can edit", 8 | "Edit" : "தொகுக்க", 9 | "Copied" : "நகலெடுக்கப்பட்டது", 10 | "Cannot copy" : "நகலெடுக்க முடியாது", 11 | "Export" : "ஏற்றுமதி", 12 | "Delete" : "நீக்குக", 13 | "Unshare" : "பகிரப்படாதது", 14 | "Name" : "பெயர்", 15 | "Restore" : "மீட்டெடு", 16 | "Delete permanently" : "நிரந்தரமாக நீக்கவும்", 17 | "Cancel" : "இரத்து செய்க", 18 | "Email" : "மின்னஞ்சல்", 19 | "Close" : "மூடுக", 20 | "Tags" : "சீட்டுகள்", 21 | "Details" : "விவரங்கள்", 22 | "Notes" : "குறிப்புகள்" 23 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 24 | } -------------------------------------------------------------------------------- /l10n/ta.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "முக்கியமான ", 5 | "Today" : "இன்று", 6 | "Week" : "வாரம்", 7 | "All" : "எல்லாம்", 8 | "Tasks" : "கடமைகள்", 9 | "Can edit" : "Can edit", 10 | "Edit" : "தொகுக்க", 11 | "Copied" : "நகலெடுக்கப்பட்டது", 12 | "Cannot copy" : "நகலெடுக்க முடியாது", 13 | "Export" : "ஏற்றுமதி", 14 | "Delete" : "நீக்குக", 15 | "Unshare" : "பகிரப்படாதது", 16 | "Name" : "பெயர்", 17 | "Restore" : "மீட்டெடு", 18 | "Delete permanently" : "நிரந்தரமாக நீக்கவும்", 19 | "Cancel" : "இரத்து செய்க", 20 | "Email" : "மின்னஞ்சல்", 21 | "Close" : "மூடுக", 22 | "Tags" : "சீட்டுகள்", 23 | "Details" : "விவரங்கள்", 24 | "Notes" : "குறிப்புகள்" 25 | }, 26 | "nplurals=2; plural=(n != 1);"); 27 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Viktig", 3 | "Today" : "I dag", 4 | "Week" : "Veke", 5 | "All" : "Alle", 6 | "Current" : "Gjeldande", 7 | "Completed" : "Fullført", 8 | "Tasks" : "Oppgåver", 9 | "Can edit" : "Can edit", 10 | "Edit" : "Endra", 11 | "Export" : "Eksporter", 12 | "Delete" : "Slett", 13 | "Unshare" : "Fjern deling", 14 | "Empty trash bin" : "Tøm søppel korg", 15 | "Name" : "Namn", 16 | "Deleted" : "Sletta", 17 | "Restore" : "Gjenopprett", 18 | "Delete permanently" : "Slett for godt", 19 | "Cancel" : "Avbryt", 20 | "Email" : "Epost", 21 | "Close" : "Lukk", 22 | "Last modified" : "Siste endra", 23 | "Tags" : "Emneord", 24 | "When shared show full event" : "Når delt, vis heile hendinga", 25 | "When shared show only busy" : "Når delt, vis berre oppteken", 26 | "When shared hide this event" : "Når delt, gøym denne hendinga", 27 | "Details" : "Detaljar", 28 | "Notes" : "Notat", 29 | "An error occurred" : "Det oppstod ein feil" 30 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 31 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Viktig", 5 | "Today" : "I dag", 6 | "Week" : "Veke", 7 | "All" : "Alle", 8 | "Current" : "Gjeldande", 9 | "Completed" : "Fullført", 10 | "Tasks" : "Oppgåver", 11 | "Can edit" : "Can edit", 12 | "Edit" : "Endra", 13 | "Export" : "Eksporter", 14 | "Delete" : "Slett", 15 | "Unshare" : "Fjern deling", 16 | "Empty trash bin" : "Tøm søppel korg", 17 | "Name" : "Namn", 18 | "Deleted" : "Sletta", 19 | "Restore" : "Gjenopprett", 20 | "Delete permanently" : "Slett for godt", 21 | "Cancel" : "Avbryt", 22 | "Email" : "Epost", 23 | "Close" : "Lukk", 24 | "Last modified" : "Siste endra", 25 | "Tags" : "Emneord", 26 | "When shared show full event" : "Når delt, vis heile hendinga", 27 | "When shared show only busy" : "Når delt, vis berre oppteken", 28 | "When shared hide this event" : "Når delt, gøym denne hendinga", 29 | "Details" : "Detaljar", 30 | "Notes" : "Notat", 31 | "An error occurred" : "Det oppstod ein feil" 32 | }, 33 | "nplurals=2; plural=(n != 1);"); 34 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextcloud/tasks", 3 | "description": "Nextcloud Tasks", 4 | "type": "project", 5 | "license": "AGPL", 6 | "authors": [ 7 | { 8 | "name": "Bernhard Posselt", 9 | "email": "dev@bernhard-posselt.com" 10 | } 11 | ], 12 | "require": { 13 | "php": ">=8.1 <=8.4" 14 | }, 15 | "require-dev": { 16 | "nextcloud/coding-standard": "1.1.1", 17 | "phpunit/phpunit": "^9.5", 18 | "friendsofphp/php-cs-fixer": "3.42.0" 19 | }, 20 | "config": { 21 | "platform": { 22 | "php": "8.1" 23 | }, 24 | "optimize-autoloader": true, 25 | "classmap-authoritative": true 26 | }, 27 | "scripts": { 28 | "cs:check": "php-cs-fixer fix --dry-run --verbose", 29 | "cs:fix": "php-cs-fixer fix", 30 | "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l", 31 | "test:unit": "phpunit --configuration phpunit.xml --fail-on-warning", 32 | "test:integration": "phpunit --configuration phpunit.integration.xml --fail-on-warning" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/models/consts.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2020 Georg Ehrke 5 | * 6 | * @author Georg Ehrke 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | const COMPONENT_NAME_EVENT = 'VEVENT' 25 | const COMPONENT_NAME_JOURNAL = 'VJOURNAL' 26 | const COMPONENT_NAME_VTODO = 'VTODO' 27 | 28 | export { 29 | COMPONENT_NAME_EVENT, 30 | COMPONENT_NAME_JOURNAL, 31 | COMPONENT_NAME_VTODO, 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/lint-info-xml.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint info.xml 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-info-xml-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | xml-linters: 22 | runs-on: ubuntu-latest-low 23 | 24 | name: info.xml lint 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1 28 | 29 | - name: Download schema 30 | run: wget https://raw.githubusercontent.com/nextcloud/appstore/master/nextcloudappstore/api/v1/release/info.xsd 31 | 32 | - name: Lint info.xml 33 | uses: ChristophWurst/xmllint-action@36f2a302f84f8c83fceea0b9c59e1eb4a616d3c1 # v1.2 34 | with: 35 | xml-file: ./appinfo/info.xml 36 | xml-schema-file: ./info.xsd 37 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "গুরুত্বপূর্ণ", 3 | "Today" : "আজ", 4 | "Week" : "সপ্তাহ", 5 | "All" : "সবাই", 6 | "Current" : "বর্তমান", 7 | "Completed" : "সুসম্পন্ন", 8 | "Tasks" : "কর্ম", 9 | "Hidden" : "লুকনো", 10 | "Visible" : "দর্শনযোগ্য", 11 | "Automatic" : "স্বয়ংক্রিয়", 12 | "Visibility of Smart Collections" : "চটপট সংগ্রহের দর্শনযোগ্যতা", 13 | "Can edit" : "Can edit", 14 | "An empty name is not allowed." : "একটি শুন্য নাম গ্রহণযোগ্য নয়।", 15 | "Edit" : "সম্পাদনা", 16 | "Export" : "রপ্তানি", 17 | "Delete" : "মুছে", 18 | "Unshare" : "ভাগাভাগি বাতিল ", 19 | "Name" : "নাম", 20 | "Deleted" : "মুছে ফেলা", 21 | "Restore" : "ফিরিয়ে দাও", 22 | "Cancel" : "বাতিল", 23 | "Notification" : "নোটিফিকেশন ", 24 | "Email" : "ইমেইল", 25 | "Go back" : "ফিরে যাও", 26 | "Close" : "বন্ধ", 27 | "Tags" : "ট্যাগ", 28 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n সুসম্পন্ন কাজ","%n সুসম্পন্ন কাজ"], 29 | "Tomorrow" : "আগামীকাল", 30 | "Set start date" : "আরম্ভের তারিখ নির্ধারণ করুন", 31 | "Set due date" : "কার্যকারিতার তারিখ নির্ধারণ করুন", 32 | "Details" : "বিসতারিত", 33 | "Notes" : "নোট" 34 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 35 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "গুরুত্বপূর্ণ", 5 | "Today" : "আজ", 6 | "Week" : "সপ্তাহ", 7 | "All" : "সবাই", 8 | "Current" : "বর্তমান", 9 | "Completed" : "সুসম্পন্ন", 10 | "Tasks" : "কর্ম", 11 | "Hidden" : "লুকনো", 12 | "Visible" : "দর্শনযোগ্য", 13 | "Automatic" : "স্বয়ংক্রিয়", 14 | "Visibility of Smart Collections" : "চটপট সংগ্রহের দর্শনযোগ্যতা", 15 | "Can edit" : "Can edit", 16 | "An empty name is not allowed." : "একটি শুন্য নাম গ্রহণযোগ্য নয়।", 17 | "Edit" : "সম্পাদনা", 18 | "Export" : "রপ্তানি", 19 | "Delete" : "মুছে", 20 | "Unshare" : "ভাগাভাগি বাতিল ", 21 | "Name" : "নাম", 22 | "Deleted" : "মুছে ফেলা", 23 | "Restore" : "ফিরিয়ে দাও", 24 | "Cancel" : "বাতিল", 25 | "Notification" : "নোটিফিকেশন ", 26 | "Email" : "ইমেইল", 27 | "Go back" : "ফিরে যাও", 28 | "Close" : "বন্ধ", 29 | "Tags" : "ট্যাগ", 30 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n সুসম্পন্ন কাজ","%n সুসম্পন্ন কাজ"], 31 | "Tomorrow" : "আগামীকাল", 32 | "Set start date" : "আরম্ভের তারিখ নির্ধারণ করুন", 33 | "Set due date" : "কার্যকারিতার তারিখ নির্ধারণ করুন", 34 | "Details" : "বিসতারিত", 35 | "Notes" : "নোট" 36 | }, 37 | "nplurals=2; plural=(n != 1);"); 38 | -------------------------------------------------------------------------------- /src/dashboard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2021 Jakob Röhrl 5 | * 6 | * @author Jakob Röhrl 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | import Dashboard from './views/Dashboard.vue' 26 | import store from './store/store.js' 27 | 28 | import { createApp } from 'vue' 29 | 30 | document.addEventListener('DOMContentLoaded', () => { 31 | OCA.Dashboard.register('tasks', (el) => { 32 | const item = createApp(Dashboard) 33 | .use(store) 34 | .mount(el) 35 | return item 36 | }) 37 | }) 38 | -------------------------------------------------------------------------------- /src/utils/url.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2021 Richard Steinmetz 5 | * 6 | * @author Richard Steinmetz 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | /** 26 | * Works like urldecode() from php 27 | * 28 | * @see https://www.php.net/manual/en/function.urldecode.php 29 | * @param {string} url The url to be decoded 30 | * @return {string} The decoded url 31 | */ 32 | export function urldecode(url) { 33 | return decodeURIComponent(url.replace(/\+/g, ' ')) 34 | } 35 | -------------------------------------------------------------------------------- /src/services/requests.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author Raimund Schlüßler 5 | * 6 | * @copyright 2018 Raimund Schlüßler 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 'use strict' 23 | 24 | import Axios from '@nextcloud/axios' 25 | 26 | export default { 27 | get(url) { 28 | return Axios.get(url) 29 | .then((response) => Promise.resolve(response)) 30 | .catch((error) => Promise.reject(error)) 31 | }, 32 | post(url, data) { 33 | return Axios.post(url, data) 34 | .then((response) => Promise.resolve(response)) 35 | .catch((error) => Promise.reject(error)) 36 | }, 37 | } 38 | -------------------------------------------------------------------------------- /src/views/AppContent/Collections.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | 26 | 46 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Today" : "өнөөдөр", 3 | "Week" : "Долоо хоног", 4 | "All" : "бүх", 5 | "Current" : "Одоогийн", 6 | "Completed" : "Гүйцэтгэгдсэн", 7 | "Tasks" : "Даалгавар", 8 | "Hidden" : "Далд", 9 | "Share with users or groups" : "Бусад хэрэглэгч, бүлэгт хуваалцах", 10 | "Can edit" : "Can edit", 11 | "Edit" : "засварлах", 12 | "Copied" : "Хуулагдсан", 13 | "Cannot copy" : "Хуулагдаагүй", 14 | "Export" : "Экспорт", 15 | "Delete" : "устгах", 16 | "Unshare" : "Түгээлтийг зогсоох", 17 | "Name" : "Нэр", 18 | "Deleted" : "Устгагдсан", 19 | "Restore" : "Сэргээх", 20 | "Delete permanently" : "бүр мөсөн устгах", 21 | "Cancel" : "цуцлах", 22 | "Go back" : "Буцах", 23 | "Close" : "Хаах", 24 | "Select tags to filter by" : "Хайлт хийх tag-үүдийг сонгоно уу", 25 | "Last modified" : "Сүүлд өөрчилсөн", 26 | "Tags" : "Tag-үүд", 27 | "Tomorrow" : "маргааш", 28 | "When shared show full event" : "Түгээсэн тохиолдолд үйл явдлыг бүтнээр нь харуул", 29 | "When shared show only busy" : "Түгээсэн тохиолдолд зөвхөн завгүй гэж харуул", 30 | "When shared hide this event" : "Түгээсэн тохиолдолд энэ үйл явдлыг нуу", 31 | "Details" : "Дэлгэрэнгүй", 32 | "Notes" : "Шинэ " 33 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 34 | } -------------------------------------------------------------------------------- /src/store/store.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author Raimund Schlüßler 5 | * 6 | * @copyright 2018 Raimund Schlüßler 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 'use strict' 23 | 24 | import calendars from './calendars.js' 25 | import collections from './collections.js' 26 | import tasks from './tasks.js' 27 | import settings from './settings.js' 28 | import principals from './principals.js' 29 | 30 | import { createStore } from 'vuex' 31 | 32 | export default createStore({ 33 | modules: { 34 | calendars, 35 | collections, 36 | tasks, 37 | settings, 38 | principals, 39 | }, 40 | }) 41 | -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Today" : "өнөөдөр", 5 | "Week" : "Долоо хоног", 6 | "All" : "бүх", 7 | "Current" : "Одоогийн", 8 | "Completed" : "Гүйцэтгэгдсэн", 9 | "Tasks" : "Даалгавар", 10 | "Hidden" : "Далд", 11 | "Share with users or groups" : "Бусад хэрэглэгч, бүлэгт хуваалцах", 12 | "Can edit" : "Can edit", 13 | "Edit" : "засварлах", 14 | "Copied" : "Хуулагдсан", 15 | "Cannot copy" : "Хуулагдаагүй", 16 | "Export" : "Экспорт", 17 | "Delete" : "устгах", 18 | "Unshare" : "Түгээлтийг зогсоох", 19 | "Name" : "Нэр", 20 | "Deleted" : "Устгагдсан", 21 | "Restore" : "Сэргээх", 22 | "Delete permanently" : "бүр мөсөн устгах", 23 | "Cancel" : "цуцлах", 24 | "Go back" : "Буцах", 25 | "Close" : "Хаах", 26 | "Select tags to filter by" : "Хайлт хийх tag-үүдийг сонгоно уу", 27 | "Last modified" : "Сүүлд өөрчилсөн", 28 | "Tags" : "Tag-үүд", 29 | "Tomorrow" : "маргааш", 30 | "When shared show full event" : "Түгээсэн тохиолдолд үйл явдлыг бүтнээр нь харуул", 31 | "When shared show only busy" : "Түгээсэн тохиолдолд зөвхөн завгүй гэж харуул", 32 | "When shared hide this event" : "Түгээсэн тохиолдолд энэ үйл явдлыг нуу", 33 | "Details" : "Дэлгэрэнгүй", 34 | "Notes" : "Шинэ " 35 | }, 36 | "nplurals=2; plural=(n != 1);"); 37 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Vacib", 3 | "Today" : "Bu gün", 4 | "Week" : "Həftə", 5 | "All" : "Hamısı", 6 | "Current" : "Mövcud", 7 | "Completed" : "Bitmişdir", 8 | "Tasks" : "Tapşırıqlar", 9 | "Hidden" : "Gizli", 10 | "Visible" : "Görünən", 11 | "Automatic" : "Avtomatik", 12 | "Visibility of Smart Collections" : "Ağıllı yiğımların görünməsi", 13 | "Can edit" : "Can edit", 14 | "An empty name is not allowed." : "Boş ada izin verilmir.", 15 | "Edit" : "Dəyişiklik et", 16 | "Export" : "Çıxarış", 17 | "Delete" : "Sil", 18 | "Unshare" : "Paylaşımı durdur", 19 | "Name" : "Ad", 20 | "Deleted" : "Silinib", 21 | "Restore" : "Geri qaytar", 22 | "Delete permanently" : "Həmişəlik sil", 23 | "Cancel" : "Dayandır", 24 | "Email" : "Email", 25 | "Close" : "Bağla", 26 | "Priority" : "Prioritet", 27 | "Tags" : "Işarələr", 28 | "Manually" : "Əl ilə", 29 | "_%n Completed Task_::_%n Completed Tasks_" : ["\"%s\" Bitmiş Tapşırıqlar","Completed Tasks"], 30 | "Tomorrow" : "Sabah", 31 | "Task not found!" : "Tapşırıq tapılmadı!", 32 | "Set start date" : "Başlanğıc tarixini işə sal", 33 | "Set due date" : "Vaxtı təyin et", 34 | "Details" : "Detallar", 35 | "Notes" : "Qeydlər" 36 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 37 | } -------------------------------------------------------------------------------- /tests/php/unit/Controller/PageControllerTest.php: -------------------------------------------------------------------------------- 1 | 9 | * @copyright Hendrik Leppelsack 2015 10 | */ 11 | 12 | namespace OCA\Tasks\Controller; 13 | 14 | use OCA\Tasks\Service\SettingsService; 15 | use OCP\AppFramework\Http\TemplateResponse; 16 | use PHPUnit\Framework\TestCase as Base; 17 | 18 | class PageControllerTest extends Base { 19 | private $controller; 20 | 21 | public function setUp(): void { 22 | $request = $this->getMockBuilder('OCP\IRequest')->getMock(); 23 | $settingsService = $this->getMockBuilder(SettingsService::class) 24 | ->disableOriginalConstructor() 25 | ->getMock(); 26 | $initialStateService = $this->getMockBuilder('OCP\IInitialStateService')->getMock(); 27 | 28 | $this->controller = new PageController( 29 | 'tasks', 30 | $request, 31 | $settingsService, 32 | $initialStateService 33 | ); 34 | } 35 | 36 | 37 | public function testIndex() { 38 | $result = $this->controller->index(); 39 | 40 | $this->assertEquals('main', $result->getTemplateName()); 41 | $this->assertEquals('user', $result->getRenderAs()); 42 | $this->assertTrue($result instanceof TemplateResponse); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Vacib", 5 | "Today" : "Bu gün", 6 | "Week" : "Həftə", 7 | "All" : "Hamısı", 8 | "Current" : "Mövcud", 9 | "Completed" : "Bitmişdir", 10 | "Tasks" : "Tapşırıqlar", 11 | "Hidden" : "Gizli", 12 | "Visible" : "Görünən", 13 | "Automatic" : "Avtomatik", 14 | "Visibility of Smart Collections" : "Ağıllı yiğımların görünməsi", 15 | "Can edit" : "Can edit", 16 | "An empty name is not allowed." : "Boş ada izin verilmir.", 17 | "Edit" : "Dəyişiklik et", 18 | "Export" : "Çıxarış", 19 | "Delete" : "Sil", 20 | "Unshare" : "Paylaşımı durdur", 21 | "Name" : "Ad", 22 | "Deleted" : "Silinib", 23 | "Restore" : "Geri qaytar", 24 | "Delete permanently" : "Həmişəlik sil", 25 | "Cancel" : "Dayandır", 26 | "Email" : "Email", 27 | "Close" : "Bağla", 28 | "Priority" : "Prioritet", 29 | "Tags" : "Işarələr", 30 | "Manually" : "Əl ilə", 31 | "_%n Completed Task_::_%n Completed Tasks_" : ["\"%s\" Bitmiş Tapşırıqlar","Completed Tasks"], 32 | "Tomorrow" : "Sabah", 33 | "Task not found!" : "Tapşırıq tapılmadı!", 34 | "Set start date" : "Başlanğıc tarixini işə sal", 35 | "Set due date" : "Vaxtı təyin et", 36 | "Details" : "Detallar", 37 | "Notes" : "Qeydlər" 38 | }, 39 | "nplurals=2; plural=(n != 1);"); 40 | -------------------------------------------------------------------------------- /src/models/syncStatus.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author John Molakvoæ 5 | * 6 | * @copyright 2018 John Molakvoæ 7 | * 8 | * @author Raimund Schlüßler 9 | * 10 | * @copyright 2021 Raimund Schlüßler 11 | * 12 | * This library is free software; you can redistribute it and/or 13 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 14 | * License as published by the Free Software Foundation; either 15 | * version 3 of the License, or any later version. 16 | * 17 | * This library is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 21 | * 22 | * You should have received a copy of the GNU Affero General Public 23 | * License along with this library. If not, see . 24 | * 25 | */ 26 | 27 | export default class SyncStatus { 28 | 29 | /** 30 | * Creates an instance of a SyncStatus 31 | * 32 | * @param {string} status The type of the status 33 | * @param {string} message The message to show 34 | * @memberof SyncStatus 35 | */ 36 | constructor(status, message) { 37 | this.status = status 38 | this.message = message 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/utils/router.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author Georg Ehrke 5 | * 6 | * @copyright Copyright (c) 2020 Georg Ehrke 7 | * 8 | * @author Raimund Schlüßler 9 | * 10 | * @copyright 2020 Raimund Schlüßler 11 | * 12 | * @license AGPL-3.0-or-later 13 | * 14 | * This program is free software: you can redistribute it and/or modify 15 | * it under the terms of the GNU Affero General Public License as 16 | * published by the Free Software Foundation, either version 3 of the 17 | * License, or (at your option) any later version. 18 | * 19 | * This program is distributed in the hope that it will be useful, 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | * GNU Affero General Public License for more details. 23 | * 24 | * You should have received a copy of the GNU Affero General Public License 25 | * along with this program. If not, see . 26 | * 27 | */ 28 | 29 | import { loadState } from '@nextcloud/initial-state' 30 | 31 | /** 32 | * Gets the initial route 33 | * 34 | * @return {string} 35 | */ 36 | export function getInitialRoute() { 37 | try { 38 | return loadState('tasks', 'initialRoute') 39 | } catch (error) { 40 | return '/collections/all' 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Controller/Response.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\Controller; 24 | 25 | use \Closure; 26 | use \OCP\AppFramework\Http\JSONResponse; 27 | 28 | trait Response { 29 | protected function generateResponse(Closure $callback) { 30 | try { 31 | $message = [ 32 | 'status' => 'success', 33 | 'data' => $callback(), 34 | 'message' => null 35 | ]; 36 | } catch (\Exception $e) { 37 | $message = [ 38 | 'status' => 'error', 39 | 'data' => null, 40 | 'message' => $e->getMessage() 41 | ]; 42 | } 43 | return new JSONResponse($message); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/php/integration/AppInfo/ApplicationTest.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * @author Raimund Schlüßler 9 | * @copyright 2019 Raimund Schlüßler 10 | * 11 | * This library is free software; you can redistribute it and/or 12 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 13 | * License as published by the Free Software Foundation; either 14 | * version 3 of the License, or any later version. 15 | * 16 | * This library is distributed in the hope that it will be useful, 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 20 | * 21 | * You should have received a copy of the GNU Affero General Public 22 | * License along with this library. If not, see . 23 | * 24 | */ 25 | 26 | use PHPUnit\Framework\TestCase; 27 | 28 | class AppTest extends TestCase { 29 | private $container; 30 | private $app; 31 | 32 | public function setUp(): void { 33 | parent::setUp(); 34 | $this->app = new \OCA\Tasks\AppInfo\Application(); 35 | $this->container = $this->app->getContainer(); 36 | } 37 | 38 | public function testAppInstalled() { 39 | $appManager = $this->container->query('OCP\App\IAppManager'); 40 | $this->assertTrue($appManager->isInstalled('tasks')); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/views/AppContent/task-list.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Since CSS variables can't be used in media queries (yet, see e.g. 3 | * https://stackoverflow.com/questions/40722882/css-native-variables-not-working-in-media-queries), 4 | * and var(--breakpoint-mobile) can be used with server v25 upwards only anyway, 5 | * we have to redefine the value here. 6 | */ 7 | $breakpoint-mobile: 1024px; 8 | 9 | .app-content .task-list { 10 | width: 100%; 11 | padding: 0 calc(2 * var(--default-grid-baseline)); 12 | 13 | @media only screen and (max-width: $breakpoint-mobile) { 14 | padding: 0; 15 | } 16 | 17 | .grouped-tasks { 18 | position: relative; 19 | padding-top: 2px; 20 | 21 | > ol { 22 | filter: drop-shadow(0 0 1px var(--color-box-shadow)); 23 | z-index: 1; 24 | 25 | &:hover { 26 | z-index: 10; 27 | } 28 | 29 | &.completed { 30 | margin-top: 12px; 31 | } 32 | } 33 | } 34 | 35 | .heading { 36 | display: flex; 37 | align-items: center; 38 | margin-top: 20px !important; 39 | 40 | @media only screen and (max-width: $breakpoint-mobile) { 41 | padding-left: 15px; 42 | } 43 | 44 | &__name { 45 | font-weight: bold; 46 | font-size: 16px; 47 | word-wrap: break-word; 48 | opacity: .5; 49 | white-space: nowrap; 50 | text-overflow: ellipsis; 51 | overflow: hidden; 52 | 53 | } 54 | 55 | &__icon-bullet { 56 | width: 14px; 57 | min-width: 14px; 58 | height: 14px; 59 | border: none; 60 | border-radius: 50%; 61 | margin-right: 8px; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/javascript/unit/utils/url.spec.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @copyright Copyright (c) 2021 Richard Steinmetz 3 | * 4 | * @author Richard Steinmetz 5 | * 6 | * @license AGPL-3.0-or-later 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU Affero General Public License as 10 | * published by the Free Software Foundation, either version 3 of the 11 | * License, or (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU Affero General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | import { urldecode } from '../../../../src/utils/url.js' 24 | 25 | import { describe, expect, it } from 'vitest' 26 | 27 | describe('utils/url test suite', () => { 28 | it('should decode urls encoded by php', () => { 29 | const testData = [ 30 | ['my+group+%2B%26%3F%25', 'my group +&?%'], 31 | ['my%2520+group', 'my%20 group'], 32 | ['group%20with%20spaces', 'group with spaces'], 33 | ] 34 | 35 | for (const [encoded, expected] of testData) { 36 | const decoded = urldecode(encoded) 37 | expect(decoded).toEqual(expected) 38 | } 39 | }) 40 | }) 41 | -------------------------------------------------------------------------------- /src/helpers/selector.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2021 Jakob Röhrl 5 | * 6 | * @author Julius Härtl 7 | * 8 | * @author Jakob Röhrl 9 | * 10 | * @license AGPL-3.0-or-later 11 | * 12 | * This program is free software: you can redistribute it and/or modify 13 | * it under the terms of the GNU Affero General Public License as 14 | * published by the Free Software Foundation, either version 3 of the 15 | * License, or (at your option) any later version. 16 | * 17 | * This program is distributed in the hope that it will be useful, 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | * GNU Affero General Public License for more details. 21 | * 22 | * You should have received a copy of the GNU Affero General Public License 23 | * along with this program. If not, see . 24 | * 25 | */ 26 | import store from '../store/store.js' 27 | 28 | import { createApp } from 'vue' 29 | 30 | const buildSelector = (selector, propsData = {}) => { 31 | return new Promise((resolve, reject) => { 32 | const container = document.createElement('div') 33 | document.getElementById('body-user').append(container) 34 | const dialog = createApp(selector, { 35 | ...propsData, 36 | onClose() { 37 | dialog.$el.remove() 38 | reject(new Error('Selection canceled')) 39 | }, 40 | }) 41 | .use(store) 42 | .mount(container) 43 | }) 44 | } 45 | 46 | export { 47 | buildSelector, 48 | } 49 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: "Code Scanning - Action" 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | CodeQL-Build: 8 | # CodeQL runs on ubuntu-latest, windows-latest, and macos-latest 9 | runs-on: ubuntu-latest 10 | 11 | permissions: 12 | # required for all workflows 13 | security-events: write 14 | 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v6.0.1 18 | 19 | # Initializes the CodeQL tools for scanning. 20 | - name: Initialize CodeQL 21 | uses: github/codeql-action/init@v4 22 | # Override language selection by uncommenting this and choosing your languages 23 | # with: 24 | # languages: go, javascript, csharp, python, cpp, java 25 | 26 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 27 | # If this step fails, then you should remove it and run the build manually (see below). 28 | - name: Autobuild 29 | uses: github/codeql-action/autobuild@v4 30 | 31 | # ℹ️ Command-line programs to run using the OS shell. 32 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 33 | 34 | # ✏️ If the Autobuild fails above, remove it and uncomment the following 35 | # three lines and modify them (or add more) to build your code if your 36 | # project uses a compiled language 37 | 38 | #- run: | 39 | # make bootstrap 40 | # make release 41 | 42 | - name: Perform CodeQL Analysis 43 | uses: github/codeql-action/analyze@v4 44 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Wichteg", 3 | "Today" : "Haut", 4 | "Week" : "Woch", 5 | "All" : "All", 6 | "Current" : "Aktuell", 7 | "Completed" : "Erfëllt", 8 | "Tasks" : "Tâchen", 9 | "Hidden" : "Verstoppt", 10 | "Visible" : "Visibel", 11 | "Automatic" : "Automatesch", 12 | "Share with users or groups" : "Mat Benotzer oder Gruppen deelen", 13 | "Can edit" : "Can edit", 14 | "An empty name is not allowed." : "En eidelen Numm ass net erlaabt.", 15 | "Edit" : "Änneren", 16 | "Export" : "Exportéieren", 17 | "Delete" : "Läschen", 18 | "Unshare" : "Net méi deelen", 19 | "Empty trash bin" : "Eidel Dreckskëscht", 20 | "Name" : "Numm", 21 | "Deleted" : "Geläscht", 22 | "Restore" : "Zrécksetzen", 23 | "Delete permanently" : "Permanent läschen", 24 | "Cancel" : "Ofbriechen", 25 | "Email" : "Email", 26 | "Go back" : "Zeréckgoen", 27 | "Close" : "Zoumaachen", 28 | "Tags" : "Tags", 29 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n erfëllt Aufgab","%n erfëllten Aufgaben"], 30 | "Tomorrow" : "Muer", 31 | "When shared show full event" : "Wann et gedeelt gouf, dann de ganzen Evenement uweisen", 32 | "When shared show only busy" : "Wann et gedeelt gouf, dann nëmmen als beschäftegt uweisen", 33 | "When shared hide this event" : "Wann et gedeelt gouf, dann verstopp dëst Evenement", 34 | "Task not found!" : "Tâche konnt net fonnt ginn!", 35 | "Set start date" : "Setz en Ufanks Datum fest", 36 | "Set due date" : "Datum setzen bis wéini et fälleg ass", 37 | "Details" : "Detailer", 38 | "Notes" : "Notizen" 39 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 40 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Wichteg", 5 | "Today" : "Haut", 6 | "Week" : "Woch", 7 | "All" : "All", 8 | "Current" : "Aktuell", 9 | "Completed" : "Erfëllt", 10 | "Tasks" : "Tâchen", 11 | "Hidden" : "Verstoppt", 12 | "Visible" : "Visibel", 13 | "Automatic" : "Automatesch", 14 | "Share with users or groups" : "Mat Benotzer oder Gruppen deelen", 15 | "Can edit" : "Can edit", 16 | "An empty name is not allowed." : "En eidelen Numm ass net erlaabt.", 17 | "Edit" : "Änneren", 18 | "Export" : "Exportéieren", 19 | "Delete" : "Läschen", 20 | "Unshare" : "Net méi deelen", 21 | "Empty trash bin" : "Eidel Dreckskëscht", 22 | "Name" : "Numm", 23 | "Deleted" : "Geläscht", 24 | "Restore" : "Zrécksetzen", 25 | "Delete permanently" : "Permanent läschen", 26 | "Cancel" : "Ofbriechen", 27 | "Email" : "Email", 28 | "Go back" : "Zeréckgoen", 29 | "Close" : "Zoumaachen", 30 | "Tags" : "Tags", 31 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n erfëllt Aufgab","%n erfëllten Aufgaben"], 32 | "Tomorrow" : "Muer", 33 | "When shared show full event" : "Wann et gedeelt gouf, dann de ganzen Evenement uweisen", 34 | "When shared show only busy" : "Wann et gedeelt gouf, dann nëmmen als beschäftegt uweisen", 35 | "When shared hide this event" : "Wann et gedeelt gouf, dann verstopp dëst Evenement", 36 | "Task not found!" : "Tâche konnt net fonnt ginn!", 37 | "Set start date" : "Setz en Ufanks Datum fest", 38 | "Set due date" : "Datum setzen bis wéini et fälleg ass", 39 | "Details" : "Detailer", 40 | "Notes" : "Notizen" 41 | }, 42 | "nplurals=2; plural=(n != 1);"); 43 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hodie", 4 | "Week" : "Septimana", 5 | "All" : "Tote", 6 | "Current" : "Actual", 7 | "Completed" : "Completate", 8 | "Hidden" : "Occultate", 9 | "Visible" : "Visibile", 10 | "Automatic" : "Automatic", 11 | "Visibility of Smart Collections" : "Visibilitate de Collectiones Intelligente", 12 | "Share with users or groups" : "Compartir con usatores o gruppos", 13 | "Can edit" : "Can edit", 14 | "An empty name is not allowed." : "Un nomine vacue non es permittite.", 15 | "Edit" : "Modificar", 16 | "Export" : "Exportar", 17 | "Delete" : "Deler", 18 | "Unshare" : "Cessa de compartir", 19 | "Name" : "Nomine", 20 | "Deleted" : "Delite", 21 | "Restore" : "Restaurar", 22 | "Delete permanently" : "Deler permanentemente", 23 | "Cancel" : "Cancellar", 24 | "Go back" : "Retornar", 25 | "Close" : "Clauder", 26 | "Select tags to filter by" : "Selectionar etiquettas a filtrar per", 27 | "Priority" : "Prioritate", 28 | "Alphabetically" : "Alphabeticamente", 29 | "Tags" : "Etiquettas", 30 | "Manually" : "Manualmente", 31 | "Change sort order" : "Cambiar ordine de classification", 32 | "Tomorrow" : "Deman", 33 | "When shared show full event" : "Quando compartite, monstrar evento integremente", 34 | "When shared show only busy" : "Quando compartite, monstrar solo si illo es occupate", 35 | "When shared hide this event" : "Quando compartite, celar iste evento", 36 | "Set start date" : "Assigna le data de initio", 37 | "Set due date" : "Assignar data debite", 38 | "Details" : "Detalios", 39 | "Notes" : "Notas" 40 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 41 | } -------------------------------------------------------------------------------- /.github/workflows/lint-php-cs.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint php-cs 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-php-cs-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | lint: 22 | runs-on: ubuntu-latest 23 | 24 | name: php-cs 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1 29 | 30 | - name: Get php version 31 | id: versions 32 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 33 | 34 | - name: Set up php${{ steps.versions.outputs.php-min }} 35 | uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0 36 | with: 37 | php-version: ${{ steps.versions.outputs.php-min }} 38 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 39 | coverage: none 40 | ini-file: development 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | 44 | - name: Install dependencies 45 | run: composer i 46 | 47 | - name: Lint 48 | run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 ) 49 | -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hodie", 6 | "Week" : "Septimana", 7 | "All" : "Tote", 8 | "Current" : "Actual", 9 | "Completed" : "Completate", 10 | "Hidden" : "Occultate", 11 | "Visible" : "Visibile", 12 | "Automatic" : "Automatic", 13 | "Visibility of Smart Collections" : "Visibilitate de Collectiones Intelligente", 14 | "Share with users or groups" : "Compartir con usatores o gruppos", 15 | "Can edit" : "Can edit", 16 | "An empty name is not allowed." : "Un nomine vacue non es permittite.", 17 | "Edit" : "Modificar", 18 | "Export" : "Exportar", 19 | "Delete" : "Deler", 20 | "Unshare" : "Cessa de compartir", 21 | "Name" : "Nomine", 22 | "Deleted" : "Delite", 23 | "Restore" : "Restaurar", 24 | "Delete permanently" : "Deler permanentemente", 25 | "Cancel" : "Cancellar", 26 | "Go back" : "Retornar", 27 | "Close" : "Clauder", 28 | "Select tags to filter by" : "Selectionar etiquettas a filtrar per", 29 | "Priority" : "Prioritate", 30 | "Alphabetically" : "Alphabeticamente", 31 | "Tags" : "Etiquettas", 32 | "Manually" : "Manualmente", 33 | "Change sort order" : "Cambiar ordine de classification", 34 | "Tomorrow" : "Deman", 35 | "When shared show full event" : "Quando compartite, monstrar evento integremente", 36 | "When shared show only busy" : "Quando compartite, monstrar solo si illo es occupate", 37 | "When shared hide this event" : "Quando compartite, celar iste evento", 38 | "Set start date" : "Assigna le data de initio", 39 | "Set due date" : "Assignar data debite", 40 | "Details" : "Detalios", 41 | "Notes" : "Notas" 42 | }, 43 | "nplurals=2; plural=(n != 1);"); 44 | -------------------------------------------------------------------------------- /lib/Controller/SettingsController.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\Controller; 24 | 25 | use \OCA\Tasks\Service\SettingsService; 26 | use \OCP\AppFramework\Controller; 27 | use \OCP\IRequest; 28 | 29 | class SettingsController extends Controller { 30 | /** 31 | * @var SettingsService 32 | */ 33 | private $settingsService; 34 | 35 | use Response; 36 | 37 | /** 38 | * @param string $appName 39 | * @param IRequest $request an instance of the request 40 | * @param SettingsService $settingsService 41 | */ 42 | public function __construct(string $appName, IRequest $request, SettingsService $settingsService) { 43 | parent::__construct($appName, $request); 44 | $this->settingsService = $settingsService; 45 | } 46 | 47 | /** 48 | * @NoAdminRequired 49 | */ 50 | public function set($setting, $value) { 51 | return $this->generateResponse(function () use ($setting, $value) { 52 | return $this->settingsService->set($setting, $value); 53 | }); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/components/TaskIcon.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 36 | 37 | 46 | 47 | 56 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Belangrik", 3 | "Today" : "Vandag", 4 | "Week" : "Week", 5 | "All" : "Alle", 6 | "Current" : "Huidige", 7 | "Completed" : "Voltooid", 8 | "Tasks" : "Take", 9 | "Hidden" : "Versteek", 10 | "Visible" : "Sigbaar", 11 | "Automatic" : "Outomaties", 12 | "Visibility of Smart Collections" : "Sigbaarheid van Slimversamelings", 13 | "Share with users or groups" : "Deel met gebruikers of groepe", 14 | "No users or groups" : "Geen gebruikers of groepe", 15 | "Can edit" : "Kan redigeer", 16 | "An empty name is not allowed." : "’n Leë naam word nie toegestaan nie.", 17 | "Edit" : "Wysig", 18 | "Copied" : "Gekopieer", 19 | "Export" : "Voer uit", 20 | "Delete" : "Skrap", 21 | "Unshare" : "Ontdeel", 22 | "Name" : "Naam", 23 | "Deleted" : "Geskrap", 24 | "Restore" : "Herstel", 25 | "Delete permanently" : "Skrap permanent", 26 | "Cancel" : "Kanselleer", 27 | "Go back" : "Gaan terug", 28 | "Close" : "Sluit", 29 | "Start date" : "Begindatum", 30 | "Due date" : "Sperdatum", 31 | "Last modified" : "Laas gewysig", 32 | "Priority" : "Prioriteit", 33 | "Alphabetically" : "Alfabeties", 34 | "Tags" : "Etikette", 35 | "Manually" : "Handmatig", 36 | "Change sort order" : "Verander sorteer volgorde", 37 | "Task is completed" : "Taak is voltooid", 38 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Voltooide taak","%n Voltooide take"], 39 | "Tomorrow" : "Môre", 40 | "Task not found!" : "Taak nie gevind!", 41 | "Set start date" : "Stel begindatum", 42 | "Set due date" : "Stel sperdatum", 43 | "All day" : "Heeldag", 44 | "Details" : "Besonderhede", 45 | "Notes" : "Notas", 46 | "An error occurred" : "'n Fout het voorgekom" 47 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 48 | } -------------------------------------------------------------------------------- /src/services/cdav.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2018 John Molakvoæ 5 | * 6 | * @author John Molakvoæ 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | import DavClient from '@nextcloud/cdav-library' 26 | import { generateRemoteUrl } from '@nextcloud/router' 27 | 28 | /** 29 | * Function to create an XML http request with the correct 30 | * headers 31 | * 32 | * @return {object} the XML http request 33 | */ 34 | function xhrProvider() { 35 | const headers = { 36 | 'X-Requested-With': 'XMLHttpRequest', 37 | requesttoken: OC.requestToken, 38 | } 39 | const xhr = new XMLHttpRequest() 40 | const oldOpen = xhr.open 41 | 42 | // override open() method to add headers 43 | xhr.open = function() { 44 | const result = oldOpen.apply(this, arguments) 45 | for (const name in headers) { 46 | xhr.setRequestHeader(name, headers[name]) 47 | } 48 | return result 49 | } 50 | OC.registerXHRForErrorProcessing(xhr) 51 | return xhr 52 | } 53 | 54 | export default new DavClient({ 55 | rootUrl: generateRemoteUrl('dav'), 56 | }, xhrProvider) 57 | -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Belangrik", 5 | "Today" : "Vandag", 6 | "Week" : "Week", 7 | "All" : "Alle", 8 | "Current" : "Huidige", 9 | "Completed" : "Voltooid", 10 | "Tasks" : "Take", 11 | "Hidden" : "Versteek", 12 | "Visible" : "Sigbaar", 13 | "Automatic" : "Outomaties", 14 | "Visibility of Smart Collections" : "Sigbaarheid van Slimversamelings", 15 | "Share with users or groups" : "Deel met gebruikers of groepe", 16 | "No users or groups" : "Geen gebruikers of groepe", 17 | "Can edit" : "Kan redigeer", 18 | "An empty name is not allowed." : "’n Leë naam word nie toegestaan nie.", 19 | "Edit" : "Wysig", 20 | "Copied" : "Gekopieer", 21 | "Export" : "Voer uit", 22 | "Delete" : "Skrap", 23 | "Unshare" : "Ontdeel", 24 | "Name" : "Naam", 25 | "Deleted" : "Geskrap", 26 | "Restore" : "Herstel", 27 | "Delete permanently" : "Skrap permanent", 28 | "Cancel" : "Kanselleer", 29 | "Go back" : "Gaan terug", 30 | "Close" : "Sluit", 31 | "Start date" : "Begindatum", 32 | "Due date" : "Sperdatum", 33 | "Last modified" : "Laas gewysig", 34 | "Priority" : "Prioriteit", 35 | "Alphabetically" : "Alfabeties", 36 | "Tags" : "Etikette", 37 | "Manually" : "Handmatig", 38 | "Change sort order" : "Verander sorteer volgorde", 39 | "Task is completed" : "Taak is voltooid", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Voltooide taak","%n Voltooide take"], 41 | "Tomorrow" : "Môre", 42 | "Task not found!" : "Taak nie gevind!", 43 | "Set start date" : "Stel begindatum", 44 | "Set due date" : "Stel sperdatum", 45 | "All day" : "Heeldag", 46 | "Details" : "Besonderhede", 47 | "Notes" : "Notas", 48 | "An error occurred" : "'n Fout het voorgekom" 49 | }, 50 | "nplurals=2; plural=(n != 1);"); 51 | -------------------------------------------------------------------------------- /src/components/AppSidebar/Alarm/AlarmRelationDeletionModal.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 69 | 70 | 86 | -------------------------------------------------------------------------------- /src/mixins/openNewTask.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author Raimund Schlüßler 5 | * 6 | * @copyright 2023 Raimund Schlüßler 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | export default { 24 | methods: { 25 | async openNewTask(task) { 26 | // Only open the details view if there is enough space or if it is already open. 27 | if (this.$route.params !== undefined && (document.documentElement.clientWidth >= 768 || this.$route.params.taskId !== undefined)) { 28 | // Open the details view for the new task 29 | const calendarId = this.$route.params.calendarId 30 | const collectionId = this.$route.params.collectionId 31 | if (calendarId) { 32 | await this.$router.push({ name: 'calendarsTask', params: { calendarId, taskId: task.uri } }) 33 | } else if (collectionId) { 34 | if (collectionId === 'week') { 35 | await this.$router.push({ 36 | name: 'collectionsParamTask', 37 | params: { collectionId, taskId: task.uri, collectionParam: '0' }, 38 | }) 39 | } else { 40 | await this.$router.push({ name: 'collectionsTask', params: { collectionId, taskId: task.uri } }) 41 | } 42 | } 43 | } 44 | }, 45 | }, 46 | } 47 | -------------------------------------------------------------------------------- /lib/AppInfo/Application.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\AppInfo; 24 | 25 | use OCA\Tasks\Dashboard\TasksWidget; 26 | use OCA\Tasks\Listeners\BeforeTemplateRenderedListener; 27 | use OCP\AppFramework\App; 28 | use OCP\AppFramework\Bootstrap\IBootContext; 29 | use OCP\AppFramework\Bootstrap\IBootstrap; 30 | use OCP\AppFramework\Bootstrap\IRegistrationContext; 31 | use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; 32 | 33 | class Application extends App implements IBootstrap { 34 | /** @var string */ 35 | public const APP_ID = 'tasks'; 36 | 37 | /** 38 | * @param array $params 39 | */ 40 | public function __construct(array $params = []) { 41 | parent::__construct(self::APP_ID, $params); 42 | } 43 | 44 | public function register(IRegistrationContext $context): void { 45 | $context->registerDashboardWidget(TasksWidget::class); 46 | 47 | $context->registerEventListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class); 48 | } 49 | 50 | public function boot(IBootContext $context): void { 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "สำคัญ", 3 | "Today" : "วันนี้", 4 | "Week" : "สัปดาห์", 5 | "All" : "ทั้งหมด", 6 | "Current" : "ปัจจุบัน", 7 | "Completed" : "เสร็จแล้ว", 8 | "Tasks" : "งาน", 9 | "Hidden" : "ซ่อนอยู่", 10 | "Visible" : "มองเห็นได้", 11 | "Automatic" : "อัตโนมัติ", 12 | "Visibility of Smart Collections" : "การมองเห็นของสมาร์ทคอลเลกชัน", 13 | "Share with users or groups" : "แชร์กับผู้ใช้หรือกลุ่ม", 14 | "Can edit" : "สามารถแก้ไข", 15 | "An empty name is not allowed." : "ชื่อห้ามปล่อยว่าง", 16 | "Edit" : "แก้ไข", 17 | "Export" : "ส่งออก", 18 | "Delete" : "ลบ", 19 | "Unshare" : "เลิกแชร์", 20 | "Empty trash bin" : "ล้างข้อมูลในถังขยะ", 21 | "Name" : "ชื่อ", 22 | "Deleted" : "ลบแล้ว", 23 | "Restore" : "คืนค่า", 24 | "Delete permanently" : "ลบแบบถาวร", 25 | "Cancel" : "ยกเลิก", 26 | "Notification" : "การแจ้งเตือน", 27 | "Email" : "อีเมล", 28 | "Go back" : "กลับไป", 29 | "Close" : "ปิด", 30 | "Select tags to filter by" : "เลือกแท็กที่จะกรอง", 31 | "Start date" : "วันที่เริ่มต้น", 32 | "Due date" : "วันที่ครบกำหนด", 33 | "Priority" : "ลำดับความสำคัญ", 34 | "Alphabetically" : "เรียงตามตัวอักษร", 35 | "Tags" : "แท็ก", 36 | "Manually" : "ด้วยตนเอง", 37 | "Change sort order" : "เปลี่ยนการเรียงลำดับ", 38 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n งานที่เสร็จแล้ว"], 39 | "Tomorrow" : "พรุ่งนี้", 40 | "When shared show full event" : "เมื่อแชร์จะแสดงกิจกรรมเต็ม", 41 | "When shared show only busy" : "เมื่อแชร์จะแสดงเฉพาะไม่ว่าง", 42 | "When shared hide this event" : "เมื่อแชร์จะซ่อนกิจกรรมนี้", 43 | "Task not found!" : "ไม่พบงาน!", 44 | "Set start date" : "ตั้งวันที่เริ่มต้น", 45 | "Set due date" : "ตั้งวันที่ครบกำหนด", 46 | "Details" : "รายละเอียด", 47 | "Notes" : "โน้ต", 48 | "An error occurred" : "เกิดข้อผิดพลาด" 49 | },"pluralForm" :"nplurals=1; plural=0;" 50 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "สำคัญ", 5 | "Today" : "วันนี้", 6 | "Week" : "สัปดาห์", 7 | "All" : "ทั้งหมด", 8 | "Current" : "ปัจจุบัน", 9 | "Completed" : "เสร็จแล้ว", 10 | "Tasks" : "งาน", 11 | "Hidden" : "ซ่อนอยู่", 12 | "Visible" : "มองเห็นได้", 13 | "Automatic" : "อัตโนมัติ", 14 | "Visibility of Smart Collections" : "การมองเห็นของสมาร์ทคอลเลกชัน", 15 | "Share with users or groups" : "แชร์กับผู้ใช้หรือกลุ่ม", 16 | "Can edit" : "สามารถแก้ไข", 17 | "An empty name is not allowed." : "ชื่อห้ามปล่อยว่าง", 18 | "Edit" : "แก้ไข", 19 | "Export" : "ส่งออก", 20 | "Delete" : "ลบ", 21 | "Unshare" : "เลิกแชร์", 22 | "Empty trash bin" : "ล้างข้อมูลในถังขยะ", 23 | "Name" : "ชื่อ", 24 | "Deleted" : "ลบแล้ว", 25 | "Restore" : "คืนค่า", 26 | "Delete permanently" : "ลบแบบถาวร", 27 | "Cancel" : "ยกเลิก", 28 | "Notification" : "การแจ้งเตือน", 29 | "Email" : "อีเมล", 30 | "Go back" : "กลับไป", 31 | "Close" : "ปิด", 32 | "Select tags to filter by" : "เลือกแท็กที่จะกรอง", 33 | "Start date" : "วันที่เริ่มต้น", 34 | "Due date" : "วันที่ครบกำหนด", 35 | "Priority" : "ลำดับความสำคัญ", 36 | "Alphabetically" : "เรียงตามตัวอักษร", 37 | "Tags" : "แท็ก", 38 | "Manually" : "ด้วยตนเอง", 39 | "Change sort order" : "เปลี่ยนการเรียงลำดับ", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n งานที่เสร็จแล้ว"], 41 | "Tomorrow" : "พรุ่งนี้", 42 | "When shared show full event" : "เมื่อแชร์จะแสดงกิจกรรมเต็ม", 43 | "When shared show only busy" : "เมื่อแชร์จะแสดงเฉพาะไม่ว่าง", 44 | "When shared hide this event" : "เมื่อแชร์จะซ่อนกิจกรรมนี้", 45 | "Task not found!" : "ไม่พบงาน!", 46 | "Set start date" : "ตั้งวันที่เริ่มต้น", 47 | "Set due date" : "ตั้งวันที่ครบกำหนด", 48 | "Details" : "รายละเอียด", 49 | "Notes" : "โน้ต", 50 | "An error occurred" : "เกิดข้อผิดพลาด" 51 | }, 52 | "nplurals=1; plural=0;"); 53 | -------------------------------------------------------------------------------- /lib/Listeners/BeforeTemplateRenderedListener.php: -------------------------------------------------------------------------------- 1 | 4 | * 5 | * @author Julius Härtl 6 | * @author Jakob Röhrl 7 | * 8 | * @license GNU AGPL version 3 or any later version 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | declare(strict_types=1); 26 | 27 | 28 | namespace OCA\Tasks\Listeners; 29 | 30 | use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; 31 | use OCP\EventDispatcher\Event; 32 | use OCP\EventDispatcher\IEventListener; 33 | use OCP\IRequest; 34 | use OCP\Util; 35 | 36 | class BeforeTemplateRenderedListener implements IEventListener { 37 | private $request; 38 | 39 | public function __construct(IRequest $request) { 40 | $this->request = $request; 41 | } 42 | 43 | public function handle(Event $event): void { 44 | if (!($event instanceof BeforeTemplateRenderedEvent)) { 45 | return; 46 | } 47 | 48 | if (!$event->isLoggedIn()) { 49 | return; 50 | } 51 | 52 | $pathInfo = $this->request->getPathInfo(); 53 | if (strpos($pathInfo, '/call/') === 0 || strpos($pathInfo, '/apps/spreed') === 0) { 54 | Util::addScript('tasks', 'tasks-talk'); 55 | Util::addStyle('tasks', 'tasks-talk'); 56 | Util::addStyle('tasks', 'tasks-icon'); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/utils/crypto.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2019 Georg Ehrke 5 | * 6 | * @author Georg Ehrke 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | /** 26 | * Generates a random UUID v4. 27 | * 28 | * @return {string} 29 | */ 30 | export function randomUUID() { 31 | if (crypto?.randomUUID) { 32 | // Only available in secure contexts 33 | return crypto.randomUUID() 34 | } 35 | 36 | return insecureUuidV4() 37 | } 38 | 39 | /** 40 | * Generates a random UUID v4 from a weak, non-cryptographic random number generator. 41 | * Please use randomUUID() instead. 42 | * 43 | * Adapted from https://gist.github.com/scwood/3bff42cc005cc20ab7ec98f0d8e1d59d 44 | * Copyright 2018 Spencer Wood 45 | * 46 | * @return {string} 47 | */ 48 | function insecureUuidV4() { 49 | const uuid = new Array(36) 50 | for (let i = 0; i < 36; i++) { 51 | uuid[i] = Math.floor(Math.random() * 16) 52 | } 53 | uuid[14] = 4 // set bits 12-15 of time-high-and-version to 0100 54 | uuid[19] = uuid[19] &= ~(1 << 2) // set bit 6 of clock-seq-and-reserved to zero 55 | uuid[19] = uuid[19] |= (1 << 3) // set bit 7 of clock-seq-and-reserved to one 56 | uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-' 57 | return uuid.map((x) => x.toString(16)).join('') 58 | } 59 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: "Feature request" 2 | description: "You have a neat idea that should be implemented?" 3 | labels: ["enhancement", "0 - to triage"] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | ### 👍 Thanks for reporting issues back to Nextcloud! 9 | This is the issue tracker of Nextcloud, if you have any support question please check out [support](https://nextcloud.com/support) 10 | To make it possible for us to help you please fill out below information carefully. 11 | 12 | If you have any questions, head over to the [forums](https://help.nextcloud.com/c/apps/tasks). 13 | Note that Nextcloud is an open source project backed by Nextcloud GmbH. Most of our volunteers are home users and thus primarily care about issues that affect home users. Our paid engineers prioritize issues of our customers. If you are neither a home user nor a customer, consider paying somebody to implement the feature or enhancement you'd like, do it yourself or [become a customer](https://nextcloud.com/enterprise/). 14 | - type: textarea 15 | id: description-problem 16 | attributes: 17 | label: Is your feature request related to a problem? Please describe. 18 | description: | 19 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 20 | - type: textarea 21 | id: description-solution 22 | attributes: 23 | label: Describe the solution you'd like 24 | description: | 25 | A clear and concise description of what you want to happen. 26 | - type: textarea 27 | id: description-alternatives 28 | attributes: 29 | label: Describe alternatives you've considered 30 | description: | 31 | A clear and concise description of any alternative solutions or features you've considered. 32 | - type: textarea 33 | id: additional-context 34 | attributes: 35 | label: Additional context 36 | description: | 37 | Add any other context or screenshots about the feature request here. 38 | -------------------------------------------------------------------------------- /src/utils/color.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2019 Georg Ehrke 5 | * 6 | * @author Georg Ehrke 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | import { usernameToColor } from '@nextcloud/vue' 26 | import convert from 'color-convert' 27 | 28 | /** 29 | * Generates a hex color based on RGB string 30 | * 31 | * @param {string} uid The string to generate a color from 32 | * @return {string} The hex color 33 | */ 34 | export function uidToHexColor(uid) { 35 | const color = usernameToColor(uid) 36 | return '#' + convert.rgb.hex(color.r, color.g, color.b) 37 | } 38 | 39 | /** 40 | * Detects a color from a given string 41 | * 42 | * @param {string} color The color to get the real RGB hex string from 43 | * @return {string|boolean|*} String if color detected, boolean if not 44 | */ 45 | export function detectColor(color) { 46 | if (/^(#)((?:[A-Fa-f0-9]{3}){1,2})$/.test(color)) { // #ff00ff and #f0f 47 | return color 48 | } else if (/^((?:[A-Fa-f0-9]{3}){1,2})$/.test(color)) { // ff00ff and f0f 49 | return '#' + color 50 | } else if (/^(#)((?:[A-Fa-f0-9]{8}))$/.test(color)) { // #ff00ffff and #f0ff 51 | return color.slice(0, 7) 52 | } else if (/^((?:[A-Fa-f0-9]{8}))$/.test(color)) { // ff00ffff and f0ff 53 | return '#' + color.slice(0, 6) 54 | } 55 | 56 | return false 57 | 58 | } 59 | -------------------------------------------------------------------------------- /appinfo/info.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | tasks 5 | Tasks 6 | The Tasks app for Nextcloud 7 | 8 | 0.17.1 9 | agpl 10 | Raimund Schlüßler 11 | Tasks 12 | 13 | https://github.com/nextcloud/tasks#installation 14 | https://github.com/nextcloud/tasks#developer-setup-info 15 | 16 | office 17 | organization 18 | https://github.com/nextcloud/tasks/ 19 | https://github.com/nextcloud/tasks/issues 20 | https://github.com/nextcloud/tasks.git 21 | https://raw.githubusercontent.com/nextcloud/tasks/master/screenshots/tasks-1.png 22 | 23 | 24 | 25 | caldav 26 | 27 | 28 | 29 | tasks 30 | Tasks 31 | tasks.page.index 32 | tasks.svg 33 | 100 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /lib/Controller/CollectionsController.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\Controller; 24 | 25 | use \OCA\Tasks\Service\CollectionsService; 26 | use \OCP\AppFramework\Controller; 27 | use \OCP\IRequest; 28 | 29 | class CollectionsController extends Controller { 30 | /** 31 | * @var CollectionsService 32 | */ 33 | private $collectionsService; 34 | 35 | use Response; 36 | 37 | /** 38 | * @param string $appName 39 | * @param IRequest $request an instance of the request 40 | * @param CollectionsService $collectionsService 41 | */ 42 | public function __construct(string $appName, IRequest $request, CollectionsService $collectionsService) { 43 | parent::__construct($appName, $request); 44 | $this->collectionsService = $collectionsService; 45 | } 46 | 47 | /** 48 | * @NoAdminRequired 49 | */ 50 | public function getCollections() { 51 | return $this->generateResponse(function () { 52 | return ['collections' => $this->collectionsService->getAll()]; 53 | }); 54 | } 55 | 56 | /** 57 | * @NoAdminRequired 58 | */ 59 | public function setVisibility($collectionID, $visibility) { 60 | return $this->generateResponse(function () use ($collectionID, $visibility) { 61 | return $this->collectionsService->setVisibility($collectionID, $visibility); 62 | }); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /l10n/ka_GE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "აუცილებელი", 3 | "Today" : "დღეს", 4 | "Week" : "კვირა", 5 | "All" : "ყველა", 6 | "Current" : "ამჟამინდელი", 7 | "Completed" : "დასრულებული", 8 | "Tasks" : "დავალებები", 9 | "Hidden" : "უჩინარი", 10 | "Visible" : "ჩანს", 11 | "Automatic" : "ავტომატური", 12 | "Visibility of Smart Collections" : "ჭკვიანი კოლექციების ხილვადობა", 13 | "Share with users or groups" : "გაზიარება მოხმარებლებთან ან ჯგუფებთან", 14 | "Can edit" : "შეუძლია შეცვალოს", 15 | "An empty name is not allowed." : "ცარიელი სახელი არაა ნებადართული", 16 | "Edit" : "რედაქტირება", 17 | "Export" : "ექსპორტი", 18 | "Delete" : "წაშლა", 19 | "Unshare" : "გაზიარების შეწყვეტა", 20 | "Name" : "სახელი", 21 | "Deleted" : "გაუქმდა", 22 | "Restore" : "აღდგენა", 23 | "Delete permanently" : "სამუდამოდ წაშლა", 24 | "Cancel" : "უარყოფა", 25 | "Go back" : "უკან დაბრუნება", 26 | "Close" : "დახურვა", 27 | "Select tags to filter by" : "ფილტრაციისთვის აირჩიეთ ტეგები", 28 | "Start date" : "დაწყების თარიღი", 29 | "Due date" : "განპირობებულია თარიღისთვის", 30 | "Last modified" : "ბოლო ცვლილება", 31 | "Priority" : "პრიორიტეტი", 32 | "Alphabetically" : "ანბანის მიხედვით", 33 | "Tags" : "ტეგები", 34 | "Manually" : "ხელით", 35 | "Change sort order" : "განლაგების შეცვლა", 36 | "Task is completed" : "დავალება დასრულებულია", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n დასრულებული დავალება","%n დასრულებული დავალება"], 38 | "Tomorrow" : "ხვალ", 39 | "When shared show full event" : "როდესაც გაზიარებულია გამოჩნდეს სრული მოვლენა", 40 | "When shared show only busy" : "როდესაც გაზიარებულია გამოჩნდეს მხოლოდ დაკავებული", 41 | "When shared hide this event" : "როდესაც გაზიარებულია არ გამოჩნდეს ეს მოვლენა", 42 | "Task not found!" : "დაველბა ვერ იქნა ნაპოვნი!", 43 | "Set start date" : "საწყისი დრო", 44 | "Set due date" : "განპირობებულია თარიღისთვის", 45 | "All day" : "მთელი დღე", 46 | "Details" : "დეტალები", 47 | "Select tags" : "აირჩიეთ ტეგები", 48 | "Notes" : "ჩანაწერები" 49 | },"pluralForm" :"nplurals=2; plural=(n!=1);" 50 | } -------------------------------------------------------------------------------- /l10n/br.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Important", 3 | "Today" : "Hiziv", 4 | "Week" : "Sizun", 5 | "All" : "Pep tra", 6 | "Current" : "A red", 7 | "Completed" : "Achuet", 8 | "Hidden" : "Koachet", 9 | "Automatic" : "Otomatek", 10 | "Share with users or groups" : "Rannañ gant implijourienn pe strolladoù", 11 | "No users or groups" : "Implijourienn pe strodadoù ebet", 12 | "Can edit" : "Posuple eo embann", 13 | "Unshare with {displayName}" : "Dirannañ gant {displayName}", 14 | "Calendar link copied to clipboard." : "Liamm deizataer eilet d'ar golver", 15 | "Calendar link could not be copied to clipboard." : "Dibosup eo bet da eilañ al liamm deizataer er golver", 16 | "An error occurred, unable to delete the calendar." : "Ur fazi a zo bet, dibosupl lemel an deizataer.", 17 | "Edit" : "Cheñch", 18 | "Copy private link" : "Eilañ al liamm prevez", 19 | "Delete" : "Dilemel", 20 | "Unshare" : "Nag eskemm ken", 21 | "Empty trash bin" : "Pod-lastez goullo", 22 | "Name" : "Anv", 23 | "Deleted" : "Dilamet", 24 | "Restore" : "Adkrouiñ", 25 | "Delete permanently" : "Dilemel da viken", 26 | "Cancel" : "Nullañ", 27 | "Notification" : "Kemennadenn", 28 | "Email" : "Postel", 29 | "Close" : "Seriñ", 30 | "Alphabetically" : "Urzh alfabetek", 31 | "Tags" : "Klavioù", 32 | "[Yesterday]" : "[Dec'h]", 33 | "[Today]" : "[Hiziv]", 34 | "[Tomorrow]" : "[Warc'hoazh]", 35 | "Tomorrow" : "Warc'hoaz", 36 | "When shared show full event" : "Diskouez an darvoud a-bezh pa vez lodet", 37 | "When shared show only busy" : "Diskouez hepken ar re pres warno pa vez lodet", 38 | "When shared hide this event" : "Kuzhat an darvoud-mañ pa vez lodet", 39 | "Canceled" : "Nullet", 40 | "Details" : "Munudoù", 41 | "Notes" : "Notennoù" 42 | },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" 43 | } -------------------------------------------------------------------------------- /l10n/ka_GE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "აუცილებელი", 5 | "Today" : "დღეს", 6 | "Week" : "კვირა", 7 | "All" : "ყველა", 8 | "Current" : "ამჟამინდელი", 9 | "Completed" : "დასრულებული", 10 | "Tasks" : "დავალებები", 11 | "Hidden" : "უჩინარი", 12 | "Visible" : "ჩანს", 13 | "Automatic" : "ავტომატური", 14 | "Visibility of Smart Collections" : "ჭკვიანი კოლექციების ხილვადობა", 15 | "Share with users or groups" : "გაზიარება მოხმარებლებთან ან ჯგუფებთან", 16 | "Can edit" : "შეუძლია შეცვალოს", 17 | "An empty name is not allowed." : "ცარიელი სახელი არაა ნებადართული", 18 | "Edit" : "რედაქტირება", 19 | "Export" : "ექსპორტი", 20 | "Delete" : "წაშლა", 21 | "Unshare" : "გაზიარების შეწყვეტა", 22 | "Name" : "სახელი", 23 | "Deleted" : "გაუქმდა", 24 | "Restore" : "აღდგენა", 25 | "Delete permanently" : "სამუდამოდ წაშლა", 26 | "Cancel" : "უარყოფა", 27 | "Go back" : "უკან დაბრუნება", 28 | "Close" : "დახურვა", 29 | "Select tags to filter by" : "ფილტრაციისთვის აირჩიეთ ტეგები", 30 | "Start date" : "დაწყების თარიღი", 31 | "Due date" : "განპირობებულია თარიღისთვის", 32 | "Last modified" : "ბოლო ცვლილება", 33 | "Priority" : "პრიორიტეტი", 34 | "Alphabetically" : "ანბანის მიხედვით", 35 | "Tags" : "ტეგები", 36 | "Manually" : "ხელით", 37 | "Change sort order" : "განლაგების შეცვლა", 38 | "Task is completed" : "დავალება დასრულებულია", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n დასრულებული დავალება","%n დასრულებული დავალება"], 40 | "Tomorrow" : "ხვალ", 41 | "When shared show full event" : "როდესაც გაზიარებულია გამოჩნდეს სრული მოვლენა", 42 | "When shared show only busy" : "როდესაც გაზიარებულია გამოჩნდეს მხოლოდ დაკავებული", 43 | "When shared hide this event" : "როდესაც გაზიარებულია არ გამოჩნდეს ეს მოვლენა", 44 | "Task not found!" : "დაველბა ვერ იქნა ნაპოვნი!", 45 | "Set start date" : "საწყისი დრო", 46 | "Set due date" : "განპირობებულია თარიღისთვის", 47 | "All day" : "მთელი დღე", 48 | "Details" : "დეტალები", 49 | "Select tags" : "აირჩიეთ ტეგები", 50 | "Notes" : "ჩანაწერები" 51 | }, 52 | "nplurals=2; plural=(n!=1);"); 53 | -------------------------------------------------------------------------------- /l10n/br.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Important", 5 | "Today" : "Hiziv", 6 | "Week" : "Sizun", 7 | "All" : "Pep tra", 8 | "Current" : "A red", 9 | "Completed" : "Achuet", 10 | "Hidden" : "Koachet", 11 | "Automatic" : "Otomatek", 12 | "Share with users or groups" : "Rannañ gant implijourienn pe strolladoù", 13 | "No users or groups" : "Implijourienn pe strodadoù ebet", 14 | "Can edit" : "Posuple eo embann", 15 | "Unshare with {displayName}" : "Dirannañ gant {displayName}", 16 | "Calendar link copied to clipboard." : "Liamm deizataer eilet d'ar golver", 17 | "Calendar link could not be copied to clipboard." : "Dibosup eo bet da eilañ al liamm deizataer er golver", 18 | "An error occurred, unable to delete the calendar." : "Ur fazi a zo bet, dibosupl lemel an deizataer.", 19 | "Edit" : "Cheñch", 20 | "Copy private link" : "Eilañ al liamm prevez", 21 | "Delete" : "Dilemel", 22 | "Unshare" : "Nag eskemm ken", 23 | "Empty trash bin" : "Pod-lastez goullo", 24 | "Name" : "Anv", 25 | "Deleted" : "Dilamet", 26 | "Restore" : "Adkrouiñ", 27 | "Delete permanently" : "Dilemel da viken", 28 | "Cancel" : "Nullañ", 29 | "Notification" : "Kemennadenn", 30 | "Email" : "Postel", 31 | "Close" : "Seriñ", 32 | "Alphabetically" : "Urzh alfabetek", 33 | "Tags" : "Klavioù", 34 | "[Yesterday]" : "[Dec'h]", 35 | "[Today]" : "[Hiziv]", 36 | "[Tomorrow]" : "[Warc'hoazh]", 37 | "Tomorrow" : "Warc'hoaz", 38 | "When shared show full event" : "Diskouez an darvoud a-bezh pa vez lodet", 39 | "When shared show only busy" : "Diskouez hepken ar re pres warno pa vez lodet", 40 | "When shared hide this event" : "Kuzhat an darvoud-mañ pa vez lodet", 41 | "Canceled" : "Nullet", 42 | "Details" : "Munudoù", 43 | "Notes" : "Notennoù" 44 | }, 45 | "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); 46 | -------------------------------------------------------------------------------- /lib/Controller/PageController.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\Controller; 24 | 25 | use \OCA\Tasks\Service\SettingsService; 26 | use \OCP\AppFramework\Controller; 27 | use \OCP\AppFramework\Http\TemplateResponse; 28 | use \OCP\IInitialStateService; 29 | use \OCP\IRequest; 30 | 31 | /** 32 | * Controller class for main page. 33 | */ 34 | class PageController extends Controller { 35 | /** 36 | * @var IInitialStateService 37 | */ 38 | private $initialStateService; 39 | 40 | /** 41 | * @param string $appName 42 | * @param IRequest $request an instance of the request 43 | */ 44 | public function __construct(string $appName, IRequest $request, SettingsService $settingsService, IInitialStateService $initialStateService) { 45 | parent::__construct($appName, $request); 46 | $this->settingsService = $settingsService; 47 | $this->initialStateService = $initialStateService; 48 | } 49 | 50 | 51 | /** 52 | * @NoAdminRequired 53 | * @NoCSRFRequired 54 | * 55 | * @return TemplateResponse 56 | */ 57 | public function index():TemplateResponse { 58 | $settings = $this->settingsService->get(); 59 | 60 | foreach ($settings as $setting => $value) { 61 | $this->initialStateService->provideInitialState($this->appName, $setting, $value); 62 | } 63 | 64 | return new TemplateResponse('tasks', 'main'); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/utils/textToTask.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @license AGPL-3.0-or-later 5 | * 6 | * This program is free software: you can redistribute it and/or modify 7 | * it under the terms of the GNU Affero General Public License as 8 | * published by the Free Software Foundation, either version 3 of the 9 | * License, or (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU Affero General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU Affero General Public License 17 | * along with this program. If not, see . 18 | * 19 | */ 20 | 21 | export const textToTask = (text) => { 22 | const lines = text.split(/\r?\n/) 23 | .filter(isNotOnlyWhitespace) 24 | .map(spaceToTab) 25 | 26 | const rootTask = { 27 | summary: 'ROOT', 28 | parent: undefined, 29 | depth: 0, 30 | children: [], 31 | } 32 | let curTask = rootTask 33 | let numberOfTasks = 0 34 | 35 | while (lines.length) { 36 | const line = lines.shift() 37 | const curDepth = countSpacesDepth(line) 38 | 39 | while (curTask.parent !== undefined && curDepth <= curTask.depth) { 40 | curTask = curTask.parent 41 | } 42 | 43 | const prefix = listLikePrefix(line) 44 | const summary = line.substring(prefix.length) 45 | const nextTask = { 46 | summary, 47 | parent: curTask, 48 | depth: curDepth, 49 | children: [], 50 | } 51 | curTask.children.push(nextTask) 52 | curTask = nextTask 53 | numberOfTasks++ 54 | } 55 | 56 | return { numberOfTasks, tasks: cleanTasks(rootTask.children) } 57 | } 58 | 59 | const cleanTasks = (tasks) => tasks.map(t => ({ 60 | summary: t.summary, 61 | children: cleanTasks(t.children), 62 | })) 63 | 64 | const isNotOnlyWhitespace = (s) => { 65 | return /\S/.test(s) 66 | } 67 | 68 | // tab counts as 4 spaces 69 | const spaceToTab = (s) => s.replace(/\t/g, ' ') 70 | 71 | const listLikePrefix = (s) => s.match(/^([-+*\s]*(\[(\s|x|X)?]\s*)?)/)?.[0] || '' 72 | 73 | const countSpacesDepth = (s) => s.match(/^(\s+)/)?.[0].length || 0 74 | -------------------------------------------------------------------------------- /l10n/es_419.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_CR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_DO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_HN.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_NI.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_PA.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_PR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_SV.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas" 49 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 50 | } -------------------------------------------------------------------------------- /l10n/es_419.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_CR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_DO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_HN.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_NI.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_PA.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_PR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /l10n/es_SV.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | }, 52 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 53 | -------------------------------------------------------------------------------- /lib/Dashboard/TasksWidget.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * @author Jakob Röhrl 8 | * 9 | * @license GNU AGPL version 3 or any later version 10 | * 11 | * This program is free software: you can redistribute it and/or modify 12 | * it under the terms of the GNU Affero General Public License as 13 | * published by the Free Software Foundation, either version 3 of the 14 | * License, or (at your option) any later version. 15 | * 16 | * This program is distributed in the hope that it will be useful, 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | * GNU Affero General Public License for more details. 20 | * 21 | * You should have received a copy of the GNU Affero General Public License 22 | * along with this program. If not, see . 23 | * 24 | */ 25 | 26 | namespace OCA\Tasks\Dashboard; 27 | 28 | use OCA\Tasks\AppInfo\Application; 29 | use OCP\Dashboard\IWidget; 30 | use OCP\IL10N; 31 | 32 | class TasksWidget implements IWidget { 33 | /** 34 | * @var IL10N 35 | */ 36 | private $l10n; 37 | 38 | /** 39 | * TasksWidget constructor. 40 | * @param IL10N $l10n 41 | */ 42 | public function __construct(IL10N $l10n) { 43 | $this->l10n = $l10n; 44 | } 45 | 46 | /** 47 | * @inheritDoc 48 | */ 49 | public function getId(): string { 50 | return Application::APP_ID; 51 | } 52 | 53 | /** 54 | * @inheritDoc 55 | */ 56 | public function getTitle(): string { 57 | return $this->l10n->t('Upcoming tasks'); 58 | } 59 | 60 | /** 61 | * @inheritDoc 62 | */ 63 | public function getOrder(): int { 64 | return 20; 65 | } 66 | 67 | /** 68 | * @inheritDoc 69 | */ 70 | public function getIconClass(): string { 71 | return 'icon-tasks'; 72 | } 73 | 74 | /** 75 | * @inheritDoc 76 | */ 77 | public function getUrl(): ?string { 78 | return null; 79 | } 80 | 81 | /** 82 | * @inheritDoc 83 | */ 84 | public function load(): void { 85 | \OCP\Util::addScript('tasks', 'tasks-dashboard'); 86 | \OCP\Util::addStyle('tasks', 'tasks-dashboard'); 87 | \OCP\Util::addStyle('tasks', 'tasks-icon'); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /appinfo/routes.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | return [ 23 | 'routes' => [ 24 | ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], 25 | ['name' => 'page#index', 'url' => '/calendars', 'verb' => 'GET', 'postfix' => 'view.calendars'], 26 | ['name' => 'page#index', 'url' => '/calendars/', 'verb' => 'GET', 'postfix' => 'view.calendars./'], 27 | [ 28 | 'name' => 'page#index', 29 | 'url' => '/calendars/{calendar}', 30 | 'verb' => 'GET', 31 | 'postfix' => 'view.calendars.calendar', 32 | 'requirements' => array('calendar' => '.+') 33 | ], 34 | ['name' => 'page#index', 'url' => '/collections', 'verb' => 'GET', 'postfix' => 'view.collections'], 35 | ['name' => 'page#index', 'url' => '/collections/', 'verb' => 'GET', 'postfix' => 'view.collections./'], 36 | [ 37 | 'name' => 'page#index', 38 | 'url' => '/collections/{collection}', 39 | 'verb' => 'GET', 40 | 'postfix' => 'view.collections.collection', 41 | 'requirements' => array('collection' => '.+') 42 | ], 43 | 44 | ['name' => 'collections#getCollections','url' => '/api/v1/collections', 'verb' => 'GET'], 45 | ['name' => 'collections#setVisibility', 'url' => '/api/v1/collection/{collectionID}/visibility/{visibility}', 'verb' => 'POST'], 46 | ['name' => 'settings#get', 'url' => '/api/v1/settings', 'verb' => 'GET'], 47 | ['name' => 'settings#set', 'url' => '/api/v1/settings/{setting}', 'verb' => 'POST'], 48 | ] 49 | ]; 50 | -------------------------------------------------------------------------------- /l10n/es_GT.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Email" : "Correo electrónico", 26 | "Go back" : "Regresar", 27 | "Close" : "Cerrar", 28 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 29 | "Start date" : "Fecha de inicio", 30 | "Due date" : "Fecha de vencimiento", 31 | "Last modified" : "Última modificación", 32 | "Priority" : "Prioridad", 33 | "Alphabetically" : "Alfabéticamente", 34 | "Tags" : "Etiquetas", 35 | "Manually" : "Manualmente", 36 | "Change sort order" : "Cambiar el criterio para ordenar", 37 | "Task is completed" : "La tarea ha sido completada", 38 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 39 | "Tomorrow" : "Mañana", 40 | "When shared show full event" : "Al compartir, mostrar el evento completo", 41 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 42 | "When shared hide this event" : "Al compartir, ocultar este evento ", 43 | "Task not found!" : "¡Tarea no encontrada!", 44 | "Set start date" : "Establecer fecha de inicio", 45 | "Set due date" : "Establecer fecha de vencimiento", 46 | "All day" : "Todo el día", 47 | "Details" : "Detalles", 48 | "Select tags" : "Selecciona las etiquetas", 49 | "Notes" : "Notas" 50 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 51 | } -------------------------------------------------------------------------------- /l10n/es_PE.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Email" : "Correo electrónico", 26 | "Go back" : "Regresar", 27 | "Close" : "Cerrar", 28 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 29 | "Start date" : "Fecha de inicio", 30 | "Due date" : "Fecha de vencimiento", 31 | "Last modified" : "Última modificación", 32 | "Priority" : "Prioridad", 33 | "Alphabetically" : "Alfabéticamente", 34 | "Tags" : "Etiquetas", 35 | "Manually" : "Manualmente", 36 | "Change sort order" : "Cambiar el criterio para ordenar", 37 | "Task is completed" : "La tarea ha sido completada", 38 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 39 | "Tomorrow" : "Mañana", 40 | "When shared show full event" : "Al compartir, mostrar el evento completo", 41 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 42 | "When shared hide this event" : "Al compartir, ocultar este evento ", 43 | "Task not found!" : "¡Tarea no encontrada!", 44 | "Set start date" : "Establecer fecha de inicio", 45 | "Set due date" : "Establecer fecha de vencimiento", 46 | "All day" : "Todo el día", 47 | "Details" : "Detalles", 48 | "Select tags" : "Selecciona las etiquetas", 49 | "Notes" : "Notas" 50 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 51 | } -------------------------------------------------------------------------------- /l10n/es_GT.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Email" : "Correo electrónico", 28 | "Go back" : "Regresar", 29 | "Close" : "Cerrar", 30 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 31 | "Start date" : "Fecha de inicio", 32 | "Due date" : "Fecha de vencimiento", 33 | "Last modified" : "Última modificación", 34 | "Priority" : "Prioridad", 35 | "Alphabetically" : "Alfabéticamente", 36 | "Tags" : "Etiquetas", 37 | "Manually" : "Manualmente", 38 | "Change sort order" : "Cambiar el criterio para ordenar", 39 | "Task is completed" : "La tarea ha sido completada", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 41 | "Tomorrow" : "Mañana", 42 | "When shared show full event" : "Al compartir, mostrar el evento completo", 43 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 44 | "When shared hide this event" : "Al compartir, ocultar este evento ", 45 | "Task not found!" : "¡Tarea no encontrada!", 46 | "Set start date" : "Establecer fecha de inicio", 47 | "Set due date" : "Establecer fecha de vencimiento", 48 | "All day" : "Todo el día", 49 | "Details" : "Detalles", 50 | "Select tags" : "Selecciona las etiquetas", 51 | "Notes" : "Notas" 52 | }, 53 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 54 | -------------------------------------------------------------------------------- /l10n/es_PE.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Email" : "Correo electrónico", 28 | "Go back" : "Regresar", 29 | "Close" : "Cerrar", 30 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 31 | "Start date" : "Fecha de inicio", 32 | "Due date" : "Fecha de vencimiento", 33 | "Last modified" : "Última modificación", 34 | "Priority" : "Prioridad", 35 | "Alphabetically" : "Alfabéticamente", 36 | "Tags" : "Etiquetas", 37 | "Manually" : "Manualmente", 38 | "Change sort order" : "Cambiar el criterio para ordenar", 39 | "Task is completed" : "La tarea ha sido completada", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 41 | "Tomorrow" : "Mañana", 42 | "When shared show full event" : "Al compartir, mostrar el evento completo", 43 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 44 | "When shared hide this event" : "Al compartir, ocultar este evento ", 45 | "Task not found!" : "¡Tarea no encontrada!", 46 | "Set start date" : "Establecer fecha de inicio", 47 | "Set due date" : "Establecer fecha de vencimiento", 48 | "All day" : "Todo el día", 49 | "Details" : "Detalles", 50 | "Select tags" : "Selecciona las etiquetas", 51 | "Notes" : "Notas" 52 | }, 53 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 54 | -------------------------------------------------------------------------------- /l10n/es_PY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Name" : "Nombre", 21 | "Deleted" : "Borrado", 22 | "Restore" : "Restaurar", 23 | "Delete permanently" : "Borrar permanentemente", 24 | "Cancel" : "Cancelar", 25 | "Go back" : "Regresar", 26 | "Close" : "Cerrar", 27 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 28 | "Start date" : "Fecha de inicio", 29 | "Due date" : "Fecha de vencimiento", 30 | "Last modified" : "Última modificación", 31 | "Priority" : "Prioridad", 32 | "Alphabetically" : "Alfabéticamente", 33 | "Tags" : "Etiquetas", 34 | "Manually" : "Manualmente", 35 | "Change sort order" : "Cambiar el criterio para ordenar", 36 | "Task is completed" : "La tarea ha sido completada", 37 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 38 | "Tomorrow" : "Mañana", 39 | "When shared show full event" : "Al compartir, mostrar el evento completo", 40 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 41 | "When shared hide this event" : "Al compartir, ocultar este evento ", 42 | "Task not found!" : "¡Tarea no encontrada!", 43 | "Set start date" : "Establecer fecha de inicio", 44 | "Set due date" : "Establecer fecha de vencimiento", 45 | "All day" : "Todo el día", 46 | "Details" : "Detalles", 47 | "Select tags" : "Selecciona las etiquetas", 48 | "Notes" : "Notas", 49 | "An error occurred" : "Se presentó un error" 50 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 51 | } -------------------------------------------------------------------------------- /tests/php/unit/Controller/SettingsControllerTest.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 23 | namespace OCA\Tasks\Tests\Unit\Controller; 24 | 25 | use OCA\Tasks\Controller\SettingsController; 26 | use OCA\Tasks\Service\SettingsService; 27 | use OCP\IRequest; 28 | 29 | use PHPUnit\Framework\TestCase; 30 | 31 | class SettingsControllerTest extends TestCase { 32 | private $appName; 33 | private $settingsService; 34 | private $request; 35 | private $controller; 36 | 37 | use \OCA\Tasks\Controller\Response; 38 | 39 | /** 40 | * Gets run before each test 41 | */ 42 | public function setUp(): void { 43 | $this->appName = 'tasks'; 44 | $this->settingsService = $this->getMockBuilder(SettingsService::class) 45 | ->disableOriginalConstructor() 46 | ->getMock(); 47 | $this->request = $this->getMockBuilder(IRequest::class) 48 | ->disableOriginalConstructor() 49 | ->getMock(); 50 | $this->controller = new SettingsController( 51 | $this->appName, 52 | $this->request, 53 | $this->settingsService 54 | ); 55 | } 56 | 57 | public function testSet() { 58 | $this->settingsService->expects($this->once()) 59 | ->method('set') 60 | ->with( 61 | 'sortOrder', 62 | $this->equalTo(0) 63 | ) 64 | ->will($this->returnValue(true)); 65 | 66 | $expected = $this->generateResponse(function () { 67 | return true; 68 | }); 69 | $response = $this->controller->set('sortOrder', 0); 70 | $this->assertEquals($expected, $response); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /l10n/es_CL.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Empty trash bin" : "Vaciar papelera de reciclaje", 21 | "Name" : "Nombre", 22 | "Deleted" : "Borrado", 23 | "Restore" : "Restaurar", 24 | "Delete permanently" : "Borrar permanentemente", 25 | "Cancel" : "Cancelar", 26 | "Go back" : "Regresar", 27 | "Close" : "Cerrar", 28 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 29 | "Start date" : "Fecha de inicio", 30 | "Due date" : "Fecha de vencimiento", 31 | "Last modified" : "Última modificación", 32 | "Priority" : "Prioridad", 33 | "Alphabetically" : "Alfabéticamente", 34 | "Tags" : "Etiquetas", 35 | "Manually" : "Manualmente", 36 | "Change sort order" : "Cambiar el criterio para ordenar", 37 | "Task is completed" : "La tarea ha sido completada", 38 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 39 | "Tomorrow" : "Mañana", 40 | "When shared show full event" : "Al compartir, mostrar el evento completo", 41 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 42 | "When shared hide this event" : "Al compartir, ocultar este evento ", 43 | "Task not found!" : "¡Tarea no encontrada!", 44 | "Set start date" : "Establecer fecha de inicio", 45 | "Set due date" : "Establecer fecha de vencimiento", 46 | "All day" : "Todo el día", 47 | "Details" : "Detalles", 48 | "Select tags" : "Selecciona las etiquetas", 49 | "Notes" : "Notas" 50 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 51 | } -------------------------------------------------------------------------------- /l10n/es_PY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Name" : "Nombre", 23 | "Deleted" : "Borrado", 24 | "Restore" : "Restaurar", 25 | "Delete permanently" : "Borrar permanentemente", 26 | "Cancel" : "Cancelar", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas", 51 | "An error occurred" : "Se presentó un error" 52 | }, 53 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 54 | -------------------------------------------------------------------------------- /l10n/es_CL.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Empty trash bin" : "Vaciar papelera de reciclaje", 23 | "Name" : "Nombre", 24 | "Deleted" : "Borrado", 25 | "Restore" : "Restaurar", 26 | "Delete permanently" : "Borrar permanentemente", 27 | "Cancel" : "Cancelar", 28 | "Go back" : "Regresar", 29 | "Close" : "Cerrar", 30 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 31 | "Start date" : "Fecha de inicio", 32 | "Due date" : "Fecha de vencimiento", 33 | "Last modified" : "Última modificación", 34 | "Priority" : "Prioridad", 35 | "Alphabetically" : "Alfabéticamente", 36 | "Tags" : "Etiquetas", 37 | "Manually" : "Manualmente", 38 | "Change sort order" : "Cambiar el criterio para ordenar", 39 | "Task is completed" : "La tarea ha sido completada", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 41 | "Tomorrow" : "Mañana", 42 | "When shared show full event" : "Al compartir, mostrar el evento completo", 43 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 44 | "When shared hide this event" : "Al compartir, ocultar este evento ", 45 | "Task not found!" : "¡Tarea no encontrada!", 46 | "Set start date" : "Establecer fecha de inicio", 47 | "Set due date" : "Establecer fecha de vencimiento", 48 | "All day" : "Todo el día", 49 | "Details" : "Detalles", 50 | "Select tags" : "Selecciona las etiquetas", 51 | "Notes" : "Notas" 52 | }, 53 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 54 | -------------------------------------------------------------------------------- /.github/workflows/lint-php.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Lint php 10 | 11 | on: pull_request 12 | 13 | permissions: 14 | contents: read 15 | 16 | concurrency: 17 | group: lint-php-${{ github.head_ref || github.run_id }} 18 | cancel-in-progress: true 19 | 20 | jobs: 21 | matrix: 22 | runs-on: ubuntu-latest-low 23 | outputs: 24 | php-versions: ${{ steps.versions.outputs.php-versions }} 25 | steps: 26 | - name: Checkout app 27 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1 28 | - name: Get version matrix 29 | id: versions 30 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.0.0 31 | 32 | php-lint: 33 | runs-on: ubuntu-latest 34 | needs: matrix 35 | strategy: 36 | matrix: 37 | php-versions: ${{fromJson(needs.matrix.outputs.php-versions)}} 38 | 39 | name: php-lint 40 | 41 | steps: 42 | - name: Checkout 43 | uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1 44 | 45 | - name: Set up php ${{ matrix.php-versions }} 46 | uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0 47 | with: 48 | php-version: ${{ matrix.php-versions }} 49 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 50 | coverage: none 51 | ini-file: development 52 | env: 53 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 54 | 55 | - name: Lint 56 | run: composer run lint 57 | 58 | summary: 59 | permissions: 60 | contents: none 61 | runs-on: ubuntu-latest-low 62 | needs: php-lint 63 | 64 | if: always() 65 | 66 | name: php-lint-summary 67 | 68 | steps: 69 | - name: Summary status 70 | run: if ${{ needs.php-lint.result != 'success' && needs.php-lint.result != 'skipped' }}; then exit 1; fi 71 | -------------------------------------------------------------------------------- /src/models/principal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2019 Georg Ehrke 5 | * 6 | * @author Georg Ehrke 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | 25 | /** 26 | * Creates a complete principal-object based on given props 27 | * 28 | * @param {object} props Principal-props already provided 29 | * @return {any} 30 | */ 31 | export const getDefaultPrincipalObject = (props) => Object.assign({}, { 32 | // Id of the principal 33 | id: '', 34 | // Calendar-user-type. This can be INDIVIDUAL, GROUP, RESOURCE or ROOM 35 | calendarUserType: '', 36 | // E-Mail address of principal used for scheduling 37 | emailAddress: '', 38 | // The principals display-name 39 | displayname: '', 40 | // principalScheme 41 | principalScheme: '', 42 | // The internal user-id in case it is of type INDIVIDUAL and a user 43 | userId: '', 44 | // url to the DAV-principal-resource 45 | url: '', 46 | // The cdav-library object 47 | dav: false, 48 | }, props) 49 | 50 | /** 51 | * converts a dav principal into a vuex object 52 | * 53 | * @param {object} principal cdav-library Principal object 54 | * @return {{emailAddress: *, displayname: *, dav: *, id: *, calendarUserType: *, userId: *, url: *}} 55 | */ 56 | export function mapDavToPrincipal(principal) { 57 | return { 58 | id: btoa(principal.url), 59 | calendarUserType: principal.calendarUserType, 60 | principalScheme: principal.principalScheme, 61 | emailAddress: principal.email, 62 | displayname: principal.displayname, 63 | userId: principal.userId, 64 | url: principal.principalUrl, 65 | dav: principal, 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /l10n/es_UY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Empty trash bin" : "Vaciar la papelera de reciclaje", 21 | "Name" : "Nombre", 22 | "Deleted" : "Borrado", 23 | "Restore" : "Restaurar", 24 | "Delete permanently" : "Borrar permanentemente", 25 | "Cancel" : "Cancelar", 26 | "Email" : "Correo electrónico", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Task is completed" : "La tarea ha sido completada", 39 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 40 | "Tomorrow" : "Mañana", 41 | "When shared show full event" : "Al compartir, mostrar el evento completo", 42 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 43 | "When shared hide this event" : "Al compartir, ocultar este evento ", 44 | "Task not found!" : "¡Tarea no encontrada!", 45 | "Set start date" : "Establecer fecha de inicio", 46 | "Set due date" : "Establecer fecha de vencimiento", 47 | "All day" : "Todo el día", 48 | "Details" : "Detalles", 49 | "Select tags" : "Selecciona las etiquetas", 50 | "Notes" : "Notas" 51 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 52 | } -------------------------------------------------------------------------------- /l10n/es_UY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Empty trash bin" : "Vaciar la papelera de reciclaje", 23 | "Name" : "Nombre", 24 | "Deleted" : "Borrado", 25 | "Restore" : "Restaurar", 26 | "Delete permanently" : "Borrar permanentemente", 27 | "Cancel" : "Cancelar", 28 | "Email" : "Correo electrónico", 29 | "Go back" : "Regresar", 30 | "Close" : "Cerrar", 31 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 32 | "Start date" : "Fecha de inicio", 33 | "Due date" : "Fecha de vencimiento", 34 | "Last modified" : "Última modificación", 35 | "Priority" : "Prioridad", 36 | "Alphabetically" : "Alfabéticamente", 37 | "Tags" : "Etiquetas", 38 | "Manually" : "Manualmente", 39 | "Change sort order" : "Cambiar el criterio para ordenar", 40 | "Task is completed" : "La tarea ha sido completada", 41 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 42 | "Tomorrow" : "Mañana", 43 | "When shared show full event" : "Al compartir, mostrar el evento completo", 44 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 45 | "When shared hide this event" : "Al compartir, ocultar este evento ", 46 | "Task not found!" : "¡Tarea no encontrada!", 47 | "Set start date" : "Establecer fecha de inicio", 48 | "Set due date" : "Establecer fecha de vencimiento", 49 | "All day" : "Todo el día", 50 | "Details" : "Detalles", 51 | "Select tags" : "Selecciona las etiquetas", 52 | "Notes" : "Notas" 53 | }, 54 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 55 | -------------------------------------------------------------------------------- /l10n/sq.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "E rëndësishme", 3 | "Today" : "Sot", 4 | "Week" : "Javë", 5 | "All" : "Krejt", 6 | "Current" : "E tanishmja", 7 | "Completed" : "Të plotësuara", 8 | "Tasks" : "Detyra", 9 | "Hidden" : "I padukshëm", 10 | "Visible" : "I dukshëm", 11 | "Automatic" : "Automatike", 12 | "Visibility of Smart Collections" : "Dukshmëri Koleksionesh të Mençura", 13 | "Share with users or groups" : "Nda me përdoruesit ose grupet", 14 | "Can edit" : "Can edit", 15 | "An empty name is not allowed." : "Nuk lejohet emër i zbrazët.", 16 | "Edit" : "Përpunoni", 17 | "Copied" : "Kopjuar", 18 | "Export" : "Eksport", 19 | "Delete" : "Fshije", 20 | "Unshare" : "Hiqe ndarjen", 21 | "Name" : "Emri", 22 | "Deleted" : "E fshirë", 23 | "Restore" : "Rikthe", 24 | "Delete permanently" : "Fshije përgjithmonë", 25 | "Cancel" : "Anuloje", 26 | "Email" : "Emaili", 27 | "Go back" : "Shko prapa", 28 | "Close" : "Mbylleni", 29 | "No errors" : "Nuk ka gabime", 30 | "Open your browser console for more details" : "Hapni panelin e komandimit të shfletuesit tuaj për më shumë detaje", 31 | "Select tags to filter by" : "Përzgjidhni etiketa sipas të cilat të bëhet filtrimi", 32 | "Start date" : "Datë nisjeje", 33 | "Due date" : "Datë përfundimi", 34 | "Last modified" : "Ndryshuar së fundmi", 35 | "Priority" : "Përparësi", 36 | "Alphabetically" : "Alfabetikisht", 37 | "Tags" : "Etiketat", 38 | "Manually" : "Dorazi", 39 | "Change sort order" : "Ndryshoni rend renditjeje", 40 | "Task is completed" : "Detyra është e plotësuar", 41 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Punë e Plotësuar","%n Punë të Plotësuara"], 42 | "Tomorrow" : "Nesër", 43 | "When shared show full event" : "Kur ndahet shfaqje e veprimtarisë së plotë", 44 | "When shared show only busy" : "Kur ndahet shfaqje vetëm i zënë", 45 | "When shared hide this event" : "Kur ndahet fshihe këtë veprimtari", 46 | "Canceled" : "Anuluar", 47 | "Task not found!" : "S’u gjet punë!", 48 | "Set start date" : "Caktoni datë fillimi", 49 | "Set due date" : "Caktoni datë mbarimi", 50 | "All day" : "Gjithë ditën", 51 | "Details" : "Detajet", 52 | "Select tags" : "Përzgjidh etiketat", 53 | "Notes" : "Shënime" 54 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 55 | } -------------------------------------------------------------------------------- /l10n/es_CO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 14 | "Can edit" : "Puede editar", 15 | "An empty name is not allowed." : "No se permite un nombre vacío.", 16 | "Edit" : "Editar", 17 | "Export" : "Exportar", 18 | "Delete" : "Borrar", 19 | "Unshare" : "Dejar de compartir", 20 | "Empty trash bin" : "Vacíar la papelera", 21 | "Name" : "Nombre", 22 | "Deleted" : "Borrado", 23 | "Restore" : "Restaurar", 24 | "Delete permanently" : "Borrar permanentemente", 25 | "Cancel" : "Cancelar", 26 | "Email" : "Correo electrónico", 27 | "Go back" : "Regresar", 28 | "Close" : "Cerrar", 29 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 30 | "Start date" : "Fecha de inicio", 31 | "Due date" : "Fecha de vencimiento", 32 | "Last modified" : "Última modificación", 33 | "Priority" : "Prioridad", 34 | "Alphabetically" : "Alfabéticamente", 35 | "Tags" : "Etiquetas", 36 | "Manually" : "Manualmente", 37 | "Change sort order" : "Cambiar el criterio para ordenar", 38 | "Delete task" : "Eliminar tarea", 39 | "Task is completed" : "La tarea ha sido completada", 40 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 41 | "Tomorrow" : "Mañana", 42 | "When shared show full event" : "Al compartir, mostrar el evento completo", 43 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 44 | "When shared hide this event" : "Al compartir, ocultar este evento ", 45 | "Task not found!" : "¡Tarea no encontrada!", 46 | "Set start date" : "Establecer fecha de inicio", 47 | "Set due date" : "Establecer fecha de vencimiento", 48 | "All day" : "Todo el día", 49 | "Details" : "Detalles", 50 | "Select tags" : "Selecciona las etiquetas", 51 | "Notes" : "Notas" 52 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 53 | } -------------------------------------------------------------------------------- /l10n/es_CO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con otros usuarios o grupos", 16 | "Can edit" : "Puede editar", 17 | "An empty name is not allowed." : "No se permite un nombre vacío.", 18 | "Edit" : "Editar", 19 | "Export" : "Exportar", 20 | "Delete" : "Borrar", 21 | "Unshare" : "Dejar de compartir", 22 | "Empty trash bin" : "Vacíar la papelera", 23 | "Name" : "Nombre", 24 | "Deleted" : "Borrado", 25 | "Restore" : "Restaurar", 26 | "Delete permanently" : "Borrar permanentemente", 27 | "Cancel" : "Cancelar", 28 | "Email" : "Correo electrónico", 29 | "Go back" : "Regresar", 30 | "Close" : "Cerrar", 31 | "Select tags to filter by" : "Selecciona las etiquetas del filtro", 32 | "Start date" : "Fecha de inicio", 33 | "Due date" : "Fecha de vencimiento", 34 | "Last modified" : "Última modificación", 35 | "Priority" : "Prioridad", 36 | "Alphabetically" : "Alfabéticamente", 37 | "Tags" : "Etiquetas", 38 | "Manually" : "Manualmente", 39 | "Change sort order" : "Cambiar el criterio para ordenar", 40 | "Delete task" : "Eliminar tarea", 41 | "Task is completed" : "La tarea ha sido completada", 42 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 43 | "Tomorrow" : "Mañana", 44 | "When shared show full event" : "Al compartir, mostrar el evento completo", 45 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 46 | "When shared hide this event" : "Al compartir, ocultar este evento ", 47 | "Task not found!" : "¡Tarea no encontrada!", 48 | "Set start date" : "Establecer fecha de inicio", 49 | "Set due date" : "Establecer fecha de vencimiento", 50 | "All day" : "Todo el día", 51 | "Details" : "Detalles", 52 | "Select tags" : "Selecciona las etiquetas", 53 | "Notes" : "Notas" 54 | }, 55 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 56 | -------------------------------------------------------------------------------- /l10n/sq.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "E rëndësishme", 5 | "Today" : "Sot", 6 | "Week" : "Javë", 7 | "All" : "Krejt", 8 | "Current" : "E tanishmja", 9 | "Completed" : "Të plotësuara", 10 | "Tasks" : "Detyra", 11 | "Hidden" : "I padukshëm", 12 | "Visible" : "I dukshëm", 13 | "Automatic" : "Automatike", 14 | "Visibility of Smart Collections" : "Dukshmëri Koleksionesh të Mençura", 15 | "Share with users or groups" : "Nda me përdoruesit ose grupet", 16 | "Can edit" : "Can edit", 17 | "An empty name is not allowed." : "Nuk lejohet emër i zbrazët.", 18 | "Edit" : "Përpunoni", 19 | "Copied" : "Kopjuar", 20 | "Export" : "Eksport", 21 | "Delete" : "Fshije", 22 | "Unshare" : "Hiqe ndarjen", 23 | "Name" : "Emri", 24 | "Deleted" : "E fshirë", 25 | "Restore" : "Rikthe", 26 | "Delete permanently" : "Fshije përgjithmonë", 27 | "Cancel" : "Anuloje", 28 | "Email" : "Emaili", 29 | "Go back" : "Shko prapa", 30 | "Close" : "Mbylleni", 31 | "No errors" : "Nuk ka gabime", 32 | "Open your browser console for more details" : "Hapni panelin e komandimit të shfletuesit tuaj për më shumë detaje", 33 | "Select tags to filter by" : "Përzgjidhni etiketa sipas të cilat të bëhet filtrimi", 34 | "Start date" : "Datë nisjeje", 35 | "Due date" : "Datë përfundimi", 36 | "Last modified" : "Ndryshuar së fundmi", 37 | "Priority" : "Përparësi", 38 | "Alphabetically" : "Alfabetikisht", 39 | "Tags" : "Etiketat", 40 | "Manually" : "Dorazi", 41 | "Change sort order" : "Ndryshoni rend renditjeje", 42 | "Task is completed" : "Detyra është e plotësuar", 43 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Punë e Plotësuar","%n Punë të Plotësuara"], 44 | "Tomorrow" : "Nesër", 45 | "When shared show full event" : "Kur ndahet shfaqje e veprimtarisë së plotë", 46 | "When shared show only busy" : "Kur ndahet shfaqje vetëm i zënë", 47 | "When shared hide this event" : "Kur ndahet fshihe këtë veprimtari", 48 | "Canceled" : "Anuluar", 49 | "Task not found!" : "S’u gjet punë!", 50 | "Set start date" : "Caktoni datë fillimi", 51 | "Set due date" : "Caktoni datë mbarimi", 52 | "All day" : "Gjithë ditën", 53 | "Details" : "Detajet", 54 | "Select tags" : "Përzgjidh etiketat", 55 | "Notes" : "Shënime" 56 | }, 57 | "nplurals=2; plural=(n != 1);"); 58 | -------------------------------------------------------------------------------- /src/components/AppSidebar/MultiselectOption.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 35 | 36 | 55 | 56 | 95 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tasks", 3 | "description": "Nextcloud - Tasks", 4 | "version": "0.17.1", 5 | "author": { 6 | "name": "Raimund Schlüßler", 7 | "email": "raimund.schluessler@mailbox.org" 8 | }, 9 | "license": "AGPLv3", 10 | "private": true, 11 | "homepage": "https://github.com/nextcloud/tasks", 12 | "scripts": { 13 | "build": "vite build --mode production", 14 | "dev": "vite build --mode development", 15 | "watch": "vite build --mode development --watch", 16 | "lint": "eslint --ext .js,.vue src tests", 17 | "lint:fix": "eslint --ext .js,.vue src tests --fix", 18 | "stylelint": "stylelint 'css/**/*.scss'", 19 | "stylelint:fix": "stylelint 'css/**/*.scss' --fix", 20 | "test": "vitest run" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git@github.com:nextcloud/tasks.git" 25 | }, 26 | "type": "module", 27 | "bugs": "https://github.com/nextcloud/tasks/issues", 28 | "contributors": [], 29 | "dependencies": { 30 | "@nextcloud/axios": "^2.5.2", 31 | "@nextcloud/calendar-js": "8.1.6", 32 | "@nextcloud/cdav-library": "2.1.1", 33 | "@nextcloud/dialogs": "7.2.0", 34 | "@nextcloud/event-bus": "^3.3.3", 35 | "@nextcloud/initial-state": "3.0.0", 36 | "@nextcloud/l10n": "^3.4.1", 37 | "@nextcloud/logger": "^3.0.3", 38 | "@nextcloud/moment": "^1.3.5", 39 | "@nextcloud/router": "^3.1.0", 40 | "@nextcloud/vue": "9.3.1", 41 | "@vueuse/components": "^14.0.0", 42 | "color-convert": "^3.1.3", 43 | "debounce": "^3.0.0", 44 | "ical.js": "^2.2.0", 45 | "markdown-it": "^14.1.0", 46 | "markdown-it-emoji": "^3.0.0", 47 | "markdown-it-link-attributes": "^4.0.1", 48 | "markdown-it-task-lists": "^2.1.1", 49 | "sortablejs-vue3": "^1.3.0", 50 | "vue": "^3.5.26", 51 | "vue-material-design-icons": "^5.3.1", 52 | "vue-router": "^4.6.4", 53 | "vuex": "^4.1.0" 54 | }, 55 | "devDependencies": { 56 | "@nextcloud/babel-config": "^1.3.0", 57 | "@nextcloud/browserslist-config": "^3.1.2", 58 | "@nextcloud/eslint-config": "8.4.2", 59 | "@nextcloud/stylelint-config": "^3.1.1", 60 | "@nextcloud/vite-config": "2.5.2", 61 | "@vue/test-utils": "^2.4.6", 62 | "happy-dom": "^20.0.11", 63 | "mockdate": "^3.0.5", 64 | "vitest": "^4.0.16" 65 | }, 66 | "engines": { 67 | "node": "^24.0.0", 68 | "npm": "^11.3.0" 69 | }, 70 | "browserslist": [ 71 | "extends @nextcloud/browserslist-config" 72 | ] 73 | } 74 | -------------------------------------------------------------------------------- /src/utils/logger.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @copyright Copyright (c) 2019 Georg Ehrke 5 | * 6 | * @author Georg Ehrke 7 | * 8 | * @license AGPL-3.0-or-later 9 | * 10 | * This program is free software: you can redistribute it and/or modify 11 | * it under the terms of the GNU Affero General Public License as 12 | * published by the Free Software Foundation, either version 3 of the 13 | * License, or (at your option) any later version. 14 | * 15 | * This program is distributed in the hope that it will be useful, 16 | * but WITHOUT ANY WARRANTY without even the implied warranty of 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | * GNU Affero General Public License for more details. 19 | * 20 | * You should have received a copy of the GNU Affero General Public License 21 | * along with this program. If not, see . 22 | * 23 | */ 24 | import { getLoggerBuilder } from '@nextcloud/logger' 25 | 26 | const logger = getLoggerBuilder() 27 | .setApp('tasks') 28 | .detectUser() 29 | .build() 30 | 31 | /** 32 | * Logs a debug message 33 | * 34 | * @param {string} message The message to log 35 | * @param {object=} context Additional context if needed 36 | */ 37 | const logDebug = (message, context = {}) => { 38 | logger.debug(message, context) 39 | } 40 | 41 | /** 42 | * Logs an error message 43 | * 44 | * @param {string} message The message to log 45 | * @param {object=} context Additional context if needed 46 | */ 47 | const logError = (message, context = {}) => { 48 | logger.error(message, context) 49 | } 50 | 51 | /** 52 | * Logs a fatal message 53 | * 54 | * @param {string} message The message to log 55 | * @param {object=} context Additional context if needed 56 | */ 57 | const logFatal = (message, context = {}) => { 58 | logger.fatal(message, context) 59 | } 60 | 61 | /** 62 | * Logs an info message 63 | * 64 | * @param {string} message The message to log 65 | * @param {object=} context Additional context if needed 66 | */ 67 | const logInfo = (message, context = {}) => { 68 | logger.info(message, context) 69 | } 70 | 71 | /** 72 | * Logs a warn message 73 | * 74 | * @param {string} message The message to log 75 | * @param {object=} context Additional context if needed 76 | */ 77 | const logWarn = (message, context = {}) => { 78 | logger.warn(message, context) 79 | } 80 | 81 | export default logger 82 | export { 83 | logDebug, 84 | logError, 85 | logFatal, 86 | logInfo, 87 | logWarn, 88 | } 89 | -------------------------------------------------------------------------------- /src/components/AppSidebar/CheckboxItem.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 37 | 38 | 62 | 63 | 98 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Upcoming tasks" : "Prètzfaches venents", 3 | "Important" : "Important", 4 | "Today" : "Uèi", 5 | "Week" : "Aquesta setmana", 6 | "All" : "Tot", 7 | "Current" : "En aqueste moment", 8 | "Completed" : "Acabat", 9 | "Tasks" : "Prètzfaches", 10 | "Hidden" : "Amagat", 11 | "Visible" : "Visible", 12 | "Automatic" : "Automatic", 13 | "Visibility of Smart Collections" : "Visibilitat de las colleccions Smart", 14 | "Can edit" : "Pòt modificar", 15 | "An empty name is not allowed." : "Un nom void es pas autorizat.", 16 | "Edit" : "Modificar", 17 | "Copy private link" : "Copiar lo ligam privat", 18 | "Copied" : "Copiat", 19 | "Export" : "Exportar", 20 | "Delete" : "Suprimir", 21 | "Unshare" : "Partejar pas mai", 22 | "Untitled task" : "Prètzfach sens nom", 23 | "Untitled event" : "Eveniment sens títol", 24 | "Name" : "Nom", 25 | "Deleted" : "Suprimit", 26 | "Restore" : "Restaurar", 27 | "Delete permanently" : "Suprimir definitivament", 28 | "Cancel" : "Anullar", 29 | "Notification" : "Notificacion", 30 | "Email" : "Adreiça electronica", 31 | "Audio notification" : "Notificacion àudio", 32 | "Other notification" : "Autras notificacions", 33 | "Edit time" : "Modificar l’ora", 34 | "Remove reminder" : "Suprimir lo rapèl", 35 | "Go back" : "Revenir en arrière", 36 | "_second_::_seconds_" : ["segonda","segondas"], 37 | "_minute_::_minutes_" : ["minuta","minutas"], 38 | "_hour_::_hours_" : ["ora","oras"], 39 | "_day_::_days_" : ["jorn","jorns"], 40 | "_week_::_weeks_" : ["setmana","setmanas"], 41 | "Close" : "Tampar", 42 | "Alphabetically" : "Alfabeticament", 43 | "Tags" : "Etiquetas", 44 | "[Yesterday]" : "[Ièr]", 45 | "[Today]" : "[Uèi]", 46 | "[Tomorrow]" : "[Deman]", 47 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n prètzfach acabat","%n prètzfaches acabats"], 48 | "Tomorrow" : "Deman", 49 | "Canceled" : "Anullat", 50 | "Task not found!" : "Prètzfach pas trobat !", 51 | "Set start date" : "Especificar la data de començament", 52 | "Set due date" : "Especificar la data d'escasença", 53 | "All day" : "Tota la jornada", 54 | "Details" : "Detalhs", 55 | "Notes" : "Nòtas", 56 | "No upcoming tasks" : "Cap de prètzfach venent", 57 | "upcoming tasks" : "prètzfaches venents", 58 | "No tasks today" : "Cap de prètzfach uèi", 59 | "An error occurred" : "Una error s’es producha" 60 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 61 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Upcoming tasks" : "Prètzfaches venents", 5 | "Important" : "Important", 6 | "Today" : "Uèi", 7 | "Week" : "Aquesta setmana", 8 | "All" : "Tot", 9 | "Current" : "En aqueste moment", 10 | "Completed" : "Acabat", 11 | "Tasks" : "Prètzfaches", 12 | "Hidden" : "Amagat", 13 | "Visible" : "Visible", 14 | "Automatic" : "Automatic", 15 | "Visibility of Smart Collections" : "Visibilitat de las colleccions Smart", 16 | "Can edit" : "Pòt modificar", 17 | "An empty name is not allowed." : "Un nom void es pas autorizat.", 18 | "Edit" : "Modificar", 19 | "Copy private link" : "Copiar lo ligam privat", 20 | "Copied" : "Copiat", 21 | "Export" : "Exportar", 22 | "Delete" : "Suprimir", 23 | "Unshare" : "Partejar pas mai", 24 | "Untitled task" : "Prètzfach sens nom", 25 | "Untitled event" : "Eveniment sens títol", 26 | "Name" : "Nom", 27 | "Deleted" : "Suprimit", 28 | "Restore" : "Restaurar", 29 | "Delete permanently" : "Suprimir definitivament", 30 | "Cancel" : "Anullar", 31 | "Notification" : "Notificacion", 32 | "Email" : "Adreiça electronica", 33 | "Audio notification" : "Notificacion àudio", 34 | "Other notification" : "Autras notificacions", 35 | "Edit time" : "Modificar l’ora", 36 | "Remove reminder" : "Suprimir lo rapèl", 37 | "Go back" : "Revenir en arrière", 38 | "_second_::_seconds_" : ["segonda","segondas"], 39 | "_minute_::_minutes_" : ["minuta","minutas"], 40 | "_hour_::_hours_" : ["ora","oras"], 41 | "_day_::_days_" : ["jorn","jorns"], 42 | "_week_::_weeks_" : ["setmana","setmanas"], 43 | "Close" : "Tampar", 44 | "Alphabetically" : "Alfabeticament", 45 | "Tags" : "Etiquetas", 46 | "[Yesterday]" : "[Ièr]", 47 | "[Today]" : "[Uèi]", 48 | "[Tomorrow]" : "[Deman]", 49 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n prètzfach acabat","%n prètzfaches acabats"], 50 | "Tomorrow" : "Deman", 51 | "Canceled" : "Anullat", 52 | "Task not found!" : "Prètzfach pas trobat !", 53 | "Set start date" : "Especificar la data de començament", 54 | "Set due date" : "Especificar la data d'escasença", 55 | "All day" : "Tota la jornada", 56 | "Details" : "Detalhs", 57 | "Notes" : "Nòtas", 58 | "No upcoming tasks" : "Cap de prètzfach venent", 59 | "upcoming tasks" : "prètzfaches venents", 60 | "No tasks today" : "Cap de prètzfach uèi", 61 | "An error occurred" : "Una error s’es producha" 62 | }, 63 | "nplurals=2; plural=(n > 1);"); 64 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Nextcloud - Tasks 3 | * 4 | * @author Raimund Schlüßler 5 | * 6 | * @copyright 2018 Raimund Schlüßler 7 | * 8 | * This library is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE 10 | * License as published by the Free Software Foundation; either 11 | * version 3 of the License, or any later version. 12 | * 13 | * This library is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU AFFERO GENERAL PUBLIC LICENSE for more details. 17 | * 18 | * You should have received a copy of the GNU Affero General Public 19 | * License along with this library. If not, see . 20 | * 21 | */ 22 | 'use strict' 23 | 24 | import App from './App.vue' 25 | import router from './router.js' 26 | import store from './store/store.js' 27 | import TaskBody from './components/TaskBody.vue' 28 | 29 | import AlertBoxOutline from 'vue-material-design-icons/AlertBoxOutline.vue' 30 | import CalendarRemove from 'vue-material-design-icons/CalendarRemove.vue' 31 | import Cancel from 'vue-material-design-icons/Cancel.vue' 32 | import Check from 'vue-material-design-icons/Check.vue' 33 | import Delete from 'vue-material-design-icons/TrashCanOutline.vue' 34 | import Eye from 'vue-material-design-icons/EyeOutline.vue' 35 | import EyeOff from 'vue-material-design-icons/EyeOffOutline.vue' 36 | import Pulse from 'vue-material-design-icons/Pulse.vue' 37 | import TrendingUp from 'vue-material-design-icons/TrendingUp.vue' 38 | 39 | import { createApp } from 'vue' 40 | 41 | if (!OCA.Tasks) { 42 | /** 43 | * @namespace OCA.Tasks 44 | */ 45 | OCA.Tasks = {} 46 | } 47 | 48 | const Tasks = createApp(App) 49 | /** 50 | * We import TaskBody here globally, because we have a circular dependency 51 | * between TaskDragContainer and TaskBody which otherwise cannot be resolved. 52 | */ 53 | .component('TaskBody', TaskBody) 54 | .component('IconAlertBoxOutline', AlertBoxOutline) 55 | .component('IconCalendarRemove', CalendarRemove) 56 | .component('IconCancel', Cancel) 57 | .component('IconCheck', Check) 58 | .component('IconDelete', Delete) 59 | .component('IconEye', Eye) 60 | .component('IconEyeOff', EyeOff) 61 | .component('IconPulse', Pulse) 62 | .component('IconTrendingUp', TrendingUp) 63 | .provide('$OCA', OCA) 64 | .provide('$appVersion', appVersion) 65 | .use(router) 66 | .use(store) 67 | .mount('.app-tasks') 68 | 69 | OCA.Tasks.App = Tasks 70 | -------------------------------------------------------------------------------- /l10n/es_AR.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Important" : "Importante", 3 | "Today" : "Hoy", 4 | "Week" : "Semana", 5 | "All" : "Todos", 6 | "Current" : "Actual", 7 | "Completed" : "Completado", 8 | "Tasks" : "Tareas", 9 | "Hidden" : "Oculto", 10 | "Visible" : "Visible", 11 | "Automatic" : "Automático", 12 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 13 | "Share with users or groups" : "Compartir con usuarios o grupos", 14 | "No users or groups" : "No hay usuarios ni grupos.", 15 | "Unable to delete the share." : "No se puede eliminar el recurso compartido.", 16 | "Unable to change permissions." : "No se pueden cambiar los permisos.", 17 | "Can edit" : "Puede editar", 18 | "An empty name is not allowed." : "No se permite un nombre vacío.", 19 | "Edit" : "Editar", 20 | "Copied" : "Copiado", 21 | "Export" : "Exportar", 22 | "Delete" : "Borrar", 23 | "Unshare" : "No compartir", 24 | "Empty trash bin" : "Vaciar la papelera", 25 | "Name" : "Nombre", 26 | "Deleted" : "Eliminado", 27 | "Restore" : "Restaurar", 28 | "Delete permanently" : "Borrar permanentemente", 29 | "Cancel" : "Cancelar", 30 | "Email" : "Correo electrónico", 31 | "Go back" : "Regresar", 32 | "Close" : "Cerrar", 33 | "No errors" : "Sin errores", 34 | "Open your browser console for more details" : "Abra la consola de su navegador para más detalles", 35 | "Select tags to filter by" : "Seleccione las etiquetas para el filtro", 36 | "Start date" : "Fecha de inicio", 37 | "Due date" : "Fecha de vencimiento", 38 | "Last modified" : "Última modificación", 39 | "Priority" : "Prioridad", 40 | "Alphabetically" : "Alfabéticamente", 41 | "Tags" : "Etiquetas", 42 | "Manually" : "Manualmente", 43 | "Change sort order" : "Cambiar el criterio para ordenar", 44 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 45 | "Tomorrow" : "Mañana", 46 | "When shared show full event" : "Al compartir, mostrar el evento completo", 47 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 48 | "When shared hide this event" : "Al compartir, ocultar este evento ", 49 | "Task not found!" : "¡Tarea no encontrada!", 50 | "Set start date" : "Establecer fecha de inicio", 51 | "Set due date" : "Establecer fecha de vencimiento", 52 | "All day" : "Todo el día", 53 | "Details" : "Detalles", 54 | "Notes" : "Notas", 55 | "An error occurred" : "Ocurrió un error" 56 | },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 57 | } -------------------------------------------------------------------------------- /l10n/es_AR.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "tasks", 3 | { 4 | "Important" : "Importante", 5 | "Today" : "Hoy", 6 | "Week" : "Semana", 7 | "All" : "Todos", 8 | "Current" : "Actual", 9 | "Completed" : "Completado", 10 | "Tasks" : "Tareas", 11 | "Hidden" : "Oculto", 12 | "Visible" : "Visible", 13 | "Automatic" : "Automático", 14 | "Visibility of Smart Collections" : "Visibilidad de Colecciones Inteligentes", 15 | "Share with users or groups" : "Compartir con usuarios o grupos", 16 | "No users or groups" : "No hay usuarios ni grupos.", 17 | "Unable to delete the share." : "No se puede eliminar el recurso compartido.", 18 | "Unable to change permissions." : "No se pueden cambiar los permisos.", 19 | "Can edit" : "Puede editar", 20 | "An empty name is not allowed." : "No se permite un nombre vacío.", 21 | "Edit" : "Editar", 22 | "Copied" : "Copiado", 23 | "Export" : "Exportar", 24 | "Delete" : "Borrar", 25 | "Unshare" : "No compartir", 26 | "Empty trash bin" : "Vaciar la papelera", 27 | "Name" : "Nombre", 28 | "Deleted" : "Eliminado", 29 | "Restore" : "Restaurar", 30 | "Delete permanently" : "Borrar permanentemente", 31 | "Cancel" : "Cancelar", 32 | "Email" : "Correo electrónico", 33 | "Go back" : "Regresar", 34 | "Close" : "Cerrar", 35 | "No errors" : "Sin errores", 36 | "Open your browser console for more details" : "Abra la consola de su navegador para más detalles", 37 | "Select tags to filter by" : "Seleccione las etiquetas para el filtro", 38 | "Start date" : "Fecha de inicio", 39 | "Due date" : "Fecha de vencimiento", 40 | "Last modified" : "Última modificación", 41 | "Priority" : "Prioridad", 42 | "Alphabetically" : "Alfabéticamente", 43 | "Tags" : "Etiquetas", 44 | "Manually" : "Manualmente", 45 | "Change sort order" : "Cambiar el criterio para ordenar", 46 | "_%n Completed Task_::_%n Completed Tasks_" : ["%n Tarea Completada","%n Tareas Completadas","%n Tareas Completadas"], 47 | "Tomorrow" : "Mañana", 48 | "When shared show full event" : "Al compartir, mostrar el evento completo", 49 | "When shared show only busy" : "Al compartir, mostrar sólo como ocupado ", 50 | "When shared hide this event" : "Al compartir, ocultar este evento ", 51 | "Task not found!" : "¡Tarea no encontrada!", 52 | "Set start date" : "Establecer fecha de inicio", 53 | "Set due date" : "Establecer fecha de vencimiento", 54 | "All day" : "Todo el día", 55 | "Details" : "Detalles", 56 | "Notes" : "Notas", 57 | "An error occurred" : "Ocurrió un error" 58 | }, 59 | "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); 60 | -------------------------------------------------------------------------------- /src/components/AppSidebar/Alarm/AlarmTimeUnitSelect.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 16 | 17 | 113 | --------------------------------------------------------------------------------