diff --git a/.github/workflows/app-code-check.yml b/.github/workflows/app-code-check-7.yml similarity index 95% rename from .github/workflows/app-code-check.yml rename to .github/workflows/app-code-check-7.yml index bc6d4d77d..b16971b92 100644 --- a/.github/workflows/app-code-check.yml +++ b/.github/workflows/app-code-check-7.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: php-versions: ['7.4'] - server-versions: ['master', 'stable18', 'stable19', 'stable20'] + server-versions: ['master', 'stable19', 'stable20'] name: AppCode check php${{ matrix.php-versions }}-${{ matrix.server-versions }} steps: diff --git a/.github/workflows/app-code-check-8.yml b/.github/workflows/app-code-check-8.yml new file mode 100644 index 000000000..17c65d3bd --- /dev/null +++ b/.github/workflows/app-code-check-8.yml @@ -0,0 +1,55 @@ +name: PHP AppCode Check + +on: + pull_request: + push: + branches: + - master + - stable* + +env: + APP_NAME: polls + +jobs: + unit-tests: + runs-on: ubuntu-latest + + strategy: + matrix: + php-versions: ['8.0'] + server-versions: ['master'] + + name: AppCode check php${{ matrix.php-versions }}-${{ matrix.server-versions }} + steps: + - name: Checkout server + uses: actions/checkout@v2 + with: + repository: nextcloud/server + ref: ${{ matrix.server-versions }} + + - name: Checkout submodules + shell: bash + run: | + auth_header="$(git config --local --get http.https://github.com/.extraheader)" + git submodule sync --recursive + git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 + + - name: Checkout app + uses: actions/checkout@v2 + with: + path: apps/${{ env.APP_NAME }} + + - name: Set up php ${{ matrix.php-versions }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + tools: phpunit + extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite + + - name: Checkout app + uses: actions/checkout@v2 + with: + path: apps/${{ env.APP_NAME }} + + - name: App code check + run: php occ app:check-code ${{ env.APP_NAME }} diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml new file mode 100644 index 000000000..26801ebbe --- /dev/null +++ b/.github/workflows/backport.yml @@ -0,0 +1,16 @@ +name: Backport +on: + pull_request: + types: + - closed + - labeled + +jobs: + backport: + runs-on: ubuntu-18.04 + name: Backport + steps: + - name: Backport + uses: tibdex/backport@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ebe80bc9b..f31c46d78 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - php-versions: [7.4] + php-versions: [7.4, 8.0] name: php-cs diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 50e7c42da..69003945f 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -18,7 +18,7 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: ['7.4'] + php-versions: ['7.4', '8.0'] databases: ['sqlite'] server-versions: ['master'] @@ -48,7 +48,7 @@ jobs: with: php-version: ${{ matrix.php-versions }} tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite + extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd coverage: none - name: Set up PHPUnit @@ -79,7 +79,7 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: ['7.3', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] databases: ['mysql'] server-versions: ['master'] @@ -118,7 +118,7 @@ jobs: with: php-version: ${{ matrix.php-versions }} tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, mysql, pdo_mysql + extensions: mbstring, iconv, fileinfo, intl, mysql, pdo_mysql, zip, gd coverage: none - name: Set up PHPUnit @@ -149,7 +149,7 @@ jobs: # do not stop on another job's failure fail-fast: false matrix: - php-versions: ['7.4'] + php-versions: ['7.4', '8.0'] databases: ['pgsql'] server-versions: ['master'] @@ -190,7 +190,7 @@ jobs: with: php-version: ${{ matrix.php-versions }} tools: phpunit - extensions: mbstring, iconv, fileinfo, intl, pgsql, pdo_pgsql + extensions: mbstring, iconv, fileinfo, intl, pgsql, pdo_pgsql, zip, gd coverage: none - name: Set up PHPUnit diff --git a/CHANGELOG.md b/CHANGELOG.md index bd8fb670e..77e1ee1f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,54 @@ # Changelog All notable changes to this project will be documented in this file. -## [1.7.2 - beta3] - tbd +## [1.8.0] - tbd + - [enhancement] - #1367 - Immediately adopt changes from other users to the current poll + - [fix] #1374 - fix uniqueContraintsException when shifting dates + +## [1.7.4] - 2021-01-30 +### new Features since 1.6.x + - Send invitations via notification app + - Reload current poll every 30 seconds for updates + - Admin users can delete and takeover polls from other users via new admin section + - Respect autocompletion limitations from share settings for users, group and circle searches + - Limit number of participants per option + - Limit number of votes per participant + - Combine registration dialogs into one dialog for public polls + - Show closed polls in the relevant list until four days after closing date + - Changed display of expiration timespan in polls overview + - Support dark mode and dark theme + - Compatible with Nextcloud 21 + - Drop support for Nextcloud before 19 + +### Bugfixes since 1.6.x + - Linebreaks in description were ignored + - Avoid concurrent long term user searches with a big user base + - Speed up poll overview, by avoiding unnecessary loading of polls, the user is not allowed to see + - Avoid duplicates in different tables + - Invalid string text in the email + + See also https://github.com/nextcloud/polls/milestone/31?closed=1 + +## [1.7.3 - RC1] - 2021-01-27 + - [enhancement] #1358 - show closed polls in the relevant list until four days after closing date + - [enhancement] #1358 - add warning class to hints in the configuration + - [fix] #1355 - fix migration + - [fix] #1358 - detect conflicts after vote click, if limits are set and more than one user is voting + - [fix] #1358 - menu in poll list was not clickable + - [fix] #1357 - copy participants was broken + - [dependencies] Updated dependencies + - [dependencies] fix calendar popover (@nextcloud/vue@3.5.4) + +## [1.7.2 - beta3] - 2021-01-17 + - [enhancement] #1338 - Support dark mode and dark theme - [fix] #1346 - user search broken - [fix] #1344 - prevent commenting, when entering public poll without registration - - [fix] #1338 - Support dark mode and dark theme ## [1.7.1 - beta2] - 2021-01-12 - [fix] #1325 - There are no spaces in the column name - [fix] #1326 - Invalid string text in the email - [enhancement] #739 - Limit number of participants per option - - [enhancement] #738 - Limit numer of votes per participant (also #647, #624) + - [enhancement] #738 - Limit number of votes per participant (also #647, #624) - [dependencies] Updated dependencies - [refactoring] Mainly code maintenance and optimizations, bug fixes @@ -26,7 +64,8 @@ All notable changes to this project will be documented in this file. - [fix] #1183 - Avoid concurrent long term user searches with a big user base - [fix] #1181 - Speed up poll overview, by avoiding unnecessary loading of polls, the user is not allowed to see - See also https://github.com/nextcloud/polls/milestone/31?closed=1 +## [1.6.3] - 2020-11-23 + - [fix] #1252 External user is not listed in admin's shares list ## [1.6.2] - 2020-11-19 - [fix] Subscription was missing for logged in users diff --git a/README.md b/README.md index 0453e7478..308548c44 100644 --- a/README.md +++ b/README.md @@ -9,27 +9,32 @@ This is a poll app, similar to doodle or dudle, for Nextcloud written in PHP and ## Features - :bar_chart: Create / edit polls (datetimes and texts) -- :date: Set an expiration date +- :date: Set a closing date - :lock: Restrict access (all site users or invited users only) - :speech_balloon: Comments -- Create public polls -- Invite users, groups and contacts (directly or via circles or contact groups) -- Hide results until the poll is closed -- Create anonymised polls (participants names get pseudonymized for other users) +- Share poll with users, groups, contacts and circles +- Invite external users with a unique link or via email address +- Hide results permanently or until the poll is closed +- Confirm options after poll closing +- Create anonymized polls (participants names get pseudonymized for other users) +- Limit possible answers per option and per user +- Subscribe to notifications +- Get hints about possible conflicting entries in your calendar around the date option +- Switch between list and table view +- Configure your preferred view for date and text polls ## Bugs - https://github.com/nextcloud/polls/issues -## Screenshots +## Screenshots (table view) Create a new poll from the navigation bar and get an overview of your polls  -#### Vote and comment +#### Vote and comment (list view)  #### Edit poll inside the vote page  - #### Add shared links to your poll  @@ -38,7 +43,7 @@ Create a new poll from the navigation bar and get an overview of your polls  ## Installation / Update -This app is supposed to work on Nextcloud version 17+. +This app is supposed to work on Nextcloud version 19+. ### Install latest release You can download and install the latest release from the [Nextcloud app store](https://apps.nextcloud.com/apps/polls). diff --git a/appinfo/info.xml b/appinfo/info.xml index 746fa7430..8764ec244 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -5,7 +5,7 @@ <name>Polls</name> <summary>A polls app, similar to doodle/dudle with the possibility to restrict access.</summary> <description>A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public).</description> - <version>1.7.2</version> + <version>1.8.0</version> <licence>agpl</licence> <author>Vinzenz Rosenkranz</author> <author>René Gieling</author> @@ -29,9 +29,13 @@ <job>OCA\Polls\Cron\NotificationCron</job> </background-jobs> <repair-steps> - <pre-migration> - <step>OCA\Polls\Migration\DeleteDuplicates</step> + <pre-migration> + <step>OCA\Polls\Migration\RemoveIndices</step> + <step>OCA\Polls\Migration\DeleteDuplicates</step> </pre-migration> + <post-migration> + <step>OCA\Polls\Migration\CreateIndices</step> + </post-migration> </repair-steps> <navigations> <navigation> diff --git a/appinfo/routes.php b/appinfo/routes.php index e90b541d9..2f6b8b307 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -40,6 +40,7 @@ ['name' => 'public#resend_invitation', 'url' => '/s/{token}/resend', 'verb' => 'GET'], ['name' => 'public#validate_public_username', 'url' => '/check/username', 'verb' => 'POST'], ['name' => 'public#validate_email_address', 'url' => '/check/emailaddress/{emailAddress}', 'verb' => 'GET'], + ['name' => 'public#watch_poll', 'url' => '/s/{token}/watch', 'verb' => 'GET'], ['name' => 'admin#index', 'url' => '/administration', 'verb' => 'GET'], ['name' => 'admin#list', 'url' => '/administration/polls', 'verb' => 'GET'], @@ -58,7 +59,7 @@ ['name' => 'poll#switchDeleted', 'url' => '/poll/{pollId}/switchDeleted', 'verb' => 'PUT'], ['name' => 'poll#clone', 'url' => '/poll/{pollId}/clone', 'verb' => 'GET'], - ['name' => 'poll#getParticipantsEmailAddresses', 'url' => '/polls/{pollId}/addresses', 'verb' => 'GET'], + ['name' => 'poll#getParticipantsEmailAddresses', 'url' => '/poll/{pollId}/addresses', 'verb' => 'GET'], ['name' => 'option#list', 'url' => '/poll/{pollId}/options', 'verb' => 'GET'], ['name' => 'option#add', 'url' => '/option', 'verb' => 'POST'], @@ -92,6 +93,7 @@ ['name' => 'comment#delete', 'url' => '/comment/{commentId}', 'verb' => 'DELETE', 'postfix' => 'auth'], ['name' => 'system#user_search', 'url' => '/search/users/{query}', 'verb' => 'GET'], + ['name' => 'watch#watch_poll', 'url' => '/poll/{pollId}/watch', 'verb' => 'GET'], ['name' => 'preferences#write', 'url' => '/preferences/write', 'verb' => 'POST'], ['name' => 'preferences#get', 'url' => '/preferences/get', 'verb' => 'GET'], diff --git a/l10n/ca.js b/l10n/ca.js index 2d283ce42..e521344e1 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -2,16 +2,26 @@ OC.L10N.register( "polls", { "Contact" : "Contacte", + "Contact group" : "Grup de contactes", + "External Email" : "Correu electrònic extern", "Public link" : "Enllaç públic", + "External user" : "Usuari extern", "Group" : "Grup", "User" : "Usuari", "Polls" : "Enquestes", + "%s invited you to a poll" : "%s l'ha invitat a una enquesta", + "{user} has invited you to the poll \"%s\"." : "{user} l'ha invitat a l'enquesta \"%s\"", + "%s took over your poll" : "%s s'ha fet el càrrec de la vostra enquesta", + "{user} took over your poll \"%s\" and is the new owner." : "{user} s'ha fet càrrec de la vostra enquesta \"%s\" i és el nou propietari", + "%s permanently deleted your poll" : "%s s'ha suprimit de manera permanent la vostra enquesta", "- %s voted." : "- %s ha votat.", + "- The poll got deleted." : "- L'enquesta s'ha suprimit.", + "- The poll got restored." : "- L'enquesta s'ha restaurat.", "Polls App - New Activity" : "Aplicació d'Enquestes - Nova Activitat", "\"{title}\" had recent activity: " : "\"{title}\" ha tingut activitat recent: ", "A user" : "Un usuari", "Go to poll" : "Vés a l'enquesta", - "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "Aquest correu electrònic s'envia a vostè, perquè es va subscriure a les notificacions d'aquesta enquesta. Per donar-se de baixa, visita l'enquesta i suprimeix la subscripció.", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "Aquest correu electrònic s'envia, perquè et vas subscriure a les notificacions d'aquesta enquesta. Per donar-te de baixa, visita l'enquesta i elimina la subscripció.", "Poll invitation \"%s\"" : "Invitació a Enquesta \"%s\"", "{owner} invited you to take part in the poll \"{title}\"" : "{owner} us va convidar a participar en l'enquesta \"{title}\"", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Aquest enllaç us dóna accés personal a l'enquesta que s'ha anomenat anteriorment. Premeu el botó de dalt o copieu l'enllaç següent i afegiu-lo a la barra d'ubicació del navegador: ", @@ -35,7 +45,7 @@ OC.L10N.register( "Results are hidden." : "Els resultats estan ocults.", "The used time zone is {timeZone}." : "La zona horària utilitzada és {timeZone}.", "Public poll" : "Enquesta pública", - "To participate, tell us how we can call you!" : "Per participar-hi, explica'ns com podem trucar-te!", + "To participate, tell us how we can call you!" : "Per participar-hi, explica'ns com podem anomenar-te!", "Enter your name" : "Introdueix el teu nom", "Optional email address" : "Correu electrònic opcional", "Cancel" : "Cancel·la", @@ -43,12 +53,13 @@ OC.L10N.register( "Checking username …" : "S'està comprovant el nom d'usuari …", "Please use at least 3 characters." : "Si us plau, utilitzeu almenys 3 caràcters.", "This name is not valid." : "Aquest nom no és vàlid.", - "OK, we will call you {username}." : "D'acord, us trucarem {username}.", + "OK, we will call you {username}." : "D'acord, us anomenarem {username}.", "Checking email address …" : "Comprovació de l'adreça de correu electrònic …", " " : " ", "This email address is not valid." : "Aquesta adreça de correu no és vàlida", "This email address is valid." : "Aquesta adreça electrònica és vàlida.", "Error saving username" : "Error en desar el nom d'usuari", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "Introdueix la teva adreça de correu electrònic per poder subscriure't a les actualitzacions i obtenir el teu enllaç personal per correu electrònic.", "Enter a name to start the search" : "Introduïu un nom per iniciar la cerca", "Error while adding share" : "Error en afegir compartició", "Conflict" : "Conflicte", @@ -60,9 +71,9 @@ OC.L10N.register( "Title" : "Títol", "Enter Title" : "Introduïu el títol", "Poll type" : "Tipus d'enquesta", + "Apply" : "Aplica", "Date poll" : "Enquesta de dates", "Text poll" : "Enquesta de text", - "Apply" : "Aplica", "Poll \"{pollTitle}\" added" : "S'ha afegit l'enquesta \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "S'ha produït un error en crear l'enquesta \"{pollTitle}\"", "Add new Poll" : "Afegeix una enquesta nova", @@ -128,7 +139,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Com a administrador podeu editar aquesta enquesta", "Description" : "Descripció", "Poll configurations" : "Configuracions de l'enquesta", - "Allow \"maybe\" vote" : "Permet el vot \"potser\"", "Anonymous poll" : "Enquesta anònima", "Allow admins to edit this poll" : "Permet als administradors editar aquesta enquesta", "Relevant for all users" : "Rellevant per a tots els usuaris", diff --git a/l10n/ca.json b/l10n/ca.json index 3ffde2b99..317416192 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -1,15 +1,25 @@ { "translations": { "Contact" : "Contacte", + "Contact group" : "Grup de contactes", + "External Email" : "Correu electrònic extern", "Public link" : "Enllaç públic", + "External user" : "Usuari extern", "Group" : "Grup", "User" : "Usuari", "Polls" : "Enquestes", + "%s invited you to a poll" : "%s l'ha invitat a una enquesta", + "{user} has invited you to the poll \"%s\"." : "{user} l'ha invitat a l'enquesta \"%s\"", + "%s took over your poll" : "%s s'ha fet el càrrec de la vostra enquesta", + "{user} took over your poll \"%s\" and is the new owner." : "{user} s'ha fet càrrec de la vostra enquesta \"%s\" i és el nou propietari", + "%s permanently deleted your poll" : "%s s'ha suprimit de manera permanent la vostra enquesta", "- %s voted." : "- %s ha votat.", + "- The poll got deleted." : "- L'enquesta s'ha suprimit.", + "- The poll got restored." : "- L'enquesta s'ha restaurat.", "Polls App - New Activity" : "Aplicació d'Enquestes - Nova Activitat", "\"{title}\" had recent activity: " : "\"{title}\" ha tingut activitat recent: ", "A user" : "Un usuari", "Go to poll" : "Vés a l'enquesta", - "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "Aquest correu electrònic s'envia a vostè, perquè es va subscriure a les notificacions d'aquesta enquesta. Per donar-se de baixa, visita l'enquesta i suprimeix la subscripció.", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "Aquest correu electrònic s'envia, perquè et vas subscriure a les notificacions d'aquesta enquesta. Per donar-te de baixa, visita l'enquesta i elimina la subscripció.", "Poll invitation \"%s\"" : "Invitació a Enquesta \"%s\"", "{owner} invited you to take part in the poll \"{title}\"" : "{owner} us va convidar a participar en l'enquesta \"{title}\"", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Aquest enllaç us dóna accés personal a l'enquesta que s'ha anomenat anteriorment. Premeu el botó de dalt o copieu l'enllaç següent i afegiu-lo a la barra d'ubicació del navegador: ", @@ -33,7 +43,7 @@ "Results are hidden." : "Els resultats estan ocults.", "The used time zone is {timeZone}." : "La zona horària utilitzada és {timeZone}.", "Public poll" : "Enquesta pública", - "To participate, tell us how we can call you!" : "Per participar-hi, explica'ns com podem trucar-te!", + "To participate, tell us how we can call you!" : "Per participar-hi, explica'ns com podem anomenar-te!", "Enter your name" : "Introdueix el teu nom", "Optional email address" : "Correu electrònic opcional", "Cancel" : "Cancel·la", @@ -41,12 +51,13 @@ "Checking username …" : "S'està comprovant el nom d'usuari …", "Please use at least 3 characters." : "Si us plau, utilitzeu almenys 3 caràcters.", "This name is not valid." : "Aquest nom no és vàlid.", - "OK, we will call you {username}." : "D'acord, us trucarem {username}.", + "OK, we will call you {username}." : "D'acord, us anomenarem {username}.", "Checking email address …" : "Comprovació de l'adreça de correu electrònic …", " " : " ", "This email address is not valid." : "Aquesta adreça de correu no és vàlida", "This email address is valid." : "Aquesta adreça electrònica és vàlida.", "Error saving username" : "Error en desar el nom d'usuari", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "Introdueix la teva adreça de correu electrònic per poder subscriure't a les actualitzacions i obtenir el teu enllaç personal per correu electrònic.", "Enter a name to start the search" : "Introduïu un nom per iniciar la cerca", "Error while adding share" : "Error en afegir compartició", "Conflict" : "Conflicte", @@ -58,9 +69,9 @@ "Title" : "Títol", "Enter Title" : "Introduïu el títol", "Poll type" : "Tipus d'enquesta", + "Apply" : "Aplica", "Date poll" : "Enquesta de dates", "Text poll" : "Enquesta de text", - "Apply" : "Aplica", "Poll \"{pollTitle}\" added" : "S'ha afegit l'enquesta \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "S'ha produït un error en crear l'enquesta \"{pollTitle}\"", "Add new Poll" : "Afegeix una enquesta nova", @@ -126,7 +137,6 @@ "As an admin you may edit this poll" : "Com a administrador podeu editar aquesta enquesta", "Description" : "Descripció", "Poll configurations" : "Configuracions de l'enquesta", - "Allow \"maybe\" vote" : "Permet el vot \"potser\"", "Anonymous poll" : "Enquesta anònima", "Allow admins to edit this poll" : "Permet als administradors editar aquesta enquesta", "Relevant for all users" : "Rellevant per a tots els usuaris", diff --git a/l10n/cs.js b/l10n/cs.js index 692ce59e5..00a23d323 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -10,6 +10,13 @@ OC.L10N.register( "User" : "Uživatel", "Polls" : "Ankety", "%s invited you to a poll" : "%s vás pozval(a) do ankety", + "{user} has invited you to the poll \"%s\"." : "{user} vás pozval(a) k účasti v anketě \"%s\".", + "%s took over your poll" : "%s převzal vaší anketu", + "{user} took over your poll \"%s\" and is the new owner." : "{user} převzal vaší anketu \"%s\" a je její nový vlastník.", + "%s permanently deleted your poll" : "%s natrvalo smazal vaší anketu", + "{user} permanently deleted your poll \"%s\"." : "{user} natrvalo smazal vaší anketu \"%s\".", + "%s changed the deleted status of your poll" : "%s změnil stav smazání vaší ankety", + "{user} changed the deleted status of your poll \"%s\"." : "{user} změnil stav smazání vaší ankety \"%s\".", "- %s voted." : "- %s hlasoval(a).", "- Updated poll configuration. Please check your votes." : "- Aktualizovat nastavení ankety. Překontrolujte své volby.", "- The poll got deleted." : "- Anketa byla smazána.", @@ -18,6 +25,7 @@ OC.L10N.register( "- A vote option was added." : "- Byla přidána možnost hlasování.", "- A vote option was removed." : "- Byla odebrána možnost hlasování.", "- The poll owner changed." : "- Změnil se vlastník hlasování.", + "- %s created the poll." : "- %s vytvořil(a) anketu.", "Polls App - New Activity" : "Aplikace ankety – Nová aktivita", "\"{title}\" had recent activity: " : "nedávná aktivita kolem „{title}“: ", "A user" : "Uživatel", @@ -43,6 +51,7 @@ OC.L10N.register( "Copy this link to the clipboard" : "Zkopírovat tento odkaz do schránky", "Resend invitation mail to {emailAdress}" : "Znovu zaslat e-mail s pozvánkou na {emailAdress}", "Invitation resent to {emailAddress}" : "Pozvánka byla znovu odeslána na {emailAddress}", + "Mail could not be resent to {emailAddress}" : "E-mail se nepodařilo znovu poslat na {emailAddress}", "started this poll on {dateString}." : "zahájil(a) tuto anketu {dateString}.", "This poll is closed since {dateString}. The confirmed options are marked below." : "Tato anketa je od {dateString} uzavřena. Potvrzené možnosti jsou označené níže.", "This poll is closed since {dateString}, but there are no confirmed options until now." : "Tato anketa je od {dateString} uzavřena, ale doposud zde nejsou žádné potvrzené volby.", @@ -52,6 +61,12 @@ OC.L10N.register( "Results are hidden." : "Výsledky jsou skryté.", "They will be revealed after the poll is closed." : "Budou odhaleny po uzavření ankety.", "The used time zone is {timeZone}." : "Použité časové pásmo je {timeZone}.", + "Your are only allowed to vote for one option." : "Můžete hlasovat pouze pro jednu možnost.", + "You reached the maximum number of allowed votes." : "Už vám nezbývá žádný hlas.", + "You have only one vote left." : "Zbývá vám poslední hlas.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "Toto je výhradní volba, kde je pouze jednomu uživateli umožneno volit pro možnost.", + "_You have %n vote left._::_You have %n votes left._" : ["Zbývá vám %n hlas.","Zbývá vám %n hlasů.","Zbývá vám %n hlasů.","Zbývají vám %n hlasy."], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["Je povolen pouze %n hlas pro možnost.","Je povoleno pouze %n hlasů pro možnost.","Je povoleno pouze %n hlasů pro možnost.","Jsou povoleny pouze %n hlasy pro možnost."], "Public poll" : "Veřejná anketa", "Do you want to login?" : "Chcete se přihlásit?", "Login" : "Přihlásit", @@ -74,6 +89,7 @@ OC.L10N.register( "Enter a name to start the search" : "Hledání zahájíte zadáním jména", "Error while adding share" : "Chyba při přidávání sdílení", "Conflict" : "Konflikt", + "Got a network error while checking calendar events." : "Při kontrolování událostí kalendáře se stala chyba sítě.", "New comment …" : "Nový komentář…", "Error while saving comment" : "Chyba při ukládání komentáře", "Delete comment" : "Smazat komentář", @@ -82,12 +98,13 @@ OC.L10N.register( "Title" : "Název", "Enter Title" : "Zadejte nadpis", "Poll type" : "Typ ankety", + "Apply" : "Použít", "Date poll" : "Datumová anketa", "Text poll" : "Textová anketa", - "Apply" : "Použít", "Poll \"{pollTitle}\" added" : "Anketa „{pollTitle}“ přidána", "Error while creating Poll \"{pollTitle}\"" : "Chyba při vytváření ankety „{pollTitle}“", "Add new Poll" : "Přidat novou anketu", + "Administration" : "Správa", "Settings" : "Nastavení", "Relevant" : "Relevantní", "My polls" : "Moje ankety", @@ -131,6 +148,8 @@ OC.L10N.register( "All users" : "Všichni uživatelé", "Only invited users" : "Pouze pozvaní uživatelé", "never" : "nikdy", + "Beta - watch for updated polls in realtime" : "Beta - sledujte změny hlasování v reálném čase", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Všechny změny v této anketě, od ostatních uživatelů, budou zobrazeny v reálném čase.", "Try experimental styles" : "Vyzkoušet experimentální styly", "Some experimental UI variants. Changes the background color of the main area." : "Některé experimentální varianty uživatelského rozhraní. Změní barvu pozadí hlavní oblasti.", "Use background image" : "Použít obrázek na pozadí", @@ -171,11 +190,13 @@ OC.L10N.register( "Comments" : "Komentáře", "No comments" : "Žádné komentáře", "Be the first." : "Buďte první.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Prosím, při změnách voleb buďte opatrní, protože mohou nechteným způsobem ovlivnit již existující hlasy.", "As an admin you may edit this poll" : "Coby správce můžete tuto anketu upravovat", "Description" : "Popis", "Poll configurations" : "Nastavení ankety", - "Allow \"maybe\" vote" : "Povolit hlasovat „možná“", "Anonymous poll" : "Anonymní anketa", + "Limit yes votes per user" : "Omezte kladné hlasy pro jednotlivé uživatele", + "Limit yes votes per option" : "Omezte kladné hlasy jednotlivých možností", "Poll closing status" : "Stav uzavření ankety", "Reopen poll" : "Znovuotevřít anketu", "Close poll" : "Uzavřít anketu", @@ -189,6 +210,7 @@ OC.L10N.register( "\"{pollTitle}\" successfully saved" : "„{pollTitle}“ úspěšně uložena", "Title must not be empty!" : "Název je třeba vyplnit!", "Error writing poll" : "Chyba při zápisu do ankety", + "Add Shares" : "Přidat Sdílení", "Receive notification email on activity to {emailAddress}" : "Při aktivitě obdržet oznámení e-mailem na {emailAddress}", "Receive notification email on activity" : "Dostávat e-mailem upozornění na aktivitu", "Delete votes" : "Smazat hlasy", @@ -196,8 +218,18 @@ OC.L10N.register( "No" : "Ne", "Yes" : "Ano", "User {userId} removed" : "Uživatel {userId} odebrán", + "Manage polls" : "Spravovat ankety", + "Manage polls of other users. You can take over the ownership or delete polls." : "Spravujte ankety ostatních uživatelů. Můžete převzít vlastnictví nebo mazat ankety.", "No polls found for this category" : "Pro tuto kategorii nenalezeny žádné ankety", "Add one or change category!" : "Přidejte nebo změňte kategorii!", + "Take over" : "Převzít", + "Set \"deleted\" status" : "Nastavit stav \"smazáno\"", + "Do you want to take over this poll from {username} and change the ownership?" : "Chcete převzít tuto anketu od {username} a změnit její vlastnictví?", + "The original owner will be notified." : "Původní majitel bude obeznámen.", + "Do you want to delete this poll?" : "Chcete smazat tuto anketu?", + "This action cannot be reverted." : "Tuto akci není možné vzít zpět.", + "Error switching deleted status." : "Chyba při přepínání stavu \"smazáno\"", + "Error overtaking poll." : "Chyba při přebírání ankety.", "404 - poll not found" : "404 – anketa nenalezena", "Enter a poll or start a new one." : "Vstupte do ankety nebo uspořádajte novou.", "Goto Nextcloud" : "Přejít do Nextcloud", @@ -215,6 +247,8 @@ OC.L10N.register( "All polls, where you have access to." : "Všechny ankety, ke kterým máte přístup.", "Error loading poll" : "Chyba při načítání ankety", "Toggle Sidebar" : "Zobraz./nezobrazovat postranní panel", + "Closed {relativeTimeAgo}" : "Zavřeno {relativeTimeAgo}", + "Closing {relativeExpirationTime}" : "Zavírání {relativeExpirationTime}", "No vote options available" : "Nejsou k dispozici žádné možnosti volby", "Maybe the owner did not provide some until now." : "Vlastní nejspíš doposud žádné neposkytl.", "Switch to mobile view" : "Přepnout do mobilního zobrazení", diff --git a/l10n/cs.json b/l10n/cs.json index cd5f6a007..e3a18a0da 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -8,6 +8,13 @@ "User" : "Uživatel", "Polls" : "Ankety", "%s invited you to a poll" : "%s vás pozval(a) do ankety", + "{user} has invited you to the poll \"%s\"." : "{user} vás pozval(a) k účasti v anketě \"%s\".", + "%s took over your poll" : "%s převzal vaší anketu", + "{user} took over your poll \"%s\" and is the new owner." : "{user} převzal vaší anketu \"%s\" a je její nový vlastník.", + "%s permanently deleted your poll" : "%s natrvalo smazal vaší anketu", + "{user} permanently deleted your poll \"%s\"." : "{user} natrvalo smazal vaší anketu \"%s\".", + "%s changed the deleted status of your poll" : "%s změnil stav smazání vaší ankety", + "{user} changed the deleted status of your poll \"%s\"." : "{user} změnil stav smazání vaší ankety \"%s\".", "- %s voted." : "- %s hlasoval(a).", "- Updated poll configuration. Please check your votes." : "- Aktualizovat nastavení ankety. Překontrolujte své volby.", "- The poll got deleted." : "- Anketa byla smazána.", @@ -16,6 +23,7 @@ "- A vote option was added." : "- Byla přidána možnost hlasování.", "- A vote option was removed." : "- Byla odebrána možnost hlasování.", "- The poll owner changed." : "- Změnil se vlastník hlasování.", + "- %s created the poll." : "- %s vytvořil(a) anketu.", "Polls App - New Activity" : "Aplikace ankety – Nová aktivita", "\"{title}\" had recent activity: " : "nedávná aktivita kolem „{title}“: ", "A user" : "Uživatel", @@ -41,6 +49,7 @@ "Copy this link to the clipboard" : "Zkopírovat tento odkaz do schránky", "Resend invitation mail to {emailAdress}" : "Znovu zaslat e-mail s pozvánkou na {emailAdress}", "Invitation resent to {emailAddress}" : "Pozvánka byla znovu odeslána na {emailAddress}", + "Mail could not be resent to {emailAddress}" : "E-mail se nepodařilo znovu poslat na {emailAddress}", "started this poll on {dateString}." : "zahájil(a) tuto anketu {dateString}.", "This poll is closed since {dateString}. The confirmed options are marked below." : "Tato anketa je od {dateString} uzavřena. Potvrzené možnosti jsou označené níže.", "This poll is closed since {dateString}, but there are no confirmed options until now." : "Tato anketa je od {dateString} uzavřena, ale doposud zde nejsou žádné potvrzené volby.", @@ -50,6 +59,12 @@ "Results are hidden." : "Výsledky jsou skryté.", "They will be revealed after the poll is closed." : "Budou odhaleny po uzavření ankety.", "The used time zone is {timeZone}." : "Použité časové pásmo je {timeZone}.", + "Your are only allowed to vote for one option." : "Můžete hlasovat pouze pro jednu možnost.", + "You reached the maximum number of allowed votes." : "Už vám nezbývá žádný hlas.", + "You have only one vote left." : "Zbývá vám poslední hlas.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "Toto je výhradní volba, kde je pouze jednomu uživateli umožneno volit pro možnost.", + "_You have %n vote left._::_You have %n votes left._" : ["Zbývá vám %n hlas.","Zbývá vám %n hlasů.","Zbývá vám %n hlasů.","Zbývají vám %n hlasy."], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["Je povolen pouze %n hlas pro možnost.","Je povoleno pouze %n hlasů pro možnost.","Je povoleno pouze %n hlasů pro možnost.","Jsou povoleny pouze %n hlasy pro možnost."], "Public poll" : "Veřejná anketa", "Do you want to login?" : "Chcete se přihlásit?", "Login" : "Přihlásit", @@ -72,6 +87,7 @@ "Enter a name to start the search" : "Hledání zahájíte zadáním jména", "Error while adding share" : "Chyba při přidávání sdílení", "Conflict" : "Konflikt", + "Got a network error while checking calendar events." : "Při kontrolování událostí kalendáře se stala chyba sítě.", "New comment …" : "Nový komentář…", "Error while saving comment" : "Chyba při ukládání komentáře", "Delete comment" : "Smazat komentář", @@ -80,12 +96,13 @@ "Title" : "Název", "Enter Title" : "Zadejte nadpis", "Poll type" : "Typ ankety", + "Apply" : "Použít", "Date poll" : "Datumová anketa", "Text poll" : "Textová anketa", - "Apply" : "Použít", "Poll \"{pollTitle}\" added" : "Anketa „{pollTitle}“ přidána", "Error while creating Poll \"{pollTitle}\"" : "Chyba při vytváření ankety „{pollTitle}“", "Add new Poll" : "Přidat novou anketu", + "Administration" : "Správa", "Settings" : "Nastavení", "Relevant" : "Relevantní", "My polls" : "Moje ankety", @@ -129,6 +146,8 @@ "All users" : "Všichni uživatelé", "Only invited users" : "Pouze pozvaní uživatelé", "never" : "nikdy", + "Beta - watch for updated polls in realtime" : "Beta - sledujte změny hlasování v reálném čase", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Všechny změny v této anketě, od ostatních uživatelů, budou zobrazeny v reálném čase.", "Try experimental styles" : "Vyzkoušet experimentální styly", "Some experimental UI variants. Changes the background color of the main area." : "Některé experimentální varianty uživatelského rozhraní. Změní barvu pozadí hlavní oblasti.", "Use background image" : "Použít obrázek na pozadí", @@ -169,11 +188,13 @@ "Comments" : "Komentáře", "No comments" : "Žádné komentáře", "Be the first." : "Buďte první.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Prosím, při změnách voleb buďte opatrní, protože mohou nechteným způsobem ovlivnit již existující hlasy.", "As an admin you may edit this poll" : "Coby správce můžete tuto anketu upravovat", "Description" : "Popis", "Poll configurations" : "Nastavení ankety", - "Allow \"maybe\" vote" : "Povolit hlasovat „možná“", "Anonymous poll" : "Anonymní anketa", + "Limit yes votes per user" : "Omezte kladné hlasy pro jednotlivé uživatele", + "Limit yes votes per option" : "Omezte kladné hlasy jednotlivých možností", "Poll closing status" : "Stav uzavření ankety", "Reopen poll" : "Znovuotevřít anketu", "Close poll" : "Uzavřít anketu", @@ -187,6 +208,7 @@ "\"{pollTitle}\" successfully saved" : "„{pollTitle}“ úspěšně uložena", "Title must not be empty!" : "Název je třeba vyplnit!", "Error writing poll" : "Chyba při zápisu do ankety", + "Add Shares" : "Přidat Sdílení", "Receive notification email on activity to {emailAddress}" : "Při aktivitě obdržet oznámení e-mailem na {emailAddress}", "Receive notification email on activity" : "Dostávat e-mailem upozornění na aktivitu", "Delete votes" : "Smazat hlasy", @@ -194,8 +216,18 @@ "No" : "Ne", "Yes" : "Ano", "User {userId} removed" : "Uživatel {userId} odebrán", + "Manage polls" : "Spravovat ankety", + "Manage polls of other users. You can take over the ownership or delete polls." : "Spravujte ankety ostatních uživatelů. Můžete převzít vlastnictví nebo mazat ankety.", "No polls found for this category" : "Pro tuto kategorii nenalezeny žádné ankety", "Add one or change category!" : "Přidejte nebo změňte kategorii!", + "Take over" : "Převzít", + "Set \"deleted\" status" : "Nastavit stav \"smazáno\"", + "Do you want to take over this poll from {username} and change the ownership?" : "Chcete převzít tuto anketu od {username} a změnit její vlastnictví?", + "The original owner will be notified." : "Původní majitel bude obeznámen.", + "Do you want to delete this poll?" : "Chcete smazat tuto anketu?", + "This action cannot be reverted." : "Tuto akci není možné vzít zpět.", + "Error switching deleted status." : "Chyba při přepínání stavu \"smazáno\"", + "Error overtaking poll." : "Chyba při přebírání ankety.", "404 - poll not found" : "404 – anketa nenalezena", "Enter a poll or start a new one." : "Vstupte do ankety nebo uspořádajte novou.", "Goto Nextcloud" : "Přejít do Nextcloud", @@ -213,6 +245,8 @@ "All polls, where you have access to." : "Všechny ankety, ke kterým máte přístup.", "Error loading poll" : "Chyba při načítání ankety", "Toggle Sidebar" : "Zobraz./nezobrazovat postranní panel", + "Closed {relativeTimeAgo}" : "Zavřeno {relativeTimeAgo}", + "Closing {relativeExpirationTime}" : "Zavírání {relativeExpirationTime}", "No vote options available" : "Nejsou k dispozici žádné možnosti volby", "Maybe the owner did not provide some until now." : "Vlastní nejspíš doposud žádné neposkytl.", "Switch to mobile view" : "Přepnout do mobilního zobrazení", diff --git a/l10n/da.js b/l10n/da.js index 39b9ae38c..a4f60b774 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -32,7 +32,6 @@ OC.L10N.register( "Shares" : "Delinger", "Comments" : "Kommentarer", "Description" : "Beskrivelse", - "Allow \"maybe\" vote" : "Tillad \"måske\" stemmer", "Anonymous poll" : "Anonym afstemning", "Title must not be empty!" : "Overskriften må ikke være tom!", "Receive notification email on activity" : "Modtag notifikationsemail om aktivitet", diff --git a/l10n/da.json b/l10n/da.json index 5ecfad83d..bbbfda035 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -30,7 +30,6 @@ "Shares" : "Delinger", "Comments" : "Kommentarer", "Description" : "Beskrivelse", - "Allow \"maybe\" vote" : "Tillad \"måske\" stemmer", "Anonymous poll" : "Anonym afstemning", "Title must not be empty!" : "Overskriften må ikke være tom!", "Receive notification email on activity" : "Modtag notifikationsemail om aktivitet", diff --git a/l10n/de.js b/l10n/de.js index 130b64060..981697814 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Titel", "Enter Title" : "Titel eingeben", "Poll type" : "Umfragetyp", + "Apply" : "Anwenden", "Date poll" : "Datumsumfrage", "Text poll" : "Textumfrage", - "Apply" : "Anwenden", "Poll \"{pollTitle}\" added" : "Umfrage \"{pollTitle}\" hinzugefügt", "Error while creating Poll \"{pollTitle}\"" : "Fehler beim Erstellen der Umfrage \"{pollTitle}\"", "Add new Poll" : "Neue Umfrage hinzufügen", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Alle Benutzer", "Only invited users" : "Nur eingeladene Benutzer", "never" : "nie", + "Beta - watch for updated polls in realtime" : "Beta - Beobachte in Echtzeit Umfrage-Aktualisierungen", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle Änderungen an der aktuellen Umfrage, die von anderen Benutzern vorgenommen wurden, werden in Echtzeit erkannt.", "Try experimental styles" : "Probiere experimentelle Stile aus", "Some experimental UI variants. Changes the background color of the main area." : "Einige experimentelle Oberflächen-Varianten. Ändert die Hintergrundfarbe des Hauptbereichs.", "Use background image" : "Hintergrundbild verwenden", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Als Administrator kannst Du diese Umfrage bearbeiten", "Description" : "Beschreibung", "Poll configurations" : "Umfragekonfigurationen", - "Allow \"maybe\" vote" : "\"Vielleicht\" erlauben", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Wenn Stimmlimits verwendet werden, sollte \"vielleicht\" nicht erlaubt sein.", "Anonymous poll" : "Anonyme Umfrage", "Limit yes votes per user" : "Ja-Stimmen pro Benutzer begrenzen", "Limit yes votes per option" : "Ja-Stimmen pro Option begrenzen", diff --git a/l10n/de.json b/l10n/de.json index e5b73a629..80d1bd8e5 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -96,9 +96,9 @@ "Title" : "Titel", "Enter Title" : "Titel eingeben", "Poll type" : "Umfragetyp", + "Apply" : "Anwenden", "Date poll" : "Datumsumfrage", "Text poll" : "Textumfrage", - "Apply" : "Anwenden", "Poll \"{pollTitle}\" added" : "Umfrage \"{pollTitle}\" hinzugefügt", "Error while creating Poll \"{pollTitle}\"" : "Fehler beim Erstellen der Umfrage \"{pollTitle}\"", "Add new Poll" : "Neue Umfrage hinzufügen", @@ -146,6 +146,8 @@ "All users" : "Alle Benutzer", "Only invited users" : "Nur eingeladene Benutzer", "never" : "nie", + "Beta - watch for updated polls in realtime" : "Beta - Beobachte in Echtzeit Umfrage-Aktualisierungen", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle Änderungen an der aktuellen Umfrage, die von anderen Benutzern vorgenommen wurden, werden in Echtzeit erkannt.", "Try experimental styles" : "Probiere experimentelle Stile aus", "Some experimental UI variants. Changes the background color of the main area." : "Einige experimentelle Oberflächen-Varianten. Ändert die Hintergrundfarbe des Hauptbereichs.", "Use background image" : "Hintergrundbild verwenden", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Als Administrator kannst Du diese Umfrage bearbeiten", "Description" : "Beschreibung", "Poll configurations" : "Umfragekonfigurationen", - "Allow \"maybe\" vote" : "\"Vielleicht\" erlauben", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Wenn Stimmlimits verwendet werden, sollte \"vielleicht\" nicht erlaubt sein.", "Anonymous poll" : "Anonyme Umfrage", "Limit yes votes per user" : "Ja-Stimmen pro Benutzer begrenzen", "Limit yes votes per option" : "Ja-Stimmen pro Option begrenzen", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index dafeee150..dde3f7dc3 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Titel", "Enter Title" : "Titel eingeben", "Poll type" : "Umfragetyp", + "Apply" : "Anwenden", "Date poll" : "Datumsumfrage", "Text poll" : "Textumfrage", - "Apply" : "Anwenden", "Poll \"{pollTitle}\" added" : "Umfrage \"{pollTitle}\" hinzugefügt", "Error while creating Poll \"{pollTitle}\"" : "Fehler beim Erstellen der Umfrage \"{pollTitle}\"", "Add new Poll" : "Neue Umfrage hinzufügen", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Alle Benutzer", "Only invited users" : "Nur eingeladene Benutzer", "never" : "nie", + "Beta - watch for updated polls in realtime" : "Beta - Beobachten Sie Umfrage-Aktualisierungen in Echtzeit", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle Änderungen an der aktuellen Umfrage, die von anderen Benutzern vorgenommen wurden, werden in Echtzeit erkannt.", "Try experimental styles" : "Probieren Sie experimentelle Stile aus", "Some experimental UI variants. Changes the background color of the main area." : "Einige experimentelle Oberflächen-Varianten. Ändert die Hintergrundfarbe des Hauptbereichs.", "Use background image" : "Hintergrundbild verwenden", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Als Administrator können Sie diese Umfrage bearbeiten", "Description" : "Beschreibung", "Poll configurations" : "Umfragekonfigurationen", - "Allow \"maybe\" vote" : "\"Vielleicht\" erlauben", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Wenn Stimmlimits verwendet werden, sollte \"vielleicht\" nicht erlaubt sein.", "Anonymous poll" : "Anonyme Umfrage", "Limit yes votes per user" : "Ja-Stimmen pro Benutzer begrenzen", "Limit yes votes per option" : "Ja-Stimmen pro Option begrenzen", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index e22fcb060..9aa72db94 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -96,9 +96,9 @@ "Title" : "Titel", "Enter Title" : "Titel eingeben", "Poll type" : "Umfragetyp", + "Apply" : "Anwenden", "Date poll" : "Datumsumfrage", "Text poll" : "Textumfrage", - "Apply" : "Anwenden", "Poll \"{pollTitle}\" added" : "Umfrage \"{pollTitle}\" hinzugefügt", "Error while creating Poll \"{pollTitle}\"" : "Fehler beim Erstellen der Umfrage \"{pollTitle}\"", "Add new Poll" : "Neue Umfrage hinzufügen", @@ -146,6 +146,8 @@ "All users" : "Alle Benutzer", "Only invited users" : "Nur eingeladene Benutzer", "never" : "nie", + "Beta - watch for updated polls in realtime" : "Beta - Beobachten Sie Umfrage-Aktualisierungen in Echtzeit", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle Änderungen an der aktuellen Umfrage, die von anderen Benutzern vorgenommen wurden, werden in Echtzeit erkannt.", "Try experimental styles" : "Probieren Sie experimentelle Stile aus", "Some experimental UI variants. Changes the background color of the main area." : "Einige experimentelle Oberflächen-Varianten. Ändert die Hintergrundfarbe des Hauptbereichs.", "Use background image" : "Hintergrundbild verwenden", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Als Administrator können Sie diese Umfrage bearbeiten", "Description" : "Beschreibung", "Poll configurations" : "Umfragekonfigurationen", - "Allow \"maybe\" vote" : "\"Vielleicht\" erlauben", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Wenn Stimmlimits verwendet werden, sollte \"vielleicht\" nicht erlaubt sein.", "Anonymous poll" : "Anonyme Umfrage", "Limit yes votes per user" : "Ja-Stimmen pro Benutzer begrenzen", "Limit yes votes per option" : "Ja-Stimmen pro Option begrenzen", diff --git a/l10n/el.js b/l10n/el.js index 2be5bb24b..ba7a8325c 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -62,6 +62,8 @@ OC.L10N.register( "The used time zone is {timeZone}." : "Η χρησιμοποιημένη ζώνη ώρας είναι {timeZone}.", "Your are only allowed to vote for one option." : "Σας επιτρέπεται να ψηφίσετε μόνο μία επιλογή.", "You reached the maximum number of allowed votes." : "Συμπληρώσατε τον μέγιστο επιτρεπόμενο αριθμό ψήφων.", + "You have only one vote left." : "Σας απομένει μόνο μία ψήφος.", + "_You have %n vote left._::_You have %n votes left._" : ["Σας απομένει %n ψήφος.","Σας απομένουν %n ψήφοι."], "Public poll" : "Δημόσια δημοσκόπηση", "Do you want to login?" : "Θέλετε να συνδεθείτε;", "Login" : "Σύνδεση", @@ -93,9 +95,9 @@ OC.L10N.register( "Title" : "Τίτλος", "Enter Title" : "Προσθήκη Τίτλου", "Poll type" : "Τύπος ψηφοφορίας", + "Apply" : "Εφαρμογή", "Date poll" : "Δημοσκόπηση ραντεβού", "Text poll" : "Δημοσκόπηση κειμένου", - "Apply" : "Εφαρμογή", "Poll \"{pollTitle}\" added" : "Προστέθηκε η δημοσκόπηση \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "Σφάλμα κατά τη δημιουργία δημοσκόπησης \"{pollTitle}\".", "Add new Poll" : "Προσθήκη νέας δημοσκόπησης", @@ -143,6 +145,7 @@ OC.L10N.register( "All users" : "'Ολοι οι χρήστες", "Only invited users" : "Μόνο προσκεκλημένοι χρήστες", "never" : "ποτέ", + "Beta - watch for updated polls in realtime" : "Beta - παρακολουθήστε ενημερωμένες δημοσκοπήσεις σε πραγματικό χρόνο", "Try experimental styles" : "Δοκιμάστε πειραματικά στυλ", "Some experimental UI variants. Changes the background color of the main area." : "Μερικές πειραματικές παραλλαγές διεπαφής χρήστη. Αλλάζει το χρώμα φόντου της κύριας περιοχής.", "Use background image" : "Χρησιμοποιήστε εικόνα φόντου", @@ -188,7 +191,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Ως διαχειριστής μπορείτε να επεξεργαστείτε την δημοσκόπηση", "Description" : "Περιγραφή", "Poll configurations" : "Ρυθμίσεις δημοσκόπησης", - "Allow \"maybe\" vote" : "Να επιτρέπετε η ψήφος \"ίσως\"", "Anonymous poll" : "Ανώνυμη ψηφοφορία", "Limit yes votes per user" : "Περιορίστε τις ψήφους ναι ανά χρήστη", "Limit yes votes per option" : "Περιορίστε τις ψήφους ναι ανά επιλογή", diff --git a/l10n/el.json b/l10n/el.json index 479a04919..ed01ed777 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -60,6 +60,8 @@ "The used time zone is {timeZone}." : "Η χρησιμοποιημένη ζώνη ώρας είναι {timeZone}.", "Your are only allowed to vote for one option." : "Σας επιτρέπεται να ψηφίσετε μόνο μία επιλογή.", "You reached the maximum number of allowed votes." : "Συμπληρώσατε τον μέγιστο επιτρεπόμενο αριθμό ψήφων.", + "You have only one vote left." : "Σας απομένει μόνο μία ψήφος.", + "_You have %n vote left._::_You have %n votes left._" : ["Σας απομένει %n ψήφος.","Σας απομένουν %n ψήφοι."], "Public poll" : "Δημόσια δημοσκόπηση", "Do you want to login?" : "Θέλετε να συνδεθείτε;", "Login" : "Σύνδεση", @@ -91,9 +93,9 @@ "Title" : "Τίτλος", "Enter Title" : "Προσθήκη Τίτλου", "Poll type" : "Τύπος ψηφοφορίας", + "Apply" : "Εφαρμογή", "Date poll" : "Δημοσκόπηση ραντεβού", "Text poll" : "Δημοσκόπηση κειμένου", - "Apply" : "Εφαρμογή", "Poll \"{pollTitle}\" added" : "Προστέθηκε η δημοσκόπηση \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "Σφάλμα κατά τη δημιουργία δημοσκόπησης \"{pollTitle}\".", "Add new Poll" : "Προσθήκη νέας δημοσκόπησης", @@ -141,6 +143,7 @@ "All users" : "'Ολοι οι χρήστες", "Only invited users" : "Μόνο προσκεκλημένοι χρήστες", "never" : "ποτέ", + "Beta - watch for updated polls in realtime" : "Beta - παρακολουθήστε ενημερωμένες δημοσκοπήσεις σε πραγματικό χρόνο", "Try experimental styles" : "Δοκιμάστε πειραματικά στυλ", "Some experimental UI variants. Changes the background color of the main area." : "Μερικές πειραματικές παραλλαγές διεπαφής χρήστη. Αλλάζει το χρώμα φόντου της κύριας περιοχής.", "Use background image" : "Χρησιμοποιήστε εικόνα φόντου", @@ -186,7 +189,6 @@ "As an admin you may edit this poll" : "Ως διαχειριστής μπορείτε να επεξεργαστείτε την δημοσκόπηση", "Description" : "Περιγραφή", "Poll configurations" : "Ρυθμίσεις δημοσκόπησης", - "Allow \"maybe\" vote" : "Να επιτρέπετε η ψήφος \"ίσως\"", "Anonymous poll" : "Ανώνυμη ψηφοφορία", "Limit yes votes per user" : "Περιορίστε τις ψήφους ναι ανά χρήστη", "Limit yes votes per option" : "Περιορίστε τις ψήφους ναι ανά επιλογή", diff --git a/l10n/eo.js b/l10n/eo.js index 728b64408..998db622c 100644 --- a/l10n/eo.js +++ b/l10n/eo.js @@ -19,9 +19,9 @@ OC.L10N.register( "Delete comment" : "Forigi komenton", "Title" : "Titolo", "Poll type" : "Enketa tipo", + "Apply" : "Validigi", "Date poll" : "Data enketo", "Text poll" : "Teksta enketo", - "Apply" : "Validigi", "Settings" : "Agordoj", "Clone poll" : "Duobligi la enketon", "Delete poll" : "Forigi enketon", @@ -39,7 +39,6 @@ OC.L10N.register( "Comments" : "Komentoj", "Description" : "Priskribo", "Poll configurations" : "Enketa agordo", - "Allow \"maybe\" vote" : "Permesi respondi per „Eble“", "Anonymous poll" : "Enketo sennoma", "Title must not be empty!" : "La titolo ne povas malpleni!", "Receive notification email on activity" : "Ricevi sciigojn retpoŝte okaze de aktivaĵo", diff --git a/l10n/eo.json b/l10n/eo.json index 728645507..2e8e9c4ac 100644 --- a/l10n/eo.json +++ b/l10n/eo.json @@ -17,9 +17,9 @@ "Delete comment" : "Forigi komenton", "Title" : "Titolo", "Poll type" : "Enketa tipo", + "Apply" : "Validigi", "Date poll" : "Data enketo", "Text poll" : "Teksta enketo", - "Apply" : "Validigi", "Settings" : "Agordoj", "Clone poll" : "Duobligi la enketon", "Delete poll" : "Forigi enketon", @@ -37,7 +37,6 @@ "Comments" : "Komentoj", "Description" : "Priskribo", "Poll configurations" : "Enketa agordo", - "Allow \"maybe\" vote" : "Permesi respondi per „Eble“", "Anonymous poll" : "Enketo sennoma", "Title must not be empty!" : "La titolo ne povas malpleni!", "Receive notification email on activity" : "Ricevi sciigojn retpoŝte okaze de aktivaĵo", diff --git a/l10n/es.js b/l10n/es.js index ee3d8eefb..197da666b 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Título", "Enter Title" : "Escribe el título", "Poll type" : "Tipo de votación", + "Apply" : "Aplicar", "Date poll" : "Votación de fechas", "Text poll" : "Votación de texto", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Votación «{pollTitle}» añadida", "Error while creating Poll \"{pollTitle}\"" : "Error al crear votación «{pollTitle}»", "Add new Poll" : "Añadir nueva Encuesta", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Todos los usuarios", "Only invited users" : "Sólo usuarios invitados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta - Esté atento en tiempo real a las encuestas actualizadas", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todos los cambios a la encuesta actual, realizados por otros usuarios, será reconocidos en tiempo real.", "Try experimental styles" : "Probar estilos experimentales", "Some experimental UI variants. Changes the background color of the main area." : "Algunas variantes experimentales de UI. Cambia el color de fondo del área principal.", "Use background image" : "Usar imagen de fondo", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Como administrador, puede editar esta encuesta", "Description" : "Descripción", "Poll configurations" : "Configuraciones de la votación", - "Allow \"maybe\" vote" : "Permitir voto \"quizás\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Si se usan los límites de voto, «quizás» no debería estar permitido.", "Anonymous poll" : "Votación anónima", "Limit yes votes per user" : "Limitar el número de votos afirmativos por usuario/a", "Limit yes votes per option" : "Limitar el número de votos afirmativos por opción", diff --git a/l10n/es.json b/l10n/es.json index db3c4c7d5..3e00b2aed 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -96,9 +96,9 @@ "Title" : "Título", "Enter Title" : "Escribe el título", "Poll type" : "Tipo de votación", + "Apply" : "Aplicar", "Date poll" : "Votación de fechas", "Text poll" : "Votación de texto", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Votación «{pollTitle}» añadida", "Error while creating Poll \"{pollTitle}\"" : "Error al crear votación «{pollTitle}»", "Add new Poll" : "Añadir nueva Encuesta", @@ -146,6 +146,8 @@ "All users" : "Todos los usuarios", "Only invited users" : "Sólo usuarios invitados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta - Esté atento en tiempo real a las encuestas actualizadas", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todos los cambios a la encuesta actual, realizados por otros usuarios, será reconocidos en tiempo real.", "Try experimental styles" : "Probar estilos experimentales", "Some experimental UI variants. Changes the background color of the main area." : "Algunas variantes experimentales de UI. Cambia el color de fondo del área principal.", "Use background image" : "Usar imagen de fondo", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Como administrador, puede editar esta encuesta", "Description" : "Descripción", "Poll configurations" : "Configuraciones de la votación", - "Allow \"maybe\" vote" : "Permitir voto \"quizás\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Si se usan los límites de voto, «quizás» no debería estar permitido.", "Anonymous poll" : "Votación anónima", "Limit yes votes per user" : "Limitar el número de votos afirmativos por usuario/a", "Limit yes votes per option" : "Limitar el número de votos afirmativos por opción", diff --git a/l10n/es_CO.js b/l10n/es_CO.js index 8627a76f0..f7872347f 100644 --- a/l10n/es_CO.js +++ b/l10n/es_CO.js @@ -28,8 +28,8 @@ OC.L10N.register( "Title" : "Título", "Enter Title" : "Escriba el título", "Poll type" : "Tipo de encuesta", - "Date poll" : "Encuesta de fechas", "Apply" : "Aplicar", + "Date poll" : "Encuesta de fechas", "Add new Poll" : "Agregar nueva encuesta", "Settings" : "Configuraciones ", "My polls" : "Mis encuestas", diff --git a/l10n/es_CO.json b/l10n/es_CO.json index 4d2052ac5..ffe0d5fc4 100644 --- a/l10n/es_CO.json +++ b/l10n/es_CO.json @@ -26,8 +26,8 @@ "Title" : "Título", "Enter Title" : "Escriba el título", "Poll type" : "Tipo de encuesta", - "Date poll" : "Encuesta de fechas", "Apply" : "Aplicar", + "Date poll" : "Encuesta de fechas", "Add new Poll" : "Agregar nueva encuesta", "Settings" : "Configuraciones ", "My polls" : "Mis encuestas", diff --git a/l10n/eu.js b/l10n/eu.js index 67de27fef..74b0513c9 100644 --- a/l10n/eu.js +++ b/l10n/eu.js @@ -70,9 +70,9 @@ OC.L10N.register( "Title" : "Izenburua", "Enter Title" : "Sartu izenburua", "Poll type" : "Bozketa mota", + "Apply" : "Aplikatu", "Date poll" : "Data bozketa", "Text poll" : "Testu bozketa", - "Apply" : "Aplikatu", "Poll \"{pollTitle}\" added" : "\"{pollTitle}\" bozketa gehitu da", "Error while creating Poll \"{pollTitle}\"" : "Errorea \"{pollTitle}\" bozketa sortzerakoan", "Add new Poll" : "Gehitu bozketa berria", @@ -153,7 +153,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Bozketa hau editatu dezakezu administratzaile gisa", "Description" : "Deskripzioa", "Poll configurations" : "Bozketaren konfigurazioak", - "Allow \"maybe\" vote" : "Baimendu \"agian\" botoa", "Anonymous poll" : "Bozketa anonimoa", "Poll closing status" : "Bozketaren itxiera egoera", "Reopen poll" : "Ireki berriz bozketa", diff --git a/l10n/eu.json b/l10n/eu.json index eedaba734..7b8436cf7 100644 --- a/l10n/eu.json +++ b/l10n/eu.json @@ -68,9 +68,9 @@ "Title" : "Izenburua", "Enter Title" : "Sartu izenburua", "Poll type" : "Bozketa mota", + "Apply" : "Aplikatu", "Date poll" : "Data bozketa", "Text poll" : "Testu bozketa", - "Apply" : "Aplikatu", "Poll \"{pollTitle}\" added" : "\"{pollTitle}\" bozketa gehitu da", "Error while creating Poll \"{pollTitle}\"" : "Errorea \"{pollTitle}\" bozketa sortzerakoan", "Add new Poll" : "Gehitu bozketa berria", @@ -151,7 +151,6 @@ "As an admin you may edit this poll" : "Bozketa hau editatu dezakezu administratzaile gisa", "Description" : "Deskripzioa", "Poll configurations" : "Bozketaren konfigurazioak", - "Allow \"maybe\" vote" : "Baimendu \"agian\" botoa", "Anonymous poll" : "Bozketa anonimoa", "Poll closing status" : "Bozketaren itxiera egoera", "Reopen poll" : "Ireki berriz bozketa", diff --git a/l10n/fa.js b/l10n/fa.js index cf80ef54d..b7b4aa2c1 100644 --- a/l10n/fa.js +++ b/l10n/fa.js @@ -34,8 +34,8 @@ OC.L10N.register( "Title" : "عنوان", "Enter Title" : "عنوان را وارد کنید", "Poll type" : "نوع نظرسنجی", - "Date poll" : "نظرسنجی تاریخ", "Apply" : "اعمال", + "Date poll" : "نظرسنجی تاریخ", "Add new Poll" : "نظرسنجی جدید افزودن", "Settings" : "تنظیمات", "My polls" : "نظرسنجی های من", @@ -72,7 +72,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "به عنوان مدیر شما می توانید این نظرسنجی را ویرایش کردن", "Description" : "توضیحات", "Poll configurations" : "تنظیمات نظرسنجی", - "Allow \"maybe\" vote" : "اجازه دهید \"شاید\" رأی دهید", "Anonymous poll" : "نظرسنجی ناشناس", "Allow admins to edit this poll" : "به مدیران اجازه دهید این نظرسنجی را ویرایش کردن", "Title must not be empty!" : "عنوان نباید خالی باشد!", diff --git a/l10n/fa.json b/l10n/fa.json index cfca66dbf..eba3e220d 100644 --- a/l10n/fa.json +++ b/l10n/fa.json @@ -32,8 +32,8 @@ "Title" : "عنوان", "Enter Title" : "عنوان را وارد کنید", "Poll type" : "نوع نظرسنجی", - "Date poll" : "نظرسنجی تاریخ", "Apply" : "اعمال", + "Date poll" : "نظرسنجی تاریخ", "Add new Poll" : "نظرسنجی جدید افزودن", "Settings" : "تنظیمات", "My polls" : "نظرسنجی های من", @@ -70,7 +70,6 @@ "As an admin you may edit this poll" : "به عنوان مدیر شما می توانید این نظرسنجی را ویرایش کردن", "Description" : "توضیحات", "Poll configurations" : "تنظیمات نظرسنجی", - "Allow \"maybe\" vote" : "اجازه دهید \"شاید\" رأی دهید", "Anonymous poll" : "نظرسنجی ناشناس", "Allow admins to edit this poll" : "به مدیران اجازه دهید این نظرسنجی را ویرایش کردن", "Title must not be empty!" : "عنوان نباید خالی باشد!", diff --git a/l10n/fi.js b/l10n/fi.js index 4bc8bf084..8a923aa25 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -76,9 +76,9 @@ OC.L10N.register( "Title" : "Nimi", "Enter Title" : "Kirjoita otsikko", "Poll type" : "Kyselyn tyyppi", + "Apply" : "Toteuta", "Date poll" : "Päiväyskysely", "Text poll" : "Tekstikysely", - "Apply" : "Toteuta", "Poll \"{pollTitle}\" added" : "Kysely \"{pollTitle}\" lisätty", "Error while creating Poll \"{pollTitle}\"" : "Virhe luotaessa kyselyä \"{pollTitle}\"", "Add new Poll" : "Lisää uusi kysely", @@ -162,7 +162,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Ylläpitäjänä voit muokata tätä kyselyä", "Description" : "Kuvaus", "Poll configurations" : "Kyselyn asetukset", - "Allow \"maybe\" vote" : "Salli \"ehkä\"-ääni", "Anonymous poll" : "Anonyymi kysely", "Reopen poll" : "Uudelleenavaa äänestys", "Close poll" : "Sulje äänestys", diff --git a/l10n/fi.json b/l10n/fi.json index ca85e7887..b0c1ad81c 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -74,9 +74,9 @@ "Title" : "Nimi", "Enter Title" : "Kirjoita otsikko", "Poll type" : "Kyselyn tyyppi", + "Apply" : "Toteuta", "Date poll" : "Päiväyskysely", "Text poll" : "Tekstikysely", - "Apply" : "Toteuta", "Poll \"{pollTitle}\" added" : "Kysely \"{pollTitle}\" lisätty", "Error while creating Poll \"{pollTitle}\"" : "Virhe luotaessa kyselyä \"{pollTitle}\"", "Add new Poll" : "Lisää uusi kysely", @@ -160,7 +160,6 @@ "As an admin you may edit this poll" : "Ylläpitäjänä voit muokata tätä kyselyä", "Description" : "Kuvaus", "Poll configurations" : "Kyselyn asetukset", - "Allow \"maybe\" vote" : "Salli \"ehkä\"-ääni", "Anonymous poll" : "Anonyymi kysely", "Reopen poll" : "Uudelleenavaa äänestys", "Close poll" : "Sulje äänestys", diff --git a/l10n/fr.js b/l10n/fr.js index 88c73e9f2..4356896ef 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -11,6 +11,12 @@ OC.L10N.register( "Polls" : "Sondages", "%s invited you to a poll" : "%s vous invite à participer à un sondage", "{user} has invited you to the poll \"%s\"." : "{user} vous invite à participer au sondage \"%s\".", + "%s took over your poll" : "%s a repris votre sondage", + "{user} took over your poll \"%s\" and is the new owner." : "{user} a repris votre sondage \"%s\" et en est le nouveau propriétaire.", + "%s permanently deleted your poll" : "%s a définitivement supprimé votre sondage", + "{user} permanently deleted your poll \"%s\"." : "{user} a définitivement supprimé votre sondage \"%s\".", + "%s changed the deleted status of your poll" : "%s a changé le statut de suppression de votre sondage", + "{user} changed the deleted status of your poll \"%s\"." : "{user} a changé le statut de suppression de votre sondage \"%s\".", "- %s voted." : "- %s a voté.", "- Updated poll configuration. Please check your votes." : "- Configuration du sondage mise à jour. Veuillez vérifier vos votes.", "- The poll got deleted." : "- Le sondage a été supprimé.", @@ -18,6 +24,8 @@ OC.L10N.register( "- The poll was closed." : "- Le sondage est terminé.", "- A vote option was added." : "- Un choix a été ajouté.", "- A vote option was removed." : "- Un choix a été supprimé.", + "- The poll owner changed." : "- Le propriétaire du sondage a changé.", + "- %s created the poll." : "- %s a créé le sondage.", "Polls App - New Activity" : "Application de sondages - Nouvelle activité", "\"{title}\" had recent activity: " : "Activité récente pour \"{title}\" :", "A user" : "Un utilisateur", @@ -53,6 +61,12 @@ OC.L10N.register( "Results are hidden." : "Les résultats sont masqués.", "They will be revealed after the poll is closed." : "Ils seront révélés après la clôture du sondage.", "The used time zone is {timeZone}." : "Le fuseau horaire utilisé est {timeZone}.", + "Your are only allowed to vote for one option." : "Vous ne pouvez voter que pour une option.", + "You reached the maximum number of allowed votes." : "Vous avez atteint le nombre maximum de votes autorisés.", + "You have only one vote left." : "Il ne vous reste plus qu'un vote.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "Il s'agit d'un vote exclusif, où l'utilisateur ne peut voter que pour une option.", + "_You have %n vote left._::_You have %n votes left._" : ["Il vous reste %n vote.","Il vous reste %n votes."], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["%n vote par option est possible.","%n votes par option sont possibles."], "Public poll" : "Sondage public", "Do you want to login?" : "Souhaitez-vous vous connecter ?", "Login" : "Se connecter", @@ -84,9 +98,9 @@ OC.L10N.register( "Title" : "Titre", "Enter Title" : "Saisissez un titre", "Poll type" : "Type de sondage", + "Apply" : "Appliquer", "Date poll" : "Sondage sur des dates", "Text poll" : "Sondage texte", - "Apply" : "Appliquer", "Poll \"{pollTitle}\" added" : "Sondage \"{pollTitle}\" ajouté", "Error while creating Poll \"{pollTitle}\"" : "Erreur à la création du sondage \"{pollTitle}\"", "Add new Poll" : "Ajouter un nouveau sondage", @@ -175,11 +189,13 @@ OC.L10N.register( "Comments" : "Commentaires", "No comments" : "Aucun commentaire", "Be the first." : "Soyez le premier.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Soyez vigilant lorsque vous changez les options car cela peut affecter les votes existants d'une manière inattendue.", "As an admin you may edit this poll" : "En tant qu'administrateur, vous pouvez modifier le sondage", "Description" : "Description", "Poll configurations" : "Configurations du sondage", - "Allow \"maybe\" vote" : "Autoriser la réponse \"Peut-être\"", "Anonymous poll" : "Sondage anonyme", + "Limit yes votes per user" : "Limiter le nombre de votes \"oui\" par utilisateur", + "Limit yes votes per option" : "Limiter le nombre de votes \"oui\" par option", "Poll closing status" : "État de clôture du sondage", "Reopen poll" : "Ré-ouvrir le sondage", "Close poll" : "Terminer le sondage", @@ -193,6 +209,7 @@ OC.L10N.register( "\"{pollTitle}\" successfully saved" : "\"{pollTitle}\" enregistré avec succès", "Title must not be empty!" : "Le titre ne doit pas être vide !", "Error writing poll" : "Erreur d'écriture du sondage", + "Add Shares" : "Ajouter des partages", "Receive notification email on activity to {emailAddress}" : "Recevoir un mail de notification d'activité à {emailAddress}", "Receive notification email on activity" : "Recevoir une notification par courriel en cas d'activité", "Delete votes" : "Supprimer les votes", @@ -201,8 +218,17 @@ OC.L10N.register( "Yes" : "Oui", "User {userId} removed" : "L'utilisateur {userId} a été supprimé", "Manage polls" : "Gérer les sondages", + "Manage polls of other users. You can take over the ownership or delete polls." : "Gérer les sondages des autres utilisateurs. Vous pouvez en devenir le propriétaire ou effacer des sondages. ", "No polls found for this category" : "Aucun sondage trouvé pour cette catégorie", "Add one or change category!" : "Ajoutez-en une ou changez de catégorie!", + "Take over" : "Prendre en charge", + "Set \"deleted\" status" : "Marquer comme supprimé", + "Do you want to take over this poll from {username} and change the ownership?" : "Souhaitez-vous reprendre ce sondage de {username} et en devenir le propriétaire ?", + "The original owner will be notified." : "Le propriétaire initial en sera informé.", + "Do you want to delete this poll?" : "Voulez-vous vraiment supprimer ce sondage ?", + "This action cannot be reverted." : "Cette action ne pourra pas être annulée.", + "Error switching deleted status." : "Erreur lors du changement au status supprimé.", + "Error overtaking poll." : "Erreur lors de la prise en charge du sondage.", "404 - poll not found" : "404 - sondage introuvable", "Enter a poll or start a new one." : "Choisissez un autre sondage ou ajoutez-en un nouveau.", "Goto Nextcloud" : "Aller sur la page principale de Nextcloud", @@ -220,6 +246,8 @@ OC.L10N.register( "All polls, where you have access to." : "Tous les sondages auxquels vous avez accès.", "Error loading poll" : "Erreur lors du chargement du sondage", "Toggle Sidebar" : "Afficher / Cacher la barre latérale", + "Closed {relativeTimeAgo}" : "Fermé depuis {relativeTimeAgo}", + "Closing {relativeExpirationTime}" : "Fermeture dans {relativeExpirationTime}", "No vote options available" : "Aucune option de vote disponible", "Maybe the owner did not provide some until now." : "Peut-être que le propriétaire n'en a pas fourni jusqu'à présent.", "Switch to mobile view" : "Passer en vue mobile", diff --git a/l10n/fr.json b/l10n/fr.json index 57d2035f4..50b90a10a 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -9,6 +9,12 @@ "Polls" : "Sondages", "%s invited you to a poll" : "%s vous invite à participer à un sondage", "{user} has invited you to the poll \"%s\"." : "{user} vous invite à participer au sondage \"%s\".", + "%s took over your poll" : "%s a repris votre sondage", + "{user} took over your poll \"%s\" and is the new owner." : "{user} a repris votre sondage \"%s\" et en est le nouveau propriétaire.", + "%s permanently deleted your poll" : "%s a définitivement supprimé votre sondage", + "{user} permanently deleted your poll \"%s\"." : "{user} a définitivement supprimé votre sondage \"%s\".", + "%s changed the deleted status of your poll" : "%s a changé le statut de suppression de votre sondage", + "{user} changed the deleted status of your poll \"%s\"." : "{user} a changé le statut de suppression de votre sondage \"%s\".", "- %s voted." : "- %s a voté.", "- Updated poll configuration. Please check your votes." : "- Configuration du sondage mise à jour. Veuillez vérifier vos votes.", "- The poll got deleted." : "- Le sondage a été supprimé.", @@ -16,6 +22,8 @@ "- The poll was closed." : "- Le sondage est terminé.", "- A vote option was added." : "- Un choix a été ajouté.", "- A vote option was removed." : "- Un choix a été supprimé.", + "- The poll owner changed." : "- Le propriétaire du sondage a changé.", + "- %s created the poll." : "- %s a créé le sondage.", "Polls App - New Activity" : "Application de sondages - Nouvelle activité", "\"{title}\" had recent activity: " : "Activité récente pour \"{title}\" :", "A user" : "Un utilisateur", @@ -51,6 +59,12 @@ "Results are hidden." : "Les résultats sont masqués.", "They will be revealed after the poll is closed." : "Ils seront révélés après la clôture du sondage.", "The used time zone is {timeZone}." : "Le fuseau horaire utilisé est {timeZone}.", + "Your are only allowed to vote for one option." : "Vous ne pouvez voter que pour une option.", + "You reached the maximum number of allowed votes." : "Vous avez atteint le nombre maximum de votes autorisés.", + "You have only one vote left." : "Il ne vous reste plus qu'un vote.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "Il s'agit d'un vote exclusif, où l'utilisateur ne peut voter que pour une option.", + "_You have %n vote left._::_You have %n votes left._" : ["Il vous reste %n vote.","Il vous reste %n votes."], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["%n vote par option est possible.","%n votes par option sont possibles."], "Public poll" : "Sondage public", "Do you want to login?" : "Souhaitez-vous vous connecter ?", "Login" : "Se connecter", @@ -82,9 +96,9 @@ "Title" : "Titre", "Enter Title" : "Saisissez un titre", "Poll type" : "Type de sondage", + "Apply" : "Appliquer", "Date poll" : "Sondage sur des dates", "Text poll" : "Sondage texte", - "Apply" : "Appliquer", "Poll \"{pollTitle}\" added" : "Sondage \"{pollTitle}\" ajouté", "Error while creating Poll \"{pollTitle}\"" : "Erreur à la création du sondage \"{pollTitle}\"", "Add new Poll" : "Ajouter un nouveau sondage", @@ -173,11 +187,13 @@ "Comments" : "Commentaires", "No comments" : "Aucun commentaire", "Be the first." : "Soyez le premier.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Soyez vigilant lorsque vous changez les options car cela peut affecter les votes existants d'une manière inattendue.", "As an admin you may edit this poll" : "En tant qu'administrateur, vous pouvez modifier le sondage", "Description" : "Description", "Poll configurations" : "Configurations du sondage", - "Allow \"maybe\" vote" : "Autoriser la réponse \"Peut-être\"", "Anonymous poll" : "Sondage anonyme", + "Limit yes votes per user" : "Limiter le nombre de votes \"oui\" par utilisateur", + "Limit yes votes per option" : "Limiter le nombre de votes \"oui\" par option", "Poll closing status" : "État de clôture du sondage", "Reopen poll" : "Ré-ouvrir le sondage", "Close poll" : "Terminer le sondage", @@ -191,6 +207,7 @@ "\"{pollTitle}\" successfully saved" : "\"{pollTitle}\" enregistré avec succès", "Title must not be empty!" : "Le titre ne doit pas être vide !", "Error writing poll" : "Erreur d'écriture du sondage", + "Add Shares" : "Ajouter des partages", "Receive notification email on activity to {emailAddress}" : "Recevoir un mail de notification d'activité à {emailAddress}", "Receive notification email on activity" : "Recevoir une notification par courriel en cas d'activité", "Delete votes" : "Supprimer les votes", @@ -199,8 +216,17 @@ "Yes" : "Oui", "User {userId} removed" : "L'utilisateur {userId} a été supprimé", "Manage polls" : "Gérer les sondages", + "Manage polls of other users. You can take over the ownership or delete polls." : "Gérer les sondages des autres utilisateurs. Vous pouvez en devenir le propriétaire ou effacer des sondages. ", "No polls found for this category" : "Aucun sondage trouvé pour cette catégorie", "Add one or change category!" : "Ajoutez-en une ou changez de catégorie!", + "Take over" : "Prendre en charge", + "Set \"deleted\" status" : "Marquer comme supprimé", + "Do you want to take over this poll from {username} and change the ownership?" : "Souhaitez-vous reprendre ce sondage de {username} et en devenir le propriétaire ?", + "The original owner will be notified." : "Le propriétaire initial en sera informé.", + "Do you want to delete this poll?" : "Voulez-vous vraiment supprimer ce sondage ?", + "This action cannot be reverted." : "Cette action ne pourra pas être annulée.", + "Error switching deleted status." : "Erreur lors du changement au status supprimé.", + "Error overtaking poll." : "Erreur lors de la prise en charge du sondage.", "404 - poll not found" : "404 - sondage introuvable", "Enter a poll or start a new one." : "Choisissez un autre sondage ou ajoutez-en un nouveau.", "Goto Nextcloud" : "Aller sur la page principale de Nextcloud", @@ -218,6 +244,8 @@ "All polls, where you have access to." : "Tous les sondages auxquels vous avez accès.", "Error loading poll" : "Erreur lors du chargement du sondage", "Toggle Sidebar" : "Afficher / Cacher la barre latérale", + "Closed {relativeTimeAgo}" : "Fermé depuis {relativeTimeAgo}", + "Closing {relativeExpirationTime}" : "Fermeture dans {relativeExpirationTime}", "No vote options available" : "Aucune option de vote disponible", "Maybe the owner did not provide some until now." : "Peut-être que le propriétaire n'en a pas fourni jusqu'à présent.", "Switch to mobile view" : "Passer en vue mobile", diff --git a/l10n/gl.js b/l10n/gl.js index 55ad2aa9b..f42e22ec2 100644 --- a/l10n/gl.js +++ b/l10n/gl.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Título", "Enter Title" : "Introduza o título", "Poll type" : "Tipo de enquisa", + "Apply" : "Aplicar", "Date poll" : "Data da enquisa", "Text poll" : "Texto da enquisa", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Foi engadida a enquisa «{pollTitle}»", "Error while creating Poll \"{pollTitle}\"" : "Produciuse un erro ao crear a enquisa «{pollTitle}»", "Add new Poll" : "Engadir unha nova enquisa", @@ -119,7 +119,7 @@ OC.L10N.register( "Restore poll" : "Restaurar a enquisa", "Delete poll permanently" : "Eliminar a enquisa de xeito permanente", "Clone to option sequence" : "Clonar a secuencia de opcións", - "Create a sequence of date options starting with {dateOption}." : "Crea unha secuencia de opcións de datas a partires de {dateOption}.", + "Create a sequence of date options starting with {dateOption}." : "Crea unha secuencia de opcións de datas a partir de {dateOption}.", "Step unit: " : "Unidade do paso:", "Step width: " : "Largura do paso:", "Number of items to create: " : "Número de elementos para crear:", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Todos os usuarios", "Only invited users" : "Só usuarios convidados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta: mire as enquisas actualizadas en tempo real", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todos os cambios na enquisa actual, feitos por outros usuarios, recoñeceranse en tempo real.", "Try experimental styles" : "Probar os estilos experimentais", "Some experimental UI variants. Changes the background color of the main area." : "Algunhas variantes experimentais da IU. Cambia a cor de fondo da área principal.", "Use background image" : "Usar a imaxe de fondo", @@ -172,7 +174,7 @@ OC.L10N.register( "Send invitation mail" : "Enviar o correo de convite", "Copy link to clipboard" : "Copiar a ligazón no portapapeis", "Remove share" : "Retirar a compartición", - "Invitation sent to {name}" : "Enviouse o convite a {name}", + "Invitation sent to {name}" : "Enviouse o convite a {name}", "Error sending invitation to {name}" : "Produciuse un erro ao enviar o convite a {name}", "Public shares" : "Comparticións públicas", "Add a public link" : "Engadir unha ligazón pública", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Pode editar esta enquisa como administrador", "Description" : "Descrición", "Poll configurations" : "Configuracións da enquisa", - "Allow \"maybe\" vote" : "Permitir o voto «quizais»", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se se usan límites de voto, non debería permitir «quizais».", "Anonymous poll" : "Enquisa anónima", "Limit yes votes per user" : "Limita os votos de si por usuario", "Limit yes votes per option" : "Limita os votos por si por opción", diff --git a/l10n/gl.json b/l10n/gl.json index 7ee3a7221..e7b19ab39 100644 --- a/l10n/gl.json +++ b/l10n/gl.json @@ -96,9 +96,9 @@ "Title" : "Título", "Enter Title" : "Introduza o título", "Poll type" : "Tipo de enquisa", + "Apply" : "Aplicar", "Date poll" : "Data da enquisa", "Text poll" : "Texto da enquisa", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Foi engadida a enquisa «{pollTitle}»", "Error while creating Poll \"{pollTitle}\"" : "Produciuse un erro ao crear a enquisa «{pollTitle}»", "Add new Poll" : "Engadir unha nova enquisa", @@ -117,7 +117,7 @@ "Restore poll" : "Restaurar a enquisa", "Delete poll permanently" : "Eliminar a enquisa de xeito permanente", "Clone to option sequence" : "Clonar a secuencia de opcións", - "Create a sequence of date options starting with {dateOption}." : "Crea unha secuencia de opcións de datas a partires de {dateOption}.", + "Create a sequence of date options starting with {dateOption}." : "Crea unha secuencia de opcións de datas a partir de {dateOption}.", "Step unit: " : "Unidade do paso:", "Step width: " : "Largura do paso:", "Number of items to create: " : "Número de elementos para crear:", @@ -146,6 +146,8 @@ "All users" : "Todos os usuarios", "Only invited users" : "Só usuarios convidados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta: mire as enquisas actualizadas en tempo real", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todos os cambios na enquisa actual, feitos por outros usuarios, recoñeceranse en tempo real.", "Try experimental styles" : "Probar os estilos experimentais", "Some experimental UI variants. Changes the background color of the main area." : "Algunhas variantes experimentais da IU. Cambia a cor de fondo da área principal.", "Use background image" : "Usar a imaxe de fondo", @@ -170,7 +172,7 @@ "Send invitation mail" : "Enviar o correo de convite", "Copy link to clipboard" : "Copiar a ligazón no portapapeis", "Remove share" : "Retirar a compartición", - "Invitation sent to {name}" : "Enviouse o convite a {name}", + "Invitation sent to {name}" : "Enviouse o convite a {name}", "Error sending invitation to {name}" : "Produciuse un erro ao enviar o convite a {name}", "Public shares" : "Comparticións públicas", "Add a public link" : "Engadir unha ligazón pública", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Pode editar esta enquisa como administrador", "Description" : "Descrición", "Poll configurations" : "Configuracións da enquisa", - "Allow \"maybe\" vote" : "Permitir o voto «quizais»", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se se usan límites de voto, non debería permitir «quizais».", "Anonymous poll" : "Enquisa anónima", "Limit yes votes per user" : "Limita os votos de si por usuario", "Limit yes votes per option" : "Limita os votos por si por opción", diff --git a/l10n/he.js b/l10n/he.js index c9d715f4c..8d0b50b28 100644 --- a/l10n/he.js +++ b/l10n/he.js @@ -34,9 +34,9 @@ OC.L10N.register( "Title" : "כותרת", "Enter Title" : "נא להקליד כותרת", "Poll type" : "סוג סקר", + "Apply" : "החלה", "Date poll" : "סקר תאריכים", "Text poll" : "סקר טקסטואלי", - "Apply" : "החלה", "Add new Poll" : "הוספת סקר חדש", "Settings" : "הגדרות", "My polls" : "הסקרים שלי", @@ -84,7 +84,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "כמנהל יש לך אפשרות לערוך את הסקר הזה", "Description" : "תיאור", "Poll configurations" : "הגדרות סקר", - "Allow \"maybe\" vote" : "לאפשר להצביע „אולי”", "Anonymous poll" : "סקר אלמוני", "Allow admins to edit this poll" : "לאפשר למנהלים לערוך את הסקר הזה", "Result display" : "הצגת תוצאות", diff --git a/l10n/he.json b/l10n/he.json index ec55b2239..adb57664b 100644 --- a/l10n/he.json +++ b/l10n/he.json @@ -32,9 +32,9 @@ "Title" : "כותרת", "Enter Title" : "נא להקליד כותרת", "Poll type" : "סוג סקר", + "Apply" : "החלה", "Date poll" : "סקר תאריכים", "Text poll" : "סקר טקסטואלי", - "Apply" : "החלה", "Add new Poll" : "הוספת סקר חדש", "Settings" : "הגדרות", "My polls" : "הסקרים שלי", @@ -82,7 +82,6 @@ "As an admin you may edit this poll" : "כמנהל יש לך אפשרות לערוך את הסקר הזה", "Description" : "תיאור", "Poll configurations" : "הגדרות סקר", - "Allow \"maybe\" vote" : "לאפשר להצביע „אולי”", "Anonymous poll" : "סקר אלמוני", "Allow admins to edit this poll" : "לאפשר למנהלים לערוך את הסקר הזה", "Result display" : "הצגת תוצאות", diff --git a/l10n/hr.js b/l10n/hr.js index a06fbbb1a..321d0d129 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -9,7 +9,15 @@ OC.L10N.register( "Group" : "Grupa", "User" : "@string/user_icon", "Polls" : "Ankete", + "%s invited you to a poll" : "%s vas je pozvao u anketu", + "{user} has invited you to the poll \"%s\"." : "{user} vas je pozvao u anketu „%s”.", "- %s voted." : "- %s je glasao.", + "- Updated poll configuration. Please check your votes." : "- Konfiguracija ankete je ažurirana. Provjerite svoje odabire.", + "- The poll got deleted." : "- Anketa je izbrisana.", + "- The poll got restored." : "- Anketa je vraćena.", + "- The poll was closed." : "- Anketa je zatvorena.", + "- A vote option was added." : "- Dodana je mogućnost glasanja.", + "- A vote option was removed." : "- Uklonjena je mogućnost glasanja.", "Polls App - New Activity" : "Aplikacija za ankete – nova aktivnost", "\"{title}\" had recent activity: " : "„{title}“ je nedavno bio aktivan: ", "A user" : "Korisnik", @@ -18,6 +26,7 @@ OC.L10N.register( "Poll invitation \"%s\"" : "Poziv na sudjelovanje u anketi „%s”", "{owner} invited you to take part in the poll \"{title}\"" : "{owner} vas je pozvao da sudjelujete u anketi „{title}“", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Ova vam poveznica omogućuje pristupanje navedenoj anketi. Pritisnite gornji gumb ili kopirajte sljedeću poveznicu i dodajte je u lokacijsku traku preglednika: ", + "Do not share this link with other people, because it is connected to your votes." : "Nemojte dijeliti ovu poveznicu s drugim osobama jer je povezana s vašim odabirima.", "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Primili ste ovu poruku e-pošte jer vas je vlasnik ankete pozvao da sudjelujete u anketi. Vaše ime ili adresa e-pošte bit će zabilježeni tijekom ispunjavanja ankete. Ako želite napustiti anketu, obratite se administratoru web-mjesta ili stvaratelju ankete koji je poslao poruku e-pošte.", "A polls app, similar to doodle/dudle with the possibility to restrict access." : "Aplikacija za ankete, nalik aplikaciji doodle/dudle s mogućnošću ograničavanja pristupa.", "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "Aplikacija za ankete, nalik aplikaciji doodle/dudle s mogućnošću ograničavanja pristupa (članovi, određene grupe/korisnici, skriveno, javno).", @@ -33,6 +42,8 @@ OC.L10N.register( "Your personal link to this poll: {linkURL}" : "Vaša osobna poveznica na ovu anketu: {linkURL}", "Copy this link to the clipboard" : "Kopirajte ovu poveznicu u međuspremnik", "Resend invitation mail to {emailAdress}" : "Ponovno pošalji poruku s pozivnicom na {emailAdress}", + "Invitation resent to {emailAddress}" : "Pozivnica je ponovno poslana na {emailAddress}", + "Mail could not be resent to {emailAddress}" : "Nije uspjelo ponovno slanje pošte na {emailAddress}", "started this poll on {dateString}." : "pokrenuo je ovu anketu {dateString}.", "This poll is closed since {dateString}. The confirmed options are marked below." : "Ova je anketa zatvorena od {dateString}. Potvrđene mogućnosti označene su u nastavku.", "This poll is closed since {dateString}, but there are no confirmed options until now." : "Ova je anketa zatvorena od {dateString} ali dosad nije bilo potvrđenih mogućnosti.", @@ -43,6 +54,9 @@ OC.L10N.register( "They will be revealed after the poll is closed." : "Postat će vidljivi po zatvaranju ankete.", "The used time zone is {timeZone}." : "Korištena vremenska zona je {timeZone}.", "Public poll" : "Javna anketa", + "Do you want to login?" : "Želite li se prijaviti?", + "Login" : "Prijava", + "Participate in public poll!" : "Sudjelujte u javnoj anketi!", "To participate, tell us how we can call you!" : "Ako želite sudjelovati, javite nam kako vas možemo zvati!", "Enter your name" : "Unesite svoje ime", "Optional email address" : "Neobvezna adresa e-pošte", @@ -60,6 +74,7 @@ OC.L10N.register( "Enter a name to start the search" : "Unesite ime za početak pretraživanja", "Error while adding share" : "Pogreška pri dodavanju dijeljenja", "Conflict" : "Nepodudaranje", + "Got a network error while checking calendar events." : "Došlo je do mrežne pogreške pri pregledavanju događaja na kalendaru.", "New comment …" : "Novi komentar…", "Error while saving comment" : "Pogreška pri spremanju komentara", "Delete comment" : "Izbriši komentar", @@ -68,9 +83,9 @@ OC.L10N.register( "Title" : "Naslov", "Enter Title" : "Unesi naslov", "Poll type" : "Vrsta ankete", + "Apply" : "Potvrdi", "Date poll" : "Datum ankete", "Text poll" : "Tekst ankete", - "Apply" : "Potvrdi", "Poll \"{pollTitle}\" added" : "Dodana je anketa „{pollTitle}“", "Error while creating Poll \"{pollTitle}\"" : "Pogreška pri stvaranju ankete „{pollTitle}“", "Add new Poll" : "Dodaj novu anketu", @@ -148,6 +163,9 @@ OC.L10N.register( "Unsent invitations" : "Neposlane pozivnice", "Resolve into individual invitations" : "Podijeli u pojedine pozivnice", "Remove invitation" : "Ukloni pozivnicu", + "Resolving of {name} is not possible. The circles app is not enabled." : "Nije moguće obraditi {name}. Nije omogućena aplikacija krugova.", + "Resolving of {name} is not possible. The contacts app is not enabled." : "Nije moguće obraditi {name}. Nije omogućena aplikacija kontakata.", + "Error resolving {name}." : "Pogreška pri obrađivanju {name}.", "Details" : "Pojedinosti", "Configuration" : "Konfiguracija", "Options" : "Mogućnosti", @@ -158,7 +176,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Možete urediti ovu anketu kao administrator", "Description" : "Opis", "Poll configurations" : "Konfiguracije anketa", - "Allow \"maybe\" vote" : "Dopusti odgovor „možda”", "Anonymous poll" : "Anonimna anketa", "Poll closing status" : "Status zatvaranja ankete", "Reopen poll" : "Ponovo otvori anketu", diff --git a/l10n/hr.json b/l10n/hr.json index 778202c10..00e322c76 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -7,7 +7,15 @@ "Group" : "Grupa", "User" : "@string/user_icon", "Polls" : "Ankete", + "%s invited you to a poll" : "%s vas je pozvao u anketu", + "{user} has invited you to the poll \"%s\"." : "{user} vas je pozvao u anketu „%s”.", "- %s voted." : "- %s je glasao.", + "- Updated poll configuration. Please check your votes." : "- Konfiguracija ankete je ažurirana. Provjerite svoje odabire.", + "- The poll got deleted." : "- Anketa je izbrisana.", + "- The poll got restored." : "- Anketa je vraćena.", + "- The poll was closed." : "- Anketa je zatvorena.", + "- A vote option was added." : "- Dodana je mogućnost glasanja.", + "- A vote option was removed." : "- Uklonjena je mogućnost glasanja.", "Polls App - New Activity" : "Aplikacija za ankete – nova aktivnost", "\"{title}\" had recent activity: " : "„{title}“ je nedavno bio aktivan: ", "A user" : "Korisnik", @@ -16,6 +24,7 @@ "Poll invitation \"%s\"" : "Poziv na sudjelovanje u anketi „%s”", "{owner} invited you to take part in the poll \"{title}\"" : "{owner} vas je pozvao da sudjelujete u anketi „{title}“", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Ova vam poveznica omogućuje pristupanje navedenoj anketi. Pritisnite gornji gumb ili kopirajte sljedeću poveznicu i dodajte je u lokacijsku traku preglednika: ", + "Do not share this link with other people, because it is connected to your votes." : "Nemojte dijeliti ovu poveznicu s drugim osobama jer je povezana s vašim odabirima.", "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Primili ste ovu poruku e-pošte jer vas je vlasnik ankete pozvao da sudjelujete u anketi. Vaše ime ili adresa e-pošte bit će zabilježeni tijekom ispunjavanja ankete. Ako želite napustiti anketu, obratite se administratoru web-mjesta ili stvaratelju ankete koji je poslao poruku e-pošte.", "A polls app, similar to doodle/dudle with the possibility to restrict access." : "Aplikacija za ankete, nalik aplikaciji doodle/dudle s mogućnošću ograničavanja pristupa.", "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "Aplikacija za ankete, nalik aplikaciji doodle/dudle s mogućnošću ograničavanja pristupa (članovi, određene grupe/korisnici, skriveno, javno).", @@ -31,6 +40,8 @@ "Your personal link to this poll: {linkURL}" : "Vaša osobna poveznica na ovu anketu: {linkURL}", "Copy this link to the clipboard" : "Kopirajte ovu poveznicu u međuspremnik", "Resend invitation mail to {emailAdress}" : "Ponovno pošalji poruku s pozivnicom na {emailAdress}", + "Invitation resent to {emailAddress}" : "Pozivnica je ponovno poslana na {emailAddress}", + "Mail could not be resent to {emailAddress}" : "Nije uspjelo ponovno slanje pošte na {emailAddress}", "started this poll on {dateString}." : "pokrenuo je ovu anketu {dateString}.", "This poll is closed since {dateString}. The confirmed options are marked below." : "Ova je anketa zatvorena od {dateString}. Potvrđene mogućnosti označene su u nastavku.", "This poll is closed since {dateString}, but there are no confirmed options until now." : "Ova je anketa zatvorena od {dateString} ali dosad nije bilo potvrđenih mogućnosti.", @@ -41,6 +52,9 @@ "They will be revealed after the poll is closed." : "Postat će vidljivi po zatvaranju ankete.", "The used time zone is {timeZone}." : "Korištena vremenska zona je {timeZone}.", "Public poll" : "Javna anketa", + "Do you want to login?" : "Želite li se prijaviti?", + "Login" : "Prijava", + "Participate in public poll!" : "Sudjelujte u javnoj anketi!", "To participate, tell us how we can call you!" : "Ako želite sudjelovati, javite nam kako vas možemo zvati!", "Enter your name" : "Unesite svoje ime", "Optional email address" : "Neobvezna adresa e-pošte", @@ -58,6 +72,7 @@ "Enter a name to start the search" : "Unesite ime za početak pretraživanja", "Error while adding share" : "Pogreška pri dodavanju dijeljenja", "Conflict" : "Nepodudaranje", + "Got a network error while checking calendar events." : "Došlo je do mrežne pogreške pri pregledavanju događaja na kalendaru.", "New comment …" : "Novi komentar…", "Error while saving comment" : "Pogreška pri spremanju komentara", "Delete comment" : "Izbriši komentar", @@ -66,9 +81,9 @@ "Title" : "Naslov", "Enter Title" : "Unesi naslov", "Poll type" : "Vrsta ankete", + "Apply" : "Potvrdi", "Date poll" : "Datum ankete", "Text poll" : "Tekst ankete", - "Apply" : "Potvrdi", "Poll \"{pollTitle}\" added" : "Dodana je anketa „{pollTitle}“", "Error while creating Poll \"{pollTitle}\"" : "Pogreška pri stvaranju ankete „{pollTitle}“", "Add new Poll" : "Dodaj novu anketu", @@ -146,6 +161,9 @@ "Unsent invitations" : "Neposlane pozivnice", "Resolve into individual invitations" : "Podijeli u pojedine pozivnice", "Remove invitation" : "Ukloni pozivnicu", + "Resolving of {name} is not possible. The circles app is not enabled." : "Nije moguće obraditi {name}. Nije omogućena aplikacija krugova.", + "Resolving of {name} is not possible. The contacts app is not enabled." : "Nije moguće obraditi {name}. Nije omogućena aplikacija kontakata.", + "Error resolving {name}." : "Pogreška pri obrađivanju {name}.", "Details" : "Pojedinosti", "Configuration" : "Konfiguracija", "Options" : "Mogućnosti", @@ -156,7 +174,6 @@ "As an admin you may edit this poll" : "Možete urediti ovu anketu kao administrator", "Description" : "Opis", "Poll configurations" : "Konfiguracije anketa", - "Allow \"maybe\" vote" : "Dopusti odgovor „možda”", "Anonymous poll" : "Anonimna anketa", "Poll closing status" : "Status zatvaranja ankete", "Reopen poll" : "Ponovo otvori anketu", diff --git a/l10n/hu.js b/l10n/hu.js index 796cde174..18c73ce71 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -33,9 +33,9 @@ OC.L10N.register( "Error while deleting the comment" : "Hiba a hozzászólás törlésekor", "Title" : "Cím", "Poll type" : "Szavazás típus", + "Apply" : "Alkalmaz", "Date poll" : "Dátum szavazás", "Text poll" : "Szöveges szavazás", - "Apply" : "Alkalmaz", "Add new Poll" : "Új szavazás hozzáadása", "Settings" : "Beállítások", "Relevant" : "Releváns", @@ -88,7 +88,6 @@ OC.L10N.register( "Comments" : "Hozzászólások", "Description" : "Leírás", "Poll configurations" : "Szavazás beállítása", - "Allow \"maybe\" vote" : "„Talán” szavazat engedélyezése", "Anonymous poll" : "Névtelen szavazás", "Allow admins to edit this poll" : "Rendszergazdák szerkeszthetik ezt a szavazást", "Result display" : "Eredmények mutatása", diff --git a/l10n/hu.json b/l10n/hu.json index 6724a62c9..66316a525 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -31,9 +31,9 @@ "Error while deleting the comment" : "Hiba a hozzászólás törlésekor", "Title" : "Cím", "Poll type" : "Szavazás típus", + "Apply" : "Alkalmaz", "Date poll" : "Dátum szavazás", "Text poll" : "Szöveges szavazás", - "Apply" : "Alkalmaz", "Add new Poll" : "Új szavazás hozzáadása", "Settings" : "Beállítások", "Relevant" : "Releváns", @@ -86,7 +86,6 @@ "Comments" : "Hozzászólások", "Description" : "Leírás", "Poll configurations" : "Szavazás beállítása", - "Allow \"maybe\" vote" : "„Talán” szavazat engedélyezése", "Anonymous poll" : "Névtelen szavazás", "Allow admins to edit this poll" : "Rendszergazdák szerkeszthetik ezt a szavazást", "Result display" : "Eredmények mutatása", diff --git a/l10n/is.js b/l10n/is.js index cb52bb76b..3d1ffe15e 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -65,9 +65,9 @@ OC.L10N.register( "Title" : "Titill", "Enter Title" : "Settu inn titil", "Poll type" : "Gerð könnunar", + "Apply" : "Virkja", "Date poll" : "Dagsetningakönnun", "Text poll" : "Textakönnun", - "Apply" : "Virkja", "Poll \"{pollTitle}\" added" : "Könnuninni \"{pollTitle}\" bætt við", "Add new Poll" : "Bæta við nýrri könnun", "Settings" : "Stillingar", @@ -134,7 +134,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Sem stjórnandi geturðu breytt þessari könnun", "Description" : "Lýsing", "Poll configurations" : "Uppsetningar kannana", - "Allow \"maybe\" vote" : "Leyfa \"kannski\"-atkvæði", "Anonymous poll" : "Nafnlaus könnun", "Reopen poll" : "Enduropna könnun", "Close poll" : "Loka könnun", diff --git a/l10n/is.json b/l10n/is.json index b7c0b9b08..0ddb29b90 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -63,9 +63,9 @@ "Title" : "Titill", "Enter Title" : "Settu inn titil", "Poll type" : "Gerð könnunar", + "Apply" : "Virkja", "Date poll" : "Dagsetningakönnun", "Text poll" : "Textakönnun", - "Apply" : "Virkja", "Poll \"{pollTitle}\" added" : "Könnuninni \"{pollTitle}\" bætt við", "Add new Poll" : "Bæta við nýrri könnun", "Settings" : "Stillingar", @@ -132,7 +132,6 @@ "As an admin you may edit this poll" : "Sem stjórnandi geturðu breytt þessari könnun", "Description" : "Lýsing", "Poll configurations" : "Uppsetningar kannana", - "Allow \"maybe\" vote" : "Leyfa \"kannski\"-atkvæði", "Anonymous poll" : "Nafnlaus könnun", "Reopen poll" : "Enduropna könnun", "Close poll" : "Loka könnun", diff --git a/l10n/it.js b/l10n/it.js index 3bcd166b0..528f1c40b 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Titolo", "Enter Title" : "Inserisci titolo", "Poll type" : "Tipo di sondaggio", + "Apply" : "Applica", "Date poll" : "Sondaggio di date", "Text poll" : "Sondaggio di testo", - "Apply" : "Applica", "Poll \"{pollTitle}\" added" : "Sondaggio \"{pollTitle}\" aggiunto", "Error while creating Poll \"{pollTitle}\"" : "Errore durante la creazione del sondaggio \"{pollTitle}\"", "Add new Poll" : "Aggiungi nuovo sondaggio", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Tutti gli utenti", "Only invited users" : "Solo gli utenti invitati", "never" : "mai", + "Beta - watch for updated polls in realtime" : "Beta - controlla sondaggi aggiornati in tempo reale", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Tutte le modifiche al sondaggio attuale, fatte da altri utenti, saranno riconosciute in tempo reale.", "Try experimental styles" : "Prova gli stili sperimentali", "Some experimental UI variants. Changes the background color of the main area." : "Alcune varianti sperimentali dell'interfaccia utente. Cambia il colore di sfondo dell'area principale.", "Use background image" : "Usa immagini di sfondo", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "In qualità di amministratore, puoi modificare questo sondaggio", "Description" : "Descrizione", "Poll configurations" : "Configurazioni dei sondaggi", - "Allow \"maybe\" vote" : "Consenti il voto \"Forse\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se sono utilizzati i limiti di voto, \"forse\" non dovrebbe essere consentito.", "Anonymous poll" : "Sondaggio anonimo", "Limit yes votes per user" : "Limita i voti sì per utente", "Limit yes votes per option" : "Limita i voti sì per opzione", diff --git a/l10n/it.json b/l10n/it.json index 26bd80b83..e04dc4dab 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -96,9 +96,9 @@ "Title" : "Titolo", "Enter Title" : "Inserisci titolo", "Poll type" : "Tipo di sondaggio", + "Apply" : "Applica", "Date poll" : "Sondaggio di date", "Text poll" : "Sondaggio di testo", - "Apply" : "Applica", "Poll \"{pollTitle}\" added" : "Sondaggio \"{pollTitle}\" aggiunto", "Error while creating Poll \"{pollTitle}\"" : "Errore durante la creazione del sondaggio \"{pollTitle}\"", "Add new Poll" : "Aggiungi nuovo sondaggio", @@ -146,6 +146,8 @@ "All users" : "Tutti gli utenti", "Only invited users" : "Solo gli utenti invitati", "never" : "mai", + "Beta - watch for updated polls in realtime" : "Beta - controlla sondaggi aggiornati in tempo reale", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Tutte le modifiche al sondaggio attuale, fatte da altri utenti, saranno riconosciute in tempo reale.", "Try experimental styles" : "Prova gli stili sperimentali", "Some experimental UI variants. Changes the background color of the main area." : "Alcune varianti sperimentali dell'interfaccia utente. Cambia il colore di sfondo dell'area principale.", "Use background image" : "Usa immagini di sfondo", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "In qualità di amministratore, puoi modificare questo sondaggio", "Description" : "Descrizione", "Poll configurations" : "Configurazioni dei sondaggi", - "Allow \"maybe\" vote" : "Consenti il voto \"Forse\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se sono utilizzati i limiti di voto, \"forse\" non dovrebbe essere consentito.", "Anonymous poll" : "Sondaggio anonimo", "Limit yes votes per user" : "Limita i voti sì per utente", "Limit yes votes per option" : "Limita i voti sì per opzione", diff --git a/l10n/ja.js b/l10n/ja.js index 14d8ee989..eae1830e5 100644 --- a/l10n/ja.js +++ b/l10n/ja.js @@ -42,9 +42,9 @@ OC.L10N.register( "Title" : "タイトル", "Enter Title" : "タイトルを入力", "Poll type" : "投票タイプ", + "Apply" : "適用", "Date poll" : "日付投票", "Text poll" : "文書投票", - "Apply" : "適用", "Add new Poll" : "新規投票追加", "Settings" : "設定", "Relevant" : "関連", @@ -100,7 +100,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "管理者として、この投票を編集することができます", "Description" : "説明", "Poll configurations" : "投票設定", - "Allow \"maybe\" vote" : "投票数に含まれない投票を許可", "Anonymous poll" : "匿名投票", "Allow admins to edit this poll" : "管理者がこの投票を編集することを許可", "Result display" : "結果表示", diff --git a/l10n/ja.json b/l10n/ja.json index 18bf1d017..4790619c4 100644 --- a/l10n/ja.json +++ b/l10n/ja.json @@ -40,9 +40,9 @@ "Title" : "タイトル", "Enter Title" : "タイトルを入力", "Poll type" : "投票タイプ", + "Apply" : "適用", "Date poll" : "日付投票", "Text poll" : "文書投票", - "Apply" : "適用", "Add new Poll" : "新規投票追加", "Settings" : "設定", "Relevant" : "関連", @@ -98,7 +98,6 @@ "As an admin you may edit this poll" : "管理者として、この投票を編集することができます", "Description" : "説明", "Poll configurations" : "投票設定", - "Allow \"maybe\" vote" : "投票数に含まれない投票を許可", "Anonymous poll" : "匿名投票", "Allow admins to edit this poll" : "管理者がこの投票を編集することを許可", "Result display" : "結果表示", diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js index 92cdc6221..465570a35 100644 --- a/l10n/lt_LT.js +++ b/l10n/lt_LT.js @@ -56,6 +56,8 @@ OC.L10N.register( "Results are hidden." : "Rezultatai yra paslėpti.", "They will be revealed after the poll is closed." : "Jie bus atskleisti, kai apklausa bus baigta.", "The used time zone is {timeZone}." : "Naudojama {timeZone} laiko juosta.", + "You have only one vote left." : "Jums liko tik vienas balsas.", + "_You have %n vote left._::_You have %n votes left._" : ["Jums liko %n balsas.","Jums liko %n balsai.","Jums liko %n balsų.","Jums liko %n balsas."], "Public poll" : "Vieša apklausa", "Do you want to login?" : "Ar norite prisijungti?", "To participate, tell us how we can call you!" : "Norėdami dalyvauti, parašykite koks jūsų vardas!", @@ -85,9 +87,9 @@ OC.L10N.register( "Title" : "Pavadinimas", "Enter Title" : "Įveskite pavadinimą", "Poll type" : "Apklausos tipas", + "Apply" : "Taikyti", "Date poll" : "Datos apklausa", "Text poll" : "Tekstinė apklausa", - "Apply" : "Taikyti", "Poll \"{pollTitle}\" added" : "Apklausa \"{pollTitle}\" pridėta", "Error while creating Poll \"{pollTitle}\"" : "Klaida kuriant apklausą \"{pollTitle}\"", "Add new Poll" : "Pridėti naują apklausą", @@ -151,7 +153,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Jūs, kaip administratorius, galite taisyti šią apklausą", "Description" : "Aprašas", "Poll configurations" : "Apklausos konfigūracijos", - "Allow \"maybe\" vote" : "Leisti \"Galbūt\" balsą", "Anonymous poll" : "Anoniminė apklausa", "Close poll" : "Baigti apklausą", "Allow admins to edit this poll" : "Leisti administratoriams taisyti šią apklausą", diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json index 1ea271365..4d1700518 100644 --- a/l10n/lt_LT.json +++ b/l10n/lt_LT.json @@ -54,6 +54,8 @@ "Results are hidden." : "Rezultatai yra paslėpti.", "They will be revealed after the poll is closed." : "Jie bus atskleisti, kai apklausa bus baigta.", "The used time zone is {timeZone}." : "Naudojama {timeZone} laiko juosta.", + "You have only one vote left." : "Jums liko tik vienas balsas.", + "_You have %n vote left._::_You have %n votes left._" : ["Jums liko %n balsas.","Jums liko %n balsai.","Jums liko %n balsų.","Jums liko %n balsas."], "Public poll" : "Vieša apklausa", "Do you want to login?" : "Ar norite prisijungti?", "To participate, tell us how we can call you!" : "Norėdami dalyvauti, parašykite koks jūsų vardas!", @@ -83,9 +85,9 @@ "Title" : "Pavadinimas", "Enter Title" : "Įveskite pavadinimą", "Poll type" : "Apklausos tipas", + "Apply" : "Taikyti", "Date poll" : "Datos apklausa", "Text poll" : "Tekstinė apklausa", - "Apply" : "Taikyti", "Poll \"{pollTitle}\" added" : "Apklausa \"{pollTitle}\" pridėta", "Error while creating Poll \"{pollTitle}\"" : "Klaida kuriant apklausą \"{pollTitle}\"", "Add new Poll" : "Pridėti naują apklausą", @@ -149,7 +151,6 @@ "As an admin you may edit this poll" : "Jūs, kaip administratorius, galite taisyti šią apklausą", "Description" : "Aprašas", "Poll configurations" : "Apklausos konfigūracijos", - "Allow \"maybe\" vote" : "Leisti \"Galbūt\" balsą", "Anonymous poll" : "Anoniminė apklausa", "Close poll" : "Baigti apklausą", "Allow admins to edit this poll" : "Leisti administratoriams taisyti šią apklausą", diff --git a/l10n/nl.js b/l10n/nl.js index 77b38da58..34f4718e1 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Titel", "Enter Title" : "Opgeven titel", "Poll type" : "Type peiling", + "Apply" : "Toepassen", "Date poll" : "Datum peiling", "Text poll" : "Tekst peiling", - "Apply" : "Toepassen", "Poll \"{pollTitle}\" added" : "Peiling \"{pollTitle}\" toegevoegd", "Error while creating Poll \"{pollTitle}\"" : "Fout bij creëren peiling \"{pollTitle}\"", "Add new Poll" : "Toevoegen nieuwe peiling", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Alle gebruikers", "Only invited users" : "Alleen uitgenodigde gebruikers", "never" : "nooit", + "Beta - watch for updated polls in realtime" : "Beta - bekijk in real-time bijgewerkte peilingen", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle wijzigingen aan de huidige peiling, door andere gebruikers, worden in real-time herkend.", "Try experimental styles" : "Probeer experimentele stijlen", "Some experimental UI variants. Changes the background color of the main area." : "Enkele experimentele gebruikersinterface varianten. Wijzigt de achtergrondkleur van het hoofdgebied.", "Use background image" : "Gebruik achtergrondafbeelding", @@ -193,7 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Als beheerder mag je de peiling bewerken", "Description" : "Beschrijving", "Poll configurations" : "Peilingconfiguratie", - "Allow \"maybe\" vote" : "Sta een \"Misschien\" stem toe", "Anonymous poll" : "Anonieme peiling", "Limit yes votes per user" : "Beperk aantal Ja-stemmen per gebruiker", "Limit yes votes per option" : "Beperk Ja-stemmen per optie", diff --git a/l10n/nl.json b/l10n/nl.json index 3977faaf8..9bf7aee74 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -96,9 +96,9 @@ "Title" : "Titel", "Enter Title" : "Opgeven titel", "Poll type" : "Type peiling", + "Apply" : "Toepassen", "Date poll" : "Datum peiling", "Text poll" : "Tekst peiling", - "Apply" : "Toepassen", "Poll \"{pollTitle}\" added" : "Peiling \"{pollTitle}\" toegevoegd", "Error while creating Poll \"{pollTitle}\"" : "Fout bij creëren peiling \"{pollTitle}\"", "Add new Poll" : "Toevoegen nieuwe peiling", @@ -146,6 +146,8 @@ "All users" : "Alle gebruikers", "Only invited users" : "Alleen uitgenodigde gebruikers", "never" : "nooit", + "Beta - watch for updated polls in realtime" : "Beta - bekijk in real-time bijgewerkte peilingen", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Alle wijzigingen aan de huidige peiling, door andere gebruikers, worden in real-time herkend.", "Try experimental styles" : "Probeer experimentele stijlen", "Some experimental UI variants. Changes the background color of the main area." : "Enkele experimentele gebruikersinterface varianten. Wijzigt de achtergrondkleur van het hoofdgebied.", "Use background image" : "Gebruik achtergrondafbeelding", @@ -191,7 +193,6 @@ "As an admin you may edit this poll" : "Als beheerder mag je de peiling bewerken", "Description" : "Beschrijving", "Poll configurations" : "Peilingconfiguratie", - "Allow \"maybe\" vote" : "Sta een \"Misschien\" stem toe", "Anonymous poll" : "Anonieme peiling", "Limit yes votes per user" : "Beperk aantal Ja-stemmen per gebruiker", "Limit yes votes per option" : "Beperk Ja-stemmen per optie", diff --git a/l10n/pl.js b/l10n/pl.js index b4fe8427c..bca1eb533 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Tytuł", "Enter Title" : "Wpisz tytuł", "Poll type" : "Typ sondy", + "Apply" : "Zastosuj", "Date poll" : "Sonda dat", "Text poll" : "Tekst sondy", - "Apply" : "Zastosuj", "Poll \"{pollTitle}\" added" : "Dodano sondę \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "Błąd podczas tworzenia sondy \"{pollTitle}\"", "Add new Poll" : "Dodaj nową sondę", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Wszyscy użytkownicy", "Only invited users" : "Tylko zaproszeni użytkownicy", "never" : "nigdy", + "Beta - watch for updated polls in realtime" : "Beta - obserwuj zaktualizowane sondy w czasie rzeczywistym", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Wszystkie zmiany w bieżącej sondzie, wprowadzone przez innych użytkowników, zostaną uznane w czasie rzeczywistym.", "Try experimental styles" : "Wypróbuj eksperymentalne style", "Some experimental UI variants. Changes the background color of the main area." : "Niektóre eksperymentalne warianty interfejsu użytkownika. Zmienia kolor tła głównego obszaru.", "Use background image" : "Użyj obrazu tła", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Jako administrator możesz edytować tę sondę", "Description" : "Opis", "Poll configurations" : "Konfiguracje sondy", - "Allow \"maybe\" vote" : "Zezwalaj głosować na \"może\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Jeśli używane są limity głosów, \"może\" nie powinno być dozwolone.", "Anonymous poll" : "Anonimowa sonda", "Limit yes votes per user" : "Ogranicz liczbę głosów na tak na użytkownika", "Limit yes votes per option" : "Ogranicz liczbę głosów na tak na opcję", diff --git a/l10n/pl.json b/l10n/pl.json index 26ddfa1ab..5caf5243e 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -96,9 +96,9 @@ "Title" : "Tytuł", "Enter Title" : "Wpisz tytuł", "Poll type" : "Typ sondy", + "Apply" : "Zastosuj", "Date poll" : "Sonda dat", "Text poll" : "Tekst sondy", - "Apply" : "Zastosuj", "Poll \"{pollTitle}\" added" : "Dodano sondę \"{pollTitle}\"", "Error while creating Poll \"{pollTitle}\"" : "Błąd podczas tworzenia sondy \"{pollTitle}\"", "Add new Poll" : "Dodaj nową sondę", @@ -146,6 +146,8 @@ "All users" : "Wszyscy użytkownicy", "Only invited users" : "Tylko zaproszeni użytkownicy", "never" : "nigdy", + "Beta - watch for updated polls in realtime" : "Beta - obserwuj zaktualizowane sondy w czasie rzeczywistym", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Wszystkie zmiany w bieżącej sondzie, wprowadzone przez innych użytkowników, zostaną uznane w czasie rzeczywistym.", "Try experimental styles" : "Wypróbuj eksperymentalne style", "Some experimental UI variants. Changes the background color of the main area." : "Niektóre eksperymentalne warianty interfejsu użytkownika. Zmienia kolor tła głównego obszaru.", "Use background image" : "Użyj obrazu tła", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Jako administrator możesz edytować tę sondę", "Description" : "Opis", "Poll configurations" : "Konfiguracje sondy", - "Allow \"maybe\" vote" : "Zezwalaj głosować na \"może\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Jeśli używane są limity głosów, \"może\" nie powinno być dozwolone.", "Anonymous poll" : "Anonimowa sonda", "Limit yes votes per user" : "Ogranicz liczbę głosów na tak na użytkownika", "Limit yes votes per option" : "Ogranicz liczbę głosów na tak na opcję", diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index b3b928839..09bfbdaa5 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Título", "Enter Title" : "Digite o título", "Poll type" : "Tipo de enquete", + "Apply" : "Aplicar", "Date poll" : "Enquete de data", "Text poll" : "Enquete de texto", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Enquete \"{pollTitle}\" adicionada", "Error while creating Poll \"{pollTitle}\"" : "Erro ao criar a Enquete \"{pollTitle}\"", "Add new Poll" : "Adicionar nova Enquete", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Todos os usuários", "Only invited users" : "Apenas usuários convidados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta - veja as pesquisas atualizadas em tempo real ", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todas as alterações na enquete atual, feitas por outros usuários, serão reconhecidas em tempo real. ", "Try experimental styles" : "Testar estilos experimentais", "Some experimental UI variants. Changes the background color of the main area." : "Algumas variantes experimentais da interface. Muda a cor de fundo da área principal.", "Use background image" : "Usar uma imagem de fundo", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Como administrador você pode editar esta enquete", "Description" : "Descrição", "Poll configurations" : "Configurações de enquete", - "Allow \"maybe\" vote" : "Permitir o voto \"talvez\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se os limites de voto forem usados, \"talvez\" não deveria ser permitido.", "Anonymous poll" : "Enquete anônima", "Limit yes votes per user" : "Limite de votos no sim por usuário", "Limit yes votes per option" : "Limite de votos no sim por opção", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index 6fd908806..af75856f6 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -96,9 +96,9 @@ "Title" : "Título", "Enter Title" : "Digite o título", "Poll type" : "Tipo de enquete", + "Apply" : "Aplicar", "Date poll" : "Enquete de data", "Text poll" : "Enquete de texto", - "Apply" : "Aplicar", "Poll \"{pollTitle}\" added" : "Enquete \"{pollTitle}\" adicionada", "Error while creating Poll \"{pollTitle}\"" : "Erro ao criar a Enquete \"{pollTitle}\"", "Add new Poll" : "Adicionar nova Enquete", @@ -146,6 +146,8 @@ "All users" : "Todos os usuários", "Only invited users" : "Apenas usuários convidados", "never" : "nunca", + "Beta - watch for updated polls in realtime" : "Beta - veja as pesquisas atualizadas em tempo real ", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Todas as alterações na enquete atual, feitas por outros usuários, serão reconhecidas em tempo real. ", "Try experimental styles" : "Testar estilos experimentais", "Some experimental UI variants. Changes the background color of the main area." : "Algumas variantes experimentais da interface. Muda a cor de fundo da área principal.", "Use background image" : "Usar uma imagem de fundo", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Como administrador você pode editar esta enquete", "Description" : "Descrição", "Poll configurations" : "Configurações de enquete", - "Allow \"maybe\" vote" : "Permitir o voto \"talvez\"", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Se os limites de voto forem usados, \"talvez\" não deveria ser permitido.", "Anonymous poll" : "Enquete anônima", "Limit yes votes per user" : "Limite de votos no sim por usuário", "Limit yes votes per option" : "Limite de votos no sim por opção", diff --git a/l10n/ru.js b/l10n/ru.js index 2ae94fb10..ec4efe94f 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -6,6 +6,8 @@ OC.L10N.register( "Group" : "Группа", "User" : "Пользователь", "Polls" : "Опросы", + "%s invited you to a poll" : "%s пригласил(а) вас принять участие в опросе", + "{user} has invited you to the poll \"%s\"." : "{user} пригласил(а) вас принять участие в опросе «%s».", "- %s voted." : "- %s проголосовал.", "Polls App - New Activity" : "Приложение для проведения опросов — новые события", "\"{title}\" had recent activity: " : "В опросе «{title}» произошли следующие события:", @@ -23,7 +25,12 @@ OC.L10N.register( "Link copied to clipboard" : "Ссылка скопирована в буфер обмена", "Error while copying link to clipboard" : "Не удалось скопировать ссылку в буфер обмена", "_%n Participant_::_%n Participants_" : ["%n участник","%n участников","%n участников","%n участников"], + "This is a public poll." : "Это открытый опрос.", + "Copy this link to the clipboard" : "Скопировать ссылку в буфер обмена", "You can place your vote until {dateString}." : "Вы можете проголосовать до {dateString}.", + "Results are hidden." : "Результаты скрыты.", + "Public poll" : "Открытый опрос", + "Login" : "Вход", "To participate, tell us how we can call you!" : "Укажите своё имя, которое будет использоваться в опросах.", "Enter your name" : "Введите своё имя", "Cancel" : "Отменить", @@ -42,9 +49,9 @@ OC.L10N.register( "Title" : "Название", "Enter Title" : "Введите заголовок", "Poll type" : "Тип опроса", + "Apply" : "Применить", "Date poll" : "Выбор даты", "Text poll" : "Выбор текстовых вариантов", - "Apply" : "Применить", "Add new Poll" : "Добавить опрос", "Settings" : "Параметры", "Relevant" : "Актуальные", @@ -82,7 +89,10 @@ OC.L10N.register( "Created" : "Создано", "No description provided" : "Описание отсуствует", "Deleted" : "Удалено", + "All users" : "Все пользователи", + "Only invited users" : "Только приглашённые пользователи", "never" : "никогда", + "Use background image" : "Использовать фоновое изображение", "Copy link to clipboard" : "Скопировать ссылку в буфер обмена", "Remove share" : "Закрыть общий доступ", "Public shares" : "Общедоступные ссылки", @@ -95,7 +105,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Вы может отредактировать этот опрос используя права администратора", "Description" : "Описание", "Poll configurations" : "Конфигурация опроса", - "Allow \"maybe\" vote" : "Разрешить вариант «может быть»", "Anonymous poll" : "Анонимный опрос", "Allow admins to edit this poll" : "Администраторы могут редактировать этот опрос", "Result display" : "Показ результатов", diff --git a/l10n/ru.json b/l10n/ru.json index 53146be50..96d31525d 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -4,6 +4,8 @@ "Group" : "Группа", "User" : "Пользователь", "Polls" : "Опросы", + "%s invited you to a poll" : "%s пригласил(а) вас принять участие в опросе", + "{user} has invited you to the poll \"%s\"." : "{user} пригласил(а) вас принять участие в опросе «%s».", "- %s voted." : "- %s проголосовал.", "Polls App - New Activity" : "Приложение для проведения опросов — новые события", "\"{title}\" had recent activity: " : "В опросе «{title}» произошли следующие события:", @@ -21,7 +23,12 @@ "Link copied to clipboard" : "Ссылка скопирована в буфер обмена", "Error while copying link to clipboard" : "Не удалось скопировать ссылку в буфер обмена", "_%n Participant_::_%n Participants_" : ["%n участник","%n участников","%n участников","%n участников"], + "This is a public poll." : "Это открытый опрос.", + "Copy this link to the clipboard" : "Скопировать ссылку в буфер обмена", "You can place your vote until {dateString}." : "Вы можете проголосовать до {dateString}.", + "Results are hidden." : "Результаты скрыты.", + "Public poll" : "Открытый опрос", + "Login" : "Вход", "To participate, tell us how we can call you!" : "Укажите своё имя, которое будет использоваться в опросах.", "Enter your name" : "Введите своё имя", "Cancel" : "Отменить", @@ -40,9 +47,9 @@ "Title" : "Название", "Enter Title" : "Введите заголовок", "Poll type" : "Тип опроса", + "Apply" : "Применить", "Date poll" : "Выбор даты", "Text poll" : "Выбор текстовых вариантов", - "Apply" : "Применить", "Add new Poll" : "Добавить опрос", "Settings" : "Параметры", "Relevant" : "Актуальные", @@ -80,7 +87,10 @@ "Created" : "Создано", "No description provided" : "Описание отсуствует", "Deleted" : "Удалено", + "All users" : "Все пользователи", + "Only invited users" : "Только приглашённые пользователи", "never" : "никогда", + "Use background image" : "Использовать фоновое изображение", "Copy link to clipboard" : "Скопировать ссылку в буфер обмена", "Remove share" : "Закрыть общий доступ", "Public shares" : "Общедоступные ссылки", @@ -93,7 +103,6 @@ "As an admin you may edit this poll" : "Вы может отредактировать этот опрос используя права администратора", "Description" : "Описание", "Poll configurations" : "Конфигурация опроса", - "Allow \"maybe\" vote" : "Разрешить вариант «может быть»", "Anonymous poll" : "Анонимный опрос", "Allow admins to edit this poll" : "Администраторы могут редактировать этот опрос", "Result display" : "Показ результатов", diff --git a/l10n/sk.js b/l10n/sk.js index a8de258bf..a121c8f22 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -54,9 +54,9 @@ OC.L10N.register( "Title" : "Názov", "Enter Title" : "Zadajte nadpis", "Poll type" : "Typ ankety", + "Apply" : "Aplikovať", "Date poll" : "Dátum ankety", "Text poll" : "Textová anketa", - "Apply" : "Aplikovať", "Poll \"{pollTitle}\" added" : "Anketa \"{pollTitle}\" pridaná", "Add new Poll" : "Pridať novú anketu", "Settings" : "Nastavenia", @@ -115,7 +115,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Ako správca môžete túto anketu upraviť", "Description" : "Popis", "Poll configurations" : "Nastavenia ankety", - "Allow \"maybe\" vote" : "Umožniť hlasovať „možno“.", "Anonymous poll" : "Anonymná anketa", "Allow admins to edit this poll" : "Povoliť správcom upraviť túto anketu", "Result display" : "Zobrazenie výsledku", diff --git a/l10n/sk.json b/l10n/sk.json index 4dd064154..258700f62 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -52,9 +52,9 @@ "Title" : "Názov", "Enter Title" : "Zadajte nadpis", "Poll type" : "Typ ankety", + "Apply" : "Aplikovať", "Date poll" : "Dátum ankety", "Text poll" : "Textová anketa", - "Apply" : "Aplikovať", "Poll \"{pollTitle}\" added" : "Anketa \"{pollTitle}\" pridaná", "Add new Poll" : "Pridať novú anketu", "Settings" : "Nastavenia", @@ -113,7 +113,6 @@ "As an admin you may edit this poll" : "Ako správca môžete túto anketu upraviť", "Description" : "Popis", "Poll configurations" : "Nastavenia ankety", - "Allow \"maybe\" vote" : "Umožniť hlasovať „možno“.", "Anonymous poll" : "Anonymná anketa", "Allow admins to edit this poll" : "Povoliť správcom upraviť túto anketu", "Result display" : "Zobrazenie výsledku", diff --git a/l10n/sl.js b/l10n/sl.js index 93cf40837..9bfa7c72c 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -35,7 +35,7 @@ OC.L10N.register( "{owner} invited you to take part in the poll \"{title}\"" : "{owner} vas vabi k izpolnjevanju ankete »{title}«", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Povezava vam omogoča osebni dostop do omenjene ankete. Pritisnite gumb oziroma kopirajte povezavo in jo prilepite v spletni brskalnik.", "Do not share this link with other people, because it is connected to your votes." : "Ta povezava je le za vas in je ne delite z drugimi. Povezana je namreč z vašimi odzivi v anketi.", - "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Elektronsko sporočilo ste prejeli, ker ste povabljeni k izpolnjevanju ankete. Vaše ime in elektronski naslov sta zabeležena v anketi. Če se želite odstraniti, stopite v stik s skrbnikom ali avtorjem ankete prek elektronske pošte.", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Elektronsko sporočilo ste prejeli, ker ste povabljeni k izpolnjevanju ankete. Vaše ime in elektronski naslov sta zabeležena v anketi. Če se želite odstraniti s seznama, stopite v stik s skrbnikom oziroma avtorjem ankete prek elektronske pošte.", "A polls app, similar to doodle/dudle with the possibility to restrict access." : "Nextcloud Polls je program, podoben spletnemu programu Doodle z možnostjo omejevanja dostopa.", "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "Nextcloud Polls je program, podoben spletnemu programu Doodle z možnostjo omejevanja dostopa (za člane, skupine ali uporabnike, skrite ankete in javno zbiranje odziva).", "Error loading poll list" : "Prišlo je do napake nalaganja seznama anket", @@ -64,6 +64,7 @@ OC.L10N.register( "Your are only allowed to vote for one option." : "Izbrati je dovoljeno le eno možnost.", "You reached the maximum number of allowed votes." : "Dosegli ste omejitev števila dovoljenih izbir.", "You have only one vote left." : "Preostaja vam še eno glasovanj.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "To je posebno glasovanje, pri katerem lahko le en uporabnik glasuje za izbrano možnost.", "_You have %n vote left._::_You have %n votes left._" : ["Preostaja vam še %n glasovanje.","Preostajata vam še %n glasovanji.","Preostajajo vam še %n glasovanja.","Preostaja vam še %n glasovanj."], "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["Dovoljeno je le %n glasovanje na možnost.","Dovoljeni sta le %n glasovanji na možnost.","Dovoljena so le %n glasovanja na možnost.","Dovoljenih je le %n glasovanj na možnost."], "Public poll" : "Javna anketa", @@ -97,12 +98,12 @@ OC.L10N.register( "Title" : "Naslov", "Enter Title" : "Naslov", "Poll type" : "Vrsta ankete", + "Apply" : "Ustvari", "Date poll" : "Usklajevanje dogodka", "Text poll" : "Besedilna anketa", - "Apply" : "Ustvari", "Poll \"{pollTitle}\" added" : "Anketa »{pollTitle}« je uspešno dodana.", "Error while creating Poll \"{pollTitle}\"" : "Prišlo je do napake med ustvarjanjem ankete »{pollTitle}«", - "Add new Poll" : "Dodaj novo anketo", + "Add new Poll" : "Dodaj anketo", "Administration" : "Skrbništvo", "Settings" : "Nastavitve", "Relevant" : "Pomembno", @@ -136,7 +137,7 @@ OC.L10N.register( "Decrease unit" : "Zmanjšaj enoto", "Increase unit" : "Povečaj enoto", "Shift" : "Premakni", - "Add a new text option" : "Dodaj novo besedilno možnost", + "Add a new text option" : "Dodaj besedilno možnost", "Enter option text" : "Vpis besedila možnosti", "Access" : "Dostop", "Owner" : "Lastnik", @@ -147,22 +148,24 @@ OC.L10N.register( "All users" : "Vsi uporabniki", "Only invited users" : "Le povabljeni uporabniki", "never" : "nikoli", + "Beta - watch for updated polls in realtime" : "Preizkusno – posodobitev anket spremljaj v stvarnem času", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Vse spremembe trenutne ankete, ki jih sproži katerikoli uporabnik, bodo posodobljene v stvarnem času.", "Try experimental styles" : "Uporabi preizkusne sloge", - "Some experimental UI variants. Changes the background color of the main area." : "Preizkusne možnosti vmesnika. Spremeni se barva ozadja glavnega polja ankete.", + "Some experimental UI variants. Changes the background color of the main area." : "Preizkusne možnosti vmesnika določajo ozadje glavnega polja ankete.", "Use background image" : "Uporabi sliko ozadja", - "Add a background image to the main area." : "Dodaj sliko ozadja v glavno polje ankete.", + "Add a background image to the main area." : "Sliko doda kot ozadjea glavnega polja ankete.", "Enter the URL of your favorite background image." : "Vpis naslova URL priljubljene slike ozadja.", "Glassy navigation" : "Steklasti krmilniki", "Blurs the background of the navigation (Does not work with all browsers)." : "Ozadje postane malce motno (možnost ni na voljo v vseh brskalnikih).", "Glassy sidebar" : "Steklasto bočno okno", "Blurs the background of the sidebar (Does not work with all browsers)." : "Ozadje bočnega okna postane malce motno (možnost ni na voljo v vseh brskalnikih).", "Use calendar lookup" : "Omogoči pregled koledarja", - "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "Preveri, ali je možnost datuma v anketi morda v sporu z drugim vnosom v koledar.", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "Preveri, ali je določitev datuma v anketi morda v sporu z drugim vnosom v koledarju.", "Opt in to the calendars, which should be checked." : "Izberite koledarje, ki naj bodo preverjeni.", - "Text polls default to list view" : "Besedilne ankete naj bodo privzeto v seznamskem pogledu", - "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Preveri, ali prednostno uporabljate besedilno ali seznamsko poravnavo prikaza razultatov anket, namesto mrežnega. Privzeto je uporabljen seznamski pogled.", - "Date polls default to list view" : "Datumske ankete naj bodo privzeto v seznamskem pogledu", - "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Preverite, ali prednostno uporabljate datumsko anketo v navpičnem pogledu, namesto v mrežnem. Privzeto je uporabljen mrežni pogled.", + "Text polls default to list view" : "Besedilne ankete privzeto pokaži seznamsko", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Nastavitev določa, ali je prednostno v uporabi besedilna ali seznamska poravnava prikaza odzivov in ne mrežna. Privzeto je uporabljen seznamski pogled.", + "Date polls default to list view" : "Datumske ankete privzeto pokaži seznamsko", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Nastavitev določa, ali je datumska anketa prednostno v navpičnem pogledu in ne v mrežnem Privzeto je uporabljen mrežni pogled.", "User Settings" : "Uporabniške nastavitve", "Experimental Styles" : "Preizkusni slogi", "Public link ({token})" : "Javna povezava ({token})", @@ -178,9 +181,9 @@ OC.L10N.register( "Unsent invitations" : "Neposlana vabila", "Resolve into individual invitations" : "Razreši v posamezna vabila", "Remove invitation" : "Razreši vabilo", - "Resolving of {name} is not possible. The circles app is not enabled." : "Razreševanje {name} ni mogoče. Program Krogi ni omogočen.", - "Resolving of {name} is not possible. The contacts app is not enabled." : "Razreševanje {name} ni mogoče. Program Stikii ni omogočen", - "Error resolving {name}." : "Napaka razreševanja {name}", + "Resolving of {name} is not possible. The circles app is not enabled." : "Ni mogoče razrešiti imena {name}. Program Krogi ni omogočen.", + "Resolving of {name} is not possible. The contacts app is not enabled." : "Ni mogoče razrešiti imena {name}. Program Stiki ni omogočen.", + "Error resolving {name}." : "Napaka razreševanja imena {name}", "Details" : "Podrobnosti", "Configuration" : "Nastavitve", "Options" : "Možnosti", @@ -188,11 +191,10 @@ OC.L10N.register( "Comments" : "Opombe", "No comments" : "Ni še vpisanih opomb.", "Be the first." : "Bodite prvi.", - "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Priporočljiva je previdnost pri spreminjanju možnosti, ker lahko dejanje vpliva na že zbrane podatke na neželen način.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Anketa je že dejavna, zato previdno pri spreminjanju možnosti! Spreminjanje lahko na neželen način vpliva na že zbrane podatke.", "As an admin you may edit this poll" : "Kot skrbnik lahko urejate to anketo", "Description" : "Opis", "Poll configurations" : "Nastavitve ankete", - "Allow \"maybe\" vote" : "Dovoli izbiro » Mogoče «", "Anonymous poll" : "Anonimna anketa", "Limit yes votes per user" : "Omeji število glasovanj na uporabnika", "Limit yes votes per option" : "Omeji število glasovanj na možnost", @@ -220,7 +222,7 @@ OC.L10N.register( "Manage polls" : "Upravljanje anket", "Manage polls of other users. You can take over the ownership or delete polls." : "Upravljanje anket drugih uporabnikov. Mogoče je prevzeti lastništvo anket ali jih izbrisati.", "No polls found for this category" : "Za to kategorijo ni najdene nobene ankete", - "Add one or change category!" : "Ali jo dodajte ali pa spremenite kategorijo!", + "Add one or change category!" : "Ali jo dodajte ali pa izberite drugo kategorijo!", "Take over" : "Prevzemi", "Set \"deleted\" status" : "Nastavi stanje »brisanja«", "Do you want to take over this poll from {username} and change the ownership?" : "Ali želite prevzeti anketo uporabnika {username} in spremeniti lastništvo?", @@ -230,19 +232,19 @@ OC.L10N.register( "Error switching deleted status." : "Napaka preklapljanja stanja brisanja.", "Error overtaking poll." : "Napaka prevzemanja ankete.", "404 - poll not found" : "napaka 404 – ankete ni mogoče najti", - "Enter a poll or start a new one." : "Vpišite naziv ankete ali pa ustvarite novo.", + "Enter a poll or start a new one." : "Vpišite naziv ankete oziroma ustvarite novo.", "Goto Nextcloud" : "Skočite na Nextcloud", "Relevant polls" : "Pomembne ankete", "Hidden polls" : "Skrite ankete", "My deleted polls" : "Izbrisane ankete", "Participated by me" : "Moji odzivi", - "Your polls (where you are the owner)." : "Vaše ankete (pri katerih ste lastnik)", - "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "Izpisane so pomembne ankete, ki ste jih ustvarili, vam je dodeljeno lastništvo oziroma jo lahko izpolnite. Zaprtih anket ni na seznamu.", - "A complete list with all public polls on this site, regardless who is the owner." : "Celoten seznam javnih anket neupoštevajoč lastništvo", + "Your polls (where you are the owner)." : "Ankete (z dodeljenim lastništvom)", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "Izpisane so ankete, označene kot pomembne, ankete, ki ste jih ustvarili, jih imate v lastništvu oziroma čakajo na izpolnjevanje. Zaprtih anket ni na seznamu.", + "A complete list with all public polls on this site, regardless who is the owner." : "Celoten seznam javnih anket neupoštevajoč lastništvo.", "All hidden polls, to which you have access." : "Seznam skritih ankete, do katerih imate dostop.", - "The trash bin." : "Smetnjak.", + "The trash bin." : "Ankete, ki čakajo na dokončno odstranitev.", "All polls, where you placed a vote." : "Vse ankete, ki ste jih izpolnjevali.", - "All closed polls, where voting is disabled." : "Vse zaprte ankete, kjer so odzivi onemogočeni.", + "All closed polls, where voting is disabled." : "Zaprte ankete, pri katerih so odzivi onemogočeni.", "All polls, where you have access to." : "Vse ankete, do katerih imate dostop", "Error loading poll" : "Napaka nalaganja ankete", "Toggle Sidebar" : "Preklopi bočno okno", diff --git a/l10n/sl.json b/l10n/sl.json index 719c3d80a..80de130cd 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -33,7 +33,7 @@ "{owner} invited you to take part in the poll \"{title}\"" : "{owner} vas vabi k izpolnjevanju ankete »{title}«", "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "Povezava vam omogoča osebni dostop do omenjene ankete. Pritisnite gumb oziroma kopirajte povezavo in jo prilepite v spletni brskalnik.", "Do not share this link with other people, because it is connected to your votes." : "Ta povezava je le za vas in je ne delite z drugimi. Povezana je namreč z vašimi odzivi v anketi.", - "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Elektronsko sporočilo ste prejeli, ker ste povabljeni k izpolnjevanju ankete. Vaše ime in elektronski naslov sta zabeležena v anketi. Če se želite odstraniti, stopite v stik s skrbnikom ali avtorjem ankete prek elektronske pošte.", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "Elektronsko sporočilo ste prejeli, ker ste povabljeni k izpolnjevanju ankete. Vaše ime in elektronski naslov sta zabeležena v anketi. Če se želite odstraniti s seznama, stopite v stik s skrbnikom oziroma avtorjem ankete prek elektronske pošte.", "A polls app, similar to doodle/dudle with the possibility to restrict access." : "Nextcloud Polls je program, podoben spletnemu programu Doodle z možnostjo omejevanja dostopa.", "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "Nextcloud Polls je program, podoben spletnemu programu Doodle z možnostjo omejevanja dostopa (za člane, skupine ali uporabnike, skrite ankete in javno zbiranje odziva).", "Error loading poll list" : "Prišlo je do napake nalaganja seznama anket", @@ -62,6 +62,7 @@ "Your are only allowed to vote for one option." : "Izbrati je dovoljeno le eno možnost.", "You reached the maximum number of allowed votes." : "Dosegli ste omejitev števila dovoljenih izbir.", "You have only one vote left." : "Preostaja vam še eno glasovanj.", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "To je posebno glasovanje, pri katerem lahko le en uporabnik glasuje za izbrano možnost.", "_You have %n vote left._::_You have %n votes left._" : ["Preostaja vam še %n glasovanje.","Preostajata vam še %n glasovanji.","Preostajajo vam še %n glasovanja.","Preostaja vam še %n glasovanj."], "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["Dovoljeno je le %n glasovanje na možnost.","Dovoljeni sta le %n glasovanji na možnost.","Dovoljena so le %n glasovanja na možnost.","Dovoljenih je le %n glasovanj na možnost."], "Public poll" : "Javna anketa", @@ -95,12 +96,12 @@ "Title" : "Naslov", "Enter Title" : "Naslov", "Poll type" : "Vrsta ankete", + "Apply" : "Ustvari", "Date poll" : "Usklajevanje dogodka", "Text poll" : "Besedilna anketa", - "Apply" : "Ustvari", "Poll \"{pollTitle}\" added" : "Anketa »{pollTitle}« je uspešno dodana.", "Error while creating Poll \"{pollTitle}\"" : "Prišlo je do napake med ustvarjanjem ankete »{pollTitle}«", - "Add new Poll" : "Dodaj novo anketo", + "Add new Poll" : "Dodaj anketo", "Administration" : "Skrbništvo", "Settings" : "Nastavitve", "Relevant" : "Pomembno", @@ -134,7 +135,7 @@ "Decrease unit" : "Zmanjšaj enoto", "Increase unit" : "Povečaj enoto", "Shift" : "Premakni", - "Add a new text option" : "Dodaj novo besedilno možnost", + "Add a new text option" : "Dodaj besedilno možnost", "Enter option text" : "Vpis besedila možnosti", "Access" : "Dostop", "Owner" : "Lastnik", @@ -145,22 +146,24 @@ "All users" : "Vsi uporabniki", "Only invited users" : "Le povabljeni uporabniki", "never" : "nikoli", + "Beta - watch for updated polls in realtime" : "Preizkusno – posodobitev anket spremljaj v stvarnem času", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Vse spremembe trenutne ankete, ki jih sproži katerikoli uporabnik, bodo posodobljene v stvarnem času.", "Try experimental styles" : "Uporabi preizkusne sloge", - "Some experimental UI variants. Changes the background color of the main area." : "Preizkusne možnosti vmesnika. Spremeni se barva ozadja glavnega polja ankete.", + "Some experimental UI variants. Changes the background color of the main area." : "Preizkusne možnosti vmesnika določajo ozadje glavnega polja ankete.", "Use background image" : "Uporabi sliko ozadja", - "Add a background image to the main area." : "Dodaj sliko ozadja v glavno polje ankete.", + "Add a background image to the main area." : "Sliko doda kot ozadjea glavnega polja ankete.", "Enter the URL of your favorite background image." : "Vpis naslova URL priljubljene slike ozadja.", "Glassy navigation" : "Steklasti krmilniki", "Blurs the background of the navigation (Does not work with all browsers)." : "Ozadje postane malce motno (možnost ni na voljo v vseh brskalnikih).", "Glassy sidebar" : "Steklasto bočno okno", "Blurs the background of the sidebar (Does not work with all browsers)." : "Ozadje bočnega okna postane malce motno (možnost ni na voljo v vseh brskalnikih).", "Use calendar lookup" : "Omogoči pregled koledarja", - "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "Preveri, ali je možnost datuma v anketi morda v sporu z drugim vnosom v koledar.", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "Preveri, ali je določitev datuma v anketi morda v sporu z drugim vnosom v koledarju.", "Opt in to the calendars, which should be checked." : "Izberite koledarje, ki naj bodo preverjeni.", - "Text polls default to list view" : "Besedilne ankete naj bodo privzeto v seznamskem pogledu", - "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Preveri, ali prednostno uporabljate besedilno ali seznamsko poravnavo prikaza razultatov anket, namesto mrežnega. Privzeto je uporabljen seznamski pogled.", - "Date polls default to list view" : "Datumske ankete naj bodo privzeto v seznamskem pogledu", - "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Preverite, ali prednostno uporabljate datumsko anketo v navpičnem pogledu, namesto v mrežnem. Privzeto je uporabljen mrežni pogled.", + "Text polls default to list view" : "Besedilne ankete privzeto pokaži seznamsko", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "Nastavitev določa, ali je prednostno v uporabi besedilna ali seznamska poravnava prikaza odzivov in ne mrežna. Privzeto je uporabljen seznamski pogled.", + "Date polls default to list view" : "Datumske ankete privzeto pokaži seznamsko", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "Nastavitev določa, ali je datumska anketa prednostno v navpičnem pogledu in ne v mrežnem Privzeto je uporabljen mrežni pogled.", "User Settings" : "Uporabniške nastavitve", "Experimental Styles" : "Preizkusni slogi", "Public link ({token})" : "Javna povezava ({token})", @@ -176,9 +179,9 @@ "Unsent invitations" : "Neposlana vabila", "Resolve into individual invitations" : "Razreši v posamezna vabila", "Remove invitation" : "Razreši vabilo", - "Resolving of {name} is not possible. The circles app is not enabled." : "Razreševanje {name} ni mogoče. Program Krogi ni omogočen.", - "Resolving of {name} is not possible. The contacts app is not enabled." : "Razreševanje {name} ni mogoče. Program Stikii ni omogočen", - "Error resolving {name}." : "Napaka razreševanja {name}", + "Resolving of {name} is not possible. The circles app is not enabled." : "Ni mogoče razrešiti imena {name}. Program Krogi ni omogočen.", + "Resolving of {name} is not possible. The contacts app is not enabled." : "Ni mogoče razrešiti imena {name}. Program Stiki ni omogočen.", + "Error resolving {name}." : "Napaka razreševanja imena {name}", "Details" : "Podrobnosti", "Configuration" : "Nastavitve", "Options" : "Možnosti", @@ -186,11 +189,10 @@ "Comments" : "Opombe", "No comments" : "Ni še vpisanih opomb.", "Be the first." : "Bodite prvi.", - "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Priporočljiva je previdnost pri spreminjanju možnosti, ker lahko dejanje vpliva na že zbrane podatke na neželen način.", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "Anketa je že dejavna, zato previdno pri spreminjanju možnosti! Spreminjanje lahko na neželen način vpliva na že zbrane podatke.", "As an admin you may edit this poll" : "Kot skrbnik lahko urejate to anketo", "Description" : "Opis", "Poll configurations" : "Nastavitve ankete", - "Allow \"maybe\" vote" : "Dovoli izbiro » Mogoče «", "Anonymous poll" : "Anonimna anketa", "Limit yes votes per user" : "Omeji število glasovanj na uporabnika", "Limit yes votes per option" : "Omeji število glasovanj na možnost", @@ -218,7 +220,7 @@ "Manage polls" : "Upravljanje anket", "Manage polls of other users. You can take over the ownership or delete polls." : "Upravljanje anket drugih uporabnikov. Mogoče je prevzeti lastništvo anket ali jih izbrisati.", "No polls found for this category" : "Za to kategorijo ni najdene nobene ankete", - "Add one or change category!" : "Ali jo dodajte ali pa spremenite kategorijo!", + "Add one or change category!" : "Ali jo dodajte ali pa izberite drugo kategorijo!", "Take over" : "Prevzemi", "Set \"deleted\" status" : "Nastavi stanje »brisanja«", "Do you want to take over this poll from {username} and change the ownership?" : "Ali želite prevzeti anketo uporabnika {username} in spremeniti lastništvo?", @@ -228,19 +230,19 @@ "Error switching deleted status." : "Napaka preklapljanja stanja brisanja.", "Error overtaking poll." : "Napaka prevzemanja ankete.", "404 - poll not found" : "napaka 404 – ankete ni mogoče najti", - "Enter a poll or start a new one." : "Vpišite naziv ankete ali pa ustvarite novo.", + "Enter a poll or start a new one." : "Vpišite naziv ankete oziroma ustvarite novo.", "Goto Nextcloud" : "Skočite na Nextcloud", "Relevant polls" : "Pomembne ankete", "Hidden polls" : "Skrite ankete", "My deleted polls" : "Izbrisane ankete", "Participated by me" : "Moji odzivi", - "Your polls (where you are the owner)." : "Vaše ankete (pri katerih ste lastnik)", - "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "Izpisane so pomembne ankete, ki ste jih ustvarili, vam je dodeljeno lastništvo oziroma jo lahko izpolnite. Zaprtih anket ni na seznamu.", - "A complete list with all public polls on this site, regardless who is the owner." : "Celoten seznam javnih anket neupoštevajoč lastništvo", + "Your polls (where you are the owner)." : "Ankete (z dodeljenim lastništvom)", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "Izpisane so ankete, označene kot pomembne, ankete, ki ste jih ustvarili, jih imate v lastništvu oziroma čakajo na izpolnjevanje. Zaprtih anket ni na seznamu.", + "A complete list with all public polls on this site, regardless who is the owner." : "Celoten seznam javnih anket neupoštevajoč lastništvo.", "All hidden polls, to which you have access." : "Seznam skritih ankete, do katerih imate dostop.", - "The trash bin." : "Smetnjak.", + "The trash bin." : "Ankete, ki čakajo na dokončno odstranitev.", "All polls, where you placed a vote." : "Vse ankete, ki ste jih izpolnjevali.", - "All closed polls, where voting is disabled." : "Vse zaprte ankete, kjer so odzivi onemogočeni.", + "All closed polls, where voting is disabled." : "Zaprte ankete, pri katerih so odzivi onemogočeni.", "All polls, where you have access to." : "Vse ankete, do katerih imate dostop", "Error loading poll" : "Napaka nalaganja ankete", "Toggle Sidebar" : "Preklopi bočno okno", diff --git a/l10n/sr.js b/l10n/sr.js index 81dfe02cb..5c8457d65 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -56,9 +56,9 @@ OC.L10N.register( "Title" : "Наслов", "Enter Title" : "Унесите назив", "Poll type" : "Тип гласања", + "Apply" : "Примени", "Date poll" : "Гласање о датуму", "Text poll" : "Текстуално гласање", - "Apply" : "Примени", "Add new Poll" : "Додај ново гласање", "Settings" : "Поставке", "Relevant" : "Релевантно", @@ -114,7 +114,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Као администратор можете да мењате ово гласање", "Description" : "Опис", "Poll configurations" : "Конфигурације гласања", - "Allow \"maybe\" vote" : "Дозволи глас за „можда“", "Anonymous poll" : "Анонимно гласање", "Allow admins to edit this poll" : "Дозволи администраторима да мењају ово гласање", "Result display" : "Приказ резултата", diff --git a/l10n/sr.json b/l10n/sr.json index d20f907db..2459b2f5e 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -54,9 +54,9 @@ "Title" : "Наслов", "Enter Title" : "Унесите назив", "Poll type" : "Тип гласања", + "Apply" : "Примени", "Date poll" : "Гласање о датуму", "Text poll" : "Текстуално гласање", - "Apply" : "Примени", "Add new Poll" : "Додај ново гласање", "Settings" : "Поставке", "Relevant" : "Релевантно", @@ -112,7 +112,6 @@ "As an admin you may edit this poll" : "Као администратор можете да мењате ово гласање", "Description" : "Опис", "Poll configurations" : "Конфигурације гласања", - "Allow \"maybe\" vote" : "Дозволи глас за „можда“", "Anonymous poll" : "Анонимно гласање", "Allow admins to edit this poll" : "Дозволи администраторима да мењају ово гласање", "Result display" : "Приказ резултата", diff --git a/l10n/sv.js b/l10n/sv.js index eb880162a..c9b90ea01 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -27,9 +27,9 @@ OC.L10N.register( "Title" : "Titel", "Enter Title" : "Lägg till rubrik", "Poll type" : "Omröstningstyp", + "Apply" : "Tillämpa", "Date poll" : "Datumomröstning", "Text poll" : "Textomröstning", - "Apply" : "Tillämpa", "Add new Poll" : "Lägg till omröstning", "Settings" : "Inställningar", "My polls" : "Mina omröstningar", @@ -58,7 +58,6 @@ OC.L10N.register( "Comments" : "Kommentarer", "Description" : "Beskrivning", "Poll configurations" : "Omröstningsinställningar", - "Allow \"maybe\" vote" : "Tillåt kanske-röster", "Anonymous poll" : "Anonym omröstning", "Title must not be empty!" : "Titeln får inte vara tom", "Receive notification email on activity" : "Mottag notifieringsepost vid aktivitet", diff --git a/l10n/sv.json b/l10n/sv.json index ff79f011b..cfae55f0e 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -25,9 +25,9 @@ "Title" : "Titel", "Enter Title" : "Lägg till rubrik", "Poll type" : "Omröstningstyp", + "Apply" : "Tillämpa", "Date poll" : "Datumomröstning", "Text poll" : "Textomröstning", - "Apply" : "Tillämpa", "Add new Poll" : "Lägg till omröstning", "Settings" : "Inställningar", "My polls" : "Mina omröstningar", @@ -56,7 +56,6 @@ "Comments" : "Kommentarer", "Description" : "Beskrivning", "Poll configurations" : "Omröstningsinställningar", - "Allow \"maybe\" vote" : "Tillåt kanske-röster", "Anonymous poll" : "Anonym omröstning", "Title must not be empty!" : "Titeln får inte vara tom", "Receive notification email on activity" : "Mottag notifieringsepost vid aktivitet", diff --git a/l10n/tr.js b/l10n/tr.js index dc7387551..c38ffb76b 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -98,9 +98,9 @@ OC.L10N.register( "Title" : "Başlık", "Enter Title" : "Başlığı yazın", "Poll type" : "Anket türü", + "Apply" : "Uygula", "Date poll" : "Tarih anketi", "Text poll" : "Metin anketi", - "Apply" : "Uygula", "Poll \"{pollTitle}\" added" : "\"{pollTitle}\" anketi eklendi", "Error while creating Poll \"{pollTitle}\"" : "\"{pollTitle}\" anketi eklenirken sorun çıktı", "Add new Poll" : "Anket ekle", @@ -148,6 +148,8 @@ OC.L10N.register( "All users" : "Tüm kullanıcılar", "Only invited users" : "Yalnız çağrılmış kullanıcılar", "never" : "asla", + "Beta - watch for updated polls in realtime" : "Deneme - Anket güncellemelerini gerçek zamanlı olarak görün", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Geçerli ankette diğer kullanıcılar tarafından yapılan tüm değişiklikler gerçek zamanlı olarak görüntülenir.", "Try experimental styles" : "Deneysel biçemler kullanılsın", "Some experimental UI variants. Changes the background color of the main area." : "Bazı deneysel kullanıcı arayüzü türleri. Ana bölgenin arka plan rengini değiştirir. ", "Use background image" : "Arka plan görseli kullanılsın", @@ -193,8 +195,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Yönetici olduğunuzdan bu anketi düzenleyebilirsiniz", "Description" : "Açıklama", "Poll configurations" : "Anket yapılandırmaları", - "Allow \"maybe\" vote" : "\"Belki\" oyu verilebilsin", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Oy sınırları kullanılıyorsa \"belki\" seçeneğine izin verilmemelidir.", "Anonymous poll" : "Anonim anket", "Limit yes votes per user" : "Her kullanıcı için evet oylarını sınırla", "Limit yes votes per option" : "Her seçenek için evet oylarını sınırla", diff --git a/l10n/tr.json b/l10n/tr.json index 5793d23ca..6a4421b90 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -96,9 +96,9 @@ "Title" : "Başlık", "Enter Title" : "Başlığı yazın", "Poll type" : "Anket türü", + "Apply" : "Uygula", "Date poll" : "Tarih anketi", "Text poll" : "Metin anketi", - "Apply" : "Uygula", "Poll \"{pollTitle}\" added" : "\"{pollTitle}\" anketi eklendi", "Error while creating Poll \"{pollTitle}\"" : "\"{pollTitle}\" anketi eklenirken sorun çıktı", "Add new Poll" : "Anket ekle", @@ -146,6 +146,8 @@ "All users" : "Tüm kullanıcılar", "Only invited users" : "Yalnız çağrılmış kullanıcılar", "never" : "asla", + "Beta - watch for updated polls in realtime" : "Deneme - Anket güncellemelerini gerçek zamanlı olarak görün", + "All changes to the current poll, done by other users, will be recognized in realtime." : "Geçerli ankette diğer kullanıcılar tarafından yapılan tüm değişiklikler gerçek zamanlı olarak görüntülenir.", "Try experimental styles" : "Deneysel biçemler kullanılsın", "Some experimental UI variants. Changes the background color of the main area." : "Bazı deneysel kullanıcı arayüzü türleri. Ana bölgenin arka plan rengini değiştirir. ", "Use background image" : "Arka plan görseli kullanılsın", @@ -191,8 +193,6 @@ "As an admin you may edit this poll" : "Yönetici olduğunuzdan bu anketi düzenleyebilirsiniz", "Description" : "Açıklama", "Poll configurations" : "Anket yapılandırmaları", - "Allow \"maybe\" vote" : "\"Belki\" oyu verilebilsin", - "If vote limits are used, \"maybe\" shouldn't be allowed." : "Oy sınırları kullanılıyorsa \"belki\" seçeneğine izin verilmemelidir.", "Anonymous poll" : "Anonim anket", "Limit yes votes per user" : "Her kullanıcı için evet oylarını sınırla", "Limit yes votes per option" : "Her seçenek için evet oylarını sınırla", diff --git a/l10n/uk.js b/l10n/uk.js index 0ad27fd77..186e934ab 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -25,9 +25,9 @@ OC.L10N.register( "Title" : "Назва", "Enter Title" : "Зазначте назву", "Poll type" : "Тип опитування", + "Apply" : "Застосувати", "Date poll" : "Календарне опитування", "Text poll" : "Текстове опитування", - "Apply" : "Застосувати", "Add new Poll" : "Додати нове опитування", "Settings" : "Налаштування", "Relevant" : "Відповідне", @@ -56,7 +56,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "Адміністратор може редагувати це опитування", "Description" : "Опис", "Poll configurations" : "Налаштування опитування", - "Allow \"maybe\" vote" : "Дозволити вибір \"можливо\"", "Anonymous poll" : "Анонімне опитування", "Allow admins to edit this poll" : "Дозволити адміністраторові редагувати це опитування", "Result display" : "Показ результатів", diff --git a/l10n/uk.json b/l10n/uk.json index b9a2e054f..9865313cc 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -23,9 +23,9 @@ "Title" : "Назва", "Enter Title" : "Зазначте назву", "Poll type" : "Тип опитування", + "Apply" : "Застосувати", "Date poll" : "Календарне опитування", "Text poll" : "Текстове опитування", - "Apply" : "Застосувати", "Add new Poll" : "Додати нове опитування", "Settings" : "Налаштування", "Relevant" : "Відповідне", @@ -54,7 +54,6 @@ "As an admin you may edit this poll" : "Адміністратор може редагувати це опитування", "Description" : "Опис", "Poll configurations" : "Налаштування опитування", - "Allow \"maybe\" vote" : "Дозволити вибір \"можливо\"", "Anonymous poll" : "Анонімне опитування", "Allow admins to edit this poll" : "Дозволити адміністраторові редагувати це опитування", "Result display" : "Показ результатів", diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js index a04ee674e..abbe71e51 100644 --- a/l10n/zh_CN.js +++ b/l10n/zh_CN.js @@ -36,9 +36,9 @@ OC.L10N.register( "Title" : "标题", "Enter Title" : "输入标题", "Poll type" : "投票类型", + "Apply" : "应用", "Date poll" : "日期投票", "Text poll" : "文本投票", - "Apply" : "应用", "Add new Poll" : "添加新的投票", "Settings" : "设置", "Relevant" : "相关", @@ -85,7 +85,6 @@ OC.L10N.register( "As an admin you may edit this poll" : "作为管理员,您可以编辑此投票", "Description" : "描述", "Poll configurations" : "投票配置", - "Allow \"maybe\" vote" : "允许 \"可能\" 选项", "Anonymous poll" : "匿名投票", "Allow admins to edit this poll" : "允许管理员编辑此投票", "Always show results" : "总是显示结果", diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json index 1890c3cde..d910268c3 100644 --- a/l10n/zh_CN.json +++ b/l10n/zh_CN.json @@ -34,9 +34,9 @@ "Title" : "标题", "Enter Title" : "输入标题", "Poll type" : "投票类型", + "Apply" : "应用", "Date poll" : "日期投票", "Text poll" : "文本投票", - "Apply" : "应用", "Add new Poll" : "添加新的投票", "Settings" : "设置", "Relevant" : "相关", @@ -83,7 +83,6 @@ "As an admin you may edit this poll" : "作为管理员,您可以编辑此投票", "Description" : "描述", "Poll configurations" : "投票配置", - "Allow \"maybe\" vote" : "允许 \"可能\" 选项", "Anonymous poll" : "匿名投票", "Allow admins to edit this poll" : "允许管理员编辑此投票", "Always show results" : "总是显示结果", diff --git a/l10n/zh_HK.js b/l10n/zh_HK.js index 50fe50ba6..f7c014e12 100644 --- a/l10n/zh_HK.js +++ b/l10n/zh_HK.js @@ -1,21 +1,265 @@ OC.L10N.register( "polls", { + "Contact" : "聯絡人", + "Contact group" : "聯絡人群組", + "External Email" : "外部電子郵件", + "Public link" : "公開連結", + "External user" : "外部使用者", "Group" : "群組", - "User" : "User", + "User" : "用戶", + "Polls" : "調查", + "%s invited you to a poll" : "%s 邀請您參加投票", + "{user} has invited you to the poll \"%s\"." : "{user} 邀請您參加投票「%s」。", + "%s took over your poll" : "%s 接管了您的投票", + "{user} took over your poll \"%s\" and is the new owner." : "{user} 接管了您的投票「%s」並成為了新的擁有者。", + "%s permanently deleted your poll" : "%s 永久刪除了您的投票", + "{user} permanently deleted your poll \"%s\"." : "{user} 永久刪除了您的投票「%s」。", + "%s changed the deleted status of your poll" : "%s 變更了您投票的刪除狀態", + "{user} changed the deleted status of your poll \"%s\"." : "{user} 變更了您投票「%s」的刪除狀態。", + "- %s voted." : "- %s 已投票。", + "- Updated poll configuration. Please check your votes." : "- 更新了投票設定。請檢查您的投票。", + "- The poll got deleted." : "- 投票已刪除。", + "- The poll got restored." : "- 投票已復原。", + "- The poll was closed." : "- 投票已關閉。", + "- A vote option was added." : "- 已新增投票選項。", + "- A vote option was removed." : "- 已移除投票選項。", + "- The poll owner changed." : "- 投票擁有者已變更。", + "- %s created the poll." : "- %s 已建立投票。", + "Polls App - New Activity" : "投票應用程式 - 新活動", + "\"{title}\" had recent activity: " : "「{title}」最近有活動:", + "A user" : "使用者", + "Go to poll" : "去投票", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請造訪投票並移除您的訂閱。", + "Poll invitation \"%s\"" : "投票邀請「%s」", + "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您參加「{title}」的投票", + "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "此連結給您個人存取上面提到的投票。按上方的按鈕或複製以下的連結,然後將其貼到您瀏覽器的網址列。", + "Do not share this link with other people, because it is connected to your votes." : "不要與其他人分享此連結,因為其與您的投票息息相關。", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "此電子郵件已傳送給您,因為投票擁有者邀請您在此投票。此投票至少會記錄您的名字與您的電子郵件地址。如果您想要從此投票中移除,請聯絡站台管理員或此投票的發起者(即傳送郵件給您的人)。", + "A polls app, similar to doodle/dudle with the possibility to restrict access." : "類似於 doodle/dudle 投票應用程式,可限制存取對象。", + "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "類似於 doodle/dudle 投票應用程式,可限制存取對象(成員、特定群組或使用者、隱藏與公開)。", + "Error loading poll list" : "載入投票列表時發生錯誤", + "Confirmed" : "已確認", + "No Participants until now" : "目前為止都沒人參加", + "Copy list of email addresses to clipboard" : "將電子郵件地址列表複製到剪貼簿", + "Link copied to clipboard" : "已複製連結至剪貼簿", + "Error while copying link to clipboard" : "複製連結至剪貼簿時發生錯誤 ", + "_%n Participant_::_%n Participants_" : ["%n 個參與者"], + "This is a public poll." : "這是公開投票。", + "The following link is your personal access to this poll. You can reenter this poll at any time, change your vote and leave comments." : "以下連結是您對此投票的個人存取。您可以隨時重新進入此投票,變更您的投票並留言。", + "Your personal link to this poll: {linkURL}" : "您對此投票的個人連結:{linkURL}", + "Copy this link to the clipboard" : "將此連結複製到剪貼簿", + "Resend invitation mail to {emailAdress}" : "重新傳送邀請郵件到 {emailAdress}", + "Invitation resent to {emailAddress}" : "邀請已重新傳送到 {emailAddress}", + "Mail could not be resent to {emailAddress}" : "郵件無法重新傳送到 {emailAddress}", + "started this poll on {dateString}." : "在 {dateString} 上開始了此投票。", + "This poll is closed since {dateString}. The confirmed options are marked below." : "此投票自 {dateString} 起關閉。確認的選項已在下方標記。", + "This poll is closed since {dateString}, but there are no confirmed options until now." : "此投票自 {dateString} 起關閉,但至今無確認選項。", + "You can confirm your favorites now in the options tab in the sidebar." : "您現在可以在側邊欄中的選項分頁裡確認您的最愛。", + "You can place your vote until {dateString}." : "您到 {dateString} 前都可以投票。", + "This is an anonymous poll. Except to the poll owner, participants names are hidden." : "這是匿名投票。除了投票擁有者以外,參與者的名字都是隱藏的。", + "Results are hidden." : "結果是隱藏的。", + "They will be revealed after the poll is closed." : "它們將在投票關閉後揭露。", + "The used time zone is {timeZone}." : "使用的時區為 {timeZone}。", + "Your are only allowed to vote for one option." : "您只能投票給一個選項。", + "You reached the maximum number of allowed votes." : "您已達到最大可投票數。", + "You have only one vote left." : "您只剩下一票。", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "這是排他性投票,只允許一個使用者投票選擇一個選項。", + "_You have %n vote left._::_You have %n votes left._" : ["您還剩下 %n 票。"], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["每個選項僅允許 %n 票。"], + "Public poll" : "公開投票", + "Do you want to login?" : "您想要登入嗎?", + "Login" : "登入", + "Participate in public poll!" : "參與公開投票!", + "To participate, tell us how we can call you!" : "要參與,請告訴我們如何稱呼您!", + "Enter your name" : "輸入您的名稱", + "Optional email address" : "可選的電子郵件地址", "Cancel" : "取消", "OK" : "確定", + "Checking username …" : "正在檢查使用者名稱……", + "Please use at least 3 characters." : "請使用至少 3 個字元。", + "This name is not valid." : "此名稱無效。", + "OK, we will call you {username}." : "好的,我們會稱呼您為 {username}。", + "Checking email address …" : "正在檢查電子郵件地址……", + "This email address is not valid." : "此電子郵件地址無效。", + "This email address is valid." : "此電子郵件地址有效。", + "Error saving username" : "儲存使用者名稱時發生錯誤", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "使用您的電子郵件地址,您可以訂閱通知,然後您就會收到此投票的個人連結。", + "Enter a name to start the search" : "輸入一個名稱以開始搜尋", + "Error while adding share" : "新增分享時發生錯誤", + "Conflict" : "衝突", + "Got a network error while checking calendar events." : "檢查日曆活動時發生網路錯誤。", + "New comment …" : "新增留言……", + "Error while saving comment" : "儲存留言時發生錯誤", + "Delete comment" : "刪除留言", + "Comment deleted" : "留言已刪除", + "Error while deleting the comment" : "刪除留言時發生錯誤", "Title" : "標題", + "Enter Title" : "輸入標題", + "Poll type" : "投票類型", "Apply" : "套用", + "Date poll" : "日期投票", + "Text poll" : "文字投票", + "Poll \"{pollTitle}\" added" : "投票「{pollTitle}」已新增", + "Error while creating Poll \"{pollTitle}\"" : "建立投票「{pollTitle}」時發生錯誤", + "Add new Poll" : "新增投票", + "Administration" : "管理", "Settings" : "設定", - "Week" : "星期", - "Owner" : "Owner", - "never" : "永不", + "Relevant" : "相關", + "My polls" : "我的投票", + "Public polls" : "公開投票", + "All polls" : "所有投票", + "Closed polls" : "已關閉的投票", + "Deleted polls" : "已刪除的投票", + "Error cloning poll." : "再製投票時發生錯誤。", + "Error deleting poll." : "刪除投票時發生錯誤。", + "Clone poll" : "再製投票", + "Delete poll" : "刪除投票", + "Restore poll" : "復原投票", + "Delete poll permanently" : "永久刪除投票", + "Clone to option sequence" : "再製到選項序列", + "Create a sequence of date options starting with {dateOption}." : "建立一個以 {dateOption} 開始的日期選項序列。", + "Step unit: " : "步驟單位:", + "Step width: " : "步驟寬度:", + "Number of items to create: " : "要建立的項目數:", + "Week" : "週", + "Available Options" : "可用選項", + "Delete option" : "刪除選項", + "Clone option" : "再製選項", + "Unconfirm option" : "取消確認選項", + "Confirm option" : "確認選項", + "No vote options" : "無投票選項", + "Add some!" : "新增一些!", + "Add a date option" : "新增一個日期選項", + "Click to add a date" : "按一下新增日期", + "Shift all date options" : "轉移所有日期選項", + "Decrease unit" : "減少單位", + "Increase unit" : "增加單位", + "Shift" : "轉移", + "Add a new text option" : "新增一個新的文字選項", + "Enter option text" : "輸入選項文字", + "Access" : "存取", + "Owner" : "擁有者", + "Created" : "已建立", + "Closing Date" : "關閉日期", + "No description provided" : "未提供描述", + "Deleted" : "已刪除", + "All users" : "所有使用者", + "Only invited users" : "僅邀請的使用者", + "never" : "從未", + "Beta - watch for updated polls in realtime" : "測試版 - 監視即時更新的投票", + "All changes to the current poll, done by other users, will be recognized in realtime." : "其他使用者對目前投票的所有變更將會被即時識別。", + "Try experimental styles" : "試用實驗樣式", + "Some experimental UI variants. Changes the background color of the main area." : "一些實驗性的 UI 變體。變更主要區域的背景色彩。", + "Use background image" : "使用背景圖片", + "Add a background image to the main area." : "將背景圖片新增到主要區域。", + "Enter the URL of your favorite background image." : "輸入您最愛背景圖片的 URL。", + "Glassy navigation" : "透明導覽列", + "Blurs the background of the navigation (Does not work with all browsers)." : "模糊導覽列的背景(並非所有瀏覽器都能正常運作)。", + "Glassy sidebar" : "透明側邊欄", + "Blurs the background of the sidebar (Does not work with all browsers)." : "模糊側邊欄的背景(並非所有瀏覽器都能正常運作)。", + "Use calendar lookup" : "使用日曆查詢", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "檢查日期投票中的選項是否與您日曆中的活動衝突或鄰近。", + "Opt in to the calendars, which should be checked." : "選擇加入日曆,然後進行檢查。", + "Text polls default to list view" : "文字投票預設為列表檢視", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "如果您偏好以垂直對齊的列表而非網格檢視來顯示文字投票,請勾選這個。初始預設值為列表檢視。", + "Date polls default to list view" : "日期投票預設為列表檢視", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "如果您偏好以垂直檢視而非網格檢視來顯示日期投票,請勾選這個。初始預設值為網格檢視。", + "User Settings" : "使用者設定", + "Experimental Styles" : "實驗樣式", + "Public link ({token})" : "公開連結 ({token})", + "Effective shares" : "有效分享", + "Resend invitation mail" : "重新傳送邀請郵件", + "Send invitation mail" : "傳送邀請郵件", + "Copy link to clipboard" : "複製連結到剪貼簿", + "Remove share" : "移除分享", + "Invitation sent to {name}" : "邀請已傳送到 {name}", + "Error sending invitation to {name}" : "向 {name} 傳送邀請時發生錯誤", + "Public shares" : "公開分享", + "Add a public link" : "新增一個公開連結", + "Unsent invitations" : "取消傳送邀請", + "Resolve into individual invitations" : "解決個人邀請", + "Remove invitation" : "移除邀請", + "Resolving of {name} is not possible. The circles app is not enabled." : "無法解析 {name}。Circles 應用程式未啟用。", + "Resolving of {name} is not possible. The contacts app is not enabled." : "無法解析 {name}。通訊錄應用程式未啟用。", + "Error resolving {name}." : "解析 {name} 時發生錯誤。", + "Details" : "詳細資料", + "Configuration" : "設定", + "Options" : "選項", "Shares" : "分享", + "Comments" : "留言", + "No comments" : "無留言", + "Be the first." : "成為第一個。", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "變更選項時請小心,因為其可能以您不想要的方式影響既有的投票。", + "As an admin you may edit this poll" : "作為管理員,您可以編輯此投票", "Description" : "描述", - "No" : "No", - "Yes" : "Yes", + "Poll configurations" : "投票設定", + "Anonymous poll" : "匿名投票", + "Limit yes votes per user" : "限制每個使用者的「贊成」票", + "Limit yes votes per option" : "限制每個選項的「贊成」票", + "Poll closing status" : "投票關閉狀態", + "Reopen poll" : "重新開啟投票", + "Close poll" : "關閉投票", + "Closing date" : "關閉日期", + "Allow admins to edit this poll" : "允許管理員編輯這個投票", + "Relevant for all users" : "與所有使用者相關", + "Result display" : "結果顯示", + "Always show results" : "總是顯示結果", + "Hide results until poll is closed" : "直到投票關閉前都隱藏結果", + "Never show results" : "永不顯示結果", + "\"{pollTitle}\" successfully saved" : "「{pollTitle}」成功儲存", + "Title must not be empty!" : "標題不能為空!", + "Error writing poll" : "寫入投票時發生錯誤", + "Add Shares" : "新增分享", + "Receive notification email on activity to {emailAddress}" : "將活動通知電郵發送到 {emailAddress}", + "Receive notification email on activity" : "接收活動通知電子郵件", + "Delete votes" : "刪除投票", + "Do you want to remove {username} from poll?" : "您是否要從投票中移除 {username}?", + "No" : "否", + "Yes" : "是", + "User {userId} removed" : "使用者 {userId} 已移除", + "Manage polls" : "管理投票", + "Manage polls of other users. You can take over the ownership or delete polls." : "管理其他使用者的投票。您可以接管所有權或刪除投票。", + "No polls found for this category" : "找不到此分類的投票", + "Add one or change category!" : "新增一個或變更分類!", + "Take over" : "接管", + "Set \"deleted\" status" : "設定「已刪除」狀態", + "Do you want to take over this poll from {username} and change the ownership?" : "您想要從 {username} 處接管此投票並變更所有權嗎?", + "The original owner will be notified." : "將會通知原始所有者。", + "Do you want to delete this poll?" : "您想要刪除此投票嗎?", + "This action cannot be reverted." : "此動作無法還原。", + "Error switching deleted status." : "切換已刪除狀態時發生錯誤。", + "Error overtaking poll." : "接管投票時發生錯誤。", + "404 - poll not found" : "404 - 找不到投票", + "Enter a poll or start a new one." : "輸入投票或開始新的投票。", + "Goto Nextcloud" : "前往 Nextcloud", + "Relevant polls" : "相關投票", + "Hidden polls" : "隱藏投票", + "My deleted polls" : "我的已刪除投票", + "Participated by me" : "我參加了", + "Your polls (where you are the owner)." : "您的投票(您是所有者)。", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "與您相關或重要的所有投票,因為您是參與者、擁有者或被邀請。不含已關閉的投票。", + "A complete list with all public polls on this site, regardless who is the owner." : "此網站上的所有投票的完整列表,無論誰是所有者。", + "All hidden polls, to which you have access." : "您可以存取的所有隱藏投票。", + "The trash bin." : "回收桶。", + "All polls, where you placed a vote." : "您已投票的所有投票。", + "All closed polls, where voting is disabled." : "所有已關閉的投票,停用投票。", + "All polls, where you have access to." : "您可以存取的所有投票。", + "Error loading poll" : "載入投票時發生錯誤", + "Toggle Sidebar" : "切換側邊欄", + "Closed {relativeTimeAgo}" : "{relativeTimeAgo} 已關閉", + "Closing {relativeExpirationTime}" : "{relativeExpirationTime} 關閉", + "No vote options available" : "無投票選項", + "Maybe the owner did not provide some until now." : "也許擁有者到現在都沒有提供。", + "Switch to mobile view" : "切換到行動版檢視", + "Switch to desktop view" : "切換到桌面版檢視", + "Date order" : "日期順序", + "Original order" : "原始順序", + "Ranked order" : "排名順序", + "Minute" : "分鐘", + "Hour" : "小時", "Day" : "日", - "Month" : "月" + "Month" : "月", + "Year" : "年" }, "nplurals=1; plural=0;"); diff --git a/l10n/zh_HK.json b/l10n/zh_HK.json index b929c316c..0f22a7ddf 100644 --- a/l10n/zh_HK.json +++ b/l10n/zh_HK.json @@ -1,19 +1,263 @@ { "translations": { + "Contact" : "聯絡人", + "Contact group" : "聯絡人群組", + "External Email" : "外部電子郵件", + "Public link" : "公開連結", + "External user" : "外部使用者", "Group" : "群組", - "User" : "User", + "User" : "用戶", + "Polls" : "調查", + "%s invited you to a poll" : "%s 邀請您參加投票", + "{user} has invited you to the poll \"%s\"." : "{user} 邀請您參加投票「%s」。", + "%s took over your poll" : "%s 接管了您的投票", + "{user} took over your poll \"%s\" and is the new owner." : "{user} 接管了您的投票「%s」並成為了新的擁有者。", + "%s permanently deleted your poll" : "%s 永久刪除了您的投票", + "{user} permanently deleted your poll \"%s\"." : "{user} 永久刪除了您的投票「%s」。", + "%s changed the deleted status of your poll" : "%s 變更了您投票的刪除狀態", + "{user} changed the deleted status of your poll \"%s\"." : "{user} 變更了您投票「%s」的刪除狀態。", + "- %s voted." : "- %s 已投票。", + "- Updated poll configuration. Please check your votes." : "- 更新了投票設定。請檢查您的投票。", + "- The poll got deleted." : "- 投票已刪除。", + "- The poll got restored." : "- 投票已復原。", + "- The poll was closed." : "- 投票已關閉。", + "- A vote option was added." : "- 已新增投票選項。", + "- A vote option was removed." : "- 已移除投票選項。", + "- The poll owner changed." : "- 投票擁有者已變更。", + "- %s created the poll." : "- %s 已建立投票。", + "Polls App - New Activity" : "投票應用程式 - 新活動", + "\"{title}\" had recent activity: " : "「{title}」最近有活動:", + "A user" : "使用者", + "Go to poll" : "去投票", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請造訪投票並移除您的訂閱。", + "Poll invitation \"%s\"" : "投票邀請「%s」", + "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您參加「{title}」的投票", + "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "此連結給您個人存取上面提到的投票。按上方的按鈕或複製以下的連結,然後將其貼到您瀏覽器的網址列。", + "Do not share this link with other people, because it is connected to your votes." : "不要與其他人分享此連結,因為其與您的投票息息相關。", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "此電子郵件已傳送給您,因為投票擁有者邀請您在此投票。此投票至少會記錄您的名字與您的電子郵件地址。如果您想要從此投票中移除,請聯絡站台管理員或此投票的發起者(即傳送郵件給您的人)。", + "A polls app, similar to doodle/dudle with the possibility to restrict access." : "類似於 doodle/dudle 投票應用程式,可限制存取對象。", + "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "類似於 doodle/dudle 投票應用程式,可限制存取對象(成員、特定群組或使用者、隱藏與公開)。", + "Error loading poll list" : "載入投票列表時發生錯誤", + "Confirmed" : "已確認", + "No Participants until now" : "目前為止都沒人參加", + "Copy list of email addresses to clipboard" : "將電子郵件地址列表複製到剪貼簿", + "Link copied to clipboard" : "已複製連結至剪貼簿", + "Error while copying link to clipboard" : "複製連結至剪貼簿時發生錯誤 ", + "_%n Participant_::_%n Participants_" : ["%n 個參與者"], + "This is a public poll." : "這是公開投票。", + "The following link is your personal access to this poll. You can reenter this poll at any time, change your vote and leave comments." : "以下連結是您對此投票的個人存取。您可以隨時重新進入此投票,變更您的投票並留言。", + "Your personal link to this poll: {linkURL}" : "您對此投票的個人連結:{linkURL}", + "Copy this link to the clipboard" : "將此連結複製到剪貼簿", + "Resend invitation mail to {emailAdress}" : "重新傳送邀請郵件到 {emailAdress}", + "Invitation resent to {emailAddress}" : "邀請已重新傳送到 {emailAddress}", + "Mail could not be resent to {emailAddress}" : "郵件無法重新傳送到 {emailAddress}", + "started this poll on {dateString}." : "在 {dateString} 上開始了此投票。", + "This poll is closed since {dateString}. The confirmed options are marked below." : "此投票自 {dateString} 起關閉。確認的選項已在下方標記。", + "This poll is closed since {dateString}, but there are no confirmed options until now." : "此投票自 {dateString} 起關閉,但至今無確認選項。", + "You can confirm your favorites now in the options tab in the sidebar." : "您現在可以在側邊欄中的選項分頁裡確認您的最愛。", + "You can place your vote until {dateString}." : "您到 {dateString} 前都可以投票。", + "This is an anonymous poll. Except to the poll owner, participants names are hidden." : "這是匿名投票。除了投票擁有者以外,參與者的名字都是隱藏的。", + "Results are hidden." : "結果是隱藏的。", + "They will be revealed after the poll is closed." : "它們將在投票關閉後揭露。", + "The used time zone is {timeZone}." : "使用的時區為 {timeZone}。", + "Your are only allowed to vote for one option." : "您只能投票給一個選項。", + "You reached the maximum number of allowed votes." : "您已達到最大可投票數。", + "You have only one vote left." : "您只剩下一票。", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "這是排他性投票,只允許一個使用者投票選擇一個選項。", + "_You have %n vote left._::_You have %n votes left._" : ["您還剩下 %n 票。"], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["每個選項僅允許 %n 票。"], + "Public poll" : "公開投票", + "Do you want to login?" : "您想要登入嗎?", + "Login" : "登入", + "Participate in public poll!" : "參與公開投票!", + "To participate, tell us how we can call you!" : "要參與,請告訴我們如何稱呼您!", + "Enter your name" : "輸入您的名稱", + "Optional email address" : "可選的電子郵件地址", "Cancel" : "取消", "OK" : "確定", + "Checking username …" : "正在檢查使用者名稱……", + "Please use at least 3 characters." : "請使用至少 3 個字元。", + "This name is not valid." : "此名稱無效。", + "OK, we will call you {username}." : "好的,我們會稱呼您為 {username}。", + "Checking email address …" : "正在檢查電子郵件地址……", + "This email address is not valid." : "此電子郵件地址無效。", + "This email address is valid." : "此電子郵件地址有效。", + "Error saving username" : "儲存使用者名稱時發生錯誤", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "使用您的電子郵件地址,您可以訂閱通知,然後您就會收到此投票的個人連結。", + "Enter a name to start the search" : "輸入一個名稱以開始搜尋", + "Error while adding share" : "新增分享時發生錯誤", + "Conflict" : "衝突", + "Got a network error while checking calendar events." : "檢查日曆活動時發生網路錯誤。", + "New comment …" : "新增留言……", + "Error while saving comment" : "儲存留言時發生錯誤", + "Delete comment" : "刪除留言", + "Comment deleted" : "留言已刪除", + "Error while deleting the comment" : "刪除留言時發生錯誤", "Title" : "標題", + "Enter Title" : "輸入標題", + "Poll type" : "投票類型", "Apply" : "套用", + "Date poll" : "日期投票", + "Text poll" : "文字投票", + "Poll \"{pollTitle}\" added" : "投票「{pollTitle}」已新增", + "Error while creating Poll \"{pollTitle}\"" : "建立投票「{pollTitle}」時發生錯誤", + "Add new Poll" : "新增投票", + "Administration" : "管理", "Settings" : "設定", - "Week" : "星期", - "Owner" : "Owner", - "never" : "永不", + "Relevant" : "相關", + "My polls" : "我的投票", + "Public polls" : "公開投票", + "All polls" : "所有投票", + "Closed polls" : "已關閉的投票", + "Deleted polls" : "已刪除的投票", + "Error cloning poll." : "再製投票時發生錯誤。", + "Error deleting poll." : "刪除投票時發生錯誤。", + "Clone poll" : "再製投票", + "Delete poll" : "刪除投票", + "Restore poll" : "復原投票", + "Delete poll permanently" : "永久刪除投票", + "Clone to option sequence" : "再製到選項序列", + "Create a sequence of date options starting with {dateOption}." : "建立一個以 {dateOption} 開始的日期選項序列。", + "Step unit: " : "步驟單位:", + "Step width: " : "步驟寬度:", + "Number of items to create: " : "要建立的項目數:", + "Week" : "週", + "Available Options" : "可用選項", + "Delete option" : "刪除選項", + "Clone option" : "再製選項", + "Unconfirm option" : "取消確認選項", + "Confirm option" : "確認選項", + "No vote options" : "無投票選項", + "Add some!" : "新增一些!", + "Add a date option" : "新增一個日期選項", + "Click to add a date" : "按一下新增日期", + "Shift all date options" : "轉移所有日期選項", + "Decrease unit" : "減少單位", + "Increase unit" : "增加單位", + "Shift" : "轉移", + "Add a new text option" : "新增一個新的文字選項", + "Enter option text" : "輸入選項文字", + "Access" : "存取", + "Owner" : "擁有者", + "Created" : "已建立", + "Closing Date" : "關閉日期", + "No description provided" : "未提供描述", + "Deleted" : "已刪除", + "All users" : "所有使用者", + "Only invited users" : "僅邀請的使用者", + "never" : "從未", + "Beta - watch for updated polls in realtime" : "測試版 - 監視即時更新的投票", + "All changes to the current poll, done by other users, will be recognized in realtime." : "其他使用者對目前投票的所有變更將會被即時識別。", + "Try experimental styles" : "試用實驗樣式", + "Some experimental UI variants. Changes the background color of the main area." : "一些實驗性的 UI 變體。變更主要區域的背景色彩。", + "Use background image" : "使用背景圖片", + "Add a background image to the main area." : "將背景圖片新增到主要區域。", + "Enter the URL of your favorite background image." : "輸入您最愛背景圖片的 URL。", + "Glassy navigation" : "透明導覽列", + "Blurs the background of the navigation (Does not work with all browsers)." : "模糊導覽列的背景(並非所有瀏覽器都能正常運作)。", + "Glassy sidebar" : "透明側邊欄", + "Blurs the background of the sidebar (Does not work with all browsers)." : "模糊側邊欄的背景(並非所有瀏覽器都能正常運作)。", + "Use calendar lookup" : "使用日曆查詢", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "檢查日期投票中的選項是否與您日曆中的活動衝突或鄰近。", + "Opt in to the calendars, which should be checked." : "選擇加入日曆,然後進行檢查。", + "Text polls default to list view" : "文字投票預設為列表檢視", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "如果您偏好以垂直對齊的列表而非網格檢視來顯示文字投票,請勾選這個。初始預設值為列表檢視。", + "Date polls default to list view" : "日期投票預設為列表檢視", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "如果您偏好以垂直檢視而非網格檢視來顯示日期投票,請勾選這個。初始預設值為網格檢視。", + "User Settings" : "使用者設定", + "Experimental Styles" : "實驗樣式", + "Public link ({token})" : "公開連結 ({token})", + "Effective shares" : "有效分享", + "Resend invitation mail" : "重新傳送邀請郵件", + "Send invitation mail" : "傳送邀請郵件", + "Copy link to clipboard" : "複製連結到剪貼簿", + "Remove share" : "移除分享", + "Invitation sent to {name}" : "邀請已傳送到 {name}", + "Error sending invitation to {name}" : "向 {name} 傳送邀請時發生錯誤", + "Public shares" : "公開分享", + "Add a public link" : "新增一個公開連結", + "Unsent invitations" : "取消傳送邀請", + "Resolve into individual invitations" : "解決個人邀請", + "Remove invitation" : "移除邀請", + "Resolving of {name} is not possible. The circles app is not enabled." : "無法解析 {name}。Circles 應用程式未啟用。", + "Resolving of {name} is not possible. The contacts app is not enabled." : "無法解析 {name}。通訊錄應用程式未啟用。", + "Error resolving {name}." : "解析 {name} 時發生錯誤。", + "Details" : "詳細資料", + "Configuration" : "設定", + "Options" : "選項", "Shares" : "分享", + "Comments" : "留言", + "No comments" : "無留言", + "Be the first." : "成為第一個。", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "變更選項時請小心,因為其可能以您不想要的方式影響既有的投票。", + "As an admin you may edit this poll" : "作為管理員,您可以編輯此投票", "Description" : "描述", - "No" : "No", - "Yes" : "Yes", + "Poll configurations" : "投票設定", + "Anonymous poll" : "匿名投票", + "Limit yes votes per user" : "限制每個使用者的「贊成」票", + "Limit yes votes per option" : "限制每個選項的「贊成」票", + "Poll closing status" : "投票關閉狀態", + "Reopen poll" : "重新開啟投票", + "Close poll" : "關閉投票", + "Closing date" : "關閉日期", + "Allow admins to edit this poll" : "允許管理員編輯這個投票", + "Relevant for all users" : "與所有使用者相關", + "Result display" : "結果顯示", + "Always show results" : "總是顯示結果", + "Hide results until poll is closed" : "直到投票關閉前都隱藏結果", + "Never show results" : "永不顯示結果", + "\"{pollTitle}\" successfully saved" : "「{pollTitle}」成功儲存", + "Title must not be empty!" : "標題不能為空!", + "Error writing poll" : "寫入投票時發生錯誤", + "Add Shares" : "新增分享", + "Receive notification email on activity to {emailAddress}" : "將活動通知電郵發送到 {emailAddress}", + "Receive notification email on activity" : "接收活動通知電子郵件", + "Delete votes" : "刪除投票", + "Do you want to remove {username} from poll?" : "您是否要從投票中移除 {username}?", + "No" : "否", + "Yes" : "是", + "User {userId} removed" : "使用者 {userId} 已移除", + "Manage polls" : "管理投票", + "Manage polls of other users. You can take over the ownership or delete polls." : "管理其他使用者的投票。您可以接管所有權或刪除投票。", + "No polls found for this category" : "找不到此分類的投票", + "Add one or change category!" : "新增一個或變更分類!", + "Take over" : "接管", + "Set \"deleted\" status" : "設定「已刪除」狀態", + "Do you want to take over this poll from {username} and change the ownership?" : "您想要從 {username} 處接管此投票並變更所有權嗎?", + "The original owner will be notified." : "將會通知原始所有者。", + "Do you want to delete this poll?" : "您想要刪除此投票嗎?", + "This action cannot be reverted." : "此動作無法還原。", + "Error switching deleted status." : "切換已刪除狀態時發生錯誤。", + "Error overtaking poll." : "接管投票時發生錯誤。", + "404 - poll not found" : "404 - 找不到投票", + "Enter a poll or start a new one." : "輸入投票或開始新的投票。", + "Goto Nextcloud" : "前往 Nextcloud", + "Relevant polls" : "相關投票", + "Hidden polls" : "隱藏投票", + "My deleted polls" : "我的已刪除投票", + "Participated by me" : "我參加了", + "Your polls (where you are the owner)." : "您的投票(您是所有者)。", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "與您相關或重要的所有投票,因為您是參與者、擁有者或被邀請。不含已關閉的投票。", + "A complete list with all public polls on this site, regardless who is the owner." : "此網站上的所有投票的完整列表,無論誰是所有者。", + "All hidden polls, to which you have access." : "您可以存取的所有隱藏投票。", + "The trash bin." : "回收桶。", + "All polls, where you placed a vote." : "您已投票的所有投票。", + "All closed polls, where voting is disabled." : "所有已關閉的投票,停用投票。", + "All polls, where you have access to." : "您可以存取的所有投票。", + "Error loading poll" : "載入投票時發生錯誤", + "Toggle Sidebar" : "切換側邊欄", + "Closed {relativeTimeAgo}" : "{relativeTimeAgo} 已關閉", + "Closing {relativeExpirationTime}" : "{relativeExpirationTime} 關閉", + "No vote options available" : "無投票選項", + "Maybe the owner did not provide some until now." : "也許擁有者到現在都沒有提供。", + "Switch to mobile view" : "切換到行動版檢視", + "Switch to desktop view" : "切換到桌面版檢視", + "Date order" : "日期順序", + "Original order" : "原始順序", + "Ranked order" : "排名順序", + "Minute" : "分鐘", + "Hour" : "小時", "Day" : "日", - "Month" : "月" + "Month" : "月", + "Year" : "年" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js index ed9052f42..26ca698d8 100644 --- a/l10n/zh_TW.js +++ b/l10n/zh_TW.js @@ -2,77 +2,263 @@ OC.L10N.register( "polls", { "Contact" : "聯絡人", - "Public link" : "公共連結", + "Contact group" : "聯絡人群組", + "External Email" : "外部電子郵件", + "Public link" : "公開連結", + "External user" : "外部使用者", "Group" : "群組", "User" : "使用者", "Polls" : "調查", - "- %s voted." : "- %s 已投。", - "Polls App - New Activity" : "投票應用-新活動", - "\"{title}\" had recent activity: " : "\"{title}\" 有最近的活動:", + "%s invited you to a poll" : "%s 邀請您參加投票", + "{user} has invited you to the poll \"%s\"." : "{user} 邀請您參加投票「%s」。", + "%s took over your poll" : "%s 接管了您的投票", + "{user} took over your poll \"%s\" and is the new owner." : "{user} 接管了您的投票「%s」並成為了新的擁有者。", + "%s permanently deleted your poll" : "%s 永久刪除了您的投票", + "{user} permanently deleted your poll \"%s\"." : "{user} 永久刪除了您的投票「%s」。", + "%s changed the deleted status of your poll" : "%s 變更了您投票的刪除狀態", + "{user} changed the deleted status of your poll \"%s\"." : "{user} 變更了您投票「%s」的刪除狀態。", + "- %s voted." : "- %s 已投票。", + "- Updated poll configuration. Please check your votes." : "- 更新了投票設定。請檢查您的投票。", + "- The poll got deleted." : "- 投票已刪除。", + "- The poll got restored." : "- 投票已復原。", + "- The poll was closed." : "- 投票已關閉。", + "- A vote option was added." : "- 已新增投票選項。", + "- A vote option was removed." : "- 已移除投票選項。", + "- The poll owner changed." : "- 投票擁有者已變更。", + "- %s created the poll." : "- %s 已建立投票。", + "Polls App - New Activity" : "投票應用程式 - 新活動", + "\"{title}\" had recent activity: " : "「{title}」有最近的活動:", + "A user" : "使用者", "Go to poll" : "去投票", - "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請訪問投票並刪除您的訂閱。", - "Poll invitation \"%s\"" : "投票邀請 \"%s\"", - "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您去參加 \"{title}\" 的投票", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請造訪投票並移除您的訂閱。", + "Poll invitation \"%s\"" : "投票邀請「%s」", + "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您參加「{title}」的投票", + "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "此連結給您個人存取上面提到的投票。按上方的按鈕或複製以下的連結,然後將其貼到您瀏覽器的網址列。", + "Do not share this link with other people, because it is connected to your votes." : "不要與其他人分享此連結,因為其與您的投票息息相關。", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "此電子郵件已傳送給您,因為投票擁有者邀請您在此投票。此投票至少會記錄您的名字與您的電子郵件地址。如果您想要從此投票中移除,請聯絡站台管理員或此投票的發起者(即傳送郵件給您的人)。", + "A polls app, similar to doodle/dudle with the possibility to restrict access." : "類似於 doodle/dudle 投票應用程式,可限制存取對象。", + "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "類似於 doodle/dudle 投票應用程式,可限制存取對象(成員、特定群組或使用者、隱藏與公開)。", + "Error loading poll list" : "載入投票列表時發生錯誤", "Confirmed" : "已確認", "No Participants until now" : "目前為止都沒人參加", + "Copy list of email addresses to clipboard" : "將電子郵件地址列表複製到剪貼簿", "Link copied to clipboard" : "已複製連結至剪貼簿", "Error while copying link to clipboard" : "複製連結至剪貼簿時發生錯誤 ", + "_%n Participant_::_%n Participants_" : ["%n 個參與者"], + "This is a public poll." : "這是公開投票。", + "The following link is your personal access to this poll. You can reenter this poll at any time, change your vote and leave comments." : "以下連結是您對此投票的個人存取。您可以隨時重新進入此投票,變更您的投票並留言。", + "Your personal link to this poll: {linkURL}" : "您對此投票的個人連結:{linkURL}", + "Copy this link to the clipboard" : "將此連結複製到剪貼簿", + "Resend invitation mail to {emailAdress}" : "重新傳送邀請郵件到 {emailAdress}", + "Invitation resent to {emailAddress}" : "邀請已重新傳送到 {emailAddress}", + "Mail could not be resent to {emailAddress}" : "郵件無法重新傳送到 {emailAddress}", + "started this poll on {dateString}." : "在 {dateString} 上開始了此投票。", + "This poll is closed since {dateString}. The confirmed options are marked below." : "此投票自 {dateString} 起關閉。確認的選項已在下方標記。", + "This poll is closed since {dateString}, but there are no confirmed options until now." : "此投票自 {dateString} 起關閉,但至今無確認選項。", + "You can confirm your favorites now in the options tab in the sidebar." : "您現在可以在側邊欄中的選項分頁裡確認您的最愛。", + "You can place your vote until {dateString}." : "您到 {dateString} 前都可以投票。", + "This is an anonymous poll. Except to the poll owner, participants names are hidden." : "這是匿名投票。除了投票擁有者以外,參與者的名字都是隱藏的。", + "Results are hidden." : "結果是隱藏的。", + "They will be revealed after the poll is closed." : "它們將在投票關閉後揭露。", + "The used time zone is {timeZone}." : "使用的時區為 {timeZone}。", + "Your are only allowed to vote for one option." : "您只能投票給一個選項。", + "You reached the maximum number of allowed votes." : "您已達到最大可投票數。", + "You have only one vote left." : "您只剩下一票。", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "這是排他性投票,只允許一個使用者投票選擇一個選項。", + "_You have %n vote left._::_You have %n votes left._" : ["您還剩下 %n 票。"], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["每個選項僅允許 %n 票。"], + "Public poll" : "公開投票", + "Do you want to login?" : "您想要登入嗎?", + "Login" : "登入", + "Participate in public poll!" : "參與公開投票!", + "To participate, tell us how we can call you!" : "要參與,請告訴我們如何稱呼您!", "Enter your name" : "輸入您的名稱", + "Optional email address" : "可選的電子郵件地址", "Cancel" : "取消", "OK" : "確定", - "Error saving username" : "保存使用者名稱時出錯", + "Checking username …" : "正在檢查使用者名稱……", + "Please use at least 3 characters." : "請使用至少 3 個字元。", + "This name is not valid." : "此名稱無效。", + "OK, we will call you {username}." : "好的,我們會稱呼您為 {username}。", + "Checking email address …" : "正在檢查電子郵件地址……", + " " : " ", + "This email address is not valid." : "此電子郵件地址無效。", + "This email address is valid." : "此電子郵件地址有效。", + "Error saving username" : "儲存使用者名稱時發生錯誤", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "使用您的電子郵件地址,您可以訂閱通知,然後您就會收到此投票的個人連結。", "Enter a name to start the search" : "輸入一個名稱以開始搜尋", + "Error while adding share" : "新增分享時發生錯誤", "Conflict" : "衝突", - "New comment …" : "新增留言", - "Error while saving comment" : "保存評論時出錯", + "Got a network error while checking calendar events." : "檢查日曆活動時發生網路錯誤。", + "New comment …" : "新增留言……", + "Error while saving comment" : "儲存留言時發生錯誤", "Delete comment" : "刪除留言", - "Comment deleted" : "意見刪除", - "Error while deleting the comment" : "刪除評論時出錯", + "Comment deleted" : "留言已刪除", + "Error while deleting the comment" : "刪除留言時發生錯誤", "Title" : "標題", "Enter Title" : "輸入標題", "Poll type" : "投票類型", - "Date poll" : "日期投票", "Apply" : "套用", - "Add new Poll" : "增加新的投票", + "Date poll" : "日期投票", + "Text poll" : "文字投票", + "Poll \"{pollTitle}\" added" : "投票「{pollTitle}」已新增", + "Error while creating Poll \"{pollTitle}\"" : "建立投票「{pollTitle}」時發生錯誤", + "Add new Poll" : "新增投票", + "Administration" : "管理", "Settings" : "設定", + "Relevant" : "相關", "My polls" : "我的投票", "Public polls" : "公開投票", "All polls" : "所有投票", - "Deleted polls" : "已經刪除的投票", - "Clone poll" : "複製投票", + "Closed polls" : "已關閉的投票", + "Deleted polls" : "已刪除的投票", + "Error cloning poll." : "再製投票時發生錯誤。", + "Error deleting poll." : "刪除投票時發生錯誤。", + "Clone poll" : "再製投票", "Delete poll" : "刪除投票", + "Restore poll" : "復原投票", + "Delete poll permanently" : "永久刪除投票", + "Clone to option sequence" : "再製到選項序列", + "Create a sequence of date options starting with {dateOption}." : "建立一個以 {dateOption} 開始的日期選項序列。", + "Step unit: " : "步驟單位:", + "Step width: " : "步驟寬度:", + "Number of items to create: " : "要建立的項目數:", "Week" : "週", "Available Options" : "可用選項", "Delete option" : "刪除選項", - "Add a date option" : "增加一個日期選項", + "Clone option" : "再製選項", + "Unconfirm option" : "取消確認選項", + "Confirm option" : "確認選項", + "No vote options" : "無投票選項", + "Add some!" : "新增一些!", + "Add a date option" : "新增一個日期選項", "Click to add a date" : "按一下新增日期", + "Shift all date options" : "轉移所有日期選項", + "Decrease unit" : "減少單位", + "Increase unit" : "增加單位", "Shift" : "轉移", - "Add a new text option" : "增加一個新的文字選項", + "Add a new text option" : "新增一個新的文字選項", "Enter option text" : "輸入選項文字", "Access" : "存取", "Owner" : "擁有者", - "Created" : "已新增", + "Created" : "已建立", + "Closing Date" : "關閉日期", "No description provided" : "未提供描述", "Deleted" : "已刪除", + "All users" : "所有使用者", + "Only invited users" : "僅邀請的使用者", "never" : "從未", - "Add a public link" : "增加一個公開連結", + "Beta - watch for updated polls in realtime" : "測試版 - 監視即時更新的投票", + "All changes to the current poll, done by other users, will be recognized in realtime." : "其他使用者對目前投票的所有變更將會被即時識別。", + "Try experimental styles" : "試用實驗樣式", + "Some experimental UI variants. Changes the background color of the main area." : "一些實驗性的 UI 變體。變更主要區域的背景色彩。", + "Use background image" : "使用背景圖片", + "Add a background image to the main area." : "將背景圖片新增到主要區域。", + "Enter the URL of your favorite background image." : "輸入您最愛背景圖片的 URL。", + "Glassy navigation" : "透明導覽列", + "Blurs the background of the navigation (Does not work with all browsers)." : "模糊導覽列的背景(並非所有瀏覽器都能正常運作)。", + "Glassy sidebar" : "透明側邊欄", + "Blurs the background of the sidebar (Does not work with all browsers)." : "模糊側邊欄的背景(並非所有瀏覽器都能正常運作)。", + "Use calendar lookup" : "使用日曆查詢", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "檢查日期投票中的選項是否與您日曆中的活動衝突或鄰近。", + "Opt in to the calendars, which should be checked." : "選擇加入日曆,然後進行檢查。", + "Text polls default to list view" : "文字投票預設為列表檢視", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "如果您偏好以垂直對齊的列表而非網格檢視來顯示文字投票,請勾選這個。初始預設值為列表檢視。", + "Date polls default to list view" : "日期投票預設為列表檢視", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "如果您偏好以垂直檢視而非網格檢視來顯示日期投票,請勾選這個。初始預設值為網格檢視。", + "User Settings" : "使用者設定", + "Experimental Styles" : "實驗樣式", + "Public link ({token})" : "公開連結 ({token})", + "Effective shares" : "有效分享", + "Resend invitation mail" : "重新傳送邀請郵件", + "Send invitation mail" : "傳送邀請郵件", + "Copy link to clipboard" : "複製連結到剪貼簿", + "Remove share" : "移除分享", + "Invitation sent to {name}" : "邀請已傳送到 {name}", + "Error sending invitation to {name}" : "向 {name} 傳送邀請時發生錯誤", + "Public shares" : "公開分享", + "Add a public link" : "新增一個公開連結", + "Unsent invitations" : "取消傳送邀請", + "Resolve into individual invitations" : "解決個人邀請", + "Remove invitation" : "移除邀請", + "Resolving of {name} is not possible. The circles app is not enabled." : "無法解析 {name}。Circles 應用程式未啟用。", + "Resolving of {name} is not possible. The contacts app is not enabled." : "無法解析 {name}。通訊錄應用程式未啟用。", + "Error resolving {name}." : "解析 {name} 時發生錯誤。", "Details" : "詳細資料", "Configuration" : "設定", - "Options" : "設定", + "Options" : "選項", "Shares" : "分享", - "Comments" : "意見", - "Description" : "調查內容描述", + "Comments" : "留言", + "No comments" : "無留言", + "Be the first." : "成為第一個。", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "變更選項時請小心,因為其可能以您不想要的方式影響既有的投票。", + "As an admin you may edit this poll" : "作為管理員,您可以編輯此投票", + "Description" : "描述", "Poll configurations" : "投票設定", "Anonymous poll" : "匿名投票", + "Limit yes votes per user" : "限制每個使用者的「贊成」票", + "Limit yes votes per option" : "限制每個選項的「贊成」票", + "Poll closing status" : "投票關閉狀態", + "Reopen poll" : "重新開啟投票", + "Close poll" : "關閉投票", + "Closing date" : "關閉日期", "Allow admins to edit this poll" : "允許管理員編輯這個投票", - "Title must not be empty!" : "一定得下標題!", - "Receive notification email on activity" : "接收E-mail活動通知", + "Relevant for all users" : "與所有使用者相關", + "Result display" : "結果顯示", + "Always show results" : "總是顯示結果", + "Hide results until poll is closed" : "直到投票關閉前都隱藏結果", + "Never show results" : "永不顯示結果", + "\"{pollTitle}\" successfully saved" : "「{pollTitle}」成功儲存", + "Title must not be empty!" : "標題不能為空!", + "Error writing poll" : "寫入投票時發生錯誤", + "Add Shares" : "新增分享", + "Receive notification email on activity to {emailAddress}" : "接收有關活動的通知電子郵件到 {emailAddress}", + "Receive notification email on activity" : "接收電子郵件活動通知", + "Delete votes" : "刪除投票", + "Do you want to remove {username} from poll?" : "您是否要從投票中移除 {username}?", "No" : "否", "Yes" : "是", - "Goto Nextcloud" : "前往Nextcloud", + "User {userId} removed" : "使用者 {userId} 已移除", + "Manage polls" : "管理投票", + "Manage polls of other users. You can take over the ownership or delete polls." : "管理其他使用者的投票。您可以接管所有權或刪除投票。", + "No polls found for this category" : "找不到此分類的投票", + "Add one or change category!" : "新增一個或變更分類!", + "Take over" : "接管", + "Set \"deleted\" status" : "設定「已刪除」狀態", + "Do you want to take over this poll from {username} and change the ownership?" : "您想要從 {username} 處接管此投票並變更所有權嗎?", + "The original owner will be notified." : "將會通知原始所有者。", + "Do you want to delete this poll?" : "您想要刪除此投票嗎?", + "This action cannot be reverted." : "此動作無法還原。", + "Error switching deleted status." : "切換已刪除狀態時發生錯誤。", + "Error overtaking poll." : "接管投票時發生錯誤。", + "404 - poll not found" : "404 - 找不到投票", + "Enter a poll or start a new one." : "輸入投票或開始新的投票。", + "Goto Nextcloud" : "前往 Nextcloud", + "Relevant polls" : "相關投票", "Hidden polls" : "隱藏投票", + "My deleted polls" : "我的已刪除投票", + "Participated by me" : "我參加了", + "Your polls (where you are the owner)." : "您的投票(您是所有者)。", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "與您相關或重要的所有投票,因為您是參與者、擁有者或被邀請。不含已關閉的投票。", + "A complete list with all public polls on this site, regardless who is the owner." : "此網站上的所有投票的完整列表,無論誰是所有者。", + "All hidden polls, to which you have access." : "您可以存取的所有隱藏投票。", + "The trash bin." : "回收桶。", + "All polls, where you placed a vote." : "您已投票的所有投票。", + "All closed polls, where voting is disabled." : "所有已關閉的投票,停用投票。", + "All polls, where you have access to." : "您可以存取的所有投票。", + "Error loading poll" : "載入投票時發生錯誤", + "Toggle Sidebar" : "切換側邊欄", + "Closed {relativeTimeAgo}" : "{relativeTimeAgo} 已關閉", + "Closing {relativeExpirationTime}" : "{relativeExpirationTime} 關閉", + "No vote options available" : "無投票選項", + "Maybe the owner did not provide some until now." : "也許擁有者到現在都沒有提供。", + "Switch to mobile view" : "切換到行動版檢視", + "Switch to desktop view" : "切換到桌面版檢視", + "Date order" : "日期順序", + "Original order" : "原始順序", + "Ranked order" : "排名順序", "Minute" : "分鐘", - "Hour" : "整點時間", + "Hour" : "小時", "Day" : "日", "Month" : "月", "Year" : "年" diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json index 7c6d5b81a..658f4b5f7 100644 --- a/l10n/zh_TW.json +++ b/l10n/zh_TW.json @@ -1,76 +1,262 @@ { "translations": { "Contact" : "聯絡人", - "Public link" : "公共連結", + "Contact group" : "聯絡人群組", + "External Email" : "外部電子郵件", + "Public link" : "公開連結", + "External user" : "外部使用者", "Group" : "群組", "User" : "使用者", "Polls" : "調查", - "- %s voted." : "- %s 已投。", - "Polls App - New Activity" : "投票應用-新活動", - "\"{title}\" had recent activity: " : "\"{title}\" 有最近的活動:", + "%s invited you to a poll" : "%s 邀請您參加投票", + "{user} has invited you to the poll \"%s\"." : "{user} 邀請您參加投票「%s」。", + "%s took over your poll" : "%s 接管了您的投票", + "{user} took over your poll \"%s\" and is the new owner." : "{user} 接管了您的投票「%s」並成為了新的擁有者。", + "%s permanently deleted your poll" : "%s 永久刪除了您的投票", + "{user} permanently deleted your poll \"%s\"." : "{user} 永久刪除了您的投票「%s」。", + "%s changed the deleted status of your poll" : "%s 變更了您投票的刪除狀態", + "{user} changed the deleted status of your poll \"%s\"." : "{user} 變更了您投票「%s」的刪除狀態。", + "- %s voted." : "- %s 已投票。", + "- Updated poll configuration. Please check your votes." : "- 更新了投票設定。請檢查您的投票。", + "- The poll got deleted." : "- 投票已刪除。", + "- The poll got restored." : "- 投票已復原。", + "- The poll was closed." : "- 投票已關閉。", + "- A vote option was added." : "- 已新增投票選項。", + "- A vote option was removed." : "- 已移除投票選項。", + "- The poll owner changed." : "- 投票擁有者已變更。", + "- %s created the poll." : "- %s 已建立投票。", + "Polls App - New Activity" : "投票應用程式 - 新活動", + "\"{title}\" had recent activity: " : "「{title}」有最近的活動:", + "A user" : "使用者", "Go to poll" : "去投票", - "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請訪問投票並刪除您的訂閱。", - "Poll invitation \"%s\"" : "投票邀請 \"%s\"", - "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您去參加 \"{title}\" 的投票", + "This email is sent to you, because you subscribed to notifications of this poll. To opt out, visit the poll and remove your subscription." : "該電子郵件已發送給您,因為您已訂閱此投票的通知。 要選擇退出,請造訪投票並移除您的訂閱。", + "Poll invitation \"%s\"" : "投票邀請「%s」", + "{owner} invited you to take part in the poll \"{title}\"" : "{owner} 邀請您參加「{title}」的投票", + "This link gives you personal access to the poll named above. Press the button above or copy the following link and add it in your browser's location bar: " : "此連結給您個人存取上面提到的投票。按上方的按鈕或複製以下的連結,然後將其貼到您瀏覽器的網址列。", + "Do not share this link with other people, because it is connected to your votes." : "不要與其他人分享此連結,因為其與您的投票息息相關。", + "This email is sent to you, because you are invited to vote in this poll by the poll owner. At least your name or your email address is recorded in this poll. If you want to get removed from this poll, contact the site administrator or the initiator of this poll, where the mail is sent from." : "此電子郵件已傳送給您,因為投票擁有者邀請您在此投票。此投票至少會記錄您的名字與您的電子郵件地址。如果您想要從此投票中移除,請聯絡站台管理員或此投票的發起者(即傳送郵件給您的人)。", + "A polls app, similar to doodle/dudle with the possibility to restrict access." : "類似於 doodle/dudle 投票應用程式,可限制存取對象。", + "A polls app, similar to doodle/dudle with the possibility to restrict access (members, certain groups/users, hidden and public)." : "類似於 doodle/dudle 投票應用程式,可限制存取對象(成員、特定群組或使用者、隱藏與公開)。", + "Error loading poll list" : "載入投票列表時發生錯誤", "Confirmed" : "已確認", "No Participants until now" : "目前為止都沒人參加", + "Copy list of email addresses to clipboard" : "將電子郵件地址列表複製到剪貼簿", "Link copied to clipboard" : "已複製連結至剪貼簿", "Error while copying link to clipboard" : "複製連結至剪貼簿時發生錯誤 ", + "_%n Participant_::_%n Participants_" : ["%n 個參與者"], + "This is a public poll." : "這是公開投票。", + "The following link is your personal access to this poll. You can reenter this poll at any time, change your vote and leave comments." : "以下連結是您對此投票的個人存取。您可以隨時重新進入此投票,變更您的投票並留言。", + "Your personal link to this poll: {linkURL}" : "您對此投票的個人連結:{linkURL}", + "Copy this link to the clipboard" : "將此連結複製到剪貼簿", + "Resend invitation mail to {emailAdress}" : "重新傳送邀請郵件到 {emailAdress}", + "Invitation resent to {emailAddress}" : "邀請已重新傳送到 {emailAddress}", + "Mail could not be resent to {emailAddress}" : "郵件無法重新傳送到 {emailAddress}", + "started this poll on {dateString}." : "在 {dateString} 上開始了此投票。", + "This poll is closed since {dateString}. The confirmed options are marked below." : "此投票自 {dateString} 起關閉。確認的選項已在下方標記。", + "This poll is closed since {dateString}, but there are no confirmed options until now." : "此投票自 {dateString} 起關閉,但至今無確認選項。", + "You can confirm your favorites now in the options tab in the sidebar." : "您現在可以在側邊欄中的選項分頁裡確認您的最愛。", + "You can place your vote until {dateString}." : "您到 {dateString} 前都可以投票。", + "This is an anonymous poll. Except to the poll owner, participants names are hidden." : "這是匿名投票。除了投票擁有者以外,參與者的名字都是隱藏的。", + "Results are hidden." : "結果是隱藏的。", + "They will be revealed after the poll is closed." : "它們將在投票關閉後揭露。", + "The used time zone is {timeZone}." : "使用的時區為 {timeZone}。", + "Your are only allowed to vote for one option." : "您只能投票給一個選項。", + "You reached the maximum number of allowed votes." : "您已達到最大可投票數。", + "You have only one vote left." : "您只剩下一票。", + "This is an exclusive vote, where only one user is allowed to vote for an option." : "這是排他性投票,只允許一個使用者投票選擇一個選項。", + "_You have %n vote left._::_You have %n votes left._" : ["您還剩下 %n 票。"], + "_Only %n vote per option is permitted._::_Only %n votes per option are permitted._" : ["每個選項僅允許 %n 票。"], + "Public poll" : "公開投票", + "Do you want to login?" : "您想要登入嗎?", + "Login" : "登入", + "Participate in public poll!" : "參與公開投票!", + "To participate, tell us how we can call you!" : "要參與,請告訴我們如何稱呼您!", "Enter your name" : "輸入您的名稱", + "Optional email address" : "可選的電子郵件地址", "Cancel" : "取消", "OK" : "確定", - "Error saving username" : "保存使用者名稱時出錯", + "Checking username …" : "正在檢查使用者名稱……", + "Please use at least 3 characters." : "請使用至少 3 個字元。", + "This name is not valid." : "此名稱無效。", + "OK, we will call you {username}." : "好的,我們會稱呼您為 {username}。", + "Checking email address …" : "正在檢查電子郵件地址……", + " " : " ", + "This email address is not valid." : "此電子郵件地址無效。", + "This email address is valid." : "此電子郵件地址有效。", + "Error saving username" : "儲存使用者名稱時發生錯誤", + "With your email address you can subscribe to notifications and you will receive your personal link to this poll." : "使用您的電子郵件地址,您可以訂閱通知,然後您就會收到此投票的個人連結。", "Enter a name to start the search" : "輸入一個名稱以開始搜尋", + "Error while adding share" : "新增分享時發生錯誤", "Conflict" : "衝突", - "New comment …" : "新增留言", - "Error while saving comment" : "保存評論時出錯", + "Got a network error while checking calendar events." : "檢查日曆活動時發生網路錯誤。", + "New comment …" : "新增留言……", + "Error while saving comment" : "儲存留言時發生錯誤", "Delete comment" : "刪除留言", - "Comment deleted" : "意見刪除", - "Error while deleting the comment" : "刪除評論時出錯", + "Comment deleted" : "留言已刪除", + "Error while deleting the comment" : "刪除留言時發生錯誤", "Title" : "標題", "Enter Title" : "輸入標題", "Poll type" : "投票類型", - "Date poll" : "日期投票", "Apply" : "套用", - "Add new Poll" : "增加新的投票", + "Date poll" : "日期投票", + "Text poll" : "文字投票", + "Poll \"{pollTitle}\" added" : "投票「{pollTitle}」已新增", + "Error while creating Poll \"{pollTitle}\"" : "建立投票「{pollTitle}」時發生錯誤", + "Add new Poll" : "新增投票", + "Administration" : "管理", "Settings" : "設定", + "Relevant" : "相關", "My polls" : "我的投票", "Public polls" : "公開投票", "All polls" : "所有投票", - "Deleted polls" : "已經刪除的投票", - "Clone poll" : "複製投票", + "Closed polls" : "已關閉的投票", + "Deleted polls" : "已刪除的投票", + "Error cloning poll." : "再製投票時發生錯誤。", + "Error deleting poll." : "刪除投票時發生錯誤。", + "Clone poll" : "再製投票", "Delete poll" : "刪除投票", + "Restore poll" : "復原投票", + "Delete poll permanently" : "永久刪除投票", + "Clone to option sequence" : "再製到選項序列", + "Create a sequence of date options starting with {dateOption}." : "建立一個以 {dateOption} 開始的日期選項序列。", + "Step unit: " : "步驟單位:", + "Step width: " : "步驟寬度:", + "Number of items to create: " : "要建立的項目數:", "Week" : "週", "Available Options" : "可用選項", "Delete option" : "刪除選項", - "Add a date option" : "增加一個日期選項", + "Clone option" : "再製選項", + "Unconfirm option" : "取消確認選項", + "Confirm option" : "確認選項", + "No vote options" : "無投票選項", + "Add some!" : "新增一些!", + "Add a date option" : "新增一個日期選項", "Click to add a date" : "按一下新增日期", + "Shift all date options" : "轉移所有日期選項", + "Decrease unit" : "減少單位", + "Increase unit" : "增加單位", "Shift" : "轉移", - "Add a new text option" : "增加一個新的文字選項", + "Add a new text option" : "新增一個新的文字選項", "Enter option text" : "輸入選項文字", "Access" : "存取", "Owner" : "擁有者", - "Created" : "已新增", + "Created" : "已建立", + "Closing Date" : "關閉日期", "No description provided" : "未提供描述", "Deleted" : "已刪除", + "All users" : "所有使用者", + "Only invited users" : "僅邀請的使用者", "never" : "從未", - "Add a public link" : "增加一個公開連結", + "Beta - watch for updated polls in realtime" : "測試版 - 監視即時更新的投票", + "All changes to the current poll, done by other users, will be recognized in realtime." : "其他使用者對目前投票的所有變更將會被即時識別。", + "Try experimental styles" : "試用實驗樣式", + "Some experimental UI variants. Changes the background color of the main area." : "一些實驗性的 UI 變體。變更主要區域的背景色彩。", + "Use background image" : "使用背景圖片", + "Add a background image to the main area." : "將背景圖片新增到主要區域。", + "Enter the URL of your favorite background image." : "輸入您最愛背景圖片的 URL。", + "Glassy navigation" : "透明導覽列", + "Blurs the background of the navigation (Does not work with all browsers)." : "模糊導覽列的背景(並非所有瀏覽器都能正常運作)。", + "Glassy sidebar" : "透明側邊欄", + "Blurs the background of the sidebar (Does not work with all browsers)." : "模糊側邊欄的背景(並非所有瀏覽器都能正常運作)。", + "Use calendar lookup" : "使用日曆查詢", + "Check, if an option in a date poll is conflicting with or near an entry in your calendar." : "檢查日期投票中的選項是否與您日曆中的活動衝突或鄰近。", + "Opt in to the calendars, which should be checked." : "選擇加入日曆,然後進行檢查。", + "Text polls default to list view" : "文字投票預設為列表檢視", + "Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view." : "如果您偏好以垂直對齊的列表而非網格檢視來顯示文字投票,請勾選這個。初始預設值為列表檢視。", + "Date polls default to list view" : "日期投票預設為列表檢視", + "Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view." : "如果您偏好以垂直檢視而非網格檢視來顯示日期投票,請勾選這個。初始預設值為網格檢視。", + "User Settings" : "使用者設定", + "Experimental Styles" : "實驗樣式", + "Public link ({token})" : "公開連結 ({token})", + "Effective shares" : "有效分享", + "Resend invitation mail" : "重新傳送邀請郵件", + "Send invitation mail" : "傳送邀請郵件", + "Copy link to clipboard" : "複製連結到剪貼簿", + "Remove share" : "移除分享", + "Invitation sent to {name}" : "邀請已傳送到 {name}", + "Error sending invitation to {name}" : "向 {name} 傳送邀請時發生錯誤", + "Public shares" : "公開分享", + "Add a public link" : "新增一個公開連結", + "Unsent invitations" : "取消傳送邀請", + "Resolve into individual invitations" : "解決個人邀請", + "Remove invitation" : "移除邀請", + "Resolving of {name} is not possible. The circles app is not enabled." : "無法解析 {name}。Circles 應用程式未啟用。", + "Resolving of {name} is not possible. The contacts app is not enabled." : "無法解析 {name}。通訊錄應用程式未啟用。", + "Error resolving {name}." : "解析 {name} 時發生錯誤。", "Details" : "詳細資料", "Configuration" : "設定", - "Options" : "設定", + "Options" : "選項", "Shares" : "分享", - "Comments" : "意見", - "Description" : "調查內容描述", + "Comments" : "留言", + "No comments" : "無留言", + "Be the first." : "成為第一個。", + "Please be careful when changing options, because it can affect existing votes in an unwanted manner." : "變更選項時請小心,因為其可能以您不想要的方式影響既有的投票。", + "As an admin you may edit this poll" : "作為管理員,您可以編輯此投票", + "Description" : "描述", "Poll configurations" : "投票設定", "Anonymous poll" : "匿名投票", + "Limit yes votes per user" : "限制每個使用者的「贊成」票", + "Limit yes votes per option" : "限制每個選項的「贊成」票", + "Poll closing status" : "投票關閉狀態", + "Reopen poll" : "重新開啟投票", + "Close poll" : "關閉投票", + "Closing date" : "關閉日期", "Allow admins to edit this poll" : "允許管理員編輯這個投票", - "Title must not be empty!" : "一定得下標題!", - "Receive notification email on activity" : "接收E-mail活動通知", + "Relevant for all users" : "與所有使用者相關", + "Result display" : "結果顯示", + "Always show results" : "總是顯示結果", + "Hide results until poll is closed" : "直到投票關閉前都隱藏結果", + "Never show results" : "永不顯示結果", + "\"{pollTitle}\" successfully saved" : "「{pollTitle}」成功儲存", + "Title must not be empty!" : "標題不能為空!", + "Error writing poll" : "寫入投票時發生錯誤", + "Add Shares" : "新增分享", + "Receive notification email on activity to {emailAddress}" : "接收有關活動的通知電子郵件到 {emailAddress}", + "Receive notification email on activity" : "接收電子郵件活動通知", + "Delete votes" : "刪除投票", + "Do you want to remove {username} from poll?" : "您是否要從投票中移除 {username}?", "No" : "否", "Yes" : "是", - "Goto Nextcloud" : "前往Nextcloud", + "User {userId} removed" : "使用者 {userId} 已移除", + "Manage polls" : "管理投票", + "Manage polls of other users. You can take over the ownership or delete polls." : "管理其他使用者的投票。您可以接管所有權或刪除投票。", + "No polls found for this category" : "找不到此分類的投票", + "Add one or change category!" : "新增一個或變更分類!", + "Take over" : "接管", + "Set \"deleted\" status" : "設定「已刪除」狀態", + "Do you want to take over this poll from {username} and change the ownership?" : "您想要從 {username} 處接管此投票並變更所有權嗎?", + "The original owner will be notified." : "將會通知原始所有者。", + "Do you want to delete this poll?" : "您想要刪除此投票嗎?", + "This action cannot be reverted." : "此動作無法還原。", + "Error switching deleted status." : "切換已刪除狀態時發生錯誤。", + "Error overtaking poll." : "接管投票時發生錯誤。", + "404 - poll not found" : "404 - 找不到投票", + "Enter a poll or start a new one." : "輸入投票或開始新的投票。", + "Goto Nextcloud" : "前往 Nextcloud", + "Relevant polls" : "相關投票", "Hidden polls" : "隱藏投票", + "My deleted polls" : "我的已刪除投票", + "Participated by me" : "我參加了", + "Your polls (where you are the owner)." : "您的投票(您是所有者)。", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without closed polls." : "與您相關或重要的所有投票,因為您是參與者、擁有者或被邀請。不含已關閉的投票。", + "A complete list with all public polls on this site, regardless who is the owner." : "此網站上的所有投票的完整列表,無論誰是所有者。", + "All hidden polls, to which you have access." : "您可以存取的所有隱藏投票。", + "The trash bin." : "回收桶。", + "All polls, where you placed a vote." : "您已投票的所有投票。", + "All closed polls, where voting is disabled." : "所有已關閉的投票,停用投票。", + "All polls, where you have access to." : "您可以存取的所有投票。", + "Error loading poll" : "載入投票時發生錯誤", + "Toggle Sidebar" : "切換側邊欄", + "Closed {relativeTimeAgo}" : "{relativeTimeAgo} 已關閉", + "Closing {relativeExpirationTime}" : "{relativeExpirationTime} 關閉", + "No vote options available" : "無投票選項", + "Maybe the owner did not provide some until now." : "也許擁有者到現在都沒有提供。", + "Switch to mobile view" : "切換到行動版檢視", + "Switch to desktop view" : "切換到桌面版檢視", + "Date order" : "日期順序", + "Original order" : "原始順序", + "Ranked order" : "排名順序", "Minute" : "分鐘", - "Hour" : "整點時間", + "Hour" : "小時", "Day" : "日", "Month" : "月", "Year" : "年" diff --git a/lib/Controller/OptionController.php b/lib/Controller/OptionController.php index a5129be51..345fc2364 100644 --- a/lib/Controller/OptionController.php +++ b/lib/Controller/OptionController.php @@ -66,9 +66,9 @@ public function list($pollId): DataResponse { * Add a new option * @NoAdminRequired */ - public function add($pollId, $timestamp = 0, $pollOptionText = ''): DataResponse { - return $this->responseCreate(function () use ($pollId, $timestamp, $pollOptionText) { - return ['option' => $this->optionService->add($pollId, $timestamp, $pollOptionText)]; + public function add($pollId, $timestamp = 0, $pollOptionText = '', $duration = 0): DataResponse { + return $this->responseCreate(function () use ($pollId, $timestamp, $pollOptionText, $duration) { + return ['option' => $this->optionService->add($pollId, $timestamp, $pollOptionText, $duration)]; }); } @@ -76,9 +76,9 @@ public function add($pollId, $timestamp = 0, $pollOptionText = ''): DataResponse * Update option * @NoAdminRequired */ - public function update($optionId, $timestamp, $pollOptionText): DataResponse { - return $this->response(function () use ($optionId, $timestamp, $pollOptionText) { - return ['option' => $this->optionService->update($optionId, $timestamp, $pollOptionText)]; + public function update($optionId, $timestamp, $pollOptionText, $duration): DataResponse { + return $this->response(function () use ($optionId, $timestamp, $pollOptionText, $duration) { + return ['option' => $this->optionService->update($optionId, $timestamp, $pollOptionText, $duration)]; }); } @@ -128,10 +128,13 @@ public function sequence($optionId, $step, $unit, $amount): DataResponse { */ public function findCalendarEvents($optionId): DataResponse { return $this->response(function () use ($optionId) { + $option = $this->optionService->get($optionId); $searchFrom = new DateTime(); - $searchFrom = $searchFrom->setTimestamp($this->optionService->get($optionId)->getTimestamp())->sub(new DateInterval('PT1H')); - $searchTo = clone $searchFrom; - $searchTo = $searchTo->add(new DateInterval('PT3H')); + $searchTo = new DateTime(); + // Search calendar entries which end inside one hour before option start time + $searchFrom = $searchFrom->setTimestamp($option->getTimestamp())->sub(new DateInterval('PT1H')); + // Search calendar entries which start inside one hour after option end time + $searchTo = $searchTo->setTimestamp($option->getTimestamp() + $option->getDuration())->add(new DateInterval('PT1H')); $events = $this->calendarService->getEvents($searchFrom, $searchTo); return ['events' => $events]; }); diff --git a/lib/Controller/PublicController.php b/lib/Controller/PublicController.php index cb98100a7..27d7b6579 100644 --- a/lib/Controller/PublicController.php +++ b/lib/Controller/PublicController.php @@ -31,8 +31,7 @@ use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\Template\PublicTemplateResponse; - - +use OCA\Polls\Exceptions\NoUpdatesException; use OCA\Polls\Db\Share; use OCA\Polls\Db\Poll; use OCA\Polls\Model\Acl; @@ -44,6 +43,7 @@ use OCA\Polls\Service\SubscriptionService; use OCA\Polls\Service\VoteService; use OCA\Polls\Service\SystemService; +use OCA\Polls\Service\WatchService; class PublicController extends Controller { @@ -71,17 +71,20 @@ class PublicController extends Controller { /** @var ShareService */ private $shareService; + /** @var Share */ + private $share; + /** @var SubscriptionService */ private $subscriptionService; - /** @var Share */ - private $share; + /** @var SystemService */ + private $systemService; /** @var VoteService */ private $voteService; - /** @var SystemService */ - private $systemService; + /** @var WatchService */ + private $watchService; use ResponseHandle; @@ -98,8 +101,9 @@ public function __construct( ShareService $shareService, Share $share, SubscriptionService $subscriptionService, + SystemService $systemService, VoteService $voteService, - SystemService $systemService + WatchService $watchService ) { parent::__construct($appName, $request); $this->urlGenerator = $urlGenerator; @@ -112,8 +116,9 @@ public function __construct( $this->shareService = $shareService; $this->share = $share; $this->subscriptionService = $subscriptionService; - $this->voteService = $voteService; $this->systemService = $systemService; + $this->voteService = $voteService; + $this->watchService = $watchService; } /** @@ -149,6 +154,30 @@ public function getPoll(string $token): DataResponse { }); } + /** + * Watch poll for updates + * @PublicPage + * @NoAdminRequired + */ + public function watchPoll(string $token, ?int $offset): DataResponse { + $pollId = $this->acl->setToken($token)->getPollId(); + + return $this->responseLong(function () use ($pollId, $offset) { + $start = time(); + $timeout = 30; + $offset = $offset ?? $start; + + while (empty($updates) && time() <= $start + $timeout) { + sleep(1); + $updates = $this->watchService->getUpdates($pollId, $offset); + } + if (empty($updates)) { + throw new NoUpdatesException; + } + return ['updates' => $updates]; + }); + } + /** * Get share * @PublicPage diff --git a/lib/Controller/ResponseHandle.php b/lib/Controller/ResponseHandle.php index 39b4e91de..350ff267b 100644 --- a/lib/Controller/ResponseHandle.php +++ b/lib/Controller/ResponseHandle.php @@ -28,6 +28,7 @@ use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NoUpdatesException; use OCA\Polls\Exceptions\Exception; trait ResponseHandle { @@ -44,6 +45,18 @@ protected function response(Closure $callback): DataResponse { } } + /** + * response + * @NoAdminRequired + */ + protected function responseLong(Closure $callback): DataResponse { + try { + return new DataResponse($callback(), Http::STATUS_OK); + } catch (NoUpdatesException $e) { + return new DataResponse([], Http::STATUS_NOT_MODIFIED); + } + } + /** * responseCreate * @NoAdminRequired diff --git a/lib/Controller/WatchController.php b/lib/Controller/WatchController.php new file mode 100644 index 000000000..94c8a8cc7 --- /dev/null +++ b/lib/Controller/WatchController.php @@ -0,0 +1,68 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use OCP\IRequest; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\DataResponse; +use OCA\Polls\Exceptions\NoUpdatesException; +use OCA\Polls\Service\WatchService; + +class WatchController extends Controller { + + /** @var WatchService */ + private $watchService; + + use ResponseHandle; + + public function __construct( + string $appName, + IRequest $request, + WatchService $watchService + ) { + parent::__construct($appName, $request); + $this->watchService = $watchService; + } + + /** + * Watch poll for updates + * @NoAdminRequired + * @NoCSRFRequired + */ + public function watchPoll(int $pollId, ?int $offset): DataResponse { + return $this->responseLong(function () use ($pollId, $offset) { + $start = time(); + $timeout = 30; + $offset = $offset ?? $start; + while (empty($updates) && time() <= $start + $timeout) { + sleep(1); + $updates = $this->watchService->getUpdates($pollId, $offset); + } + if (empty($updates)) { + throw new NoUpdatesException; + } + return ['updates' => $updates]; + }); + } +} diff --git a/lib/Db/Comment.php b/lib/Db/Comment.php index 98f9d3802..435b75e47 100644 --- a/lib/Db/Comment.php +++ b/lib/Db/Comment.php @@ -42,7 +42,7 @@ * @method string getComment() * @method void setComment(string $value) * @method string getTimestamp() - * @method void getTimestamp(integer $value) + * @method void setTimestamp(integer $value) */ class Comment extends Entity implements JsonSerializable { @@ -62,35 +62,29 @@ class Comment extends Entity implements JsonSerializable { protected $comment; public function jsonSerialize() { - - // too lazy for a migration - // use timestamp if set, - // otherwise use dt and convert to timestamp - - if (intval($this->timestamp) > 0) { - $timestamp = $this->timestamp; - } else { - $timestamp = strtotime($this->dt); - } - return [ 'id' => intval($this->id), 'pollId' => intval($this->pollId), 'userId' => $this->userId, 'dt' => $this->dt, - 'timestamp' => intval($timestamp), + 'timestamp' => $this->getTimestamp(), 'comment' => $this->comment, 'isNoUser' => $this->getIsNoUser(), 'displayName' => $this->getDisplayName() ]; } - private function getDisplayName(): string { - if (\OC::$server->getUserManager()->get($this->userId) instanceof IUser) { - return \OC::$server->getUserManager()->get($this->userId)->getDisplayName(); - } else { - return $this->userId; - } + public function getTimestamp(): int { + // too lazy for a migration + // use timestamp if set, + // otherwise use dt and convert to timestamp + return intval($this->timestamp ? $this->timestamp : strtotime($this->dt)); + } + + public function getDisplayName(): string { + return \OC::$server->getUserManager()->get($this->userId) instanceof IUser + ? \OC::$server->getUserManager()->get($this->userId)->getDisplayName() + : $this->userId; } public function getIsNoUser(): bool { diff --git a/lib/Db/Option.php b/lib/Db/Option.php index 0d1d18e9f..b22bd792a 100644 --- a/lib/Db/Option.php +++ b/lib/Db/Option.php @@ -42,6 +42,8 @@ * @method void setOrder(integer $value) * @method int getConfirmed() * @method void setConfirmed(integer $value) + * @method int getDuration() + * @method void setDuration(integer $value) */ class Option extends Entity implements JsonSerializable { @@ -60,6 +62,9 @@ class Option extends Entity implements JsonSerializable { /** @var int $confirmed */ protected $confirmed; + /** @var int $duration */ + protected $duration; + public function jsonSerialize() { if (intval($this->timestamp) > 0) { $timestamp = $this->timestamp; @@ -74,8 +79,9 @@ public function jsonSerialize() { 'pollId' => intval($this->pollId), 'pollOptionText' => htmlspecialchars_decode($this->pollOptionText), 'timestamp' => intval($timestamp), - 'order' => $this->orderCorrection(intval($this->timestamp), intval($this->order)), + 'order' => intval($timestamp ? $timestamp : $this->order), 'confirmed' => intval($this->confirmed), + 'duration' => intval($this->duration), 'no' => 0, 'yes' => 0, 'maybe' => 0, @@ -84,16 +90,4 @@ public function jsonSerialize() { 'votes' => 0, ]; } - - /** - * Temporary fix - * Make sure, order is eqal to timestamp in date polls - */ - private function orderCorrection(int $timestamp, int $order): int { - if ($timestamp) { - return $timestamp; - } else { - return $order; - } - } } diff --git a/lib/Db/Poll.php b/lib/Db/Poll.php index 385adb465..03cb149ab 100644 --- a/lib/Db/Poll.php +++ b/lib/Db/Poll.php @@ -52,6 +52,8 @@ * @method void setAnonymous(integer $value) * @method int getFullAnonymous() * @method void setFullAnonymous(integer $value) + * @method int getallowComment() + * @method void setallowComment(integer $value) * @method int getAllowMaybe() * @method void setAllowMaybe(integer $value) * @method string getOptions() @@ -132,6 +134,9 @@ class Poll extends Entity implements JsonSerializable { /** @var int $important*/ protected $important; + /** @var int $important*/ + protected $allowComment; + public function jsonSerialize() { return [ 'id' => intval($this->id), @@ -144,6 +149,7 @@ public function jsonSerialize() { 'deleted' => intval($this->deleted), 'access' => $this->access, 'anonymous' => intval($this->anonymous), + 'allowComment' => intval($this->allowComment), 'allowMaybe' => intval($this->allowMaybe), 'settings' => $this->settings, 'voteLimit' => intval($this->voteLimit), @@ -159,18 +165,19 @@ public function jsonSerialize() { * @return static */ public function deserializeArray(array $array): self { - $this->setTitle(isset($array['title']) ? $array['title'] : $this->getTitle()); - $this->setDescription(isset($array['description']) ? $array['description'] : $this->getDescription()); - $this->setAccess(isset($array['access']) ? $array['access'] : $this->getAccess()); - $this->setExpire(isset($array['expire']) ? $array['expire'] : $this->getExpire()); - $this->setAnonymous(isset($array['anonymous']) ? +$array['anonymous'] : $this->getAnonymous()); - $this->setAllowMaybe(isset($array['allowMaybe']) ? +$array['allowMaybe'] : $this->getAllowMaybe()); - $this->setVoteLimit(isset($array['voteLimit']) ? $array['voteLimit'] : $this->getVoteLimit()); - $this->setOptionLimit(isset($array['optionLimit']) ? $array['optionLimit'] : $this->getOptionLimit()); - $this->setShowResults(isset($array['showResults']) ? $array['showResults'] : $this->getShowResults()); - $this->setDeleted(isset($array['deleted']) ? $array['deleted'] : $this->getDeleted()); - $this->setAdminAccess(isset($array['adminAccess']) ? +$array['adminAccess'] : $this->getAdminAccess()); - $this->setImportant(isset($array['important']) ? +$array['important'] : $this->getImportant()); + $this->setTitle($array['title'] ?? $this->getTitle()); + $this->setDescription($array['description'] ?? $this->getDescription()); + $this->setAccess($array['access'] ?? $this->getAccess()); + $this->setExpire($array['expire'] ?? $this->getExpire()); + $this->setAnonymous($array['anonymous'] ?? $this->getAnonymous()); + $this->setallowComment($array['allowComment'] ?? $this->getallowComment()); + $this->setAllowMaybe($array['allowMaybe'] ?? $this->getAllowMaybe()); + $this->setVoteLimit($array['voteLimit'] ?? $this->getVoteLimit()); + $this->setOptionLimit($array['optionLimit'] ?? $this->getOptionLimit()); + $this->setShowResults($array['showResults'] ?? $this->getShowResults()); + $this->setDeleted($array['deleted'] ?? $this->getDeleted()); + $this->setAdminAccess($array['adminAccess'] ?? $this->getAdminAccess()); + $this->setImportant($array['important'] ?? $this->getImportant()); return $this; } @@ -182,11 +189,9 @@ public function getExpired(): bool { } private function getDisplayName(): string { - if (\OC::$server->getUserManager()->get($this->owner) instanceof IUser) { - return \OC::$server->getUserManager()->get($this->owner)->getDisplayName(); - } else { - return $this->owner; - } + return \OC::$server->getUserManager()->get($this->owner) instanceof IUser + ? \OC::$server->getUserManager()->get($this->owner)->getDisplayName() + : $this->owner; } public function getOwnerUserObject(): User { diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index fa311cb08..f7ee88533 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -163,7 +163,7 @@ public function removeDuplicates() { $row['user_id'] ]; - if (in_array($currentRecord, $entries2Keep)) { + if (in_array($currentRecord, $entries2Keep) || $row['user_id'] === null || $row['type'] === '') { $delete->setParameter('id', $row['id']); $delete->execute(); } else { diff --git a/lib/Db/Vote.php b/lib/Db/Vote.php index c45f5949e..269f37531 100644 --- a/lib/Db/Vote.php +++ b/lib/Db/Vote.php @@ -72,11 +72,9 @@ public function jsonSerialize() { } public function getDisplayName(): string { - if (\OC::$server->getUserManager()->get($this->userId) instanceof IUser) { - return \OC::$server->getUserManager()->get($this->userId)->getDisplayName(); - } else { - return $this->userId; - } + return $this->getIsNoUser() + ? $this->userId + : \OC::$server->getUserManager()->get($this->userId)->getDisplayName(); } public function getIsNoUser(): bool { diff --git a/lib/Db/Watch.php b/lib/Db/Watch.php new file mode 100644 index 000000000..ea6a518cc --- /dev/null +++ b/lib/Db/Watch.php @@ -0,0 +1,63 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <githung@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Db; + +use JsonSerializable; + +use OCP\AppFramework\Db\Entity; + +/** + * @method int getId() + * @method void setId(integer $value) + * @method int getPollId() + * @method void setPollId(integer $value) + * @method string getTable() + * @method void setTable(string $value) + * @method string getUpdated() + * @method void setUpdated(string $value) + */ +class Watch extends Entity implements JsonSerializable { + public const OBJECT_POLLS = "polls"; + public const OBJECT_VOTES = "votes"; + public const OBJECT_OPTIONS = "options"; + public const OBJECT_COMMENTS = "comments"; + + /** @var int $pollId */ + protected $pollId; + + /** @var string $tableId */ + protected $table; + + /** @var string $updated */ + protected $updated; + + public function jsonSerialize() { + return [ + 'id' => intval($this->id), + 'pollId' => intval($this->pollId), + 'table' => $this->table, + 'updated' => $this->updated, + ]; + } +} diff --git a/lib/Db/WatchMapper.php b/lib/Db/WatchMapper.php new file mode 100644 index 000000000..38bf18b97 --- /dev/null +++ b/lib/Db/WatchMapper.php @@ -0,0 +1,75 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Db; + +use OCP\IDBConnection; +use OCP\AppFramework\Db\QBMapper; + +/** + * @template-extends QBMapper<Watch> + */ +class WatchMapper extends QBMapper { + public function __construct(IDBConnection $db) { + parent::__construct($db, 'polls_watch', '\OCA\Polls\Db\Watch'); + } + + /** + * @throws \OCP\AppFramework\Db\DoesNotExistException if not found + * @return Watch[] + */ + public function findUpdatesForPollId(int $pollId, int $offset): array { + $qb = $this->db->getQueryBuilder(); + + $qb->select('*') + ->from($this->getTableName()) + ->where( + $qb->expr()->eq('poll_id', $qb->createNamedParameter($pollId)) + ) + ->andWhere( + $qb->expr()->gt('updated', $qb->createNamedParameter($offset)) + ); + + return $this->findEntities($qb); + } + + /** + * @throws \OCP\AppFramework\Db\DoesNotExistException if not found + * @return Watch + */ + public function findForPollIdAndTable(int $pollId, string $table): Watch { + $qb = $this->db->getQueryBuilder(); + + $qb->select('*') + ->from($this->getTableName()) + ->where( + $qb->expr()->eq('poll_id', $qb->createNamedParameter($pollId)) + ) + ->andWhere( + $qb->expr()->eq('table', $qb->createNamedParameter($table)) + ); + + return $this->findEntity($qb); + } +} diff --git a/lib/Exceptions/NoUpdatesException.php b/lib/Exceptions/NoUpdatesException.php new file mode 100644 index 000000000..a0f836c6e --- /dev/null +++ b/lib/Exceptions/NoUpdatesException.php @@ -0,0 +1,32 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class NoUpdatesException extends Exception { + public function __construct($e = 'No updates') { + parent::__construct($e, Http::STATUS_NOT_MODIFIED); + } +} diff --git a/lib/Migration/CreateIndices.php b/lib/Migration/CreateIndices.php new file mode 100644 index 000000000..856289626 --- /dev/null +++ b/lib/Migration/CreateIndices.php @@ -0,0 +1,72 @@ +<?php +/** + * @copyright Copyright (c) 2021 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCA\Polls\Migration; + +use OC\DB\Connection; +use OC\DB\SchemaWrapper; +use OCP\Migration\IRepairStep; +use OCP\Migration\IOutput; + +class CreateIndices implements IRepairStep { + + /** @var Connection */ + private $connection; + + public function __construct(Connection $connection) { + $this->connection = $connection; + } + + public function getName() { + return 'Create polls table indices'; + } + + public function run(IOutput $output) { + $this->createIndex('polls_options', 'UNIQ_options', ['poll_id', 'poll_option_text', 'timestamp'], true); + $this->createIndex('polls_log', 'UNIQ_unprocessed', ['processed', 'poll_id', 'user_id', 'message_id'], true); + $this->createIndex('polls_notif', 'UNIQ_subscription', ['poll_id', 'user_id'], true); + $this->createIndex('polls_share', 'UNIQ_shares', ['poll_id', 'user_id'], true); + $this->createIndex('polls_votes', 'UNIQ_votes', ['poll_id', 'user_id', 'vote_option_text'], true); + $this->createIndex('polls_preferences', 'UNIQ_preferences', ['user_id'], true); + $this->createIndex('polls_watch', 'UNIQ_watch', ['poll_id', 'table'], true); + } + + /** + * Create index for $table + */ + private function createIndex(string $tableName, string $indexName, array $columns, bool $unique = false) { + $schema = new SchemaWrapper($this->connection); + if ($schema->hasTable($tableName)) { + $table = $schema->getTable($tableName); + if (!$table->hasIndex($indexName)) { + if ($unique) { + $table->addUniqueIndex($columns, $indexName); + } else { + $table->addIndex($columns, $indexName); + } + $this->connection->migrateToSchema($schema->getWrappedSchema()); + } + } + } +} diff --git a/lib/Migration/RemoveIndices.php b/lib/Migration/RemoveIndices.php new file mode 100644 index 000000000..42a399640 --- /dev/null +++ b/lib/Migration/RemoveIndices.php @@ -0,0 +1,82 @@ +<?php +/** + * @copyright Copyright (c) 2021 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Migration; + +use OC\DB\Connection; +use OC\DB\SchemaWrapper; +use OCP\Migration\IRepairStep; +use OCP\Migration\IOutput; + +class RemoveIndices implements IRepairStep { + /** @var Connection */ + private $connection; + + public function __construct(Connection $connection) { + $this->connection = $connection; + } + + public function getName() { + return 'Remove polls table indices'; + } + + public function run(IOutput $output) { + $this->removeUniqueIndices('polls_options'); + $this->removeUniqueIndices('polls_log'); + $this->removeUniqueIndices('polls_notif'); + $this->removeUniqueIndices('polls_share'); + $this->removeUniqueIndices('polls_votes'); + $this->removeUniqueIndices('polls_preferences'); + $this->removeUniqueIndices('polls_preferences'); + $this->removeUniqueIndices('polls_watch'); + } + + /** + * remove an index with $indexName from $table + */ + private function removeIndex(string $tableName, string $indexName) { + $schema = new SchemaWrapper($this->connection); + if ($schema->hasTable($tableName)) { + $table = $schema->getTable($tableName); + if ($table->hasIndex($indexName)) { + $table->dropIndex($indexName); + $this->connection->migrateToSchema($schema->getWrappedSchema()); + } + } + } + + /** + * remove all UNIQUE indices from $table + */ + private function removeUniqueIndices(string $tableName) { + $schema = new SchemaWrapper($this->connection); + if ($schema->hasTable($tableName)) { + $table = $schema->getTable($tableName); + foreach ($table->getIndexes() as $index) { + if (strpos($index->getName(), 'UNIQ_') === 0) { + $this->removeIndex($tableName, $index->getName()); + } + } + } + } +} diff --git a/lib/Migration/Version0106Date20201031080745.php b/lib/Migration/Version0106Date20201031080745.php index b3449d199..23473e1c5 100644 --- a/lib/Migration/Version0106Date20201031080745.php +++ b/lib/Migration/Version0106Date20201031080745.php @@ -73,11 +73,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op $table->changeColumn('preferences', [ 'notnull' => false ]); - try { - $table->addUniqueIndex(['user_id']); - } catch (\Exception $e) { - //catch silently, index is already present - } } return $schema; diff --git a/lib/Migration/Version0107Date20201210204702.php b/lib/Migration/Version0107Date20201210204702.php index 75967db28..9e62e18d6 100644 --- a/lib/Migration/Version0107Date20201210204702.php +++ b/lib/Migration/Version0107Date20201210204702.php @@ -51,10 +51,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op 'notnull' => true, 'default' => 0 ]); - - if (!$table->hasIndex('UNIQ_options')) { - $table->addUniqueIndex(['poll_id', 'poll_option_text', 'timestamp'], 'UNIQ_options'); - } } return $schema; } diff --git a/lib/Migration/Version0107Date20201210213303.php b/lib/Migration/Version0107Date20201210213303.php index 02d4e6fed..9f755bf4c 100644 --- a/lib/Migration/Version0107Date20201210213303.php +++ b/lib/Migration/Version0107Date20201210213303.php @@ -51,10 +51,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op 'notnull' => true, 'default' => '' ]); - - if (!$table->hasIndex('UNIQ_votes')) { - $table->addUniqueIndex(['poll_id', 'user_id', 'vote_option_text'], 'UNIQ_votes'); - } } return $schema; } diff --git a/lib/Migration/Version0107Date20201217071304.php b/lib/Migration/Version0107Date20201217071304.php index 8f73d00b3..01de801f1 100644 --- a/lib/Migration/Version0107Date20201217071304.php +++ b/lib/Migration/Version0107Date20201217071304.php @@ -47,10 +47,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op 'notnull' => true, 'default' => '' ]); - - if (!$table->hasIndex('UNIQ_shares')) { - $table->addUniqueIndex(['poll_id', 'user_id'], 'UNIQ_shares'); - } } return $schema; } diff --git a/lib/Migration/Version0107Date20210121220707.php b/lib/Migration/Version0107Date20210121220707.php index b92dc0024..d25f500db 100644 --- a/lib/Migration/Version0107Date20210121220707.php +++ b/lib/Migration/Version0107Date20210121220707.php @@ -44,10 +44,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op if ($schema->hasTable('polls_log')) { $table = $schema->getTable('polls_log'); - if ($table->hasIndex('UNIQ_unprocessed')) { - $table->dropIndex('UNIQ_unprocessed'); - } - $table->changeColumn('poll_id', [ 'default' => 0 ]); @@ -63,10 +59,6 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op if ($table->hasColumn('message')) { $table->dropColumn('message'); } - - if (!$table->hasIndex('UNIQ_unprocessed')) { - $table->addUniqueIndex(['processed', 'poll_id', 'user_id', 'message_id'], 'UNIQ_unprocessed'); - } } return $schema; } diff --git a/lib/Migration/Version0108Date20210117010101.php b/lib/Migration/Version0108Date20210117010101.php new file mode 100644 index 000000000..2d91fbac7 --- /dev/null +++ b/lib/Migration/Version0108Date20210117010101.php @@ -0,0 +1,61 @@ +<?php +/** + * @copyright Copyright (c) 2017 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Migration; + +use OCP\DB\ISchemaWrapper; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\Migration\SimpleMigrationStep; +use OCP\Migration\IOutput; + +class Version0108Date20210117010101 extends SimpleMigrationStep { + + /** @var IDBConnection */ + protected $connection; + + /** @var IConfig */ + protected $config; + + public function __construct(IDBConnection $connection, IConfig $config) { + $this->connection = $connection; + $this->config = $config; + } + + public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + if ($schema->hasTable('polls_options')) { + $table = $schema->getTable('polls_options'); + + if (!$table->hasColumn('duration')) { + $table->addColumn('duration', 'integer', [ + 'length' => 11, + 'notnull' => true, + 'default' => 0 + ]); + } + } + return $schema; + } +} diff --git a/lib/Migration/Version0108Date20210127135802.php b/lib/Migration/Version0108Date20210127135802.php new file mode 100644 index 000000000..75c23fbdb --- /dev/null +++ b/lib/Migration/Version0108Date20210127135802.php @@ -0,0 +1,74 @@ +<?php +/** + * @copyright Copyright (c) 2017 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Migration; + +use OCP\DB\ISchemaWrapper; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\Migration\SimpleMigrationStep; +use OCP\Migration\IOutput; + +class Version0108Date20210127135802 extends SimpleMigrationStep { + + /** @var IDBConnection */ + protected $connection; + + /** @var IConfig */ + protected $config; + + public function __construct(IDBConnection $connection, IConfig $config) { + $this->connection = $connection; + $this->config = $config; + } + + public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + if (!$schema->hasTable('polls_watch')) { + $table = $schema->createTable('polls_watch'); + $table->addColumn('id', 'integer', [ + 'autoincrement' => true, + 'notnull' => true, + ]); + $table->addColumn('table', 'string', [ + 'length' => 64, + 'notnull' => true, + 'default' => '' + ]); + $table->addColumn('poll_id', 'integer', [ + 'length' => 11, + 'notnull' => true, + 'default' => 0 + ]); + $table->addColumn('updated', 'integer', [ + 'length' => 11, + 'notnull' => true, + 'default' => 0 + ]); + $table->setPrimaryKey(['id']); + } + + return $schema; + } +} diff --git a/lib/Migration/Version0107Date20210101161105.php b/lib/Migration/Version0108Date20210207134703.php similarity index 75% rename from lib/Migration/Version0107Date20210101161105.php rename to lib/Migration/Version0108Date20210207134703.php index c3b3db897..ea46ea3ff 100644 --- a/lib/Migration/Version0107Date20210101161105.php +++ b/lib/Migration/Version0108Date20210207134703.php @@ -24,29 +24,34 @@ namespace OCA\Polls\Migration; use OCP\DB\ISchemaWrapper; -use OCP\Migration\IOutput; +use OCP\IConfig; use OCP\IDBConnection; use OCP\Migration\SimpleMigrationStep; +use OCP\Migration\IOutput; -class Version0107Date20210101161105 extends SimpleMigrationStep { +class Version0108Date20210207134703 extends SimpleMigrationStep { /** @var IDBConnection */ protected $connection; - public function __construct(IDBConnection $connection) { + /** @var IConfig */ + protected $config; + + public function __construct(IDBConnection $connection, IConfig $config) { $this->connection = $connection; + $this->config = $config; } public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { /** @var ISchemaWrapper $schema */ $schema = $schemaClosure(); - - if ($schema->hasTable('polls_notif')) { - $table = $schema->getTable('polls_notif'); - - if (!$table->hasIndex('UNIQ_subscription')) { - $table->addUniqueIndex(['poll_id', 'user_id'], 'UNIQ_subscription'); - } + if ($schema->hasTable('polls_polls')) { + $table = $schema->getTable('polls_polls'); + $table->addColumn('allow_comment', 'integer', [ + 'length' => 11, + 'notnull' => true, + 'default' => 1 + ]); } return $schema; } diff --git a/lib/Model/Acl.php b/lib/Model/Acl.php index 80c6ff273..061def17d 100644 --- a/lib/Model/Acl.php +++ b/lib/Model/Acl.php @@ -135,11 +135,7 @@ public function getPollId(): int { } public function getUserId() { - if ($this->getLoggedIn()) { - return \OC::$server->getUserSession()->getUser()->getUID(); - } else { - return $this->share->getUserId(); - } + return $this->getLoggedIn() ? \OC::$server->getUserSession()->getUser()->getUID() : $this->share->getUserId(); } public function validateUserId(string $userId): void { @@ -148,12 +144,15 @@ public function validateUserId(string $userId): void { } } + /** + * getIsOwner - Is user owner of the poll? + */ + public function getIsOwner(): bool { + return ($this->getLoggedIn() && $this->poll->getOwner() === $this->getUserId()); + } + private function getDisplayName(): string { - if ($this->getLoggedIn()) { - return $this->userManager->get($this->getUserId())->getDisplayName(); - } else { - return $this->share->getDisplayName(); - } + return $this->getLoggedIn() ? $this->userManager->get($this->getUserId())->getDisplayName() : $this->share->getDisplayName(); } public function isAllowed(string $permission): bool { @@ -182,7 +181,7 @@ public function isAllowed(string $permission): bool { case self::PERMISSION_DELETE: return $this->getIsOwner() || $this->hasAdminAccess() || $this->getIsAdmin(); case self::PERMISSION_COMMENT: - return $this->share->getType() !== Share::TYPE_PUBLIC; + return $this->share->getType() !== Share::TYPE_PUBLIC && $this->poll->getallowComment(); case self::PERMISSION_SUBSCRIBE: return $this->hasEmail(); case self::PERMISSION_VOTE: @@ -239,13 +238,6 @@ private function getLoggedIn(): bool { return \OC::$server->getUserSession()->isLoggedIn(); } - /** - * getIsOwner - Is user owner of the poll? - */ - private function getIsOwner(): bool { - return ($this->getLoggedIn() && $this->poll->getOwner() === $this->getUserId()); - } - /** * getIsAdmin - Is the user admin * Returns true, if user is in admin group @@ -357,10 +349,6 @@ private function getValidAuthenticatedShare(): bool { } private function hasEmail(): bool { - if ($this->share->getToken()) { - return strlen($this->share->getEmailAddress()) > 0; - } else { - return $this->getLoggedIn(); - } + return $this->share->getToken() ? strlen($this->share->getEmailAddress()) > 0 : $this->getLoggedIn(); } } diff --git a/lib/Model/CalendarEvent.php b/lib/Model/CalendarEvent.php index 2e8e5e29f..70fe8fb9b 100644 --- a/lib/Model/CalendarEvent.php +++ b/lib/Model/CalendarEvent.php @@ -46,11 +46,7 @@ public function __construct( } public function getAllDay() { - if ($this->getEnd() - $this->getStart() === 86400) { - return $this->event['DTSTART'][0]->format('Y-m-d'); - } else { - return ''; - } + return ($this->getEnd() - $this->getStart() === 86400) ? $this->event['DTSTART'][0]->format('Y-m-d') : ''; } public function getCalendarName(): ?string { @@ -78,43 +74,40 @@ public function getSummary() { } public function getDescription() { - if (isset($this->event['DESCRIPTION'][0])) { - return $this->event['DESCRIPTION'][0]; - } else { - return ''; - } + return $this->event['DESCRIPTION'][0] ?? ''; } public function getLocation() { - if (isset($this->event['LOCATION'][0])) { - return $this->event['LOCATION'][0]; - } else { - return ''; - } + return $this->event['LOCATION'][0] ?? ''; } public function getStart() { - if (isset($this->event['DTSTART'][0])) { - return $this->event['DTSTART'][0]->getTimestamp(); - } else { - return 0; - } + return isset($this->event['DTSTART'][0]) ? $this->event['DTSTART'][0]->getTimestamp() : 0; } public function getEnd() { - if (isset($this->event['DTEND'][0])) { - return $this->event['DTEND'][0]->getTimestamp(); - } else { - return 0; + return isset($this->event['DTEND'][0])? $this->event['DTEND'][0]->getTimestamp() : 0; + } + + public function getHasRRule() { + return isset($this->event['RRULE']); + } + + public function getRecurrencies() { + return 'not implementend yet'; + } + + public function getRRule() { + $rRule = []; + if ($this->getHasRRule()) { + preg_match_all("/([^;= ]+)=([^;= ]+)/", $this->event['RRULE'][0], $r); + $rRule = array_combine($r[1], $r[2]); } + return $rRule; } public function getStatus() { - if (isset($this->event['STATUS'][0])) { - return $this->event['STATUS'][0]; - } else { - return ''; - } + return $this->event['STATUS'][0] ?? ''; } public function getCalDav(): array { @@ -136,6 +129,9 @@ public function jsonSerialize(): array { 'status' => $this->getStatus(), 'summary' => $this->getSummary(), 'calDav' => $this->getCalDav(), + 'hasRRule' => $this->getHasRRule(), + 'rRule' => $this->getRRule(), + 'recurrencies' => $this->getRecurrencies(), ]; } } diff --git a/lib/Model/Contact.php b/lib/Model/Contact.php index 9a8ddd36c..728f133ff 100644 --- a/lib/Model/Contact.php +++ b/lib/Model/Contact.php @@ -91,29 +91,16 @@ private function getContact(): void { $this->loadContact(); $this->id = $this->contact['UID']; - $this->displayName = isset($this->contact['FN']) ? $this->contact['FN'] : $this->displayName; - $this->emailAddress = isset($this->contact['EMAIL'][0]) ? $this->contact['EMAIL'][0] : $this->emailAddress; - $this->organisation = isset($this->contact['ORG']) ? $this->contact['ORG'] : ''; + $this->displayName = $this->contact['FN'] ?? $this->displayName; + $this->emailAddress = $this->contact['EMAIL'][0] ?? $this->emailAddress; + $this->organisation = $this->contact['ORG'] ?? ''; $this->categories = isset($this->contact['CATEGORIES']) ? explode(',', $this->contact['CATEGORIES']) : []; - - - if (isset($this->contact['CATEGORIES'])) { - $this->categories = explode(',', $this->contact['CATEGORIES']); - } else { - $this->categories = []; - } - $description = $this->categories; if (isset($this->contact['ORG'])) { array_unshift($description, $this->organisation); } - - if (count($description) > 0) { - $this->description = implode(", ", $description); - } else { - $this->description = \OC::$server->getL10N('polls')->t('Contact'); - } + $this->description = count($description) ? implode(", ", $description) : \OC::$server->getL10N('polls')->t('Contact'); } public static function isEnabled(): bool { diff --git a/lib/Model/Email.php b/lib/Model/Email.php index 8c8a15ca0..8fb9c3880 100644 --- a/lib/Model/Email.php +++ b/lib/Model/Email.php @@ -36,15 +36,10 @@ public function __construct( $this->description = \OC::$server->getL10N('polls')->t('External Email'); $this->icon = self::ICON; $this->emailAddress = $id; - if ($displayName) { - $this->displayName = $displayName; - } + $this->displayName = $displayName ? $displayName : $this->displayname; } public function getDisplayName(): string { - if (!$this->displayName) { - return $this->id; - } - return $this->displayName; + return $this->displayName ? $this->displayName : $this->id; } } diff --git a/lib/Model/GenericUser.php b/lib/Model/GenericUser.php index 4ed878009..815149762 100644 --- a/lib/Model/GenericUser.php +++ b/lib/Model/GenericUser.php @@ -43,8 +43,8 @@ public function __construct( $this->icon = self::ICON_PUBLIC; $this->description = \OC::$server->getL10N('polls')->t('Public link'); } else { - $this->description = \OC::$server->getL10N('polls')->t('External user'); $this->icon = self::ICON_DEFAULT; + $this->description = \OC::$server->getL10N('polls')->t('External user'); } } } diff --git a/lib/Model/UserGroupClass.php b/lib/Model/UserGroupClass.php index ddf850f02..3b321c494 100644 --- a/lib/Model/UserGroupClass.php +++ b/lib/Model/UserGroupClass.php @@ -124,7 +124,7 @@ public function getIcon(): string { } public function getEmailAddress(): string { - return $this->emailAddress ? $this->emailAddress : ''; + return $this->emailAddress ?? ''; } public function getOrganisation(): string { @@ -175,12 +175,7 @@ public function setOrganisation($organisation): string { } /** - * serach all possible sharees - use ISearch to respect autocomplete restrictions - * - * Undocumented function long description - * - * @param type var Description - * @return return type + * search all possible sharees - use ISearch to respect autocomplete restrictions */ public static function search(string $query = ''): array { $items = []; diff --git a/lib/Service/AnonymizeService.php b/lib/Service/AnonymizeService.php index e5fc27922..b6540de50 100644 --- a/lib/Service/AnonymizeService.php +++ b/lib/Service/AnonymizeService.php @@ -62,17 +62,11 @@ public function __construct( private function anonymize(array $array): array { // get mapping for the complete poll foreach ($array as &$element) { - // skip current user - if ($element->getUserId() !== $this->userId) { - // Check, if searched user name is in mapping array - if (isset($this->anonList[$element->getUserId()])) { - //replace original user name - $element->setUserId($this->anonList[$element->getUserId()]); - } else { - // User name is not in mapping array, set static text - $element->setUserId('Unknown user'); - } + if ($element->getUserId() === $this->userId) { + // skip current user + continue; } + $element->setUserId($this->anonList[$element->getUserId()] ?? 'Unknown user'); } return $array; diff --git a/lib/Service/CalendarService.php b/lib/Service/CalendarService.php index 1d44048cd..e5bcd5dd0 100644 --- a/lib/Service/CalendarService.php +++ b/lib/Service/CalendarService.php @@ -73,7 +73,7 @@ public function getEvents(DateTime $from, DateTime $to): array { // since we get back recurring events of other days, just make sure this event // matches the search pattern - // TODO: identify possible time zone issues, whan handling all day events + // TODO: identify possible time zone issues, when handling all day events if (($from->getTimestamp() < $calendarEvent->getEnd()) && ($to->getTimestamp() > $calendarEvent->getStart())) { array_push($events, $calendarEvent); diff --git a/lib/Service/CommentService.php b/lib/Service/CommentService.php index 90e71b237..413cf270a 100644 --- a/lib/Service/CommentService.php +++ b/lib/Service/CommentService.php @@ -25,32 +25,38 @@ use OCA\Polls\Db\Comment; use OCA\Polls\Db\CommentMapper; +use OCA\Polls\Db\Watch; use OCA\Polls\Model\Acl; class CommentService { + /** @var Acl */ + private $acl; + + /** @var AnonymizeService */ + private $anonymizer; + /** @var CommentMapper */ private $commentMapper; /** @var Comment */ private $comment; - /** @var AnonymizeService */ - private $anonymizer; - - /** @var Acl */ - private $acl; + /** @var WatchService */ + private $watchService; public function __construct( + Acl $acl, + AnonymizeService $anonymizer, CommentMapper $commentMapper, Comment $comment, - AnonymizeService $anonymizer, - Acl $acl + WatchService $watchService ) { + $this->acl = $acl; + $this->anonymizer = $anonymizer; $this->commentMapper = $commentMapper; $this->comment = $comment; - $this->anonymizer = $anonymizer; - $this->acl = $acl; + $this->watchService = $watchService; } /** @@ -88,6 +94,7 @@ public function add(?int $pollId = 0, ?string $token = '', string $message): Com $this->comment->setDt(date('Y-m-d H:i:s')); $this->comment->setTimestamp(time()); $this->comment = $this->commentMapper->insert($this->comment); + $this->watchService->writeUpdate($this->comment->getPollId(), Watch::OBJECT_COMMENTS); return $this->comment; } @@ -98,12 +105,17 @@ public function delete(int $commentId, string $token = ''): Comment { $this->comment = $this->commentMapper->find($commentId); if ($token) { - $this->acl->setToken($token)->validateUserId($this->comment->getUserId()); + $this->acl->setToken($token); } else { - $this->acl->setPollId($this->comment->getPollId())->validateUserId($this->comment->getUserId()); + $this->acl->setPollId($this->comment->getPollId()); + } + + if (!$this->acl->getIsOwner()) { + $this->acl->validateUserId($this->comment->getUserId()); } $this->commentMapper->delete($this->comment); + $this->watchService->writeUpdate($this->comment->getPollId(), Watch::OBJECT_COMMENTS); return $this->comment; } } diff --git a/lib/Service/LogService.php b/lib/Service/LogService.php index 4bf3ace9e..0e88dfd42 100644 --- a/lib/Service/LogService.php +++ b/lib/Service/LogService.php @@ -54,11 +54,7 @@ public function setLog(int $pollId, string $messageId, ?string $userId = null): $this->log->setPollId($pollId); $this->log->setCreated(time()); $this->log->setMessageId($messageId); - if ($userId) { - $this->log->setUserId($userId); - } else { - $this->log->setUserId(\OC::$server->getUserSession()->getUser()->getUID()); - } + $this->log->setUserId($userId ? $userId : \OC::$server->getUserSession()->getUser()->getUID()); try { return $this->logMapper->insert($this->log); diff --git a/lib/Service/MailService.php b/lib/Service/MailService.php index 16d289585..30a3ebec6 100644 --- a/lib/Service/MailService.php +++ b/lib/Service/MailService.php @@ -251,11 +251,8 @@ private function getLogString(Log $logItem, string $displayName): string { } private function generateNotification(UserGroupClass $recipient, Poll $poll, string $url, array $log): IEMailTemplate { - if ($recipient->getLanguage()) { - $this->trans = $this->transFactory->get('polls', $recipient->getLanguage()); - } else { - $this->trans = $this->transFactory->get('polls', $poll->getOwnerUserObject()->getLanguage()); - } + $owner = $poll->getOwnerUserObject(); + $this->trans = $this->transFactory->get('polls', $recipient->getLanguage() ? $recipient->getLanguage() : $owner->getLanguage()); $emailTemplate = $this->mailer->createEMailTemplate('polls.Notification', [ 'title' => $poll->getTitle(), 'link' => $url @@ -304,11 +301,7 @@ private function generateNotification(UserGroupClass $recipient, Poll $poll, str private function generateInvitation(UserGroupClass $recipient, Poll $poll, string $url): IEMailTemplate { $owner = $poll->getOwnerUserObject(); - if ($recipient->getLanguage()) { - $this->trans = $this->transFactory->get('polls', $recipient->getLanguage()); - } else { - $this->trans = $this->transFactory->get('polls', $owner->getLanguage()); - } + $this->trans = $this->transFactory->get('polls', $recipient->getLanguage() ? $recipient->getLanguage() : $owner->getLanguage()); $emailTemplate = $this->mailer->createEMailTemplate('polls.Invitation', [ 'owner' => $owner->getDisplayName(), diff --git a/lib/Service/OptionService.php b/lib/Service/OptionService.php index 4e09440a7..02e0eb3c8 100644 --- a/lib/Service/OptionService.php +++ b/lib/Service/OptionService.php @@ -34,32 +34,38 @@ use OCA\Polls\Db\Option; use OCA\Polls\Db\PollMapper; use OCA\Polls\Db\Poll; +use OCA\Polls\Db\Watch; use OCA\Polls\Model\Acl; class OptionService { - /** @var OptionMapper */ - private $optionMapper; + /** @var Acl */ + private $acl; /** @var Option */ private $option; + /** @var OptionMapper */ + private $optionMapper; + /** @var PollMapper */ private $pollMapper; - /** @var Acl */ - private $acl; + /** @var WatchService */ + private $watchService; public function __construct( - OptionMapper $optionMapper, + Acl $acl, Option $option, + OptionMapper $optionMapper, PollMapper $pollMapper, - Acl $acl + WatchService $watchService ) { - $this->optionMapper = $optionMapper; + $this->acl = $acl; $this->option = $option; + $this->optionMapper = $optionMapper; $this->pollMapper = $pollMapper; - $this->acl = $acl; + $this->watchService = $watchService; } /** @@ -108,18 +114,20 @@ public function get(int $optionId): Option { * * @return Option */ - public function add(int $pollId, int $timestamp = 0, string $pollOptionText = ''): Option { + public function add(int $pollId, int $timestamp = 0, string $pollOptionText = '', ?int $duration = 0): Option { $this->acl->setPollId($pollId)->request(Acl::PERMISSION_EDIT); $this->option = new Option(); $this->option->setPollId($pollId); $this->option->setOrder($this->getHighestOrder($this->option->getPollId()) + 1); - $this->setOption($timestamp, $pollOptionText); + $this->setOption($timestamp, $pollOptionText, $duration); try { - return $this->optionMapper->insert($this->option); + $this->option = $this->optionMapper->insert($this->option); + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); } catch (UniqueConstraintViolationException $e) { throw new DuplicateEntryException('This option already exists'); } + return $this->option; } /** @@ -127,12 +135,14 @@ public function add(int $pollId, int $timestamp = 0, string $pollOptionText = '' * * @return Option */ - public function update(int $optionId, int $timestamp = 0, ?string $pollOptionText = ''): Option { + public function update(int $optionId, int $timestamp = 0, ?string $pollOptionText = '', ?int $duration = 0): Option { $this->option = $this->optionMapper->find($optionId); $this->acl->setPollId($this->option->getPollId())->request(Acl::PERMISSION_EDIT); - $this->setOption($timestamp, $pollOptionText); + $this->setOption($timestamp, $pollOptionText, $duration); - return $this->optionMapper->update($this->option); + $this->option = $this->optionMapper->update($this->option); + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); + return $this->option; } /** @@ -144,6 +154,7 @@ public function delete(int $optionId): Option { $this->option = $this->optionMapper->find($optionId); $this->acl->setPollId($this->option->getPollId())->request(Acl::PERMISSION_EDIT); $this->optionMapper->delete($this->option); + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); return $this->option; } @@ -157,13 +168,10 @@ public function confirm(int $optionId): Option { $this->option = $this->optionMapper->find($optionId); $this->acl->setPollId($this->option->getPollId())->request(Acl::PERMISSION_EDIT); - if ($this->option->getConfirmed()) { - $this->option->setConfirmed(0); - } else { - $this->option->setConfirmed(time()); - } - - return $this->optionMapper->update($this->option); + $this->option->setConfirmed($this->option->getConfirmed() ? 0 : time()); + $this->option = $this->optionMapper->update($this->option); + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); + return $this->option; } /** @@ -187,6 +195,7 @@ public function sequence(int $optionId, int $step, string $unit, int $amount): a for ($i = 0; $i < $amount; $i++) { $clonedOption = new Option(); $clonedOption->setPollId($this->option->getPollId()); + $clonedOption->setDuration($this->option->getDuration()); $clonedOption->setConfirmed(0); $clonedOption->setTimestamp($baseDate->modify($step . ' ' . $unit)->getTimestamp()); $clonedOption->setOrder($clonedOption->getTimestamp()); @@ -197,6 +206,7 @@ public function sequence(int $optionId, int $step, string $unit, int $amount): a \OC::$server->getLogger()->warning('skip adding ' . $baseDate->format('c') . 'for pollId' . $this->option->getPollId() . '. Option alredy exists.'); } } + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); return $this->optionMapper->findByPoll($this->option->getPollId()); } @@ -216,7 +226,8 @@ public function clone(int $fromPollId, int $toPollId): array { $option->setConfirmed(0); $option->setPollOptionText($origin->getPollOptionText()); $option->setTimestamp($origin->getTimestamp()); - $option->setOrder($origin->getOrder()); + $option->setDuration($origin->getDuration()); + $option->setOrder($option->getOrder()); $this->optionMapper->insert($option); } @@ -251,6 +262,7 @@ public function reorder(int $pollId, array $options): array { } } + $this->watchService->writeUpdate($pollId, Watch::OBJECT_OPTIONS); return $this->optionMapper->findByPoll($pollId); } @@ -287,6 +299,7 @@ public function setOrder(int $optionId, int $newOrder): array { $this->optionMapper->update($option); } + $this->watchService->writeUpdate($this->option->getPollId(), Watch::OBJECT_OPTIONS); return $this->optionMapper->findByPoll($this->option->getPollId()); } @@ -317,13 +330,20 @@ private function moveModifier(int $moveFrom, int $moveTo, int $currentPosition): /** * Set option entities validated */ - private function setOption(int $timestamp = 0, ?string $pollOptionText = ''): void { + private function setOption(int $timestamp = 0, ?string $pollOptionText = '', ?int $duration = 0): void { $poll = $this->pollMapper->find($this->option->getPollId()); if ($poll->getType() === Poll::TYPE_DATE) { $this->option->setTimestamp($timestamp); $this->option->setOrder($timestamp); - $this->option->setPollOptionText(date('c', $timestamp)); + $this->option->setDuration($duration); + if ($duration === 0) { + $this->option->setPollOptionText(date('c', $timestamp)); + } elseif ($duration > 0) { + $this->option->setPollOptionText(date('c', $timestamp) .' - ' . date('c', $timestamp + $duration)); + } else { + $this->option->setPollOptionText($pollOptionText); + } } else { $this->option->setPollOptionText($pollOptionText); } @@ -338,9 +358,7 @@ private function setOption(int $timestamp = 0, ?string $pollOptionText = ''): vo private function getHighestOrder(int $pollId): int { $highestOrder = 0; foreach ($this->optionMapper->findByPoll($pollId) as $option) { - if ($option->getOrder() > $highestOrder) { - $highestOrder = $option->getOrder(); - } + $highestOrder = ($option->getOrder() > $highestOrder) ? $option->getOrder() : $highestOrder; } return $highestOrder; } diff --git a/lib/Service/PollService.php b/lib/Service/PollService.php index 7e867c55a..b92dad06e 100644 --- a/lib/Service/PollService.php +++ b/lib/Service/PollService.php @@ -30,12 +30,12 @@ use OCA\Polls\Exceptions\InvalidPollTypeException; use OCA\Polls\Exceptions\NotAuthorizedException; - use OCA\Polls\Db\Log; use OCA\Polls\Db\PollMapper; use OCA\Polls\Db\Poll; use OCA\Polls\Db\VoteMapper; use OCA\Polls\Db\Vote; +use OCA\Polls\Db\Watch; use OCA\Polls\Model\Acl; class PollService { @@ -52,6 +52,9 @@ class PollService { /** @var VoteMapper */ private $voteMapper; + /** @var WatchService */ + private $watchService; + /** @var Vote */ private $vote; @@ -73,6 +76,7 @@ public function __construct( Poll $poll, VoteMapper $voteMapper, Vote $vote, + WatchService $watchService, LogService $logService, NotificationService $notificationService, MailService $mailService, @@ -82,6 +86,7 @@ public function __construct( $this->userId = $UserId; $this->poll = $poll; $this->voteMapper = $voteMapper; + $this->watchService = $watchService; $this->vote = $vote; $this->logService = $logService; $this->notificationService = $notificationService; @@ -206,6 +211,7 @@ public function add(string $type, string $title) { $this->poll->setImportant(0); $this->poll = $this->pollMapper->insert($this->poll); + $this->watchService->writeUpdate($this->poll->getId(), Watch::OBJECT_POLLS); $this->logService->setLog($this->poll->getId(), Log::MSG_ID_ADDPOLL); return $this->poll; @@ -234,6 +240,7 @@ public function update(int $pollId, array $poll): Poll { $this->poll->deserializeArray($poll); $this->pollMapper->update($this->poll); + $this->watchService->writeUpdate($this->poll->getId(), Watch::OBJECT_POLLS); $this->logService->setLog($this->poll->getId(), Log::MSG_ID_UPDATEPOLL); return $this->poll; @@ -247,16 +254,11 @@ public function update(int $pollId, array $poll): Poll { */ public function switchDeleted(int $pollId): Poll { $this->poll = $this->pollMapper->find($pollId); - \OC::$server->getLogger()->alert('ok'); $this->acl->setPoll($this->poll)->request(Acl::PERMISSION_DELETE); - if ($this->poll->getDeleted()) { - $this->poll->setDeleted(0); - } else { - $this->poll->setDeleted(time()); - } - + $this->poll->setDeleted($this->poll->getDeleted() ? 0 : time()); $this->poll = $this->pollMapper->update($this->poll); + $this->watchService->writeUpdate($this->poll->getId(), Watch::OBJECT_POLLS); $this->logService->setLog($this->poll->getId(), Log::MSG_ID_DELETEPOLL); if ($this->userId !== $this->poll->getOwner()) { @@ -284,6 +286,7 @@ public function delete(int $pollId): Poll { $this->acl->setPoll($this->poll)->request(Acl::PERMISSION_DELETE); $this->pollMapper->delete($this->poll); + $this->watchService->writeUpdate($this->poll->getId(), Watch::OBJECT_POLLS); if ($this->userId !== $this->poll->getOwner()) { // send notification to the original owner @@ -328,7 +331,9 @@ public function clone(int $pollId): Poll { $this->poll->setAdminAccess($origin->getAdminAccess()); $this->poll->setImportant($origin->getImportant()); - return $this->pollMapper->insert($this->poll); + $this->poll = $this->pollMapper->insert($this->poll); + $this->watchService->writeUpdate($this->poll->getId(), Watch::OBJECT_POLLS); + return $this->poll; } /** diff --git a/lib/Service/PreferencesService.php b/lib/Service/PreferencesService.php index a4f61b77f..f9c70bf48 100644 --- a/lib/Service/PreferencesService.php +++ b/lib/Service/PreferencesService.php @@ -52,6 +52,7 @@ public function __construct( if ($UserId) { $this->preferences = new Preferences(); $this->preferences->setUserId($this->userId); + $this->preferences->setPreferences(''); $this->preferences = $this->preferencesMapper->insert($this->preferences); } else { throw new NotAuthorizedException; diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php index b562d4176..a1b4b65c2 100644 --- a/lib/Service/ShareService.php +++ b/lib/Service/ShareService.php @@ -180,7 +180,7 @@ public function setInvitationSent(string $token): Share { * @return Share */ private function create(int $pollId, UserGroupClass $userGroup, bool $preventInvitation = false): Share { - $preventInvitation = $userGroup->getType() === UserGroupClass::TYPE_PUBLIC ? true : $preventInvitation; + $preventInvitation = $userGroup->getType() === UserGroupClass::TYPE_PUBLIC ?: $preventInvitation; $token = \OC::$server->getSecureRandom()->generate( 16, ISecureRandom::CHAR_DIGITS . diff --git a/lib/Service/VoteService.php b/lib/Service/VoteService.php index f867c46fe..415517c1d 100644 --- a/lib/Service/VoteService.php +++ b/lib/Service/VoteService.php @@ -32,12 +32,22 @@ use OCA\Polls\Db\VoteMapper; use OCA\Polls\Db\PollMapper; use OCA\Polls\Db\Vote; +use OCA\Polls\Db\Watch; use OCA\Polls\Model\Acl; class VoteService { - /** @var VoteMapper */ - private $voteMapper; + /** @var Acl */ + private $acl; + + /** @var AnonymizeService */ + private $anonymizer; + + /** @var LogService */ + private $logService; + + /** @var OptionMapper */ + private $optionMapper; /** @var PollMapper */ private $pollMapper; @@ -45,34 +55,31 @@ class VoteService { /** @var Vote */ private $vote; - /** @var OptionMapper */ - private $optionMapper; - - /** @var AnonymizeService */ - private $anonymizer; + /** @var VoteMapper */ + private $voteMapper; - /** @var LogService */ - private $logService; + /** @var WatchService */ + private $watchService; - /** @var Acl */ - private $acl; public function __construct( - VoteMapper $voteMapper, - PollMapper $pollMapper, - Vote $vote, - OptionMapper $optionMapper, + Acl $acl, AnonymizeService $anonymizer, LogService $logService, - Acl $acl + OptionMapper $optionMapper, + PollMapper $pollMapper, + Vote $vote, + VoteMapper $voteMapper, + WatchService $watchService ) { - $this->voteMapper = $voteMapper; - $this->pollMapper = $pollMapper; - $this->vote = $vote; - $this->optionMapper = $optionMapper; + $this->acl = $acl; $this->anonymizer = $anonymizer; $this->logService = $logService; - $this->acl = $acl; + $this->optionMapper = $optionMapper; + $this->pollMapper = $pollMapper; + $this->vote = $vote; + $this->voteMapper = $voteMapper; + $this->watchService = $watchService; } /** @@ -172,7 +179,8 @@ public function set(int $optionId, string $setTo, string $token = ''): Vote { $this->vote->setVoteAnswer($setTo); $this->voteMapper->insert($this->vote); } - $this->logService->setLog($this->acl->getPollId(), Log::MSG_ID_SETVOTE, $this->vote->getUserId()); + $this->logService->setLog($this->vote->getPollId(), Log::MSG_ID_SETVOTE, $this->vote->getUserId()); + $this->watchService->writeUpdate($this->vote->getPollId(), Watch::OBJECT_VOTES); return $this->vote; } @@ -182,6 +190,7 @@ public function set(int $optionId, string $setTo, string $token = ''): Vote { public function delete(int $pollId, string $userId): string { $this->acl->setPollId($pollId)->request(Acl::PERMISSION_EDIT); $this->voteMapper->deleteByPollAndUser($pollId, $userId); + $this->watchService->writeUpdate($pollId, Watch::OBJECT_VOTES); return $userId; } } diff --git a/lib/Service/WatchService.php b/lib/Service/WatchService.php new file mode 100644 index 000000000..362fa637a --- /dev/null +++ b/lib/Service/WatchService.php @@ -0,0 +1,72 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use OCP\AppFramework\Db\DoesNotExistException; + +use OCA\Polls\Db\Watch; +use OCA\Polls\Db\WatchMapper; + +class WatchService { + + /** @var WatchMapper */ + private $watchMapper; + + /** @var Watch */ + private $watch; + + public function __construct( + WatchMapper $watchMapper + ) { + $this->watchMapper = $watchMapper; + } + + /** + * @return Watch[] + */ + public function getUpdates(int $pollId, int $offset): array { + try { + return $this->watchMapper->findUpdatesForPollId($pollId, $offset); + } catch (DoesNotExistException $e) { + return []; + } + } + + /** + * @return Watch + */ + public function writeUpdate(int $pollId, string $table): Watch { + try { + $this->watch = $this->watchMapper->findForPollIdAndTable($pollId, $table); + } catch (DoesNotExistException $e) { + $this->watch = new Watch(); + $this->watch->setPollId($pollId); + $this->watch->setTable($table); + $this->watch = $this->watchMapper->insert($this->watch); + } + + $this->watch->setUpdated(time()); + return $this->watchMapper->update($this->watch); + } +} diff --git a/package-lock.json b/package-lock.json index b5ffa278e..d85cf4990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "polls", - "version": "1.7.2", + "version": "1.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -31,23 +31,23 @@ } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==" + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.13.tgz", + "integrity": "sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==" }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", + "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helpers": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -58,101 +58,160 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", "requires": { - "@babel/types": "^7.12.10" + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "requires": { + "@babel/types": "^7.12.13" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -185,11 +244,11 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -198,9 +257,9 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -210,12 +269,12 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -224,9 +283,9 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -236,48 +295,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz", + "integrity": "sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw==", "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", + "@babel/compat-data": "^7.12.13", + "@babel/helper-validator-option": "^7.12.11", "browserslist": "^4.14.5", "semver": "^5.5.0" - }, - "dependencies": { - "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", - "requires": { - "caniuse-lite": "^1.0.30001165", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", - "escalade": "^3.1.1", - "node-releases": "^1.1.67" - } - }, - "caniuse-lite": { - "version": "1.0.30001168", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001168.tgz", - "integrity": "sha512-P2zmX7swIXKu+GMMR01TWa4csIKELTNnZKc+f1CjebmZJQtTAEXmpQSoKVJVVcvPGAA0TEYTOUp3VehavZSFPQ==" - }, - "electron-to-chromium": { - "version": "1.3.629", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.629.tgz", - "integrity": "sha512-iSPPJtPvHrMAvYOt+9cdbDmTasPqwnwz4lkP8Dn200gDNUBQOLQ96xUsWXBwXslAo5XxdoXAoQQ3RAy4uao9IQ==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" - } } }, "@babel/helper-create-class-features-plugin": { @@ -369,98 +394,20 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz", + "integrity": "sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "requires": { - "@babel/types": "^7.12.10" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" - }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", + "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -469,9 +416,9 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -501,11 +448,11 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", + "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -514,9 +461,9 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -550,12 +497,12 @@ } } }, - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -564,9 +511,9 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -575,20 +522,47 @@ } } }, - "@babel/helper-module-transforms": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", + "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/types": "^7.12.1" }, "dependencies": { "@babel/code-frame": { @@ -627,25 +601,6 @@ "@babel/types": "^7.10.4" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - } - }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -725,43 +680,11 @@ } } }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-remap-async-to-generator": { + "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", "@babel/types": "^7.12.1" }, "dependencies": { @@ -771,9 +694,9 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -782,121 +705,140 @@ } } }, - "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==" + }, + "@babel/helper-wrap-function": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", + "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } @@ -908,128 +850,58 @@ } } }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" - }, - "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" - }, - "@babel/helper-validator-option": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", - "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==" - }, - "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "@babel/helpers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "requires": { - "@babel/types": "^7.12.11", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.12.13" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { @@ -1038,50 +910,50 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -1103,112 +975,189 @@ } } }, - "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", + "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", + "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", + "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", "requires": { - "@babel/types": "^7.12.10" + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1228,42 +1177,6 @@ } } }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, "@babel/plugin-proposal-dynamic-import": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", @@ -1274,95 +1187,317 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", + "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } + } + }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", + "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", + "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", + "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/plugin-transform-parameters": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", + "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz", + "integrity": "sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", + "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", + "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", + "requires": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-syntax-async-generators": { @@ -1374,11 +1509,18 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-syntax-dynamic-import": { @@ -1454,11 +1596,18 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-syntax-typescript": { @@ -1470,86 +1619,178 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", + "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", + "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.11.tgz", - "integrity": "sha512-atR1Rxc3hM+VPg/NvNvfYw0npQEAcHuJ+MGZnFn6h3bo+1U3BWXMdFMlvVRApBTWKQMX7SOwRJZA5FBF/JQbvA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", + "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", "requires": { - "@babel/types": "^7.12.10" + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { @@ -1558,161 +1799,237 @@ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", + "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", + "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", + "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } + } + }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.12.13" } }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -1722,166 +2039,1099 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", + "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", + "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", + "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", + "requires": { + "@babel/helper-hoist-variables": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", + "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", + "requires": { + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==" + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "@babel/plugin-transform-parameters": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", + "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.12.13" }, "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" } } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", + "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", + "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-typescript": { @@ -1895,20 +3145,34 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + } } }, "@babel/polyfill": { @@ -1933,30 +3197,30 @@ } }, "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", - "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.13.tgz", + "integrity": "sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw==", + "requires": { + "@babel/compat-data": "^7.12.13", + "@babel/helper-compilation-targets": "^7.12.13", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.12.13", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.12.13", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.13", + "@babel/plugin-proposal-private-methods": "^7.12.13", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1966,62 +3230,67 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.12.13", + "@babel/plugin-transform-async-to-generator": "^7.12.13", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.12.13", + "@babel/plugin-transform-computed-properties": "^7.12.13", + "@babel/plugin-transform-destructuring": "^7.12.13", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.12.13", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.12.13", + "@babel/plugin-transform-modules-commonjs": "^7.12.13", + "@babel/plugin-transform-modules-systemjs": "^7.12.13", + "@babel/plugin-transform-modules-umd": "^7.12.13", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.12.13", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.12.13", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.12.13", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", + "@babel/types": "^7.12.13", "core-js-compat": "^3.8.0", "semver": "^5.5.0" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.13" } }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==" + }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, "@babel/types": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", - "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "requires": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", @@ -2053,9 +3322,9 @@ } }, "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -2374,9 +3643,9 @@ } }, "@nextcloud/vue": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-3.5.2.tgz", - "integrity": "sha512-txQ/X6vKT6JTlAF/Llbk6GlX4xrAMfQSUqqwlW0dmcSooTL8RckHuZJutIcpxSv/R4lA8TgDZaWExAfImaz4GA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-3.5.4.tgz", + "integrity": "sha512-Rsli88Osx1upQHGls/Lpxzn9x4m0T9EaXsMIIxmxggblxsSn4IVoPiqqYIrgP2+p2fDMYYmPup6WMQ7F0Qul4A==", "requires": { "@nextcloud/auth": "^1.2.3", "@nextcloud/axios": "^1.3.2", @@ -2391,7 +3660,6 @@ "emoji-mart-vue-fast": "^7.0.7", "escape-html": "^1.0.3", "hammerjs": "^2.0.8", - "linkify-urls": "^3.1.1", "linkifyjs": "~2.1.9", "md5": "^2.2.1", "regenerator-runtime": "^0.13.5", @@ -2406,16 +3674,6 @@ "vue-multiselect": "^2.1.6", "vue-visible": "^1.0.2", "vue2-datepicker": "^3.6.3" - }, - "dependencies": { - "linkify-urls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/linkify-urls/-/linkify-urls-3.1.1.tgz", - "integrity": "sha512-sRxMSunCnLFtZ4iVkMqHhZKSJ3MC/nRAvej8Ou3pEEEPBL0iVN91mZvdFREKcGv3VNcakbT4qsfOnnWMEbA59w==", - "requires": { - "create-html-element": "^2.1.0" - } - } } }, "@nicolo-ribaudo/chokidar-2": { @@ -2834,24 +4092,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", - "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", "dev": true }, "@webpack-cli/info": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", - "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", - "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", "dev": true }, "@xtuc/ieee754": { @@ -3341,7 +4599,6 @@ "version": "4.16.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001173", "colorette": "^1.2.1", @@ -3374,12 +4631,12 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -3415,8 +4672,7 @@ "caniuse-lite": { "version": "1.0.30001179", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", - "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", - "dev": true + "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==" }, "caseless": { "version": "0.12.0", @@ -3781,46 +5037,14 @@ "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "dependencies": { - "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", - "requires": { - "caniuse-lite": "^1.0.30001165", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", - "escalade": "^3.1.1", - "node-releases": "^1.1.67" - } - }, - "caniuse-lite": { - "version": "1.0.30001168", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001168.tgz", - "integrity": "sha512-P2zmX7swIXKu+GMMR01TWa4csIKELTNnZKc+f1CjebmZJQtTAEXmpQSoKVJVVcvPGAA0TEYTOUp3VehavZSFPQ==" - }, - "electron-to-chromium": { - "version": "1.3.629", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.629.tgz", - "integrity": "sha512-iSPPJtPvHrMAvYOt+9cdbDmTasPqwnwz4lkP8Dn200gDNUBQOLQ96xUsWXBwXslAo5XxdoXAoQQ3RAy4uao9IQ==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" - }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -4289,8 +5513,7 @@ "electron-to-chromium": { "version": "1.3.643", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.643.tgz", - "integrity": "sha512-TGomM4gj8adt/uqRgPbu9F0yhUVAR1deww5X0fvbQgpGr9suSMjLgc4IwQ9YKGkp1t03cDbZum20OfAkiTYjAg==", - "dev": true + "integrity": "sha512-TGomM4gj8adt/uqRgPbu9F0yhUVAR1deww5X0fvbQgpGr9suSMjLgc4IwQ9YKGkp1t03cDbZum20OfAkiTYjAg==" }, "emoji-mart-vue-fast": { "version": "7.0.7", @@ -4339,9 +5562,9 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==", "dev": true } } @@ -4368,9 +5591,9 @@ "dev": true }, "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", "dev": true }, "error-ex": { @@ -4472,8 +5695,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-goat": { "version": "1.3.0", @@ -4491,9 +5713,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5652,9 +6874,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -7225,8 +8447,7 @@ "node-releases": { "version": "1.1.70", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", - "dev": true + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==" }, "node-sass": { "version": "5.0.0", @@ -8070,9 +9291,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", + "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "requires": { "jsesc": "~0.5.0" }, @@ -8289,82 +9510,13 @@ } }, "sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.0.0.tgz", + "integrity": "sha512-08+bTpDfYK/wTow+LQx2D3VCFQinQij4uyGJl3yRUiOTx7n0FDDiReIIbXIVU0LFX5FhjC7s99lSKT4Qnm5eFg==", "dev": true, "requires": { "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "neo-async": "^2.6.2" } }, "schema-utils": { @@ -10287,9 +11439,9 @@ "integrity": "sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg==" }, "vue-router": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz", - "integrity": "sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==" }, "vue-style-loader": { "version": "4.1.2", @@ -10349,9 +11501,9 @@ } }, "vuex": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz", - "integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" }, "vuex-router-sync": { "version": "5.0.0", @@ -10369,9 +11521,9 @@ } }, "webpack": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.17.0.tgz", - "integrity": "sha512-R+IdNEaYcYaACpXZOt7reyc8txBK7J06lOPkX1SbgmeoAnUbyBZivJIksrDBnmMA3wlTWvPcX7DubxELyPB8rA==", + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.21.1.tgz", + "integrity": "sha512-H/fjQiDETEZDKoZm/LhvDBxOIKf9rfOdqb2pKTHRvBFMIRtwAwYlPCgBd0gc5xiDG5DqkxAiFZgAF/4H41wMuQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -10392,7 +11544,6 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "pkg-dir": "^5.0.0", "schema-utils": "^3.0.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.1", @@ -10401,9 +11552,9 @@ }, "dependencies": { "acorn": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", - "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", "dev": true }, "ajv": { @@ -10424,101 +11575,12 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "browserslist": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", - "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001173", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.634", - "escalade": "^3.1.1", - "node-releases": "^1.1.69" - } - }, - "caniuse-lite": { - "version": "1.0.30001179", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", - "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.643", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.643.tgz", - "integrity": "sha512-TGomM4gj8adt/uqRgPbu9F0yhUVAR1deww5X0fvbQgpGr9suSMjLgc4IwQ9YKGkp1t03cDbZum20OfAkiTYjAg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "node-releases": { - "version": "1.1.70", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", - "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==", "dev": true }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -10533,17 +11595,17 @@ } }, "webpack-cli": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", - "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.0", - "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.2", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", "colorette": "^1.2.1", - "commander": "^6.2.0", + "commander": "^7.0.0", "enquirer": "^2.3.6", "execa": "^5.0.0", "fastest-levenshtein": "^1.0.12", @@ -10555,9 +11617,9 @@ }, "dependencies": { "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", "dev": true } } diff --git a/package.json b/package.json index 9ff26dc9f..d25955da1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "polls", "description": "Polls app for nextcloud", - "version": "1.7.2", + "version": "1.8.0", "authors": [ { "name": "Vinzenz Rosenkranz", @@ -42,7 +42,7 @@ "@nextcloud/l10n": "^1.4.1", "@nextcloud/moment": "^1.1.1", "@nextcloud/router": "^1.2.0", - "@nextcloud/vue": "^3.5.2", + "@nextcloud/vue": "^3.5.4", "core-js": "^3.8.3", "linkify-urls": "^2.2.0", "lodash": "^4.17.20", @@ -50,9 +50,9 @@ "vue": "^2.6.12", "vue-clipboard2": "^0.3.1", "vue-fragment": "^1.5.1", - "vue-router": "^3.4.9", + "vue-router": "^3.5.1", "vuedraggable": "^2.24.3", - "vuex": "^3.6.0", + "vuex": "^3.6.2", "vuex-router-sync": "^5.0.0" }, "browserslist": [ @@ -64,15 +64,15 @@ "node": ">=10.0.0" }, "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.11", + "@babel/core": "^7.12.13", + "@babel/preset-env": "^7.12.13", "@nextcloud/eslint-plugin": "^2.0.0", "babel-eslint": "^10.0.3", "babel-loader": "^8.2.2", "clean-webpack-plugin": "^3.0.0", "cross-env": "^7.0.3", "css-loader": "^5.0.1", - "eslint": "^7.18.0", + "eslint": "^7.19.0", "eslint-config-standard": "^16.0.2", "eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.22.1", @@ -82,7 +82,7 @@ "eslint-plugin-vue": "^7.5.0", "file-loader": "^6.2.0", "node-sass": "^5.0.0", - "sass-loader": "^10.1.1", + "sass-loader": "^11.0.0", "stylelint": "^13.9.0", "stylelint-config-recommended-scss": "^4.2.0", "stylelint-scss": "^3.18.0", @@ -91,8 +91,8 @@ "vue-loader": "^15.9.6", "vue-style-loader": "^4.1.2", "vue-template-compiler": "^2.6.12", - "webpack": "^5.17.0", - "webpack-cli": "^4.4.0", + "webpack": "^5.21.1", + "webpack-cli": "^4.5.0", "webpack-merge": "^5.7.3" } } diff --git a/screenshots/edit-poll.png b/screenshots/edit-poll.png index 9d0643280..5e5c29051 100644 Binary files a/screenshots/edit-poll.png and b/screenshots/edit-poll.png differ diff --git a/screenshots/mobile-portrait.png b/screenshots/mobile-portrait.png index b9698b522..c31788dd1 100644 Binary files a/screenshots/mobile-portrait.png and b/screenshots/mobile-portrait.png differ diff --git a/screenshots/overview.png b/screenshots/overview.png index e1b90977f..f67a9cfbc 100644 Binary files a/screenshots/overview.png and b/screenshots/overview.png differ diff --git a/screenshots/shares.png b/screenshots/shares.png index a2dfd082a..ca5546e9a 100644 Binary files a/screenshots/shares.png and b/screenshots/shares.png differ diff --git a/screenshots/vote.png b/screenshots/vote.png index b5a66580f..026d91a00 100644 Binary files a/screenshots/vote.png and b/screenshots/vote.png differ diff --git a/src/js/App.vue b/src/js/App.vue index 6404707c7..ab2dfa5dc 100644 --- a/src/js/App.vue +++ b/src/js/App.vue @@ -25,7 +25,7 @@ <SettingsDlg /> <Navigation v-if="getCurrentUser()" :class="{ 'glassy': settings.glassyNavigation }" /> <router-view /> - <SideBar v-if="sideBarOpen && $store.state.poll.id" + <SideBar v-if="sideBarOpen && $store.state.poll.id && (acl.allowEdit || poll.allowComment)" :active="activeTab" :class="{ 'glassy': settings.glassySidebar }" /> <LoadingOverlay v-if="loading" /> @@ -75,6 +75,8 @@ export default { computed: { ...mapState({ settings: state => state.settings.user, + poll: state => state.poll, + acl: state => state.poll.acl, }), appStyle() { if (this.settings.useImage && this.settings.experimental) { @@ -98,6 +100,16 @@ export default { }, created() { + if (getCurrentUser()) { + this.$store.dispatch('settings/get') + if (this.$route.name !== 'publicVote') { + this.updatePolls() + } + if (this.$route.params.id && !this.$oute.params.token) { + this.loadPoll(true) + } + } + subscribe('transitions-off', (delay) => { this.transitionsOff(delay) }) @@ -130,15 +142,6 @@ export default { }) - if (getCurrentUser()) { - this.$store.dispatch('settings/get') - if (this.$route.name !== 'publicVote') { - this.updatePolls() - } - if (this.$route.params.id && !this.$oute.params.token) { - this.loadPoll(true) - } - } this.timedReload() }, @@ -159,7 +162,6 @@ export default { timedReload() { this.reloadTimer = window.setInterval(() => { this.updatePolls() - this.loadPoll(true) }, this.reloadInterval) }, @@ -173,10 +175,6 @@ export default { }, async loadPoll(silent) { - if (!this.$route.params.id) { - return - } - if (!silent) { this.loading = true this.transitionsOff() @@ -187,6 +185,12 @@ export default { await this.$store.dispatch('share/get') } + if (this.$route.name === 'vote' && !this.$route.params.id) { + this.loading = false + this.transitionsOn() + throw new Error('No pollId for vote page') + } + if (this.$route.name === 'vote') { await this.$store.dispatch('poll/shares/list') } diff --git a/src/js/assets/icons/minus.svg b/src/js/assets/icons/minus.svg new file mode 100644 index 000000000..3a7c814e2 --- /dev/null +++ b/src/js/assets/icons/minus.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"> + <rect y="7.00" x="2.00" height="2" width="12" style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;" /> +</svg> diff --git a/src/js/assets/scss/hacks.scss b/src/js/assets/scss/hacks.scss index 508085b42..ac92f7b01 100644 --- a/src/js/assets/scss/hacks.scss +++ b/src/js/assets/scss/hacks.scss @@ -8,3 +8,18 @@ .modal-wrapper .modal-container[data-v-a2e1babe] { overflow: auto !important; } + +.app-sidebar__tab { + overflow: initial !important; +} + +.app-sidebar { + overflow-x: initial !important; + overflow-y: initial !important; +} + + +.mx-datepicker-main, .mx-datepicker-popup { + right: 0 !important; + left: auto !important; +} diff --git a/src/js/assets/scss/icons.scss b/src/js/assets/scss/icons.scss index ded4cf613..4ecaa2bbd 100644 --- a/src/js/assets/scss/icons.scss +++ b/src/js/assets/scss/icons.scss @@ -18,6 +18,7 @@ --icon-polls-yes: url('../icons/yes-vote.svg'); --icon-polls-no: url('../icons/no-vote.svg'); --icon-polls-maybe: url('../icons/maybe-vote.svg'); + --icon-polls-minus: url('../icons/minus.svg'); --icon-polls-handle: url('../icons/handle.svg'); --icon-polls-handle--fff: url('../icons/handle-fff.svg'); --icon-polls-mail: url('../icons/mail.svg'); @@ -65,6 +66,10 @@ background-image: var(--icon-polls-move); } +.icon-polls-minus { + background-image: var(--icon-polls-minus); +} + .icon-polls-clone { background-image: var(--icon-polls-clone); } diff --git a/src/js/components/Base/ButtonDiv.vue b/src/js/components/Base/ButtonDiv.vue index 0209318a8..5d92a2dc3 100644 --- a/src/js/components/Base/ButtonDiv.vue +++ b/src/js/components/Base/ButtonDiv.vue @@ -21,7 +21,7 @@ --> <template lang="html"> - <Component :is="tag" :class="['button', icon, { withIcon: withIcon, primary: primary } ]" @click="$emit('click')"> + <Component :is="tag" :class="[buttonStyle, iconClass, { withIcon: withIcon, primary: primary } ]" @click="$emit('click')"> {{ title }} </Component> </template> @@ -46,11 +46,31 @@ export default { type: String, default: 'button', }, + submit: { + type: Boolean, + default: false, + }, }, computed: { + iconClass() { + if (this.submit) { + return 'icon-confirm' + } else { + return this.icon + } + }, + withIcon() { - return Boolean(this.icon) + return Boolean(this.icon && !this.submit) + }, + + buttonStyle() { + if (this.submit) { + return 'submit' + } else { + return 'button' + } }, }, } @@ -69,4 +89,15 @@ export default { } + .submit { + flex: 0; + width: 30px; + max-width: 30px; + min-width: 30px; + background-color: transparent; + border: none; + opacity: 0.3; + cursor: pointer; + } + </style> diff --git a/src/js/components/Base/CheckBoxDiv.vue b/src/js/components/Base/CheckBoxDiv.vue new file mode 100644 index 000000000..ffbe03e47 --- /dev/null +++ b/src/js/components/Base/CheckBoxDiv.vue @@ -0,0 +1,64 @@ +<!-- + - @copyright Copyright (c) 2018 René Gieling <github@dartcafe.de> + - + - @author René Gieling <github@dartcafe.de> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> + +<template lang="html"> + <div class="checkbox-div"> + <input :id="id" + :checked="value" + :disabled="disabled" + type="checkbox" + class="checkbox" + @click="$emit('input', $event.target.checked)"> + <label :for="id"> + <slot name="before" /> + {{ label }} + </label> + </div> +</template> + +<script> +const RandId = () => { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10) +} + +export default { + name: 'CheckBoxDiv', + props: { + label: { + type: String, + required: true, + }, + value: { + type: [Boolean, Number], + required: true, + }, + id: { + type: String, + default: () => 'cb-' + RandId(), + }, + disabled: { + type: Boolean, + default: false, + }, + }, +} +</script> diff --git a/src/js/components/Base/Counter.vue b/src/js/components/Base/Counter.vue index 7a0a88835..2ff72cf16 100644 --- a/src/js/components/Base/Counter.vue +++ b/src/js/components/Base/Counter.vue @@ -57,7 +57,7 @@ <span /> </div> - <div v-if="option.maybe && showMaybe" class="maybe" :style="{flex: option.maybe }"> + <div v-if="option.maybe && showMaybe" class="maybe" :style="{ flex: option.maybe }"> <span /> </div> </div> @@ -95,6 +95,7 @@ export default { .counter { display: flex; + justify-content: space-around; } .counter--icon { diff --git a/src/js/components/Base/InputDiv.vue b/src/js/components/Base/InputDiv.vue index 4cae55589..a5aedb07e 100644 --- a/src/js/components/Base/InputDiv.vue +++ b/src/js/components/Base/InputDiv.vue @@ -21,52 +21,98 @@ --> <template lang="html"> - <div class="input-div"> + <div :class="['input-div', { numeric: useNumModifiers }]"> + <div v-if="useNumModifiers" class="modifyer subtract icon icon-polls-minus" @click="$emit('subtract')" /> <input ref="input" :value="value" :placeholder="placeholder" class="input" @keyup.enter="$emit('input', $event.target.value)"> - <button class="submit icon-confirm" - @click="$emit('input', $refs.input.value)" /> + <ButtonDiv v-if="!useNumModifiers && !noSubmit" submit @click="$emit('input', $refs.input.value)" /> + <div v-if="useNumModifiers" class="modifyer add icon icon-add" @click="$emit('add')" /> </div> </template> <script> + +import ButtonDiv from '../Base/ButtonDiv' + export default { name: 'InputDiv', + + components: { + ButtonDiv, + }, + props: { value: { - type: String, + type: [String, Number], required: true, }, placeholder: { type: String, default: '', }, + useNumModifiers: { + type: Boolean, + default: false, + }, + noSubmit: { + type: Boolean, + default: false, + }, }, } + </script> <style lang="scss" scoped> .input-div { + position: relative; display: flex; } - .input { - flex: 1; + .input-div.numeric { + min-width: 100px; + width: 110px; + display: block; + } + + .numeric input { + text-align: center; + } + + input { + width: 100%; &:empty:before { color: grey; } } - .submit { - width: 30px; - background-color: transparent; - border: none; - opacity: 0.3; + .add { + right: 0; + border-left: solid 1px; + border-radius: 0 var(--border-radius) var(--border-radius) 0; + } + + .subtract { + left: 0; + border-right: solid 1px; + border-radius: var(--border-radius) 0 0 var(--border-radius); + } + + .modifyer { + position: absolute; + top: 0; + height: 32px; + margin: 4px 1px; + padding: 0 14px; + border-color: var(--color-border-dark); cursor: pointer; + &:hover { + background-color: var(--color-background-hover) + } } </style> diff --git a/src/js/components/Base/RadioGroupDiv.vue b/src/js/components/Base/RadioGroupDiv.vue new file mode 100644 index 000000000..58c2c8e23 --- /dev/null +++ b/src/js/components/Base/RadioGroupDiv.vue @@ -0,0 +1,62 @@ +<!-- + - @copyright Copyright (c) 2018 René Gieling <github@dartcafe.de> + - + - @author René Gieling <github@dartcafe.de> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> + +<template lang="html"> + <div class="radio-group-div"> + <fieldset v-for="(option, index) in options" :key="option.value"> + <input :id="id + '_' + index" + :checked="option.value === value" + :value="option.value" + type="radio" + class="radio" + @change="$emit('input', option.value)"> + <label :for="id + '_' + index"> + <slot name="before" /> + {{ option.label }} + </label> + </fieldset> + </div> +</template> + +<script> +const RandId = () => { + return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10) +} + +export default { + name: 'RadioGroupDiv', + props: { + id: { + type: String, + default: () => 'rg-' + RandId(), + }, + options: { + type: Array, + required: true, + }, + value: { + type: String, + default: null, + }, + }, +} +</script> diff --git a/src/js/components/Base/UserItem.vue b/src/js/components/Base/UserItem.vue index c78cc6e20..582c84791 100644 --- a/src/js/components/Base/UserItem.vue +++ b/src/js/components/Base/UserItem.vue @@ -142,10 +142,7 @@ export default { flex: 1; align-items: center; max-width: 100%; -} - -.user-item__avatar { - margin: 2px 4px; + padding: 4px; } .type-icon { diff --git a/src/js/components/Calendar/CalendarPeek.vue b/src/js/components/Calendar/CalendarPeek.vue index cf033f743..74c617cc6 100644 --- a/src/js/components/Calendar/CalendarPeek.vue +++ b/src/js/components/Calendar/CalendarPeek.vue @@ -105,9 +105,9 @@ export default { displayColor: '#ffffff', allDay: '', description: this.poll.description, - end: this.option.timestamp, + start: this.option.timestamp, location: '', - start: this.option.timestamp + 3600, + end: this.option.timestamp + 3600, status: 'self', summary: this.poll.title, } diff --git a/src/js/components/Comments/CommentItem.vue b/src/js/components/Comments/CommentItem.vue new file mode 100644 index 000000000..954dd2ec2 --- /dev/null +++ b/src/js/components/Comments/CommentItem.vue @@ -0,0 +1,138 @@ +<!-- + - @copyright Copyright (c) 2021 René Gieling <github@dartcafe.de> + - + - @author René Gieling <github@dartcafe.de> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> + +<template> + <div class="comment-item"> + <div class="comment-item_meta"> + <UserItem v-bind="comment" /> + <div class="date"> + {{ dateCommentedRelative }} + </div> + <Actions v-if="comment.userId === acl.userId || acl.isOwner"> + <ActionButton v-if="deleteTimeout" icon="icon-history" @click="cancelDeleteComment()"> + {{ n('polls', 'Deleting in {countdown} second', 'Deleting in {countdown} seconds', countdown, { countdown }) }} + </ActionButton> + <ActionButton v-else icon="icon-delete" @click="deleteComment()"> + {{ t('polls', 'Delete comment') }} + </ActionButton> + </Actions> + </div> + + <div class="comment-item_content"> + {{ comment.comment }} + </div> + </div> +</template> + +<script> +import moment from '@nextcloud/moment' +import { showSuccess, showError } from '@nextcloud/dialogs' +import { Actions, ActionButton } from '@nextcloud/vue' +import { mapState } from 'vuex' + +export default { + name: 'CommentItem', + components: { + Actions, + ActionButton, + }, + + props: { + comment: { + type: Object, + default: null, + }, + }, + + data() { + return { + deleteInterval: null, + deleteTimeout: null, + countdown: 7, + } + }, + + computed: { + ...mapState({ + acl: state => state.poll.acl, + }), + dateCommentedRelative() { + return moment.utc(this.comment.dt).fromNow() + }, + }, + + methods: { + deleteComment() { + this.deleteInterval = setInterval(() => { + this.countdown-- + if (this.countdown < 0) { + this.countdown = 0 + } + }, 1000) + this.deleteTimeout = setTimeout(async() => { + try { + await this.$store.dispatch({ type: 'poll/comments/delete', comment: this.comment }) + showSuccess(t('polls', 'Comment deleted')) + } catch (error) { + showError(t('polls', 'Error while deleting the comment')) + console.error(error.response) + } finally { + clearInterval(this.deleteInterval) + this.deleteTimeout = null + this.deleteInterval = null + this.countdown = 7 + } + }, 7000) + }, + + cancelDeleteComment() { + clearTimeout(this.deleteTimeout) + clearInterval(this.deleteInterval) + this.deleteTimeout = null + this.deleteInterval = null + this.countdown = 7 + }, + }, +} +</script> + +<style scoped lang="scss"> + .comment-item { + margin-bottom: 30px; + } + + .comment-item_meta { + display: flex; + align-items: center; + } + + .date { + right: 0; + top: 5px; + opacity: 0.5; + } + + .comment-item_content { + margin-left: 53px; + flex: 1 1; + } +</style> diff --git a/src/js/components/Comments/Comments.vue b/src/js/components/Comments/Comments.vue index fbf9abe0d..144d53b24 100644 --- a/src/js/components/Comments/Comments.vue +++ b/src/js/components/Comments/Comments.vue @@ -21,40 +21,22 @@ --> <template> - <transition-group name="fade" class="comments" - tag="ul"> - <li v-for="(comment) in sortedList" :key="comment.id"> - <div class="comment-item"> - <UserItem v-bind="comment" /> - <Actions v-if="comment.userId === acl.userId"> - <ActionButton icon="icon-delete" @click="deleteComment(comment)"> - {{ t('polls', 'Delete comment') }} - </ActionButton> - </Actions> - <div class="date"> - {{ dateCommentedRelative(comment.dt) }} - </div> - </div> - - <div class="message wordwrap comment-content"> - {{ comment.comment }} - </div> - </li> + <transition-group name="fade" class="comments" tag="ul"> + <CommentItem v-for="(comment) in sortedList" :key="comment.id" + :comment="comment" + tag="li" /> </transition-group> </template> <script> import sortBy from 'lodash/sortBy' -import moment from '@nextcloud/moment' -import { showSuccess, showError } from '@nextcloud/dialogs' -import { Actions, ActionButton } from '@nextcloud/vue' +import CommentItem from './CommentItem' import { mapState } from 'vuex' export default { name: 'Comments', components: { - Actions, - ActionButton, + CommentItem, }, data() { return { @@ -66,7 +48,6 @@ export default { computed: { ...mapState({ comments: state => state.poll.comments.list, - acl: state => state.poll.acl, }), sortedList() { @@ -79,43 +60,5 @@ export default { }, - methods: { - deleteComment(comment) { - this.$store - .dispatch({ type: 'poll/comments/delete', comment: comment }) - .then(() => { - showSuccess(t('polls', 'Comment deleted')) - }) - .catch((error) => { - showError(t('polls', 'Error while deleting the comment')) - console.error(error.response) - }) - }, - dateCommentedRelative(date) { - return moment.utc(date).fromNow() - }, - }, } </script> - -<style scoped lang="scss"> - ul { - & > li { - margin-bottom: 30px; - & > .comment-item { - display: flex; - align-items: center; - - & > .date { - right: 0; - top: 5px; - opacity: 0.5; - } - } - & > .message { - margin-left: 53px; - flex: 1 1; - } - } - } -</style> diff --git a/src/js/components/Create/CreateDlg.vue b/src/js/components/Create/CreateDlg.vue index 3936b5dd3..17b8f9e87 100644 --- a/src/js/components/Create/CreateDlg.vue +++ b/src/js/components/Create/CreateDlg.vue @@ -32,22 +32,7 @@ </ConfigBox> <ConfigBox :title="t('polls', 'Poll type')" icon-class="icon-checkmark"> - <input id="datePoll" - v-model="type" - value="datePoll" - type="radio" - class="radio"> - <label for="datePoll"> - {{ t('polls', 'Date poll') }} - </label> - <input id="textPoll" - v-model="type" - value="textPoll" - type="radio" - class="radio"> - <label for="textPoll"> - {{ t('polls', 'Text poll') }} - </label> + <RadioGroupDiv v-model="pollType" :options="pollTypeOptions" /> </ConfigBox> <div class="create-buttons"> @@ -66,19 +51,25 @@ import { mapState } from 'vuex' import { showSuccess, showError } from '@nextcloud/dialogs' import { emit } from '@nextcloud/event-bus' import ConfigBox from '../Base/ConfigBox' +import RadioGroupDiv from '../Base/RadioGroupDiv' export default { name: 'CreateDlg', components: { ConfigBox, + RadioGroupDiv, }, data() { return { id: 0, - type: 'datePoll', + pollType: 'datePoll', title: '', + pollTypeOptions: [ + { value: 'datePoll', label: t('polls', 'Date poll') }, + { value: 'textPoll', label: t('polls', 'Text poll') }, + ], } }, @@ -95,16 +86,16 @@ export default { methods: { cancel() { this.title = '' - this.type = 'datePoll' + this.pollType = 'datePoll' this.$emit('close-create') }, confirm() { - this.$store.dispatch('poll/add', { title: this.title, type: this.type }) + this.$store.dispatch('poll/add', { title: this.title, type: this.pollType }) .then((response) => { emit('update-polls') this.cancel() - showSuccess(t('polls', 'Poll "{pollTitle}" added', { pollTitle: response.data.id })) + showSuccess(t('polls', 'Poll "{pollTitle}" added', { pollTitle: response.data.title })) this.$router.push({ name: 'vote', params: { id: response.data.id } }) }) .catch(() => { @@ -123,16 +114,10 @@ export default { <style lang="css" scoped> .create-dialog { - /* display: flex; */ - /* flex-direction: column; */ background-color: var(--color-main-background); padding: 8px 20px; } -/* #pollTitle { - width: 100%; -} */ - .create-buttons { display: flex; justify-content: space-between; diff --git a/src/js/components/Options/OptionItem.vue b/src/js/components/Options/OptionItem.vue index f0a7ea9da..517349d19 100644 --- a/src/js/components/Options/OptionItem.vue +++ b/src/js/components/Options/OptionItem.vue @@ -21,29 +21,49 @@ --> <template> - <Component :is="tag" class="option-item" :class="{ draggable: isDraggable }"> + <Component :is="tag" class="option-item" :class="{ draggable: isDraggable, 'date-box': show === 'dateBox' }"> <div v-if="isDraggable" class="option-item__handle icon icon-handle" /> - <div v-if="showRank" class="option-item__rank"> - {{ option.rank }} - </div> - <div v-if="show === 'textBox'" v-tooltip.auto="optionTooltip" class="option-item__option--text"> {{ optionText }} </div> <div v-if="show === 'dateBox'" v-tooltip.auto="dateLocalFormatUTC" class="option-item__option--datebox"> - <div class="month"> - {{ dateBoxMonth }} - </div> - <div class="day"> - {{ dateBoxDay }} + <div class="event-date"> + <div class="event-from"> + <div class="month"> + {{ event.from.month }} + </div> + <div class="day"> + {{ event.from.day }} + </div> + <div class="dow"> + {{ event.from.dow }} + </div> + </div> + <div v-if="option.duration && !event.to.sameDay" class="devider"> + - + </div> + <div v-if="option.duration && !event.to.sameDay" class="event-to"> + <div class="month"> + {{ event.to.month }} + </div> + <div class="day"> + {{ event.to.day }} + </div> + <div class="dow"> + {{ event.to.dow }} + </div> + </div> </div> - <div class="dow"> - {{ dateBoxDow }} - </div> - <div class="time"> - {{ dateBoxTime }} + + <div class="event-time"> + <div v-if="!event.dayLong" class="time-from"> + {{ event.from.time }} + </div> + <div v-if="option.duration && !event.dayLong" class="time-to"> + {{ event.to.time }} + </div> </div> </div> @@ -66,10 +86,6 @@ export default { type: Object, required: true, }, - showRank: { - type: Boolean, - default: false, - }, tag: { type: String, default: 'div', @@ -88,28 +104,70 @@ export default { return this.draggable }, - dateLocalFormat() { - return moment.unix(this.option.timestamp).format('llll') - }, + event() { + const from = moment.unix(this.option.timestamp) + const to = moment.unix(this.option.timestamp + Math.max(0, this.option.duration)) - dateLocalFormatUTC() { - return moment.unix(this.option.timestamp).utc().format('llll') + ' UTC' - }, + // does the event start at 00:00 local time and + // is the duration divisable through 24 hours without rest + // then we have a day long event (one or multiple days) + // In this case we want to suppress the display of any time information + const dayLongEvent = from.unix() === moment(from).startOf('day').unix() && this.option.duration % 86400 === 0 + const dayModifier = dayLongEvent ? 1 : 0 + // modified to date, in case of day long events, a second gets substracted + // to set the begin of the to day to the end of the previous date + const toModified = moment(to).subtract(dayModifier, 'days') - dateBoxMonth() { - return moment.unix(this.option.timestamp).format('MMM') + " '" + moment.unix(this.option.timestamp).format('YY') - }, - - dateBoxDay() { - return moment.unix(this.option.timestamp).format('Do') + if (this.poll.type !== 'datePoll') { + return {} + } else { + return { + from: { + month: from.format('MMM [ \']YY'), + day: from.format('Do'), + dow: from.format('ddd'), + time: from.format('LT'), + date: from.format('ll'), + dateTime: from.format('llll'), + utc: moment(from).utc().format('llll'), + }, + to: { + month: toModified.format('MMM'), + day: toModified.format('D'), + dow: toModified.format('ddd'), + time: to.format('LT'), + date: to.format('ll'), + dateTime: to.format('llll'), + utc: moment(to).utc().format('llll'), + sameDay: from.format('L') === toModified.format('L'), + }, + dayLong: dayLongEvent, + } + } }, - dateBoxDow() { - return moment.unix(this.option.timestamp).format('ddd') + dateLocalFormat() { + if (this.poll.type !== 'datePoll') { + return {} + } else if (this.option.duration === 0) { + return this.event.from.dateTime + } else if (this.event.daylong && this.event.to.sameDay) { + return this.event.from.date + } else if (this.event.daylong && !this.event.to.sameDay) { + return this.event.from.date + ' - ' + this.event.to.date + } else if (this.event.to.sameDay) { + return this.event.from.dateTime + ' - ' + this.event.to.time + } else { + return this.event.from.dateTime + ' - ' + this.event.to.dateTime + } }, - dateBoxTime() { - return moment.unix(this.option.timestamp).format('LT') + dateLocalFormatUTC() { + if (this.option.duration) { + return this.event.from.utc + ' - ' + this.event.to.utc + ' UTC' + } else { + return this.event.from.utc + ' UTC' + } }, optionTooltip() { @@ -143,6 +201,49 @@ export default { .option-item { display: flex; align-items: center; + flex: 1; + position: relative; + &.date-box { + // flex: 1; + align-items: stretch; + flex-direction: column; + } + } + + [class*='event'] { + display: flex; + flex-direction: column; + align-items: center; + } + + .devider { + align-self: center; + color: var(--color-text-lighter); + } + + .event-date { + flex-direction: row !important; + align-items: stretch !important; + justify-content: center; + .event-from { + padding-bottom: 8px; + flex: 0; + } + .event-to { + flex: 0; + font-size: 80%; + justify-content: flex-end; + .day { + margin: 0; + } + } + } + + .event-time { + margin-top: 8px; + .time-to { + font-size: 80%; + } } [class*='option-item__option'] { @@ -187,11 +288,13 @@ export default { display: flex; flex-direction: column; padding: 0 2px; - align-items: center; - justify-content: center; + align-items: stretch; + justify-content: flex-start; text-align: center; + hyphens: auto; - .month, .dow { + .month, .dow, .time { + white-space: pre; font-size: 1.1em; color: var(--color-text-lighter); } @@ -201,17 +304,4 @@ export default { } } - .mobile { - .option-item { - flex: 2; - order: 1; - min-width: 0; - .option-item__option--text { - hyphens: auto; - align-items: center; - white-space: nowrap; - width: 50px; - } - } - } </style> diff --git a/src/js/components/Options/OptionsDateAdd.vue b/src/js/components/Options/OptionsDateAdd.vue index c95e25a36..9430f5b19 100644 --- a/src/js/components/Options/OptionsDateAdd.vue +++ b/src/js/components/Options/OptionsDateAdd.vue @@ -22,16 +22,30 @@ <template> <ConfigBox :title="t('polls', 'Add a date option')" icon-class="icon-add"> - <DatetimePicker v-model="lastOption" + <DatetimePicker v-model="pickedOption" v-bind="optionDatePicker" - confirm + :open.sync="pickerOpen" style="width: inherit;" - @change="addOption(lastOption)" /> + @pick="pickedDate"> + <template slot="footer"> + <CheckBoxDiv v-model="useRange" class="range" :label="t('polls', 'Select range')" /> + <button v-if="!showTimePanel" class="mx-btn" @click="toggleTimePanel"> + {{ t('polls', 'Add time') }} + </button> + <button v-else class="mx-btn" @click="toggleTimePanel"> + {{ t('polls', 'Remove time') }} + </button> + <button class="mx-btn" @click="addOption"> + {{ t('polls', 'OK') }} + </button> + </template> + </DateTimePicker> </ConfigBox> </template> <script> +import CheckBoxDiv from '../Base/CheckBoxDiv' import ConfigBox from '../Base/ConfigBox' import moment from '@nextcloud/moment' import { DatetimePicker } from '@nextcloud/vue' @@ -40,25 +54,57 @@ export default { name: 'OptionsDateAdd', components: { + CheckBoxDiv, ConfigBox, DatetimePicker, }, data() { return { - lastOption: '', + pickedOption: null, + lastPickedOption: null, + startDate: moment(), + endDate: moment(), + pickerOpen: false, + useRange: false, + showTimePanel: false, } }, computed: { + tempFormat() { + if (this.showTimePanel) { + return moment.localeData().longDateFormat('L LT') + } else { + return moment.localeData().longDateFormat('L') + } + }, + + dateOption() { + const timeToAdd = this.showTimePanel ? 0 : 86400 + + const startDate = this.useRange ? moment(this.pickedOption[0]) : moment(this.pickedOption) + const endDate = this.useRange ? moment(this.pickedOption[1]).add(timeToAdd, 'seconds') : moment(this.pickedOption).add(timeToAdd, 'seconds') + const pollOptionTextStart = startDate.utc().format(moment.defaultFormat) + const pollOptionTextEnd = startDate === endDate ? '' : ' - ' + endDate.utc().format(moment.defaultFormat) + + return { + timestamp: startDate.unix(), + pollOptionText: pollOptionTextStart + pollOptionTextEnd, + duration: endDate.unix() - startDate.unix(), + } + }, + optionDatePicker() { return { editable: false, minuteStep: 5, - type: 'datetime', - format: moment.localeData().longDateFormat('L') + ' ' + moment.localeData().longDateFormat('LT'), - placeholder: t('polls', 'Click to add a date'), - confirm: true, + type: this.showTimePanel ? 'datetime' : 'date', + range: this.useRange, + showTimePanel: this.showTimePanel, + valueType: 'timestamp', + format: this.tempFormat, + placeholder: t('polls', 'Click to add an option'), lang: { formatLocale: { firstDayOfWeek: this.firstDOW, @@ -72,16 +118,61 @@ export default { }, }, + watch: { + useRange() { + if (this.useRange) { + if (!Array.isArray(this.pickedOption)) { + this.pickedOption = [this.pickedOption, this.pickedOption] + } + } else { + if (Array.isArray(this.pickedOption)) { + this.pickedOption = this.pickedOption[0] + } + } + }, + }, + methods: { - addOption(pollOptionText) { - if (moment(pollOptionText).isValid()) { - this.$store.dispatch('poll/options/add', { - pollOptionText: pollOptionText, - timestamp: moment(pollOptionText).unix(), - }) + toggleTimePanel() { + if (this.useRange) { + if (Array.isArray(this.pickedOption)) { + if (this.lastPickedOption !== this.pickedOption[0] + && this.lastPickedOption !== this.pickedOption[1]) { + this.pickedOption = [this.lastPickedOption, this.lastPickedOption] + } + } else { + if (this.lastPickedOption) { + this.pickedOption = [this.lastPickedOption, this.lastPickedOption] + } + } + } + this.showTimePanel = !this.showTimePanel + }, + + pickedDate(value) { + if (this.optionDatePicker.valueType === 'timestamp') { + this.lastPickedOption = moment(value).valueOf() + } else { + this.lastPickedOption = value } + this.pickerOpen = true + }, + + addOption() { + this.pickerOpen = false + this.$store.dispatch('poll/options/add', this.dateOption) }, }, } </script> + +<style lang="scss" scoped> + +.range { + flex: 1; + text-align: left; + margin: 8px; +} + +</style> diff --git a/src/js/components/Options/OptionsDateShift.vue b/src/js/components/Options/OptionsDateShift.vue index 7d5ae3816..d9279562b 100644 --- a/src/js/components/Options/OptionsDateShift.vue +++ b/src/js/components/Options/OptionsDateShift.vue @@ -24,23 +24,15 @@ <ConfigBox :title="t('polls', 'Shift all date options')" icon-class="icon-polls-move"> <div> <div class="selectUnit"> - <Actions> - <ActionButton icon="icon-play-previous" @click="shift.step--"> - {{ t('polls', 'Decrease unit') }} - </ActionButton> - </Actions> - <input v-model="shift.step"> - <Actions> - <ActionButton icon="icon-play-next" @click="shift.step++"> - {{ t('polls', 'Increase unit') }} - </ActionButton> - </Actions> + <InputDiv v-model="shift.step" + use-num-modifiers + @add="shift.step++" + @subtract="shift.step--" /> <Multiselect v-model="shift.unit" :options="dateUnits" label="name" track-by="value" /> - <ButtonDiv icon="icon-history" - :title="t('polls', 'Shift')" + <ButtonDiv submit @click="shiftDates(shift)" /> </div> </div> @@ -51,17 +43,17 @@ import { mapState } from 'vuex' import ConfigBox from '../Base/ConfigBox' +import InputDiv from '../Base/InputDiv' import moment from '@nextcloud/moment' -import { Actions, ActionButton, Multiselect } from '@nextcloud/vue' +import { Multiselect } from '@nextcloud/vue' import { dateUnits } from '../../mixins/dateMixins' export default { name: 'OptionsDateShift', components: { - Actions, - ActionButton, ConfigBox, + InputDiv, Multiselect, }, @@ -100,7 +92,13 @@ export default { methods: { shiftDates(payload) { const store = this.$store - this.options.forEach(function(existingOption) { + let options = [] + if (payload.step < 0) { + options = this.options + } else if (payload.step > 0) { + options = this.options.slice().reverse() + } + options.forEach(function(existingOption) { const option = Object.assign({}, existingOption) option.timestamp = moment.unix(option.timestamp).add(payload.step, payload.unit.value).unix() option.pollOptionText = moment.unix(option.timestamp).format('YYYY-MM-DD HH:mm:ss') @@ -115,11 +113,8 @@ export default { <style lang="scss" scoped> .selectUnit { display: flex; + flex-wrap: wrap; align-items: center; - input { - margin: 0 4px; - width: 40px; - } .multiselect { margin: 0 8px; width: unset !important; diff --git a/src/js/components/Settings/ExpertimantalSettings.vue b/src/js/components/Settings/ExpertimantalSettings.vue index 261df739d..032ca1920 100644 --- a/src/js/components/Settings/ExpertimantalSettings.vue +++ b/src/js/components/Settings/ExpertimantalSettings.vue @@ -23,9 +23,14 @@ <template> <div> <div class="user_settings"> - <input id="experimental" v-model="experimental" - type="checkbox" class="checkbox"> - <label for="experimental">{{ t('polls', 'Try experimental styles') }}</label> + <CheckBoxDiv v-model="realTimePolling" :label="t('polls', 'Beta - watch for updated polls in realtime')" /> + <div class="settings_details"> + {{ t('polls', 'All changes to the current poll, done by other users, will be recognized in realtime.') }} + </div> + </div> + + <div class="user_settings"> + <CheckBoxDiv v-model="experimental" :label="t('polls', 'Try experimental styles')" /> <div class="settings_details"> {{ t('polls', 'Some experimental UI variants. Changes the background color of the main area.') }} </div> @@ -33,9 +38,7 @@ <div v-if="experimental"> <div class="user_settings"> - <input id="useImage" v-model="useImage" - type="checkbox" class="checkbox"> - <label for="useImage">{{ t('polls', 'Use background image') }}</label> + <CheckBoxDiv v-model="useImage" :label="t('polls', 'Use background image')" /> <div class="settings_details"> {{ t('polls', 'Add a background image to the main area.') }} <input v-if="useImage" v-model="imageUrl" type="text"> @@ -46,18 +49,14 @@ </div> <div class="user_settings"> - <input id="glassyNavigation" v-model="glassyNavigation" - type="checkbox" class="checkbox"> - <label for="glassyNavigation">{{ t('polls', 'Glassy navigation') }}</label> + <CheckBoxDiv v-model="glassyNavigation" :label="t('polls', 'Glassy navigation')" /> <div class="settings_details"> {{ t('polls', 'Blurs the background of the navigation (Does not work with all browsers).') }} </div> </div> <div class="user_settings"> - <input id="glassySidebar" v-model="glassySidebar" - type="checkbox" class="checkbox"> - <label for="glassySidebar">{{ t('polls', 'Glassy sidebar') }}</label> + <CheckBoxDiv v-model="glassySidebar" :label="t('polls', 'Glassy sidebar')" /> <div class="settings_details"> {{ t('polls', 'Blurs the background of the sidebar (Does not work with all browsers).') }} </div> @@ -69,10 +68,15 @@ <script> import { mapState } from 'vuex' +import CheckBoxDiv from '../Base/CheckBoxDiv' export default { name: 'ExpertimantalSettings', + components: { + CheckBoxDiv, + }, + props: { show: { type: Boolean, @@ -85,6 +89,14 @@ export default { settings: state => state.settings.user, }), // Add bindings + realTimePolling: { + get() { + return this.settings.realTimePolling + }, + set(value) { + this.writeValue({ realTimePolling: value }) + }, + }, experimental: { get() { return this.settings.experimental diff --git a/src/js/components/Settings/FeatureSettings.vue b/src/js/components/Settings/FeatureSettings.vue index c3e09f23c..f3e50c252 100644 --- a/src/js/components/Settings/FeatureSettings.vue +++ b/src/js/components/Settings/FeatureSettings.vue @@ -23,40 +23,31 @@ <template> <div> <div class="user_settings"> - <input id="calendarPeek" v-model="calendarPeek" - type="checkbox" class="checkbox"> - <label for="calendarPeek">{{ t('polls', 'Use calendar lookup') }}</label> + <CheckBoxDiv v-model="calendarPeek" :label="t('polls', 'Use calendar lookup')" /> <div class="settings_details"> {{ t('polls', 'Check, if an option in a date poll is conflicting with or near an entry in your calendar.') }} {{ t('polls', 'Opt in to the calendars, which should be checked.') }} <div v-for="(calendar) in calendarChoices" :key="calendar.key" class="calendar-item"> - <input :id="'calendar_' + calendar.key" - v-model="calendar.selected" - type="checkbox" - class="checkbox" - @click="clickedCalendar(calendar)"> - <label :for="'calendar_' + calendar.key" class="calendar-checkbox"> - <span class="bully" :style="{ backgroundColor: calendar.displayColor }" /> - <span>{{ calendar.name }}</span> - </label> + <CheckBoxDiv v-model="calendar.selected" :label="calendar.name" + @input="clickedCalendar(calendar)"> + <template #before> + <span class="bully" :style="{ backgroundColor: calendar.displayColor }" /> + </template> + </CheckBoxDiv> </div> </div> </div> <div class="user_settings"> - <input id="defaultViewTextPoll" v-model="defaultViewTextPoll" - type="checkbox" class="checkbox"> - <label for="defaultViewTextPoll">{{ t('polls', 'Text polls default to list view') }}</label> + <CheckBoxDiv v-model="defaultViewTextPoll" :label="t('polls', 'Text polls default to list view')" /> <div class="settings_details"> {{ t('polls', 'Check this, if you prefer to display text poll in a vertical aligned list rather than in the grid view. The initial default is list view.') }} </div> </div> <div class="user_settings"> - <input id="defaultViewDatePoll" v-model="defaultViewDatePoll" - type="checkbox" class="checkbox"> - <label for="defaultViewDatePoll">{{ t('polls', 'Date polls default to list view') }}</label> + <CheckBoxDiv v-model="defaultViewDatePoll" :label="t('polls', 'Date polls default to list view')" /> <div class="settings_details"> {{ t('polls', 'Check this, if you prefer to display date poll in a vertical view rather than in the grid view. The initial default is grid view.') }} </div> @@ -67,10 +58,15 @@ <script> import { mapState } from 'vuex' +import CheckBoxDiv from '../Base/CheckBoxDiv' export default { name: 'FeatureSettings', + components: { + CheckBoxDiv, + }, + props: { show: { type: Boolean, diff --git a/src/js/components/SideBar/SideBar.vue b/src/js/components/SideBar/SideBar.vue index 073f1dbc2..9b7d3318b 100644 --- a/src/js/components/SideBar/SideBar.vue +++ b/src/js/components/SideBar/SideBar.vue @@ -49,7 +49,7 @@ <SideBarTabShare /> </AppSidebarTab> - <AppSidebarTab :id="'comments'" + <AppSidebarTab v-if="acl.allowComment" :id="'comments'" :order="4" :name="t('polls', 'Comments')" icon="icon-comment"> diff --git a/src/js/components/SideBar/SideBarTabConfiguration.vue b/src/js/components/SideBar/SideBarTabConfiguration.vue index 38da6f2ae..2819a0d31 100644 --- a/src/js/components/SideBar/SideBarTabConfiguration.vue +++ b/src/js/components/SideBar/SideBarTabConfiguration.vue @@ -37,58 +37,25 @@ </ConfigBox> <ConfigBox :title="t('polls', 'Poll configurations')" icon-class="icon-category-customization"> - <input id="allowMaybe" - v-model="pollAllowMaybe" - type="checkbox" - class="checkbox"> - <label for="allowMaybe"> {{ t('polls', 'Allow "maybe" vote') }}</label> + <CheckBoxDiv v-model="pollAllowComment" :label="t('polls', 'Allow Comments')" /> + <CheckBoxDiv v-model="pollAllowMaybe" :label="t('polls', 'Allow \'maybe\' vote')" /> + <div v-if="(useVoteLimit || useOptionLimit) && pollAllowMaybe" class="indented warning"> - {{ t('polls', 'If vote limits are used, "maybe" shouldn\'t be allowed.') }} - </div> - <input id="anonymous" - v-model="pollAnonymous" - type="checkbox" - class="checkbox"> - <label for="anonymous"> {{ t('polls', 'Anonymous poll') }}</label> - - <input id="useVoteLimit" - v-model="useVoteLimit" - type="checkbox" - class="checkbox"> - <label for="useVoteLimit"> {{ t('polls', 'Limit yes votes per user') }}</label> - - <div v-if="pollVoteLimit" class="selectUnit indented"> - <Actions> - <ActionButton icon="icon-play-previous" @click="pollVoteLimit--"> - {{ t('polls', 'Decrease unit') }} - </ActionButton> - </Actions> - <input v-model="pollVoteLimit"> - <Actions> - <ActionButton icon="icon-play-next" @click="pollVoteLimit++"> - {{ t('polls', 'Increase unit') }} - </ActionButton> - </Actions> + {{ t('polls', 'If vote limits are used, \'maybe\' shouldn\'t be allowed.') }} </div> - <input id="useOptionLimit" - v-model="useOptionLimit" - type="checkbox" - class="checkbox"> - <label for="useOptionLimit"> {{ t('polls', 'Limit yes votes per option') }}</label> - <div v-if="pollOptionLimit" class="selectUnit indented"> - <Actions> - <ActionButton icon="icon-play-previous" @click="pollOptionLimit--"> - {{ t('polls', 'Decrease unit') }} - </ActionButton> - </Actions> - <input v-model="pollOptionLimit"> - <Actions> - <ActionButton icon="icon-play-next" @click="pollOptionLimit++"> - {{ t('polls', 'Increase unit') }} - </ActionButton> - </Actions> - </div> + <CheckBoxDiv v-model="pollAnonymous" :label="t('polls', 'Anonymous poll')" /> + <CheckBoxDiv v-model="useVoteLimit" :label="t('polls', 'Limit yes votes per user')" /> + <InputDiv v-if="pollVoteLimit" v-model="pollVoteLimit" class="selectUnit indented" + use-num-modifiers + @add="pollVoteLimit++" + @subtract="pollVoteLimit--" /> + + <CheckBoxDiv v-model="useOptionLimit" :label="t('polls', 'Limit yes votes per option')" /> + <InputDiv v-if="pollOptionLimit" v-model="pollOptionLimit" class="selectUnit indented" + use-num-modifiers + @add="pollOptionLimit++" + @subtract="pollOptionLimit--" /> </ConfigBox> <ConfigBox :title="t('polls', 'Poll closing status')" :icon-class="closed ? 'icon-polls-closed' : 'icon-polls-open'"> @@ -96,65 +63,19 @@ :icon="closed ? 'icon-polls-open' : 'icon-polls-closed'" :title="closed ? t('polls', 'Reopen poll'): t('polls', 'Close poll')" @click="switchClosed()" /> - - <input v-show="!closed" - id="expiration" - v-model="pollExpiration" - type="checkbox" - class="checkbox"> - <label v-show="!closed" for="expiration"> {{ t('polls', 'Closing date') }}</label> - + <CheckBoxDiv v-show="!closed" v-model="pollExpiration" :label="t('polls', 'Closing date')" /> <DatetimePicker v-show="pollExpiration && !closed" v-model="pollExpire" v-bind="expirationDatePicker" /> </ConfigBox> <ConfigBox :title="t('polls', 'Access')" icon-class="icon-category-auth"> - <input v-if="acl.isOwner" id="adminAccess" v-model="pollAdminAccess" - type="checkbox" class="checkbox"> - <label v-if="acl.isOwner" for="adminAccess"> {{ t('polls', 'Allow admins to edit this poll') }}</label> - - <input id="hidden" - v-model="pollAccess" - value="hidden" - type="radio" - class="radio"> - <label for="hidden">{{ t('polls', 'Only invited users') }}</label> - - <input id="public" - v-model="pollAccess" - value="public" - type="radio" - class="radio"> - <label for="public">{{ t('polls', 'All users') }}</label> - - <input id="important" - v-model="pollImportant" - :disabled="pollAccess !== 'public'" - type="checkbox" - class="checkbox"> - <label for="important" class="indented"> {{ t('polls', 'Relevant for all users') }}</label> + <CheckBoxDiv v-if="acl.isOwner" v-model="pollAdminAccess" :label="t('polls', 'Allow admins to edit this poll')" /> + <RadioGroupDiv v-model="pollAccess" :options="accessOptions" /> + <CheckBoxDiv v-model="pollImportant" class="indented" :disabled="pollAccess !== 'public'" + :label="t('polls', 'Relevant for all users')" /> </ConfigBox> <ConfigBox :title="t('polls', 'Result display')" icon-class="icon-screen"> - <input id="always" - v-model="pollShowResults" - value="always" - type="radio" - class="radio"> - <label for="always">{{ t('polls', 'Always show results') }}</label> - - <input id="closed" - v-model="pollShowResults" - value="closed" - type="radio" - class="radio"> - <label for="closed">{{ t('polls', 'Hide results until poll is closed') }}</label> - - <input id="never" - v-model="pollShowResults" - value="never" - type="radio" - class="radio"> - <label for="never">{{ t('polls', 'Never show results') }}</label> + <RadioGroupDiv v-model="pollShowResults" :options="pollShowResultsOptions" /> </ConfigBox> <ButtonDiv :icon="poll.deleted ? 'icon-history' : 'icon-delete'" @@ -174,17 +95,21 @@ import { mapGetters, mapState } from 'vuex' import { showSuccess, showError } from '@nextcloud/dialogs' import { emit } from '@nextcloud/event-bus' import moment from '@nextcloud/moment' -import { Actions, ActionButton, DatetimePicker } from '@nextcloud/vue' +import { DatetimePicker } from '@nextcloud/vue' import ConfigBox from '../Base/ConfigBox' +import CheckBoxDiv from '../Base/CheckBoxDiv' +import InputDiv from '../Base/InputDiv' +import RadioGroupDiv from '../Base/RadioGroupDiv' export default { name: 'SideBarTabConfiguration', components: { - Actions, - ActionButton, - DatetimePicker, ConfigBox, + CheckBoxDiv, + DatetimePicker, + InputDiv, + RadioGroupDiv, }, data() { @@ -193,6 +118,15 @@ export default { sidebar: false, titleEmpty: false, setExpiration: false, + accessOptions: [ + { value: 'hidden', label: t('polls', 'Only invited users') }, + { value: 'public', label: t('polls', 'All users') }, + ], + pollShowResultsOptions: [ + { value: 'always', label: t('polls', 'Always show results') }, + { value: 'closed', label: t('polls', 'Hide results until poll is closed') }, + { value: 'never', label: t('polls', 'Never show results') }, + ], } }, @@ -342,6 +276,15 @@ export default { }, }, + pollAllowComment: { + get() { + return this.poll.allowComment + }, + set(value) { + this.writeValue({ allowComment: +value }) + }, + }, + pollAllowMaybe: { get() { return this.poll.allowMaybe diff --git a/src/js/components/Subscription/Subscription.vue b/src/js/components/Subscription/Subscription.vue index c0689db29..86c1205fc 100644 --- a/src/js/components/Subscription/Subscription.vue +++ b/src/js/components/Subscription/Subscription.vue @@ -22,24 +22,34 @@ <template lang="html"> <div class="subscription"> - <input id="subscribe" v-model="subscribe" type="checkbox" - class="checkbox"> - <label v-if="emailAddress" for="subscribe">{{ t('polls', 'Receive notification email on activity to {emailAddress}', {emailAddress: emailAddress}) }}</label> - <label v-else for="subscribe">{{ t('polls', 'Receive notification email on activity') }}</label> + <CheckBoxDiv v-model="subscribe" :label="label" /> </div> </template> <script> import { mapState } from 'vuex' +import CheckBoxDiv from '../Base/CheckBoxDiv' export default { name: 'Subscription', + components: { + CheckBoxDiv, + }, + computed: { ...mapState({ subscribed: state => state.subscription.subscribed, emailAddress: state => state.share.emailAddress, }), + label() { + if (this.emailAddress) { + return t('polls', 'Receive notification email on activity to {emailAddress}', { emailAddress: this.emailAddress }) + } else { + return t('polls', 'Receive notification email on activity') + } + }, + subscribe: { get() { return this.subscribed diff --git a/src/js/components/VoteTable/VoteTableVoteItem.vue b/src/js/components/VoteTable/VoteItem.vue similarity index 87% rename from src/js/components/VoteTable/VoteTableVoteItem.vue rename to src/js/components/VoteTable/VoteItem.vue index 9f8d4d6fc..6ba0cf461 100644 --- a/src/js/components/VoteTable/VoteTableVoteItem.vue +++ b/src/js/components/VoteTable/VoteItem.vue @@ -21,9 +21,10 @@ --> <template> - <div class="vote-table-vote-item" :class="[answer, isConfirmed, { active: isVotable }]"> + <div class="vote-item" :class="[answer, isConfirmed, { active: isVotable }, {currentUser: isCurrentUser}]"> <div v-if="isActive && !isLocked" class="icon" @click="setVote()" /> <div v-else class="icon" /> + <slot name="indicator" /> </div> </template> @@ -31,7 +32,7 @@ import { mapGetters, mapState } from 'vuex' export default { - name: 'VoteTableVoteItem', + name: 'VoteItem', props: { option: { @@ -42,16 +43,14 @@ export default { type: String, default: '', }, - isActive: { - type: Boolean, - default: false, - }, }, computed: { ...mapState({ voteLimit: state => state.poll.voteLimit, optionLimit: state => state.poll.optionLimit, + currentUser: state => state.poll.acl.userId, + allowVote: state => state.poll.acl.allowVote, }), ...mapGetters({ @@ -64,6 +63,14 @@ export default { return this.isActive && this.isValidUser && !this.pollIsClosed && !this.isLocked && !this.isBlocked }, + isActive() { + return this.isCurrentUser && this.allowVote + }, + + isCurrentUser() { + return this.currentUser === this.userId + }, + answer() { return this.$store.getters['poll/votes/getVote']({ option: this.option, @@ -122,7 +129,7 @@ export default { <style lang="scss"> -.vote-table-vote-item { +.vote-item { display: flex; flex: 1; align-items: center; @@ -173,7 +180,7 @@ export default { } } -.theme--dark .vote-table-vote-item { +.theme--dark .vote-item { background-color: var(--color-polls-background-no--dark); &.yes { background-color: var(--color-polls-background-yes--dark); @@ -184,10 +191,17 @@ export default { &.maybe { background-color: var(--color-polls-background-maybe--dark); } + &.active { + background-color: var(--color-main-background); + } } -.vote-table-vote-item.confirmed:not(.yes):not(.maybe) .icon { +.vote-item.confirmed:not(.yes):not(.maybe) .icon { background-image: var(--icon-polls-no); } +.vote-item.confirmed { + background-color: transparent; +} + </style> diff --git a/src/js/components/VoteTable/VoteTable.vue b/src/js/components/VoteTable/VoteTable.vue index b1517af4a..9e334f56a 100644 --- a/src/js/components/VoteTable/VoteTable.vue +++ b/src/js/components/VoteTable/VoteTable.vue @@ -22,7 +22,9 @@ <template lang="html"> <div class="vote-table" :class="[viewMode, { closed: closed }]"> - <div class="vote-table__users fixed"> + <div class="vote-table__users"> + <div class="spacer" /> + <UserItem v-for="(participant) in participants" :key="participant.userId" v-bind="participant" @@ -33,76 +35,45 @@ </ActionButton> </Actions> </UserItem> - </div> - <transition-group name="list" tag="div" class="vote-table__header"> - <VoteTableHeaderItem v-for="(option) in rankedOptions" - :key="option.id" - :option="option" - :class="{ 'confirmed' : option.confirmed }" - :poll-type="poll.type" - :view-mode="viewMode" /> - </transition-group> - - <transition-group v-if="poll.type === 'datePoll' && getCurrentUser() && settings.calendarPeek" - name="list" - tag="div" - class="vote-table__calendar"> - <CalendarPeek - v-for="(option) in rankedOptions" - :key="option.id" - :class="{ 'confirmed' : option.confirmed }" - :option="option" - :open="false" /> - </transition-group> + <div v-if="acl.allowEdit && closed" class="confirm" /> + </div> <div class="vote-table__votes"> - <transition-group v-for="(participant) in participants" - :key="participant.userId" - name="list" - tag="div" - :class=" {currentuser: (participant.userId === acl.userId) }" - class="vote-table__vote-row"> - <VoteTableVoteItem v-for="(option) in rankedOptions" - :key="option.id" - :class="{ 'confirmed' : option.confirmed && poll.closed }" - :user-id="participant.userId" + <div v-for="(option) in rankedOptions" :key="option.id" :class="['vote-column', { 'confirmed' : option.confirmed }]"> + <VoteTableHeaderItem :option="option" :view-mode="viewMode" /> + + <Confirmation v-if="option.confirmed && closed" :option="option" /> + + <Counter v-else :show-maybe="!!poll.allowMaybe" :option="option" - :is-active="acl.userId === participant.userId && acl.allowVote" /> - </transition-group> - </div> + :counter-style="viewMode === 'desktop' ? 'iconStyle' : 'barStyle'" + :show-no="viewMode === 'mobile'" /> + <CalendarPeek v-if="poll.type === 'datePoll' && getCurrentUser() && settings.calendarPeek" :option="option" /> + <div v-for="(participant) in participants" :key="participant.userId" class="vote-item-wrapper" + :class="{currentuser: participant.userId === acl.userId}"> + <VoteItem :user-id="participant.userId" :option="option" /> + </div> - <transition-group v-if="closed" - name="list" - tag="div" - class="vote-table__footer"> - <div v-for="(option) in rankedOptions" - :key="option.id" class="vote-table-footer-item" - :class="{ 'confirmed' : option.confirmed }"> - <Actions v-if="acl.allowEdit" - class="action"> + <Actions v-if="acl.allowEdit && closed" class="action confirm"> <ActionButton v-if="closed" :icon="option.confirmed ? 'icon-polls-confirmed' : 'icon-polls-unconfirmed'" @click="confirmOption(option)"> {{ option.confirmed ? t('polls', 'Unconfirm option') : t('polls', 'Confirm option') }} </ActionButton> </Actions> + <!-- <div v-if="closed" class="vote-table__footer"> + </div> --> </div> - </transition-group> - - <div class="vote-table__footer-blind fixed" /> - - <div class="vote-table__calendar-blind fixed" /> + </div> - <div class="vote-table__header-blind fixed" /> + <!-- --> <Modal v-if="modal"> <div class="modal__content"> <h2>{{ t('polls', 'Do you want to remove {username} from poll?', { username: userToRemove }) }}</h2> <div class="modal__buttons"> - <ButtonDiv :title="t('polls', 'No')" - @click="modal = false" /> - <ButtonDiv :primary="true" :title="t('polls', 'Yes')" - @click="removeUser()" /> + <ButtonDiv :title="t('polls', 'No')" @click="modal = false" /> + <ButtonDiv :primary="true" :title="t('polls', 'Yes')" @click="removeUser()" /> </div> </div> </Modal> @@ -115,7 +86,9 @@ import { showSuccess } from '@nextcloud/dialogs' import { Actions, ActionButton, Modal } from '@nextcloud/vue' import orderBy from 'lodash/orderBy' import CalendarPeek from '../Calendar/CalendarPeek' -import VoteTableVoteItem from './VoteTableVoteItem' +import Counter from '../Base/Counter' +import Confirmation from '../Base/Confirmation' +import VoteItem from './VoteItem' import VoteTableHeaderItem from './VoteTableHeaderItem' import { confirmOption } from '../../mixins/optionMixins' @@ -125,9 +98,11 @@ export default { Actions, ActionButton, CalendarPeek, + Counter, + Confirmation, Modal, VoteTableHeaderItem, - VoteTableVoteItem, + VoteItem, }, mixins: [confirmOption], @@ -169,14 +144,10 @@ export default { }, methods: { - removeUser() { - this.$store.dispatch('poll/votes/deleteUser', { - userId: this.userToRemove, - }) - .then(() => { - showSuccess(t('polls', 'User {userId} removed', { userId: this.userToRemove })) - }) + async removeUser() { this.modal = false + await this.$store.dispatch('poll/votes/deleteUser', { userId: this.userToRemove }) + showSuccess(t('polls', 'User {userId} removed', { userId: this.userToRemove })) this.userToRemove = '' }, @@ -190,283 +161,172 @@ export default { <style lang="scss"> -// use grid .vote-table { - display: grid; - overflow: scroll; - - // define default flex items - .vote-table__users, - .vote-table__header, - .vote-table__calendar, - .vote-table__votes, - .vote-table__footer, - .vote-table__vote-row, - .vote-table-header-item, - .vote-table-vote-item { - display: flex; - } - - .vote-table-header-item, - .calendar-peek, - .vote-table-vote-item, - .vote-table-footer-item { - order: 2; - } - - //set default style for confirmed options - &.closed .confirmed { - &.vote-table-header-item, - &.calendar-peek, - &.vote-table-vote-item, - &.vote-table-footer-item { - order: 1; - flex: 1; - border-radius: 10px; - border: 1px solid var(--color-polls-foreground-yes) !important; - border-top: 1px solid var(--color-polls-foreground-yes) !important; - border-bottom: 1px solid var(--color-polls-foreground-yes) !important; - background-color: var(--color-polls-background-yes) !important; - padding: 8px 2px; + display: flex; + flex: 1; + .user-item, .vote-item-wrapper { + flex: 0; + height: 53px; + min-height: 53px; + border-top: solid 1px var(--color-border-dark); + order: 10; + &.currentuser { + order:5; } } -} -.theme--dark .vote-table.closed .confirmed { - &.vote-table-header-item, - &.calendar-peek, - &.vote-table-vote-item, - &.vote-table-footer-item { - background-color: var(--color-polls-background-yes--dark) !important; - } -} -// justify styles for mobile view -.vote-table.mobile { - grid-template-columns: auto auto 1fr; - grid-template-rows: auto; - grid-template-areas: 'vote calendar header'; - justify-items: stretch; - - .vote-table__header { - grid-area: header; + .vote-table-header-item { + flex: 1; flex-direction: column; + align-items: stretch; + padding: 0 8px; + order:1; } - .vote-table__votes { - grid-area: vote; - .vote-table__vote-row { - flex-direction: column; - } + .confirmation { + order:3; + padding: 4px; } - .vote-table__calendar { - grid-area: calendar; - flex-direction: column; + .counter { + order:3; } + .calendar-peek { - flex-direction: row; - flex: 1; - align-items: center; + order:2; } - .vote-table__header-blind, - .vote-table__users, - .vote-table__vote-row:not(.currentuser), - .vote-table__footer-blind, - .vote-table__footer { - display: none; + .confirm { + height: 45px; + order: 20; } - .vote-table-header-item, - .calendar-peek, - .vote-table-vote-item { - padding-left: 12px; - padding-right: 12px; - border-bottom: 1px solid var(--color-border-dark); - min-height: 3em; - height: 3em; + .spacer { + flex: 1; + order: 1; } - &.closed .confirmed { - margin-top: 8px; - margin-bottom: 8px; - font-weight: bold; - - &.vote-table-vote-item { - border-right: none !important; - border-bottom-right-radius: 0; - border-top-right-radius: 0; - } - - &.calendar-peek{ - border-left: none !important; - border-right: none !important; - border-radius: 0; - } - - &.vote-table-header-item { - border-left: none !important; - border-bottom-left-radius: 0; - border-top-left-radius: 0; + .vote-table__users { + display: flex; + flex-direction: column; + overflow-x: scroll; + min-width: 90px; + .user-item__name { + min-width: initial; } + // margin-bottom: 8px; + // padding: 8px 0; } -} -.vote-table.desktop { - grid-template-columns: auto repeat(var(--polls-vote-columns), 1fr); - grid-template-rows: auto repeat(var(--polls-vote-rows), 1fr) auto; - grid-template-areas: - 'blind1 options' - 'blind2 calendar' - 'users vote' - 'blind3 footer'; - justify-items: stretch; - padding-bottom: 14px; // leave space for the scrollbar! - - .vote-table__header { - grid-area: options; - flex-direction: row; - - .vote-table-header-item { - flex-direction: column; - flex: 1; - align-items: center; - } + .vote-table__votes { + display: flex; + flex: 1; + overflow-x: scroll; } - .vote-table__calendar { - grid-area: calendar; - flex-direction: row; - - .calendar-peek { + .vote-column { + order: 2; + display: flex; + flex: 1 0 auto; + flex-direction: column; + align-items: stretch; + min-width: 85px; + max-width: 280px; + // padding: 8px 0; + .vote-item { flex-direction: column; - flex: 1; - align-items: center; } } - .vote-table__header-blind { - grid-area: blind1; + &.closed .vote-table__users { + padding: 8px 2px; } - .vote-table__calendar-blind { - grid-area: blind2; - } - - .vote-table__footer-blind { - grid-area: blind3; - } - - .vote-table__votes { - grid-area: vote; - flex-direction: column; - - .vote-table__vote-row { - flex-direction: row; + &.closed .vote-column { + padding: 8px 2px; + &.confirmed { order: 1; - flex: 1; - min-height: 45px; - - &.currentuser { - order: 0; - } + border-radius: 10px; + border: 1px solid var(--color-polls-foreground-yes); + background-color: var(--color-polls-background-yes); + margin: 0 4px; } } - .vote-table__users { - grid-area: users; - flex-direction: column; - > .user-item { - order: 1; - min-height: 45px; - &.currentuser { - order: 0; - } - } + .vote-item-wrapper { + display: flex; + padding: 4px 1px; } .vote-table__footer { - grid-area: footer; - flex-direction: row; - - .vote-table-footer-item { - display: flex; - flex: 1; - align-items: center; - justify-content: center; - } + align-items: center; } +} - // fixed column - .fixed { - background-color: var(--color-main-background); - position: sticky; - left: 0; - } +.vote-table.mobile { + flex-direction: column; - // Bottom border for table rows - .vote-table__users .user-item, - .vote-table__header-blind, - .vote-table__header > div, - .vote-table__vote-row > div { - border-bottom: 1px solid var(--color-border-dark); + .counter { + position: absolute; + bottom: 0; + width: 100%; + padding-left: 40px; } .option-item { - .option-item__option--datebox { - min-width: 80px; - } - .option-item__option--text { - hyphens: auto; - text-align: center; - align-items: center; - // hack for the hyphens, because hyphenating works different - // in different browsers and with different languages. - min-width: 160px; - } + padding: 8px 4px; } - &.closed .confirmed { - margin-left: 8px; - margin-right: 8px; - font-weight: bold; + .vote-item-wrapper.currentuser { + border: none; + } - &.vote-table-header-item { - border-bottom: none !important; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; + .vote-column { + flex-direction: row-reverse; + align-items: center; + max-width: initial; + position: relative; + border-top: solid 1px var(--color-border); + padding: 0; + } + &.closed .vote-column { + padding: 2px 8px; + &.confirmed { + margin: 4px 0; } + } - &.calendar-peek { - border-bottom: none !important; - border-top: none !important; - border-radius: 0; - } + .vote-table__votes { + align-items: stretch; + flex-direction: column; + } - &.vote-table-vote-item { - border-top: none !important; - border-bottom: none !important; - border-radius: 0; - } + .vote-table__users { + margin: 0 + } - &.vote-table-footer-item { - border-top: none !important; - border-top-left-radius: 0; - border-top-right-radius: 0; - } + .vote-table-header-item { + flex-direction: row; } - // some little hacks - .user-item { - max-width: 280px; + .user-item.user.currentuser, .vote-item-wrapper.currentuser { + display: flex; } - @media (max-width: 576px) { - .vote-table.desktop .user-item__name { - display: none; - } + .user-item.user, .vote-item-wrapper { + display: none; + } + .calendar-peek { + order: 0; + } + .calendar-peek__conflict.icon { + width: 24px; + height: 24px; } +} +.theme--dark .closed .confirmed { + background-color: var(--color-polls-background-yes--dark) !important; } </style> diff --git a/src/js/components/VoteTable/VoteTableHeaderItem.vue b/src/js/components/VoteTable/VoteTableHeaderItem.vue index 98cc0e7bc..35ef80dda 100644 --- a/src/js/components/VoteTable/VoteTableHeaderItem.vue +++ b/src/js/components/VoteTable/VoteTableHeaderItem.vue @@ -24,27 +24,18 @@ <div class="vote-table-header-item" :class=" { winner: isWinner }"> <OptionItem :option="option" :display="optionStyle" /> - <Confirmation v-if="isConfirmed" :option="option" /> - <Counter v-else :show-maybe="Boolean(poll.allowMaybe)" - :option="option" - :counter-style="counterStyle" - :show-no="showNo" /> </div> </template> <script> import { mapState, mapGetters } from 'vuex' import OptionItem from '../Options/OptionItem' -import Counter from '../Base/Counter' -import Confirmation from '../Base/Confirmation' export default { name: 'VoteTableHeaderItem', components: { OptionItem, - Counter, - Confirmation, }, props: { @@ -89,7 +80,7 @@ export default { isWinner() { // highlight best option until poll is closed and // at least one option is confirmed - return this.option.yes + this.option.maybe > 0 && this.option.rank === 1 && !(this.closed && this.confirmedOptions.length) + return this.option.rank === 1 && this.option.yes && !(this.closed && this.confirmedOptions.length) }, isConfirmed() { @@ -110,10 +101,6 @@ export default { color: var(--color-polls-foreground-yes); } } - .option-item { - flex: 1; - align-items: flex-start; - } } .confirmations { @@ -121,22 +108,4 @@ export default { height: 2em; } -.mobile { - .vote-table-header-item { - flex-direction: column; - &.confirmed { - flex-direction: row; - } - } - .counter { - order: 2; - } - - .confirmation { - background-position: left; - order: 0; - padding: 0 15px; - } -} - </style> diff --git a/src/js/store/modules/poll.js b/src/js/store/modules/poll.js index 2ee542bd7..a479fc429 100644 --- a/src/js/store/modules/poll.js +++ b/src/js/store/modules/poll.js @@ -42,6 +42,7 @@ const defaultPoll = () => { deleted: 0, access: 'hidden', anonymous: 0, + allowComment: 0, allowMaybe: 0, voteLimit: 0, optionLimit: 0, @@ -139,7 +140,7 @@ const actions = { context.commit('reset') }, - get(context, payload) { + get(context) { let endPoint = 'apps/polls' if (context.rootState.route.name === 'publicVote') { @@ -158,7 +159,7 @@ const actions = { return response }) .catch((error) => { - console.debug('Error loading poll', { error: error.response }, { payload: payload }) + console.debug('Error loading poll', { error: error.response }) throw error }) }, diff --git a/src/js/store/modules/settings.js b/src/js/store/modules/settings.js index 29ab512bc..5b4ba9209 100644 --- a/src/js/store/modules/settings.js +++ b/src/js/store/modules/settings.js @@ -35,6 +35,7 @@ const defaultSettings = () => { glassySidebar: false, defaultViewTextPoll: 'mobile', defaultViewDatePoll: 'desktop', + realTimePolling: false, }, availableCalendars: [], viewModes: [ @@ -71,6 +72,7 @@ const actions = { return axios.get(generateUrl(endPoint)) .then((response) => { + console.debug('settings loaded ') context.commit('setPreference', response.data.preferences) }) .catch(() => { diff --git a/src/js/store/modules/subModules/comments.js b/src/js/store/modules/subModules/comments.js index 83a79fe46..7595ee8e1 100644 --- a/src/js/store/modules/subModules/comments.js +++ b/src/js/store/modules/subModules/comments.js @@ -62,7 +62,7 @@ const getters = { } const actions = { - list(context, payload) { + list(context) { let endPoint = 'apps/polls' if (context.rootState.route.name === 'publicVote') { diff --git a/src/js/store/modules/subModules/options.js b/src/js/store/modules/subModules/options.js index 91894b1e0..62a063663 100644 --- a/src/js/store/modules/subModules/options.js +++ b/src/js/store/modules/subModules/options.js @@ -148,6 +148,7 @@ const actions = { pollId: context.rootState.route.params.id, timestamp: payload.timestamp, pollOptionText: payload.pollOptionText, + duration: payload.duration, }) .then((response) => { context.commit('setItem', { option: response.data.option }) @@ -164,6 +165,7 @@ const actions = { return axios.put(generateUrl(endPoint + '/' + payload.option.id), { timestamp: payload.option.timestamp, pollOptionText: payload.option.timeStamp, + duration: payload.option.duration, }) .then((response) => { context.commit('setItem', { option: response.data.option }) diff --git a/src/js/store/modules/subModules/votes.js b/src/js/store/modules/subModules/votes.js index c7d9b4ef8..ce12cd6fd 100644 --- a/src/js/store/modules/subModules/votes.js +++ b/src/js/store/modules/subModules/votes.js @@ -117,7 +117,7 @@ const getters = { } const actions = { - list(context, payload) { + list(context) { let endPoint = 'apps/polls' if (context.rootState.route.name === 'publicVote') { diff --git a/src/js/views/Vote.vue b/src/js/views/Vote.vue index abe4147f5..29ab48afc 100644 --- a/src/js/views/Vote.vue +++ b/src/js/views/Vote.vue @@ -21,7 +21,7 @@ --> <template> - <AppContent :class="{ closed: closed }"> + <AppContent :class="[{ closed: closed }, poll.type]"> <div class="header-actions"> <Actions> <ActionButton :icon="sortIcon" @click="ranked = !ranked"> @@ -34,7 +34,7 @@ </ActionButton> </Actions> <Actions> - <ActionButton icon="icon-polls-sidebar-toggle" @click="toggleSideBar()"> + <ActionButton v-if="acl.allowEdit || poll.allowComment" icon="icon-polls-sidebar-toggle" @click="toggleSideBar()"> {{ t('polls', 'Toggle Sidebar') }} </ActionButton> </Actions> @@ -94,6 +94,8 @@ </template> <script> +import axios from '@nextcloud/axios' +import { generateUrl } from '@nextcloud/router' import linkifyUrls from 'linkify-urls' import { mapState, mapGetters } from 'vuex' import { Actions, ActionButton, AppContent, EmptyContent } from '@nextcloud/vue' @@ -128,12 +130,15 @@ export default { data() { return { - voteSaved: false, + cancelToken: null, delay: 50, isLoading: false, - ranked: false, manualViewDatePoll: '', manualViewTextPoll: '', + ranked: false, + voteSaved: false, + watching: true, + lastUpdated: Math.round(Date.now() / 1000), } }, @@ -277,7 +282,6 @@ export default { return true } else if (this.$route.name === 'publicVote' && window.matchMedia('(prefers-color-scheme: dark)').matches) { document.body.classList.add('theme--dark') - return true } if (getCurrentUser() && this.$route.name === 'publicVote') { @@ -292,9 +296,12 @@ export default { } else { emit('toggle-sidebar', { open: (window.innerWidth > 920) }) } + this.watchPoll() }, beforeDestroy() { + console.debug('destroy votes') + this.cancelToken.cancel() this.$store.dispatch({ type: 'poll/reset' }) }, @@ -331,11 +338,68 @@ export default { } } }, + + async watchPoll() { + console.debug('polls', 'Watch for updates') + + this.cancelToken = axios.CancelToken.source() + let endPoint = 'apps/polls' + + if (this.$route.name === 'publicVote') { + endPoint = endPoint + '/s/' + this.$route.params.token + } else if (this.$route.name === 'vote') { + endPoint = endPoint + '/poll/' + this.$route.params.id + } else { + this.watching = false + } + + while (this.watching) { + try { + const response = await axios.get(generateUrl(endPoint + '/watch'), { + params: { offset: this.lastUpdated }, + cancelToken: this.cancelToken.token, + }) + console.debug('polls', 'update detected', response.data.updates) + response.data.updates.forEach((item) => { + this.lastUpdated = (item.updated > this.lastUpdated) ? item.updated : this.lastUpdated + if (item.table === 'polls') { + this.$store.dispatch('poll/get') + } else { + this.$store.dispatch('poll/' + item.table + '/list') + } + }) + this.watching = true + } catch (error) { + this.watching = false + if (axios.isCancel(error)) { + console.debug('Watch canceld') + } else if (error.response) { + if (error.response.status === 304) { + this.watching = true + } else if (error.response.status === 503) { + console.debug('Server not available, reconnect watch in 30 sec') + await new Promise(resolve => setTimeout(resolve, 30000)) + this.watching = true + } else { + console.error('Unhandled error watching polls', error) + } + } else if (error.request) { + console.debug('Watch aborted') + this.watching = true + } + } + } + }, }, } + </script> <style lang="scss" scoped> +.description { + white-space: pre-wrap; +} + .header-actions { display: flex; justify-content: flex-end; diff --git a/tests/Unit/Db/VoteMapperTest.php b/tests/Unit/Db/VoteMapperTest.php index 0af17a0d2..7dedb2eac 100644 --- a/tests/Unit/Db/VoteMapperTest.php +++ b/tests/Unit/Db/VoteMapperTest.php @@ -55,9 +55,6 @@ class VoteMapperTest extends UnitTestCase { /** @var array */ private $votes = []; - /** @var array */ - private $users = []; - /** * {@inheritDoc} */