diff --git a/.eslintrc.js b/.eslintrc.js index 1419f87dfe..d8b08a420b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,5 @@ module.exports = { + 'root': true, 'globals': { 'gettext': true, 'ngettext': true, @@ -44,5 +45,5 @@ module.exports = { 'react': { 'version': 'detect' } - } + }, } diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ee73ab2200..71a863fa51 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,32 +1,82 @@ version: 2 updates: - - package-ecosystem: pip - directory: / - schedule: - interval: monthly - open-pull-requests-limit: 10 - target-branch: dependency-updates - labels: - - dependencies - - python - - type:maintenance - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - open-pull-requests-limit: 10 - target-branch: dependency-updates - labels: - - dependencies - - github_actions - - type:maintenance - - package-ecosystem: npm - directory: / - schedule: - interval: monthly - open-pull-requests-limit: 10 - target-branch: dependency-updates - labels: - - dependencies - - javascript - - type:maintenance +- package-ecosystem: pip + directory: / + schedule: + interval: monthly + open-pull-requests-limit: 10 + target-branch: dependency-updates + labels: + - dependencies + - python + - type:maintenance + ignore: + - dependency-name: django-mptt # pinned, 0.15 requires Python >= 3.9 + groups: + # create a single pull request containing all updates for the optional dependencies + optional: + patterns: + - coveralls + - django-allauth + - django-auth-ldap + - gunicorn + - mysqlclient + - pre-commit + - psycopg* + - pytest* + # create a single pull request containing all updates for django related dependencies + django: + patterns: + - django* + - drf* +- package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + open-pull-requests-limit: 10 + target-branch: dependency-updates + labels: + - dependencies + - github_actions + - type:maintenance + groups: + # create a single pull request containing all updates for GitHub Actions + github-actions: + patterns: + - '*' +- package-ecosystem: npm + directory: / + schedule: + interval: monthly + open-pull-requests-limit: 10 + target-branch: dependency-updates + labels: + - dependencies + - javascript + - type:maintenance + ignore: + - dependency-name: react-bootstrap # rdmo still uses bootstrap 3, which is not supported by react-bootstrap > 0.33.1 + - dependency-name: "*" + update-types: ["version-update:semver-patch"] # ignore patch versions for all JavaScript dependencies + groups: + react: + patterns: + - react* + redux: + patterns: + - redux* + babel: + patterns: + - '@babel*' + - babel* + webpack: + patterns: + - webpack* + - copy-webpack-plugin + eslint: + patterns: + - eslint* + prod-dependencies: + dependency-type: production + dev-dependencies: + dependency-type: development diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 369086b358..76db1baa79 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,8 @@ jobs: with: python-version: "3.12" cache: pip - - run: python -m pip install --upgrade pip setuptools wheel - - run: python -m pip install -e .[dev] + - run: python -m pip install --upgrade pip + - run: python -m pip install --editable .[dev] - name: Set up pre-commit cache uses: actions/cache@v3 with: @@ -64,17 +64,17 @@ jobs: - name: Install Dependencies run: | sudo apt update - sudo apt install --yes pandoc texlive-xetex - python -m pip install --upgrade pip setuptools wheel + sudo apt install --yes pandoc texlive-xetex librsvg2-bin + python -m pip install --upgrade pip pandoc --version - name: Install rdmo[mysql] and start mysql run: | - python -m pip install -e .[ci,mysql] + python -m pip install --editable .[ci,mysql] sudo systemctl start mysql.service if: matrix.db-backend == 'mysql' - name: Install rdmo[postgres] and start postgresql run: | - python -m pip install -e .[ci,postgres] + python -m pip install --editable .[ci,postgres] sudo systemctl start postgresql.service pg_isready sudo -u postgres psql --command="CREATE USER postgres_user PASSWORD 'postgres_password' CREATEDB" @@ -92,6 +92,30 @@ jobs: GITHUB_DB_BACKEND: ${{ matrix.db-backend }} COVERALLS_FLAG_NAME: '${{ matrix.db-backend }}: ${{ matrix.python-version }}' COVERALLS_PARALLEL: true + # end-to-end tests + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: npm + if: matrix.python-version == '3.12' && matrix.db-backend == 'postgres' + - name: Install e2e tests dependencies + run: | + npm install + npm run build:prod + playwright install chromium + if: matrix.python-version == '3.12' && matrix.db-backend == 'postgres' + - run: mkdir screenshots + - name: Run end-to-end tests + run: pytest -p randomly -p no:cacheprovider --reuse-db --numprocesses=auto --dist=loadscope -m e2e --nomigrations + if: matrix.python-version == '3.12' && matrix.db-backend == 'postgres' + env: + DJANGO_DEBUG: True + GITHUB_DB_BACKEND: ${{ matrix.db-backend }} + - uses: actions/upload-artifact@v3 + with: + name: screenshots + path: screenshots/*.png + if: matrix.python-version == '3.12' && matrix.db-backend == 'postgres' coveralls: name: Indicate completion to coveralls @@ -106,6 +130,59 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + build-wheel: + name: Build python wheel + needs: test + runs-on: ubuntu-22.04 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v4 + - name: Get short commit SHA + id: short-sha + run: echo "sha=$(git rev-parse --short ${{ github.event.pull_request.head.sha }})" >> $GITHUB_OUTPUT + - name: Get current version (MAJOR.MINOR.PATCH) + id: current-version + run: echo "current_version=$(grep -Po '(?<=__version__ = ")[\d\w.]+(?=")' rdmo/__init__.py)" >> $GITHUB_OUTPUT + - name: Generate new version (current version + SHA) + id: new-version + run: echo "new_version=${{ steps.current-version.outputs.current_version }}+${{ steps.short-sha.outputs.sha }}" >> $GITHUB_OUTPUT + - name: Update version in rdmo/__init__.py + run: | + sed -i "s/__version__ = .*/__version__ = \"${{ steps.new-version.outputs.new_version }}\"/" rdmo/__init__.py + - uses: actions/setup-node@v4 + with: + node-version: 18 + cache: npm + - run: npm install + - run: npm run build:prod + - uses: actions/setup-python@v4 + with: + python-version: '3.12' + cache: pip + - run: | + python -m pip install --upgrade pip + python -m pip install .[dev] + - name: Build the wheel + run: python -m build --wheel + - name: Check metadata + run: python -m twine check --strict dist/* + - name: Install package from built wheel + run: python -m pip install --force-reinstall dist/rdmo*.whl + - name: Write info to step summary + run: | + echo -e "# ✓ Wheel successfully built (v${{ steps.new-version.outputs.new_version }})\n\n" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`console" >> $GITHUB_STEP_SUMMARY + echo "$ python -m pip show rdmo" >> $GITHUB_STEP_SUMMARY + python -m pip show rdmo >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + - name: Upload wheel as artifact + uses: actions/upload-artifact@v3 + with: + name: wheel + path: dist/rdmo*.whl + if-no-files-found: error + retention-days: 30 + dev-setup: # Ref: structlog (MIT licensed) name: "Test dev setup on ${{ matrix.os }}" @@ -119,11 +196,11 @@ jobs: with: python-version: "3.12" cache: pip - - run: python -Im pip install -e .[dev] + - run: python -Im pip install --editable .[dev] - run: python -Ic 'import rdmo; print(rdmo.__version__)' - optional-dependencies: - name: Test installation of optional-dependencies + dependencies: + name: Test installation of all dependencies runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -135,24 +212,38 @@ jobs: run: | sudo apt update sudo apt install --yes libldap2-dev libsasl2-dev - - run: python -m pip install --upgrade pip setuptools - - run: python -m pip install .[allauth,ci,dev,gunicorn,ldap,mysql,postgres,pytest] - - run: python -m pip freeze - - run: python -m pip list --outdated - - webpack-build: - name: Test webpack-build - needs: lint - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - run: python -m pip install --upgrade pip + - run: python -m pip install .[allauth,shibboleth,ci,dev,gunicorn,ldap,mysql,postgres,pytest] + - uses: actions/setup-node@v4 with: node-version: 18 cache: npm - run: npm install --dev - - run: npm run build - - run: npm run build:prod + - name: Write info to step summary + run: | + { + echo -e "# ✓ All dependency groups successfully installed in combination\n\n" + echo '
Installed Python packages (dependency tree)' + echo -e "\n\`\`\`console" + echo "$ python -m pipdeptree --local-only --exclude=pip,pipdeptree" + python -m pipdeptree --local-only --exclude=pip,pipdeptree + echo -e "\`\`\`\n
" + echo '
Outdated Python dependencies' + echo -e "\n\`\`\`console" + echo "$ python -m pip list --outdated" + python -m pip list --outdated + echo -e "\`\`\`\n
" + echo '
Installed JavaScript packages (dependency tree)' + echo -e "\n\`\`\`console" + echo "$ npm list --all" + npm list --all + echo -e "\`\`\`\n
" + echo '
Outdated JavaScript dependencies' + echo -e "\n\`\`\`console" + echo "$ npm outdated --long" + npm outdated --long || true + echo -e "\`\`\`\n
" + } >> $GITHUB_STEP_SUMMARY required-checks-pass: if: always() @@ -160,9 +251,9 @@ jobs: - lint - test - coveralls + - build-wheel - dev-setup - - optional-dependencies - - webpack-build + - dependencies runs-on: ubuntu-22.04 steps: - uses: re-actors/alls-green@release/v1 diff --git a/.gitignore b/.gitignore index 91fe3424ff..f5b363cdbf 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ dist .on-save.json rdmo/management/static + +screenshots diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f766a30ec6..de5c983b13 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: hooks: - id: check-hooks-apply - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-ast - id: check-json @@ -21,17 +21,17 @@ repos: - id: trailing-whitespace exclude: \.dot$ - id: debug-statements - - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: v0.0.291 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.6 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - repo: https://github.com/pre-commit/mirrors-eslint - rev: v8.50.0 + rev: v8.54.0 hooks: - id: eslint args: [--fix, --color] additional_dependencies: - - eslint@8.41.0 - - eslint-plugin-react@7.32.2 + - eslint@8.54.0 + - eslint-plugin-react@7.33.2 - react@18.2.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 308e144744..43c05e1bba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ # Changelog +## [RDMO 2.1.0](https://github.com/rdmorganiser/rdmo/compare/2.0.2...2.1.0) (Dec 7, 2023) + +* Refactor progress bar and overview + * Fix the progress bar to consider tabs and conditions correctly + * Show the project progress in the projects overview and the project hierarchy + * Show which pages are fully or partially answered in the overview +* Refactor options + * Allow `textarea` as additional input for options + * Add `view_text` to options to be used in the interview instead of `text` + * Add `help` to options to be shown next to the option in the interview +* Fix grammar issues in automatically generated help text in the interview + * Use generic formulations and a "+" sign + * Remove `verbose_name_plural` field +* Refactor autocomplete widget + * Add `freeautocomplete` which can also store arbitrary inputs + * Fix various issues with autocomplete +* Improve help texts + * Add a custom {more} markdown tag to create a show more/less interaction + * Adjust the styling of details/summary html tags +* Add restricted accounts + * Add `PROJECT_CREATE_RESTRICTED` and `PROJECT_CREATE_GROUPS` to restrict project creation to certain groups + * Add `ACCOUNT_GROUPS` and `SOCIALACCOUNT_GROUPS` to put new user automatically into groups +* Improve new management interface + * Initialize filters with current site + * Show order parameter for ordered many to many fields + * Add current site to new elements + * Fix translation bugs in the new management interface +* Prevent conflicts when users edit the same values simultaneously +* Add order parameter to tasks/issues and views and order accordingly in the project overview +* Add `option_text` and `option_additional_input` to values to be used in templates +* `Value.value` now always returns a string (and not `None`) +* Move GitHub and GitLab to separate repositories +* Fix option set refresh in the interview +* Fix `allauth` issues +* Add front-end tests using playwright +* Improve continuous integration + ## [RDMO 2.0.2](https://github.com/rdmorganiser/rdmo/compare/2.0.1...2.0.2) (Nov 2, 2023) * Fix migration to RDMO 2.0 for PostgreSQL diff --git a/conftest.py b/conftest.py index b62eb83355..7a2d7ec8d9 100644 --- a/conftest.py +++ b/conftest.py @@ -10,29 +10,33 @@ from rdmo.accounts.utils import set_group_permissions +@pytest.fixture(scope="session") +def fixtures(): + allowed_file_stems = { + 'accounts', + 'conditions', + 'domain', + 'groups', + 'options', + 'overlays', + 'projects', + 'questions', + 'sites', + 'tasks', + 'users', + 'views' + } + fixtures = [] + for fixture_dir in settings.FIXTURE_DIRS: + filenames = [filename for filename in Path(fixture_dir).iterdir() if filename.stem in allowed_file_stems] + fixtures.extend(filenames) + return fixtures + + @pytest.fixture(scope='session') -def django_db_setup(django_db_setup, django_db_blocker): +def django_db_setup(django_db_setup, django_db_blocker, fixtures): """Populate database with test data from fixtures directories.""" with django_db_blocker.unblock(): - fixtures = [] - for fixture_dir in settings.FIXTURE_DIRS: - for file in Path(fixture_dir).iterdir(): - if file.stem in [ - 'accounts', - 'conditions', - 'domain', - 'groups', - 'options', - 'overlays', - 'projects', - 'questions', - 'sites', - 'tasks', - 'users', - 'views' - ]: - fixtures.append(file) - call_command('loaddata', *fixtures) set_group_permissions() @@ -49,7 +53,4 @@ def files(settings, tmp_path): @pytest.fixture def json_data(): json_file = Path(settings.BASE_DIR) / 'import' / 'catalogs.json' - json_data = { - 'elements': json.loads(json_file.read_text()) - } - return json_data + return {'elements': json.loads(json_file.read_text())} diff --git a/package-lock.json b/package-lock.json index 9beb3ac46a..510d52f058 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "popper.js": "^1.16.1", "prop-types": "^15.7.2", "react": "^18.2.0", - "react-bootstrap": "~0.33.1", + "react-bootstrap": "0.33.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dom": "^18.2.0", @@ -31,22 +31,31 @@ "redux-thunk": "^2.3.0" }, "devDependencies": { - "@babel/cli": "^7.13.14", - "@babel/core": "^7.13.14", - "@babel/preset-env": "^7.13.12", - "@babel/preset-react": "^7.13.13", - "babel-loader": "^8.2.2", - "copy-webpack-plugin": "^8.1.0", + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.3", + "@babel/preset-env": "^7.23.3", + "@babel/preset-react": "^7.23.3", + "babel-loader": "^9.1.3", + "copy-webpack-plugin": "^11.0.0", "css-loader": "^5.2.0", - "eslint": "^8.41.0", - "eslint-plugin-react": "^7.32.2", + "eslint": "^8.54.0", + "eslint-plugin-react": "^7.33.2", "file-loader": "^6.2.0", "mini-css-extract-plugin": "^1.4.0", "sass": "^1.55.0", "sass-loader": "^11.0.1", - "webpack": "^5.28.0", - "webpack-cli": "^4.6.0", - "webpack-merge": "5.7.3" + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "5.10.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { @@ -62,16 +71,16 @@ } }, "node_modules/@babel/cli": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.10.tgz", - "integrity": "sha512-OygVO1M2J4yPMNOW9pb+I6kFGpQK77HmG44Oz3hg8xQIl5L/2zq+ZohwAdSaqYgVwM0SfmPHZHphH4wR8qzVYw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.8", + "@jridgewell/trace-mapping": "^0.3.17", "commander": "^4.0.1", - "convert-source-map": "^1.1.0", + "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", + "glob": "^7.2.0", "make-dir": "^2.1.0", "slash": "^2.0.0" }, @@ -90,45 +99,52 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", - "convert-source-map": "^1.7.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -138,74 +154,105 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dependencies": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -215,13 +262,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -231,246 +279,239 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -478,9 +519,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -489,12 +530,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -504,14 +545,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -520,32 +561,27 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, "engines": { "node": ">=6.9.0" }, @@ -553,47 +589,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "node_modules/@babel/plugin-syntax-class-properties": { + "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==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -602,46 +628,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -650,14 +667,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -666,50 +682,36 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -718,60 +720,70 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -780,22 +792,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "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==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -807,48 +822,79 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -857,85 +903,131 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -944,13 +1036,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -959,13 +1052,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -974,15 +1068,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -991,13 +1084,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1006,13 +1099,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1021,20 +1116,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "globals": "^11.1.0" + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1043,13 +1132,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1058,13 +1147,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1073,14 +1163,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1089,13 +1178,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1104,14 +1194,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1120,13 +1211,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1135,15 +1229,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1152,13 +1245,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1167,13 +1276,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1182,15 +1292,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1199,16 +1308,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1217,17 +1327,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1236,14 +1343,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1252,28 +1359,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1282,14 +1391,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1298,13 +1407,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1314,12 +1426,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1329,12 +1441,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1344,16 +1456,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1363,12 +1475,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1378,13 +1490,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1394,12 +1506,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1409,12 +1522,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1424,12 +1537,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1439,13 +1552,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1455,12 +1568,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1470,12 +1583,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1485,12 +1598,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1500,12 +1613,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1515,13 +1644,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1530,38 +1659,44 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1571,45 +1706,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1619,33 +1770,31 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1654,6 +1803,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "node_modules/@babel/runtime": { "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", @@ -1678,31 +1833,31 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dependencies": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1711,11 +1866,12 @@ } }, "node_modules/@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2005,23 +2161,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2037,9 +2193,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2052,9 +2208,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2074,12 +2230,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -2101,9 +2257,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -2119,9 +2275,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -2135,9 +2291,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -2145,9 +2301,9 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -2159,17 +2315,17 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz", - "integrity": "sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@lezer/common": { @@ -2299,9 +2455,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/hoist-non-react-statics": { @@ -2414,181 +2570,195 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -2609,9 +2779,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2621,9 +2791,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2654,6 +2824,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -2734,15 +2943,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", @@ -2774,11 +2974,20 @@ "get-intrinsic": "^1.1.3" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -2786,47 +2995,42 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "has-symbols": "^1.0.3" } }, - "node_modules/babel-loader/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "object.assign": "^4.1.0" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, "node_modules/babel-plugin-macros": { @@ -2844,42 +3048,42 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -2934,9 +3138,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -2945,14 +3149,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2968,13 +3175,14 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2989,9 +3197,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001336", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001336.tgz", - "integrity": "sha512-/YxSlBmL7iKXTbIJ48IQTnAOBk7XmWsxhBF1PZLOko5Dt9qc4Pl+84lfqG3Tc4EuavurRn1QLoVJGxY2iSycfw==", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "funding": [ { "type": "opencollective", @@ -3000,6 +3208,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -3096,7 +3308,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { "version": "2.0.16", @@ -3113,10 +3325,10 @@ "node": ">= 6" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "node_modules/concat-map": { @@ -3134,21 +3346,20 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -3158,46 +3369,16 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/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, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "node": ">=10.13.0" } }, "node_modules/core-js": { @@ -3208,28 +3389,18 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", - "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", "dev": true, "dependencies": { - "browserslist": "^4.20.3", - "semver": "7.0.0" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -3369,12 +3540,27 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3428,9 +3614,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.134.tgz", - "integrity": "sha512-OdD7M2no4Mi8PopfvoOuNcwYDJ2mNFxaBfurA6okG3fLBaMcFah9S+si84FhX+FIWLKkdaiHfl4A+5ep/gOVrg==" + "version": "1.4.592", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", + "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -3442,9 +3628,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3455,9 +3641,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -3475,25 +3661,26 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -3501,19 +3688,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3522,10 +3713,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -3579,33 +3792,34 @@ "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -3615,7 +3829,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -3625,9 +3838,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -3641,15 +3853,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -3659,7 +3872,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -3721,9 +3934,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3794,9 +4007,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -3928,12 +4141,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -4013,38 +4226,15 @@ "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4147,32 +4337,113 @@ } }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "find-up": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4196,6 +4467,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -4259,20 +4539,23 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -4299,32 +4582,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -4403,32 +4674,34 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", - "slash": "^3.0.0" + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -4444,9 +4717,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphemer": { @@ -4478,7 +4751,7 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } @@ -4534,6 +4807,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -4542,15 +4827,6 @@ "react-is": "^16.7.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -4564,9 +4840,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -4660,12 +4936,12 @@ } }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/invariant": { @@ -4695,6 +4971,21 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4782,6 +5073,33 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4794,6 +5112,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -4867,6 +5194,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -4879,18 +5215,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -4922,16 +5246,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -4940,6 +5260,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4952,6 +5281,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4967,6 +5315,19 @@ "node": ">=0.10.0" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -5043,12 +5404,6 @@ "node": ">=4" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5174,7 +5529,7 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.merge": { @@ -5282,15 +5637,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -5382,9 +5728,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -5395,18 +5741,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5416,9 +5750,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5521,33 +5855,18 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -6122,15 +6441,15 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/redux": { @@ -6157,6 +6476,26 @@ "redux": "^4" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -6164,9 +6503,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -6181,23 +6520,23 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6207,32 +6546,26 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" @@ -6244,12 +6577,21 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -6335,6 +6677,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -6414,23 +6774,58 @@ } }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -6440,14 +6835,43 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -6495,12 +6919,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -6564,14 +6982,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -6581,28 +6999,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6620,15 +7038,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6683,13 +7092,13 @@ } }, "node_modules/terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -6701,16 +7110,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -6735,9 +7144,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -6808,6 +7217,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -6874,23 +7334,52 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6933,9 +7422,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -6946,34 +7435,34 @@ } }, "node_modules/webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -6993,40 +7482,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -7036,21 +7527,22 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=14" } }, "node_modules/webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -7067,9 +7559,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -7115,18 +7607,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7141,15 +7673,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7184,6 +7707,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -7194,491 +7723,381 @@ } }, "@babel/cli": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.10.tgz", - "integrity": "sha512-OygVO1M2J4yPMNOW9pb+I6kFGpQK77HmG44Oz3hg8xQIl5L/2zq+ZohwAdSaqYgVwM0SfmPHZHphH4wR8qzVYw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.8", + "@jridgewell/trace-mapping": "^0.3.17", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", - "convert-source-map": "^1.1.0", + "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", + "glob": "^7.2.0", "make-dir": "^2.1.0", "slash": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==" }, "@babel/core": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", - "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.10", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.10", - "@babel/types": "^7.17.10", - "convert-source-map": "^1.7.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + } } }, "@babel/generator": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", - "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "requires": { - "@babel/types": "^7.17.10", - "@jridgewell/gen-mapping": "^0.1.0", + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.15" } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", - "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", - "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.23.0" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" } }, "@babel/helper-replace-supers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", - "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-member-expression-to-functions": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==" }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" } }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" } }, "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz", - "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==" + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", - "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", - "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", - "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", - "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", - "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.6", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", - "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", - "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", - "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", - "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", - "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", - "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.16.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", - "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.10", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", - "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", - "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - } + "requires": {} }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -7722,7 +8141,34 @@ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -7735,11 +8181,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -7814,393 +8260,563 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", - "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", - "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", - "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", - "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", - "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" } }, "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", - "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", - "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", - "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", - "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", - "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", - "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", - "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", - "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz", - "integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", - "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", - "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", - "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.22.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", - "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "requires": { - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", - "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-spread": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", - "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", - "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", - "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/preset-env": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", - "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-async-generator-functions": "^7.16.8", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-class-static-block": "^7.17.6", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-json-strings": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.17.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -8210,74 +8826,94 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.7", - "@babel/plugin-transform-async-to-generator": "^7.16.8", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.16.7", - "@babel/plugin-transform-classes": "^7.16.7", - "@babel/plugin-transform-computed-properties": "^7.16.7", - "@babel/plugin-transform-destructuring": "^7.17.7", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.16.7", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.16.7", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.16.7", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.16.7", - "@babel/plugin-transform-modules-commonjs": "^7.17.9", - "@babel/plugin-transform-modules-systemjs": "^7.17.8", - "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", - "@babel/plugin-transform-new-target": "^7.16.7", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.16.7", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.17.9", - "@babel/plugin-transform-reserved-words": "^7.16.7", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.16.7", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.16.7", - "@babel/plugin-transform-typeof-symbol": "^7.16.7", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.17.10", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "@babel/runtime": { "version": "7.20.13", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", @@ -8296,38 +8932,39 @@ } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.10.tgz", - "integrity": "sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.10", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.10", - "@babel/types": "^7.17.10", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "requires": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz", - "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -8575,20 +9212,20 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -8598,9 +9235,9 @@ }, "dependencies": { "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8609,9 +9246,9 @@ } }, "@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true }, "@floating-ui/core": { @@ -8628,12 +9265,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } @@ -8645,9 +9282,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@jridgewell/gen-mapping": { @@ -8660,9 +9297,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" }, "@jridgewell/set-array": { "version": "1.1.0", @@ -8670,9 +9307,9 @@ "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -8680,9 +9317,9 @@ }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", @@ -8693,17 +9330,17 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz", - "integrity": "sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@lezer/common": { @@ -8824,9 +9461,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/hoist-non-react-statics": { @@ -8921,172 +9558,176 @@ "codemirror": "^6.0.0" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "envinfo": "^7.7.3" - } + "requires": {} }, "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "requires": {} }, @@ -9103,15 +9744,15 @@ "dev": true }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -9134,6 +9775,35 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -9194,12 +9864,6 @@ "is-string": "^1.0.7" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "array.prototype.flatmap": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", @@ -9225,6 +9889,30 @@ "get-intrinsic": "^1.1.3" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -9232,35 +9920,13 @@ "dev": true }, "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "requires": { - "object.assign": "^4.1.0" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" } }, "babel-plugin-macros": { @@ -9274,33 +9940,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.4.3" } }, "balanced-match": { @@ -9346,15 +10012,14 @@ } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" } }, "buffer-from": { @@ -9364,13 +10029,14 @@ "dev": true }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "callsites": { @@ -9379,9 +10045,9 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "caniuse-lite": { - "version": "1.0.30001336", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001336.tgz", - "integrity": "sha512-/YxSlBmL7iKXTbIJ48IQTnAOBk7XmWsxhBF1PZLOko5Dt9qc4Pl+84lfqG3Tc4EuavurRn1QLoVJGxY2iSycfw==" + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==" }, "chalk": { "version": "2.4.2", @@ -9456,7 +10122,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "colorette": { "version": "2.0.16", @@ -9470,10 +10136,10 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "concat-map": { @@ -9491,47 +10157,26 @@ } }, "copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "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" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "is-glob": "^4.0.3" } } } @@ -9542,21 +10187,12 @@ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "core-js-compat": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz", - "integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", "dev": true, "requires": { - "browserslist": "^4.20.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.22.1" } }, "cosmiconfig": { @@ -9657,12 +10293,24 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -9704,9 +10352,9 @@ } }, "electron-to-chromium": { - "version": "1.4.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.134.tgz", - "integrity": "sha512-OdD7M2no4Mi8PopfvoOuNcwYDJ2mNFxaBfurA6okG3fLBaMcFah9S+si84FhX+FIWLKkdaiHfl4A+5ep/gOVrg==" + "version": "1.4.592", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.592.tgz", + "integrity": "sha512-D3NOkROIlF+d5ixnz7pAf3Lu/AuWpd6AYgI9O67GQXMXTcCP1gJQRotOq35eQy5Sb4hez33XH1YdTtILA7Udww==" }, "emojis-list": { "version": "3.0.0", @@ -9715,9 +10363,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -9725,9 +10373,9 @@ } }, "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true }, "error-ex": { @@ -9739,25 +10387,26 @@ } }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -9765,25 +10414,51 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" + } + }, + "es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "requires": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "es-set-tostringtag": { @@ -9825,30 +10500,31 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9858,7 +10534,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -9868,9 +10543,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -9915,9 +10589,9 @@ "dev": true }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -10003,15 +10677,16 @@ } }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "requires": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -10021,7 +10696,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "dependencies": { @@ -10064,18 +10739,18 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -10132,32 +10807,15 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -10236,24 +10894,72 @@ } }, "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "requires": { - "semver": "^6.0.0" + "find-up": "^6.3.0" } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, @@ -10272,6 +10978,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -10322,20 +11034,20 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -10350,23 +11062,17 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -10421,23 +11127,22 @@ } }, "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", - "slash": "^3.0.0" + "slash": "^4.0.0" }, "dependencies": { "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true } } @@ -10452,9 +11157,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "graphemer": { @@ -10480,7 +11185,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { "version": "1.0.0", @@ -10512,6 +11217,15 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -10520,12 +11234,6 @@ "react-is": "^16.7.0" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -10534,9 +11242,9 @@ "requires": {} }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true }, "immutable": { @@ -10605,9 +11313,9 @@ } }, "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, "invariant": { @@ -10634,6 +11342,15 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10691,6 +11408,24 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10700,6 +11435,12 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -10746,6 +11487,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -10755,12 +11502,6 @@ "call-bind": "^1.0.2" } }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -10780,18 +11521,20 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -10801,6 +11544,22 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -10813,6 +11572,19 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10870,12 +11642,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -10974,7 +11740,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "lodash.merge": { @@ -11060,12 +11826,6 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -11133,9 +11893,9 @@ "dev": true }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "normalize-path": { "version": "3.0.0", @@ -11143,24 +11903,15 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-keys": { @@ -11233,27 +11984,18 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -11663,12 +12405,12 @@ } }, "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "resolve": "^1.9.0" + "resolve": "^1.20.0" } }, "redux": { @@ -11693,6 +12435,20 @@ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "requires": {} }, + "reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -11700,9 +12456,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -11714,49 +12470,43 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" } }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11765,11 +12515,17 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -11819,6 +12575,18 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -11865,14 +12633,44 @@ } }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "semver": { @@ -11881,14 +12679,37 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -11924,12 +12745,6 @@ "object-inspect": "^1.9.0" } }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -11981,36 +12796,36 @@ } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "strip-ansi": { @@ -12022,12 +12837,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12064,13 +12873,13 @@ "dev": true }, "terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -12084,22 +12893,22 @@ } }, "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -12144,6 +12953,42 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -12195,17 +13040,26 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12241,9 +13095,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -12251,41 +13105,41 @@ } }, "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -12296,40 +13150,42 @@ } }, "webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } }, "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "requires": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" } }, @@ -12361,18 +13217,49 @@ "is-symbol": "^1.0.3" } }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wildcard": { @@ -12381,12 +13268,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 578c025533..c9ae26a0b1 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "popper.js": "^1.16.1", "prop-types": "^15.7.2", "react": "^18.2.0", - "react-bootstrap": "~0.33.1", + "react-bootstrap": "0.33.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dom": "^18.2.0", @@ -35,21 +35,21 @@ "redux-thunk": "^2.3.0" }, "devDependencies": { - "@babel/cli": "^7.13.14", - "@babel/core": "^7.13.14", - "@babel/preset-env": "^7.13.12", - "@babel/preset-react": "^7.13.13", - "babel-loader": "^8.2.2", - "copy-webpack-plugin": "^8.1.0", + "@babel/cli": "^7.23.4", + "@babel/core": "^7.23.3", + "@babel/preset-env": "^7.23.3", + "@babel/preset-react": "^7.23.3", + "babel-loader": "^9.1.3", + "copy-webpack-plugin": "^11.0.0", "css-loader": "^5.2.0", - "eslint": "^8.41.0", - "eslint-plugin-react": "^7.32.2", + "eslint": "^8.54.0", + "eslint-plugin-react": "^7.33.2", "file-loader": "^6.2.0", "mini-css-extract-plugin": "^1.4.0", "sass": "^1.55.0", "sass-loader": "^11.0.1", - "webpack": "^5.28.0", - "webpack-cli": "^4.6.0", - "webpack-merge": "5.7.3" + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "5.10.0" } } diff --git a/pyproject.toml b/pyproject.toml index 86cf1dbcfa..f47fd4c758 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,9 @@ dynamic = [ "version", ] dependencies = [ + # dependencies with major version on zero are declared with + # major.minor.patch, because they can potentially introduce breaking changes + # in minor version updates anytime "defusedcsv~=2.0", "defusedxml~=0.7.1", "django~=4.2", @@ -46,7 +49,7 @@ dependencies = [ "django-filter~=23.2", "django-libsass~=0.9", "django-mathfilters~=1.0", - "django-mptt~=0.14.0", + "django-mptt==0.14.0", # pinned, 0.15 requires Python >= 3.9 "django-rest-swagger~=2.2", "django-settings-export~=1.2", "django-split-settings~=1.2", @@ -55,7 +58,9 @@ dependencies = [ "drf-extensions~=0.7.1", "iso8601~=2.0", "markdown~=3.4", + "packaging~=23.2", "pypandoc~=1.11", + "requests-toolbelt~=1.0", "rules~=3.3", ] @@ -63,12 +68,20 @@ dependencies = [ allauth = [ "django-allauth~=0.57.0", ] +shibboleth = [ + "django-shibboleth-remoteuser@git+https://github.com/rdmorganiser/django-shibboleth-remoteuser@v0.11" +] ci = [ "coveralls~=3.3", "rdmo[dev]", ] dev = [ + "build~=1.0", + "pipdeptree~=2.13", "pre-commit~=3.4", + "setuptools~=69.0", + "twine~=4.0", + "wheel~=0.42.0", "rdmo[allauth]", "rdmo[pytest]", ] @@ -89,6 +102,7 @@ pytest = [ "pytest-cov~=4.1", "pytest-django~=4.5", "pytest-mock~=3.11", + "pytest-playwright~=0.4.3", "pytest-randomly~=3.15", "pytest-xdist~=3.3", ] @@ -117,6 +131,7 @@ line-length = 120 select = [ "B", # flake8-bugbear "C4", # flake8-comprehensions + "DJ", # flake8-django "E", # pycodestyle "F", # pyflakes "I", # isort @@ -175,9 +190,12 @@ rest_framework = ["rest_framework"] [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "config.settings" testpaths = ["rdmo"] -python_files = "test_*[!.txt].py" +python_files = "test_*.py" pythonpath = [".", "testing"] -addopts = "-p no:randomly" +addopts = '-p no:randomly -m "not e2e"' +markers = [ + "e2e: marks tests as end-to-end tests using playwright (deselect with '-m \"not e2e\"')", +] filterwarnings = [ # fail on RemovedInDjango50Warning exception "error::django.utils.deprecation.RemovedInDjango50Warning", diff --git a/rdmo/__init__.py b/rdmo/__init__.py index 5e8b7ade92..9aa3f90365 100644 --- a/rdmo/__init__.py +++ b/rdmo/__init__.py @@ -1 +1 @@ -VERSION = __version__ = "2.0.2" +__version__ = "2.1.0" diff --git a/rdmo/accounts/adapter.py b/rdmo/accounts/adapter.py index ccc7bf4d25..efa7902ce4 100644 --- a/rdmo/accounts/adapter.py +++ b/rdmo/accounts/adapter.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.contrib.auth.models import Group from allauth.account.adapter import DefaultAccountAdapter from allauth.socialaccount.adapter import DefaultSocialAccountAdapter @@ -9,8 +10,26 @@ class AccountAdapter(DefaultAccountAdapter): def is_open_for_signup(self, request): return settings.ACCOUNT_SIGNUP + def save_user(self, request, user, form, commit=True): + user = super().save_user(request, user, form, commit) + + if settings.ACCOUNT_GROUPS: + groups = Group.objects.filter(name__in=settings.ACCOUNT_GROUPS) + user.groups.set(groups) + + return user class SocialAccountAdapter(DefaultSocialAccountAdapter): def is_open_for_signup(self, request, sociallogin): return settings.SOCIALACCOUNT_SIGNUP + + def save_user(self, request, sociallogin, form=None): + user = super().save_user(request, sociallogin, form) + + if settings.SOCIALACCOUNT_GROUPS: + provider = str(sociallogin.account.provider) + groups = Group.objects.filter(name__in=settings.SOCIALACCOUNT_GROUPS.get(provider, [])) + user.groups.set(groups) + + return user diff --git a/rdmo/accounts/admin.py b/rdmo/accounts/admin.py index ac5a14342a..1cfede8540 100644 --- a/rdmo/accounts/admin.py +++ b/rdmo/accounts/admin.py @@ -5,14 +5,17 @@ from .models import AdditionalField, AdditionalFieldValue, ConsentFieldValue, Role +@admin.register(AdditionalField) class AdditionalFieldAdmin(admin.ModelAdmin): pass +@admin.register(AdditionalFieldValue) class AdditionalFieldValueAdmin(admin.ModelAdmin): readonly_fields = ('user', ) +@admin.register(ConsentFieldValue) class ConsentFieldValueAdmin(admin.ModelAdmin): readonly_fields = ('user', 'consent') @@ -20,11 +23,12 @@ def has_add_permission(self, request, obj=None): return False +@admin.register(Role) class RoleAdmin(admin.ModelAdmin): search_fields = ('user__username', 'user__email') list_filter = ('member', 'manager', 'editor', 'reviewer') - list_display = ('user', 'members', 'managers', 'editors', 'reviewers') + list_display = ('user', 'email', 'members', 'managers', 'editors', 'reviewers') def get_queryset(self, request): return Role.objects.prefetch_related( @@ -39,6 +43,9 @@ def render_all_sites_or_join(obj, field_name: str) -> str: return 'all Sites' return ', '.join([site.domain for site in getattr(obj, field_name).all()]) + def email(self, obj): + return obj.user.email + def members(self, obj): return self.render_all_sites_or_join(obj, 'member') @@ -50,9 +57,3 @@ def editors(self, obj): def reviewers(self, obj): return self.render_all_sites_or_join(obj, 'reviewer') - - -admin.site.register(AdditionalField, AdditionalFieldAdmin) -admin.site.register(AdditionalFieldValue, AdditionalFieldValueAdmin) -admin.site.register(ConsentFieldValue, ConsentFieldValueAdmin) -admin.site.register(Role, RoleAdmin) diff --git a/rdmo/accounts/migrations/0021_alter_help_text.py b/rdmo/accounts/migrations/0021_alter_help_text.py new file mode 100644 index 0000000000..9431d8fdcb --- /dev/null +++ b/rdmo/accounts/migrations/0021_alter_help_text.py @@ -0,0 +1,63 @@ +# Generated by Django 4.2.6 on 2023-12-04 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0020_add_role_editor_and_reviewer'), + ] + + operations = [ + migrations.AlterField( + model_name='additionalfield', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text to be displayed next to the input element (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text to be displayed next to the input element (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text to be displayed next to the input element (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text to be displayed next to the input element (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text to be displayed next to the input element (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='text_lang1', + field=models.CharField(blank=True, help_text='The text for this additional field (in the primary language).', max_length=256, verbose_name='Text (primary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='text_lang2', + field=models.CharField(blank=True, help_text='The text for this additional field (in the secondary language).', max_length=256, verbose_name='Text (secondary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='text_lang3', + field=models.CharField(blank=True, help_text='The text for this additional field (in the tertiary language).', max_length=256, verbose_name='Text (tertiary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='text_lang4', + field=models.CharField(blank=True, help_text='The text for this additional field (in the quaternary language).', max_length=256, verbose_name='Text (quaternary)'), + ), + migrations.AlterField( + model_name='additionalfield', + name='text_lang5', + field=models.CharField(blank=True, help_text='The text for this additional field (in the quinary language).', max_length=256, verbose_name='Text (quinary)'), + ), + ] diff --git a/rdmo/accounts/models.py b/rdmo/accounts/models.py index 226b81f6af..d9e960f2d5 100644 --- a/rdmo/accounts/models.py +++ b/rdmo/accounts/models.py @@ -21,52 +21,52 @@ class AdditionalField(models.Model, TranslationMixin): text_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (primary)'), - help_text=_('The text for this additional field in the primary language.') + help_text=_('The text for this additional field (in the primary language).') ) text_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (secondary)'), - help_text=_('The text for this additional field in the secondary language.') + help_text=_('The text for this additional field (in the secondary language).') ) text_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (tertiary)'), - help_text=_('The text for this additional field in the tertiary language.') + help_text=_('The text for this additional field (in the tertiary language).') ) text_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (quaternary)'), - help_text=_('The text for this additional field in the quaternary language.') + help_text=_('The text for this additional field (in the quaternary language).') ) text_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (quinary)'), - help_text=_('The text for this additional field in the quinary language.') + help_text=_('The text for this additional field (in the quinary language).') ) help_lang1 = models.TextField( blank=True, verbose_name=_('Help (primary)'), - help_text=_('The help text to be displayed next to the input element in the primary language.') + help_text=_('The help text to be displayed next to the input element (in the primary language).') ) help_lang2 = models.TextField( blank=True, verbose_name=_('Help (secondary)'), - help_text=_('The help text to be displayed next to the input element in the secondary language.') + help_text=_('The help text to be displayed next to the input element (in the secondary language).') ) help_lang3 = models.TextField( blank=True, verbose_name=_('Help (tertiary)'), - help_text=_('The help text to be displayed next to the input element in the tertiary language.') + help_text=_('The help text to be displayed next to the input element (in the tertiary language).') ) help_lang4 = models.TextField( blank=True, verbose_name=_('Help (quaternary)'), - help_text=_('The help text to be displayed next to the input element in the quaternary language.') + help_text=_('The help text to be displayed next to the input element (in the quaternary language).') ) help_lang5 = models.TextField( blank=True, verbose_name=_('Help (quinary)'), - help_text=_('The help text to be displayed next to the input element in the quinary language.') + help_text=_('The help text to be displayed next to the input element (in the quinary language).') ) required = models.BooleanField( verbose_name=_('Required'), diff --git a/rdmo/accounts/templates/socialaccount/login.html b/rdmo/accounts/templates/socialaccount/login.html new file mode 100644 index 0000000000..6fb731a8c5 --- /dev/null +++ b/rdmo/accounts/templates/socialaccount/login.html @@ -0,0 +1,21 @@ +{% extends 'core/page.html' %} +{% load i18n %} + +{% block head_title %}{% trans "Sign In" %}{% endblock %} + +{% block page %} +{% if process == "connect" %} +

{% blocktrans with provider.name as provider %}Connect {{ provider }}{% endblocktrans %}

+ +

{% blocktrans with provider.name as provider %}You are about to connect a new third party account from {{ provider }}.{% endblocktrans %}

+{% else %} +

{% blocktrans with provider.name as provider %}Sign In Via {{ provider }}{% endblocktrans %}

+ +

{% blocktrans with provider.name as provider %}You are about to sign in using a third party account from {{ provider }}.{% endblocktrans %}

+{% endif %} + +
+ {% csrf_token %} + +
+{% endblock %} diff --git a/rdmo/accounts/templates/socialaccount/snippets/provider_list.html b/rdmo/accounts/templates/socialaccount/snippets/provider_list.html index f8f4e278cd..0d95b4b405 100644 --- a/rdmo/accounts/templates/socialaccount/snippets/provider_list.html +++ b/rdmo/accounts/templates/socialaccount/snippets/provider_list.html @@ -24,13 +24,23 @@ ORCID sign in -{% elif provider.id == 'keycloak' %} -
  • - - Keycloak sign in - -
  • +{% elif provider.id == 'openid_connect' %} + {% if provider.app.provider_id == 'keycloak' %} +
  • + + Keycloak sign in + +
  • + {% else %} +
  • + + {{ provider.name }} + +
  • +{% endif %} + {% else %}
  • { + return fetch(baseUrl + url).catch(error => { throw new ApiError(error.message) }).then(response => { if (response.ok) { @@ -28,7 +30,7 @@ class BaseApi { } static post(url, data) { - return fetch(url, { + return fetch(baseUrl + url, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -51,7 +53,7 @@ class BaseApi { } static put(url, data) { - return fetch(url, { + return fetch(baseUrl + url, { method: 'PUT', headers: { 'Content-Type': 'application/json', @@ -74,7 +76,7 @@ class BaseApi { } static delete(url) { - return fetch(url, { + return fetch(baseUrl + url, { method: 'DELETE', headers: { 'Content-Type': 'application/json', @@ -99,7 +101,7 @@ class BaseApi { var formData = new FormData() formData.append('file', file) - return fetch(url, { + return fetch(baseUrl + url, { method: 'POST', headers: { 'X-CSRFToken': Cookies.get('csrftoken') diff --git a/rdmo/core/assets/js/utils/baseUrl.js b/rdmo/core/assets/js/utils/baseUrl.js new file mode 100644 index 0000000000..22a17df960 --- /dev/null +++ b/rdmo/core/assets/js/utils/baseUrl.js @@ -0,0 +1,2 @@ +// take the baseurl from the of the django template +export default document.querySelector('meta[name="baseurl"]').content.replace(/\/+$/, '') diff --git a/rdmo/core/constants.py b/rdmo/core/constants.py index 38a3ae6a45..1e1cbc3a78 100644 --- a/rdmo/core/constants.py +++ b/rdmo/core/constants.py @@ -58,3 +58,22 @@ 'views.add_view', 'views.change_view', 'views.delete_view' ) } + +HUMAN2BYTES_MAPPER = { + "b": {"base": 1000, "power": 0}, + "kb": {"base": 1000, "power": 1}, + "k": {"base": 1000, "power": 1}, + "mb": {"base": 1000, "power": 2}, + "m": {"base": 1000, "power": 2}, + "gb": {"base": 1000, "power": 3}, + "g": {"base": 1000, "power": 3}, + "tb": {"base": 1000, "power": 4}, + "t": {"base": 1000, "power": 4}, + "p": {"base": 1000, "power": 5}, + "pb": {"base": 1000, "power": 5}, + "kib": {"base": 1024, "power": 1}, + "mib": {"base": 1024, "power": 2}, + "gib": {"base": 1024, "power": 3}, + "tib": {"base": 1024, "power": 4}, + "pib": {"base": 1024, "power": 5}, +} diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py index 55125a2ad0..dcd176b4e5 100644 --- a/rdmo/core/settings.py +++ b/rdmo/core/settings.py @@ -98,15 +98,9 @@ ACCOUNT = False ACCOUNT_SIGNUP = False +ACCOUNT_GROUPS = [] ACCOUNT_TERMS_OF_USE = False - -SOCIALACCOUNT = False - -SHIBBOLETH = False -SHIBBOLETH_LOGIN_URL = '/Shibboleth.sso/Login' -SHIBBOLETH_LOGOUT_URL = '/Shibboleth.sso/Logout' -SHIBBOLETH_USERNAME_PATTERN = None - +ACCOUNT_ADAPTER = 'rdmo.accounts.adapter.AccountAdapter' ACCOUNT_SIGNUP_FORM_CLASS = 'rdmo.accounts.forms.SignupForm' ACCOUNT_USER_DISPLAY = 'rdmo.accounts.utils.get_full_name' ACCOUNT_EMAIL_REQUIRED = True @@ -120,11 +114,16 @@ ACCOUNT_PREVENT_ENUMERATION = False ACCOUNT_ALLOW_USER_TOKEN = False -ACCOUNT_ADAPTER = 'rdmo.accounts.adapter.AccountAdapter' - -SOCIALACCOUNT_ADAPTER = 'rdmo.accounts.adapter.SocialAccountAdapter' +SOCIALACCOUNT = False SOCIALACCOUNT_SIGNUP = False +SOCIALACCOUNT_GROUPS = [] SOCIALACCOUNT_AUTO_SIGNUP = False +SOCIALACCOUNT_ADAPTER = 'rdmo.accounts.adapter.SocialAccountAdapter' + +SHIBBOLETH = False +SHIBBOLETH_LOGIN_URL = '/Shibboleth.sso/Login' +SHIBBOLETH_LOGOUT_URL = '/Shibboleth.sso/Logout' +SHIBBOLETH_USERNAME_PATTERN = None LANGUAGE_CODE = 'en-us' @@ -306,6 +305,11 @@ PROJECT_REMOVE_VIEWS = True +PROJECT_CREATE_RESTRICTED = False +PROJECT_CREATE_GROUPS = [] + +PROJECT_VALUES_CONFLICT_THRESHOLD = 0.01 + NESTED_PROJECTS = True OPTIONSET_PROVIDERS = [] @@ -318,6 +322,7 @@ ('radio', _('Radio buttons'), 'rdmo.projects.widgets.RadioWidget'), ('select', _('Select drop-down'), 'rdmo.projects.widgets.SelectWidget'), ('autocomplete', _('Autocomplete'), 'rdmo.projects.widgets.AutocompleteWidget'), + ('freeautocomplete', _('Free autocomplete'), 'rdmo.projects.widgets.FreeAutocompleteWidget'), ('range', _('Range slider'), 'rdmo.projects.widgets.RangeWidget'), ('date', _('Date picker'), 'rdmo.projects.widgets.DateWidget'), ('file', _('File upload'), 'rdmo.projects.widgets.FileWidget') diff --git a/rdmo/core/static/core/css/base.scss b/rdmo/core/static/core/css/base.scss index 5d372c3206..44bf835add 100644 --- a/rdmo/core/static/core/css/base.scss +++ b/rdmo/core/static/core/css/base.scss @@ -75,6 +75,10 @@ a { color: #a94442; } } + + &.disabled { + cursor: not-allowed; + } } code { @@ -129,9 +133,14 @@ table { } } +details { + margin-bottom: 10px; +} + summary { - color: $link-color; + display: list-item; cursor: pointer; + margin-bottom: 5px; } metadata { @@ -183,7 +192,8 @@ metadata { .page h2:nth-child(2) { margin-top: 0; } -.sidebar h2:first-child { +.sidebar h2:first-child, +.sidebar .import-buttons { margin-top: 70px; } @@ -477,3 +487,13 @@ li.has-warning > a.control-label > i { text-decoration: underline; text-decoration-style: dotted; } + +.more, +.show-less { + display: none; +} +.show-more, +.show-less { + color: $link-color; + cursor: pointer; +} diff --git a/rdmo/core/static/core/css/utils.scss b/rdmo/core/static/core/css/utils.scss index b4886451ad..0e45f92470 100644 --- a/rdmo/core/static/core/css/utils.scss +++ b/rdmo/core/static/core/css/utils.scss @@ -1,6 +1,92 @@ +.flip { + transform: rotate(180deg) scaleX(-1); +} + +.w-100 { + width: 100%; +} +.mt-0 { + margin-top: 0; +} +.mt-5 { + margin-top: 5px; +} +.mt-10 { + margin-top: 10px; +} +.mt-20 { + margin-top: 20px; +} +.mr-0 { + margin-right: 0; +} +.mr-5 { + margin-right: 5px; +} +.mr-10 { + margin-right: 10px; +} +.mr-20 { + margin-right: 20px; +} .mb-0 { margin-bottom: 0; } +.mb-5 { + margin-bottom: 5px; +} +.mb-10 { + margin-bottom: 10px; +} .mb-20 { margin-bottom: 20px; } +.ml-0 { + margin-left: 0; +} +.ml-5 { + margin-left: 5px; +} +.ml-10 { + margin-left: 10px; +} +.ml-20 { + margin-left: 20px; +} + +.pt-0 { + padding-top: 0; +} +.pt-10 { + padding-top: 10px; +} +.pt-20 { + padding-top: 20px; +} +.pr-0 { + padding-right: 0; +} +.pr-10 { + padding-right: 10px; +} +.pr-20 { + padding-right: 20px; +} +.pb-0 { + padding-bottom: 0; +} +.pb-10 { + padding-bottom: 10px; +} +.pb-20 { + padding-bottom: 20px; +} +.pl-0 { + padding-left: 0; +} +.pl-10 { + padding-left: 10px; +} +.pl-20 { + padding-left: 20px; +} diff --git a/rdmo/core/static/core/js/core.js b/rdmo/core/static/core/js/core.js index 39f154fc2c..ee790f74fa 100644 --- a/rdmo/core/static/core/js/core.js +++ b/rdmo/core/static/core/js/core.js @@ -16,6 +16,13 @@ angular.module('core', ['ngResource']) method: 'PUT', params: {} }; + $resourceProvider.defaults.actions.postAction = { + method: 'POST', + params: { + id: '@id', + detail_action: '@detail_action' + } + }; }]) .filter('capitalize', function() { diff --git a/rdmo/core/static/core/js/utils.js b/rdmo/core/static/core/js/utils.js new file mode 100644 index 0000000000..8c34a73526 --- /dev/null +++ b/rdmo/core/static/core/js/utils.js @@ -0,0 +1,11 @@ +function showMore(element) { + $(element).siblings('.more').show(); + $(element).siblings('.show-less').show(); + $(element).hide(); +} + +function showLess(element) { + $(element).siblings('.more').hide(); + $(element).siblings('.show-more').show(); + $(element).hide(); +} diff --git a/rdmo/core/templates/core/base.html b/rdmo/core/templates/core/base.html index fbe8dcec9a..d9508e1be9 100644 --- a/rdmo/core/templates/core/base.html +++ b/rdmo/core/templates/core/base.html @@ -20,6 +20,9 @@ {% endblock %} {% block js %} + {% compress js %} + + {% endcompress %} {% endblock %} {% block head %}{% endblock %} diff --git a/rdmo/core/templates/core/upload_form.html b/rdmo/core/templates/core/upload_form.html index 4c7b89b458..c686739e8b 100644 --- a/rdmo/core/templates/core/upload_form.html +++ b/rdmo/core/templates/core/upload_form.html @@ -9,7 +9,7 @@
    - +

    {% trans "Select file" %}

    diff --git a/rdmo/core/tests/test_utils.py b/rdmo/core/tests/test_utils.py index f0d9bfb119..5964a56d50 100644 --- a/rdmo/core/tests/test_utils.py +++ b/rdmo/core/tests/test_utils.py @@ -1,6 +1,8 @@ +from typing import Optional + import pytest -from rdmo.core.utils import join_url, sanitize_url +from rdmo.core.utils import human2bytes, join_url, sanitize_url urls = ( ('', ''), @@ -15,6 +17,12 @@ (1, ''), ) +human2bytes_test_values = ( + ("1Gb", 1e+9), + (None, 0), + ("0", 0), +) + @pytest.mark.parametrize("url,sanitized_url", urls) def test_sanitize_url(url, sanitized_url): @@ -23,3 +31,8 @@ def test_sanitize_url(url, sanitized_url): def test_join_url(): assert join_url('https://example.com//', '/terms', 'foo') == 'https://example.com/terms/foo' + + +@pytest.mark.parametrize("human,bytes", human2bytes_test_values) +def test_human2bytes(human: Optional[str], bytes: float): + assert human2bytes(human) == bytes diff --git a/rdmo/core/utils.py b/rdmo/core/utils.py index 22d9d42b31..fa00d680b2 100644 --- a/rdmo/core/utils.py +++ b/rdmo/core/utils.py @@ -18,6 +18,8 @@ from defusedcsv import csv from markdown import markdown +from .constants import HUMAN2BYTES_MAPPER + log = logging.getLogger(__name__) @@ -107,7 +109,7 @@ def get_model_field_meta(model): meta[field_name]['verbose_name'] = re.sub(r'\(.*\)$', f'({lang})', str(field.verbose_name)) if hasattr(field, 'help_text'): # remove the "in the primary language" part - meta[field_name]['help_text'] = re.sub(r' in the .*$', r'.', str(field.help_text)) + meta[field_name]['help_text'] = re.sub(r' \(.*\).', '.', str(field.help_text)) else: meta[field.name] = {} if hasattr(field, 'verbose_name'): @@ -351,32 +353,15 @@ def copy_model(instance, **kwargs): def human2bytes(string): - if not string: + if not string or string == '0': return 0 m = re.match(r'([0-9.]+)\s*([A-Za-z]+)', string) number, unit = float(m.group(1)), m.group(2).strip().lower() - if unit == 'kb' or unit == 'k': - return number * 1000 - elif unit == 'mb' or unit == 'm': - return number * 1000**2 - elif unit == 'gb' or unit == 'g': - return number * 1000**3 - elif unit == 'tb' or unit == 't': - return number * 1000**4 - elif unit == 'pb' or unit == 'p': - return number * 1000**5 - elif unit == 'kib': - return number * 1024 - elif unit == 'mib': - return number * 1024**2 - elif unit == 'gib': - return number * 1024**3 - elif unit == 'tib': - return number * 1024**4 - elif unit == 'pib': - return number * 1024**5 + conversion = HUMAN2BYTES_MAPPER[unit] + number = number*conversion['base']**(conversion['power']) + return number def is_truthy(value): @@ -384,15 +369,26 @@ def is_truthy(value): def markdown2html(markdown_string): - # adoption of the normal markdown function which also converts - # `[]{}` to <span title="<title>"><string></span> to - # allow for underlined tooltips - html = markdown(force_str(markdown_string)) + # adoption of the normal markdown function + html = markdown(force_str(markdown_string)).strip() + + # convert `[<string>]{<title>}` to <span title="<title>"><string></span> to allow for underlined tooltips html = re.sub( r'\[(.*?)\]\{(.*?)\}', r'<span data-toggle="tooltip" data-placement="bottom" data-html="true" title="\2">\1</span>', html ) + + # convert everything after `{more}` to <span class="more"><string></span> to be shown/hidden on user input + show_string = _('show more') + hide_string = _('show less') + html = re.sub( + r'(\{more\})(.*?)</p>$', + f'<span class="show-more" onclick="showMore(this)">... ({show_string})</span>' + r'<span class="more">\2</span>' + f'<span class="show-less" onclick="showLess(this)"> ({hide_string})</span></p>', + html + ) return html diff --git a/rdmo/core/xml.py b/rdmo/core/xml.py index 6e2c53b82d..5327969433 100644 --- a/rdmo/core/xml.py +++ b/rdmo/core/xml.py @@ -2,6 +2,7 @@ import re import defusedxml.ElementTree as ET +from packaging.version import parse log = logging.getLogger(__name__) @@ -117,12 +118,15 @@ def strip_ns(tag, ns_map): def convert_elements(elements, version): - # in future versions, this method can be extended - # using packaging.version.parse - if version is None: - return convert_legacy_elements(elements) - else: - return elements + parsed_version = parse('1.11.0') if version is None else parse(version) + + if parsed_version < parse('2.0.0'): + elements = convert_legacy_elements(elements) + + if parsed_version < parse('2.1.0'): + elements = convert_additional_input(elements) + + return elements def convert_legacy_elements(elements): @@ -211,6 +215,18 @@ def convert_legacy_elements(elements): return elements +def convert_additional_input(elements): + for uri, element in elements.items(): + if element['model'] == 'options.option': + additional_input = element.get('additional_input') + if additional_input == 'True': + element['additional_input'] = 'text' + else: + element['additional_input'] = '' + + return elements + + def order_elements(elements): ordered_elements = {} for uri, element in elements.items(): diff --git a/rdmo/domain/admin.py b/rdmo/domain/admin.py index 756e41f4d3..4e6cb8b71e 100644 --- a/rdmo/domain/admin.py +++ b/rdmo/domain/admin.py @@ -11,7 +11,16 @@ class AttributeAdminForm(forms.ModelForm): class Meta: model = Attribute - fields = '__all__' + fields = [ + 'uri', + 'uri_prefix', + 'key', + 'path', + 'comment', + 'locked', + 'editors', + 'parent', + ] def clean(self): AttributeUniqueURIValidator(self.instance)(self.cleaned_data) @@ -19,6 +28,7 @@ def clean(self): AttributeLockedValidator(self.instance)(self.cleaned_data) +@admin.register(Attribute) class AttributeAdmin(admin.ModelAdmin): form = AttributeAdminForm @@ -37,6 +47,3 @@ def values_count(self, obj): def projects_count(self, obj): return obj.projects_count - - -admin.site.register(Attribute, AttributeAdmin) diff --git a/rdmo/locale/de/LC_MESSAGES/django.mo b/rdmo/locale/de/LC_MESSAGES/django.mo index 9fdc03bb45..86db5c5086 100644 Binary files a/rdmo/locale/de/LC_MESSAGES/django.mo and b/rdmo/locale/de/LC_MESSAGES/django.mo differ diff --git a/rdmo/locale/de/LC_MESSAGES/django.po b/rdmo/locale/de/LC_MESSAGES/django.po index 85a56ab896..7a789551b3 100644 --- a/rdmo/locale/de/LC_MESSAGES/django.po +++ b/rdmo/locale/de/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: RDMO\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-22 12:31+0200\n" -"PO-Revision-Date: 2023-09-22 12:31+0200\n" +"POT-Creation-Date: 2023-12-04 12:32+0100\n" +"PO-Revision-Date: 2023-12-07 11:06+0100\n" "Last-Translator: Jochen Klar <jklar@aip.de>\n" "Language-Team: RDMO <rdmo-team@listserv.dfn.de>\n" "Language: de\n" @@ -11,7 +11,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 2.4.2\n" #: accounts/apps.py:7 msgid "Accounts" @@ -25,7 +25,7 @@ msgstr "Vorname" msgid "Last name" msgstr "Nachname" -#: accounts/forms.py:101 core/constants.py:20 projects/models/invite.py:30 +#: accounts/forms.py:101 core/constants.py:20 projects/models/invite.py:28 msgid "E-mail" msgstr "E-Mail" @@ -39,113 +39,113 @@ msgid "" "undone!" msgstr "Hiermit bestätige ich, die Löschung meines Profils!" -#: accounts/models.py:23 options/models.py:182 questions/models/question.py:98 -#: tasks/models.py:93 +#: accounts/models.py:23 options/models.py:191 questions/models/question.py:96 +#: tasks/models.py:96 msgid "Text (primary)" msgstr "Text (erste Sprache)" #: accounts/models.py:24 -msgid "The text for this additional field in the primary language." +msgid "The text for this additional field (in the primary language)." msgstr "Der Text für das zusätzliche Feld (erste Sprache)." -#: accounts/models.py:28 options/models.py:187 questions/models/question.py:103 -#: tasks/models.py:98 +#: accounts/models.py:28 options/models.py:196 questions/models/question.py:101 +#: tasks/models.py:101 msgid "Text (secondary)" msgstr "Text (zweite Sprache)" #: accounts/models.py:29 -msgid "The text for this additional field in the secondary language." +msgid "The text for this additional field (in the secondary language)." msgstr "Der Text für das zusätzliche Feld (zweite Sprache)." -#: accounts/models.py:33 options/models.py:192 questions/models/question.py:108 -#: tasks/models.py:103 +#: accounts/models.py:33 options/models.py:201 questions/models/question.py:106 +#: tasks/models.py:106 msgid "Text (tertiary)" msgstr "Text (dritte Sprache)" #: accounts/models.py:34 -msgid "The text for this additional field in the tertiary language." +msgid "The text for this additional field (in the tertiary language)." msgstr "Der Text für das zusätzliche Feld (dritte Sprache)." -#: accounts/models.py:38 options/models.py:197 questions/models/question.py:113 -#: tasks/models.py:108 +#: accounts/models.py:38 options/models.py:206 questions/models/question.py:111 +#: tasks/models.py:111 msgid "Text (quaternary)" msgstr "Text (vierte Sprache)" #: accounts/models.py:39 -msgid "The text for this additional field in the quaternary language." +msgid "The text for this additional field (in the quaternary language)." msgstr "Der Text für das zusätzliche Feld (vierte Sprache)." -#: accounts/models.py:43 options/models.py:202 questions/models/question.py:118 -#: tasks/models.py:113 +#: accounts/models.py:43 options/models.py:211 questions/models/question.py:116 +#: tasks/models.py:116 msgid "Text (quinary)" msgstr "Text (fünfte Sprache)" #: accounts/models.py:44 -msgid "The text for this additional field in the quinary language." +msgid "The text for this additional field (in the quinary language)." msgstr "Der Text für das zusätzliche Feld (fünfte Sprache)." -#: accounts/models.py:48 questions/models/catalog.py:111 -#: questions/models/page.py:111 questions/models/question.py:73 -#: questions/models/questionset.py:106 views/models.py:99 +#: accounts/models.py:48 options/models.py:216 questions/models/catalog.py:111 +#: questions/models/page.py:111 questions/models/question.py:71 +#: questions/models/questionset.py:106 views/models.py:102 msgid "Help (primary)" -msgstr "Help (erste Sprache)" +msgstr "Hilfe (erste Sprache)" #: accounts/models.py:49 msgid "" -"The help text to be displayed next to the input element in the primary " -"language." +"The help text to be displayed next to the input element (in the primary " +"language)." msgstr "" "Der Hilfetext, der neben dem Eingabefeld angezeigt wird (erste Sprache)." -#: accounts/models.py:53 questions/models/catalog.py:116 -#: questions/models/page.py:116 questions/models/question.py:78 -#: questions/models/questionset.py:111 views/models.py:104 +#: accounts/models.py:53 options/models.py:221 questions/models/catalog.py:116 +#: questions/models/page.py:116 questions/models/question.py:76 +#: questions/models/questionset.py:111 views/models.py:107 msgid "Help (secondary)" -msgstr "Help (zweite Sprache)" +msgstr "Hilfe (zweite Sprache)" #: accounts/models.py:54 msgid "" -"The help text to be displayed next to the input element in the secondary " -"language." +"The help text to be displayed next to the input element (in the secondary " +"language)." msgstr "" "Der Hilfetext, der neben dem Eingabefeld angezeigt wird (zweite Sprache)." -#: accounts/models.py:58 questions/models/catalog.py:121 -#: questions/models/page.py:121 questions/models/question.py:83 -#: questions/models/questionset.py:116 views/models.py:109 +#: accounts/models.py:58 options/models.py:226 questions/models/catalog.py:121 +#: questions/models/page.py:121 questions/models/question.py:81 +#: questions/models/questionset.py:116 views/models.py:112 msgid "Help (tertiary)" -msgstr "Help (dritte Sprache)" +msgstr "Hilfe (dritte Sprache)" #: accounts/models.py:59 msgid "" -"The help text to be displayed next to the input element in the tertiary " -"language." +"The help text to be displayed next to the input element (in the tertiary " +"language)." msgstr "" "Der Hilfetext, der neben dem Eingabefeld angezeigt wird (dritte Sprache)." -#: accounts/models.py:63 questions/models/catalog.py:126 -#: questions/models/page.py:126 questions/models/question.py:88 -#: questions/models/questionset.py:121 views/models.py:114 +#: accounts/models.py:63 options/models.py:231 questions/models/catalog.py:126 +#: questions/models/page.py:126 questions/models/question.py:86 +#: questions/models/questionset.py:121 views/models.py:117 msgid "Help (quaternary)" -msgstr "Help (vierte Sprache)" +msgstr "Hilfe (vierte Sprache)" #: accounts/models.py:64 msgid "" -"The help text to be displayed next to the input element in the quaternary " -"language." +"The help text to be displayed next to the input element (in the quaternary " +"language)." msgstr "" "Der Hilfetext, der neben dem Eingabefeld angezeigt wird (vierte Sprache)." -#: accounts/models.py:68 questions/models/catalog.py:131 -#: questions/models/page.py:131 questions/models/question.py:93 -#: questions/models/questionset.py:126 views/models.py:119 +#: accounts/models.py:68 options/models.py:236 questions/models/catalog.py:131 +#: questions/models/page.py:131 questions/models/question.py:91 +#: questions/models/questionset.py:126 views/models.py:122 msgid "Help (quinary)" -msgstr "Help (fünfte Sprache)" +msgstr "Hilfe (fünfte Sprache)" #: accounts/models.py:69 msgid "" -"The help text to be displayed next to the input element in the quinary " -"language." +"The help text to be displayed next to the input element (in the quinary " +"language)." msgstr "" "Der Hilfetext, der neben dem Eingabefeld angezeigt wird (fünfte Sprache)." @@ -190,7 +190,7 @@ msgid "The sites for which this user is a member." msgstr "Die Seiten bei denen dieser Benutzer Mitglied ist." #: accounts/models.py:138 projects/constants.py:9 -#: projects/models/membership.py:15 +#: projects/models/membership.py:13 msgid "Manager" msgstr "Manager" @@ -214,11 +214,11 @@ msgstr "Reviewer" msgid "The sites for which this user is a reviewer." msgstr "Die Seiten bei denen dieser Benutzer Reviewer ist." -#: accounts/models.py:154 projects/models/invite.py:35 -#: projects/models/membership.py:32 +#: accounts/models.py:154 projects/models/invite.py:33 +#: projects/models/membership.py:30 #: projects/templates/projects/project_detail_invites.html:16 #: projects/templates/projects/project_detail_memberships.html:21 -#: projects/templates/projects/projects.html:127 +#: projects/templates/projects/projects.html:138 msgid "Role" msgstr "Rolle" @@ -359,11 +359,11 @@ msgstr "Bestätigen" #: accounts/templates/account/email_confirm.html:29 #, python-format msgid "" -"This e-mail confirmation link expired or is invalid. Please <a " -"href=\"%(email_url)s\">issue a new e-mail confirmation request</a>." +"This e-mail confirmation link expired or is invalid. Please <a href=" +"\"%(email_url)s\">issue a new e-mail confirmation request</a>." msgstr "" -"Dieser Bestätigungs-Link ist abgelaufen oder ungültig. Bitte <a " -"href=\"%(email_url)s\">fordern sie eine neue Betätigungs-E-Mail an</a>." +"Dieser Bestätigungs-Link ist abgelaufen oder ungültig. Bitte <a href=" +"\"%(email_url)s\">fordern sie eine neue Betätigungs-E-Mail an</a>." #: accounts/templates/account/login.html:6 #: accounts/templates/account/login_form.html:23 @@ -380,17 +380,17 @@ msgstr "Mit Shibboleth einloggen" #: accounts/templates/account/login_form_account.html:7 #, python-format msgid "" -"If you have not created an account yet, then please <a " -"href=\"%(signup_url)s\">sign up</a> first." +"If you have not created an account yet, then please <a href=\"%(signup_url)s" +"\">sign up</a> first." msgstr "" -"Falls Sie noch kein Benutzerkonto haben, <a " -"href=\"%(signup_url)s\">registrieren</a> Sie sich bitte zunächst." +"Falls Sie noch kein Benutzerkonto haben, <a href=\"%(signup_url)s" +"\">registrieren</a> Sie sich bitte zunächst." #: accounts/templates/account/login_form_account.html:14 #, python-format msgid "" -"If you forgot your password and want to reset it, click <a " -"href=\"%(reset_url)s\">here</a>." +"If you forgot your password and want to reset it, click <a href=" +"\"%(reset_url)s\">here</a>." msgstr "" "Falls Sie Ihr Passwort vergessen haben und es zurücksetzen wollen, klicken " "Sie bitte <a href=\"%(reset_url)s\">hier</a>." @@ -520,8 +520,8 @@ msgstr "Neues Benutzerkonto erstellen" msgid "" "Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>." msgstr "" -"Falls Sie schon eine Benutzerkonto haben können Sie sich <a " -"href=\"%(login_url)s\">hier</a> anmelden." +"Falls Sie schon eine Benutzerkonto haben können Sie sich <a href=" +"\"%(login_url)s\">hier</a> anmelden." #: accounts/templates/account/signup.html:34 #: accounts/templates/socialaccount/signup.html:33 @@ -556,7 +556,7 @@ msgid "I agree to the terms of use" msgstr "Ich stimme den Nutzungsbedingungen zu" #: accounts/templates/account/signup_modal_terms_of_use.html:46 -#: projects/templates/projects/project_questions_modal_delete_valuesets.html:41 +#: projects/templates/projects/project_questions_modal_delete_valuesets.html:35 #: projects/templates/projects/project_questions_modal_form_valuesets.html:28 msgid "Close" msgstr "Schließen" @@ -601,8 +601,8 @@ msgid "" "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your e-" "mail address</a>." msgstr "" -"<strong>Hinweis:</strong> Sie können immer noch Ihre <a " -"href=\"%(email_url)s\">E-Mail Adresse ändern</a>." +"<strong>Hinweis:</strong> Sie können immer noch Ihre <a href=\"%(email_url)s" +"\">E-Mail Adresse ändern</a>." #: accounts/templates/profile/profile_remove_closed.html:6 #: accounts/templates/profile/profile_remove_failed.html:6 @@ -720,6 +720,37 @@ msgstr "" msgid "Add an additional account" msgstr "Externes Konto hinzufügen" +#: accounts/templates/socialaccount/login.html:4 +msgid "Sign In" +msgstr "Anmelden" + +#: accounts/templates/socialaccount/login.html:8 +#, python-format +msgid "Connect %(provider)s" +msgstr "Mit %(provider)s verbinden" + +#: accounts/templates/socialaccount/login.html:10 +#, python-format +msgid "You are about to connect a new third party account from %(provider)s." +msgstr "" +"Sie sind dabei, ein neues Drittanbieterkonto von %(provider)s zu verbinden." + +#: accounts/templates/socialaccount/login.html:12 +#, python-format +msgid "Sign In Via %(provider)s" +msgstr "Über %(provider)s anmelden" + +#: accounts/templates/socialaccount/login.html:14 +#, python-format +msgid "You are about to sign in using a third party account from %(provider)s." +msgstr "" +"Sie sind dabei, sich mit einem Konto eines Drittanbieters von %(provider)s. " +"anzumelden." + +#: accounts/templates/socialaccount/login.html:19 +msgid "Continue" +msgstr "Fortsetzen" + #: accounts/templates/socialaccount/login_cancelled.html:9 msgid "Login Cancelled" msgstr "Anmeldung abgebrochen" @@ -728,12 +759,12 @@ msgstr "Anmeldung abgebrochen" #, python-format msgid "" "You decided to cancel logging in to our site using one of your existing " -"accounts. If this was a mistake, please proceed to <a " -"href=\"%(login_url)s\">sign in</a>." +"accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s" +"\">sign in</a>." msgstr "" "Sie haben sich entschieden, die Anmeldung mit einem externen Konto " -"abzubrechen. Falls dies versehentlich geschehen ist, könne Sie <a " -"href=\"%(login_url)s\">hier</a> fortsetzen." +"abzubrechen. Falls dies versehentlich geschehen ist, könne Sie <a href=" +"\"%(login_url)s\">hier</a> fortsetzen." #: accounts/templates/socialaccount/signup.html:9 #, python-format @@ -745,7 +776,8 @@ msgstr "" "%(site_name)s anzumelden. Es sind noch zusätzliche Angaben von Ihnen nötig:" #: accounts/templatetags/accounts_tags.py:19 -#: projects/templates/projects/projects.html:126 +#: projects/templates/projects/project_questions_modal_form_valuesets.html:19 +#: projects/templates/projects/projects.html:136 #: projects/templates/projects/site_projects.html:64 msgid "Name" msgstr "Name" @@ -753,8 +785,8 @@ msgstr "Name" #: conditions/apps.py:7 conditions/models.py:90 #: conditions/templates/conditions/export/conditions.html:6 #: options/models.py:62 options/templates/options/export/optionset.html:29 -#: questions/models/page.py:186 questions/models/question.py:248 -#: questions/models/questionset.py:181 tasks/models.py:139 +#: questions/models/page.py:161 questions/models/question.py:221 +#: questions/models/questionset.py:156 tasks/models.py:142 #: tasks/templates/tasks/export/tasks.html:48 msgid "Conditions" msgstr "Bedingungen" @@ -762,18 +794,18 @@ msgstr "Bedingungen" #: conditions/models.py:35 #: conditions/templates/conditions/export/conditions.html:15 #: domain/models.py:15 domain/templates/domain/export/attributes.html:14 -#: options/models.py:17 options/models.py:152 +#: options/models.py:17 options/models.py:161 #: options/templates/options/export/option.html:5 #: options/templates/options/export/optionset.html:5 #: questions/models/catalog.py:36 questions/models/page.py:35 -#: questions/models/question.py:28 questions/models/questionset.py:30 +#: questions/models/question.py:26 questions/models/questionset.py:30 #: questions/models/section.py:34 #: questions/templates/questions/export/catalog.html:6 #: questions/templates/questions/export/page.html:6 #: questions/templates/questions/export/question.html:8 #: questions/templates/questions/export/questionset.html:8 -#: questions/templates/questions/export/section.html:6 tasks/models.py:22 -#: tasks/templates/tasks/export/tasks.html:15 views/models.py:23 +#: questions/templates/questions/export/section.html:6 tasks/models.py:20 +#: tasks/templates/tasks/export/tasks.html:15 views/models.py:21 #: views/templates/views/export/views.html:15 msgid "URI" msgstr "URI" @@ -784,10 +816,10 @@ msgstr "" "Der Uniform Resource Identifier dieser Bedingung (automatisch erstellt)." #: conditions/models.py:40 domain/models.py:20 options/models.py:22 -#: options/models.py:157 questions/models/catalog.py:41 -#: questions/models/page.py:40 questions/models/question.py:33 +#: options/models.py:166 questions/models/catalog.py:41 +#: questions/models/page.py:40 questions/models/question.py:31 #: questions/models/questionset.py:35 questions/models/section.py:39 -#: tasks/models.py:27 views/models.py:28 +#: tasks/models.py:25 views/models.py:26 msgid "URI Prefix" msgstr "URI Prefix" @@ -795,10 +827,10 @@ msgstr "URI Prefix" msgid "The prefix for the URI of this condition." msgstr "Das Präfix für die URI dieser Bedingung." -#: conditions/models.py:45 options/models.py:27 options/models.py:162 +#: conditions/models.py:45 options/models.py:27 options/models.py:171 #: questions/models/catalog.py:46 questions/models/page.py:45 -#: questions/models/question.py:38 questions/models/questionset.py:40 -#: questions/models/section.py:44 tasks/models.py:32 views/models.py:33 +#: questions/models/question.py:36 questions/models/questionset.py:40 +#: questions/models/section.py:44 tasks/models.py:30 views/models.py:31 msgid "URI Path" msgstr "URI Pfad" @@ -808,17 +840,17 @@ msgstr "Der Pfad für die URI dieser Bedingung." #: conditions/models.py:50 #: conditions/templates/conditions/export/conditions.html:21 -#: domain/models.py:35 options/models.py:32 options/models.py:167 +#: domain/models.py:35 options/models.py:32 options/models.py:176 #: questions/models/catalog.py:51 questions/models/page.py:50 -#: questions/models/question.py:43 questions/models/questionset.py:45 +#: questions/models/question.py:41 questions/models/questionset.py:45 #: questions/models/section.py:49 #: questions/templates/questions/export/catalog.html:12 #: questions/templates/questions/export/page.html:12 #: questions/templates/questions/export/question.html:14 -#: questions/templates/questions/export/question.html:75 +#: questions/templates/questions/export/question.html:70 #: questions/templates/questions/export/questionset.html:14 -#: questions/templates/questions/export/section.html:12 tasks/models.py:37 -#: tasks/templates/tasks/export/tasks.html:21 views/models.py:38 +#: questions/templates/questions/export/section.html:12 tasks/models.py:35 +#: tasks/templates/tasks/export/tasks.html:21 views/models.py:36 #: views/templates/views/export/views.html:21 msgid "Comment" msgstr "Kommentar" @@ -828,10 +860,10 @@ msgid "Additional internal information about this condition." msgstr "Zusätzliche interne Informationen über diese Bedingung." #: conditions/models.py:55 domain/models.py:40 options/models.py:37 -#: options/models.py:172 questions/models/catalog.py:56 -#: questions/models/page.py:55 questions/models/question.py:48 +#: options/models.py:181 questions/models/catalog.py:56 +#: questions/models/page.py:55 questions/models/question.py:46 #: questions/models/questionset.py:50 questions/models/section.py:54 -#: tasks/models.py:42 views/models.py:43 +#: tasks/models.py:40 views/models.py:41 msgid "Locked" msgstr "Gesperrt" @@ -840,10 +872,10 @@ msgid "Designates whether this condition can be changed." msgstr "Bezeichnet, ob diese Bedingung geändert werden kann." #: conditions/models.py:60 domain/models.py:45 options/models.py:47 -#: options/models.py:177 questions/models/catalog.py:76 -#: questions/models/page.py:81 questions/models/question.py:68 +#: options/models.py:186 questions/models/catalog.py:76 +#: questions/models/page.py:81 questions/models/question.py:66 #: questions/models/questionset.py:76 questions/models/section.py:64 -#: tasks/models.py:58 views/models.py:59 +#: tasks/models.py:61 views/models.py:62 msgid "Editors" msgstr "Editoren" @@ -902,13 +934,13 @@ msgstr "Bedingung" msgid "Target" msgstr "Ziel" -#: core/constants.py:14 core/settings.py:314 +#: core/constants.py:14 core/settings.py:316 options/models.py:155 #: options/templates/options/export/option.html:8 projects/models/value.py:69 -#: questions/constants.py:4 tasks/templates/tasks/export/tasks.html:31 +#: tasks/templates/tasks/export/tasks.html:31 msgid "Text" msgstr "Text" -#: core/constants.py:15 projects/models/issue.py:111 +#: core/constants.py:15 projects/models/issue.py:110 msgid "URL" msgstr "URL" @@ -932,7 +964,7 @@ msgstr "Datum und Zeit" msgid "Phone" msgstr "Telefon" -#: core/constants.py:22 options/models.py:213 projects/models/value.py:74 +#: core/constants.py:22 options/models.py:272 projects/models/value.py:74 msgid "Option" msgstr "Option" @@ -948,95 +980,99 @@ msgstr "erstellt" msgid "updated" msgstr "zuletzt geändert" -#: core/settings.py:134 +#: core/settings.py:133 msgid "English" msgstr "Englisch" -#: core/settings.py:135 +#: core/settings.py:134 msgid "German" msgstr "Deutsch" -#: core/settings.py:254 +#: core/settings.py:253 msgid "PDF" msgstr "PDF" -#: core/settings.py:255 +#: core/settings.py:254 msgid "Rich Text Format" msgstr "Rich Text Format" -#: core/settings.py:256 +#: core/settings.py:255 msgid "Open Office" msgstr "Open Office" -#: core/settings.py:257 +#: core/settings.py:256 msgid "Microsoft Office" msgstr "Microsoft Office" -#: core/settings.py:258 +#: core/settings.py:257 msgid "HTML" msgstr "HTML" -#: core/settings.py:259 +#: core/settings.py:258 msgid "Markdown" msgstr "Markdown" -#: core/settings.py:260 +#: core/settings.py:259 msgid "mediawiki" msgstr "mediawiki" -#: core/settings.py:261 +#: core/settings.py:260 msgid "LaTeX" msgstr "LaTeX" -#: core/settings.py:283 core/settings.py:290 +#: core/settings.py:282 core/settings.py:289 msgid "RDMO XML" msgstr "RDMO XML" -#: core/settings.py:284 +#: core/settings.py:283 msgid "CSV (comma separated)" msgstr "CSV (Komma getrennt)" -#: core/settings.py:285 +#: core/settings.py:284 msgid "CSV (semicolon separated)" msgstr "CSV (Semikolon getrennt)" -#: core/settings.py:286 +#: core/settings.py:285 msgid "JSON" msgstr "JSON" -#: core/settings.py:315 questions/constants.py:5 +#: core/settings.py:317 options/models.py:156 msgid "Textarea" msgstr "Textfeld" -#: core/settings.py:316 questions/constants.py:6 +#: core/settings.py:318 msgid "Yes/No" msgstr "Ja/Nein" -#: core/settings.py:317 questions/constants.py:7 +#: core/settings.py:319 msgid "Checkboxes" msgstr "Ankreuzfelder" -#: core/settings.py:318 questions/constants.py:8 +#: core/settings.py:320 msgid "Radio buttons" msgstr "Radio Buttons" -#: core/settings.py:319 questions/constants.py:9 +#: core/settings.py:321 msgid "Select drop-down" msgstr "Select-Dropdown-Menü" -#: core/settings.py:320 questions/constants.py:10 +#: core/settings.py:322 msgid "Autocomplete" msgstr "Autocomplete" -#: core/settings.py:321 questions/constants.py:11 +#: core/settings.py:323 +msgid "Free autocomplete" +msgstr "Freies Autocomplete" + +#: core/settings.py:324 msgid "Range slider" msgstr "Schieberegler" -#: core/settings.py:322 questions/constants.py:12 +#: core/settings.py:325 msgid "Date picker" msgstr "Datumspicker" -#: core/settings.py:323 questions/constants.py:13 +#: core/settings.py:326 msgid "File upload" msgstr "Dateien-Upload" @@ -1144,29 +1180,37 @@ msgstr "Ansicht als anoymer Benutzer" msgid "Powered by " msgstr "Powered by " -#: core/utils.py:120 core/utils.py:125 +#: core/utils.py:122 core/utils.py:127 msgid "Elements" msgstr "Elemente" -#: core/utils.py:121 +#: core/utils.py:123 msgid "The questions and question sets for this page." msgstr "The questions and question sets for this page." -#: core/utils.py:126 +#: core/utils.py:128 msgid "The questions and question sets for this question set." msgstr "Das Fragen und Fragensets für dieses Fragenset." -#: core/utils.py:206 +#: core/utils.py:208 msgid "This format is not supported." msgstr "Dieses Format wird nicht unterstützt." +#: core/utils.py:383 +msgid "show more" +msgstr "mehr anzeigen" + +#: core/utils.py:384 +msgid "show less" +msgstr "weniger anzeigen" + #: core/validators.py:64 #, python-format msgid "%(model)s with the uri \"%(uri)s\" already exists." msgstr "%(model)s mit der uri \"%(uri)s\" existiert bereits." -#: core/validators.py:80 domain/validators.py:14 projects/forms.py:347 -#: projects/forms.py:368 +#: core/validators.py:80 domain/validators.py:14 projects/forms.py:349 +#: projects/forms.py:370 msgid "This field is required." msgstr "Dieses Feld wird benötigt." @@ -1199,7 +1243,7 @@ msgstr "" msgid "The prefix for the URI of this attribute." msgstr "Das Präfix für die URI dieses Attributs." -#: domain/models.py:25 projects/models/integration.py:60 +#: domain/models.py:25 projects/models/integration.py:66 msgid "Key" msgstr "Schlüssel" @@ -1239,7 +1283,7 @@ msgid "Parent attribute in the domain model." msgstr "Übergeordnetes Attribut im Domänenmodell." #: domain/models.py:57 projects/models/value.py:44 questions/models/page.py:61 -#: questions/models/question.py:53 questions/models/questionset.py:56 +#: questions/models/question.py:51 questions/models/questionset.py:56 msgid "Attribute" msgstr "Attribut" @@ -1334,7 +1378,7 @@ msgstr "Dies ist keine valide RDMO-XML Datei." msgid "This is not a valid RDMO import JSON." msgstr "Dies ist keine valide RDMO-JSON-Import." -#: options/apps.py:7 options/models.py:57 options/models.py:214 +#: options/apps.py:7 options/models.py:57 options/models.py:273 #: options/templates/options/export/options.html:6 #: options/templates/options/export/optionset.html:9 #: projects/templates/projects/issue_detail.html:81 @@ -1343,7 +1387,7 @@ msgstr "Dies ist keine valide RDMO-JSON-Import." #: projects/templates/projects/project_detail_integrations.html:19 #: projects/templates/projects/project_detail_sidebar.html:11 #: projects/templates/projects/project_view.html:42 -#: projects/templates/projects/projects.html:25 +#: projects/templates/projects/projects.html:29 #: projects/templates/projects/site_projects.html:48 #: questions/templates/questions/export/question.html:30 msgid "Options" @@ -1371,7 +1415,8 @@ msgid "Designates whether this option set (and its options) can be changed." msgstr "" "Gibt an, ob dieser Optionssatz (und seine Optionen) geändert werden kann." -#: options/models.py:42 questions/models/catalog.py:61 +#: options/models.py:42 questions/models/catalog.py:61 tasks/models.py:45 +#: views/models.py:46 msgid "Order" msgstr "Reihenfolge" @@ -1412,69 +1457,140 @@ msgid "Option set" msgstr "Optionenset" #: options/models.py:69 options/templates/options/export/optionsets.html:6 -#: questions/models/question.py:243 +#: questions/models/question.py:216 msgid "Option sets" msgstr "Optionensets" -#: options/models.py:153 +#: options/models.py:162 msgid "The Uniform Resource Identifier of this option (auto-generated)." msgstr "Der Uniform Resource Identifier dieser Option (automatisch erstellt)." -#: options/models.py:158 +#: options/models.py:167 msgid "The prefix for the URI of this option." msgstr "Das Präfix für die URI dieser Option." -#: options/models.py:163 +#: options/models.py:172 msgid "The path for the URI of this option." msgstr "Der Pfad für die URI dieser Option." -#: options/models.py:168 +#: options/models.py:177 msgid "Additional internal information about this option." msgstr "Zusätzliche interne Informationen über diese Option." -#: options/models.py:173 +#: options/models.py:182 msgid "Designates whether this option can be changed." msgstr "Bezeichnet, ob diese Option geändert werden kann." -#: options/models.py:178 +#: options/models.py:187 msgid "The sites that can edit this option (in a multi site setup)." msgstr "Die Seiten, die diese Option bearbeiten können (im Multi-Site-Setup)." -#: options/models.py:183 -msgid "The text for this option in the primary language." +#: options/models.py:192 +msgid "The text for this option (in the primary language)." msgstr "Der Text für diese Option (erste Sprache)." -#: options/models.py:188 -msgid "The text for this option in the secondary language." +#: options/models.py:197 +msgid "The text for this option (in the secondary language)." msgstr "Der Text für diese Option (zweite Sprache)." -#: options/models.py:193 -msgid "The text for this option in the tertiary language." +#: options/models.py:202 +msgid "The text for this option (in the tertiary language)." msgstr "Der Text für diese Option (dritte Sprache)." -#: options/models.py:198 -msgid "The text for this option in the quaternary language." +#: options/models.py:207 +msgid "The text for this option (in the quaternary language)." msgstr "Der Text für diese Option (vierte Sprache)." -#: options/models.py:203 -msgid "The text for this option in the quinary language." +#: options/models.py:212 +msgid "The text for this option (in the quinary language)." msgstr "Der Text für diese Option (fünfte Sprache)." -#: options/models.py:207 options/templates/options/export/option.html:11 +#: options/models.py:217 +msgid "The help text for this option (in the primary language)." +msgstr "Der Hilfetext für diese Option (erste Sprache)." + +#: options/models.py:222 +msgid "The help text for this option (in the secondary language)." +msgstr "Der Hilfetext für diese Option (zweite Sprache)." + +#: options/models.py:227 +msgid "The help text for this option (in the tertiary language)." +msgstr "Der Hilfetext für diese Option (dritte Sprache)." + +#: options/models.py:232 +msgid "The help text for this option (in the quaternary language)." +msgstr "Der Hilfetext für diese Option (vierte Sprache)." + +#: options/models.py:237 +msgid "The help text for this option (in the quinary language)." +msgstr "Der Hilfetext für diese Option (fünfte Sprache)." + +#: options/models.py:241 +msgid "View text (primary)" +msgstr "Ansichtstext (erste Sprache)" + +#: options/models.py:242 +msgid "The view text for this option (in the primary language)." +msgstr "Der Ansichtstext für diese Option (erste Sprache)." + +#: options/models.py:246 +msgid "View text (secondary)" +msgstr "Ansichtstext (zweite Sprache)" + +#: options/models.py:247 +msgid "The view text for this option (in the secondary language)." +msgstr "Der Ansichtstext für diese Option (zweite Sprache)." + +#: options/models.py:251 +msgid "View text (tertiary)" +msgstr "Ansichtstext (dritte Sprache)" + +#: options/models.py:252 +msgid "The view text for this option (in the tertiary language)." +msgstr "Der Ansichtstext für diese Option (dritte Sprache)." + +#: options/models.py:256 +msgid "View text (quaternary)" +msgstr "Ansichtstext (vierte Sprache)" + +#: options/models.py:257 +msgid "The view text for this option (in the quaternary language)." +msgstr "Der Ansichtstext für diese Option (vierte Sprache)." + +#: options/models.py:261 +msgid "View text (quinary)" +msgstr "Ansichtstext (fünfte Sprache)" + +#: options/models.py:262 +msgid "The view text for this option (in the quinary language)." +msgstr "Der Ansichtstext für diese Option (fünfte Sprache)." + +#: options/models.py:266 options/templates/options/export/option.html:17 msgid "Additional input" msgstr "Zusätzliche Eingabe" -#: options/models.py:208 +#: options/models.py:267 msgid "Designates whether an additional input is possible for this option." msgstr "Legt fest, ob eine zusätzliche Eingabe für diese Option möglich ist." +#: options/templates/options/export/option.html:11 +#: questions/templates/questions/export/page.html:20 +#: questions/templates/questions/export/question.html:22 +#: questions/templates/questions/export/questionset.html:22 +msgid "Help" +msgstr "Hilfe" + +#: options/templates/options/export/option.html:14 +msgid "View text" +msgstr "Ansichtstext" + #: overlays/apps.py:7 overlays/models.py:33 msgid "Overlays" msgstr "Einblendungen" #: overlays/models.py:11 projects/forms.py:182 -#: projects/models/continuation.py:18 projects/models/invite.py:25 -#: projects/models/membership.py:27 projects/models/project.py:35 +#: projects/models/continuation.py:18 projects/models/invite.py:23 +#: projects/models/membership.py:25 projects/models/project.py:33 #: projects/templates/projects/project_detail_invites.html:14 #: projects/templates/projects/project_detail_memberships.html:19 msgid "User" @@ -1484,7 +1600,7 @@ msgstr "Benutzer" msgid "The user for this overlay." msgstr "Der Benutzer für diese Einblendung." -#: overlays/models.py:16 projects/models/project.py:40 +#: overlays/models.py:16 projects/models/project.py:38 msgid "Site" msgstr "Standort" @@ -1500,7 +1616,7 @@ msgstr "Url-Name" msgid "The url_name for this overlay." msgstr "Der url_name für diese Einblendung." -#: overlays/models.py:26 projects/forms.py:335 +#: overlays/models.py:26 projects/forms.py:337 #: projects/templates/projects/project_answers.html:13 #: projects/templates/projects/project_view.html:28 msgid "Current" @@ -1537,19 +1653,19 @@ msgstr "" msgid "Reset overlays" msgstr "Einblendungen zurücksetzen" -#: projects/apps.py:8 projects/models/project.py:72 +#: projects/apps.py:8 projects/models/project.py:80 msgid "Projects" msgstr "Projekte" -#: projects/constants.py:8 projects/models/membership.py:14 +#: projects/constants.py:8 projects/models/membership.py:12 msgid "Owner" msgstr "Besitzer" -#: projects/constants.py:10 projects/models/membership.py:16 +#: projects/constants.py:10 projects/models/membership.py:14 msgid "Author" msgstr "Autor" -#: projects/constants.py:11 projects/models/membership.py:17 +#: projects/constants.py:11 projects/models/membership.py:15 msgid "Guest" msgstr "Gast" @@ -1589,82 +1705,60 @@ msgstr "" msgid "Only existing users can be added silently." msgstr "Nur bestehende Benutzer können stillschweigend hinzugefügt werden." -#: projects/forms.py:301 projects/forms.py:305 +#: projects/forms.py:303 projects/forms.py:307 #, python-format msgid "Attach %s" msgstr "%s hinzufügen" -#: projects/forms.py:311 +#: projects/forms.py:313 msgid "Subject" msgstr "Betreff" -#: projects/forms.py:312 +#: projects/forms.py:314 msgid "Message" msgstr "Nachricht" -#: projects/forms.py:319 +#: projects/forms.py:321 msgid "Answers" msgstr "Antworten" -#: projects/forms.py:320 +#: projects/forms.py:322 msgid "Attach the output of \"View answers\"." msgstr "Die Ausgabe von \"Antworten anzeigen\" anhängen." -#: projects/forms.py:323 projects/models/project.py:65 +#: projects/forms.py:325 projects/models/project.py:63 #: projects/templates/projects/project_detail_views.html:11 views/apps.py:7 -#: views/models.py:131 views/templates/views/export/views.html:6 +#: views/models.py:136 views/templates/views/export/views.html:6 msgid "Views" msgstr "Ansichten" -#: projects/forms.py:327 +#: projects/forms.py:329 msgid "Files" msgstr "Dateien" -#: projects/forms.py:334 projects/models/snapshot.py:33 +#: projects/forms.py:336 projects/models/snapshot.py:33 #: projects/models/value.py:38 #: projects/templates/projects/project_detail_snapshots.html:20 #: projects/templates/projects/project_import.html:93 msgid "Snapshot" msgstr "Snapshot" -#: projects/forms.py:338 +#: projects/forms.py:340 msgid "Format" msgstr "Format" -#: projects/forms.py:353 projects/forms.py:358 +#: projects/forms.py:355 projects/forms.py:360 msgid "Recipients" msgstr "Empfänger" -#: projects/forms.py:359 +#: projects/forms.py:361 msgid "Enter recipients line by line" msgstr "Empfänger Zeile für Zeile eingeben" -#: projects/imports.py:225 +#: projects/imports.py:224 msgid "Import project from this URL" msgstr "Projekt von dieser URL importieren" -#: projects/imports.py:270 -msgid "GitHub repository" -msgstr "GitHub-Repository" - -#: projects/imports.py:271 projects/imports.py:323 -msgid "Please use the form username/repository or organization/repository." -msgstr "" -"Bitte verwenden Sie das Format Benutzername/Repository oder Organisation/" -"Repository." - -#: projects/imports.py:272 projects/imports.py:324 -msgid "File path" -msgstr "Datei-Pfad" - -#: projects/imports.py:273 projects/imports.py:325 -msgid "Branch, tag, or commit" -msgstr "Branch, Tag, oder Commit" - -#: projects/imports.py:322 -msgid "GitLab repository" -msgstr "GitLab-Repository" - #: projects/mixins.py:79 projects/mixins.py:96 projects/mixins.py:110 #: projects/mixins.py:133 projects/mixins.py:151 projects/mixins.py:166 #: projects/mixins.py:201 @@ -1687,9 +1781,9 @@ msgstr "" msgid "Files of this type cannot be imported." msgstr "Dateien dieses Typs können nicht importiert werden." -#: projects/models/continuation.py:13 projects/models/integration.py:16 -#: projects/models/invite.py:20 projects/models/issue.py:28 -#: projects/models/membership.py:22 projects/models/project.py:71 +#: projects/models/continuation.py:13 projects/models/integration.py:14 +#: projects/models/invite.py:18 projects/models/issue.py:26 +#: projects/models/membership.py:20 projects/models/project.py:79 #: projects/models/snapshot.py:17 projects/models/value.py:32 #: projects/templates/projects/project_questions_overview.html:5 msgid "Project" @@ -1703,7 +1797,7 @@ msgstr "Das Projekt für diese Fortsetzung." msgid "The user for this continuation." msgstr "Der Benutzer für diese Fortsetzung." -#: projects/models/continuation.py:23 questions/models/page.py:192 +#: projects/models/continuation.py:23 questions/models/page.py:167 #: questions/templates/questions/export/page.html:3 msgid "Page" msgstr "Seite" @@ -1720,20 +1814,20 @@ msgstr "Fortsetzung" msgid "Continuations" msgstr "Fortsetzungen" -#: projects/models/integration.py:17 +#: projects/models/integration.py:15 msgid "The project for this integration." msgstr "Das Projekt zu dem diese Integration gehört." -#: projects/models/integration.py:20 +#: projects/models/integration.py:18 msgid "Provider key" msgstr "Provider-Schlüssel" -#: projects/models/integration.py:21 +#: projects/models/integration.py:19 msgid "The key of the provider for this integration." msgstr "Der Schlüssel für den Provider dieser Integration." -#: projects/models/integration.py:26 projects/models/integration.py:55 -#: projects/models/issue.py:107 +#: projects/models/integration.py:26 projects/models/integration.py:61 +#: projects/models/issue.py:106 msgid "Integration" msgstr "Integration" @@ -1742,68 +1836,68 @@ msgstr "Integration" msgid "Integrations" msgstr "Integrationen" -#: projects/models/integration.py:56 +#: projects/models/integration.py:62 msgid "The integration for this integration option." msgstr "Die Integration für diese Integrations-Option." -#: projects/models/integration.py:61 +#: projects/models/integration.py:67 msgid "The key for this integration option." msgstr "Der Schlüssel für diese Integrations-Option." -#: projects/models/integration.py:64 projects/models/value.py:100 +#: projects/models/integration.py:70 projects/models/value.py:100 msgid "Value" msgstr "Wert" -#: projects/models/integration.py:65 +#: projects/models/integration.py:71 msgid "The value for this integration option." msgstr "Der Wert für diese Integrations-Option." -#: projects/models/integration.py:69 +#: projects/models/integration.py:75 msgid "Secret" msgstr "Geheimnis" -#: projects/models/integration.py:70 +#: projects/models/integration.py:76 msgid "" "Designates whether this integration option is hidden from regular users." msgstr "Gibt an, ob diese Integrationsoption für Benutzer verborgen ist." -#: projects/models/integration.py:75 +#: projects/models/integration.py:81 msgid "Integration option" msgstr "Integrations-Option" -#: projects/models/integration.py:76 +#: projects/models/integration.py:82 msgid "Integration options" msgstr "Integrations-Optionen" -#: projects/models/invite.py:21 +#: projects/models/invite.py:19 msgid "The project for this invite." msgstr "Das Projekt für diese Einladung." -#: projects/models/invite.py:26 projects/models/membership.py:28 +#: projects/models/invite.py:24 projects/models/membership.py:26 msgid "The user for this membership." msgstr "Der Benutzer für diese Mitgliedschaft." -#: projects/models/invite.py:31 +#: projects/models/invite.py:29 msgid "The e-mail for this membership." msgstr "Die E-Mail für diese Mitgliedschaft." -#: projects/models/invite.py:36 +#: projects/models/invite.py:34 msgid "The role for this invite." msgstr "Die Rolle für diese Einladung." -#: projects/models/invite.py:40 +#: projects/models/invite.py:38 msgid "Token" msgstr "Token" -#: projects/models/invite.py:41 +#: projects/models/invite.py:39 msgid "The token for this invite." msgstr "Der Token für diese Einladung." -#: projects/models/invite.py:44 +#: projects/models/invite.py:42 msgid "Timestamp" msgstr "Zeitstempel" -#: projects/models/invite.py:45 +#: projects/models/invite.py:43 msgid "The timestamp for this invite." msgstr "Der Zeitstempel für diese Einladung." @@ -1816,74 +1910,74 @@ msgstr "Einladung" msgid "Invites" msgstr "Einladungen" -#: projects/models/issue.py:21 +#: projects/models/issue.py:19 msgid "open" msgstr "offen" -#: projects/models/issue.py:22 +#: projects/models/issue.py:20 msgid "in progress" msgstr "im Gange" -#: projects/models/issue.py:23 +#: projects/models/issue.py:21 msgid "closed" msgstr "geschlossen" -#: projects/models/issue.py:29 +#: projects/models/issue.py:27 msgid "The project for this issue." msgstr "Das Projekt zu dem dieser Issue gehört." -#: projects/models/issue.py:33 projects/templates/projects/issue_detail.html:15 +#: projects/models/issue.py:31 projects/templates/projects/issue_detail.html:15 #: projects/templates/projects/project_detail_issues.html:19 -#: tasks/models.py:150 +#: tasks/models.py:155 msgid "Task" msgstr "Aufgabe" -#: projects/models/issue.py:34 +#: projects/models/issue.py:32 msgid "The task for this issue." msgstr "Die Aufgabe für diesen Issue." -#: projects/models/issue.py:38 projects/templates/projects/issue_detail.html:75 +#: projects/models/issue.py:36 projects/templates/projects/issue_detail.html:75 #: projects/templates/projects/project_detail_issues.html:22 msgid "Status" msgstr "Status" -#: projects/models/issue.py:39 +#: projects/models/issue.py:37 msgid "The status for this issue." msgstr "Der Titel für diesen Issue." -#: projects/models/issue.py:44 projects/models/issue.py:102 +#: projects/models/issue.py:43 projects/models/issue.py:101 msgid "Issue" msgstr "Issue" -#: projects/models/issue.py:45 +#: projects/models/issue.py:44 msgid "Issues" msgstr "Issues" -#: projects/models/issue.py:103 +#: projects/models/issue.py:102 msgid "The issue for this issue resource." msgstr "Das Issue für diese Ressource." -#: projects/models/issue.py:108 +#: projects/models/issue.py:107 msgid "The integration for this issue resource." msgstr "Die Integration für diese Ressource." -#: projects/models/issue.py:112 +#: projects/models/issue.py:111 msgid "The URL of this issue resource." msgstr "Die URL für diese Ressource." -#: projects/models/issue.py:117 +#: projects/models/issue.py:116 msgid "Issue resource" msgstr "Issue-Ressource" -#: projects/models/issue.py:118 +#: projects/models/issue.py:117 msgid "Issue resources" msgstr "Issue Ressource" -#: projects/models/membership.py:23 +#: projects/models/membership.py:21 msgid "The project for this membership." msgstr "Das Projekt zu dem diese Mitgliedschaft gehört." -#: projects/models/membership.py:33 +#: projects/models/membership.py:31 msgid "The role for this membership." msgstr "Die Rolle für diese Mitgliedschaft." @@ -1895,36 +1989,35 @@ msgstr "Mitgliedschaft" msgid "Memberships" msgstr "Mitgliedschaften" -#: projects/models/project.py:30 +#: projects/models/project.py:28 msgid "Parent project" msgstr "Übergeordnetes Projekt" -#: projects/models/project.py:31 +#: projects/models/project.py:29 msgid "The parent project of this project." msgstr "Das übergeordnete Projekt zu diesem Projekt." -#: projects/models/project.py:36 +#: projects/models/project.py:34 msgid "The list of users for this project." msgstr "Die Liste der Benutzer für dieses Projekt." -#: projects/models/project.py:41 +#: projects/models/project.py:39 msgid "The site this project belongs to (in a multi site setup)." msgstr "Die Site, zu der dieses Projekt gehört (in einem Multi-Standort-Setup)" -#: projects/models/project.py:45 projects/models/snapshot.py:22 +#: projects/models/project.py:43 projects/models/snapshot.py:22 #: projects/templates/projects/project_import.html:25 #: projects/templates/projects/project_import.html:98 -#: projects/templates/projects/project_questions_modal_form_valuesets.html:19 #: tasks/templates/tasks/export/tasks.html:27 #: views/templates/views/export/views.html:27 msgid "Title" msgstr "Titel" -#: projects/models/project.py:46 +#: projects/models/project.py:44 msgid "The title for this project." msgstr "Der Titel für dieses Projekt." -#: projects/models/project.py:50 projects/models/snapshot.py:27 +#: projects/models/project.py:48 projects/models/snapshot.py:27 #: projects/templates/projects/issue_send_integrations.html:8 #: projects/templates/projects/project_detail_header.html:15 #: projects/templates/projects/project_detail_integrations.html:18 @@ -1936,11 +2029,11 @@ msgstr "Der Titel für dieses Projekt." msgid "Description" msgstr "Beschreibung" -#: projects/models/project.py:51 +#: projects/models/project.py:49 msgid "A description for this project (optional)." msgstr "Eine Beschreibung für dieses Projekt (optional)." -#: projects/models/project.py:55 +#: projects/models/project.py:53 #: projects/templates/projects/project_detail_header.html:23 #: projects/templates/projects/project_import.html:31 #: projects/templates/projects/project_questions_overview.html:8 @@ -1949,25 +2042,41 @@ msgstr "Eine Beschreibung für dieses Projekt (optional)." msgid "Catalog" msgstr "Katalog" -#: projects/models/project.py:56 +#: projects/models/project.py:54 msgid "The catalog which will be used for this project." msgstr "Der Fragenkatalog, der für dieses Projekt verwendet wird." -#: projects/models/project.py:60 +#: projects/models/project.py:58 #: projects/templates/projects/project_detail_issues.html:11 tasks/apps.py:7 -#: tasks/models.py:151 tasks/templates/tasks/export/tasks.html:6 +#: tasks/models.py:156 tasks/templates/tasks/export/tasks.html:6 msgid "Tasks" msgstr "Aufgaben" -#: projects/models/project.py:61 +#: projects/models/project.py:59 msgid "The tasks that will be used for this project." msgstr "Die Aufgaben, die für dieses Projekt verwendet werden." -#: projects/models/project.py:66 +#: projects/models/project.py:64 msgid "The views that will be used for this project." msgstr "Die Ansichten, die für dieses Projekt verwendet werden." -#: projects/models/project.py:86 +#: projects/models/project.py:68 +msgid "Progress total" +msgstr "Fortschritt Gesammtzahl" + +#: projects/models/project.py:69 +msgid "The total number of expected values for the progress bar." +msgstr "Die Gesamtzahl der erwarteten Werte für den Fortschrittsbalken." + +#: projects/models/project.py:73 +msgid "Progress count" +msgstr "Fortschritt Zahl" + +#: projects/models/project.py:74 +msgid "The number of values for the progress bar." +msgstr "Die Anzahl der Werte für den Fortschrittsbalken." + +#: projects/models/project.py:94 msgid "" "A project may not be moved to be a child of itself or one of its descendants." msgstr "" @@ -2065,7 +2174,7 @@ msgstr "Die Option die für diesen Wert gespeichert wird." msgid "The file stored for this value." msgstr "Die für diesen Wert gespeicherte Datei." -#: projects/models/value.py:84 questions/models/question.py:213 +#: projects/models/value.py:84 questions/models/question.py:186 msgid "Value type" msgstr "Wert-Typ" @@ -2073,7 +2182,7 @@ msgstr "Wert-Typ" msgid "Type of this value." msgstr "Art von Wert." -#: projects/models/value.py:89 questions/models/question.py:233 +#: projects/models/value.py:89 questions/models/question.py:206 msgid "Unit" msgstr "Einheit" @@ -2093,73 +2202,48 @@ msgstr "Externe ID für diesen Wert." msgid "Values" msgstr "Werte" -#: projects/models/value.py:158 +#: projects/models/value.py:162 #: projects/templates/projects/project_questions_form_group_yesno.html:30 msgid "Yes" msgstr "Ja" -#: projects/models/value.py:160 +#: projects/models/value.py:164 #: projects/templates/projects/project_questions_form_group_yesno.html:39 msgid "No" msgstr "Nein" -#: projects/providers.py:34 +#: projects/providers.py:32 msgid "Integration error" msgstr "Integrationsfehler" -#: projects/providers.py:35 +#: projects/providers.py:33 msgid "The Integration is not configured correctly." msgstr "Die Integration ist nicht korrekt konfiguriert." -#: projects/providers.py:76 -msgid "Add GitHub integration" -msgstr "GitHub-Integration hinzufügen" - -#: projects/providers.py:77 -msgid "Send to GitHub" -msgstr "An GitHub senden" - #: projects/providers.py:78 -msgid "" -"This integration allow the creation of issues in arbitrary GitHub " -"repositories. The upload of attachments is not supported by GitHub." -msgstr "" -"Diese Integration ermöglicht die Erstellung von Ausgaben in beliebigen " -"GitHub-Repositorien. Das Hochladen von Anhängen wird von GitHub nicht " -"unterstützt." - -#: projects/providers.py:145 -msgid "The GitHub repository to send issues to." -msgstr "Das GitHub-Repository an das Aufgaben versendet werden." - -#: projects/providers.py:150 -msgid "The secret for a GitHub webhook to close a task." -msgstr "Das Geheimnis für einen GitHub-Webhook zum Schließen einer Aufgabe." +msgid "Add Simple integration" +msgstr "Simple Integration hinzufügen" -#: projects/providers.py:158 -msgid "Add GitLab integration" -msgstr "GitLab-Integration hinzufügen" +#: projects/providers.py:79 +msgid "Send to Simple" +msgstr "An Simple senden" -#: projects/providers.py:159 -msgid "Send to GitLab" -msgstr "An GitLab senden" - -#: projects/providers.py:163 -#, python-brace-format +#: projects/providers.py:80 msgid "" -"This integration allow the creation of issues in arbitrary repositories on " -"{self.gitlab_url}. The upload of attachments is not supported by GitLab." +"This integration allow the creation of issues in arbitrary Simple " +"repositories. The upload of attachments is not supported." msgstr "" -"Diese Integration ermöglicht die Erstellung von Aufgaben auf {self." -"gitlab_url}. Das Hochladen von Anhängen wird von GitLab nicht unterstützt." +"Diese Integration ermöglicht die Erstellung von Issues in beliebigen Simple " +"Repositories. Das Hochladen von Anhängen wird nicht unterstützt." -#: projects/providers.py:227 -msgid "The GitLab repository to send issues to." -msgstr "Das GitLab-Repository an das Aufgaben versendet werden." +#: projects/providers.py:89 +msgid "The URL of the project to send tasks to." +msgstr "Die URL des Projekts, an das Aufgaben gesendet werden sollen." -#: projects/providers.py:232 -msgid "The secret for a GitLab webhook to close a task." -msgstr "Das Geheimnis für einen GitLab-Webhook zum Schließen einer Aufgabe." +#: projects/providers.py:94 +msgid "The secret for a webhook to close a task (optional)." +msgstr "" +"Das Geheimnis für einen Webhook zum Schließen einer Aufgabe (optional)." #: projects/serializers/v1/__init__.py:162 msgid "A user with that e-mail is already a member of the project." @@ -2174,22 +2258,18 @@ msgstr "Es muss entweder ein Benutzer oder eine E-Mail angegeben werden." msgid "User and e-mail are mutually exclusive." msgstr "Benutzer und E-Mail schließen einander aus." -#: projects/serializers/v1/page.py:94 -msgid "item" +#: projects/serializers/v1/page.py:97 +msgid "entry" msgstr "Eintrag" -#: projects/serializers/v1/page.py:97 -msgid "items" -msgstr "Einträge" +#: projects/serializers/v1/page.py:133 +msgid "block" +msgstr "Block" -#: projects/serializers/v1/page.py:132 projects/serializers/v1/page.py:185 +#: projects/serializers/v1/page.py:186 msgid "set" msgstr "Set" -#: projects/serializers/v1/page.py:135 projects/serializers/v1/page.py:188 -msgid "sets" -msgstr "Sets" - #: projects/templates/projects/email/project_invite_message.txt:1 msgid "Greetings" msgstr "Hallo" @@ -2241,7 +2321,7 @@ msgstr "Sie sind dabei <strong>%(label)s</strong> permanent zu entfernen." #: projects/templates/projects/integration_confirm_delete.html:14 #: projects/templates/projects/project_confirm_delete.html:30 -#: projects/templates/projects/project_questions_modal_delete_valuesets.html:35 +#: projects/templates/projects/project_questions_modal_delete_valuesets.html:29 #: projects/templates/projects/snapshot_rollback.html:14 msgid "This action cannot be undone!" msgstr "Diese Aktion kann nicht rückgängig gemacht werden!" @@ -2281,7 +2361,7 @@ msgid "Dates" msgstr "Daten" #: projects/templates/projects/issue_detail.html:37 questions/apps.py:7 -#: questions/models/page.py:76 questions/models/question.py:255 +#: questions/models/page.py:76 questions/models/question.py:230 #: questions/models/questionset.py:66 msgid "Questions" msgstr "Fragen" @@ -2337,11 +2417,11 @@ msgstr "Sehr geehrte Damen und Herren," #: projects/templates/projects/issue_send_message.txt:3 #, python-format msgid "" -"The following task was identified in the project \"%(project_title)s\" " -"<%(project_url)s>:" +"The following task was identified in the project \"%(project_title)s\" <" +"%(project_url)s>:" msgstr "" -"Die folgende Aufgabe wurde im Projekt \"%(project_title)s\" " -"<%(project_url)s> identifiziert:" +"Die folgende Aufgabe wurde im Projekt \"%(project_title)s\" <" +"%(project_url)s> identifiziert:" #: projects/templates/projects/issue_send_message.txt:13 #, python-format @@ -2366,8 +2446,8 @@ msgid "" "You are about to remove the user <strong>%(user)s</strong> from the project " "<strong>%(title)s</strong>." msgstr "" -"Sie sind dabei den User <strong>%(user)s</strong> aus dem Projekt " -"<strong>%(title)s</strong> zu entfernen." +"Sie sind dabei den User <strong>%(user)s</strong> aus dem Projekt <strong>" +"%(title)s</strong> zu entfernen." #: projects/templates/projects/membership_form.html:9 #: projects/templates/projects/membership_form.html:11 @@ -2614,14 +2694,14 @@ msgstr "Antworten anzeigen" #: projects/templates/projects/project_detail_sidebar.html:57 #: projects/templates/projects/project_form.html:23 msgid "Update project tasks" -msgstr "Projekt Aufgaben bearbeiten" +msgstr "Projektaufgaben bearbeiten" #: projects/templates/projects/project_detail_sidebar.html:62 #: projects/templates/projects/project_detail_views.html:23 #: projects/templates/projects/project_detail_views.html:50 #: projects/templates/projects/project_form.html:31 msgid "Update project views" -msgstr "Projekt Ansichten bearbeiten" +msgstr "Projektansichten bearbeiten" #: projects/templates/projects/project_detail_sidebar.html:87 #: projects/templates/projects/project_detail_snapshots.html:25 @@ -2641,7 +2721,7 @@ msgid "Import values" msgstr "Werte importieren" #: projects/templates/projects/project_detail_sidebar.html:131 -#: projects/templates/projects/projects.html:70 +#: projects/templates/projects/projects.html:78 msgid "Import from file" msgstr "Importieren aus Datei" @@ -2650,14 +2730,14 @@ msgid "Import from parent project" msgstr "Importieren aus übergeordnetem Projekt" #: projects/templates/projects/project_detail_sidebar.html:147 -#: projects/templates/projects/projects.html:79 +#: projects/templates/projects/projects.html:87 msgid "Import directly" msgstr "Projekt direkt importieren" #: projects/templates/projects/project_detail_snapshots.html:22 #: projects/templates/projects/project_import.html:34 #: projects/templates/projects/project_import.html:104 -#: projects/templates/projects/site_projects.html:65 +#: projects/templates/projects/site_projects.html:66 msgid "Created" msgstr "Erstellt" @@ -2688,7 +2768,7 @@ msgstr "" "Snapshot zum Erstellen von Ansichten verwendet werden, und das Projekt kann " "bei Bedarf auch auf einen früheren Snapshot zurückgesetzt werden." -#: projects/templates/projects/project_detail_views.html:19 views/models.py:130 +#: projects/templates/projects/project_detail_views.html:19 views/models.py:135 msgid "View" msgstr "Ansicht" @@ -2748,7 +2828,7 @@ msgid "Save project" msgstr "Projekt speichern" #: projects/templates/projects/project_form.html:43 -#: projects/templates/projects/projects.html:31 +#: projects/templates/projects/projects.html:36 msgid "Create new project" msgstr "Neues Projekt erstellen" @@ -2769,7 +2849,7 @@ msgid "Import from %(source_title)s" msgstr "Importieren von %(source_title)s" #: projects/templates/projects/project_import.html:50 -#: questions/models/question.py:254 +#: questions/models/question.py:229 msgid "Question" msgstr "Frage" @@ -2802,33 +2882,22 @@ msgstr "Die Antwort konnte nicht importiert werden." msgid "Import project" msgstr "Projekt importieren" -#: projects/templates/projects/project_questions_add_field_button.html:6 -#: projects/templates/projects/project_questions_add_set_button.html:6 -#: projects/templates/projects/project_questions_questionset_head.html:11 -#: projects/templates/projects/project_questions_questionset_head.html:27 -#, python-format -msgid "Add %(name)s" -msgstr "%(name)s hinzufügen" - #: projects/templates/projects/project_questions_add_field_help.html:4 -#, python-format msgid "" -"Please enter the %(name_plural)s line by line. You can add %(name_plural)s " -"using the green button and remove them using the blue cross (×)." +"Please enter your entries line by line. You can add lines using the green " +"button and remove them using the blue cross (×)." msgstr "" -"Bitte nutzen Sie für die %(name_plural)s jeweils eine eigene Zeile. Sie " -"können weitere %(name_plural)s mit dem grünen Button hinzufügen und mit dem " -"blauen Kreuz (×) entfernen." +"Bitte nutzen Sie für die Einträge jeweils eine eigene Zeile. Sie können " +"weitere Einträge mit dem grünen Button hinzufügen und mit dem blauen Kreuz " +"(×) entfernen." #: projects/templates/projects/project_questions_add_set_help.html:4 -#, python-format msgid "" -"Please enter the %(name_plural)s block by block. You can add %(name_plural)s " -"using the green button and remove them using the blue cross (×)." +"Please enter your entries block by block. You can add blocks using the green " +"button and remove them using the blue cross (×)." msgstr "" -"Bitte geben Sie die %(name_plural)s blockweise ein. Sie können " -"%(name_plural)s über die grüne Schaltfläche hinzufügen und über das blaue " -"Kreuz (×) entfernen." +"Bitte geben Sie die Einträge blockweise ein. Sie können Blöcke über die " +"grüne Schaltfläche hinzufügen und über das blaue Kreuz (×) entfernen." #: projects/templates/projects/project_questions_buttons.html:10 #: projects/templates/projects/project_questions_buttons.html:42 @@ -2902,7 +2971,7 @@ msgstr "Aktuell:" msgid "Update:" msgstr "Zuletzt geändert:" -#: projects/templates/projects/project_questions_form_group_radio.html:42 +#: projects/templates/projects/project_questions_form_group_radio.html:62 msgid "No options are available." msgstr "Keine Optionen vorhanden." @@ -2911,40 +2980,28 @@ msgid "Please select" msgstr "Bitte auswählen" #: projects/templates/projects/project_questions_head.html:5 -#: projects/templates/projects/projects.html:121 +#: projects/templates/projects/projects.html:131 msgid "My Projects" msgstr "Meine Projekte" #: projects/templates/projects/project_questions_modal_delete_valuesets.html:17 -#, python-format -msgid "" -"You are about to permanently delete the %(name)s <strong>%(object)s</strong>." -msgstr "" -"Sie sind dabei den %(name)s <strong>%(object)s</strong> permanent zu " -"entfernen." +msgid "You are about to permanently delete this tab." +msgstr "Sie sind dabei diesen Tab permanent zu entfernen." #: projects/templates/projects/project_questions_modal_delete_valuesets.html:23 -#, python-format -msgid "You are about to permanently delete this %(name)s." -msgstr "Sie sind dabei diesen %(name)s permanent zu entfernen." - -#: projects/templates/projects/project_questions_modal_delete_valuesets.html:29 -#, python-format msgid "" -"This includes all given answers for this %(name)s on all pages, not just " -"this one." +"This includes all given answers for this tab on all pages, not just this one." msgstr "" -"Dies umfasst alle gegebenen Antworten für dieses %(name)s auf allen Seiten, " -"nicht nur dieser." +"Dies umfasst alle gegebenen Antworten für diesen Tab auf allen Seiten, nicht " +"nur dieser." -#: projects/templates/projects/project_questions_modal_delete_valuesets.html:45 +#: projects/templates/projects/project_questions_modal_delete_valuesets.html:39 msgid "Delete" msgstr "Entfernen" #: projects/templates/projects/project_questions_modal_form_valuesets.html:20 -#, python-format -msgid "Please give the %(name)s a meaningful name." -msgstr "Bitte geben Sie dem %(name)s einen aus­sa­ge­kräf­tigen Namen." +msgid "Please give the tab a meaningful name." +msgstr "Bitte geben Sie dem Tab einen aus­sa­ge­kräf­tigen Namen." #: projects/templates/projects/project_questions_navigation_help.html:5 msgid "Using the navigation will save your input." @@ -2957,22 +3014,24 @@ msgstr "" "gespeicherten Eingaben verworfen werden." #: projects/templates/projects/project_questions_navigation_help.html:14 -msgid "" -"Entries with <i class=\"fa fa-question-circle-o small\" aria-" -"hidden=\"true\"></i> might be skipped based on your input." -msgstr "" -"Einträge mit <i class=\"fa fa-question-circle-o small\" aria-" -"hidden=\"true\"></i> können aufgrund Ihrer Eingabe übersprungen werden." +msgid "Grey entries will be conditionally skipped based on your input." +msgstr "Graue Einträge werden abhängig von Ihren Eingaben übersprungen." #: projects/templates/projects/project_questions_overview.html:14 +msgid "Reload page" +msgstr "Seite neu laden" + +#: projects/templates/projects/project_questions_overview.html:17 #: projects/templates/projects/site_projects.html:52 msgid "Back to my projects" msgstr "Zurück zu meinen Projekten" -#: projects/templates/projects/project_questions_progress.html:6 +#: projects/templates/projects/project_questions_progress.html:4 +#: projects/templates/projects/project_questions_progress.html:11 +#: projects/templatetags/projects_tags.py:27 #, python-format -msgid "%(values)s of %(total)s" -msgstr "%(values)s von %(total)s" +msgid "%(count)s of %(total)s" +msgstr "%(count)s von %(total)s" #: projects/templates/projects/project_questions_question_label.html:5 msgid "(optional)" @@ -2987,35 +3046,36 @@ msgid "" msgstr "" "Warnung: In der Datenbank sind mehrere Antworten vorhanden. Dies kann " "aufgrund eines technischen Problems in der Vergangenheit geschehen. Sie " -"können unerwünschte Antworten über das Feld \"Eintrag entfernen\" (<i " -"class=\"fa fa-times\"></i>) entfernen. Bitte kontaktieren Sie den Support, " -"wenn das Problem weiterhin besteht." +"können unerwünschte Antworten über das Feld \"Eintrag entfernen\" (<i class=" +"\"fa fa-times\"></i>) entfernen. Bitte kontaktieren Sie den Support, wenn " +"das Problem weiterhin besteht." -#: projects/templates/projects/project_questions_questionset_head.html:34 -#, python-format -msgid "Update %(name)s" -msgstr "%(name)s bearbeiten" +#: projects/templates/projects/project_questions_questionset_head.html:33 +msgid "Edit tab" +msgstr "Tab bearbeiten" -#: projects/templates/projects/project_questions_questionset_head.html:39 -#: projects/templates/projects/project_questions_remove_field.html:4 -#: projects/templates/projects/project_questions_remove_set.html:4 -#, python-format -msgid "Remove %(name)s" -msgstr "%(name)s entfernen" +#: projects/templates/projects/project_questions_questionset_head.html:37 +msgid "Remove tab" +msgstr "Tab entfernen" #: projects/templates/projects/project_questions_questionset_head_help.html:4 -#, python-format msgid "" -"Please fill in the form for each %(name)s. The different %(name_plural)s " -"will be referred to in following questions. You can add a new %(name)s using " -"the green button. Once created, you can edit or delete %(name_plural)s using " -"the buttons in the top right corner." +"Please fill in the form for each tab. The same tabs may be used later on " +"other pages. You can add a new tab using the green button. Once created, you " +"can edit or delete tabs using the buttons in the top right corner." msgstr "" -"Bitte füllen Sie das Formular für jeden %(name)s aus. Die verschiedenen " -"%(name_plural)s werden eventuell in späteren Fragen wieder verwendet. Sie " -"können einen neuen %(name)s mit dem grünen Button hinzufügen. Bereits " -"angelegte %(name_plural)s können mit den Buttons oben rechts bearbeitet oder " -"wieder entfernt werden." +"Bitte füllen Sie das Formular für jeden Tab aus. Die verschiedenen Tabs " +"werden eventuell in späteren Fragen wieder verwendet. Sie können einen neuen " +"Tab mit dem grünen Button hinzufügen. Bereits angelegte Tabs können mit den " +"Buttons oben rechts bearbeitet oder wieder entfernt werden." + +#: projects/templates/projects/project_questions_remove_field.html:3 +msgid "Remove entry" +msgstr "Eintrag entfernen" + +#: projects/templates/projects/project_questions_remove_set.html:3 +msgid "Remove block" +msgstr "Block entfernen" #: projects/templates/projects/project_questions_save_error.html:6 msgid "" @@ -3030,6 +3090,8 @@ msgid "Overview" msgstr "Übersicht" #: projects/templates/projects/project_questions_sidebar.html:7 +#: projects/templates/projects/projects.html:137 +#: projects/templates/projects/site_projects.html:65 msgid "Progress" msgstr "Fortschritt" @@ -3037,8 +3099,33 @@ msgstr "Fortschritt" msgid "Navigation" msgstr "Navigation" +#: projects/templates/projects/project_questions_value_errors.html:6 +msgid "" +"This field could not be saved, since somebody else did so while you were " +"editing. You will need to reload the page to make changes, but your input " +"will be overwritten." +msgstr "" +"Dieses Feld konnte nicht gespeichert werden, da jemand anderes dies getan " +"hat, während Sie es bearbeitet haben. Sie müssen die Seite neu laden, um " +"Änderungen vorzunehmen, aber Ihre Eingaben werden dabei überschrieben." + +#: projects/templates/projects/project_questions_value_errors.html:12 +msgid "" +"This field could not be saved, since somebody else removed it while you were " +"editing. You will need to reload the page to proceed, but your input will be " +"lost." +msgstr "" +"Dieses Feld konnte nicht gespeichert werden, da es während Ihrer Bearbeitung " +"von jemand anderem entfernt wurde. Sie müssen die Seite neu laden, um " +"fortzufahren, aber Ihre Eingaben gehen dabei verloren." + +#: projects/templates/projects/project_questions_value_errors.html:18 +#: projects/viewsets.py:400 +msgid "You reached the file quota for this project." +msgstr "Sie haben die Quota für dieses Projekt erreicht." + #: projects/templates/projects/project_view.html:90 -#: projects/views/project.py:202 +#: projects/views/project.py:207 msgid "Error" msgstr "Fehler" @@ -3048,22 +3135,22 @@ msgstr "" "Beim Erstellen der Ansicht ist ein Fehler aufgetreten. Bitte kontaktieren " "Sie den Support." -#: projects/templates/projects/projects.html:42 +#: projects/templates/projects/projects.html:47 #, python-format msgid "View all projects on %(site)s" msgstr "Alle Projekte auf %(site)s anzeigen" -#: projects/templates/projects/projects.html:48 +#: projects/templates/projects/projects.html:54 #: projects/templates/projects/site_projects.html:16 msgid "Filter projects" msgstr "Projekte filtern" -#: projects/templates/projects/projects.html:51 +#: projects/templates/projects/projects.html:57 #: projects/templates/projects/site_projects.html:19 msgid "Search project title" msgstr "Suche nach Projekttitel" -#: projects/templates/projects/projects.html:58 +#: projects/templates/projects/projects.html:64 #: projects/templates/projects/site_projects.html:26 #, python-format msgid "" @@ -3071,20 +3158,20 @@ msgid "" msgstr "" "%(number_of_filtered_projects)s von %(number_of_projects)s Projekte angezeigt" -#: projects/templates/projects/projects.html:65 +#: projects/templates/projects/projects.html:73 msgid "Import existing project" msgstr "Vorhandenes Projekt importieren" -#: projects/templates/projects/projects.html:96 +#: projects/templates/projects/projects.html:106 msgid "Pending invitations" msgstr "Ausstehende Einladungen" -#: projects/templates/projects/projects.html:112 +#: projects/templates/projects/projects.html:122 msgid "Click on one of the links to join the projects." msgstr "Klicken Sie auf einen der Links, um an den Projekten teilzunehmen." -#: projects/templates/projects/projects.html:128 -#: projects/templates/projects/site_projects.html:66 +#: projects/templates/projects/projects.html:139 +#: projects/templates/projects/site_projects.html:67 msgid "Last changed" msgstr "Letzte Änderung" @@ -3129,20 +3216,37 @@ msgstr "" msgid "Rollback" msgstr "Zurücksetzen" -#: projects/validators.py:23 projects/viewsets.py:368 -msgid "You reached the file quota for this project." +#: projects/templatetags/projects_tags.py:49 +#, python-format +msgid "(%(progress)s progress)" +msgstr "(%(progress)s Fortschritt)" + +#: projects/validators.py:22 +msgid "A newer version of this value was found." +msgstr "Eine neuere Version dieses Wertes wurde gefunden." + +#: projects/validators.py:34 +msgid "" +"An existing value for this attribute/set_prefix/set_index/collection_index " +"was found." +msgstr "" +"Es wurde ein vorhandener Wert für dieses Attribut/set_prefix/set_index/" +"collection_index gefunden." + +#: projects/validators.py:49 +msgid "The file quota for this project has been reached." msgstr "Sie haben die Quota für dieses Projekt erreicht." -#: projects/views/project.py:182 +#: projects/views/project.py:187 msgid "Sorry, your invitation has been expired." msgstr "Entschuldigung, Ihre Einladung ist abgelaufen." -#: projects/views/project.py:185 +#: projects/views/project.py:190 #, python-format msgid "Sorry, but this invitation is for the user \"%s\"." msgstr "Entschuldigung, aber diese Einladung ist für den Benutzer \"%s\"." -#: projects/views/project.py:199 +#: projects/views/project.py:204 msgid "Sorry, the invitation link is not valid." msgstr "Der Einladungslink ist leider nicht gültig." @@ -3183,7 +3287,7 @@ msgstr "Abschnitte" msgid "The sections of this catalog." msgstr "Der Abschnitte für diesen Katalog." -#: questions/models/catalog.py:71 tasks/models.py:53 views/models.py:54 +#: questions/models/catalog.py:71 tasks/models.py:56 views/models.py:57 msgid "Sites" msgstr "Standorte" @@ -3196,7 +3300,7 @@ msgid "The sites that can edit this catalog (in a multi site setup)." msgstr "" "Die Seiten, die diesen Katalog bearbeiten können (im Multi-Site-Setup)." -#: questions/models/catalog.py:81 tasks/models.py:63 views/models.py:64 +#: questions/models/catalog.py:81 tasks/models.py:66 views/models.py:67 msgid "Group" msgstr "Gruppe" @@ -3206,75 +3310,75 @@ msgstr "Die Gruppen für die dieser Katalog aktiv ist." #: questions/models/catalog.py:86 questions/models/page.py:86 #: questions/models/questionset.py:81 questions/models/section.py:69 -#: tasks/models.py:68 views/models.py:74 +#: tasks/models.py:71 views/models.py:77 msgid "Title (primary)" msgstr "Titel (erste Sprache)" #: questions/models/catalog.py:87 -msgid "The title for this catalog in the primary language." +msgid "The title for this catalog (in the primary language)." msgstr "Der Titel für diesen Katalog (erste Sprache)." #: questions/models/catalog.py:91 questions/models/page.py:91 #: questions/models/questionset.py:86 questions/models/section.py:74 -#: tasks/models.py:73 views/models.py:79 +#: tasks/models.py:76 views/models.py:82 msgid "Title (secondary)" msgstr "Titel (zweite Sprache)" #: questions/models/catalog.py:92 -msgid "The title for this catalog in the secondary language." +msgid "The title for this catalog (in the secondary language)." msgstr "Der Titel für diesen Katalog (zweite Sprache)." #: questions/models/catalog.py:96 questions/models/page.py:96 #: questions/models/questionset.py:91 questions/models/section.py:79 -#: tasks/models.py:78 views/models.py:84 +#: tasks/models.py:81 views/models.py:87 msgid "Title (tertiary)" msgstr "Titel (dritte Sprache)" #: questions/models/catalog.py:97 -msgid "The title for this catalog in the tertiary language." +msgid "The title for this catalog (in the tertiary language)." msgstr "Der Titel für diesen Katalog (dritte Sprache)." #: questions/models/catalog.py:101 questions/models/page.py:101 #: questions/models/questionset.py:96 questions/models/section.py:84 -#: tasks/models.py:83 views/models.py:89 +#: tasks/models.py:86 views/models.py:92 msgid "Title (quaternary)" msgstr "Titel (vierte Sprache)" #: questions/models/catalog.py:102 -msgid "The title for this catalog in the quaternary language." +msgid "The title for this catalog (in the quaternary language)." msgstr "Der Titel für diesen Katalog (vierte Sprache)." #: questions/models/catalog.py:106 questions/models/page.py:106 #: questions/models/questionset.py:101 questions/models/section.py:89 -#: tasks/models.py:88 views/models.py:94 +#: tasks/models.py:91 views/models.py:97 msgid "Title (quinary)" msgstr "Titel (fünfte Sprache)" #: questions/models/catalog.py:107 -msgid "The title for this catalog in the quinary language." +msgid "The title for this catalog (in the quinary language)." msgstr "Der Titel für diesen Katalog (fünfte Sprache)." #: questions/models/catalog.py:112 -msgid "The help text for this catalog in the primary language." +msgid "The help text for this catalog (in the primary language)." msgstr "Der Hilfetext für diesen Katalog (erste Sprache)." #: questions/models/catalog.py:117 -msgid "The help text for this catalog in the secondary language." +msgid "The help text for this catalog (in the secondary language)." msgstr "Der Hilfetext für diesen Katalog (zweite Sprache)." #: questions/models/catalog.py:122 -msgid "The help text for this catalog in the tertiary language." +msgid "The help text for this catalog (in the tertiary language)." msgstr "Der Hilfetext für diesen Katalog (dritte Sprache)." #: questions/models/catalog.py:127 -msgid "The help text for this catalog in the quaternary language." +msgid "The help text for this catalog (in the quaternary language)." msgstr "Der Hilfetext für diesen Katalog (vierte Sprache)." #: questions/models/catalog.py:132 -msgid "The help text for this catalog in the quinary language." +msgid "The help text for this catalog (in the quinary language)." msgstr "Der Hilfetext für diesen Katalog (fünfte Sprache)." -#: questions/models/catalog.py:136 tasks/models.py:144 views/models.py:124 +#: questions/models/catalog.py:136 tasks/models.py:147 views/models.py:127 msgid "Available" msgstr "Verfügbar" @@ -3282,7 +3386,7 @@ msgstr "Verfügbar" msgid "Designates whether this catalog is generally available for projects." msgstr "Legt fest, ob dieser Katalog für Projekte verfügbar ist." -#: questions/models/catalog.py:143 tasks/models.py:47 views/models.py:48 +#: questions/models/catalog.py:143 tasks/models.py:50 views/models.py:51 msgid "Catalogs" msgstr "Kataloge" @@ -3314,7 +3418,7 @@ msgstr "" msgid "The attribute this page belongs to." msgstr "Das Attribut zu dem diese Seite gehört." -#: questions/models/page.py:66 questions/models/question.py:58 +#: questions/models/page.py:66 questions/models/question.py:56 #: questions/models/questionset.py:71 msgid "is collection" msgstr "Ist eine Sammlung" @@ -3324,6 +3428,7 @@ msgid "Designates whether this page is a collection." msgstr "Legt fest, ob diese Seite eine Sammlung ist." #: questions/models/page.py:71 questions/models/questionset.py:61 +#: questions/models/questionset.py:163 msgid "Question sets" msgstr "Fragensets" @@ -3340,283 +3445,234 @@ msgid "The sites that can edit this page (in a multi site setup)." msgstr "Die Seiten, die diese Seite bearbeiten können (im Multi-Site-Setup)." #: questions/models/page.py:87 -msgid "The title for this page in the primary language." +msgid "The title for this page (in the primary language)." msgstr "Der Titel für diese Seite (erste Sprache)." #: questions/models/page.py:92 -msgid "The title for this page in the secondary language." +msgid "The title for this page (in the secondary language)." msgstr "Der Titel für diese Seite (zweite Sprache)." #: questions/models/page.py:97 -msgid "The title for this page in the tertiary language." +msgid "The title for this page (in the tertiary language)." msgstr "Der Titel für diese Seite (dritte Sprache)." #: questions/models/page.py:102 -msgid "The title for this page in the quaternary language." +msgid "The title for this page (in the quaternary language)." msgstr "Der Titel für diese Seite (vierte Sprache)." #: questions/models/page.py:107 -msgid "The title for this page in the quinary language." +msgid "The title for this page (in the quinary language)." msgstr "Der Titel für diese Seite (fünfte Sprache)." #: questions/models/page.py:112 -msgid "The help text for this page in the primary language." +msgid "The help text for this page (in the primary language)." msgstr "Der Hilfetext für diese Seite (erste Sprache)." #: questions/models/page.py:117 -msgid "The help text for this page in the secondary language." +msgid "The help text for this page (in the secondary language)." msgstr "Der Hilfetext für diese Seite (zweite Sprache)." #: questions/models/page.py:122 -msgid "The help text for this page in the tertiary language." +msgid "The help text for this page (in the tertiary language)." msgstr "Der Hilfetext für diese Seite (dritte Sprache)." #: questions/models/page.py:127 -msgid "The help text for this page in the quaternary language." +msgid "The help text for this page (in the quaternary language)." msgstr "Der Hilfetext für diese Seite (vierte Sprache)." #: questions/models/page.py:132 -msgid "The help text for this page in the quinary language." +msgid "The help text for this page (in the quinary language)." msgstr "Der Hilfetext für diese Seite (fünfte Sprache)." -#: questions/models/page.py:136 questions/models/question.py:158 +#: questions/models/page.py:136 questions/models/question.py:156 #: questions/models/questionset.py:131 msgid "Name (primary)" msgstr "Name (erste Sprache)" #: questions/models/page.py:137 -msgid "The name displayed for this page in the primary language." +msgid "The name displayed for this page (in the primary language)." msgstr "Der Name, der für diese Seite angezeigt wird (erste Sprache)." -#: questions/models/page.py:141 questions/models/question.py:163 +#: questions/models/page.py:141 questions/models/question.py:161 #: questions/models/questionset.py:136 msgid "Name (secondary)" msgstr "Name (zweite Sprache)" #: questions/models/page.py:142 -msgid "The name displayed for this page in the secondary language." +msgid "The name displayed for this page (in the secondary language)." msgstr "Der Name, der für diese Seite angezeigt wird (zweite Sprache)." -#: questions/models/page.py:146 questions/models/question.py:168 +#: questions/models/page.py:146 questions/models/question.py:166 #: questions/models/questionset.py:141 msgid "Name (tertiary)" msgstr "Name (dritte Sprache)" #: questions/models/page.py:147 -msgid "The name displayed for this page in the tertiary language." +msgid "The name displayed for this page (in the tertiary language)." msgstr "Der Name, der für diese Seite angezeigt wird (dritte Sprache)." -#: questions/models/page.py:151 questions/models/question.py:173 +#: questions/models/page.py:151 questions/models/question.py:171 #: questions/models/questionset.py:146 msgid "Name (quaternary)" msgstr "Name (vierte Sprache)" #: questions/models/page.py:152 -msgid "The name displayed for this page in the quaternary language." +msgid "The name displayed for this page (in the quaternary language)." msgstr "Der Name, der für diese Seite angezeigt wird (vierte Sprache)." -#: questions/models/page.py:156 questions/models/question.py:178 +#: questions/models/page.py:156 questions/models/question.py:176 #: questions/models/questionset.py:151 msgid "Name (quinary)" msgstr "Name (fünfte Sprache)" #: questions/models/page.py:157 -msgid "The name displayed for this page in the quinary language." +msgid "The name displayed for this page (in the quinary language)." msgstr "Der Name, der für diese Seite angezeigt wird (fünfte Sprache)." -#: questions/models/page.py:161 questions/models/question.py:183 -#: questions/models/questionset.py:156 -msgid "Plural name (primary)" -msgstr "Name (Plural, erste Sprache)" - #: questions/models/page.py:162 -msgid "The plural name displayed for this page in the primary language." -msgstr "Der Name (Plural), der für diese Seite angezeigt wird (erste Sprache)." - -#: questions/models/page.py:166 questions/models/question.py:188 -#: questions/models/questionset.py:161 -msgid "Plural name (secondary)" -msgstr "Name (Plural, zweite Sprache)" - -#: questions/models/page.py:167 -msgid "The plural name displayed for this page in the secondary language." -msgstr "" -"Der Name (Plural), der für diese Seite angezeigt wird (zweite Sprache)." - -#: questions/models/page.py:171 questions/models/question.py:193 -#: questions/models/questionset.py:166 -msgid "Plural name (tertiary)" -msgstr "Name (Plural, dritte Sprache)" - -#: questions/models/page.py:172 -msgid "The plural name displayed for this page in the tertiary language." -msgstr "" -"Der Name (Plural), der für diese Seite angezeigt wird (dritte Sprache)." - -#: questions/models/page.py:176 questions/models/question.py:198 -#: questions/models/questionset.py:171 -msgid "Plural name (quaternary)" -msgstr "Name (Plural, vierte Sprache)" - -#: questions/models/page.py:177 -msgid "The plural name displayed for this page in the quaternary language." -msgstr "" -"Der Name (Plural), der für diese Seite angezeigt wird (vierte Sprache)." - -#: questions/models/page.py:181 questions/models/question.py:203 -#: questions/models/questionset.py:176 -msgid "Plural name (quinary)" -msgstr "Name (Plural, fünfte Sprache)" - -#: questions/models/page.py:182 -msgid "The plural name displayed for this page in the quinary language." -msgstr "" -"Der Name (Plural), der für diese Seite angezeigt wird (fünfte Sprache)." - -#: questions/models/page.py:187 msgid "List of conditions evaluated for this page." msgstr "Liste der Bedingungen die für diese Seite ausgewertet werden." -#: questions/models/page.py:193 questions/models/section.py:59 +#: questions/models/page.py:168 questions/models/section.py:59 msgid "Pages" msgstr "Seiten" -#: questions/models/question.py:29 +#: questions/models/question.py:27 msgid "The Uniform Resource Identifier of this question (auto-generated)." msgstr "Der Uniform Resource Identifier diese Frage (automatisch erstellt)." -#: questions/models/question.py:34 +#: questions/models/question.py:32 msgid "The prefix for the URI of this question." msgstr "Das Präfix für die URI dieser Frage." -#: questions/models/question.py:39 +#: questions/models/question.py:37 msgid "The path for the URI of this question." msgstr "Der Pfad für die URI dieser Frage." -#: questions/models/question.py:44 +#: questions/models/question.py:42 msgid "Additional internal information about this question." msgstr "Zusätzliche interne Informationen über diesen Abschnitt." -#: questions/models/question.py:49 +#: questions/models/question.py:47 msgid "Designates whether this question can be changed." msgstr "Bezeichnet, ob diese Frage geändert werden kann." -#: questions/models/question.py:54 +#: questions/models/question.py:52 msgid "The attribute this question belongs to." msgstr "Das Attribut zu dem diese Frage gehört." -#: questions/models/question.py:59 +#: questions/models/question.py:57 msgid "Designates whether this question is a collection." msgstr "Legt fest, ob diese Frage eine Sammlung ist." -#: questions/models/question.py:63 +#: questions/models/question.py:61 msgid "is optional" msgstr "ist optional" -#: questions/models/question.py:64 +#: questions/models/question.py:62 msgid "Designates whether this question is optional." msgstr "Legt fest, ob diese Frage optional ist." -#: questions/models/question.py:69 +#: questions/models/question.py:67 msgid "The sites that can edit this question (in a multi site setup)." msgstr "Die Seiten, die diese Seite bearbeiten können (im Multi-Site-Setup)." -#: questions/models/question.py:74 -msgid "The help text for this question in the primary language." +#: questions/models/question.py:72 +msgid "The help text for this question (in the primary language)." msgstr "Der Hilfetext für diese Frage (erste Sprache)." -#: questions/models/question.py:79 -msgid "The help text for this question in the secondary language." +#: questions/models/question.py:77 +msgid "The help text for this question (in the secondary language)." msgstr "Der Hilfetext für diese Frage (zweite Sprache)." -#: questions/models/question.py:84 -msgid "The help text for this question in the tertiary language." +#: questions/models/question.py:82 +msgid "The help text for this question (in the tertiary language)." msgstr "Der Hilfetext für diese Frage (dritte Sprache)." -#: questions/models/question.py:89 -msgid "The help text for this question in the quaternary language." +#: questions/models/question.py:87 +msgid "The help text for this question (in the quaternary language)." msgstr "Der Hilfetext für diese Frage (vierte Sprache)." -#: questions/models/question.py:94 -msgid "The help text for this question in the quinary language." +#: questions/models/question.py:92 +msgid "The help text for this question (in the quinary language)." msgstr "Der Hilfetext für diese Frage (fünfte Sprache)." -#: questions/models/question.py:99 -msgid "The text for this question in the primary language." +#: questions/models/question.py:97 +msgid "The text for this question (in the primary language)." msgstr "Der Text für diese Frage (erste Sprache)." -#: questions/models/question.py:104 -msgid "The text for this question in the secondary language." -msgstr "Der Titel für dieses Fragenset (zweite Sprache)." +#: questions/models/question.py:102 +msgid "The text for this question (in the secondary language)." +msgstr "Der Titel für diese Frage (zweite Sprache)." -#: questions/models/question.py:109 -msgid "The text for this question in the tertiary language." -msgstr "Der Titel für dieses Fragenset (dritte Sprache)." +#: questions/models/question.py:107 +msgid "The text for this question (in the tertiary language)." +msgstr "Der Text für diese Frage (dritte Sprache)." -#: questions/models/question.py:114 -msgid "The text for this question in the quaternary language." +#: questions/models/question.py:112 +msgid "The text for this question (in the quaternary language)." msgstr "Der Text für diese Frage (vierte Sprache)." -#: questions/models/question.py:119 -msgid "The text for this question in the quinary language." -msgstr "Der Titel für dieses Fragenset (fünfte Sprache)." +#: questions/models/question.py:117 +msgid "The text for this question (in the quinary language)." +msgstr "Der Titel für diese Frage (fünfte Sprache)." -#: questions/models/question.py:123 +#: questions/models/question.py:121 msgid "Default text value (primary)" msgstr "Standardmäßige Antwort (erste Sprache)" -#: questions/models/question.py:124 -msgid "The default text value for this question in the primary language." +#: questions/models/question.py:122 +msgid "The default text value for this question (in the primary language)." msgstr "Die standardmäßige Antwort für diese Frage (erste Sprache)." -#: questions/models/question.py:128 +#: questions/models/question.py:126 msgid "Default text value (secondary)" msgstr "Standardmäßige Antwort (zweite Sprache)" -#: questions/models/question.py:129 -msgid "The default text value for this question in the secondary language." +#: questions/models/question.py:127 +msgid "The default text value for this question (in the secondary language)." msgstr "Die standardmäßige Antwort für diese Frage (zweite Sprache)." -#: questions/models/question.py:133 +#: questions/models/question.py:131 msgid "Default text value (tertiary)" msgstr "Standardmäßige Antwort (dritte Sprache)" -#: questions/models/question.py:134 -msgid "The default text value for this question in the tertiary language." +#: questions/models/question.py:132 +msgid "The default text value for this question (in the tertiary language)." msgstr "Die standardmäßige Antwort für diese Frage (dritte Sprache)." -#: questions/models/question.py:138 +#: questions/models/question.py:136 msgid "Default text value (quaternary)" msgstr "Standardmäßige Antwort (vierte Sprache)" -#: questions/models/question.py:139 -msgid "The default text value for this question in the quaternary language." +#: questions/models/question.py:137 +msgid "The default text value for this question (in the quaternary language)." msgstr "Die standardmäßige Antwort für diese Frage (vierte Sprache)." -#: questions/models/question.py:143 +#: questions/models/question.py:141 msgid "Default text value (quinary)" msgstr "Standardmäßige Antwort (fünfte Sprache)" -#: questions/models/question.py:144 -msgid "The default text value for this question in the quinary language." +#: questions/models/question.py:142 +msgid "The default text value for this question (in the quinary language)." msgstr "Die standardmäßige Antwort (fünfte Sprache)." -#: questions/models/question.py:148 +#: questions/models/question.py:146 msgid "Default option" msgstr "Standardmäßige Option" -#: questions/models/question.py:149 +#: questions/models/question.py:147 msgid "" "The default option for this question. To be used with regular optionsets." msgstr "" "Die standardmäßige Option für diese Frage. Soll mit regulären Optionssets " "verwendet werden." -#: questions/models/question.py:153 +#: questions/models/question.py:151 msgid "Default external id" msgstr "Standardmäßige externe ID" -#: questions/models/question.py:154 +#: questions/models/question.py:152 msgid "" "The default external id for this question. To be used with dynamic " "optionsets." @@ -3624,108 +3680,84 @@ msgstr "" "Die standardmäßige externe ID für diese Frage. Zur Verwendung mit " "dynamischen Optionensets." -#: questions/models/question.py:159 -msgid "The name displayed for this question in the primary language." +#: questions/models/question.py:157 +msgid "The name displayed for this question (in the primary language)." msgstr "Der Name, der für diese Frage angezeigt wird (erste Sprache)." -#: questions/models/question.py:164 -msgid "The name displayed for this question in the secondary language." +#: questions/models/question.py:162 +msgid "The name displayed for this question (in the secondary language)." msgstr "Der Name, der für diese Frage angezeigt wird (zweite Sprache)." -#: questions/models/question.py:169 -msgid "The name displayed for this question in the tertiary language." +#: questions/models/question.py:167 +msgid "The name displayed for this question (in the tertiary language)." msgstr "Der Name, der für diese Frage angezeigt wird (dritte Sprache)." -#: questions/models/question.py:174 -msgid "The name displayed for this question in the quaternary language." +#: questions/models/question.py:172 +msgid "The name displayed for this question (in the quaternary language)." msgstr "Der Name, der für diese Frage angezeigt wird (vierte Sprache)." -#: questions/models/question.py:179 -msgid "The name displayed for this question in the quinary language." +#: questions/models/question.py:177 +msgid "The name displayed for this question (in the quinary language)." msgstr "Der Name, der für diese Frage angezeigt wird (fünfte Sprache)." -#: questions/models/question.py:184 -msgid "The plural name displayed for this question in the primary language." -msgstr "Der Name (Plural), der für diese Frage angezeigt wird (erste Sprache)." - -#: questions/models/question.py:189 -msgid "The plural name displayed for this question in the secondary language." -msgstr "" -"Der Name (Plural), der für diese Frage angezeigt wird (zweite Sprache)." - -#: questions/models/question.py:194 -msgid "The plural name displayed for this question in the tertiary language." -msgstr "" -"Der Name (Plural), der für diese Frage angezeigt wird (dritte Sprache)." - -#: questions/models/question.py:199 -msgid "The plural name displayed for this question in the quaternary language." -msgstr "" -"Der Name (Plural), der für diese Frage angezeigt wird (vierte Sprache)." - -#: questions/models/question.py:204 -msgid "The plural name displayed for this question in the quinary language." -msgstr "" -"Der Name (Plural), der für diese Frage angezeigt wird (fünfte Sprache)." - -#: questions/models/question.py:208 +#: questions/models/question.py:181 msgid "Widget type" msgstr "Widget-Typ" -#: questions/models/question.py:209 +#: questions/models/question.py:182 msgid "Type of widget for this question." msgstr "Art von Widget für diese Frage." -#: questions/models/question.py:214 +#: questions/models/question.py:187 msgid "Type of value for this question." msgstr "Art von Wert für diese Frage." -#: questions/models/question.py:218 -#: questions/templates/questions/export/question.html:65 +#: questions/models/question.py:191 +#: questions/templates/questions/export/question.html:60 msgid "Minimum" msgstr "Minimum" -#: questions/models/question.py:219 +#: questions/models/question.py:192 msgid "Minimal value for this question." msgstr "Minimaler Wert für diese Frage." -#: questions/models/question.py:223 -#: questions/templates/questions/export/question.html:66 +#: questions/models/question.py:196 +#: questions/templates/questions/export/question.html:61 msgid "Maximum" msgstr "Maximum" -#: questions/models/question.py:224 +#: questions/models/question.py:197 msgid "Maximum value for this question." msgstr "Maximaler Wert für diese Frage." -#: questions/models/question.py:228 -#: questions/templates/questions/export/question.html:67 +#: questions/models/question.py:201 +#: questions/templates/questions/export/question.html:62 msgid "Step" msgstr "Schrittgröße" -#: questions/models/question.py:229 +#: questions/models/question.py:202 msgid "" "Step in which the value for this question can be incremented/decremented." msgstr "" "Schritte in denen der Wert dieser Frage erhöht oder verringert werden kann." -#: questions/models/question.py:234 +#: questions/models/question.py:207 msgid "Unit for this question." msgstr "Maßeinheit für diese Frage." -#: questions/models/question.py:238 +#: questions/models/question.py:211 msgid "Width" msgstr "Breite" -#: questions/models/question.py:239 +#: questions/models/question.py:212 msgid "Width for the widget of this question (optional, full width: 12)." msgstr "Breite für das Widget dieser Frage (optional, volle Breite: 12)." -#: questions/models/question.py:244 +#: questions/models/question.py:217 msgid "Option sets for this question." msgstr "Optionenset für diese Frage." -#: questions/models/question.py:249 +#: questions/models/question.py:222 msgid "List of conditions evaluated for this question." msgstr "Liste der Bedingungen die für diese Frage ausgewertet werden." @@ -3774,100 +3806,70 @@ msgstr "" "Die Seiten, die dieses Fragenset bearbeiten können (im Multi-Site-Setup)." #: questions/models/questionset.py:82 -msgid "The title for this question set in the primary language." +msgid "The title for this question set (in the primary language)." msgstr "Der Titel für dieses Fragenset (erste Sprache)." #: questions/models/questionset.py:87 -msgid "The title for this question set in the secondary language." +msgid "The title for this question set (in the secondary language)." msgstr "Der Titel für dieses Fragenset (zweite Sprache)." #: questions/models/questionset.py:92 -msgid "The title for this question set in the tertiary language." +msgid "The title for this question set (in the tertiary language)." msgstr "Der Titel für dieses Fragenset (dritte Sprache)." #: questions/models/questionset.py:97 -msgid "The title for this question set in the quaternary language." +msgid "The title for this question set (in the quaternary language)." msgstr "Der Titel für dieses Fragenset (vierte Sprache)." #: questions/models/questionset.py:102 -msgid "The title for this question set in the quinary language." +msgid "The title for this question set (in the quinary language)." msgstr "Der Titel für dieses Fragenset (fünfte Sprache)." #: questions/models/questionset.py:107 -msgid "The help text for this question set in the primary language." +msgid "The help text for this question set (in the primary language)." msgstr "Der Hilfetext für dieses Fragenset (erste Sprache)." #: questions/models/questionset.py:112 -msgid "The help text for this question set in the secondary language." +msgid "The help text for this question set (in the secondary language)." msgstr "Der Hilfetext für dieses Fragenset (zweite Sprache)." #: questions/models/questionset.py:117 -msgid "The help text for this question set in the tertiary language." +msgid "The help text for this question set (in the tertiary language)." msgstr "Der Hilfetext für dieses Fragenset (dritte Sprache)." #: questions/models/questionset.py:122 -msgid "The help text for this question set in the quaternary language." +msgid "The help text for this question set (in the quaternary language)." msgstr "Der Hilfetext für dieses Fragenset (vierte Sprache)." #: questions/models/questionset.py:127 -msgid "The help text for this question set in the quinary language." +msgid "The help text for this question set (in the quinary language)." msgstr "Der Hilfetext für dieses Fragenset (fünfte Sprache)." #: questions/models/questionset.py:132 -msgid "The name displayed for this question set in the primary language." +msgid "The name displayed for this question set (in the primary language)." msgstr "Der Name, der für dieses Fragenset angezeigt wird (erste Sprache)." #: questions/models/questionset.py:137 -msgid "The name displayed for this question set in the secondary language." +msgid "The name displayed for this question set (in the secondary language)." msgstr "Der Name, der für dieses Fragenset angezeigt wird (zweite Sprache)." #: questions/models/questionset.py:142 -msgid "The name displayed for this question set in the tertiary language." +msgid "The name displayed for this question set (in the tertiary language)." msgstr "Der Name, der für dieses Fragenset angezeigt wird (dritte Sprache)." #: questions/models/questionset.py:147 -msgid "The name displayed for this question set in the quaternary language." +msgid "The name displayed for this question set (in the quaternary language)." msgstr "Der Name, der für dieses Fragenset angezeigt wird (vierte Sprache)." #: questions/models/questionset.py:152 -msgid "The name displayed for this question set in the quinary language." +msgid "The name displayed for this question set (in the quinary language)." msgstr "Der Name, der für dieses Fragenset angezeigt wird (fünfte Sprache)." #: questions/models/questionset.py:157 -msgid "" -"The plural name displayed for this question set in the primary language." -msgstr "" -"Der Name (Plural), der für dieses Fragenset angezeigt wird (erste Sprache)." - -#: questions/models/questionset.py:162 -msgid "" -"The plural name displayed for this question set in the secondary language." -msgstr "" -"Der Name (Plural), der für dieses Fragenset angezeigt wird (zweite Sprache)." - -#: questions/models/questionset.py:167 -msgid "" -"The plural name displayed for this question set in the tertiary language." -msgstr "" -"Der Name (Plural), der für dieses Fragenset angezeigt wird (dritte Sprache)." - -#: questions/models/questionset.py:172 -msgid "" -"The plural name displayed for this question set in the quaternary language." -msgstr "" -"Der Name (Plural), der für dieses Fragenset angezeigt wird (vierte Sprache)." - -#: questions/models/questionset.py:177 -msgid "" -"The plural name displayed for this question set in the quinary language." -msgstr "" -"Der Name (Plural), der für dieses Fragenset angezeigt wird (fünfte Sprache)." - -#: questions/models/questionset.py:182 msgid "List of conditions evaluated for this question set." msgstr "Die Liste der Bedingungen die für dieses Fragenset ausgewertet werden." -#: questions/models/questionset.py:187 questions/models/questionset.py:188 +#: questions/models/questionset.py:162 #: questions/templates/questions/export/questionset.html:4 msgid "Question set" msgstr "Fragenset" @@ -3907,23 +3909,23 @@ msgstr "" "Die Seiten, die diesen Abschnitt bearbeiten können (im Multi-Site-Setup)." #: questions/models/section.py:70 -msgid "The title for this section in the primary language." +msgid "The title for this section (in the primary language)." msgstr "Der Titel für diesen Abschnitt (erste Sprache)." #: questions/models/section.py:75 -msgid "The title for this section in the secondary language." +msgid "The title for this section (in the secondary language)." msgstr "Der Titel für diesen Abschnitt (zweite Sprache)." #: questions/models/section.py:80 -msgid "The title for this section in the tertiary language." +msgid "The title for this section (in the tertiary language)." msgstr "Der Titel für diesen Abschnitt (dritte Sprache)." #: questions/models/section.py:85 -msgid "The title for this section in the quaternary language." +msgid "The title for this section (in the quaternary language)." msgstr "Der Titel für diesen Abschnitt (vierte Sprache)." #: questions/models/section.py:90 -msgid "The title for this section in the quinary language." +msgid "The title for this section (in the quinary language)." msgstr "Der Titel für diesen Abschnitt (fünfte Sprache)." #: questions/models/section.py:95 @@ -3931,52 +3933,37 @@ msgstr "Der Titel für diesen Abschnitt (fünfte Sprache)." msgid "Section" msgstr "Abschnitt" -#: questions/serializers/v1/question.py:112 +#: questions/serializers/v1/question.py:110 msgid "" "If the \"Checkboxes\" widget is used, \"is_collection\" must be checked." msgstr "" "Wenn das Widget \"Ankreuzfelder\" verwendet wird, muss Ist eine Sammlung\" " "angekreuzt werden." -#: questions/serializers/v1/question.py:118 +#: questions/serializers/v1/question.py:116 msgid "" "If the \"Date picker\" widget is used, the value type must be \"Datetime\"." msgstr "" "Wenn das Widget \"Datumspicker\" verwendet wird, muss der Wertetyp \"Datum " "und Zeit\" sein." -#: questions/serializers/v1/question.py:124 +#: questions/serializers/v1/question.py:122 msgid "If the \"Yes/No\" widget is used, the value type must be \"Boolean\"." msgstr "" "Wenn das Widget \"Ja/Nein\" verwendet wird, muss der Wertetyp \"Boolsche " "Variable\" sein." -#: questions/templates/questions/export/page.html:20 -#: questions/templates/questions/export/question.html:22 -#: questions/templates/questions/export/questionset.html:22 -msgid "Help" -msgstr "Hilfe" - #: questions/templates/questions/export/page.html:28 -#: questions/templates/questions/export/page.html:32 #: questions/templates/questions/export/question.html:48 -#: questions/templates/questions/export/question.html:52 #: questions/templates/questions/export/questionset.html:30 -#: questions/templates/questions/export/questionset.html:34 msgid "Verbose name" msgstr "Anzeigename" -#: questions/templates/questions/export/page.html:33 -#: questions/templates/questions/export/question.html:53 -#: questions/templates/questions/export/questionset.html:35 -msgid "Verbose name plural" -msgstr "Anzeigename, plural" - #: questions/templates/questions/export/question.html:4 msgid "Questions:" msgstr "Fragen:" -#: questions/templates/questions/export/question.html:61 +#: questions/templates/questions/export/question.html:56 msgid "Range" msgstr "Bereich" @@ -3998,28 +3985,28 @@ msgstr "" msgid "Services" msgstr "Services" -#: services/providers.py:38 services/providers.py:66 +#: services/providers.py:37 services/providers.py:73 msgid "OAuth error" msgstr "OAuth Fehler" -#: services/providers.py:39 services/providers.py:67 +#: services/providers.py:38 services/providers.py:74 #, python-format msgid "Something went wrong: %s" msgstr "Etwas ging schief: %s" -#: services/providers.py:85 +#: services/providers.py:92 msgid "OAuth authorization not successful" msgstr "OAuth Autorisierung war nicht erfolgreich" -#: services/providers.py:86 +#: services/providers.py:93 msgid "State parameter did not match." msgstr "Der Zustandsparameter stimmt nicht überein." -#: services/providers.py:117 +#: services/providers.py:124 msgid "OAuth authorization successful" msgstr "OAuth Autorisierung erfolgreich" -#: services/providers.py:118 +#: services/providers.py:125 msgid "But no redirect could be found." msgstr "Aber es konnte keine Umleitung gefunden werden." @@ -4031,27 +4018,31 @@ msgstr "Integrationsfehler" msgid "Something went wrong. Please contact support." msgstr "Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Support." -#: tasks/models.py:23 +#: tasks/models.py:21 msgid "The Uniform Resource Identifier of this task (auto-generated)." msgstr "Der Uniform Resource Identifier dieser Aufgabe (automatisch erstellt)." -#: tasks/models.py:28 +#: tasks/models.py:26 msgid "The prefix for the URI of this task." msgstr "Das Präfix für die URI dieser Aufgabe." -#: tasks/models.py:33 +#: tasks/models.py:31 msgid "The path for the URI of this task." msgstr "Der Pfad für die URI dieser Aufgabe." -#: tasks/models.py:38 +#: tasks/models.py:36 msgid "Additional internal information about this task." msgstr "Zusätzliche interne Informationen über diese Aufgabe." -#: tasks/models.py:43 +#: tasks/models.py:41 msgid "Designates whether this task can be changed." msgstr "Bezeichnet, ob diese Aufgabe geändert werden kann." -#: tasks/models.py:48 +#: tasks/models.py:46 +msgid "The position of this task in lists." +msgstr "Die Position von dieser Aufgabe in Listen." + +#: tasks/models.py:51 msgid "" "The catalogs this task can be used with. An empty list implies that this " "task can be used with every catalog." @@ -4059,71 +4050,71 @@ msgstr "" "Die Kataloge, mit denen diese Aufgabe verwendet werden kann. Eine leere " "Liste bedeutet, dass diese Aufgabe mit jedem Katalog verwendet werden kann." -#: tasks/models.py:54 +#: tasks/models.py:57 msgid "The sites this task belongs to (in a multi site setup)." msgstr "Die Seiten zu denen diese Aufgabe gehört." -#: tasks/models.py:59 +#: tasks/models.py:62 msgid "The sites that can edit this task (in a multi site setup)." msgstr "Die Seiten, die diese Aufgabe bearbeiten können (im Multi-Site-Setup)." -#: tasks/models.py:64 +#: tasks/models.py:67 msgid "The groups for which this task is active." msgstr "Die Gruppen, für die diese Aufgabe aktiv ist." -#: tasks/models.py:69 -msgid "The title for this task in the primary language." +#: tasks/models.py:72 +msgid "The title for this task (in the primary language)." msgstr "Der Titel für diese Aufgabe (erste Sprache)." -#: tasks/models.py:74 -msgid "The title for this task in the secondary language." +#: tasks/models.py:77 +msgid "The title for this task (in the secondary language)." msgstr "Der Titel für diese Aufgabe (zweite Sprache)." -#: tasks/models.py:79 -msgid "The title for this task in the tertiary language." +#: tasks/models.py:82 +msgid "The title for this task (in the tertiary language)." msgstr "Der Titel für diese Aufgabe (dritte Sprache)." -#: tasks/models.py:84 -msgid "The title for this task in the quaternary language." +#: tasks/models.py:87 +msgid "The title for this task (in the quaternary language)." msgstr "Der Titel für diese Aufgabe (vierte Sprache)." -#: tasks/models.py:89 -msgid "The title for this task in the quinary language." +#: tasks/models.py:92 +msgid "The title for this task (in the quinary language)." msgstr "Der Titel für diese Aufgabe (fünfte Sprache)." -#: tasks/models.py:94 -msgid "The text for this task in the primary language." +#: tasks/models.py:97 +msgid "The text for this task (in the primary language)." msgstr "Der Text für diese Aufgabe (erste Sprache)." -#: tasks/models.py:99 -msgid "The text for this task in the secondary language." +#: tasks/models.py:102 +msgid "The text for this task (in the secondary language)." msgstr "Der Text für diese Aufgabe (zweite Sprache)." -#: tasks/models.py:104 -msgid "The text for this task in the tertiary language." +#: tasks/models.py:107 +msgid "The text for this task (in the tertiary language)." msgstr "Der Text für diese Aufgabe (dritte Sprache)." -#: tasks/models.py:109 -msgid "The text for this task in the quaternary language." +#: tasks/models.py:112 +msgid "The text for this task (in the quaternary language)." msgstr "Der Text für diese Aufgabe (vierte Sprache)." -#: tasks/models.py:114 -msgid "The text for this task in the quinary language." +#: tasks/models.py:117 +msgid "The text for this task (in the quinary language)." msgstr "Der Text für diese Aufgabe (fünfte Sprache)." -#: tasks/models.py:118 tasks/templates/tasks/export/tasks.html:39 +#: tasks/models.py:121 tasks/templates/tasks/export/tasks.html:39 msgid "Start date attribute" msgstr "Anfangsdatums-Attribut" -#: tasks/models.py:119 +#: tasks/models.py:122 msgid "The attribute that is setting the start date for this task." msgstr "Das Attribut das des Anfangsdatum für die Aufgabe festlegt." -#: tasks/models.py:123 tasks/templates/tasks/export/tasks.html:40 +#: tasks/models.py:126 tasks/templates/tasks/export/tasks.html:40 msgid "End date attribute" msgstr "Enddatums-Attribute" -#: tasks/models.py:124 +#: tasks/models.py:127 msgid "" "The attribute that is setting the end date for this task (optional, if no " "end date attribute is given, the start date attribute sets also the end " @@ -4133,51 +4124,55 @@ msgstr "" "Enddatums-Attribut angegeben wird, bestimmt das Anfangsdatums-Attribut auch " "das Enddatum)." -#: tasks/models.py:129 tasks/templates/tasks/export/tasks.html:41 +#: tasks/models.py:132 tasks/templates/tasks/export/tasks.html:41 msgid "Days before" msgstr "Tage davor" -#: tasks/models.py:130 +#: tasks/models.py:133 msgid "Additional days before the start date." msgstr "Zusätzliche Tage vor dem Anfangsdatum." -#: tasks/models.py:134 tasks/templates/tasks/export/tasks.html:42 +#: tasks/models.py:137 tasks/templates/tasks/export/tasks.html:42 msgid "Days after" msgstr "Tage danach" -#: tasks/models.py:135 +#: tasks/models.py:138 msgid "Additional days after the end date." msgstr "Zusätzliche Tage nach dem Enddatum." -#: tasks/models.py:140 +#: tasks/models.py:143 msgid "The list of conditions evaluated for this task." msgstr "Die Liste der Bedingungen die für diese Aufgabe ausgewertet werden." -#: tasks/models.py:145 +#: tasks/models.py:148 msgid "Designates whether this task is generally available for projects." msgstr "Legt fest, ob diese Aufgabe für Projekte verfügbar ist." -#: views/models.py:24 +#: views/models.py:22 msgid "The Uniform Resource Identifier of this view (auto-generated)." msgstr "Der Uniform Resource Identifier dieser Ansicht (automatisch erstellt)." -#: views/models.py:29 +#: views/models.py:27 msgid "The prefix for the URI of this view." msgstr "Das Präfix für die URI dieser Ansicht." -#: views/models.py:34 +#: views/models.py:32 msgid "The path for the URI of this view." msgstr "Der Pfad für die URI dieser Ansicht." -#: views/models.py:39 +#: views/models.py:37 msgid "Additional internal information about this view." msgstr "Zusätzliche interne Informationen über diese Ansicht." -#: views/models.py:44 +#: views/models.py:42 msgid "Designates whether this view can be changed." msgstr "Bezeichnet, ob diese Ansicht geändert werden kann." -#: views/models.py:49 +#: views/models.py:47 +msgid "The position of this view in lists." +msgstr "Die Position von dieser Ansicht in Listen." + +#: views/models.py:52 msgid "" "The catalogs this view can be used with. An empty list implies that this " "view can be used with every catalog." @@ -4185,69 +4180,69 @@ msgstr "" "Die Kataloge, mit denen diese Ansicht verwendet werden kann. Eine leere " "Liste bedeutet, dass diese Ansicht mit jedem Katalog verwendet werden kann." -#: views/models.py:55 +#: views/models.py:58 msgid "The sites this view belongs to (in a multi site setup)." msgstr "" "Die Standorte, zu denen diese Ansicht gehört (in einem Multi-Standort-Setup)." -#: views/models.py:60 +#: views/models.py:63 msgid "The sites that can edit this view (in a multi site setup)." msgstr "Die Seiten, die diese Ansicht bearbeiten können (im Multi-Site-Setup)." -#: views/models.py:65 +#: views/models.py:68 msgid "The groups for which this view is active." msgstr "Die Gruppen, für die diese Ansicht aktiv ist." -#: views/models.py:69 views/templates/views/export/views.html:35 +#: views/models.py:72 views/templates/views/export/views.html:35 msgid "Template" msgstr "Vorlage" -#: views/models.py:70 +#: views/models.py:73 msgid "The template for this view, written in Django template language." msgstr "" "Das Template für diese Ansicht, in der Django-Template-Language verfasst." -#: views/models.py:75 -msgid "The title for this view in the primary language." +#: views/models.py:78 +msgid "The title for this view (in the primary language)." msgstr "Der Titel für diese Ansicht (erste Sprache)." -#: views/models.py:80 -msgid "The title for this view in the secondary language." +#: views/models.py:83 +msgid "The title for this view (in the secondary language)." msgstr "Der Titel für diese Ansicht (zweite Sprache)." -#: views/models.py:85 -msgid "The title for this view in the tertiary language." +#: views/models.py:88 +msgid "The title for this view (in the tertiary language)." msgstr "Der Titel für diese Ansicht (dritte Sprache)." -#: views/models.py:90 -msgid "The title for this view in the quaternary language." +#: views/models.py:93 +msgid "The title for this view (in the quaternary language)." msgstr "Der Titel für diese Ansicht (vierte Sprache)." -#: views/models.py:95 -msgid "The title for this view in the quinary language." +#: views/models.py:98 +msgid "The title for this view (in the quinary language)." msgstr "Der Titel für diese Ansicht (fünfte Sprache)." -#: views/models.py:100 -msgid "The help text for this view in the primary language." +#: views/models.py:103 +msgid "The help text for this view (in the primary language)." msgstr "Der Hilfetext für diese Ansicht (erste Sprache)." -#: views/models.py:105 -msgid "The help text for this view in the secondary language." +#: views/models.py:108 +msgid "The help text for this view (in the secondary language)." msgstr "Der Hilfetext für diese Ansicht (zweite Sprache)." -#: views/models.py:110 -msgid "The help text for this view in the tertiary language." +#: views/models.py:113 +msgid "The help text for this view (in the tertiary language)." msgstr "Der Hilfetext für diese Ansicht (dritte Sprache)." -#: views/models.py:115 -msgid "The help text for this view in the quaternary language." +#: views/models.py:118 +msgid "The help text for this view (in the quaternary language)." msgstr "Der Hilfetext für diese Ansicht (vierte Sprache)." -#: views/models.py:120 -msgid "The help text for this view in the quinary language." +#: views/models.py:123 +msgid "The help text for this view (in the quinary language)." msgstr "Der Hilfetext für diese Ansicht (fünfte Sprache)." -#: views/models.py:125 +#: views/models.py:128 msgid "Designates whether this view is generally available for projects." msgstr "Legt fest, ob diese Ansicht für Projekte verfügbar ist." @@ -4263,3 +4258,183 @@ msgstr "Datei" #: views/templatetags/view_tags.py:184 msgid "Set" msgstr "Set" + +#~ msgid "GitHub repository" +#~ msgstr "GitHub-Repository" + +#~ msgid "Please use the form username/repository or organization/repository." +#~ msgstr "" +#~ "Bitte verwenden Sie das Format Benutzername/Repository oder Organisation/" +#~ "Repository." + +#~ msgid "File path" +#~ msgstr "Datei-Pfad" + +#~ msgid "Branch, tag, or commit" +#~ msgstr "Branch, Tag, oder Commit" + +#~ msgid "GitLab repository" +#~ msgstr "GitLab-Repository" + +#~ msgid "Add GitHub integration" +#~ msgstr "GitHub-Integration hinzufügen" + +#~ msgid "The GitHub repository to send issues to." +#~ msgstr "Das GitHub-Repository an das Aufgaben versendet werden." + +#~ msgid "Add GitLab integration" +#~ msgstr "GitLab-Integration hinzufügen" + +#~ msgid "Send to GitLab" +#~ msgstr "An GitLab senden" + +#, python-brace-format +#~ msgid "" +#~ "This integration allow the creation of issues in arbitrary repositories " +#~ "on {self.gitlab_url}. The upload of attachments is not supported by " +#~ "GitLab." +#~ msgstr "" +#~ "Diese Integration ermöglicht die Erstellung von Aufgaben auf {self." +#~ "gitlab_url}. Das Hochladen von Anhängen wird von GitLab nicht unterstützt." + +#~ msgid "The secret for a GitLab webhook to close a task." +#~ msgstr "Das Geheimnis für einen GitLab-Webhook zum Schließen einer Aufgabe." + +#~ msgid "blocks" +#~ msgstr "Blöcke" + +#~ msgid "sets" +#~ msgstr "Sets" + +#~ msgid "" +#~ "Entries with <i class=\"fa fa-question-circle-o small\" aria-hidden=\"true" +#~ "\"></i> might be skipped based on your input." +#~ msgstr "" +#~ "Einträge mit <i class=\"fa fa-question-circle-o small\" aria-hidden=\"true" +#~ "\"></i> können aufgrund Ihrer Eingabe übersprungen werden." + +#~ msgid "Plural name (primary)" +#~ msgstr "Name (Plural, erste Sprache)" + +#~ msgid "The plural name displayed for this page in the primary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Seite angezeigt wird (erste Sprache)." + +#~ msgid "Plural name (secondary)" +#~ msgstr "Name (Plural, zweite Sprache)" + +#~ msgid "The plural name displayed for this page in the secondary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Seite angezeigt wird (zweite Sprache)." + +#~ msgid "Plural name (tertiary)" +#~ msgstr "Name (Plural, dritte Sprache)" + +#~ msgid "The plural name displayed for this page in the tertiary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Seite angezeigt wird (dritte Sprache)." + +#~ msgid "Plural name (quaternary)" +#~ msgstr "Name (Plural, vierte Sprache)" + +#~ msgid "The plural name displayed for this page in the quaternary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Seite angezeigt wird (vierte Sprache)." + +#~ msgid "Plural name (quinary)" +#~ msgstr "Name (Plural, fünfte Sprache)" + +#~ msgid "The plural name displayed for this page in the quinary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Seite angezeigt wird (fünfte Sprache)." + +#~ msgid "The plural name displayed for this question in the primary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Frage angezeigt wird (erste Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question in the secondary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Frage angezeigt wird (zweite Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question in the tertiary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Frage angezeigt wird (dritte Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question in the quaternary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Frage angezeigt wird (vierte Sprache)." + +#~ msgid "The plural name displayed for this question in the quinary language." +#~ msgstr "" +#~ "Der Name (Plural), der für diese Frage angezeigt wird (fünfte Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question set in the primary language." +#~ msgstr "" +#~ "Der Name (Plural), der für dieses Fragenset angezeigt wird (erste " +#~ "Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question set in the secondary language." +#~ msgstr "" +#~ "Der Name (Plural), der für dieses Fragenset angezeigt wird (zweite " +#~ "Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question set in the tertiary language." +#~ msgstr "" +#~ "Der Name (Plural), der für dieses Fragenset angezeigt wird (dritte " +#~ "Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question set in the quaternary " +#~ "language." +#~ msgstr "" +#~ "Der Name (Plural), der für dieses Fragenset angezeigt wird (vierte " +#~ "Sprache)." + +#~ msgid "" +#~ "The plural name displayed for this question set in the quinary language." +#~ msgstr "" +#~ "Der Name (Plural), der für dieses Fragenset angezeigt wird (fünfte " +#~ "Sprache)." + +#~ msgid "entries" +#~ msgstr "Einträge" + +#~ msgid "Verbose name plural" +#~ msgstr "Anzeigename, plural" + +#, fuzzy +#~| msgid "Delete" +#~ msgid "Delete tab" +#~ msgstr "Entfernen" + +#~ msgid "item" +#~ msgstr "Eintrag" + +#~ msgid "items" +#~ msgstr "Einträge" + +#, python-format +#~ msgid "Add %(name)s" +#~ msgstr "%(name)s hinzufügen" + +#, python-format +#~ msgid "" +#~ "You are about to permanently delete the %(name)s <strong>%(object)s</" +#~ "strong>." +#~ msgstr "" +#~ "Sie sind dabei den %(name)s <strong>%(object)s</strong> permanent zu " +#~ "entfernen." + +#, python-format +#~ msgid "Update %(name)s" +#~ msgstr "%(name)s bearbeiten" + +#, python-format +#~ msgid "Remove %(name)s" +#~ msgstr "%(name)s entfernen" diff --git a/rdmo/locale/de/LC_MESSAGES/djangojs.mo b/rdmo/locale/de/LC_MESSAGES/djangojs.mo index e2cf596944..238220d897 100644 Binary files a/rdmo/locale/de/LC_MESSAGES/djangojs.mo and b/rdmo/locale/de/LC_MESSAGES/djangojs.mo differ diff --git a/rdmo/locale/de/LC_MESSAGES/djangojs.po b/rdmo/locale/de/LC_MESSAGES/djangojs.po index 72458a6350..7cf6bc223c 100644 --- a/rdmo/locale/de/LC_MESSAGES/djangojs.po +++ b/rdmo/locale/de/LC_MESSAGES/djangojs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: RDMO\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-21 16:48+0200\n" -"PO-Revision-Date: 2023-09-21 16:48+0200\n" +"POT-Creation-Date: 2023-12-04 13:03+0100\n" +"PO-Revision-Date: 2023-12-04 12:54+0100\n" "Last-Translator: Jochen Klar <jklar@aip.de>\n" "Language-Team: RDMO <rdmo-team@listserv.dfn.de>\n" "Language: de\n" @@ -68,23 +68,23 @@ msgstr "Datei wählen" msgid "Upload" msgstr "Hochladen" -#: management/assets/js/components/common/Links.js:76 +#: management/assets/js/components/common/Links.js:77 msgid "Locked" msgstr "Gesperrt" -#: management/assets/js/components/common/Links.js:112 +#: management/assets/js/components/common/Links.js:113 msgid "Hide elements" msgstr "Elemente ausblenden" -#: management/assets/js/components/common/Links.js:112 +#: management/assets/js/components/common/Links.js:113 msgid "Show elements" msgstr "Elemente anzeigen" -#: management/assets/js/components/common/Links.js:128 +#: management/assets/js/components/common/Links.js:129 msgid "XML" msgstr "XML" -#: management/assets/js/components/common/Links.js:130 +#: management/assets/js/components/common/Links.js:131 msgid "XML (full)" msgstr "XML (komplett)" @@ -101,6 +101,7 @@ msgstr "Dieses Attribut ist schreibgeschützt" #: management/assets/js/components/element/Attribute.js:44 #: management/assets/js/components/import/ImportAttribute.js:28 #: management/assets/js/constants/elements.js:49 +#: management/static/management/js/management.js:2 msgid "Attribute" msgstr "Attribut" @@ -146,6 +147,7 @@ msgstr "Dieser Katalog ist schreibgeschützt" #: management/assets/js/components/element/Catalog.js:51 #: management/assets/js/components/import/ImportCatalog.js:30 #: management/assets/js/constants/elements.js:44 +#: management/static/management/js/management.js:2 msgid "Catalog" msgstr "Katalog" @@ -162,6 +164,7 @@ msgstr "Diese Bedingung ist schreibgeschützt" #: management/assets/js/components/element/Condition.js:37 #: management/assets/js/components/import/ImportCondition.js:28 #: management/assets/js/constants/elements.js:52 +#: management/static/management/js/management.js:2 msgid "Condition" msgstr "Bedingung" @@ -215,26 +218,27 @@ msgstr "" "hinzugefügt." #: management/assets/js/components/edit/EditCondition.js:114 -msgid "attribute" -msgstr "Attribut" +msgid "Create new attribute" +msgstr "Neues Attribut erstellen" -#: management/assets/js/components/edit/EditOption.js:37 +#: management/assets/js/components/edit/EditOption.js:38 #: management/assets/js/components/element/Option.js:27 msgid "This option is read only" msgstr "Die Option ist schreibgeschützt" -#: management/assets/js/components/edit/EditOption.js:44 +#: management/assets/js/components/edit/EditOption.js:45 #: management/assets/js/components/element/Option.js:37 #: management/assets/js/components/import/ImportOption.js:28 #: management/assets/js/constants/elements.js:51 +#: management/static/management/js/management.js:2 msgid "Option" msgstr "Option" -#: management/assets/js/components/edit/EditOption.js:46 +#: management/assets/js/components/edit/EditOption.js:47 msgid "Create option" msgstr "Neue Option erstellen" -#: management/assets/js/components/edit/EditOption.js:53 +#: management/assets/js/components/edit/EditOption.js:54 #, javascript-format msgid "" "This option will be added to the option set <code class=\"code-options\">%s</" @@ -252,6 +256,7 @@ msgstr "Dieses Optionenset ist schreibgeschützt" #: management/assets/js/components/element/OptionSet.js:43 #: management/assets/js/components/import/ImportOptionSet.js:28 #: management/assets/js/constants/elements.js:50 +#: management/static/management/js/management.js:2 msgid "Option set" msgstr "Optionenset" @@ -268,6 +273,22 @@ msgstr "" "Dieser Optionenset wird der Frage <code class=\"code-questions\">%s</code> " "hinzugefügt." +#: management/assets/js/components/edit/EditOptionSet.js:99 +msgid "Add existing option" +msgstr "Existierende Option hinzufügen" + +#: management/assets/js/components/edit/EditOptionSet.js:99 +msgid "Create new option" +msgstr "Neue Option erstellen" + +#: management/assets/js/components/edit/EditOptionSet.js:103 +msgid "Add existing condition" +msgstr "Existierende Bedingung hinzufügen" + +#: management/assets/js/components/edit/EditOptionSet.js:103 +msgid "Create new condition" +msgstr "Neue Bedingung erstellen" + #: management/assets/js/components/edit/EditPage.js:32 #: management/assets/js/components/edit/EditQuestionSet.js:32 #, javascript-format @@ -289,6 +310,7 @@ msgstr "Diese Seite ist schreibgeschützt" #: management/assets/js/components/element/Page.js:57 #: management/assets/js/components/import/ImportPage.js:28 #: management/assets/js/constants/elements.js:46 +#: management/static/management/js/management.js:2 msgid "Page" msgstr "Seite" @@ -314,6 +336,7 @@ msgstr "Diese Frage ist schreibgschützt" #: management/assets/js/components/element/Question.js:44 #: management/assets/js/components/import/ImportQuestion.js:28 #: management/assets/js/constants/elements.js:48 +#: management/static/management/js/management.js:2 msgid "Question" msgstr "Frage" @@ -348,6 +371,7 @@ msgstr "Dieses Fragenset ist schreibgeschützt" #: management/assets/js/components/element/QuestionSet.js:56 #: management/assets/js/components/import/ImportQuestionSet.js:28 #: management/assets/js/constants/elements.js:47 +#: management/static/management/js/management.js:2 msgid "Question set" msgstr "Fragenset" @@ -382,6 +406,7 @@ msgstr "Dieser Abschnitt ist schreibgeschützt" #: management/assets/js/components/element/Section.js:54 #: management/assets/js/components/import/ImportSection.js:28 #: management/assets/js/constants/elements.js:45 +#: management/static/management/js/management.js:2 msgid "Section" msgstr "Abschnitt" @@ -399,14 +424,15 @@ msgstr "" "hinzugefügt." #: management/assets/js/components/edit/EditTask.js:44 -#: management/assets/js/components/element/Task.js:28 +#: management/assets/js/components/element/Task.js:31 msgid "This task is read only" msgstr "Diese Aufgabe ist schreibgeschützt" #: management/assets/js/components/edit/EditTask.js:51 -#: management/assets/js/components/element/Task.js:42 +#: management/assets/js/components/element/Task.js:45 #: management/assets/js/components/import/ImportTask.js:30 #: management/assets/js/constants/elements.js:53 +#: management/static/management/js/management.js:2 msgid "Task" msgstr "Aufgabe" @@ -414,19 +440,20 @@ msgstr "Aufgabe" msgid "Create task" msgstr "Neue Aufgabe erstellen" -#: management/assets/js/components/edit/EditView.js:38 +#: management/assets/js/components/edit/EditView.js:39 #: management/assets/js/components/element/View.js:28 msgid "This view is read only" msgstr "Diese Ansicht ist schreibgeschützt" -#: management/assets/js/components/edit/EditView.js:45 +#: management/assets/js/components/edit/EditView.js:46 #: management/assets/js/components/element/View.js:42 #: management/assets/js/components/import/ImportView.js:30 #: management/assets/js/constants/elements.js:54 +#: management/static/management/js/management.js:2 msgid "View" msgstr "Ansicht" -#: management/assets/js/components/edit/EditView.js:47 +#: management/assets/js/components/edit/EditView.js:48 msgid "Create view" msgstr "Neue Ansicht erstellen" @@ -441,22 +468,11 @@ msgstr "Bearbeiten" msgid "Remove" msgstr "Entfernen" -#: management/assets/js/components/edit/common/MultiSelect.js:85 -#, javascript-format -msgid "Add %s" -msgstr "%s hinzufügen" - #: management/assets/js/components/edit/common/MultiSelect.js:92 #: management/assets/js/components/edit/common/Select.js:70 msgid "For this action, the element must first be created." msgstr "Für diese Aktion muss das Element zunächst erstellt werden." -#: management/assets/js/components/edit/common/MultiSelect.js:93 -#: management/assets/js/components/edit/common/Select.js:71 -#, javascript-format -msgid "Create new %s" -msgstr "Neue %s erstellen" - #: management/assets/js/components/edit/common/UriPrefix.js:35 #: management/assets/js/components/import/common/UriPrefix.js:21 #: management/assets/js/components/sidebar/ImportSidebar.js:70 @@ -701,31 +717,31 @@ msgstr "Abschnitt sperren" msgid "Export section" msgstr "Abschnitt exportieren" -#: management/assets/js/components/element/Task.js:29 +#: management/assets/js/components/element/Task.js:32 msgid "Edit task" msgstr "Aufgabe bearbeiten" -#: management/assets/js/components/element/Task.js:30 +#: management/assets/js/components/element/Task.js:33 msgid "Copy task" msgstr "Aufgabe kopieren" -#: management/assets/js/components/element/Task.js:31 +#: management/assets/js/components/element/Task.js:34 msgid "Make task unavailable" msgstr "Aufgabe unverfügbar machen" -#: management/assets/js/components/element/Task.js:32 +#: management/assets/js/components/element/Task.js:35 msgid "Make task available" msgstr "Aufgabe verfügbar machen" -#: management/assets/js/components/element/Task.js:35 +#: management/assets/js/components/element/Task.js:38 msgid "Unlock task" msgstr "Aufgabe entsperren" -#: management/assets/js/components/element/Task.js:35 +#: management/assets/js/components/element/Task.js:38 msgid "Lock task" msgstr "Aufgabe sperren" -#: management/assets/js/components/element/Task.js:37 +#: management/assets/js/components/element/Task.js:40 msgid "Export task" msgstr "Aufgabe exportieren" @@ -765,6 +781,7 @@ msgstr "Ansicht exportieren" #: management/assets/js/components/nested/NestedPage.js:67 #: management/assets/js/components/nested/NestedQuestionSet.js:63 #: management/assets/js/components/nested/NestedSection.js:71 +#: management/assets/js/components/sidebar/ElementsSidebar.js:50 msgid "Attributes" msgstr "Attribute" @@ -782,7 +799,7 @@ msgstr "Attribut filtern" #: management/assets/js/components/elements/QuestionSets.js:48 #: management/assets/js/components/elements/Questions.js:49 #: management/assets/js/components/elements/Sections.js:46 -#: management/assets/js/components/elements/Tasks.js:49 +#: management/assets/js/components/elements/Tasks.js:53 #: management/assets/js/components/elements/Views.js:49 msgid "All editors" msgstr "Alle Editoren" @@ -790,6 +807,7 @@ msgstr "Alle Editoren" #: management/assets/js/components/elements/Catalogs.js:30 #: management/assets/js/components/elements/Catalogs.js:58 #: management/assets/js/components/nested/NestedCatalog.js:65 +#: management/assets/js/components/sidebar/ElementsSidebar.js:30 msgid "Catalogs" msgstr "Kataloge" @@ -804,6 +822,7 @@ msgstr "Kataloge filtern" #: management/assets/js/components/elements/QuestionSets.js:53 #: management/assets/js/components/elements/Questions.js:54 #: management/assets/js/components/elements/Sections.js:51 +#: management/assets/js/components/elements/Tasks.js:59 #: management/assets/js/components/nested/NestedCatalog.js:64 #: management/assets/js/components/nested/NestedOptionSet.js:44 #: management/assets/js/components/nested/NestedPage.js:60 @@ -816,10 +835,12 @@ msgstr "URIs anzeigen:" #: management/assets/js/components/elements/Pages.js:58 #: management/assets/js/components/elements/QuestionSets.js:58 #: management/assets/js/components/elements/Questions.js:59 +#: management/assets/js/components/elements/Tasks.js:62 #: management/assets/js/components/nested/NestedCatalog.js:77 #: management/assets/js/components/nested/NestedPage.js:69 #: management/assets/js/components/nested/NestedQuestionSet.js:65 #: management/assets/js/components/nested/NestedSection.js:73 +#: management/assets/js/components/sidebar/ElementsSidebar.js:62 msgid "Conditions" msgstr "Bedingungen" @@ -833,6 +854,7 @@ msgstr "Bedingungen filtern" #: management/assets/js/components/nested/NestedPage.js:71 #: management/assets/js/components/nested/NestedQuestionSet.js:67 #: management/assets/js/components/nested/NestedSection.js:75 +#: management/assets/js/components/sidebar/ElementsSidebar.js:54 msgid "Option sets" msgstr "Optionensets" @@ -844,6 +866,7 @@ msgstr "Optionensets filtern" #: management/assets/js/components/elements/Options.js:30 #: management/assets/js/components/elements/Options.js:52 #: management/assets/js/components/nested/NestedOptionSet.js:45 +#: management/assets/js/components/sidebar/ElementsSidebar.js:58 msgid "Options" msgstr "Optionen" @@ -858,6 +881,7 @@ msgstr "Option filtern" #: management/assets/js/components/nested/NestedPage.js:61 #: management/assets/js/components/nested/NestedSection.js:58 #: management/assets/js/components/nested/NestedSection.js:65 +#: management/assets/js/components/sidebar/ElementsSidebar.js:38 msgid "Pages" msgstr "Seiten" @@ -876,6 +900,7 @@ msgstr "Seiten filtern" #: management/assets/js/components/nested/NestedQuestionSet.js:59 #: management/assets/js/components/nested/NestedSection.js:59 #: management/assets/js/components/nested/NestedSection.js:67 +#: management/assets/js/components/sidebar/ElementsSidebar.js:42 msgid "Question sets" msgstr "Fragensets" @@ -890,6 +915,7 @@ msgstr "Fragensets filtern" #: management/assets/js/components/nested/NestedPage.js:65 #: management/assets/js/components/nested/NestedQuestionSet.js:61 #: management/assets/js/components/nested/NestedSection.js:69 +#: management/assets/js/components/sidebar/ElementsSidebar.js:46 msgid "Questions" msgstr "Fragen" @@ -902,6 +928,7 @@ msgstr "Fragen filtern" #: management/assets/js/components/nested/NestedCatalog.js:59 #: management/assets/js/components/nested/NestedCatalog.js:67 #: management/assets/js/components/nested/NestedSection.js:63 +#: management/assets/js/components/sidebar/ElementsSidebar.js:34 msgid "Sections" msgstr "Abschnitte" @@ -910,15 +937,18 @@ msgstr "Abschnitte" msgid "Filter sections" msgstr "Abschnitte filtern" -#: management/assets/js/components/elements/Tasks.js:28 +#: management/assets/js/components/elements/Tasks.js:32 +#: management/assets/js/components/elements/Tasks.js:60 +#: management/assets/js/components/sidebar/ElementsSidebar.js:66 msgid "Tasks" msgstr "Aufgaben" -#: management/assets/js/components/elements/Tasks.js:35 +#: management/assets/js/components/elements/Tasks.js:39 msgid "Filter tasks" msgstr "Aufgaben filtern" #: management/assets/js/components/elements/Views.js:28 +#: management/assets/js/components/sidebar/ElementsSidebar.js:70 msgid "Views" msgstr "Ansichten" @@ -1296,5 +1326,23 @@ msgstr "Alle abwählen" msgid "Set URI prefix for all elements" msgstr "URI-Präfix für alle Elemente festlegen" -#~ msgid "Filter optionsets" -#~ msgstr "Optionensets filtern" +msgid "Add existing page" +msgstr "Existierende Seite hinzufügen" + +msgid "Create new page" +msgstr "Neues Seite erstellen" + +msgid "Add existing section" +msgstr "Existierenden Abschnitt hinzufügen" + +msgid "Create new section" +msgstr "Neuen Abschnitt erstellen" + +msgid "Add existing element" +msgstr "Existierendes Element hinzufügen" + +msgid "Create new question" +msgstr "Neue Frage erstellen" + +msgid "Create new question set" +msgstr "Neues Fragenset erstellen" diff --git a/rdmo/management/assets/js/actions/configActions.js b/rdmo/management/assets/js/actions/configActions.js index e3c57f2452..baf9203e5f 100644 --- a/rdmo/management/assets/js/actions/configActions.js +++ b/rdmo/management/assets/js/actions/configActions.js @@ -17,12 +17,13 @@ export function fetchConfig() { CoreApi.fetchSettings(), CoreApi.fetchSites(), ManagementApi.fetchMeta(), + OptionsApi.fetchAdditionalInputs(), OptionsApi.fetchProviders(), QuestionsApi.fetchValueTypes(), QuestionsApi.fetchWidgetTypes() - ]).then(([relations, groups, settings, sites, meta, providers, + ]).then(([relations, groups, settings, sites, meta, additionalInputs, providers, valueTypes, widgetTypes]) => dispatch(fetchConfigSuccess({ - relations, groups, settings, sites, meta, providers, valueTypes, widgetTypes + relations, groups, settings, sites, meta, additionalInputs, providers, valueTypes, widgetTypes }))) } diff --git a/rdmo/management/assets/js/api/OptionsApi.js b/rdmo/management/assets/js/api/OptionsApi.js index 550e050bf3..30e5545a84 100644 --- a/rdmo/management/assets/js/api/OptionsApi.js +++ b/rdmo/management/assets/js/api/OptionsApi.js @@ -51,6 +51,10 @@ class OptionsApi extends BaseApi { return this.delete(`/api/v1/options/options/${option.id}/`) } + static fetchAdditionalInputs() { + return this.get('/api/v1/options/additionalinputs/') + } + static fetchProviders() { return this.get('/api/v1/options/providers/') } diff --git a/rdmo/management/assets/js/components/common/Forms.js b/rdmo/management/assets/js/components/common/Forms.js index 80a7c7a0d5..2ce5080020 100644 --- a/rdmo/management/assets/js/components/common/Forms.js +++ b/rdmo/management/assets/js/components/common/Forms.js @@ -13,7 +13,7 @@ const UploadForm = ({ onSubmit }) => { return ( <form className="upload-form sidebar-form" onSubmit={handleSubmit}> <div className="upload-form-field"> - <input type="file" name="uploaded_file" onChange={event => setFile(event.target.files[0])} /> + <input type="file" name="uploaded_file" onChange={event => setFile(event.target.files[0])} accept=".xml"/> <p>{file ? file.name : gettext('Select file')}</p> </div> diff --git a/rdmo/management/assets/js/components/common/Links.js b/rdmo/management/assets/js/components/common/Links.js index 0c291ad8ed..8f816dd64a 100644 --- a/rdmo/management/assets/js/components/common/Links.js +++ b/rdmo/management/assets/js/components/common/Links.js @@ -2,6 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import isEmpty from 'lodash/isEmpty' +import isNil from 'lodash/isNil' import isUndefined from 'lodash/isUndefined' import Link from 'rdmo/core/assets/js/components/Link' @@ -179,18 +180,24 @@ ExtendLink.propTypes = { onClick: PropTypes.func.isRequired } -const CodeLink = ({ className, uri, onClick }) => { +const CodeLink = ({ className, uri, onClick, order }) => { return ( - <Link onClick={onClick}> - <code className={className}>{uri}</code> - </Link> + <> + <Link onClick={onClick}> + <code className={className}>{uri}</code> + </Link> + {!isNil(order) ? ( + <>{' '}<code className="code-order ng-binding">{order}</code></> + ) : null} + </> ) } CodeLink.propTypes = { className: PropTypes.string.isRequired, uri: PropTypes.string.isRequired, - onClick: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired, + order: PropTypes.number } const ErrorLink = ({ element, onClick }) => { diff --git a/rdmo/management/assets/js/components/edit/EditCatalog.js b/rdmo/management/assets/js/components/edit/EditCatalog.js index e179456943..1e91fd17fd 100644 --- a/rdmo/management/assets/js/components/edit/EditCatalog.js +++ b/rdmo/management/assets/js/components/edit/EditCatalog.js @@ -95,8 +95,8 @@ const EditCatalog = ({ config, catalog, elements, elementActions }) => { } </Tabs> - <OrderedMultiSelect config={config} element={catalog} field="sections" - options={sections} verboseName="section" + <OrderedMultiSelect config={config} element={catalog} field="sections" options={sections} + addText={gettext('Add existing section')} createText={gettext('Create new section')} onChange={updateCatalog} onCreate={createSection} onEdit={editSection} /> {get(config, 'settings.groups') && <Select config={config} element={catalog} field="groups" diff --git a/rdmo/management/assets/js/components/edit/EditCondition.js b/rdmo/management/assets/js/components/edit/EditCondition.js index b62de93bb8..8cffeb4b13 100644 --- a/rdmo/management/assets/js/components/edit/EditCondition.js +++ b/rdmo/management/assets/js/components/edit/EditCondition.js @@ -111,7 +111,7 @@ const EditCondition = ({ config, condition, elements, elementActions }) => { <Checkbox config={config} element={condition} field="locked" onChange={updateCondition} /> - <Select config={config} element={condition} field="source" verboseName={gettext('attribute')} + <Select config={config} element={condition} field="source" createText={gettext('Create new attribute')} options={attributes} onChange={updateCondition} onCreate={createAttribute} onEdit={editAttribute} /> <Select config={config} element={condition} field="relation" diff --git a/rdmo/management/assets/js/components/edit/EditOption.js b/rdmo/management/assets/js/components/edit/EditOption.js index 9f011d6fbc..08c865deca 100644 --- a/rdmo/management/assets/js/components/edit/EditOption.js +++ b/rdmo/management/assets/js/components/edit/EditOption.js @@ -4,6 +4,7 @@ import { Tabs, Tab } from 'react-bootstrap' import get from 'lodash/get' import Checkbox from './common/Checkbox' +import Radio from './common/Radio' import Select from './common/Select' import Text from './common/Text' import Textarea from './common/Textarea' @@ -19,7 +20,7 @@ import useDeleteModal from '../../hooks/useDeleteModal' const EditOption = ({ config, option, elements, elementActions }) => { - const { sites } = config + const { additionalInputs, sites } = config const { elementAction, parent } = elements const updateOption = (key, value) => elementActions.updateElement(option, {[key]: value}) @@ -81,10 +82,6 @@ const EditOption = ({ config, option, elements, elementActions }) => { <Checkbox config={config} element={option} field="locked" onChange={updateOption} /> </div> - <div className="col-sm-6"> - <Checkbox config={config} element={option} field="additional_input" - onChange={updateOption} /> - </div> </div> <Tabs id="#option-tabs" defaultActiveKey={0} animation={false}> @@ -95,6 +92,10 @@ const EditOption = ({ config, option, elements, elementActions }) => { <div className="col-sm-12"> <Text config={config} element={option} field={`text_${lang_code }`} onChange={updateOption} /> + <Textarea config={config} element={option} field={`help_${lang_code }`} + onChange={updateOption} /> + <Textarea config={config} element={option} field={`view_text_${lang_code }`} + onChange={updateOption} /> </div> </div> </Tab> @@ -102,6 +103,9 @@ const EditOption = ({ config, option, elements, elementActions }) => { } </Tabs> + <Radio config={config} element={option} field="additional_input" + options={additionalInputs} onChange={updateOption} /> + {get(config, 'settings.multisite') && <Select config={config} element={option} field="editors" options={sites} onChange={updateOption} isMulti />} </div> diff --git a/rdmo/management/assets/js/components/edit/EditOptionSet.js b/rdmo/management/assets/js/components/edit/EditOptionSet.js index 4da6f00d1c..1ac9da2128 100644 --- a/rdmo/management/assets/js/components/edit/EditOptionSet.js +++ b/rdmo/management/assets/js/components/edit/EditOptionSet.js @@ -95,12 +95,12 @@ const EditOptionSet = ({ config, optionset, elements, elementActions }) => { </div> </div> - <OrderedMultiSelect config={config} element={optionset} field="options" - options={options} verboseName="option" + <OrderedMultiSelect config={config} element={optionset} field="options" options={options} + addText={gettext('Add existing option')} createText={gettext('Create new option')} onChange={updateOptionSet} onCreate={createOption} onEdit={editOption} /> - <MultiSelect config={config} element={optionset} field="conditions" - options={conditions} verboseName="condition" + <MultiSelect config={config} element={optionset} field="conditions" options={conditions} + addText={gettext('Add existing condition')} createText={gettext('Create new condition')} onChange={updateOptionSet} onCreate={createCondition} onEdit={editCondition} /> <Select config={config} element={optionset} field="provider_key" diff --git a/rdmo/management/assets/js/components/edit/EditPage.js b/rdmo/management/assets/js/components/edit/EditPage.js index 3593d578b7..0f542ec092 100644 --- a/rdmo/management/assets/js/components/edit/EditPage.js +++ b/rdmo/management/assets/js/components/edit/EditPage.js @@ -125,44 +125,33 @@ const EditPage = ({ config, page, elements, elementActions }) => { </div> </div> - <Tabs id="#catalog-tabs" defaultActiveKey={0} animation={false}> + <Tabs id="#page-tabs" defaultActiveKey={0} animation={false}> { config.settings && config.settings.languages.map(([lang_code, lang], index) => ( <Tab key={index} eventKey={index} title={lang}> - <div className="row"> - <div className="col-sm-12"> - <Text config={config} element={page} field={`title_${lang_code }`} - onChange={updatePage} /> - </div> - <div className="col-sm-12"> - <Textarea config={config} element={page} field={`help_${lang_code }`} - rows={4} onChange={updatePage} /> - </div> - <div className="col-sm-6"> - <Text config={config} element={page} field={`verbose_name_${lang_code }`} - onChange={updatePage} /> - </div> - <div className="col-sm-6"> - <Text config={config} element={page} field={`verbose_name_plural_${lang_code }`} - onChange={updatePage} /> - </div> - </div> + <Text config={config} element={page} field={`title_${lang_code }`} + onChange={updatePage} /> + <Textarea config={config} element={page} field={`help_${lang_code }`} + rows={4} onChange={updatePage} /> + <Text config={config} element={page} field={`verbose_name_${lang_code }`} + onChange={updatePage} /> </Tab> )) } </Tabs> - <Select config={config} element={page} field="attribute" verboseName={gettext('attribute')} + <Select config={config} element={page} field="attribute" createText={gettext('Create new attribute')} options={attributes} onChange={updatePage} onCreate={createAttribute} onEdit={editAttribute} /> <OrderedMultiSelect config={config} element={page} field="elements" - values={elementValues} options={elementOptions} verboseName={gettext('element')} - verboseNameCreate={gettext('question')} verboseNameAltCreate={gettext('question set')} + values={elementValues} options={elementOptions} + addText={gettext('Add existing element')} createText={gettext('Create new question')} + altCreateText={gettext('Create new question set')} onChange={updatePage} onCreate={createQuestion} onAltCreate={createQuestionSet} onEdit={editElement} /> - <MultiSelect config={config} element={page} field="conditions" - options={conditions} verboseName="condition" + <MultiSelect config={config} element={page} field="conditions" options={conditions} + addText={gettext('Add existing condition')} createText={gettext('Create new condition')} onChange={updatePage} onCreate={createCondition} onEdit={editCondition} /> {get(config, 'settings.multisite') && <Select config={config} element={page} field="editors" diff --git a/rdmo/management/assets/js/components/edit/EditQuestion.js b/rdmo/management/assets/js/components/edit/EditQuestion.js index 70c8be6357..38159af56b 100644 --- a/rdmo/management/assets/js/components/edit/EditQuestion.js +++ b/rdmo/management/assets/js/components/edit/EditQuestion.js @@ -110,32 +110,20 @@ const EditQuestion = ({ config, question, elements, elementActions}) => { <Tabs id="#question-tabs" defaultActiveKey={0} animation={false}> { - config.settings && config.settings.languages.map(([lang_code, lang], index) => { - return ( - <Tab key={index} eventKey={index} title={lang}> - <Text config={config} element={question} field={`text_${lang_code }`} - onChange={updateQuestion} /> - - <Textarea config={config} element={question} field={`help_${lang_code }`} - rows={8} onChange={updateQuestion} /> - - <div className="row"> - <div className="col-sm-6"> - <Text config={config} element={question} field={`verbose_name_${lang_code }`} - onChange={updateQuestion} /> - </div> - <div className="col-sm-6"> - <Text config={config} element={question} field={`verbose_name_plural_${lang_code }`} - onChange={updateQuestion} /> - </div> - </div> - </Tab> - ) - }) + config.settings && config.settings.languages.map(([lang_code, lang], index) => ( + <Tab key={index} eventKey={index} title={lang}> + <Text config={config} element={question} field={`text_${lang_code }`} + onChange={updateQuestion} /> + <Textarea config={config} element={question} field={`help_${lang_code }`} + rows={8} onChange={updateQuestion} /> + <Text config={config} element={question} field={`verbose_name_${lang_code }`} + onChange={updateQuestion} /> + </Tab> + )) } </Tabs> - <Select config={config} element={question} field="attribute" verboseName={gettext('attribute')} + <Select config={config} element={question} field="attribute" createText={gettext('Create new attribute')} options={attributes} onChange={updateQuestion} onCreate={createAttribute} onEdit={editAttribute} /> <div className="row"> @@ -159,13 +147,13 @@ const EditQuestion = ({ config, question, elements, elementActions}) => { <Tabs id="#question-tabs2" defaultActiveKey={0} animation={false}> <Tab key={0} eventKey={0} title={gettext('Conditions')}> - <MultiSelect config={config} element={question} field="conditions" - options={conditions} verboseName="condition" + <MultiSelect config={config} element={question} field="conditions" options={conditions} + addText={gettext('Add existing condition')} createText={gettext('Create new condition')} onChange={updateQuestion} onCreate={createCondition} onEdit={editCondition} /> </Tab> <Tab key={1} eventKey={1} title={gettext('Option sets')}> - <MultiSelect config={config} element={question} field="optionsets" - options={optionsets} verboseName="optionset" + <MultiSelect config={config} element={question} field="optionsets" options={optionsets} + addText={gettext('Add existing optionset')} createText={gettext('Create new optionset')} onChange={updateQuestion} onCreate={createOptionSet} onEdit={editOptionSet} /> </Tab> <Tab key={2} eventKey={2} title={gettext('Range')}> diff --git a/rdmo/management/assets/js/components/edit/EditQuestionSet.js b/rdmo/management/assets/js/components/edit/EditQuestionSet.js index aabadc7285..3204887ef0 100644 --- a/rdmo/management/assets/js/components/edit/EditQuestionSet.js +++ b/rdmo/management/assets/js/components/edit/EditQuestionSet.js @@ -134,44 +134,31 @@ const EditQuestionSet = ({ config, questionset, elements, elementActions }) => { <Tabs id="#catalog-tabs" defaultActiveKey={0} animation={false}> { - config.settings && config.settings.languages.map(([lang_code, lang], index) => { - return ( - <Tab className="pt-10" key={index} eventKey={index} title={lang}> - <div className="row"> - <div className="col-sm-12"> - <Text config={config} element={questionset} field={`title_${lang_code }`} - onChange={updateQuestionSet} /> - </div> - <div className="col-sm-12"> - <Textarea config={config} element={questionset} field={`help_${lang_code }`} - rows={4} onChange={updateQuestionSet} /> - </div> - <div className="col-sm-6"> - <Text config={config} element={questionset} field={`verbose_name_${lang_code }`} - onChange={updateQuestionSet} /> - </div> - <div className="col-sm-6"> - <Text config={config} element={questionset} field={`verbose_name_plural_${lang_code }`} - onChange={updateQuestionSet} /> - </div> - </div> - </Tab> - ) - }) + config.settings && config.settings.languages.map(([lang_code, lang], index) => ( + <Tab className="pt-10" key={index} eventKey={index} title={lang}> + <Text config={config} element={questionset} field={`title_${lang_code }`} + onChange={updateQuestionSet} /> + <Textarea config={config} element={questionset} field={`help_${lang_code }`} + rows={4} onChange={updateQuestionSet} /> + <Text config={config} element={questionset} field={`verbose_name_${lang_code }`} + onChange={updateQuestionSet} /> + </Tab> + )) } </Tabs> - <Select config={config} element={questionset} field="attribute" verboseName={gettext('attribute')} + <Select config={config} element={questionset} field="attribute" createText={gettext('Create new attribute')} options={attributes} onChange={updateQuestionSet} onCreate={createAttribute} onEdit={editAttribute} /> <OrderedMultiSelect config={config} element={questionset} field="elements" - values={elementValues} options={elementOptions} verboseName={gettext('element')} - verboseNameCreate={gettext('question')} verboseNameAltCreate={gettext('question set')} + values={elementValues} options={elementOptions} + addText={gettext('Add existing element')} createText={gettext('Create new question')} + altCreateText={gettext('Create new question set')} onChange={updateQuestionSet} onCreate={createQuestion} onAltCreate={createQuestionSet} onEdit={editElement}/> - <MultiSelect config={config} element={questionset} field="conditions" - options={conditions} verboseName="condition" + <MultiSelect config={config} element={questionset} field="conditions" options={conditions} + addText={gettext('Add existing condition')} createText={gettext('Create new condition')} onChange={updateQuestionSet} onCreate={createCondition} onEdit={editCondition} /> {get(config, 'settings.multisite') && <Select config={config} element={questionset} field="editors" diff --git a/rdmo/management/assets/js/components/edit/EditSection.js b/rdmo/management/assets/js/components/edit/EditSection.js index 0cedd4688a..ef2f0e6b19 100644 --- a/rdmo/management/assets/js/components/edit/EditSection.js +++ b/rdmo/management/assets/js/components/edit/EditSection.js @@ -94,8 +94,8 @@ const EditSection = ({ config, section, elements, elementActions }) => { } </Tabs> - <OrderedMultiSelect config={config} element={section} field="pages" - options={pages} verboseName="page" + <OrderedMultiSelect config={config} element={section} field="pages" options={pages} + addText={gettext('Add existing page')} createText={gettext('Create new page')} onChange={updateSection} onCreate={createPage} onEdit={editPage} /> {get(config, 'settings.multisite') && <Select config={config} element={section} field="editors" diff --git a/rdmo/management/assets/js/components/edit/EditTask.js b/rdmo/management/assets/js/components/edit/EditTask.js index 2057562628..551e039cc6 100644 --- a/rdmo/management/assets/js/components/edit/EditTask.js +++ b/rdmo/management/assets/js/components/edit/EditTask.js @@ -76,14 +76,18 @@ const EditTask = ({ config, task, elements, elementActions}) => { rows={4} onChange={updateTask} /> <div className="row"> - <div className="col-sm-6"> + <div className="col-sm-4"> <Checkbox config={config} element={task} field="locked" onChange={updateTask} /> </div> - <div className="col-sm-6"> + <div className="col-sm-4"> <Checkbox config={config} element={task} field="available" onChange={updateTask} /> </div> + <div className="col-sm-4"> + <Number config={config} element={task} field="order" + onChange={updateTask} /> + </div> </div> <Tabs id="#task-tabs" defaultActiveKey={0} animation={false}> @@ -99,8 +103,8 @@ const EditTask = ({ config, task, elements, elementActions}) => { } </Tabs> - <MultiSelect config={config} element={task} field="conditions" - options={conditions} verboseName="condition" + <MultiSelect config={config} element={task} field="conditions" options={conditions} + addText={gettext('Add existing condition')} createText={gettext('Create new condition')} onChange={updateTask} onCreate={createCondition} onEdit={editCondition} /> <Select config={config} element={task} field="start_attribute" diff --git a/rdmo/management/assets/js/components/edit/EditView.js b/rdmo/management/assets/js/components/edit/EditView.js index ab19a8b9c0..ae5bfb2986 100644 --- a/rdmo/management/assets/js/components/edit/EditView.js +++ b/rdmo/management/assets/js/components/edit/EditView.js @@ -5,6 +5,7 @@ import get from 'lodash/get' import CodeMirror from './common/CodeMirror' import Checkbox from './common/Checkbox' +import Number from './common/Number' import Select from './common/Select' import Text from './common/Text' import Textarea from './common/Textarea' @@ -70,14 +71,18 @@ const EditView = ({ config, view, elements, elementActions }) => { rows={4} onChange={updateView} /> <div className="row"> - <div className="col-sm-6"> + <div className="col-sm-4"> <Checkbox config={config} element={view} field="locked" onChange={updateView} /> </div> - <div className="col-sm-6"> + <div className="col-sm-4"> <Checkbox config={config} element={view} field="available" onChange={updateView} /> </div> + <div className="col-sm-4"> + <Number config={config} element={view} field="order" + onChange={updateView} /> + </div> </div> <Tabs id="#view-tabs" defaultActiveKey={0} animation={false}> diff --git a/rdmo/management/assets/js/components/edit/common/MultiSelect.js b/rdmo/management/assets/js/components/edit/common/MultiSelect.js index 1a7702748a..e300434839 100644 --- a/rdmo/management/assets/js/components/edit/common/MultiSelect.js +++ b/rdmo/management/assets/js/components/edit/common/MultiSelect.js @@ -10,7 +10,7 @@ import Link from 'rdmo/core/assets/js/components/Link' import { getId, getLabel, getHelp } from 'rdmo/management/assets/js/utils/forms' -const MultiSelect = ({ config, element, field, options, verboseName, onChange, onCreate, onEdit }) => { +const MultiSelect = ({ config, element, field, options, addText, createText, onChange, onCreate, onEdit }) => { const id = getId(element, field), label = getLabel(config, element, field), help = getHelp(config, element, field), @@ -82,7 +82,7 @@ const MultiSelect = ({ config, element, field, options, verboseName, onChange, o </div> <button className="btn btn-primary btn-xs" onClick={() => handleAdd()} disabled={element.read_only}> - {interpolate(gettext('Add %s'), [verboseName])} + {addText} </button> { @@ -90,7 +90,7 @@ const MultiSelect = ({ config, element, field, options, verboseName, onChange, o <button className="btn btn-success btn-xs ml-10" onClick={onCreate} disabled={element.read_only || isNil(element.id)} title={isNil(element.id) ? gettext('For this action, the element must first be created.') : undefined}> - {interpolate(gettext('Create new %s'), [verboseName])} + {createText} </button> } @@ -104,7 +104,8 @@ MultiSelect.propTypes = { element: PropTypes.object, field: PropTypes.string, options: PropTypes.array, - verboseName: PropTypes.string, + addText: PropTypes.string, + createText: PropTypes.string, onChange: PropTypes.func, onCreate: PropTypes.func, onEdit: PropTypes.func diff --git a/rdmo/management/assets/js/components/edit/common/OrderedMultiSelect.js b/rdmo/management/assets/js/components/edit/common/OrderedMultiSelect.js index 482c8d7a2b..722e388cae 100644 --- a/rdmo/management/assets/js/components/edit/common/OrderedMultiSelect.js +++ b/rdmo/management/assets/js/components/edit/common/OrderedMultiSelect.js @@ -202,8 +202,8 @@ class OrderedMultiSelect extends Component { } render() { - const { config, element, field, verboseName, verboseNameCreate, - verboseNameAltCreate, onCreate, onAltCreate } = this.props + const { config, element, field, addText, createText, altCreateText, + onCreate, onAltCreate } = this.props const id = getId(element, field), label = getLabel(config, element, field), @@ -239,14 +239,14 @@ class OrderedMultiSelect extends Component { <button className="btn btn-primary btn-xs" onClick={() => this.handleAdd()} disabled={element.read_only}> - {interpolate(gettext('Add existing %s'), [verboseName])} + {addText} </button> { onCreate && <button className="btn btn-success btn-xs ml-10" onClick={onCreate} disabled={element.read_only || isNil(element.id)} title={isNil(element.id) ? gettext('For this action, the element must first be created.') : undefined}> - {interpolate(gettext('Create new %s'), [verboseNameCreate || verboseName])} + {createText} </button> } { @@ -254,7 +254,7 @@ class OrderedMultiSelect extends Component { <button className="btn btn-success btn-xs ml-10" onClick={onAltCreate} disabled={element.read_only || isNil(element.id)} title={isNil(element.id) ? gettext('For this action, the element must first be created.') : undefined}> - {interpolate(gettext('Create new %s'), [verboseNameAltCreate || verboseName])} + {altCreateText} </button> } @@ -284,9 +284,9 @@ OrderedMultiSelect.propTypes = { fields: PropTypes.array, options: PropTypes.array.isRequired, values: PropTypes.array, - verboseName: PropTypes.string.isRequired, - verboseNameCreate: PropTypes.string, - verboseNameAltCreate: PropTypes.string, + addText: PropTypes.string.isRequired, + createText: PropTypes.string, + altCreateText: PropTypes.string, onChange: PropTypes.func.isRequired, onCreate: PropTypes.func, onAltCreate: PropTypes.func, diff --git a/rdmo/management/assets/js/components/edit/common/Radio.js b/rdmo/management/assets/js/components/edit/common/Radio.js new file mode 100644 index 0000000000..6e2c530e97 --- /dev/null +++ b/rdmo/management/assets/js/components/edit/common/Radio.js @@ -0,0 +1,59 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classNames from 'classnames' +import isEmpty from 'lodash/isEmpty' +import isNil from 'lodash/isNil' +import get from 'lodash/get' + +import { getId, getLabel, getHelp } from 'rdmo/management/assets/js/utils/forms' + +const Radio = ({ config, element, field, options, onChange }) => { + const id = getId(element, field), + label = getLabel(config, element, field), + help = getHelp(config, element, field), + warnings = get(element, ['warnings', field]), + errors = get(element, ['errors', field]) + + const className = classNames({ + 'form-group': true, + 'has-warning': !isEmpty(warnings), + 'has-error': !isEmpty(errors) + }) + + const value = isNil(element[field]) ? '' : element[field] + + return ( + <div className={className}> + <label className="control-label" htmlFor={id}>{label}</label> + + <div> + { + options.map((option, index) => ( + <label key={index} className="radio-inline"> + <input type="radio" name="inlineRadioOptions" disabled={element.read_only} + checked={value === option.id} + value={option.id} onChange={event => onChange(field, event.target.value)}/> + <span>{option.text}</span> + </label> + )) + } + </div> + + {help && <p className="help-block">{help}</p>} + + {errors && <ul className="help-block list-unstyled"> + {errors.map((error, index) => <li key={index}>{error}</li>)} + </ul>} + </div> + ) +} + +Radio.propTypes = { + config: PropTypes.object, + element: PropTypes.object, + field: PropTypes.string, + options: PropTypes.array, + onChange: PropTypes.func +} + +export default Radio diff --git a/rdmo/management/assets/js/components/edit/common/Select.js b/rdmo/management/assets/js/components/edit/common/Select.js index df024a1d3a..afb5be1e86 100644 --- a/rdmo/management/assets/js/components/edit/common/Select.js +++ b/rdmo/management/assets/js/components/edit/common/Select.js @@ -11,7 +11,7 @@ import Link from 'rdmo/core/assets/js/components/Link' import { getId, getLabel, getHelp } from 'rdmo/management/assets/js/utils/forms' -const Select = ({ config, element, field, options, verboseName, isMulti, onChange, onCreate, onEdit }) => { +const Select = ({ config, element, field, options, createText, isMulti, onChange, onCreate, onEdit }) => { const id = getId(element, field), label = getLabel(config, element, field), help = getHelp(config, element, field), @@ -68,7 +68,7 @@ const Select = ({ config, element, field, options, verboseName, isMulti, onChang onCreate && <button className="btn btn-success btn-xs mt-10" onClick={onCreate} disabled={isNil(element.id)} title={isNil(element.id) ? gettext('For this action, the element must first be created.') : undefined}> - {interpolate(gettext('Create new %s'), [verboseName])} + {createText} </button> } @@ -86,7 +86,7 @@ Select.propTypes = { element: PropTypes.object, field: PropTypes.string, options: PropTypes.array, - verboseName: PropTypes.string, + createText: PropTypes.string, isMulti: PropTypes.bool, onChange: PropTypes.func, onCreate: PropTypes.func, diff --git a/rdmo/management/assets/js/components/element/Page.js b/rdmo/management/assets/js/components/element/Page.js index af692967be..0a7e086296 100644 --- a/rdmo/management/assets/js/components/element/Page.js +++ b/rdmo/management/assets/js/components/element/Page.js @@ -14,7 +14,7 @@ import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' const Page = ({ config, page, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, page) const showElements = get(config, `display.elements.pages.${page.id}`, true) @@ -58,7 +58,7 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind </p> { get(config, 'display.uri.pages', true) && <p> - <CodeLink className="code-questions" uri={page.uri} onClick={() => fetchEdit()} /> + <CodeLink className="code-questions" uri={page.uri} onClick={() => fetchEdit()} order={order} /> </p> } { @@ -102,13 +102,17 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind { showElements && page.elements.map((element, index) => { if (element.model == 'questions.questionset') { + const questionSetInfo = page.questionsets.find(info => info.questionset === element.id) + const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return <QuestionSet key={index} config={config} questionset={element} configActions={configActions} elementActions={elementActions} - display="nested" filter={filter} indent={indent + 1} /> + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { + const questionInfo = page.questions.find(info => info.question === element.id) + const questionOrder = questionInfo ? questionInfo.order : undefined return <Question key={index} config={config} question={element} configActions={configActions} elementActions={elementActions} - display="nested" filter={filter} indent={indent + 1} /> + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } @@ -128,7 +132,8 @@ Page.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Page diff --git a/rdmo/management/assets/js/components/element/Question.js b/rdmo/management/assets/js/components/element/Question.js index ecf280573f..e9864d8cd2 100644 --- a/rdmo/management/assets/js/components/element/Question.js +++ b/rdmo/management/assets/js/components/element/Question.js @@ -11,7 +11,7 @@ import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' const Question = ({ config, question, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, question) @@ -46,7 +46,7 @@ const Question = ({ config, question, elementActions, display='list', indent=0, </p> { get(config, 'display.uri.questions', true) && <p> - <CodeLink className="code-questions" uri={question.uri} onClick={() => fetchEdit()} /> + <CodeLink className="code-questions" uri={question.uri} onClick={() => fetchEdit()} order={order} /> </p> } { @@ -106,7 +106,8 @@ Question.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Question diff --git a/rdmo/management/assets/js/components/element/QuestionSet.js b/rdmo/management/assets/js/components/element/QuestionSet.js index 024652536f..56d3bdd701 100644 --- a/rdmo/management/assets/js/components/element/QuestionSet.js +++ b/rdmo/management/assets/js/components/element/QuestionSet.js @@ -13,7 +13,7 @@ import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' const QuestionSet = ({ config, questionset, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, questionset) const showElements = get(config, `display.elements.questionsets.${questionset.id}`, true) @@ -57,7 +57,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ </p> { get(config, 'display.uri.questionsets', true) && <p> - <CodeLink className="code-questions" uri={questionset.uri} onClick={() => fetchEdit()} /> + <CodeLink className="code-questions" uri={questionset.uri} onClick={() => fetchEdit()} order={order} /> </p> } { @@ -101,13 +101,17 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ { showElements && questionset.elements.map((element, index) => { if (element.model == 'questions.questionset') { + const questionSetInfo = questionset.questionsets.find(info => info.questionset === element.id) + const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return <QuestionSet key={index} config={config} questionset={element} configActions={configActions} elementActions={elementActions} - display="nested" filter={filter} indent={indent + 1} /> + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { + const questionInfo = questionset.questions.find(info => info.question === element.id) + const questionOrder = questionInfo ? questionInfo.order : undefined return <Question key={index} config={config} question={element} configActions={configActions} elementActions={elementActions} - display="nested" filter={filter} indent={indent + 1} /> + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } @@ -127,7 +131,8 @@ QuestionSet.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default QuestionSet diff --git a/rdmo/management/assets/js/components/element/Section.js b/rdmo/management/assets/js/components/element/Section.js index c675ee8103..92e0150ad7 100644 --- a/rdmo/management/assets/js/components/element/Section.js +++ b/rdmo/management/assets/js/components/element/Section.js @@ -15,7 +15,7 @@ import { Drag, Drop } from '../common/DragAndDrop' const Section = ({ config, section, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, section) const showElements = get(config, `display.elements.sections.${section.id}`, true) @@ -55,7 +55,7 @@ const Section = ({ config, section, configActions, elementActions, display='list </p> { get(config, 'display.uri.sections', true) && - <CodeLink className="code-questions" uri={section.uri} onClick={() => fetchEdit()} /> + <CodeLink className="code-questions" uri={section.uri} onClick={() => fetchEdit()} order={order} /> } <ElementErrors element={section} /> </div> @@ -88,11 +88,24 @@ const Section = ({ config, section, configActions, elementActions, display='list <Drop element={section.elements[0]} elementActions={elementActions} indent={indent + 1} mode="before" /> } { - showElements && section.elements.map((page, index) => ( - <Page key={index} config={config} page={page} - configActions={configActions} elementActions={elementActions} - display="nested" filter={filter} indent={indent + 1} /> - )) + showElements && section.elements.map((page, index) => { + const pageInfo = section.pages.find(info => info.page === page.id) + const pageOrder = pageInfo ? pageInfo.order : undefined + + return ( + <Page + key={index} + config={config} + page={page} + configActions={configActions} + elementActions={elementActions} + display="nested" + filter={filter} + indent={indent + 1} + order={pageOrder} + /> + ) + }) } <Drop element={section} elementActions={elementActions} indent={indent} mode="after" /> </> @@ -110,7 +123,8 @@ Section.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Section diff --git a/rdmo/management/assets/js/components/element/Task.js b/rdmo/management/assets/js/components/element/Task.js index c8a4f981bf..12676cc89f 100644 --- a/rdmo/management/assets/js/components/element/Task.js +++ b/rdmo/management/assets/js/components/element/Task.js @@ -1,5 +1,6 @@ import React from 'react' import PropTypes from 'prop-types' +import get from 'lodash/get' import { filterElement } from '../../utils/filter' import { buildPath } from '../../utils/location' @@ -21,6 +22,8 @@ const Task = ({ config, task, elementActions, filter=false, filterSites=false, f const toggleAvailable = () => elementActions.storeElement('tasks', {...task, available: !task.available }) const toggleLocked = () => elementActions.storeElement('tasks', {...task, locked: !task.locked }) + const fetchCondition = (index) => elementActions.fetchElement('conditions', task.conditions[index]) + return showElement && ( <li className="list-group-item"> <div className="element"> @@ -40,8 +43,20 @@ const Task = ({ config, task, elementActions, filter=false, filterSites=false, f <div> <p> <strong>{gettext('Task')}{': '}</strong> - <CodeLink className="code-tasks" uri={task.uri} onClick={() => fetchEdit()} /> + {task.title} </p> + { + get(config, 'display.uri.tasks', true) && <p> + <CodeLink className="code-tasks" uri={task.uri} onClick={() => fetchEdit()} /> + </p> + } + { + get(config, 'display.uri.conditions', true) && task.condition_uris.map((uri, index) => ( + <p key={index}> + <CodeLink className="code-conditions" uri={uri} onClick={() => fetchCondition(index)} /> + </p> + )) + } <ElementErrors element={task} /> </div> </div> diff --git a/rdmo/management/assets/js/components/elements/Tasks.js b/rdmo/management/assets/js/components/elements/Tasks.js index 693181538f..136ecc6140 100644 --- a/rdmo/management/assets/js/components/elements/Tasks.js +++ b/rdmo/management/assets/js/components/elements/Tasks.js @@ -6,6 +6,7 @@ import { getUriPrefixes } from '../../utils/filter' import { FilterString, FilterUriPrefix, FilterSite} from '../common/Filter' import { BackButton, NewButton } from '../common/Buttons' +import { Checkbox } from '../common/Checkboxes' import Task from '../element/Task' @@ -16,6 +17,9 @@ const Tasks = ({ config, tasks, configActions, elementActions }) => { const updateFilterSite = (value) => configActions.updateConfig('filter.sites', value) const updateFilterEditor = (value) => configActions.updateConfig('filter.editors', value) + const updateDisplayTasksURI = (value) => configActions.updateConfig('display.uri.tasks', value) + const updateDisplayConditionsURI = (value) => configActions.updateConfig('display.uri.conditions', value) + const createTask = () => elementActions.createElement('tasks') return ( @@ -51,6 +55,14 @@ const Tasks = ({ config, tasks, configActions, elementActions }) => { </> } </div> + <div className="checkboxes"> + <span className="mr-10">{gettext('Show URIs:')}</span> + <Checkbox label={<code className="code-tasks">{gettext('Tasks')}</code>} + value={get(config, 'display.uri.tasks', true)} onChange={updateDisplayTasksURI} /> + <Checkbox label={<code className="code-conditions">{gettext('Conditions')}</code>} + value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> + </div> + </div> <ul className="list-group"> diff --git a/rdmo/management/assets/js/components/nested/NestedCatalog.js b/rdmo/management/assets/js/components/nested/NestedCatalog.js index 3b2809f909..b57840b9c6 100644 --- a/rdmo/management/assets/js/components/nested/NestedCatalog.js +++ b/rdmo/management/assets/js/components/nested/NestedCatalog.js @@ -86,12 +86,25 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => { <Drop element={catalog.elements[0]} elementActions={elementActions} indent={0} mode="before" /> } { - catalog.elements.map((section, index) => ( - <Section key={index} config={config} section={section} - configActions={configActions} elementActions={elementActions} - display="nested" filter="catalog" indent={0} /> - )) + catalog.elements.map((section, index) => { + const sectionInfo = catalog.sections.find(info => info.section === section.id) + const sectionOrder = sectionInfo ? sectionInfo.order : undefined + + return ( + <Section key={index} + config={config} + section={section} + configActions={configActions} + elementActions={elementActions} + display="nested" + filter="catalog" + indent={0} + order={sectionOrder} + /> + ) + }) } + </> ) } diff --git a/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js b/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js index b0b90eb123..16780f7e8e 100644 --- a/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js +++ b/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js @@ -27,47 +27,47 @@ const ElementsSidebar = ({ config, elements, elementActions, importActions }) => <ul className="list-unstyled"> <li> <Link href={buildPath(config.baseUrl, 'catalogs')} - onClick={() => elementActions.fetchElements('catalogs')}>Catalogs</Link> + onClick={() => elementActions.fetchElements('catalogs')}>{gettext('Catalogs')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'sections')} - onClick={() => elementActions.fetchElements('sections')}>Sections</Link> + onClick={() => elementActions.fetchElements('sections')}>{gettext('Sections')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'pages')} - onClick={() => elementActions.fetchElements('pages')}>Pages</Link> + onClick={() => elementActions.fetchElements('pages')}>{gettext('Pages')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'questionsets')} - onClick={() => elementActions.fetchElements('questionsets')}>Question sets</Link> + onClick={() => elementActions.fetchElements('questionsets')}>{gettext('Question sets')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'questions')} - onClick={() => elementActions.fetchElements('questions')}>Questions</Link> + onClick={() => elementActions.fetchElements('questions')}>{gettext('Questions')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'attributes')} - onClick={() => elementActions.fetchElements('attributes')}>Attributes</Link> + onClick={() => elementActions.fetchElements('attributes')}>{gettext('Attributes')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'optionsets')} - onClick={() => elementActions.fetchElements('optionsets')}>Option sets</Link> + onClick={() => elementActions.fetchElements('optionsets')}>{gettext('Option sets')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'options')} - onClick={() => elementActions.fetchElements('options')}>Options</Link> + onClick={() => elementActions.fetchElements('options')}>{gettext('Options')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'conditions')} - onClick={() => elementActions.fetchElements('conditions')}>Conditions</Link> + onClick={() => elementActions.fetchElements('conditions')}>{gettext('Conditions')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'tasks')} - onClick={() => elementActions.fetchElements('tasks')}>Tasks</Link> + onClick={() => elementActions.fetchElements('tasks')}>{gettext('Tasks')}</Link> </li> <li> <Link href={buildPath(config.baseUrl, 'views')} - onClick={() => elementActions.fetchElements('views')}>Views</Link> + onClick={() => elementActions.fetchElements('views')}>{gettext('Views')}</Link> </li> </ul> diff --git a/rdmo/management/assets/js/factories/ConditionsFactory.js b/rdmo/management/assets/js/factories/ConditionsFactory.js index 28c8cbab48..5f9fa8f15b 100644 --- a/rdmo/management/assets/js/factories/ConditionsFactory.js +++ b/rdmo/management/assets/js/factories/ConditionsFactory.js @@ -9,7 +9,8 @@ class ConditionsFactory { pages: parent.page ? [parent.page.id] : [], questionsets: parent.questionset ? [parent.questionset.id] : [], questions: parent.question ? [parent.question.id] : [], - tasks: parent.task ? [parent.task.id] : [] + tasks: parent.task ? [parent.task.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } diff --git a/rdmo/management/assets/js/factories/DomainFactory.js b/rdmo/management/assets/js/factories/DomainFactory.js index 914decb807..3fbc469226 100644 --- a/rdmo/management/assets/js/factories/DomainFactory.js +++ b/rdmo/management/assets/js/factories/DomainFactory.js @@ -1,4 +1,4 @@ -class QuestionsFactory { +class DomainFactory { static createAttribute(config, parent) { return { @@ -8,10 +8,11 @@ class QuestionsFactory { conditions: parent.condition ? [parent.condition.id] : [], pages: parent.page ? [parent.page.id] : [], questionsets: parent.questionset ? [parent.questionset.id] : [], - questions: parent.question ? [parent.question.id] : [] + questions: parent.question ? [parent.question.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } } -export default QuestionsFactory +export default DomainFactory diff --git a/rdmo/management/assets/js/factories/OptionsFactory.js b/rdmo/management/assets/js/factories/OptionsFactory.js index 4cb4076017..a0b6436193 100644 --- a/rdmo/management/assets/js/factories/OptionsFactory.js +++ b/rdmo/management/assets/js/factories/OptionsFactory.js @@ -4,7 +4,8 @@ class OptionsFactory { return { model: 'options.optionset', uri_prefix: config.settings.default_uri_prefix, - questions: parent.question ? [parent.question.id] : [] + questions: parent.question ? [parent.question.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } @@ -13,7 +14,8 @@ class OptionsFactory { model: 'options.option', uri_prefix: config.settings.default_uri_prefix, optionsets: parent.optionset ? [parent.optionset.id] : [], - conditions: [] + conditions: [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } diff --git a/rdmo/management/assets/js/factories/QuestionsFactory.js b/rdmo/management/assets/js/factories/QuestionsFactory.js index a9fe2dcd39..bb8d6a47f6 100644 --- a/rdmo/management/assets/js/factories/QuestionsFactory.js +++ b/rdmo/management/assets/js/factories/QuestionsFactory.js @@ -5,7 +5,9 @@ class QuestionsFactory { model: 'questions.catalog', uri_prefix: config.settings.default_uri_prefix, available: true, - sections: [] + sections: [], + sites: config.settings.multisite ? [config.currentSite.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } @@ -14,7 +16,8 @@ class QuestionsFactory { model: 'questions.section', uri_prefix: config.settings.default_uri_prefix, catalogs: parent.catalog ? [parent.catalog.id] : [], - pages: [] + pages: [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } @@ -24,7 +27,8 @@ class QuestionsFactory { uri_prefix: config.settings.default_uri_prefix, sections: parent.section ? [parent.section.id] : [], questionsets: [], - questions: [] + questions: [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } @@ -35,7 +39,8 @@ class QuestionsFactory { pages: parent.page ? [parent.page.id] : [], parents: parent.questionset ? [parent.questionset.id] : [], questionsets: [], - questions: [] + questions: [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } @@ -46,7 +51,8 @@ class QuestionsFactory { widget_type: 'text', value_type: 'text', pages: parent.page ? [parent.page.id] : [], - questionsets: parent.questionset ? [parent.questionset.id] : [] + questionsets: parent.questionset ? [parent.questionset.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } diff --git a/rdmo/management/assets/js/factories/TasksFactory.js b/rdmo/management/assets/js/factories/TasksFactory.js index b2496654cc..10c2697729 100644 --- a/rdmo/management/assets/js/factories/TasksFactory.js +++ b/rdmo/management/assets/js/factories/TasksFactory.js @@ -3,7 +3,9 @@ class TasksFactory { static createTask(config) { return { model: 'tasks.task', - uri_prefix: config.settings.default_uri_prefix + uri_prefix: config.settings.default_uri_prefix, + sites: config.settings.multisite ? [config.currentSite.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } diff --git a/rdmo/management/assets/js/factories/ViewsFactory.js b/rdmo/management/assets/js/factories/ViewsFactory.js index cf91d27a6f..442e612b80 100644 --- a/rdmo/management/assets/js/factories/ViewsFactory.js +++ b/rdmo/management/assets/js/factories/ViewsFactory.js @@ -4,7 +4,9 @@ class ViewsFactory { return { model: 'views.view', uri_prefix: config.settings.default_uri_prefix, - template: '{% load view_tags %}\n' + template: '{% load view_tags %}\n', + sites: config.settings.multisite ? [config.currentSite.id] : [], + editors: config.settings.multisite ? [config.currentSite.id] : [], } } diff --git a/rdmo/management/assets/js/reducers/configReducer.js b/rdmo/management/assets/js/reducers/configReducer.js index 12f8196864..4eb2500380 100644 --- a/rdmo/management/assets/js/reducers/configReducer.js +++ b/rdmo/management/assets/js/reducers/configReducer.js @@ -1,7 +1,9 @@ import set from 'lodash/set' +import baseUrl from 'rdmo/core/assets/js/utils/baseUrl' + const initialState = { - baseUrl: '/management/', + baseUrl: baseUrl + '/management/', settings: {}, filter: {}, display: {} diff --git a/rdmo/management/assets/js/store/configureStore.js b/rdmo/management/assets/js/store/configureStore.js index e4720e7d4c..f96d73cc06 100644 --- a/rdmo/management/assets/js/store/configureStore.js +++ b/rdmo/management/assets/js/store/configureStore.js @@ -1,5 +1,7 @@ import { applyMiddleware, createStore } from 'redux' +import Cookies from 'js-cookie' import thunk from 'redux-thunk' +import isEmpty from 'lodash/isEmpty' import isNil from 'lodash/isNil' import { parseLocation } from '../utils/location' @@ -12,6 +14,15 @@ import * as elementActions from '../actions/elementActions' export default function configureStore() { const middlewares = [thunk] + // empty localStorage in new session + const currentStoreId = Cookies.get('storeid') + const localStoreId = localStorage.getItem('rdmo.storeid') + + if (isEmpty(localStoreId) || localStoreId !== currentStoreId) { + localStorage.clear() + localStorage.setItem('rdmo.storeid', currentStoreId) + } + if (process.env.NODE_ENV === 'development') { const { logger } = require('redux-logger') middlewares.push(logger) @@ -28,7 +39,6 @@ export default function configureStore() { // load: restore the config from the local storage const updateConfigFromLocalStorage = () => { const ls = {...localStorage} - Object.entries(ls).forEach(([lsPath, lsValue]) => { const path = lsPath.replace('rdmo.management.config.', '') let value @@ -46,9 +56,11 @@ export default function configureStore() { }) } + let currentSiteId // load, popstate: fetch elements depending on the location const fetchElementsFromLocation = () => { const baseUrl = store.getState().config.baseUrl + currentSiteId = store.getState().config.currentSite?.id.toString() || '' const pathname = window.location.pathname let { elementType, elementId, elementAction } = parseLocation(baseUrl, pathname) @@ -69,7 +81,13 @@ export default function configureStore() { // this event is triggered when the page first loads window.addEventListener('load', () => { updateConfigFromLocalStorage() - fetchConfig().then(() => fetchElementsFromLocation()) + fetchConfig().then(() => { + fetchElementsFromLocation() + if (!isEmpty(currentSiteId) && isEmpty(store.getState().config.filter) && store.getState().config.settings.multisite) { + store.dispatch(configActions.updateConfig('filter.sites', currentSiteId)) + } + }) + }) // this event is triggered when when the forward/back buttons are used diff --git a/rdmo/management/assets/js/utils/filter.js b/rdmo/management/assets/js/utils/filter.js index 25ecf7d306..324d0c6fed 100644 --- a/rdmo/management/assets/js/utils/filter.js +++ b/rdmo/management/assets/js/utils/filter.js @@ -20,8 +20,8 @@ const filterSearch = (search, element) => { return ( isEmpty(search) || element.uri.includes(search) || - (!isUndefined(element.title) && element.title.includes(search)) || - (!isUndefined(element.text) && element.text.includes(search)) + (!isUndefined(element.title) && element.title.toLowerCase().includes(search.toLowerCase())) || + (!isUndefined(element.text) && element.text.toLowerCase().includes(search.toLowerCase())) ) } diff --git a/rdmo/management/assets/scss/management.scss b/rdmo/management/assets/scss/management.scss index be8787c4ea..580107c1d2 100644 --- a/rdmo/management/assets/scss/management.scss +++ b/rdmo/management/assets/scss/management.scss @@ -3,103 +3,6 @@ $icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/"; @import '~font-awesome/css/font-awesome.css'; @import 'rdmo/core/assets/scss/variables'; -a.disabled { - cursor: not-allowed; -} - -.flip { - transform: rotate(180deg) scaleX(-1); -} - -.w-100 { - width: 100%; -} -.mt-0 { - margin-top: 0; -} -.mt-5 { - margin-top: 5px; -} -.mt-10 { - margin-top: 10px; -} -.mt-20 { - margin-top: 20px; -} -.mr-0 { - margin-right: 0; -} -.mr-5 { - margin-right: 5px; -} -.mr-10 { - margin-right: 10px; -} -.mr-20 { - margin-right: 20px; -} -.mb-0 { - margin-bottom: 0; -} -.mb-5 { - margin-bottom: 5px; -} -.mb-10 { - margin-bottom: 10px; -} -.mb-20 { - margin-bottom: 20px; -} -.ml-0 { - margin-left: 0; -} -.ml-5 { - margin-left: 5px; -} -.ml-10 { - margin-left: 10px; -} -.ml-20 { - margin-left: 20px; -} - -.pt-0 { - padding-top: 0; -} -.pt-10 { - padding-top: 10px; -} -.pt-20 { - padding-top: 20px; -} -.pr-0 { - padding-right: 0; -} -.pr-10 { - padding-right: 10px; -} -.pr-20 { - padding-right: 20px; -} -.pb-0 { - padding-bottom: 0; -} -.pb-10 { - padding-bottom: 10px; -} -.pb-20 { - padding-bottom: 20px; -} -.pl-0 { - padding-left: 0; -} -.pl-10 { - padding-left: 10px; -} -.pl-20 { - padding-left: 20px; -} - .form-group { .react-select__control { min-height: 34px; diff --git a/rdmo/management/tests/test_frontend.py b/rdmo/management/tests/test_frontend.py new file mode 100644 index 0000000000..3bf05f75d1 --- /dev/null +++ b/rdmo/management/tests/test_frontend.py @@ -0,0 +1,198 @@ +import os +import re +from dataclasses import dataclass +from urllib.parse import urlparse + +import pytest + +from django.core.management import call_command + +from playwright.sync_api import Page, expect +from pytest_django.live_server_helper import LiveServer + +from rdmo.accounts.utils import set_group_permissions +from rdmo.conditions.models import Condition +from rdmo.core.models import Model +from rdmo.domain.models import Attribute +from rdmo.options.models import Option, OptionSet +from rdmo.questions.models import Catalog, Question, Section +from rdmo.questions.models import Page as PageModel +from rdmo.questions.models.questionset import QuestionSet +from rdmo.tasks.models import Task +from rdmo.views.models import View + +pytestmark = pytest.mark.e2e + +# needed for playwright to run +os.environ.setdefault("DJANGO_ALLOW_ASYNC_UNSAFE", "true") + + +@dataclass +class ModelHelper: + """Helper class to bundle information about models for test cases.""" + + model: Model + form_field: str = "URI Path" + db_field: str = "uri_path" + has_nested: bool = False + + @property + def url(self) -> str: + return f"{self.model._meta.model_name}s" + + @property + def verbose_name(self) -> str: + """Return the verbose_name for the model.""" + return self.model._meta.verbose_name + + @property + def verbose_name_plural(self) -> str: + """Return the verbose_name_plural for the model.""" + return self.model._meta.verbose_name_plural + + +@pytest.fixture(scope="function") +def e2e_tests_django_db_setup(django_db_setup, django_db_blocker, fixtures): + """Set up database and populate with fixtures, that get restored for every test case.""" + with django_db_blocker.unblock(): + call_command("loaddata", *fixtures) + set_group_permissions() + + +@pytest.fixture(scope="session") +def base_url(live_server: LiveServer) -> str: + """Enable playwright to address URLs with base URL automatically prefixed.""" + return live_server.url + + +@pytest.fixture +def logged_in_admin_user(e2e_tests_django_db_setup, page: Page) -> Page: + """Log in as admin user through django login UI, returns logged in page for e2e tests.""" + page.goto("/account/login") + page.get_by_label("Username").fill("admin", timeout=5000) + page.get_by_label("Password").fill("admin") + page.get_by_role("button", name="Login").click() + page.goto("/management") + yield page + + +model_helpers = ( + ModelHelper(Catalog, has_nested=True), + ModelHelper(Section, has_nested=True), + ModelHelper(PageModel, has_nested=True), + ModelHelper(QuestionSet, has_nested=True), + ModelHelper(Question), + ModelHelper( + Attribute, has_nested=True, form_field="Key", db_field="key" + ), + ModelHelper(OptionSet, has_nested=True), + ModelHelper(Option), + ModelHelper(Condition), + ModelHelper(Task), + ModelHelper(View), +) + +@pytest.mark.parametrize("helper", model_helpers) +def test_management_navigation(logged_in_admin_user: Page, helper: ModelHelper) -> None: + """Test that each content type is available through the navigation.""" + page = logged_in_admin_user + expect(page.get_by_role("heading", name="Management")).to_be_visible() + + # click a link in the navigation + name = helper.verbose_name_plural + page.get_by_role("link", name=name, exact=True).click() + + # make sure the browser opened a new page + url_name = name.lower() + url_name = url_name.replace(" ", "") + expect(page).to_have_url(re.compile(rf".*/{url_name}/")) + + # take a screenshot for visual inspection + if helper.model == Catalog: + item_in_ui = page.locator(".list-group > .list-group-item").first + expect(item_in_ui).to_be_visible() + page.screenshot(path="screenshots/management-navigation-catalog.png", full_page=True) + + +@pytest.mark.parametrize("helper", model_helpers) +def test_management_has_items(logged_in_admin_user: Page, helper: ModelHelper) -> None: + """Test all items in database are visible in management UI.""" + page = logged_in_admin_user + num_items_in_database = helper.model.objects.count() + page.goto(f"/management/{helper.url}") + items_in_ui = page.locator(".list-group > .list-group-item") + expect(items_in_ui).to_have_count(num_items_in_database) + + +@pytest.mark.parametrize("helper", model_helpers) +def test_management_nested_view( + logged_in_admin_user: Page, helper: ModelHelper +) -> None: + """For each element type, that has a nested view, click the first example.""" + page = logged_in_admin_user + page.goto(f"/management/{helper.url}") + # Open nested view for element type + if helper.has_nested: + page.get_by_title(f"View {helper.verbose_name} nested").first.click() + expect(page.locator(".panel-default").first).to_be_visible() + expect(page.locator(".panel-default > .panel-body").first).to_be_visible() + + +@pytest.mark.parametrize("helper", model_helpers) +def test_management_create_model( + logged_in_admin_user: Page, helper: ModelHelper +) -> None: + """Test management UI can create objects in the database.""" + page = logged_in_admin_user + num_objects_at_start = helper.model.objects.count() + page.goto(f"/management/{helper.url}") + # click "New" button + page.get_by_role("button", name="New").click() + # fill mandatory fields + value = "some-value" + page.get_by_label(helper.form_field).fill(value) + if helper.model == Condition: + # conditions need to have a source attribute + source_form = ( + page.locator(".form-group") + .filter(has_text="Source") + .locator(".select-item > .react-select") + ) + source_form.click() + page.keyboard.type(Attribute.objects.first().uri) + page.keyboard.press("Enter") + + # save + page.get_by_role("button", name="Create").nth(1).click() + # check if new item is in list + items_in_ui = page.locator(".list-group > .list-group-item") + expect(items_in_ui).to_have_count(num_objects_at_start + 1) + + num_objects_after_save = helper.model.objects.count() + assert num_objects_after_save - num_objects_at_start == 1 + query = {helper.db_field: value} + assert helper.model.objects.get(**query) + + +@pytest.mark.parametrize("helper", model_helpers) +def test_management_edit_model(logged_in_admin_user: Page, helper: ModelHelper) -> None: + page = logged_in_admin_user + page.goto(f"/management/{helper.url}") + # click edit + edit_button_title = f"Edit {helper.verbose_name}" + page.get_by_title(f"{edit_button_title}").first.click() + # edit + page.get_by_label("Comment").click() + comment = "this is a comment." + page.get_by_label("Comment").fill(comment) + # save + page.get_by_role("button", name="Save").nth(1).click() + # click on edit element again + page.get_by_title(f"{edit_button_title}").first.click() + # check the updated comment + comment_locator = page.get_by_label("Comment") + expect(comment_locator).to_have_text(comment) + # compare the updated comment with element object from db + url_id = int(urlparse(page.url).path.rstrip("/").split("/")[-1]) + model_obj = helper.model.objects.get(id=url_id) + assert model_obj.comment == comment diff --git a/rdmo/management/tests/test_import_options.py b/rdmo/management/tests/test_import_options.py index 8d98989901..65dd16a82b 100644 --- a/rdmo/management/tests/test_import_options.py +++ b/rdmo/management/tests/test_import_options.py @@ -18,9 +18,9 @@ def test_create_optionsets(db, settings): elements = elements.values() import_elements(elements) - assert len(root) == len(elements) == 12 + assert len(root) == len(elements) == 13 assert OptionSet.objects.count() == 4 - assert Option.objects.count() == 8 + assert Option.objects.count() == 9 assert all(element['created'] is True for element in elements) assert all(element['updated'] is False for element in elements) @@ -35,7 +35,7 @@ def test_update_optionsets(db, settings): elements = elements.values() import_elements(elements) - assert len(root) == len(elements) == 12 + assert len(root) == len(elements) == 13 assert all(element['created'] is False for element in elements) assert all(element['updated'] is True for element in elements) @@ -52,7 +52,7 @@ def test_create_options(db, settings): elements = elements.values() import_elements(elements) - assert len(root) == len(elements) == Option.objects.count() == 8 + assert len(root) == len(elements) == Option.objects.count() == 9 assert all(element['created'] is True for element in elements) assert all(element['updated'] is False for element in elements) @@ -67,7 +67,7 @@ def test_update_options(db, settings): elements = elements.values() import_elements(elements) - assert len(root) == len(elements) == 8 + assert len(root) == len(elements) == 9 assert all(element['created'] is False for element in elements) assert all(element['updated'] is True for element in elements) diff --git a/rdmo/management/views.py b/rdmo/management/views.py index 18ce86b5bf..c4bbd062a7 100644 --- a/rdmo/management/views.py +++ b/rdmo/management/views.py @@ -1,3 +1,4 @@ +import hashlib import logging from django.contrib.auth.mixins import LoginRequiredMixin @@ -18,3 +19,10 @@ class ManagementView(LoginRequiredMixin, PermissionRedirectMixin, RulesPermissio def has_permission(self): # Use test_rule from rules for permissions check return test_rule('management.can_view_management', self.request.user, self.request.site) + + def render_to_response(self, context, **response_kwargs): + storeid = hashlib.sha256(self.request.session.session_key.encode()).hexdigest() + + response = super().render_to_response(context, **response_kwargs) + response.set_cookie('storeid', storeid) + return response diff --git a/rdmo/options/admin.py b/rdmo/options/admin.py index bf5e21c65c..f95d8787bd 100644 --- a/rdmo/options/admin.py +++ b/rdmo/options/admin.py @@ -39,6 +39,7 @@ class OptionSetOptionInline(admin.TabularInline): extra = 0 +@admin.register(OptionSet) class OptionSetAdmin(admin.ModelAdmin): form = OptionSetAdminForm inlines = (OptionSetOptionInline, ) @@ -49,6 +50,7 @@ class OptionSetAdmin(admin.ModelAdmin): filter_horizontal = ('editors', 'conditions') +@admin.register(Option) class OptionAdmin(admin.ModelAdmin): form = OptionAdminForm @@ -57,7 +59,3 @@ class OptionAdmin(admin.ModelAdmin): readonly_fields = ('uri', ) list_filter = ('editors', 'optionsets', 'additional_input') filter_horizontal = ('editors', ) - - -admin.site.register(OptionSet, OptionSetAdmin) -admin.site.register(Option, OptionAdmin) diff --git a/rdmo/options/imports.py b/rdmo/options/imports.py index 757fc34778..1fd585be49 100644 --- a/rdmo/options/imports.py +++ b/rdmo/options/imports.py @@ -62,9 +62,11 @@ def import_option(element, save=False, user=None): set_common_fields(option, element) - option.additional_input = element.get('additional_input') or False + option.additional_input = element.get('additional_input') set_lang_field(option, 'text', element) + set_lang_field(option, 'help', element) + set_lang_field(option, 'view_text', element) validate_instance(option, element, OptionLockedValidator, OptionUniqueURIValidator) diff --git a/rdmo/options/migrations/0032_alter_option_additional_input.py b/rdmo/options/migrations/0032_alter_option_additional_input.py new file mode 100644 index 0000000000..26a1685c6a --- /dev/null +++ b/rdmo/options/migrations/0032_alter_option_additional_input.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.5 on 2023-10-01 12:55 + +from django.db import migrations, models + + +def run_data_migration(apps, schema_editor): + Option = apps.get_model('options', 'Option') + + for option in Option.objects.all(): + option.additional_input = 'text' if option.additional_input == 'True' else '' + option.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('options', '0031_add_editors'), + ] + + operations = [ + migrations.AlterField( + model_name='option', + name='additional_input', + field=models.CharField(blank=True, choices=[('', '---------'), ('text', 'Text'), ('textarea', 'Textarea')], default=False, help_text='Designates whether an additional input is possible for this option.', max_length=256, verbose_name='Additional input'), + ), + migrations.RunPython(run_data_migration), + ] diff --git a/rdmo/options/migrations/0033_option_help.py b/rdmo/options/migrations/0033_option_help.py new file mode 100644 index 0000000000..74694ac894 --- /dev/null +++ b/rdmo/options/migrations/0033_option_help.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.5 on 2023-10-04 07:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('options', '0032_alter_option_additional_input'), + ] + + operations = [ + migrations.AddField( + model_name='option', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text for this option in the primary language.', null=True, verbose_name='Help (primary)'), + ), + migrations.AddField( + model_name='option', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text for this option in the secondary language.', null=True, verbose_name='Help (secondary)'), + ), + migrations.AddField( + model_name='option', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text for this option in the tertiary language.', null=True, verbose_name='Help (tertiary)'), + ), + migrations.AddField( + model_name='option', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text for this option in the quaternary language.', null=True, verbose_name='Help (quaternary)'), + ), + migrations.AddField( + model_name='option', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text for this option in the quinary language.', null=True, verbose_name='Help (quinary)'), + ), + ] diff --git a/rdmo/options/migrations/0034_option_view_text.py b/rdmo/options/migrations/0034_option_view_text.py new file mode 100644 index 0000000000..2d5fa6e4d7 --- /dev/null +++ b/rdmo/options/migrations/0034_option_view_text.py @@ -0,0 +1,38 @@ +# Generated by Django 4.2.5 on 2023-10-05 11:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('options', '0033_option_help'), + ] + + operations = [ + migrations.AddField( + model_name='option', + name='view_text_lang1', + field=models.TextField(blank=True, help_text='The view text for this option in the primary language.', null=True, verbose_name='View text (primary)'), + ), + migrations.AddField( + model_name='option', + name='view_text_lang2', + field=models.TextField(blank=True, help_text='The view text for this option in the secondary language.', null=True, verbose_name='View text (secondary)'), + ), + migrations.AddField( + model_name='option', + name='view_text_lang3', + field=models.TextField(blank=True, help_text='The view text for this option in the tertiary language.', null=True, verbose_name='View text (tertiary)'), + ), + migrations.AddField( + model_name='option', + name='view_text_lang4', + field=models.TextField(blank=True, help_text='The view text for this option in the quaternary language.', null=True, verbose_name='View text (quaternary)'), + ), + migrations.AddField( + model_name='option', + name='view_text_lang5', + field=models.TextField(blank=True, help_text='The view text for this option in the quinary language.', null=True, verbose_name='View text (quinary)'), + ), + ] diff --git a/rdmo/options/migrations/0035_alter_help_text_and_set_default.py b/rdmo/options/migrations/0035_alter_help_text_and_set_default.py new file mode 100644 index 0000000000..c4ca8943ee --- /dev/null +++ b/rdmo/options/migrations/0035_alter_help_text_and_set_default.py @@ -0,0 +1,88 @@ +# Generated by Django 4.2.6 on 2023-12-04 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('options', '0034_option_view_text'), + ] + + operations = [ + migrations.AlterField( + model_name='option', + name='help_lang1', + field=models.TextField(blank=True, default='', help_text='The help text for this option (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='option', + name='help_lang2', + field=models.TextField(blank=True, default='', help_text='The help text for this option (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='option', + name='help_lang3', + field=models.TextField(blank=True, default='', help_text='The help text for this option (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='option', + name='help_lang4', + field=models.TextField(blank=True, default='', help_text='The help text for this option (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='option', + name='help_lang5', + field=models.TextField(blank=True, default='', help_text='The help text for this option (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='option', + name='text_lang1', + field=models.CharField(blank=True, help_text='The text for this option (in the primary language).', max_length=256, verbose_name='Text (primary)'), + ), + migrations.AlterField( + model_name='option', + name='text_lang2', + field=models.CharField(blank=True, help_text='The text for this option (in the secondary language).', max_length=256, verbose_name='Text (secondary)'), + ), + migrations.AlterField( + model_name='option', + name='text_lang3', + field=models.CharField(blank=True, help_text='The text for this option (in the tertiary language).', max_length=256, verbose_name='Text (tertiary)'), + ), + migrations.AlterField( + model_name='option', + name='text_lang4', + field=models.CharField(blank=True, help_text='The text for this option (in the quaternary language).', max_length=256, verbose_name='Text (quaternary)'), + ), + migrations.AlterField( + model_name='option', + name='text_lang5', + field=models.CharField(blank=True, help_text='The text for this option (in the quinary language).', max_length=256, verbose_name='Text (quinary)'), + ), + migrations.AlterField( + model_name='option', + name='view_text_lang1', + field=models.TextField(blank=True, default='', help_text='The view text for this option (in the primary language).', verbose_name='View text (primary)'), + ), + migrations.AlterField( + model_name='option', + name='view_text_lang2', + field=models.TextField(blank=True, default='', help_text='The view text for this option (in the secondary language).', verbose_name='View text (secondary)'), + ), + migrations.AlterField( + model_name='option', + name='view_text_lang3', + field=models.TextField(blank=True, default='', help_text='The view text for this option (in the tertiary language).', verbose_name='View text (tertiary)'), + ), + migrations.AlterField( + model_name='option', + name='view_text_lang4', + field=models.TextField(blank=True, default='', help_text='The view text for this option (in the quaternary language).', verbose_name='View text (quaternary)'), + ), + migrations.AlterField( + model_name='option', + name='view_text_lang5', + field=models.TextField(blank=True, default='', help_text='The view text for this option (in the quinary language).', verbose_name='View text (quinary)'), + ), + ] diff --git a/rdmo/options/models.py b/rdmo/options/models.py index a450cf64ad..286d0d0d8c 100644 --- a/rdmo/options/models.py +++ b/rdmo/options/models.py @@ -147,6 +147,15 @@ def __str__(self): class Option(models.Model, TranslationMixin): + ADDITIONAL_INPUT_NONE = '' + ADDITIONAL_INPUT_TEXT = 'text' + ADDITIONAL_INPUT_TEXTAREA = 'textarea' + ADDITIONAL_INPUT_CHOICES = ( + (ADDITIONAL_INPUT_NONE, '---------'), + (ADDITIONAL_INPUT_TEXT, _('Text')), + (ADDITIONAL_INPUT_TEXTAREA, _('Textarea')) + ) + uri = models.URLField( max_length=800, blank=True, verbose_name=_('URI'), @@ -180,30 +189,80 @@ class Option(models.Model, TranslationMixin): text_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (primary)'), - help_text=_('The text for this option in the primary language.') + help_text=_('The text for this option (in the primary language).') ) text_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (secondary)'), - help_text=_('The text for this option in the secondary language.') + help_text=_('The text for this option (in the secondary language).') ) text_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (tertiary)'), - help_text=_('The text for this option in the tertiary language.') + help_text=_('The text for this option (in the tertiary language).') ) text_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (quaternary)'), - help_text=_('The text for this option in the quaternary language.') + help_text=_('The text for this option (in the quaternary language).') ) text_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Text (quinary)'), - help_text=_('The text for this option in the quinary language.') + help_text=_('The text for this option (in the quinary language).') ) - additional_input = models.BooleanField( - default=False, + help_lang1 = models.TextField( + blank=True, default="", + verbose_name=_('Help (primary)'), + help_text=_('The help text for this option (in the primary language).') + ) + help_lang2 = models.TextField( + blank=True, default="", + verbose_name=_('Help (secondary)'), + help_text=_('The help text for this option (in the secondary language).') + ) + help_lang3 = models.TextField( + blank=True, default="", + verbose_name=_('Help (tertiary)'), + help_text=_('The help text for this option (in the tertiary language).') + ) + help_lang4 = models.TextField( + blank=True, default="", + verbose_name=_('Help (quaternary)'), + help_text=_('The help text for this option (in the quaternary language).') + ) + help_lang5 = models.TextField( + blank=True, default="", + verbose_name=_('Help (quinary)'), + help_text=_('The help text for this option (in the quinary language).') + ) + view_text_lang1 = models.TextField( + blank=True, default="", + verbose_name=_('View text (primary)'), + help_text=_('The view text for this option (in the primary language).') + ) + view_text_lang2 = models.TextField( + blank=True, default="", + verbose_name=_('View text (secondary)'), + help_text=_('The view text for this option (in the secondary language).') + ) + view_text_lang3 = models.TextField( + blank=True, default="", + verbose_name=_('View text (tertiary)'), + help_text=_('The view text for this option (in the tertiary language).') + ) + view_text_lang4 = models.TextField( + blank=True, default="", + verbose_name=_('View text (quaternary)'), + help_text=_('The view text for this option (in the quaternary language).') + ) + view_text_lang5 = models.TextField( + blank=True, default="", + verbose_name=_('View text (quinary)'), + help_text=_('The view text for this option (in the quinary language).') + ) + additional_input = models.CharField( + max_length=256, blank=True, default=False, choices=ADDITIONAL_INPUT_CHOICES, verbose_name=_('Additional input'), help_text=_('Designates whether an additional input is possible for this option.') ) @@ -224,6 +283,18 @@ def save(self, *args, **kwargs): def text(self): return self.trans('text') + @property + def help(self): + return self.trans('help') + + @property + def view_text(self): + return self.trans('view_text') + + @property + def text_and_help(self): + return f'{self.text} [{self.help}]' if self.help else self.text + @property def label(self): return f'{self.uri} ("{self.text}")' diff --git a/rdmo/options/renderers/mixins.py b/rdmo/options/renderers/mixins.py index 641c935fb0..41ff1a6b58 100644 --- a/rdmo/options/renderers/mixins.py +++ b/rdmo/options/renderers/mixins.py @@ -49,6 +49,8 @@ def render_option(self, xml, option): for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'text', {'lang': lang_code}, option['text_%s' % lang_code]) + self.render_text_element(xml, 'help', {'lang': lang_code}, option['help_%s' % lang_code]) + self.render_text_element(xml, 'view_text', {'lang': lang_code}, option['view_text_%s' % lang_code]) self.render_text_element(xml, 'additional_input', {}, option['additional_input']) xml.endElement('option') diff --git a/rdmo/options/serializers/export.py b/rdmo/options/serializers/export.py index 0911d5cc8e..07f57c3327 100644 --- a/rdmo/options/serializers/export.py +++ b/rdmo/options/serializers/export.py @@ -19,6 +19,8 @@ class Meta: ) trans_fields = ( 'text', + 'help', + 'view_text' ) diff --git a/rdmo/options/serializers/v1/option.py b/rdmo/options/serializers/v1/option.py index b608dcdd5b..1bc0e2f919 100644 --- a/rdmo/options/serializers/v1/option.py +++ b/rdmo/options/serializers/v1/option.py @@ -39,6 +39,8 @@ class Meta: 'comment', 'locked', 'text', + 'help', + 'view_text', 'label', 'additional_input', 'optionsets', @@ -51,6 +53,8 @@ class Meta: ) trans_fields = ( 'text', + 'help', + 'view_text' ) parent_fields = ( ('optionsets', 'optionset', 'option', 'optionset_options'), diff --git a/rdmo/options/templates/options/export/option.html b/rdmo/options/templates/options/export/option.html index 591f447770..62ed64e78e 100644 --- a/rdmo/options/templates/options/export/option.html +++ b/rdmo/options/templates/options/export/option.html @@ -7,6 +7,12 @@ <p> <strong>{% trans 'Text' %}:</strong> {{ option.text }} </p> + <p> + <strong>{% trans 'Help' %}:</strong> {{ option.help }} + </p> + <p> + <strong>{% trans 'View text' %}:</strong> {{ option.view_text }} + </p> <p> <strong>{% trans 'Additional input' %}:</strong> {{ option.additional_input }} </p> diff --git a/rdmo/options/urls/v1.py b/rdmo/options/urls/v1.py index 88e879bb23..1c7980aefe 100644 --- a/rdmo/options/urls/v1.py +++ b/rdmo/options/urls/v1.py @@ -2,13 +2,14 @@ from rest_framework import routers -from ..viewsets import OptionSetViewSet, OptionViewSet, ProviderViewSet +from ..viewsets import AdditionalInputsViewSet, OptionSetViewSet, OptionViewSet, ProviderViewSet app_name = 'v1-options' router = routers.DefaultRouter() router.register(r'optionsets', OptionSetViewSet, basename='optionset') router.register(r'options', OptionViewSet, basename='option') +router.register(r'additionalinputs', AdditionalInputsViewSet, basename='additionalinput') router.register(r'providers', ProviderViewSet, basename='provider') urlpatterns = [ diff --git a/rdmo/options/viewsets.py b/rdmo/options/viewsets.py index 804e003fcc..1922d7f223 100644 --- a/rdmo/options/viewsets.py +++ b/rdmo/options/viewsets.py @@ -141,6 +141,11 @@ def detail_export(self, request, pk=None, export_format='xml'): ) +class AdditionalInputsViewSet(ChoicesViewSet): + permission_classes = (IsAuthenticated, ) + queryset = Option.ADDITIONAL_INPUT_CHOICES + + class ProviderViewSet(ChoicesViewSet): permission_classes = (IsAuthenticated, ) queryset = settings.OPTIONSET_PROVIDERS diff --git a/rdmo/overlays/admin.py b/rdmo/overlays/admin.py index d1267b834e..ee663ac45c 100644 --- a/rdmo/overlays/admin.py +++ b/rdmo/overlays/admin.py @@ -3,10 +3,8 @@ from .models import Overlay +@admin.register(Overlay) class OverlayAdmin(admin.ModelAdmin): search_fields = ('user__username', 'url_name', 'current') list_display = ('user', 'site', 'url_name', 'current') list_filter = ('url_name', 'current') - - -admin.site.register(Overlay, OverlayAdmin) diff --git a/rdmo/projects/admin.py b/rdmo/projects/admin.py index e8890cf19d..fcf6749b5c 100644 --- a/rdmo/projects/admin.py +++ b/rdmo/projects/admin.py @@ -15,6 +15,7 @@ ) +@admin.register(Project) class ProjectAdmin(admin.ModelAdmin): search_fields = ('title', 'user__username') list_display = ('title', 'owners', 'updated', 'created') @@ -32,43 +33,51 @@ def owners(self, obj): return ', '.join([membership.user.username for membership in obj.owner_memberships]) +@admin.register(Membership) class MembershipAdmin(admin.ModelAdmin): search_fields = ('project__title', 'user__username', 'role') list_display = ('project', 'user', 'role') +@admin.register(Continuation) class ContinuationAdmin(admin.ModelAdmin): search_fields = ('project__title', 'user__username') list_display = ('project', 'user', 'page') +@admin.register(Integration) class IntegrationAdmin(admin.ModelAdmin): search_fields = ('project__title', 'provider_key') list_display = ('project', 'provider_key') +@admin.register(IntegrationOption) class IntegrationOptionAdmin(admin.ModelAdmin): search_fields = ('integration__project__title', 'key', 'value') list_display = ('integration', 'key', 'value') +@admin.register(Invite) class InviteAdmin(admin.ModelAdmin): search_fields = ('project__title', 'user__username', 'email', 'role') list_display = ('project', 'user', 'email', 'token', 'timestamp') readonly_fields = ('token', 'timestamp') +@admin.register(Issue) class IssueAdmin(admin.ModelAdmin): search_fields = ('project__title', 'task', 'status') list_display = ('project', 'task', 'status') list_filter = ('status', ) +@admin.register(IssueResource) class IssueResourceAdmin(admin.ModelAdmin): search_fields = ('issue__project__title', 'url') list_display = ('issue', 'url') +@admin.register(Snapshot) class SnapshotAdmin(admin.ModelAdmin): search_fields = ('title', 'project__title', 'project__user__username') list_display = ('title', 'project', 'owners', 'updated', 'created') @@ -86,6 +95,7 @@ def owners(self, obj): return ', '.join([membership.user.username for membership in obj.project.owner_memberships]) +@admin.register(Value) class ValueAdmin(admin.ModelAdmin): search_fields = ('attribute__uri', 'project__title', 'snapshot__title', 'project__user__username') list_display = ('attribute', 'set_prefix', 'set_index', 'collection_index', 'project', 'snapshot_title') @@ -94,15 +104,3 @@ class ValueAdmin(admin.ModelAdmin): def snapshot_title(self, obj): if obj.snapshot: return obj.snapshot.title - - -admin.site.register(Project, ProjectAdmin) -admin.site.register(Membership, MembershipAdmin) -admin.site.register(Continuation, ContinuationAdmin) -admin.site.register(Integration, IntegrationAdmin) -admin.site.register(IntegrationOption, IntegrationOptionAdmin) -admin.site.register(Invite, InviteAdmin) -admin.site.register(Issue, IssueAdmin) -admin.site.register(IssueResource, IssueResourceAdmin) -admin.site.register(Snapshot, SnapshotAdmin) -admin.site.register(Value, ValueAdmin) diff --git a/rdmo/projects/forms.py b/rdmo/projects/forms.py index 4ac7d42ab2..c1ff1145a1 100644 --- a/rdmo/projects/forms.py +++ b/rdmo/projects/forms.py @@ -278,8 +278,10 @@ def __init__(self, *args, **kwargs): if field.get('placeholder'): attrs = {'placeholder': field.get('placeholder')} + self.fields[field.get('key')] = forms.CharField(widget=forms.TextInput(attrs=attrs), - initial=initial, required=field.get('required', True)) + initial=initial, required=field.get('required', True), + help_text=field.get('help')) def save(self): # the the project and the provider_key diff --git a/rdmo/projects/imports.py b/rdmo/projects/imports.py index 3b20736a4e..b49c7492cd 100644 --- a/rdmo/projects/imports.py +++ b/rdmo/projects/imports.py @@ -2,7 +2,6 @@ import io import logging import mimetypes -from urllib.parse import quote from django import forms from django.core.files import File @@ -17,7 +16,6 @@ from rdmo.domain.models import Attribute from rdmo.options.models import Option from rdmo.questions.models import Catalog -from rdmo.services.providers import GitHubProviderMixin, GitLabProviderMixin from rdmo.tasks.models import Task from rdmo.views.models import View @@ -28,6 +26,7 @@ class Import(Plugin): + accept = None upload = True def __init__(self, *args, **kwargs): @@ -88,6 +87,8 @@ def get_view(self, view_uri): class RDMOXMLImport(Import): + accept = '.xml' + def check(self): file_type, encoding = mimetypes.guess_type(self.file_name) if file_type == 'application/xml' or file_type == 'text/xml': @@ -219,8 +220,6 @@ def get_value(self, value_node): class URLImport(RDMOXMLImport): - upload = False - class Form(forms.Form): url = forms.URLField(label=_('Import project from this URL'), required=True) @@ -260,107 +259,3 @@ def submit(self): 'source_title': 'URL', 'form': form }, status=200) - - -class GitHubImport(GitHubProviderMixin, RDMOXMLImport): - - upload = False - - class Form(forms.Form): - repo = forms.CharField(label=_('GitHub repository'), - help_text=_('Please use the form username/repository or organization/repository.')) - path = forms.CharField(label=_('File path')) - ref = forms.CharField(label=_('Branch, tag, or commit'), initial='master') - - def render(self): - return render(self.request, 'projects/project_import_form.html', { - 'source_title': 'GitHub', - 'form': self.Form() - }, status=200) - - def submit(self): - form = self.Form(self.request.POST) - - if 'cancel' in self.request.POST: - if self.project is None: - return redirect('projects') - else: - return redirect('project', self.project.id) - - if form.is_valid(): - self.request.session['import_source_title'] = self.source_title = form.cleaned_data['path'] - - url = '{api_url}/repos/{repo}/contents/{path}?ref={ref}'.format( - api_url=self.api_url, - repo=quote(form.cleaned_data['repo']), - path=quote(form.cleaned_data['path']), - ref=quote(form.cleaned_data['ref']) - ) - - return self.get(self.request, url) - - return render(self.request, 'projects/project_import_form.html', { - 'source_title': 'GitHub', - 'form': form - }, status=200) - - def get_success(self, request, response): - file_content = response.json().get('content') - request.session['import_file_name'] = handle_fetched_file(base64.b64decode(file_content)) - - if self.current_project: - return redirect('project_update_import', self.current_project.id) - else: - return redirect('project_create_import') - - -class GitLabImport(GitLabProviderMixin, RDMOXMLImport): - - upload = False - - class Form(forms.Form): - repo = forms.CharField(label=_('GitLab repository'), - help_text=_('Please use the form username/repository or organization/repository.')) - path = forms.CharField(label=_('File path'),) - ref = forms.CharField(label=_('Branch, tag, or commit'), initial='master') - - def render(self): - return render(self.request, 'projects/project_import_form.html', { - 'source_title': self.gitlab_url, - 'form': self.Form() - }, status=200) - - def submit(self): - form = self.Form(self.request.POST) - - if 'cancel' in self.request.POST: - if self.project is None: - return redirect('projects') - else: - return redirect('project', self.project.id) - - if form.is_valid(): - self.request.session['import_source_title'] = form.cleaned_data['path'] - - url = '{api_url}/projects/{repo}/repository/files/{path}?ref={ref}'.format( - api_url=self.api_url, - repo=quote(form.cleaned_data['repo'], safe=''), - path=quote(form.cleaned_data['path'], safe=''), - ref=quote(form.cleaned_data['ref'], safe='') - ) - - return self.get(self.request, url) - - return render(self.request, 'projects/project_import_form.html', { - 'source_title': self.gitlab_url, - 'form': form - }, status=200) - - def get_success(self, request, response): - file_content = response.json().get('content') - request.session['import_file_name'] = handle_fetched_file(base64.b64decode(file_content)) - - if self.current_project: - return redirect('project_update_import', self.current_project.id) - else: - return redirect('project_create_import') diff --git a/rdmo/projects/managers.py b/rdmo/projects/managers.py index 8ee22b0da2..72e7c21a0b 100644 --- a/rdmo/projects/managers.py +++ b/rdmo/projects/managers.py @@ -1,5 +1,6 @@ from django.conf import settings from django.db import models +from django.db.models import Q from mptt.models import TreeManager from mptt.querysets import TreeQuerySet @@ -141,6 +142,12 @@ def filter_user(self, user): else: return self.none() + def exclude_empty(self): + return self.exclude((Q(text='') | Q(text=None)) & Q(option=None) & (Q(file='') | Q(file=None))) + + def distinct_list(self): + return self.order_by('attribute').values_list('attribute', 'set_prefix', 'set_index').distinct() + class ProjectManager(CurrentSiteManagerMixin, TreeManager): diff --git a/rdmo/projects/migrations/0059_project_progress.py b/rdmo/projects/migrations/0059_project_progress.py new file mode 100644 index 0000000000..abce63ea50 --- /dev/null +++ b/rdmo/projects/migrations/0059_project_progress.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.19 on 2023-08-24 09:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0058_meta'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='progress_count', + field=models.IntegerField(help_text='The number of values for the progress bar.', null=True, verbose_name='Progress count'), + ), + migrations.AddField( + model_name='project', + name='progress_total', + field=models.IntegerField(help_text='The total number of expected values for the progress bar.', null=True, verbose_name='Progress total'), + ), + ] diff --git a/rdmo/projects/migrations/0060_alter_issue_options.py b/rdmo/projects/migrations/0060_alter_issue_options.py new file mode 100644 index 0000000000..9048e8c46c --- /dev/null +++ b/rdmo/projects/migrations/0060_alter_issue_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0059_project_progress'), + ] + + operations = [ + migrations.AlterModelOptions( + name='issue', + options={'ordering': ('project__title', 'task__uri'), 'verbose_name': 'Issue', 'verbose_name_plural': 'Issues'}, + ), + ] diff --git a/rdmo/projects/mixins.py b/rdmo/projects/mixins.py index 5a18cab513..3b8eb3d7af 100644 --- a/rdmo/projects/mixins.py +++ b/rdmo/projects/mixins.py @@ -102,7 +102,7 @@ def import_form(self): import_plugin.file_name = import_file_name import_plugin.source_title = import_source_title - if import_plugin.upload and import_plugin.check(): + if import_plugin.check(): try: import_plugin.process() except ValidationError as e: diff --git a/rdmo/projects/models/integration.py b/rdmo/projects/models/integration.py index b8cdc52169..8bcad4f1df 100644 --- a/rdmo/projects/models/integration.py +++ b/rdmo/projects/models/integration.py @@ -9,8 +9,6 @@ class Integration(models.Model): - objects = IntegrationManager() - project = models.ForeignKey( 'Project', on_delete=models.CASCADE, related_name='integrations', verbose_name=_('Project'), @@ -21,6 +19,8 @@ class Integration(models.Model): help_text=_('The key of the provider for this integration.') ) + objects = IntegrationManager() + class Meta: ordering = ('project__title', ) verbose_name = _('Integration') @@ -29,12 +29,18 @@ class Meta: def __str__(self): return f'{self.project.title} / {self.provider_key}' + def get_absolute_url(self): + return reverse('project', kwargs={'pk': self.project.pk}) + @property def provider(self): return get_plugin('PROJECT_ISSUE_PROVIDERS', self.provider_key) - def get_absolute_url(self): - return reverse('project', kwargs={'pk': self.project.pk}) + def get_option_value(self, key): + try: + return self.options.get(key=key).value + except IntegrationOption.DoesNotExist: + return None def save_options(self, options): for field in self.provider.fields: @@ -77,3 +83,7 @@ class Meta: def __str__(self): return f'{self.integration.project.title} / {self.integration.provider_key} / {self.key} = {self.value}' + + @property + def title(self): + return self.key.title().replace('_', ' ') diff --git a/rdmo/projects/models/invite.py b/rdmo/projects/models/invite.py index 1c1c202b79..16986ecbbd 100644 --- a/rdmo/projects/models/invite.py +++ b/rdmo/projects/models/invite.py @@ -13,8 +13,6 @@ class Invite(models.Model): key_salt = 'rdmo.projects.models.invite.Invite' - objects = InviteManager() - project = models.ForeignKey( 'Project', on_delete=models.CASCADE, related_name='invites', verbose_name=_('Project'), @@ -45,6 +43,8 @@ class Invite(models.Model): help_text=_('The timestamp for this invite.') ) + objects = InviteManager() + class Meta: ordering = ('timestamp', ) verbose_name = _('Invite') diff --git a/rdmo/projects/models/issue.py b/rdmo/projects/models/issue.py index bfaf95474d..3e4f574191 100644 --- a/rdmo/projects/models/issue.py +++ b/rdmo/projects/models/issue.py @@ -12,8 +12,6 @@ class Issue(models.Model): - objects = IssueManager() - ISSUE_STATUS_OPEN = 'open' ISSUE_STATUS_IN_PROGRESS = 'in_progress' ISSUE_STATUS_CLOSED = 'closed' @@ -39,8 +37,9 @@ class Issue(models.Model): help_text=_('The status for this issue.') ) + objects = IssueManager() class Meta: - ordering = ('project__title', ) + ordering = ('project__title', 'task__uri') verbose_name = _('Issue') verbose_name_plural = _('Issues') diff --git a/rdmo/projects/models/membership.py b/rdmo/projects/models/membership.py index f794dff3f9..6e97f086d9 100644 --- a/rdmo/projects/models/membership.py +++ b/rdmo/projects/models/membership.py @@ -8,8 +8,6 @@ class Membership(models.Model): - objects = MembershipManager() - ROLE_CHOICES = ( ('owner', _('Owner')), ('manager', _('Manager')), @@ -33,6 +31,8 @@ class Membership(models.Model): help_text=_('The role for this membership.') ) + objects = MembershipManager() + class Meta: ordering = ('project__title', ) verbose_name = _('Membership') diff --git a/rdmo/projects/models/project.py b/rdmo/projects/models/project.py index eae2128fe2..d13b33a60a 100644 --- a/rdmo/projects/models/project.py +++ b/rdmo/projects/models/project.py @@ -2,7 +2,6 @@ from django.contrib.sites.models import Site from django.core.exceptions import ValidationError from django.db import models -from django.db.models import Exists, OuterRef from django.db.models.signals import pre_delete from django.dispatch import receiver from django.urls import reverse @@ -12,8 +11,7 @@ from mptt.models import MPTTModel, TreeForeignKey from rdmo.core.models import Model -from rdmo.domain.models import Attribute -from rdmo.questions.models import Catalog, Question +from rdmo.questions.models import Catalog from rdmo.tasks.models import Task from rdmo.views.models import View @@ -65,6 +63,16 @@ class Project(MPTTModel, Model): verbose_name=_('Views'), help_text=_('The views that will be used for this project.') ) + progress_total = models.IntegerField( + null=True, + verbose_name=_('Progress total'), + help_text=_('The total number of expected values for the progress bar.') + ) + progress_count = models.IntegerField( + null=True, + verbose_name=_('Progress count'), + help_text=_('The number of values for the progress bar.') + ) class Meta: ordering = ('tree_id', 'level', 'title') @@ -86,36 +94,6 @@ def clean(self): 'parent': [_('A project may not be moved to be a child of itself or one of its descendants.')] }) - @property - def progress(self): - # create a queryset for the attributes of the catalog for this project - # the subquery is used to query only attributes which have a question in the catalog, which is not optional - questions = Question.objects.filter_by_catalog(self.catalog) \ - .filter(attribute_id=OuterRef('pk')).exclude(is_optional=True) - attributes = Attribute.objects.annotate(active=Exists(questions)).filter(active=True).distinct() - - # query the total number of attributes from the qs above - total = attributes.count() - - # query all current values with attributes from the qs above, but where the text, option, or file field is set, - # and count only one value per attribute - values = self.values.filter(snapshot=None) \ - .filter(attribute__in=attributes) \ - .exclude((models.Q(text='') | models.Q(text=None)) & models.Q(option=None) & - (models.Q(file='') | models.Q(file=None))) \ - .distinct().values('attribute').count() - - try: - ratio = values / total - except ZeroDivisionError: - ratio = 0 - - return { - 'total': total, - 'values': values, - 'ratio': ratio - } - @property def catalog_uri(self): if self.catalog is not None: diff --git a/rdmo/projects/models/value.py b/rdmo/projects/models/value.py index 39fec66834..11c09af10a 100644 --- a/rdmo/projects/models/value.py +++ b/rdmo/projects/models/value.py @@ -117,6 +117,10 @@ def as_dict(self): 'collection_index': self.collection_index, 'value_type': self.value_type, 'unit': self.unit, + 'text': self.text, + 'option_uri': self.option_uri, + 'option_text': self.option_text, + 'option_additional_input': self.option_additional_input, 'external_id': self.external_id, 'value': self.value, 'value_and_unit': self.value_and_unit, @@ -139,7 +143,7 @@ def as_dict(self): @property def value(self): if self.option: - value = self.option.text or '' + value = self.option.view_text or self.option.text or '' if self.option.additional_input and self.text: value += ': ' + self.text return value @@ -161,18 +165,14 @@ def value(self): else: return self.text else: - return None + return '' @property def value_and_unit(self): - value = self.value - - if value is None: - return '' - elif self.unit: - return f'{value} {self.unit}' + if self.unit: + return f'{self.value} {self.unit}' else: - return value + return self.value @property def is_true(self): @@ -254,6 +254,16 @@ def option_uri(self): if self.option is not None: return self.option.uri + @property + def option_text(self): + if self.option is not None: + return self.option.text + + @property + def option_additional_input(self): + if self.option is not None: + return self.option.additional_input + def copy_file(self, file_name, file_content): # copies a file field from a different value over to this value # this is tricky, because we need to trick django_cleanup to not delete the original file diff --git a/rdmo/projects/permissions.py b/rdmo/projects/permissions.py index c549b02e49..9fa7be5ffb 100644 --- a/rdmo/projects/permissions.py +++ b/rdmo/projects/permissions.py @@ -1,4 +1,4 @@ -from rdmo.core.permissions import HasObjectPermission, log_result +from rdmo.core.permissions import HasModelPermission, HasObjectPermission, log_result class HasProjectsPermission(HasObjectPermission): @@ -8,11 +8,21 @@ def has_permission(self, request, view): if not (request.user and request.user.is_authenticated): return False - # always return True: - # for retrieve, update, partial_update, the permission will be checked on the - # object level (in the next step), list and create is allowed for every user since - # the filtering is done in the queryset - return True + if view.detail: + # for retrieve, update, partial_update, the permission will be checked on the + # object level (in the next step) + return True + + if view.action == 'list': + # list is allowed for every user since the filtering is done in the queryset + return True + + if 'create' in view.action_map.values(): + # for create, check the permission (from rules.py), + # but only if it is not a ReadOnlyValueSet (i.e. only for ProjectViewSet) + return super().has_permission(request, view) + else: + return True @log_result def has_object_permission(self, request, view, obj): @@ -62,3 +72,21 @@ class HasProjectPagePermission(HasProjectPermission): def get_required_object_permissions(self, method, model_cls): return ('projects.view_page_object', ) + + +class HasProjectProgressModelPermission(HasModelPermission): + + def get_required_permissions(self, method, model_cls): + if method == 'POST': + return ('projects.change_project', ) + else: + return ('projects.view_project', ) + + +class HasProjectProgressObjectPermission(HasProjectPermission): + + def get_required_object_permissions(self, method, model_cls): + if method == 'POST': + return ('projects.change_project_progress_object', ) + else: + return ('projects.view_project_object', ) diff --git a/rdmo/projects/progress.py b/rdmo/projects/progress.py new file mode 100644 index 0000000000..ef082fa507 --- /dev/null +++ b/rdmo/projects/progress.py @@ -0,0 +1,148 @@ +from collections import defaultdict + +from django.db.models import Exists, OuterRef, Q + +from rdmo.conditions.models import Condition +from rdmo.questions.models import Page, Question, QuestionSet + + +def resolve_conditions(project, values): + # get all conditions for this catalog + pages_conditions_subquery = Page.objects.filter_by_catalog(project.catalog) \ + .filter(conditions=OuterRef('pk')) + questionsets_conditions_subquery = QuestionSet.objects.filter_by_catalog(project.catalog) \ + .filter(conditions=OuterRef('pk')) + questions_conditions_subquery = Question.objects.filter_by_catalog(project.catalog) \ + .filter(conditions=OuterRef('pk')) + + catalog_conditions = Condition.objects.annotate(has_page=Exists(pages_conditions_subquery)) \ + .annotate(has_questionset=Exists(questionsets_conditions_subquery)) \ + .annotate(has_question=Exists(questions_conditions_subquery)) \ + .filter(Q(has_page=True) | Q(has_questionset=True) | Q(has_question=True)) \ + .distinct().select_related('source', 'target_option') + + # evaluate conditions + conditions = set() + for condition in catalog_conditions: + if condition.resolve(values): + conditions.add(condition.id) + + # return all true conditions for this project + return conditions + + +def compute_navigation(section, project, snapshot=None): + # get all values for this project and snapshot + values = project.values.filter(snapshot=snapshot).select_related('attribute', 'option') + + # get true conditions + conditions = resolve_conditions(project, values) + + # compute sets from values (including empty values) + sets = defaultdict(lambda: defaultdict(list)) + for attribute, set_prefix, set_index in values.distinct_list(): + sets[attribute][set_prefix].append(set_index) + + # query distinct, non empty set values + values_list = values.exclude_empty().distinct_list() + + navigation = [] + for catalog_section in project.catalog.elements: + navigation_section = { + 'id': catalog_section.id, + 'uri': catalog_section.uri, + 'title': catalog_section.title, + 'first': catalog_section.elements[0].id if section.elements else None + } + if catalog_section.id == section.id: + navigation_section['pages'] = [] + for page in catalog_section.elements: + pages_conditions = {page.id for page in page.conditions.all()} + show = bool(not pages_conditions or pages_conditions.intersection(conditions)) + + # count the total number of questions, taking sets and conditions into account + counts = count_questions(page, sets, conditions) + + # filter the values_list for the attributes, and compute the total sum of counts + count = len(tuple(filter(lambda value: value[0] in counts.keys(), values_list))) + total = sum(counts.values()) + + navigation_section['pages'].append({ + 'id': page.id, + 'uri': page.uri, + 'title': page.title, + 'show': show, + 'count': count, + 'total': total + }) + + navigation.append(navigation_section) + + return navigation + + +def compute_progress(project, snapshot=None): + # get all values for this project and snapshot + values = project.values.filter(snapshot=snapshot).select_related('attribute', 'option') + + # get true conditions + conditions = resolve_conditions(project, values) + + # compute sets from values (including empty values) + sets = defaultdict(lambda: defaultdict(list)) + for attribute, set_prefix, set_index in values.distinct_list(): + sets[attribute][set_prefix].append(set_index) + + # query distinct, non empty set values + values_list = values.exclude_empty().distinct_list() + + + # count the total number of questions, taking sets and conditions into account + counts = count_questions(project.catalog, sets, conditions) + + # filter the values_list for the attributes, and compute the total sum of counts + count = len(tuple(filter(lambda value: value[0] in counts.keys(), values_list))) + total = sum(counts.values()) + + return count, total + + +def count_questions(element, sets, conditions): + counts = defaultdict(int) + + # obtain the maximum number of set-distinct values the questions in this element + # this number is how often each question is displayed and we will use this number + # to determine how often a question needs to be counted + if isinstance(element, (Page, QuestionSet)) and element.is_collection: + set_count = 0 + + if element.attribute is not None: + child_count = sum(len(set_indexes) for set_indexes in sets[element.attribute.id].values()) + set_count = max(set_count, child_count) + + for child in element.elements: + if isinstance(child, Question): + child_count = sum(len(set_indexes) for set_indexes in sets[child.attribute.id].values()) + set_count = max(set_count, child_count) + else: + set_count = 1 + + # loop over all children of this element + for child in element.elements: + # look for the elements conditions + if isinstance(child, (Page, QuestionSet, Question)): + child_conditions = {condition.id for condition in child.conditions.all()} + else: + child_conditions = [] + + if not child_conditions or child_conditions.intersection(conditions): + if isinstance(child, Question): + # for questions add the set_count to the counts dict + # use the max function, since the same attribute could apear twice in the tree + if child.attribute is not None: + counts[child.attribute.id] = max(counts[child.attribute.id], set_count) + else: + # for everthing else, call this function recursively + counts.update(count_questions(child, sets, conditions)) + + return counts diff --git a/rdmo/projects/providers.py b/rdmo/projects/providers.py index a891ffc8ee..267706bfc7 100644 --- a/rdmo/projects/providers.py +++ b/rdmo/projects/providers.py @@ -1,6 +1,4 @@ -import hmac import json -from urllib.parse import quote from django.core.exceptions import ObjectDoesNotExist from django.http import Http404, HttpResponse, HttpResponseRedirect @@ -8,7 +6,7 @@ from django.utils.translation import gettext_lazy as _ from rdmo.core.plugins import Plugin -from rdmo.services.providers import GitHubProviderMixin, GitLabProviderMixin, OauthProviderMixin +from rdmo.services.providers import OauthProviderMixin class IssueProvider(Plugin): @@ -16,7 +14,7 @@ class IssueProvider(Plugin): def send_issue(self, request, issue, integration, subject, message, attachments): raise NotImplementedError - def webhook(self, request, options, payload): + def webhook(self, request, integration): raise NotImplementedError @@ -32,22 +30,18 @@ def send_issue(self, request, issue, integration, subject, message, attachments) if url is None or data is None: return render(request, 'core/error.html', { 'title': _('Integration error'), - 'errors': [_('The Integration is not configured correctly.') % message] + 'errors': [_('The Integration is not configured correctly.')] }, status=200) return self.post(request, url, data) - def post_success(self, request, response): + def update_issue(self, request, remote_url): from rdmo.projects.models import Integration, Issue, IssueResource - # get the upstream url of the issue - remote_url = self.get_issue_url(response) - # get the issue_id and integration_id from the session issue_id = self.pop_from_session(request, 'issue_id') integration_id = self.pop_from_session(request, 'integration_id') - # update the issue in rdmo try: issue = Issue.objects.get(pk=issue_id) issue.status = Issue.ISSUE_STATUS_IN_PROGRESS @@ -60,6 +54,13 @@ def post_success(self, request, response): except ObjectDoesNotExist: pass + def post_success(self, request, response): + # get the upstream url of the issue + remote_url = self.get_issue_url(response) + + # update the issue in rdmo + self.update_issue(request, remote_url) + return HttpResponseRedirect(remote_url) def get_post_url(self, request, issue, integration, subject, message, attachments): @@ -72,165 +73,59 @@ def get_issue_url(self, response): raise NotImplementedError -class GitHubIssueProvider(GitHubProviderMixin, OauthIssueProvider): - add_label = _('Add GitHub integration') - send_label = _('Send to GitHub') - description = _('This integration allow the creation of issues in arbitrary GitHub repositories. ' - 'The upload of attachments is not supported by GitHub.') - - def get_repo(self, integration): - try: - return integration.options.get(key='repo').value - except ObjectDoesNotExist: - return None - - def get_secret(self, integration): - try: - return integration.options.get(key='secret').value - except ObjectDoesNotExist: - return None - - def get_post_url(self, request, issue, integration, subject, message, attachments): - repo = self.get_repo(integration) - if repo: - return f'https://api.github.com/repos/{repo}/issues' - - def get_post_data(self, request, issue, integration, subject, message, attachments): - return { - 'title': subject, - 'body': message - } - - def get_issue_url(self, response): - return response.json().get('html_url') - - def webhook(self, request, integration): - secret = self.get_secret(integration) - header_signature = request.headers.get('X-Hub-Signature') +class SimpleIssueProvider(OauthIssueProvider): - if (secret is not None) and (header_signature is not None): - body_signature = 'sha1=' + hmac.new(secret.encode(), request.body, 'sha1').hexdigest() - - if hmac.compare_digest(header_signature, body_signature): - try: - payload = json.loads(request.body.decode()) - action = payload.get('action') - issue_url = payload.get('issue', {}).get('html_url') - - if action and issue_url: - try: - issue_resource = integration.resources.get(url=issue_url) - if action == 'closed': - issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_CLOSED - else: - issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_IN_PROGRESS - - issue_resource.issue.save() - except ObjectDoesNotExist: - pass - - return HttpResponse(status=200) - - except json.decoder.JSONDecodeError as e: - return HttpResponse(e, status=400) - - raise Http404 + add_label = _('Add Simple integration') + send_label = _('Send to Simple') + description = _('This integration allow the creation of issues in arbitrary Simple repositories. ' + 'The upload of attachments is not supported.') @property def fields(self): return [ { - 'key': 'repo', - 'placeholder': 'user_name/repo_name', - 'help': _('The GitHub repository to send issues to.') + 'key': 'project_url', + 'placeholder': 'https://example.com/projects/<name>', + 'help': _('The URL of the project to send tasks to.') }, { 'key': 'secret', 'placeholder': 'Secret (random) string', - 'help': _('The secret for a GitHub webhook to close a task.'), + 'help': _('The secret for a webhook to close a task (optional).'), 'required': False, 'secret': True } ] + def get(self, request, url): + raise NotImplementedError -class GitLabIssueProvider(GitLabProviderMixin, OauthIssueProvider): - add_label = _('Add GitLab integration') - send_label = _('Send to GitLab') - - @property - def description(self): - return _(f'This integration allow the creation of issues in arbitrary repositories on {self.gitlab_url}. ' - 'The upload of attachments is not supported by GitLab.') - - def get_repo(self, integration): - try: - return integration.options.get(key='repo').value - except ObjectDoesNotExist: - return None - - def get_secret(self, integration): - try: - return integration.options.get(key='secret').value - except ObjectDoesNotExist: - return None - - def get_post_url(self, request, issue, integration, subject, message, attachments): - repo = self.get_repo(integration) - if repo: - return '{}/api/v4/projects/{}/issues'.format(self.gitlab_url, quote(repo, safe='')) - - def get_post_data(self, request, issue, integration, subject, message, attachments): - return { - 'title': subject, - 'description': message - } - - def get_issue_url(self, response): - return response.json().get('web_url') + def post(self, request, url, json=None, files=None, multipart=None): + raise NotImplementedError def webhook(self, request, integration): - secret = self.get_secret(integration) - header_token = request.headers.get('X-Gitlab-Token') - - if (secret is not None) and (header_token is not None) and (header_token == secret): + secret = integration.get_option_value('secret') + header_signature = request.headers.get('X-Secret') + if secret == header_signature: try: payload = json.loads(request.body.decode()) - state = payload.get('object_attributes', {}).get('state') - issue_url = payload.get('object_attributes', {}).get('url') + except json.decoder.JSONDecodeError as e: + return HttpResponse(e, status=400) - if state and issue_url: - try: - issue_resource = integration.resources.get(url=issue_url) - if state == 'closed': - issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_CLOSED - else: - issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_IN_PROGRESS + action = payload.get('action') + url = payload.get('url') - issue_resource.issue.save() - except ObjectDoesNotExist: - pass + try: + issue_resource = integration.resources.get(url=url) + if action == 'closed': + issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_CLOSED + else: + issue_resource.issue.status = issue_resource.issue.ISSUE_STATUS_IN_PROGRESS - return HttpResponse(status=200) + issue_resource.issue.save() + except ObjectDoesNotExist: + pass - except json.decoder.JSONDecodeError as e: - return HttpResponse(e, status=400) + return HttpResponse(status=200) raise Http404 - - @property - def fields(self): - return [ - { - 'key': 'repo', - 'placeholder': 'user_name/repo_name', - 'help': _('The GitLab repository to send issues to.') - }, - { - 'key': 'secret', - 'placeholder': 'Secret (random) string', - 'help': _('The secret for a GitLab webhook to close a task.'), - 'required': False, - 'secret': True - } - ] diff --git a/rdmo/projects/rules.py b/rdmo/projects/rules.py index 93a2fec87e..fbab7c065f 100644 --- a/rdmo/projects/rules.py +++ b/rdmo/projects/rules.py @@ -1,9 +1,21 @@ +from django.conf import settings from django.contrib.sites.shortcuts import get_current_site import rules from rules.predicates import is_superuser +@rules.predicate +def can_add_project(user): + if not settings.PROJECT_CREATE_RESTRICTED: + return True + + if settings.PROJECT_CREATE_GROUPS: + return user.groups.filter(name__in=settings.PROJECT_CREATE_GROUPS).exists() + else: + return False + + @rules.predicate def is_project_member(user, project): return user in project.member or (project.parent and is_project_member(user, project.parent)) @@ -54,9 +66,10 @@ def is_site_manager_for_current_site(user, request): # Add rule for check in template rules.add_rule('projects.can_view_all_projects', is_site_manager_for_current_site | is_superuser) - +rules.add_perm('projects.add_project', can_add_project) rules.add_perm('projects.view_project_object', is_project_member | is_site_manager) rules.add_perm('projects.change_project_object', is_project_manager | is_project_owner | is_site_manager) +rules.add_perm('projects.change_project_progress_object', is_project_author | is_project_manager | is_project_owner | is_site_manager) # noqa: E501 rules.add_perm('projects.delete_project_object', is_project_owner | is_site_manager) rules.add_perm('projects.leave_project_object', is_current_project_member) rules.add_perm('projects.export_project_object', is_project_owner | is_project_manager | is_site_manager) diff --git a/rdmo/projects/serializers/v1/__init__.py b/rdmo/projects/serializers/v1/__init__.py index 7e65e7cb9f..86b3039391 100644 --- a/rdmo/projects/serializers/v1/__init__.py +++ b/rdmo/projects/serializers/v1/__init__.py @@ -8,7 +8,7 @@ from rdmo.services.validators import ProviderValidator from ...models import Integration, IntegrationOption, Invite, Issue, IssueResource, Membership, Project, Snapshot, Value -from ...validators import ValueValidator +from ...validators import ValueConflictValidator, ValueQuotaValidator class UserSerializer(serializers.ModelSerializer): @@ -67,7 +67,9 @@ class Meta: 'created', 'updated', 'site', - 'views' + 'views', + 'progress_total', + 'progress_count' ) read_only_fields = ( 'snapshots', @@ -259,7 +261,10 @@ class Meta: 'unit', 'external_id' ) - validators = (ValueValidator(), ) + validators = ( + ValueConflictValidator(), + ValueQuotaValidator() + ) class MembershipSerializer(serializers.ModelSerializer): diff --git a/rdmo/projects/serializers/v1/overview.py b/rdmo/projects/serializers/v1/overview.py index a0428b9836..cc5cfdf3e2 100644 --- a/rdmo/projects/serializers/v1/overview.py +++ b/rdmo/projects/serializers/v1/overview.py @@ -1,51 +1,18 @@ from rest_framework import serializers from rdmo.projects.models import Project -from rdmo.questions.models import Catalog, Page, Section - - -class PageSerializer(serializers.ModelSerializer): - - class Meta: - model = Page - fields = ( - 'id', - 'title', - 'has_conditions' - ) - - -class SectionSerializer(serializers.ModelSerializer): - - pages = serializers.SerializerMethodField() - - class Meta: - model = Section - fields = ( - 'id', - 'title', - 'pages' - ) - - def get_pages(self, obj): - return PageSerializer(obj.elements, many=True, read_only=True).data +from rdmo.questions.models import Catalog class CatalogSerializer(serializers.ModelSerializer): - sections = serializers.SerializerMethodField() - class Meta: model = Catalog fields = ( 'id', - 'title', - 'sections' + 'title' ) - def get_sections(self, obj): - return SectionSerializer(obj.elements, many=True, read_only=True).data - class ProjectOverviewSerializer(serializers.ModelSerializer): diff --git a/rdmo/projects/serializers/v1/page.py b/rdmo/projects/serializers/v1/page.py index 49fe49fd03..be2060815c 100644 --- a/rdmo/projects/serializers/v1/page.py +++ b/rdmo/projects/serializers/v1/page.py @@ -16,6 +16,8 @@ class Meta: fields = ( 'id', 'text', + 'help', + 'text_and_help', 'additional_input' ) @@ -58,7 +60,6 @@ class QuestionSerializer(ElementModelSerializerMixin, MarkdownSerializerMixin, s optionsets = serializers.SerializerMethodField() verbose_name = serializers.SerializerMethodField() - verbose_name_plural = serializers.SerializerMethodField() widget_class = serializers.SerializerMethodField() class Meta: @@ -72,7 +73,6 @@ class Meta: 'default_option', 'default_external_id', 'verbose_name', - 'verbose_name_plural', 'widget_type', 'widget_class', 'value_type', @@ -94,10 +94,7 @@ def get_optionsets(self, obj): return OptionSetSerializer(ordered_optionsets, many=True).data def get_verbose_name(self, obj): - return obj.verbose_name or _('item') - - def get_verbose_name_plural(self, obj): - return obj.verbose_name_plural or _('items') + return obj.verbose_name or _('entry') def get_widget_class(self, obj): return get_widget_class(obj.widget_type) @@ -110,7 +107,6 @@ class QuestionSetSerializer(ElementModelSerializerMixin, MarkdownSerializerMixin model = serializers.SerializerMethodField() elements = serializers.SerializerMethodField() verbose_name = serializers.SerializerMethodField() - verbose_name_plural = serializers.SerializerMethodField() class Meta: model = QuestionSet @@ -120,7 +116,6 @@ class Meta: 'title', 'help', 'verbose_name', - 'verbose_name_plural', 'attribute', 'is_collection', 'elements', @@ -135,10 +130,7 @@ def get_elements(self, obj): yield QuestionSerializer(element, context=self.context).data def get_verbose_name(self, obj): - return obj.verbose_name or _('set') - - def get_verbose_name_plural(self, obj): - return obj.verbose_name_plural or _('sets') + return obj.verbose_name or _('block') class PageSerializer(MarkdownSerializerMixin, serializers.ModelSerializer): @@ -150,7 +142,6 @@ class PageSerializer(MarkdownSerializerMixin, serializers.ModelSerializer): prev_page = serializers.SerializerMethodField() next_page = serializers.SerializerMethodField() verbose_name = serializers.SerializerMethodField() - verbose_name_plural = serializers.SerializerMethodField() class Meta: model = Page @@ -159,7 +150,6 @@ class Meta: 'title', 'help', 'verbose_name', - 'verbose_name_plural', 'attribute', 'is_collection', 'elements', @@ -181,6 +171,7 @@ def get_section(self, obj): return { 'id': section.id, 'title': section.title, + 'first': section.elements[0].id if section.elements else None } if section else {} def get_prev_page(self, obj): @@ -193,6 +184,3 @@ def get_next_page(self, obj): def get_verbose_name(self, obj): return obj.verbose_name or _('set') - - def get_verbose_name_plural(self, obj): - return obj.verbose_name_plural or _('sets') diff --git a/rdmo/projects/static/projects/css/project_questions.scss b/rdmo/projects/static/projects/css/project_questions.scss index 9f1a92f117..df5adbb647 100644 --- a/rdmo/projects/static/projects/css/project_questions.scss +++ b/rdmo/projects/static/projects/css/project_questions.scss @@ -195,6 +195,16 @@ margin: 0; } + .radio-control, + .checkbox-control { + label { + width: 100%; + } + .yesno label { + width: auto; + } + } + .file-control { display: block; width: 100%; @@ -302,3 +312,9 @@ .project-progress { margin-bottom: 10px; } +.project-progress-count { + position: absolute; + left: 0; + right: 0; + text-align: center; +} diff --git a/rdmo/projects/static/projects/js/project_questions/controllers.js b/rdmo/projects/static/projects/js/project_questions/controllers.js index 2c9503efaf..0b0729ea0c 100644 --- a/rdmo/projects/static/projects/js/project_questions/controllers.js +++ b/rdmo/projects/static/projects/js/project_questions/controllers.js @@ -5,7 +5,7 @@ angular.module('project_questions') $scope.service = QuestionsService; $scope.checkCheckbox = function(event) { - var checkbox = angular.element('input[type="checkbox"]', angular.element(event.target).parent())[0]; + var checkbox = angular.element('input[type="checkbox"]', angular.element(event.target).parent().parent())[0]; if (checkbox.checked !== true) { checkbox.click(); } diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index efa8e4ea9d..ad427a3061 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -9,7 +9,7 @@ angular.module('project_questions') /* configure resources */ var resources = { - projects: $resource(baseurl + 'api/v1/projects/projects/:id/:detail_action/'), + projects: $resource(baseurl + 'api/v1/projects/projects/:id/:detail_action/:detail_id/'), values: $resource(baseurl + 'api/v1/projects/projects/:project/values/:id/:detail_action/'), pages: $resource(baseurl + 'api/v1/projects/projects/:project/pages/:list_action/:id/'), settings: $resource(baseurl + 'api/v1/core/settings/') @@ -147,13 +147,14 @@ angular.module('project_questions') } return service.fetchPage(page_id) + .then(service.fetchNavigation) .then(service.fetchOptions) .then(service.fetchValues) .then(service.fetchConditions) .then(function () { // copy future objects angular.forEach([ - 'page', 'progress', 'attributes', 'questionsets', 'questions', 'valuesets', 'values' + 'page', 'progress', 'attributes', 'questionsets', 'questions', 'valuesets', 'values', 'navigation' ], function (key) { service[key] = angular.copy(future[key]); }); @@ -276,6 +277,16 @@ angular.module('project_questions') }); }; + service.fetchNavigation = function() { + future.navigation = resources.projects.query({ + id: service.project.id, + detail_id: future.page.section.id, + detail_action: 'navigation' + }); + + return future.navigation.$promise + }; + service.initPage = function(page) { // store attributes in a separate array if (page.attribute !== null) future.attributes.push(page.attribute); @@ -634,7 +645,7 @@ angular.module('project_questions') if (question.widget_class === 'autocomplete') { if (angular.isArray(question.options)) { question.options_fuse = new Fuse(question.options, { - keys: ['text'] + keys: ['text_and_help'] }); } @@ -643,8 +654,8 @@ angular.module('project_questions') angular.forEach(question.options, function(option) { if (value.autocomplete_locked === false && option.id === value.option) { value.autocomplete_locked = true; - value.autocomplete_input = option.text; - value.autocomplete_text = option.text; + value.autocomplete_input = option.text_and_help; + value.autocomplete_text = option.text_and_help; } }); } else if (value.text) { @@ -706,6 +717,9 @@ angular.module('project_questions') }; service.storeValue = function(value, question, set_prefix, set_index, collection_index) { + // reset value errors + value.errors = [] + if (angular.isDefined(value.removed) && value.removed) { // remove additional_input from unselected checkboxes value.additional_input = {}; @@ -760,7 +774,7 @@ angular.module('project_questions') // loop over options angular.forEach(question.options, function(option) { if (option.has_provider && value.selected === option.id) { - value.text = option.text; + value.text = option.text_and_help; value.external_id = option.id; } else if (value.selected === option.id.toString()) { // get text from additional_input for the selected option @@ -826,10 +840,16 @@ angular.module('project_questions') }, function (response) { if (response.status == 500) { service.error = response; + } else if (response.status == 400) { + service.error = true; + value.errors = Object.keys(response.data); + } else if (response.status == 404) { + service.error = true; + value.errors = ['not_found'] } }) } -}; + }; service.storeValues = function() { var promises = []; @@ -852,7 +872,7 @@ angular.module('project_questions') service.prev = function() { service.error = null; // reset error when moving to previous questionset if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { back = true; service.initView(service.page.prev_page); }) @@ -865,7 +885,7 @@ angular.module('project_questions') service.next = function() { service.error = null; // reset error when moving to next questionset if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { service.initView(service.page.next_page); }) } else { @@ -876,22 +896,13 @@ angular.module('project_questions') service.jump = function(section, page) { service.error = null; // reset error before saving if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { if (service.error !== null) { // pass, dont jump } else if (angular.isDefined(page)) { service.initView(page.id); } else if (angular.isDefined(section)) { - if (angular.isDefined(section.pages)) { - service.initView(section.pages[0].id); - } else { - // jump to first page of the section in breadcrumb - // let section_from_service = service.project.catalog.sections.find(x => x.id === section.id) - var section_from_service = $filter('filter')(service.project.catalog.sections, { - id: section.id - })[0] - service.initView(section_from_service.pages[0].id); - } + service.initView(section.first); } else { service.initView(null); } @@ -900,23 +911,14 @@ angular.module('project_questions') if (angular.isDefined(page)) { service.initView(page.id); } else if (angular.isDefined(section)) { - if (angular.isDefined(section.pages)) { - service.initView(section.pages[0].id); - } else { - // jump to first page of the section in breadcrumb - // let section_from_service = service.project.catalog.sections.find(x => x.id === section.id) - var section_from_service = $filter('filter')(service.project.catalog.sections, { - id: section.id - })[0] - service.initView(section_from_service.pages[0].id); - } + service.initView(section.first); } else { service.initView(null); } } }; - service.save = function(proceed) { + service.save = function(proceed, jump) { service.error = null; // reset error return service.storeValues().then(function() { if (service.error !== null) { @@ -941,34 +943,45 @@ angular.module('project_questions') } } } else { - console.log('next'); service.next(); } } else { // update progress - resources.projects.get({ - id: service.project.id, - detail_action: 'progress' - }, function(response) { - if (service.progress.values != response.values) { + if (service.project.read_only !== true) { + resources.projects.postAction({ + id: service.project.id, + detail_action: 'progress' + }, function(response) { service.progress = response - } - }); + }); + } - // check if we need to refresh the site - angular.forEach([service.page].concat(service.questionsets), function(questionset) { - angular.forEach(questionset.elements, function(element) { - if (element.model == 'questions.question') { - var question = element; - angular.forEach(question.optionsets, function(optionset) { - if (optionset.has_refresh) { - return service.initView(service.page.id); - } - }); - } + // update navigation + if (service.project.read_only !== true) { + resources.projects.query({ + id: service.project.id, + detail_id: future.page.section.id, + detail_action: 'navigation' + }, function(response) { + service.navigation = response }); - }); + } + // check if we need to refresh the site + if (angular.isUndefined(jump) || !jump) { + angular.forEach([service.page].concat(service.questionsets), function(questionset) { + angular.forEach(questionset.elements, function(element) { + if (element.model == 'questions.question') { + var question = element; + angular.forEach(question.optionsets, function(optionset) { + if (optionset.has_refresh) { + return service.initView(service.page.id); + } + }); + } + }); + }); + } // re-evaluate conditions angular.forEach([service.page].concat(service.questionsets), function(questionset) { angular.forEach(service.valuesets[questionset.id], function(valuesets, set_prefix) { @@ -1058,11 +1071,19 @@ angular.module('project_questions') service.values[attribute][set_prefix][set_index][collection_index].autocomplete_text = ''; service.values[attribute][set_prefix][set_index][collection_index].autocomplete_locked = false; service.values[attribute][set_prefix][set_index][collection_index].changed = true; + + if (service.settings.project_questions_autosave) { + service.save(false); + } }; service.removeValue = function(attribute, set_prefix, set_index, collection_index) { service.values[attribute][set_prefix][set_index][collection_index].removed = true; service.values[attribute][set_prefix][set_index][collection_index].changed = true; + + if (service.settings.project_questions_autosave) { + service.save(false); + } }; service.openValueSetFormModal = function(questionset, set_prefix, set_index) { @@ -1372,12 +1393,22 @@ angular.module('project_questions') // unset the searching flag value.searching = false; + + // activate the first item + if (question.widget_type == 'autocomplete' && angular.isDefined(value.items[0])) { + value.items[0].active = true; + } }); } } else { // if no search was performed, do the searching on the client value.autocomplete_search = false; value.items = question.options_fuse.search(value.autocomplete_input); + + // activate the first item + if (question.widget_type == 'autocomplete' && angular.isDefined(value.items[0])) { + value.items[0].active = true; + } } } else { value.items = []; @@ -1417,11 +1448,22 @@ angular.module('project_questions') } if (angular.isDefined(next)) { next.active = true; - value.autocomplete_input = next.text; + value.autocomplete_input = next.text_and_help; } } else if ($event.code == 'Enter' || $event.code == 'NumpadEnter') { - if (angular.isDefined(active)) { + if (value.autocomplete_input == '') { + service.resetAutocomplete(value); + } else if (angular.isDefined(active)) { service.selectAutocomplete(value, value.items[active]); + } else if (question.widget_type == 'freeautocomplete') { + var matchingOptions = $filter('filter')(value.items, function(item) { + return item.text.toLowerCase() == value.autocomplete_input.toLowerCase(); + }) + if (matchingOptions.length > 0) { + service.selectAutocomplete(value, matchingOptions[0]); + } else { + service.selectAutocomplete(value, null); + } } } else if ($event.code == 'Escape') { if (value.selected === '') { @@ -1437,24 +1479,59 @@ angular.module('project_questions') // called when the user clicks on an option of the autocomplete field service.selectAutocomplete = function(value, option) { value.autocomplete_locked = true; - value.selected = option.id.toString(); - value.autocomplete_text = option.text; + + if (option === null) { + // store the text value (for the free autocomplete) + value.text = value.autocomplete_input; + value.selected = ''; + value.autocomplete_text = value.text; + } else { + // store the option + value.text = ''; + value.selected = option.id.toString(); + value.autocomplete_text = option.text; + value.autocomplete_input = option.text; + } service.changed(value, true); } // called when the user clicks outside the autocomplete field - service.blurAutocomplete = function(value) { - if (value.selected === '') { - value.autocomplete_input = ''; - value.autocomplete_text = ''; - value.items = null; + service.blurAutocomplete = function(question, value) { + if (question.widget_type == 'freeautocomplete') { + if (value.autocomplete_input == '') { + service.resetAutocomplete(value); + } else { + var matchingOptions = $filter('filter')(value.items, function(item) { + return item.text.toLowerCase() == value.autocomplete_input.toLowerCase(); + }) + if (matchingOptions.length > 0) { + service.selectAutocomplete(value, matchingOptions[0]); + } else { + service.selectAutocomplete(value, null); + } + } } else { - value.autocomplete_locked = true; - value.autocomplete_input = value.autocomplete_text; + if (value.selected === '') { + service.resetAutocomplete(value); + } else { + value.autocomplete_locked = true; + value.autocomplete_input = value.autocomplete_text; + } } } + // called when an empty string is entered in the autocomplete field + service.resetAutocomplete = function(value) { + value.text = ''; + value.selected = ''; + value.autocomplete_input = ''; + value.autocomplete_text = ''; + value.items = null; + + service.changed(value, true); + } + // called when the user clicks in the autocomplete field service.unlockAutocomplete = function(question, value, set_prefix, set_index, index) { value.autocomplete_locked = false; diff --git a/rdmo/projects/templates/projects/issue_send_integrations.html b/rdmo/projects/templates/projects/issue_send_integrations.html index ac7d5e8137..92a43b97c7 100644 --- a/rdmo/projects/templates/projects/issue_send_integrations.html +++ b/rdmo/projects/templates/projects/issue_send_integrations.html @@ -18,7 +18,7 @@ <h2>{% trans 'Send via integration' %}</h2> <td> {% for option in integration.options.all %} {% if not option.secret %} - <p>{{ option.key.title }}: {{ option.value }}</p> + <p>{{ option.title }}: {{ option.value }}</p> {% endif %} {% endfor %} diff --git a/rdmo/projects/templates/projects/project_detail_header_hierarchy.html b/rdmo/projects/templates/projects/project_detail_header_hierarchy.html index 33d6f62a3f..c7004fc525 100644 --- a/rdmo/projects/templates/projects/project_detail_header_hierarchy.html +++ b/rdmo/projects/templates/projects/project_detail_header_hierarchy.html @@ -19,13 +19,13 @@ {% if can_view_parent_project %} <a href="{% url 'project' node.id %}"> {% if node.id == project.id %} - <strong>{{ node.title }}</strong> + <strong>{{ node.title }}</strong> {% project_progress_text node %} {% else %} - {{ node.title }} + {{ node.title }} {% project_progress_text node %} {% endif %} </a> {% else %} - {{ node.title }} + {{ node.title }} {% project_progress_text node %} {% endif %} </li> {% endfor %} diff --git a/rdmo/projects/templates/projects/project_detail_integrations.html b/rdmo/projects/templates/projects/project_detail_integrations.html index a48d2ce852..08e5f34ad7 100644 --- a/rdmo/projects/templates/projects/project_detail_integrations.html +++ b/rdmo/projects/templates/projects/project_detail_integrations.html @@ -32,7 +32,7 @@ <h2>{% trans 'Integrations' %}</h2> <td> {% for option in integration.options.all %} {% if not option.secret %} - {{ option.key.title }}: {{ option.value }}<br /> + {{ option.title }}: {{ option.value }}<br /> {% endif %} {% endfor %} diff --git a/rdmo/projects/templates/projects/project_detail_views.html b/rdmo/projects/templates/projects/project_detail_views.html index 593aa57c2a..e3cda0f3fa 100644 --- a/rdmo/projects/templates/projects/project_detail_views.html +++ b/rdmo/projects/templates/projects/project_detail_views.html @@ -12,7 +12,7 @@ <h2>{% trans 'Views' %}</h2> {% include 'projects/project_detail_views_help.html' %} - {% if project.views.exists %} + {% if views %} <table class="table"> <thead> @@ -27,7 +27,7 @@ <h2>{% trans 'Views' %}</h2> </th> </thead> <tbody> - {% for view in project.views.all %} + {% for view in views %} <tr> <td> <a href="{% url 'project_view' project.pk view.pk %}">{{ view.title }}</a> diff --git a/rdmo/projects/templates/projects/project_questions_add_field_button.html b/rdmo/projects/templates/projects/project_questions_add_field_button.html index a4675c4351..40d89855b6 100644 --- a/rdmo/projects/templates/projects/project_questions_add_field_button.html +++ b/rdmo/projects/templates/projects/project_questions_add_field_button.html @@ -3,6 +3,6 @@ <div class="add-field-button" ng-hide="service.project.read_only"> <button type="button" class="btn btn-success" ng-click="service.addValue(question, valueset.set_prefix, valueset.set_index)"> - {% blocktrans with name='{$ question.verbose_name $}' %}Add {{ name }}{% endblocktrans %} + <i class="fa fa-plus fa-btn"></i> {$ question.verbose_name|capitalize $} </button> </div> diff --git a/rdmo/projects/templates/projects/project_questions_add_field_help.html b/rdmo/projects/templates/projects/project_questions_add_field_help.html index 98f7c9e21a..345c258226 100644 --- a/rdmo/projects/templates/projects/project_questions_add_field_help.html +++ b/rdmo/projects/templates/projects/project_questions_add_field_help.html @@ -1,7 +1,7 @@ {% load i18n %} <p class="help-block"> - {% blocktrans with name_plural='{$ question.verbose_name_plural $}' trimmed %} - Please enter the {{ name_plural }} line by line. You can add {{ name_plural }} using the green button and remove them using the blue cross (×). + {% blocktrans trimmed %} + Please enter your entries line by line. You can add lines using the green button and remove them using the blue cross (×). {% endblocktrans %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_add_set_button.html b/rdmo/projects/templates/projects/project_questions_add_set_button.html index 6841dd0c47..3df20d77bb 100644 --- a/rdmo/projects/templates/projects/project_questions_add_set_button.html +++ b/rdmo/projects/templates/projects/project_questions_add_set_button.html @@ -3,6 +3,6 @@ <div class="add-set-button" ng-hide="service.project.read_only"> <button type="button" class="btn btn-success" ng-click="service.addValueSet(questionset, service.joinSetPrefix(valueset.set_prefix, valueset.set_index))"> - {% blocktrans with name='{$ question.verbose_name $}' %}Add {{ name }}{% endblocktrans %} + <i class="fa fa-plus fa-btn"></i> {$ question.verbose_name|capitalize $} </button> </div> diff --git a/rdmo/projects/templates/projects/project_questions_add_set_help.html b/rdmo/projects/templates/projects/project_questions_add_set_help.html index 314f367f2e..b7de24781e 100644 --- a/rdmo/projects/templates/projects/project_questions_add_set_help.html +++ b/rdmo/projects/templates/projects/project_questions_add_set_help.html @@ -1,7 +1,7 @@ {% load i18n %} <p class="help-block"> - {% blocktrans with name_plural='{$ question.verbose_name_plural $}' trimmed %} - Please enter the {{ name_plural }} block by block. You can add {{ name_plural }} using the green button and remove them using the blue cross (×). + {% blocktrans trimmed %} + Please enter your entries block by block. You can add blocks using the green button and remove them using the blue cross (×). {% endblocktrans %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_element.html b/rdmo/projects/templates/projects/project_questions_element.html index 0e28e8e8d0..cc1de9476e 100644 --- a/rdmo/projects/templates/projects/project_questions_element.html +++ b/rdmo/projects/templates/projects/project_questions_element.html @@ -28,10 +28,8 @@ <div class="question col-md-{$ question.width || 12 $}" ng-show="element.isQuestion" ng-init="question = element"> <div ng-hide="valueset.hidden.questions[question.id]"> - {% for widget in widgets %} - {% if widget.template_name %} - {% include widget.template_name %} - {% endif %} + {% for template_name in widgets %} + {% include template_name %} {% endfor %} </div> </div> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html b/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html index e35e795114..abb9760f23 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html @@ -1,6 +1,6 @@ {% load i18n %} - <div class="form-group" ng-if="question.widget_type === 'autocomplete'"> + <div class="form-group" ng-if="question.widget_type === 'autocomplete' || question.widget_type === 'freeautocomplete'"> {% include 'projects/project_questions_question_label.html' %} {% include 'projects/project_questions_question_help.html' %} {% include 'projects/project_questions_question_warning.html' %} @@ -30,7 +30,7 @@ ng-focus="service.filterAutocomplete(question, value)" ng-change="service.filterAutocomplete(question, value);" ng-keydown="service.keydownAutocomplete(question, value, $event)" - ng-blur="service.blurAutocomplete(value)" + ng-blur="service.blurAutocomplete(question, value)" ng-class="{'default-value': service.isDefaultValue(question, value)}" placeholder="{% trans 'Please type and select.' %}"/> @@ -38,12 +38,14 @@ <li ng-repeat="option in value.items" ng-class="{'active': option.active}" ng-mousedown="service.selectAutocomplete(value, option)"> - {$ option.text $} + {$ option.text_and_help $} </li> </ul> </div> </div> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_checkbox.html b/rdmo/projects/templates/projects/project_questions_form_group_checkbox.html index 48ed47be19..506b794398 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_checkbox.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_checkbox.html @@ -16,14 +16,36 @@ ng-change="service.changed(service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index], true)" /> <span>{$ option.text $}</span><span ng-show="option.additional_input">:</span> + <span class="text-muted" ng-show="option.help" ng-hide="option.additional_input"> +  {$ option.help $} + </span> - <input class="form-control input-sm" type="text" - ng-show="option.additional_input" - ng-model="service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index].additional_input[option.id]" - ng-focus="checkCheckbox($event)" - ng-disabled="service.project.read_only" - ng-change="service.changed(service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index])" /> + <span ng-show="option.additional_input == 'text'"> +   + <input class="form-control input-sm" type="text" + ng-model="service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index].additional_input[option.id]" + ng-focus="checkCheckbox($event)" + ng-disabled="service.project.read_only" + ng-change="service.changed(service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index])" /> + <span class="text-muted" ng-show="option.help"> +  {$ option.help $} + </span> + </span> + + <div ng-show="option.additional_input == 'textarea'"> + <textarea class="form-control input-sm" rows="4" + ng-model="service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index].additional_input[option.id]" + ng-focus="checkCheckbox($event)" + ng-disabled="service.project.read_only" + ng-change="service.changed(service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index])" /> + <div class="text-muted"> + {$ option.help $} + </div> + </div> </label> + <div ng-init="value = service.values[question.attribute][valueset.set_prefix][valueset.set_index][$index]"> + {% include 'projects/project_questions_value_errors.html' %} + </div> </div> </div> </div> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_date.html b/rdmo/projects/templates/projects/project_questions_form_group_date.html index 8994983bd5..36e60cf423 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_date.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_date.html @@ -24,6 +24,8 @@ ng-change="service.changed(value, true)" ng-class="{'default-value': service.isDefaultValue(question, value)}"/> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_file.html b/rdmo/projects/templates/projects/project_questions_form_group_file.html index 4ddf98dc31..ee0db7fad5 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_file.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_file.html @@ -33,6 +33,8 @@ </ul> </label> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_radio.html b/rdmo/projects/templates/projects/project_questions_form_group_radio.html index d1e8f462f6..c774d37a7f 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_radio.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_radio.html @@ -28,13 +28,33 @@ option.id.toString() == value.selected}"/> <span>{$ option.text $}</span><span ng-show="option.additional_input">:</span> + <span class="text-muted" ng-show="option.help" ng-hide="option.additional_input"> +  {$ option.help $} + </span> - <input class="form-control input-sm" type="text" - ng-show="option.additional_input" - ng-model="value.additional_input[option.id]" - ng-change="value.selected = option.id.toString(); service.changed(value, true)" - ng-focus="value.selected = option.id.toString()" - ng-disabled="service.project.read_only" /> + <span ng-show="option.additional_input == 'text'"> +   + <input class="form-control input-sm" type="text" + ng-model="value.additional_input[option.id]" + ng-change="value.selected = option.id.toString(); service.changed(value)" + ng-focus="value.selected = option.id.toString()" + ng-disabled="service.project.read_only" /> + <span class="text-muted" ng-show="option.help"> +  {$ option.help $} + </span> + </span> + + <div ng-show="option.additional_input == 'textarea'"> + <textarea class="form-control input-sm" rows="4" + ng-show="option.additional_input == 'textarea'" + ng-model="value.additional_input[option.id]" + ng-change="value.selected = option.id.toString(); service.changed(value)" + ng-focus="value.selected = option.id.toString()" + ng-disabled="service.project.read_only" /> + <div class="text-muted"> + {$ option.help $} + </div> + </div> </label> </div> @@ -43,6 +63,8 @@ </div> </div> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_range.html b/rdmo/projects/templates/projects/project_questions_form_group_range.html index 384f413d59..39fb0552d5 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_range.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_range.html @@ -31,6 +31,8 @@ ng-class="{'default-value': service.isDefaultValue(question, value)}"/> </div> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_select.html b/rdmo/projects/templates/projects/project_questions_form_group_select.html index d672b98981..7580a6bb7e 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_select.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_select.html @@ -24,10 +24,12 @@ ng-class="{'default-value': service.isDefaultValue(question, value)}"> <option value="">--- {% trans 'Please select' %} ---</option> <option ng-repeat="option in question.options" ng-hide="valueset.hidden.optionsets[option.optionset]" value="{$ option.id $}"> - {$ option.text $} + {$ option.text_and_help $} </option> </select> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_text.html b/rdmo/projects/templates/projects/project_questions_form_group_text.html index d9284bdf56..e3fad422ec 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_text.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_text.html @@ -21,6 +21,8 @@ ng-disabled="service.project.read_only" ng-change="service.changed(value)" ng-class="{'default-value': service.isDefaultValue(question, value)}"> + + {% include 'projects/project_questions_value_errors.html' %} </div> </div> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_textarea.html b/rdmo/projects/templates/projects/project_questions_form_group_textarea.html index 756e21c96e..26baee92a1 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_textarea.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_textarea.html @@ -23,6 +23,8 @@ ng-class="{'default-value': service.isDefaultValue(question, value)}"> </textarea> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_form_group_yesno.html b/rdmo/projects/templates/projects/project_questions_form_group_yesno.html index c06ce86618..31dda7fb79 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_yesno.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_yesno.html @@ -41,6 +41,8 @@ </div> </div> </div> + + {% include 'projects/project_questions_value_errors.html' %} </div> <div ng-if="question.is_collection"> diff --git a/rdmo/projects/templates/projects/project_questions_modal_delete_valuesets.html b/rdmo/projects/templates/projects/project_questions_modal_delete_valuesets.html index ab5d265f90..fedc31002f 100644 --- a/rdmo/projects/templates/projects/project_questions_modal_delete_valuesets.html +++ b/rdmo/projects/templates/projects/project_questions_modal_delete_valuesets.html @@ -13,21 +13,15 @@ <h2 class="modal-title"> </div> <div class="modal-body"> - <p ng-show="service.values[service.page.attribute.id_attribute.id][0].text"> - {% blocktrans trimmed with name='{$ service.page.verbose_name $}' object='{$ service.values[service.page.attribute.id_attribute.id][0].text $}' %} - You are about to permanently delete the {{ name }} <strong>{{ object }}</strong>. - {% endblocktrans %} - </p> - <p ng-hide="service.values[service.page.attribute.id_attribute.id][0].text"> - {% blocktrans trimmed with name='{$ service.page.verbose_name $}' %} - You are about to permanently delete this {{ name }}. + {% blocktrans trimmed %} + You are about to permanently delete this tab. {% endblocktrans %} </p> <p> - {% blocktrans trimmed with name='{$ service.page.verbose_name $}' %} - This includes all given answers for this {{ name }} on all pages, not just this one. + {% blocktrans trimmed %} + This includes all given answers for this tab on all pages, not just this one. {% endblocktrans %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_modal_form_valuesets.html b/rdmo/projects/templates/projects/project_questions_modal_form_valuesets.html index 7121b779ab..3ca3b1f694 100644 --- a/rdmo/projects/templates/projects/project_questions_modal_form_valuesets.html +++ b/rdmo/projects/templates/projects/project_questions_modal_form_valuesets.html @@ -16,8 +16,8 @@ <h2 class="modal-title"> <formgroup data-id="modal-title-input" data-type="text" - data-label="{% trans 'Title' %}" - data-help="{% blocktrans with name='{$ service.page.verbose_name $}' %}Please give the {{ name }} a meaningful name.{% endblocktrans %}" + data-label="{% trans 'Name' %}" + data-help="{% trans 'Please give the tab a meaningful name.' %}" data-model="service.modal_values.text" data-errors="service.modal_errors.text"> </formgroup> diff --git a/rdmo/projects/templates/projects/project_questions_navigation.html b/rdmo/projects/templates/projects/project_questions_navigation.html index f5945d8db2..ba5f062f12 100644 --- a/rdmo/projects/templates/projects/project_questions_navigation.html +++ b/rdmo/projects/templates/projects/project_questions_navigation.html @@ -3,22 +3,27 @@ {% include 'projects/project_questions_navigation_help.html' %} <ul class="list-unstyled project-questions-overview"> - <li ng-repeat="section in service.project.catalog.sections"> + <li ng-repeat="section in service.navigation"> <a href="" ng-click="service.jump(section)"> {$ section.title $} </a> <ul class="list-unstyled" - ng-show="section.id == service.page.section.id"> + ng-show="section.pages"> <li ng-repeat="page in section.pages" ng-class="{'active': page.id == service.page.id}"> - <a href="" ng-click="service.jump(section, page)"> + + <a href="" ng-click="service.jump(section, page)" ng-show="page.show"> <span>{$ page.title $}<span> - <span ng-show="page.has_conditions" class="small"> - <i class="fa fa-question-circle-o small" aria-hidden="true"></i> + <span ng-show="page.count > 0 && page.count == page.total"> + <i class="fa fa-check" aria-hidden="true"></i> </span> + <span ng-show="page.count > 0 && page.count != page.total"> + ({$ page.count $} of {$ page.total $}) + <span> </a> + <span class="text-muted" ng-hide="page.show">{$ page.title $}<span> </li> </ul> </li> diff --git a/rdmo/projects/templates/projects/project_questions_navigation_help.html b/rdmo/projects/templates/projects/project_questions_navigation_help.html index 73e58ea1a8..60abef29bf 100644 --- a/rdmo/projects/templates/projects/project_questions_navigation_help.html +++ b/rdmo/projects/templates/projects/project_questions_navigation_help.html @@ -12,6 +12,6 @@ <p class="help-block"> {% blocktrans trimmed %} -Entries with <i class="fa fa-question-circle-o small" aria-hidden="true"></i> might be skipped based on your input. +Grey entries will be conditionally skipped based on your input. {% endblocktrans %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_overview.html b/rdmo/projects/templates/projects/project_questions_overview.html index 1ee6ea347b..6058e465a5 100644 --- a/rdmo/projects/templates/projects/project_questions_overview.html +++ b/rdmo/projects/templates/projects/project_questions_overview.html @@ -10,6 +10,9 @@ </ul> <ul class="list-unstyled"> + <li> + <a href="#" onclick="window.location.reload();">{% trans 'Reload page' %}</a> + </li> <li> <a href="{% url 'projects' %}">{% trans 'Back to my projects' %}</a> </li> diff --git a/rdmo/projects/templates/projects/project_questions_progress.html b/rdmo/projects/templates/projects/project_questions_progress.html index 9b66e61bb9..b66e5d4a62 100644 --- a/rdmo/projects/templates/projects/project_questions_progress.html +++ b/rdmo/projects/templates/projects/project_questions_progress.html @@ -1,10 +1,15 @@ {% load i18n %} +<div class="project-progress-count" ng-show="service.progress.ratio <= 0.25"> +{% blocktrans trimmed with count='{$ service.progress.count $}' total='{$ service.progress.total $}' %} + {{ count }} of {{ total }} +{% endblocktrans %} +</div> <div class="progress project-progress"> <div class="progress-bar" role="progressbar" style="width: {$ service.progress.ratio * 100 $}%;"> <span ng-show="service.progress.ratio > 0.25"> - {% blocktrans trimmed with values='{$ service.progress.values $}' total='{$ service.progress.total $}' %} - {{ values }} of {{ total }} + {% blocktrans trimmed with count='{$ service.progress.count $}' total='{$ service.progress.total $}' %} + {{ count }} of {{ total }} {% endblocktrans %} </span> </div> diff --git a/rdmo/projects/templates/projects/project_questions_questionset_head.html b/rdmo/projects/templates/projects/project_questions_questionset_head.html index 3c0362f183..d1e019ac3e 100644 --- a/rdmo/projects/templates/projects/project_questions_questionset_head.html +++ b/rdmo/projects/templates/projects/project_questions_questionset_head.html @@ -8,7 +8,7 @@ <div class="set-buttons" ng-show="service.set_index === null"> <button type="button" class="btn btn-success" ng-click="service.openValueSetFormModal(service.page, service.set_prefix)"> - {% blocktrans with name='{$ service.page.verbose_name $}' %}Add {{ name }}{% endblocktrans %} + <i class="fa fa-plus fa-btn"></i> {$ service.page.verbose_name|capitalize $} </button> </div> </div> @@ -24,19 +24,17 @@ </li> <li ng-hide="service.project.read_only"> <a href="" class="add-valueset" ng-click="service.openValueSetFormModal(service.page, service.set_prefix)"> - {% blocktrans with name='{$ service.page.verbose_name $}' %}Add {{ name }}{% endblocktrans %} + <i class="fa fa-plus fa-btn"></i> {$ service.page.verbose_name|capitalize $} </a> </li> </ul> <div class="pull-right" ng-hide="service.set_index === null"> - <a href="" class="fa fa-pencil" - title="{% blocktrans with name='{$ service.page.verbose_name $}' %}Update {{ name }}{% endblocktrans %}" + <a href="" class="fa fa-pencil" title="{% trans 'Edit tab' %}" ng-click="service.openValueSetFormModal(service.page, service.set_prefix, service.set_index)" ng-show="service.page.attribute && !service.project.read_only"> </a> - <a href="" class="fa fa-trash" - title="{% blocktrans with name='{$ service.page.verbose_name $}' %}Remove {{ name }}{% endblocktrans %}" + <a href="" class="fa fa-trash" title="{% trans 'Remove tab' %}" ng-click="service.openValueSetDeleteModal(service.page, service.set_prefix, service.set_index)" ng-show="!service.project.read_only"> </a> diff --git a/rdmo/projects/templates/projects/project_questions_questionset_head_help.html b/rdmo/projects/templates/projects/project_questions_questionset_head_help.html index a8f87307a0..00aac3ba6f 100644 --- a/rdmo/projects/templates/projects/project_questions_questionset_head_help.html +++ b/rdmo/projects/templates/projects/project_questions_questionset_head_help.html @@ -1,7 +1,7 @@ {% load i18n %} <p class="help-block"> - {% blocktrans with name='{$ service.page.verbose_name $}' name_plural='{$ service.page.verbose_name_plural $}' trimmed %} - Please fill in the form for each {{ name }}. The different {{ name_plural }} will be referred to in following questions. You can add a new {{ name }} using the green button. Once created, you can edit or delete {{ name_plural }} using the buttons in the top right corner. + {% blocktrans trimmed %} + Please fill in the form for each tab. The same tabs may be used later on other pages. You can add a new tab using the green button. Once created, you can edit or delete tabs using the buttons in the top right corner. {% endblocktrans %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_remove_field.html b/rdmo/projects/templates/projects/project_questions_remove_field.html index 75ec006bfb..f8aa9d099a 100644 --- a/rdmo/projects/templates/projects/project_questions_remove_field.html +++ b/rdmo/projects/templates/projects/project_questions_remove_field.html @@ -1,7 +1,6 @@ {% load i18n %} - <a href="" class="close" tabindex="-1" - title="{% blocktrans with name='{$ question.verbose_name $}' %}Remove {{ name }}{% endblocktrans %}" + <a href="" class="close" tabindex="-1" title="{% trans 'Remove entry' %}" ng-click="service.removeValue(question.attribute, valueset.set_prefix, valueset.set_index, $index)" ng-show="(question.is_collection || service.visibleValues(question.attribute, valueset.set_prefix, valueset.set_index).length > 1) && !service.project.read_only"> diff --git a/rdmo/projects/templates/projects/project_questions_remove_set.html b/rdmo/projects/templates/projects/project_questions_remove_set.html index a35765c940..0e514aa355 100644 --- a/rdmo/projects/templates/projects/project_questions_remove_set.html +++ b/rdmo/projects/templates/projects/project_questions_remove_set.html @@ -1,7 +1,6 @@ {% load i18n %} - <a href="" class="close remove-set" tabindex="-1" - title="{% blocktrans with name='{$ questionset.verbose_name $}' %}Remove {{ name }}{% endblocktrans %}" + <a href="" class="close remove-set" tabindex="-1" title="{% trans 'Remove block' %}" ng-click="service.openValueSetDeleteModal(questionset, valueset.set_prefix, valueset.set_index)" ng-hide="!questionset.is_collection || service.project.read_only"> diff --git a/rdmo/projects/templates/projects/project_questions_save_error.html b/rdmo/projects/templates/projects/project_questions_save_error.html index a3d6d90cba..e3a5aba785 100644 --- a/rdmo/projects/templates/projects/project_questions_save_error.html +++ b/rdmo/projects/templates/projects/project_questions_save_error.html @@ -1,7 +1,7 @@ {% load i18n %} {% load core_tags %} - <div class="text-danger" ng-show="service.error"> + <div class="text-danger" ng-show="service.error.statusText && service.error.status"> <p> {% trans 'An error occurred while saving the answer. Please contact support if this problem persists.' %} </p> diff --git a/rdmo/projects/templates/projects/project_questions_value_errors.html b/rdmo/projects/templates/projects/project_questions_value_errors.html new file mode 100644 index 0000000000..d8245287ad --- /dev/null +++ b/rdmo/projects/templates/projects/project_questions_value_errors.html @@ -0,0 +1,21 @@ +{% load i18n %} + + <ul class="help-block list-unstyled" ng-if="value.errors.length > 0"> + <li class="text-danger" ng-repeat="error in value.errors"> + <span ng-show="error == 'conflict'"> + {% blocktrans trimmed %} + This field could not be saved, since somebody else did so while you were editing. + You will need to reload the page to make changes, but your input will be overwritten. + {% endblocktrans %} + </span> + <span ng-show="error == 'not_found'"> + {% blocktrans trimmed %} + This field could not be saved, since somebody else removed it while you were editing. + You will need to reload the page to proceed, but your input will be lost. + {% endblocktrans %} + </span> + <span ng-show="error == 'quota'"> + {% trans 'You reached the file quota for this project.' %} + </span> + </li> + </ul> diff --git a/rdmo/projects/templates/projects/projects.html b/rdmo/projects/templates/projects/projects.html index 0edfaace36..e8b718a720 100644 --- a/rdmo/projects/templates/projects/projects.html +++ b/rdmo/projects/templates/projects/projects.html @@ -22,8 +22,13 @@ {% endblock %} {% block sidebar %} + {% has_perm 'projects.add_project' request.user as can_add_project %} + {% test_rule 'projects.can_view_all_projects' request.user request as can_view_all_projects %} + + {% if can_add_project or can_view_all_projects %} <h2>{% trans 'Options' %}</h2> + {% if can_add_project %} <ul class="list-unstyled"> <li> <strong> @@ -33,8 +38,8 @@ <h2>{% trans 'Options' %}</h2> </strong> </li> </ul> + {% endif %} - {% test_rule 'projects.can_view_all_projects' request.user request as can_view_all_projects %} {% if can_view_all_projects %} <ul class="list-unstyled"> <li> @@ -44,6 +49,7 @@ <h2>{% trans 'Options' %}</h2> </li> </ul> {% endif %} + {% endif %} <h2>{% trans 'Filter projects' %}</h2> @@ -62,6 +68,8 @@ <h2>{% trans 'Filter projects' %}</h2> </p> </form> + {% if can_add_project %} + <h2>{% trans 'Import existing project' %}</h2> <ul class="list-unstyled"> @@ -91,6 +99,8 @@ <h2>{% trans 'Import existing project' %}</h2> {% endif %} </ul> + {% endif %} + {% if invites %} <h2>{% trans 'Pending invitations' %}</h2> @@ -123,7 +133,8 @@ <h1>{% trans 'My Projects' %}</h1> <table class="table projects-table" id="projects-table"> <thead> <tr> - <th style="width: 60%;">{% trans 'Name' %}</th> + <th style="width: 50%;">{% trans 'Name' %}</th> + <th style="width: 10%;">{% trans 'Progress' %}</th> <th style="width: 10%;">{% trans 'Role' %}</th> <th style="width: 23%;">{% trans 'Last changed' %}</th> <th style="width: 7%;"></th> @@ -138,6 +149,9 @@ <h1>{% trans 'My Projects' %}</h1> <strong>{{ project.title }}</strong> </a> </td> + <td> + {% project_progress project %} + </td> <td> {{ project.role|projects_role }} </td> diff --git a/rdmo/projects/templates/projects/site_projects.html b/rdmo/projects/templates/projects/site_projects.html index f2a8f49c23..73e0909abd 100644 --- a/rdmo/projects/templates/projects/site_projects.html +++ b/rdmo/projects/templates/projects/site_projects.html @@ -61,10 +61,11 @@ <h1>{% blocktrans trimmed with site=request.site %}All projects on {{ site }}{% <table class="table projects-table"> <thead> <tr> - <th style="width: 50%;">{% trans 'Name' %}</th> + <th style="width: 40%;">{% trans 'Name' %}</th> + <th style="width: 10%;">{% trans 'Progress' %}</th> <th style="width: 20%;">{% trans 'Created' %}</th> - <th style="width: 20%;">{% trans 'Last changed' %}</th> - <th style="width: 10%;"></th> + <th style="width: 23%;">{% trans 'Last changed' %}</th> + <th style="width: 7%;"></th> </tr> </thead> <tbody> @@ -76,6 +77,9 @@ <h1>{% blocktrans trimmed with site=request.site %}All projects on {{ site }}{% <strong>{{ project.title }}</strong> </a> </td> + <td> + {% project_progress project %} + </td> <td> {{ project.created }} </td> diff --git a/rdmo/projects/templatetags/projects_tags.py b/rdmo/projects/templatetags/projects_tags.py index 390a79e4f8..7b64ab9b44 100644 --- a/rdmo/projects/templatetags/projects_tags.py +++ b/rdmo/projects/templatetags/projects_tags.py @@ -1,6 +1,7 @@ from django import template from django.template.defaultfilters import stringfilter from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ from ..models import Membership @@ -11,13 +12,45 @@ def projects_indent(level): string = '' if level > 0: - for _ in range(level - 1): + for i in range(level - 1): string += '  ' string += '• ' return mark_safe('<span class="projects-indent">' + string + '</span>') +@register.simple_tag() +def project_progress(project): + if project.progress_count is None or project.progress_total is None: + return '' + + return _('%(count)s of %(total)s') % { + 'count': project.progress_count, + 'total': project.progress_total + } + +@register.simple_tag() +def project_progress_ratio(project): + if project.progress_count is None or project.progress_total is None: + return '' + + try: + ratio = project.progress_count / project.progress_total + except ZeroDivisionError: + ratio = 0 + + return f'{ratio:.0%}' + + +@register.simple_tag() +def project_progress_text(project): + progress = project_progress(project) + if progress: + return _('(%(progress)s progress)') % {'progress': progress} + else: + return '' + + @register.filter() @stringfilter def projects_role(role): diff --git a/rdmo/projects/tests/test_navigation.py b/rdmo/projects/tests/test_navigation.py new file mode 100644 index 0000000000..7f7a9c90b3 --- /dev/null +++ b/rdmo/projects/tests/test_navigation.py @@ -0,0 +1,67 @@ +import pytest + +from rdmo.projects.models import Project +from rdmo.projects.progress import compute_navigation + +sections = ( + 'http://example.com/terms/questions/catalog/individual', + 'http://example.com/terms/questions/catalog/collections', + 'http://example.com/terms/questions/catalog/set', + 'http://example.com/terms/questions/catalog/conditions', + 'http://example.com/terms/questions/catalog/blocks' +) + +# (count, total, show) for each page or section (as default fallback) +result_map = { + 'http://example.com/terms/questions/catalog/individual': (1, 1, True), + 'http://example.com/terms/questions/catalog/individual/autocomplete': (0, 1, True), + 'http://example.com/terms/questions/catalog/collections': (1, 1, True), + 'http://example.com/terms/questions/catalog/collections/autocomplete': (0, 1, True), + 'http://example.com/terms/questions/catalog/set/individual-single': (8, 9, True), + 'http://example.com/terms/questions/catalog/set/individual-collection': (9, 10, True), + 'http://example.com/terms/questions/catalog/set/collection-single': (14, 18, True), + 'http://example.com/terms/questions/catalog/set/collection-collection': (16, 20, True), + 'http://example.com/terms/questions/catalog/conditions/input': (2, 2, True), + 'http://example.com/terms/questions/catalog/conditions/text_contains': (1, 1, True), + 'http://example.com/terms/questions/catalog/conditions/text_empty': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/text_equal': (1, 1, True), + 'http://example.com/terms/questions/catalog/conditions/text_greater_than': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/text_greater_than_equal': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/text_lesser_than': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/text_lesser_than_equal': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/text_not_empty': (1, 1, True), + 'http://example.com/terms/questions/catalog/conditions/text_not_equal': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/option_empty': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/option_equal': (1, 1, True), + 'http://example.com/terms/questions/catalog/conditions/option_not_empty': (1, 1, True), + 'http://example.com/terms/questions/catalog/conditions/option_not_equal': (1, 1, False), + 'http://example.com/terms/questions/catalog/conditions/set': (0, 2, True), + 'http://example.com/terms/questions/catalog/conditions/set_set': (0, 2, True), + 'http://example.com/terms/questions/catalog/conditions/optionset': (0, 2, True), + 'http://example.com/terms/questions/catalog/conditions/text_set': (0, 2, True), + 'http://example.com/terms/questions/catalog/blocks/set': (9, 18, True), +} + + +@pytest.mark.parametrize('section_uri', sections) +def test_compute_navigation(db, section_uri): + project = Project.objects.get(id=1) + project.catalog.prefetch_elements() + + section = project.catalog.sections.get(uri=section_uri) + + navigation = compute_navigation(section, project) + assert [item['id'] for item in navigation] == [element.id for element in project.catalog.elements] + + for section in navigation: + if 'pages' in section: + for page in section['pages']: + if page['uri'] in result_map: + count, total, show = result_map[page['uri']] + elif section['uri'] in result_map: + count, total, show = result_map[section['uri']] + else: + raise AssertionError('{uri} not in result_map'.format(**page)) + assert page['count'] == count, page['uri'] + assert page['total'] == total, page['uri'] + assert page['show'] == show, page['uri'] diff --git a/rdmo/projects/tests/test_progress.py b/rdmo/projects/tests/test_progress.py new file mode 100644 index 0000000000..58782ca807 --- /dev/null +++ b/rdmo/projects/tests/test_progress.py @@ -0,0 +1,21 @@ +import pytest + +from rdmo.projects.models import Project +from rdmo.projects.progress import compute_progress + +projects = [1, 11] + +results_map = { + 1: (58, 87), + 11: (0, 29) +} + + +@pytest.mark.parametrize('project_id', projects) +def test_compute_progress(db, project_id): + project = Project.objects.get(id=project_id) + project.catalog.prefetch_elements() + + progress = compute_progress(project) + + assert progress == results_map[project_id] diff --git a/rdmo/projects/tests/test_validator_conflict.py b/rdmo/projects/tests/test_validator_conflict.py new file mode 100644 index 0000000000..e48191c6ce --- /dev/null +++ b/rdmo/projects/tests/test_validator_conflict.py @@ -0,0 +1,123 @@ +from datetime import timedelta + +import pytest + +from rest_framework.exceptions import ValidationError as RestFameworkValidationError + +from ..models import Project, Value +from ..serializers.v1 import ValueSerializer +from ..validators import ValueConflictValidator + +project_id = 1 +attribute_path = attribute__path='individual/single/text' + + +def test_serializer_create(db): + class MockedView: + project = Project.objects.get(id=project_id) + + value = Value.objects.get(project_id=project_id, snapshot=None, attribute__path=attribute_path) + + validator = ValueConflictValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + validator({ + 'attribute': value.attribute, + 'set_prefix': value.set_prefix, + 'set_index': value.set_index, + 'collection_index': value.collection_index + 1, + }, serializer) + + +def test_serializer_create_error(db): + class MockedView: + project = Project.objects.get(id=project_id) + + value = Value.objects.get(project_id=project_id, snapshot=None, attribute__path=attribute_path) + + validator = ValueConflictValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + with pytest.raises(RestFameworkValidationError): + validator({ + 'attribute': value.attribute, + 'set_prefix': value.set_prefix, + 'set_index': value.set_index, + 'collection_index': value.collection_index, + }, serializer) + + +def test_serializer_update(db): + value = Value.objects.get(project_id=project_id, snapshot=None, attribute__path=attribute_path) + + class MockedRequest: + data = { + 'updated': value.updated .isoformat() + } + + class MockedView: + request = MockedRequest() + project = Project.objects.get(id=project_id) + + validator = ValueConflictValidator() + serializer = ValueSerializer() + serializer.instance = value + serializer.context['view'] = MockedView() + + validator({ + 'attribute': value.attribute, + 'set_prefix': value.set_prefix, + 'set_index': value.set_index, + 'collection_index': value.collection_index, + }, serializer) + + +def test_serializer_update_error(db): + value = Value.objects.get(project_id=project_id, snapshot=None, attribute__path=attribute_path) + + class MockedRequest: + data = { + 'updated': (value.updated - timedelta(seconds=1)).isoformat() + } + + class MockedView: + request = MockedRequest() + project = Project.objects.get(id=project_id) + + validator = ValueConflictValidator() + serializer = ValueSerializer() + serializer.instance = value + serializer.context['view'] = MockedView() + + with pytest.raises(RestFameworkValidationError): + validator({ + 'attribute': value.attribute, + 'set_prefix': value.set_prefix, + 'set_index': value.set_index, + 'collection_index': value.collection_index, + }, serializer) + + +def test_serializer_update_missing_updated(db): + value = Value.objects.get(project_id=project_id, snapshot=None, attribute__path=attribute_path) + + class MockedRequest: + data = {} + + class MockedView: + request = MockedRequest() + project = Project.objects.get(id=project_id) + + validator = ValueConflictValidator() + serializer = ValueSerializer() + serializer.instance = value + serializer.context['view'] = MockedView() + + validator({ + 'attribute': value.attribute, + 'set_prefix': value.set_prefix, + 'set_index': value.set_index, + 'collection_index': value.collection_index, + }, serializer) diff --git a/rdmo/projects/tests/test_validator_quota.py b/rdmo/projects/tests/test_validator_quota.py new file mode 100644 index 0000000000..4eee080e26 --- /dev/null +++ b/rdmo/projects/tests/test_validator_quota.py @@ -0,0 +1,86 @@ +import pytest + +from rest_framework.exceptions import ValidationError as RestFameworkValidationError + +from ..serializers.v1 import ValueSerializer +from ..validators import ValueQuotaValidator + +project_id = 1 +attribute_path = attribute__path='individual/single/text' + + +def test_serializer_create_file(db, settings): + class MockedProject: + file_size = 1 + + class MockedView: + action = 'create' + project = MockedProject() + + settings.PROJECT_FILE_QUOTA = '1b' + + validator = ValueQuotaValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + validator({ + 'value_type': 'file' + }, serializer) + + +def test_serializer_create_file_error(db, settings): + class MockedProject: + file_size = 1 + + class MockedView: + action = 'create' + project = MockedProject() + + settings.PROJECT_FILE_QUOTA = '0' + + validator = ValueQuotaValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + with pytest.raises(RestFameworkValidationError): + validator({ + 'value_type': 'file' + }, serializer) + + +def test_serializer_create_text(db, settings): + class MockedProject: + file_size = 1 + + class MockedView: + action = 'create' + project = MockedProject() + + settings.PROJECT_FILE_QUOTA = '0' + + validator = ValueQuotaValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + validator({ + 'value_type': 'text' + }, serializer) + + +def test_serializer_update(db, settings): + class MockedProject: + file_size = 1 + + class MockedView: + action = 'update' + project = MockedProject() + + settings.PROJECT_FILE_QUOTA = '0' + + validator = ValueQuotaValidator() + serializer = ValueSerializer() + serializer.context['view'] = MockedView() + + validator({ + 'value_type': 'file' + }, serializer) diff --git a/rdmo/projects/tests/test_value.py b/rdmo/projects/tests/test_value.py new file mode 100644 index 0000000000..3815291e93 --- /dev/null +++ b/rdmo/projects/tests/test_value.py @@ -0,0 +1,74 @@ +import datetime + +from ..models import Value + + +def mocked_trans(self, field): + return self.text_lang1 + + +def test_value_text(db): + value = Value.objects.get(id=1) + assert value.value == value.text + assert value.value_and_unit == value.text + assert value.option_text is None + assert value.option_additional_input is None + + +def test_value_textarea(db): + value = Value.objects.get(id=2) + assert value.value == value.text + assert value.value_and_unit == value.text + assert value.option_text is None + assert value.option_additional_input is None + + +def test_value_bool(db): + value = Value.objects.get(id=3) + assert value.value == 'Yes' + assert value.value_and_unit == 'Yes' + assert value.option_text is None + assert value.option_additional_input is None + + +def test_value_radio(db, mocker): + mocker.patch('rdmo.options.models.Option.trans', mocked_trans) + + value = Value.objects.get(id=4) + assert value.value == 'Text: Lorem ipsum' + assert value.value_and_unit == 'Text: Lorem ipsum' + assert value.option_text == 'Text' + assert value.option_additional_input == 'text' + + +def test_value_select(db, mocker): + value = Value.objects.get(id=5) + mocker.patch('rdmo.options.models.Option.trans', mocked_trans) + assert value.value == 'One' + assert value.value_and_unit == 'One' + assert value.option_text == 'One' + assert value.option_additional_input == '' + + +def test_value_range(db): + value = Value.objects.get(id=6) + assert value.value == value.text + assert value.value_and_unit == value.text + assert value.option_text is None + assert value.option_additional_input is None + + +def test_value_datetime(db): + value = Value.objects.get(id=7) + assert value.value == datetime.date(2018, 1, 1) + assert value.value_and_unit == datetime.date(2018, 1, 1) + assert value.option_text is None + assert value.option_additional_input is None + + +def test_value_file(db): + value = Value.objects.get(id=238) + assert value.value == 'rdmo-logo.svg' + assert value.value_and_unit == 'rdmo-logo.svg' + assert value.option_text is None + assert value.option_additional_input is None diff --git a/rdmo/projects/tests/test_view_integration.py b/rdmo/projects/tests/test_view_integration.py index fe626862c0..cb20690f8d 100644 --- a/rdmo/projects/tests/test_view_integration.py +++ b/rdmo/projects/tests/test_view_integration.py @@ -1,6 +1,3 @@ -import hmac -import json - import pytest from django.urls import reverse @@ -42,7 +39,7 @@ def test_integration_create_get(db, client, username, password, project_id): client.login(username=username, password=password) - url = reverse('integration_create', args=[project_id, 'github']) + url = reverse('integration_create', args=[project_id, 'simple']) response = client.get(url) if project_id in add_integration_permission_map.get(username, []): @@ -58,9 +55,9 @@ def test_integration_create_get(db, client, username, password, project_id): def test_integration_create_post(db, client, username, password, project_id): client.login(username=username, password=password) - url = reverse('integration_create', args=[project_id, 'github']) + url = reverse('integration_create', args=[project_id, 'simple']) data = { - 'repo': 'example/example1' + 'project_url': 'https://example.com/projects/1' } response = client.post(url, data) @@ -69,8 +66,8 @@ def test_integration_create_post(db, client, username, password, project_id): values = Integration.objects.order_by('id').last().options.values('key', 'value', 'secret') assert sorted(values, key=lambda obj: obj['key']) == [ { - 'key': 'repo', - 'value': 'example/example1', + 'key': 'project_url', + 'value': 'https://example.com/projects/1', 'secret': False }, { @@ -115,7 +112,7 @@ def test_integration_update_post(db, client, username, password, project_id, int url = reverse('integration_update', args=[project_id, integration_id]) data = { - 'repo': 'example/example2', + 'project_url': 'https://example.com/projects/2', 'secret': 'super_secret' } response = client.post(url, data) @@ -127,8 +124,8 @@ def test_integration_update_post(db, client, username, password, project_id, int .options.values('key', 'value', 'secret') assert sorted(values, key=lambda obj: obj['key']) == [ { - 'key': 'repo', - 'value': 'example/example2', + 'key': 'project_url', + 'value': 'https://example.com/projects/2', 'secret': False }, { @@ -207,14 +204,10 @@ def test_integration_webhook_post(db, client, project_id, integration_id): url = reverse('integration_webhook', args=[project_id, integration_id]) data = { 'action': 'closed', - 'issue': { - 'html_url': 'https://github.com/example/example/issues/1' - } + 'url': 'https://simple.example.com/issues/1' } - body = json.dumps(data) - signature = 'sha1=' + hmac.new(secret.encode(), body.encode(), 'sha1').hexdigest() - response = client.post(url, data, **{'HTTP_X_HUB_SIGNATURE': signature, 'content_type': 'application/json'}) + response = client.post(url, data, **{'HTTP_X_SECRET': secret, 'content_type': 'application/json'}) if integration: assert response.status_code == 200 @@ -224,6 +217,28 @@ def test_integration_webhook_post(db, client, project_id, integration_id): assert Issue.objects.filter(status='closed').count() == 0 +@pytest.mark.parametrize('project_id', projects) +@pytest.mark.parametrize('integration_id', integrations) +def test_integration_webhook_post_wrong_url(db, client, project_id, integration_id): + integration = Integration.objects.filter(project_id=project_id, id=integration_id).first() + + secret = 'super_duper_secret' + url = reverse('integration_webhook', args=[project_id, integration_id]) + data = { + 'action': 'closed', + 'url': 'https://simple.example.com/issues/2' + } + + response = client.post(url, data, **{'HTTP_X_SECRET': secret, 'content_type': 'application/json'}) + + if integration: + assert response.status_code == 200 + assert Issue.objects.filter(status='closed').count() == 0 + else: + assert response.status_code == 404 + assert Issue.objects.filter(status='closed').count() == 0 + + @pytest.mark.parametrize('project_id', projects) @pytest.mark.parametrize('integration_id', integrations) def test_integration_webhook_post_no_secret(db, client, project_id, integration_id): diff --git a/rdmo/projects/tests/test_view_issue.py b/rdmo/projects/tests/test_view_issue.py index 230bc2f7e5..e80a67b4a2 100644 --- a/rdmo/projects/tests/test_view_issue.py +++ b/rdmo/projects/tests/test_view_issue.py @@ -1,6 +1,9 @@ +from unittest.mock import Mock + import pytest from django.core import mail +from django.http import HttpResponseRedirect from django.urls import reverse from rdmo.core.constants import VALUE_TYPE_FILE @@ -224,7 +227,10 @@ def test_issue_send_post_attachements(db, client, files, username, password, pro @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('issue_id', issues) @pytest.mark.parametrize('project_id', projects) -def test_issue_send_post_integration(db, client, username, password, project_id, issue_id): +def test_issue_send_post_integration(db, client, mocker, username, password, project_id, issue_id): + mocked_send_issue = Mock(return_value=HttpResponseRedirect(redirect_to='https://example.com/login/oauth/authorize')) + mocker.patch('rdmo.projects.providers.SimpleIssueProvider.send_issue', mocked_send_issue) + client.login(username=username, password=password) issue = Issue.objects.filter(project_id=project_id, id=issue_id).first() @@ -240,7 +246,7 @@ def test_issue_send_post_integration(db, client, username, password, project_id, if project_id in change_issue_permission_map.get(username, []): if integration_pk in Project.objects.get(pk=project_id).integrations.values_list('id', flat=True): assert response.status_code == 302 - assert response.url.startswith('https://github.com') + assert response.url.startswith('https://example.com') else: assert response.status_code == 200 else: @@ -248,6 +254,6 @@ def test_issue_send_post_integration(db, client, username, password, project_id, assert response.status_code == 403 else: assert response.status_code == 302 - assert not response.url.startswith('https://github.com') + assert not response.url.startswith('https://example.com') else: assert response.status_code == 404 diff --git a/rdmo/projects/tests/test_view_project.py b/rdmo/projects/tests/test_view_project.py index 7d63410f9c..6f277ed987 100644 --- a/rdmo/projects/tests/test_view_project.py +++ b/rdmo/projects/tests/test_view_project.py @@ -2,6 +2,7 @@ import pytest +from django.contrib.auth.models import Group, User from django.urls import reverse from pytest_django.asserts import assertContains, assertNotContains, assertTemplateUsed @@ -145,6 +146,33 @@ def test_project_create_get(db, client, username, password): assert response.status_code == 302 +def test_project_create_restricted_get(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + client.login(username='user', password='user') + + url = reverse('project_create') + response = client.get(url) + + assert response.status_code == 200 + + +def test_project_create_forbidden_get(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='user', password='user') + + url = reverse('project_create') + response = client.get(url) + + assert response.status_code == 403 + + @pytest.mark.parametrize('username,password', users) def test_project_create_get_for_extra_users_and_unavailable_catalogs(db, client, username, password): client.login(username=username, password=password) @@ -215,6 +243,43 @@ def test_project_create_post(db, client, username, password): assert Project.objects.count() == project_count +def test_project_create_post_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + client.login(username='user', password='user') + + url = reverse('project_create') + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 302 + + +def test_project_create_post_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='user', password='user') + + url = reverse('project_create') + data = { + 'title': 'A new project', + 'description': 'Some description', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 403 + + @pytest.mark.parametrize('username,password', users) def test_project_create_parent_post(db, client, username, password): client.login(username=username, password=password) diff --git a/rdmo/projects/tests/test_view_project_create_import.py b/rdmo/projects/tests/test_view_project_create_import.py index a1c3880719..f8af896dd5 100644 --- a/rdmo/projects/tests/test_view_project_create_import.py +++ b/rdmo/projects/tests/test_view_project_create_import.py @@ -4,6 +4,7 @@ import pytest +from django.contrib.auth.models import Group, User from django.urls import reverse from rdmo.core.constants import VALUE_TYPE_FILE @@ -43,6 +44,31 @@ def test_project_create_import_get(db, client, username, password): assert response.url.startswith('/account/login/') +def test_project_create_import_get_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + client.login(username='user', password='user') + + url = reverse('project_create_import') + response = client.get(url) + assert response.status_code == 400 + + +def test_project_create_import_get_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='user', password='user') + + url = reverse('project_create_import') + response = client.get(url) + assert response.status_code == 403 + + @pytest.mark.parametrize('username,password', users) def test_project_create_import_post_empty(db, settings, client, username, password): client.login(username=username, password=password) @@ -122,6 +148,41 @@ def test_project_create_import_post_upload_file_empty(db, client, username, pass assert response.url.startswith('/account/login/') +def test_project_create_import_post_upload_file_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + client.login(username='user', password='user') + + url = reverse('project_create_import') + xml_file = os.path.join(settings.BASE_DIR, 'xml', 'project.xml') + with open(xml_file, encoding='utf8') as f: + response = client.post(url, { + 'method': 'upload_file', + 'uploaded_file': f + }) + assert response.status_code == 302 + + +def test_project_create_import_post_upload_file_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='user', password='user') + + url = reverse('project_create_import') + xml_file = os.path.join(settings.BASE_DIR, 'xml', 'project.xml') + with open(xml_file, encoding='utf8') as f: + response = client.post(url, { + 'method': 'upload_file', + 'uploaded_file': f + }) + assert response.status_code == 403 + + @pytest.mark.parametrize('username,password', users) def test_project_create_import_post_import_file(db, settings, client, files, username, password): client.login(username=username, password=password) diff --git a/rdmo/projects/tests/test_viewset_project.py b/rdmo/projects/tests/test_viewset_project.py index c5d08d0c40..adf83dc608 100644 --- a/rdmo/projects/tests/test_viewset_project.py +++ b/rdmo/projects/tests/test_viewset_project.py @@ -1,5 +1,6 @@ import pytest +from django.contrib.auth.models import Group, User from django.urls import reverse from ..models import Project @@ -41,18 +42,17 @@ 'list': 'v1-projects:project-list', 'detail': 'v1-projects:project-detail', 'overview': 'v1-projects:project-overview', + 'navigation': 'v1-projects:project-navigation', 'resolve': 'v1-projects:project-resolve', - 'progress': 'v1-projects:project-progress' } projects = [1, 2, 3, 4, 5] conditions = [1] -project_values = 37 -project_total = 54 catalog_id = 1 catalog_id_not_available = 2 +section_id = 1 @pytest.mark.parametrize('username,password', users) def test_list(db, client, username, password): @@ -114,6 +114,43 @@ def test_create(db, client, username, password): assert response.status_code == 401 +def test_create_restricted(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + settings.PROJECT_CREATE_GROUPS = ['projects'] + + group = Group.objects.create(name='projects') + user = User.objects.get(username='user') + user.groups.add(group) + + client.login(username='user', password='user') + + url = reverse(urlnames['list']) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 201 + + +def test_create_forbidden(db, client, settings): + settings.PROJECT_CREATE_RESTRICTED = True + + client.login(username='user', password='user') + + url = reverse(urlnames['list']) + data = { + 'title': 'Lorem ipsum dolor sit amet', + 'description': 'At vero eos et accusam et justo duo dolores et ea rebum.', + 'catalog': catalog_id + } + response = client.post(url, data) + + assert response.status_code == 403 + + def test_create_catalog_missing(db, client): client.login(username='user', password='user') @@ -241,15 +278,15 @@ def test_overview(db, client, username, password, project_id, condition_id): @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) @pytest.mark.parametrize('condition_id', conditions) -def test_resolve(db, client, username, password, project_id, condition_id): +def test_navigation(db, client, username, password, project_id, condition_id): client.login(username=username, password=password) - url = reverse(urlnames['resolve'], args=[project_id]) + f'?condition={condition_id}' + url = reverse(urlnames['navigation'], args=[project_id, section_id]) response = client.get(url) if project_id in view_project_permission_map.get(username, []): assert response.status_code == 200 - assert isinstance(response.json(), dict) + assert isinstance(response.json(), list) else: if password: assert response.status_code == 404 @@ -259,22 +296,16 @@ def test_resolve(db, client, username, password, project_id, condition_id): @pytest.mark.parametrize('username,password', users) @pytest.mark.parametrize('project_id', projects) -def test_progress(db, client, username, password, project_id): +@pytest.mark.parametrize('condition_id', conditions) +def test_resolve(db, client, username, password, project_id, condition_id): client.login(username=username, password=password) - url = reverse(urlnames['progress'], args=[project_id]) + url = reverse(urlnames['resolve'], args=[project_id]) + f'?condition={condition_id}' response = client.get(url) if project_id in view_project_permission_map.get(username, []): assert response.status_code == 200 assert isinstance(response.json(), dict) - - if project_id == 1: - assert response.json().get('values') == project_values - else: - assert response.json().get('values') == 1 - - assert response.json().get('total') == project_total else: if password: assert response.status_code == 404 diff --git a/rdmo/projects/tests/test_viewset_project_integration.py b/rdmo/projects/tests/test_viewset_project_integration.py index 94129a3d06..d1271081cc 100644 --- a/rdmo/projects/tests/test_viewset_project_integration.py +++ b/rdmo/projects/tests/test_viewset_project_integration.py @@ -87,11 +87,11 @@ def test_create(db, client, username, password, project_id): url = reverse(urlnames['list'], args=[project_id]) data = { - 'provider_key': 'github', + 'provider_key': 'simple', 'options': [ { - 'key': 'repo', - 'value': 'example/example' + 'key': 'project_url', + 'value': 'https://example.com/projects/1' } ] } @@ -115,8 +115,8 @@ def test_create_error1(db, client, username, password, project_id): 'provider_key': 'wrong', 'options': [ { - 'key': 'repo', - 'value': 'example/example' + 'key': 'project_url', + 'value': 'https://example.com/projects/1' } ] } @@ -138,10 +138,10 @@ def test_create_error2(db, client, username, password, project_id): url = reverse(urlnames['list'], args=[project_id]) data = { - 'provider_key': 'github', + 'provider_key': 'simple', 'options': [ { - 'key': 'repo', + 'key': 'project_url', 'value': '' } ] @@ -164,11 +164,11 @@ def test_create_error3(db, client, username, password, project_id): url = reverse(urlnames['list'], args=[project_id]) data = { - 'provider_key': 'github', + 'provider_key': 'simple', 'options': [ { - 'key': 'repo', - 'value': 'example/example' + 'key': 'project_url', + 'value': 'https://example.com/projects/1' }, { 'key': 'foo', @@ -196,11 +196,11 @@ def test_update(db, client, username, password, project_id, integration_id): url = reverse(urlnames['detail'], args=[project_id, integration_id]) data = { - 'provider_key': 'github', + 'provider_key': 'simple', 'options': [ { - 'key': 'repo', - 'value': 'example/test' + 'key': 'project_url', + 'value': 'https://example.com/projects/2' } ] } @@ -210,8 +210,8 @@ def test_update(db, client, username, password, project_id, integration_id): assert response.status_code == 200 assert sorted(response.json().get('options'), key=lambda obj: obj['key']) == [ { - 'key': 'repo', - 'value': 'example/test' + 'key': 'project_url', + 'value': 'https://example.com/projects/2' }, { 'key': 'secret', diff --git a/rdmo/projects/tests/test_viewset_project_progress.py b/rdmo/projects/tests/test_viewset_project_progress.py new file mode 100644 index 0000000000..6c39a52798 --- /dev/null +++ b/rdmo/projects/tests/test_viewset_project_progress.py @@ -0,0 +1,93 @@ +import pytest + +from django.urls import reverse + +from ..models import Project + +users = ( + ('owner', 'owner'), + ('manager', 'manager'), + ('author', 'author'), + ('guest', 'guest'), + ('api', 'api'), + ('user', 'user'), + ('site', 'site'), + ('anonymous', None), +) + +view_progress_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'manager': [1, 3, 5, 7], + 'author': [1, 3, 5, 8], + 'guest': [1, 3, 5, 9], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} + +change_progress_permission_map = { + 'owner': [1, 2, 3, 4, 5, 10], + 'manager': [1, 3, 5, 7], + 'author': [1, 3, 5, 8], + 'api': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + 'site': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} + +urlnames = { + 'progress': 'v1-projects:project-progress' +} + +projects = [1, 2, 3, 4, 5] + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_progress_get(db, client, username, password, project_id): + client.login(username=username, password=password) + + url = reverse(urlnames['progress'], args=[project_id]) + response = client.get(url) + + if project_id in view_progress_permission_map.get(username, []): + assert response.status_code == 200 + assert isinstance(response.json(), dict) + + project = Project.objects.get(id=project_id) + assert response.json()['count'] == project.progress_count + assert response.json()['total'] == project.progress_total + + else: + if password: + assert response.status_code == 404 + else: + assert response.status_code == 401 + + +@pytest.mark.parametrize('username,password', users) +@pytest.mark.parametrize('project_id', projects) +def test_progress_post(db, client, username, password, project_id): + client.login(username=username, password=password) + + if project_id in change_progress_permission_map.get(username, []): + # set project count and value to a different value + project = Project.objects.get(id=project_id) + project.progress_count = 0 + project.progress_total = 0 + project.save() + + url = reverse(urlnames['progress'], args=[project_id]) + response = client.post(url) + + if project_id in change_progress_permission_map.get(username, []): + assert response.status_code == 200 + assert isinstance(response.json(), dict) + + project.refresh_from_db() + assert response.json()['count'] > 0 + assert response.json()['total'] > 0 + + else: + if project_id in view_progress_permission_map.get(username, []): + assert response.status_code == 403 + elif password: + assert response.status_code == 404 + else: + assert response.status_code == 401 diff --git a/rdmo/projects/utils.py b/rdmo/projects/utils.py index 94b57e0793..5e5c374d43 100644 --- a/rdmo/projects/utils.py +++ b/rdmo/projects/utils.py @@ -7,6 +7,7 @@ from django.urls import reverse from rdmo.core.mail import send_mail +from rdmo.core.plugins import get_plugins logger = logging.getLogger(__name__) @@ -101,10 +102,7 @@ def save_import_snapshot_values(project, snapshots, checked): for value in snapshot.snapshot_values: if value.attribute: - value_key = '{value.attribute.uri}[{snapshot_index}][{value.set_prefix}][{value.set_index}][{value.collection_index}]'.format( # noqa: E501 - value=value, - snapshot_index=snapshot.snapshot_index - ) + value_key = f"{value.attribute.uri}[{snapshot.snapshot_index}][{value.set_prefix}][{value.set_index}][{value.collection_index}]" # noqa: E501 if value_key in checked: # assert that this is a new value @@ -173,3 +171,13 @@ def set_context_querystring_with_filter_and_page(context: dict) -> dict: del querystring['page'] context['querystring'] = querystring.urlencode() return context + + +def get_upload_accept(): + accept = set() + for import_plugin in get_plugins('PROJECT_IMPORTS').values(): + if import_plugin.accept: + accept.add(import_plugin.accept) + else: + return None + return ','.join(accept) diff --git a/rdmo/projects/validators.py b/rdmo/projects/validators.py index 3c60a66a32..5d3e99b1d4 100644 --- a/rdmo/projects/validators.py +++ b/rdmo/projects/validators.py @@ -1,4 +1,8 @@ +from datetime import timedelta + from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.utils.dateparse import parse_datetime from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -7,18 +11,45 @@ from rdmo.core.utils import human2bytes -class ValueValidator: +class ValueConflictValidator: requires_context = True def __call__(self, data, serializer): - if data.get('value_type') == VALUE_TYPE_FILE: - try: - serializer.context['view'].get_object() - except AssertionError as e: - project = serializer.context['view'].project + if serializer.instance: + # for an update, check if the value was updated in the meantime + updated = serializer.context['view'].request.data.get('updated') - if project.file_size > human2bytes(settings.PROJECT_FILE_QUOTA): + if updated is not None: + delta = abs(parse_datetime(updated) - serializer.instance.updated) + if delta > timedelta(seconds=settings.PROJECT_VALUES_CONFLICT_THRESHOLD): raise serializers.ValidationError({ - 'value': [_('You reached the file quota for this project.')] - }) from e + 'conflict': [_('A newer version of this value was found.')] + }) + else: + # for a new value, check if there is already a value with the same attribute and indexes + try: + serializer.context['view'].project.values.filter(snapshot=None).get( + attribute=data.get('attribute'), + set_prefix=data.get('set_prefix'), + set_index=data.get('set_index'), + collection_index=data.get('collection_index') + ) + raise serializers.ValidationError({ + 'conflict': [_('An existing value for this attribute/set_prefix/set_index/collection_index' + ' was found.')] + }) + except ObjectDoesNotExist: + pass + +class ValueQuotaValidator: + + requires_context = True + + def __call__(self, data, serializer): + if serializer.context['view'].action == 'create' and data.get('value_type') == VALUE_TYPE_FILE: + project = serializer.context['view'].project + if project.file_size > human2bytes(settings.PROJECT_FILE_QUOTA): + raise serializers.ValidationError({ + 'quota': [_('The file quota for this project has been reached.')] + }) diff --git a/rdmo/projects/views/project.py b/rdmo/projects/views/project.py index 6bbe56fbd5..e77373d280 100644 --- a/rdmo/projects/views/project.py +++ b/rdmo/projects/views/project.py @@ -27,7 +27,7 @@ from ..filters import ProjectFilter from ..models import Integration, Invite, Membership, Project, Value -from ..utils import set_context_querystring_with_filter_and_page +from ..utils import get_upload_accept, set_context_querystring_with_filter_and_page logger = logging.getLogger(__name__) @@ -71,6 +71,7 @@ def get_context_data(self, **kwargs): context['invites'] = Invite.objects.filter(user=self.request.user) context['is_site_manager'] = is_site_manager(self.request.user) context['number_of_filtered_projects'] = context["filter"].qs.count() + context['upload_accept'] = get_upload_accept() context = set_context_querystring_with_filter_and_page(context) return context @@ -157,10 +158,14 @@ def get_context_data(self, **kwargs): context['memberships'] = memberships.order_by('user__last_name', '-project__level') context['integrations'] = integrations.order_by('provider_key', '-project__level') context['providers'] = get_plugins('PROJECT_ISSUE_PROVIDERS') - context['issues'] = [issue for issue in project.issues.all() if issue.resolve(values)] + context['issues'] = [ + issue for issue in project.issues.order_by('-status', 'task__order', 'task__uri') if issue.resolve(values) + ] + context['views'] = project.views.order_by('order', 'uri') context['snapshots'] = project.snapshots.all() context['invites'] = project.invites.all() context['membership'] = Membership.objects.filter(project=project, user=self.request.user).first() + context['upload_accept'] = get_upload_accept() return context @@ -272,7 +277,7 @@ def get(self, request, *args, **kwargs): return redirect('project_error', pk=self.object.pk) else: context = self.get_context_data(object=self.object) - context['widgets'] = get_widgets() + context['widgets'] = {widget.template_name for widget in get_widgets() if widget.template_name} return self.render_to_response(context) diff --git a/rdmo/projects/views/project_create.py b/rdmo/projects/views/project_create.py index eb1cac6f50..c909e9a719 100644 --- a/rdmo/projects/views/project_create.py +++ b/rdmo/projects/views/project_create.py @@ -5,7 +5,7 @@ from django.urls import reverse_lazy from django.views.generic import CreateView, TemplateView -from rdmo.core.views import RedirectViewMixin +from rdmo.core.views import ObjectPermissionMixin, RedirectViewMixin from rdmo.questions.models import Catalog from rdmo.tasks.models import Task from rdmo.views.models import View @@ -17,9 +17,11 @@ logger = logging.getLogger(__name__) -class ProjectCreateView(LoginRequiredMixin, RedirectViewMixin, CreateView): +class ProjectCreateView(ObjectPermissionMixin, LoginRequiredMixin, + RedirectViewMixin, CreateView): model = Project form_class = ProjectForm + permission_required = 'projects.add_project' def get_form_kwargs(self): catalogs = Catalog.objects.filter_current_site() \ @@ -65,8 +67,10 @@ def form_valid(self, form): return response -class ProjectCreateImportView(ProjectImportMixin, LoginRequiredMixin, TemplateView): +class ProjectCreateImportView(ObjectPermissionMixin, LoginRequiredMixin, + ProjectImportMixin, TemplateView): success_url = reverse_lazy('projects') + permission_required = 'projects.add_project' def get(self, request, *args, **kwargs): self.object = None diff --git a/rdmo/projects/viewsets.py b/rdmo/projects/viewsets.py index 257c510dc1..378a97c68b 100644 --- a/rdmo/projects/viewsets.py +++ b/rdmo/projects/viewsets.py @@ -1,6 +1,6 @@ from django.conf import settings from django.contrib.sites.shortcuts import get_current_site -from django.db.models import prefetch_related_objects +from django.core.exceptions import ObjectDoesNotExist from django.http import Http404, HttpResponseRedirect from django.utils.translation import gettext_lazy as _ @@ -8,7 +8,6 @@ from rest_framework.decorators import action from rest_framework.exceptions import NotFound from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin -from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.reverse import reverse from rest_framework.viewsets import GenericViewSet, ModelViewSet, ReadOnlyModelViewSet @@ -26,7 +25,14 @@ from .filters import SnapshotFilterBackend, ValueFilterBackend from .models import Continuation, Integration, Invite, Issue, Membership, Project, Snapshot, Value -from .permissions import HasProjectPagePermission, HasProjectPermission, HasProjectsPermission +from .permissions import ( + HasProjectPagePermission, + HasProjectPermission, + HasProjectProgressModelPermission, + HasProjectProgressObjectPermission, + HasProjectsPermission, +) +from .progress import compute_navigation, compute_progress from .serializers.v1 import ( IntegrationSerializer, InviteSerializer, @@ -65,17 +71,27 @@ class ProjectViewSet(ModelViewSet): def get_queryset(self): return Project.objects.filter_user(self.request.user).select_related('catalog') - @action(detail=True, permission_classes=(IsAuthenticated, )) + @action(detail=True, permission_classes=(HasModelPermission | HasProjectPermission, )) def overview(self, request, pk=None): project = self.get_object() - - # prefetch only the pages (and their conditions) - prefetch_related_objects([project.catalog], - 'catalog_sections__section__section_pages__page__conditions') - serializer = ProjectOverviewSerializer(project, context={'request': request}) return Response(serializer.data) + @action(detail=True, url_path=r'navigation/(?P<section_id>\d+)', + permission_classes=(HasModelPermission | HasProjectPermission, )) + def navigation(self, request, pk=None, section_id=None): + project = self.get_object() + + try: + section = project.catalog.sections.get(pk=section_id) + except ObjectDoesNotExist as e: + raise NotFound() from e + + project.catalog.prefetch_elements() + + navigation = compute_navigation(section, project) + return Response(navigation) + @action(detail=True, permission_classes=(HasModelPermission | HasProjectPermission, )) def resolve(self, request, pk=None): snapshot_id = request.GET.get('snapshot') @@ -158,11 +174,27 @@ def options(self, request, pk=None): # if it didn't work return 404 raise NotFound() - @action(detail=True, permission_classes=(IsAuthenticated, )) + @action(detail=True, methods=['get', 'post'], + permission_classes=(HasProjectProgressModelPermission | HasProjectProgressObjectPermission, )) def progress(self, request, pk=None): project = self.get_object() - project.catalog.prefetch_elements() - return Response(project.progress) + + if request.method == 'POST' or project.progress_count is None or project.progress_total is None: + # compute the progress and store + project.catalog.prefetch_elements() + project.progress_count, project.progress_total = compute_progress(project) + project.save() + + try: + ratio = project.progress_count / project.progress_total + except ZeroDivisionError: + ratio = 0 + + return Response({ + 'count': project.progress_count, + 'total': project.progress_total, + 'ratio': ratio + }) def perform_create(self, serializer): project = serializer.save(site=get_current_site(self.request)) diff --git a/rdmo/projects/widgets.py b/rdmo/projects/widgets.py index 94507c7f91..bff47e8089 100644 --- a/rdmo/projects/widgets.py +++ b/rdmo/projects/widgets.py @@ -31,6 +31,11 @@ class AutocompleteWidget(Widget): widget_class = 'autocomplete' +class FreeAutocompleteWidget(Widget): + template_name = 'projects/project_questions_form_group_autocomplete.html' + widget_class = 'autocomplete' + + class DateWidget(Widget): template_name = 'projects/project_questions_form_group_date.html' widget_class = 'date' diff --git a/rdmo/questions/admin.py b/rdmo/questions/admin.py index 9b52d07f74..1ff106b968 100644 --- a/rdmo/questions/admin.py +++ b/rdmo/questions/admin.py @@ -96,6 +96,7 @@ class CatalogSectionInline(admin.TabularInline): extra = 0 +@admin.register(Catalog) class CatalogAdmin(admin.ModelAdmin): form = CatalogAdminForm inlines = (CatalogSectionInline, ) @@ -119,6 +120,7 @@ class SectionPageInline(admin.TabularInline): extra = 0 +@admin.register(Section) class SectionAdmin(admin.ModelAdmin): form = SectionAdminForm inlines = (SectionPageInline, ) @@ -140,6 +142,7 @@ class PageQuestionInline(admin.TabularInline): extra = 0 +@admin.register(Page) class PageAdmin(admin.ModelAdmin): form = PageAdminForm inlines = (PageQuestionSetInline, PageQuestionInline) @@ -162,6 +165,7 @@ class QuestionSetQuestionInline(admin.TabularInline): extra = 0 +@admin.register(QuestionSet) class QuestionSetAdmin(admin.ModelAdmin): form = QuestionSetAdminForm inlines = (QuestionSetQuestionSetInline, QuestionSetQuestionInline) @@ -173,6 +177,7 @@ class QuestionSetAdmin(admin.ModelAdmin): filter_horizontal = ('editors', 'conditions') +@admin.register(Question) class QuestionAdmin(admin.ModelAdmin): form = QuestionAdminForm @@ -182,10 +187,3 @@ class QuestionAdmin(admin.ModelAdmin): list_filter = ('pages__sections__catalogs', 'pages__sections', 'pages', 'is_collection', 'widget_type', 'value_type') filter_horizontal = ('editors', 'optionsets', 'conditions') - - -admin.site.register(Catalog, CatalogAdmin) -admin.site.register(Section, SectionAdmin) -admin.site.register(Page, PageAdmin) -admin.site.register(QuestionSet, QuestionSetAdmin) -admin.site.register(Question, QuestionAdmin) diff --git a/rdmo/questions/constants.py b/rdmo/questions/constants.py deleted file mode 100644 index 554286f3b3..0000000000 --- a/rdmo/questions/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.utils.translation import gettext_lazy as _ - -WIDGET_TYPES = ( - ('text', _('Text')), - ('textarea', _('Textarea')), - ('yesno', _('Yes/No')), - ('checkbox', _('Checkboxes')), - ('radio', _('Radio buttons')), - ('select', _('Select drop-down')), - ('autocomplete', _('Autocomplete')), - ('range', _('Range slider')), - ('date', _('Date picker')), - ('file', _('File upload')) -) diff --git a/rdmo/questions/imports.py b/rdmo/questions/imports.py index ab79204b26..a4b062d616 100644 --- a/rdmo/questions/imports.py +++ b/rdmo/questions/imports.py @@ -110,7 +110,6 @@ def import_page(element, save=False, user=None): set_lang_field(page, 'title', element) set_lang_field(page, 'help', element) set_lang_field(page, 'verbose_name', element) - set_lang_field(page, 'verbose_name_plural', element) validate_instance(page, element, PageLockedValidator, PageUniqueURIValidator) @@ -148,7 +147,6 @@ def import_questionset(element, save=False, user=None): set_lang_field(questionset, 'title', element) set_lang_field(questionset, 'help', element) set_lang_field(questionset, 'verbose_name', element) - set_lang_field(questionset, 'verbose_name_plural', element) validate_instance(questionset, element, QuestionSetLockedValidator, QuestionSetUniqueURIValidator) @@ -189,7 +187,6 @@ def import_question(element, save=False, user=None): set_lang_field(question, 'help', element) set_lang_field(question, 'default_text', element) set_lang_field(question, 'verbose_name', element) - set_lang_field(question, 'verbose_name_plural', element) set_foreign_field(question, 'default_option', element) diff --git a/rdmo/questions/migrations/0091_alter_questionset_options.py b/rdmo/questions/migrations/0091_alter_questionset_options.py new file mode 100644 index 0000000000..037cce001f --- /dev/null +++ b/rdmo/questions/migrations/0091_alter_questionset_options.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.7 on 2023-11-08 05:40 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("questions", "0090_add_editors"), + ] + + operations = [ + migrations.AlterModelOptions( + name="questionset", + options={ + "ordering": ("uri",), + "verbose_name": "Question set", + "verbose_name_plural": "Question sets", + }, + ), + ] diff --git a/rdmo/questions/migrations/0092_remove_verbose_name_plural.py b/rdmo/questions/migrations/0092_remove_verbose_name_plural.py new file mode 100644 index 0000000000..b55f7f8f06 --- /dev/null +++ b/rdmo/questions/migrations/0092_remove_verbose_name_plural.py @@ -0,0 +1,73 @@ +# Generated by Django 4.2.5 on 2023-09-30 17:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('questions', '0091_alter_questionset_options'), + ] + + operations = [ + migrations.RemoveField( + model_name='page', + name='verbose_name_plural_lang1', + ), + migrations.RemoveField( + model_name='page', + name='verbose_name_plural_lang2', + ), + migrations.RemoveField( + model_name='page', + name='verbose_name_plural_lang3', + ), + migrations.RemoveField( + model_name='page', + name='verbose_name_plural_lang4', + ), + migrations.RemoveField( + model_name='page', + name='verbose_name_plural_lang5', + ), + migrations.RemoveField( + model_name='question', + name='verbose_name_plural_lang1', + ), + migrations.RemoveField( + model_name='question', + name='verbose_name_plural_lang2', + ), + migrations.RemoveField( + model_name='question', + name='verbose_name_plural_lang3', + ), + migrations.RemoveField( + model_name='question', + name='verbose_name_plural_lang4', + ), + migrations.RemoveField( + model_name='question', + name='verbose_name_plural_lang5', + ), + migrations.RemoveField( + model_name='questionset', + name='verbose_name_plural_lang1', + ), + migrations.RemoveField( + model_name='questionset', + name='verbose_name_plural_lang2', + ), + migrations.RemoveField( + model_name='questionset', + name='verbose_name_plural_lang3', + ), + migrations.RemoveField( + model_name='questionset', + name='verbose_name_plural_lang4', + ), + migrations.RemoveField( + model_name='questionset', + name='verbose_name_plural_lang5', + ), + ] diff --git a/rdmo/questions/migrations/0093_alter_help_text_and_set_default.py b/rdmo/questions/migrations/0093_alter_help_text_and_set_default.py new file mode 100644 index 0000000000..f761b1a21d --- /dev/null +++ b/rdmo/questions/migrations/0093_alter_help_text_and_set_default.py @@ -0,0 +1,353 @@ +# Generated by Django 4.2.6 on 2023-12-04 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('questions', '0092_remove_verbose_name_plural'), + ] + + operations = [ + migrations.AlterField( + model_name='catalog', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text for this catalog (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='catalog', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text for this catalog (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='catalog', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text for this catalog (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='catalog', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text for this catalog (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='catalog', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text for this catalog (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='catalog', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this catalog (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='catalog', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this catalog (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='catalog', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this catalog (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='catalog', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this catalog (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='catalog', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this catalog (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + migrations.AlterField( + model_name='page', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text for this page (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='page', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text for this page (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='page', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text for this page (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='page', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text for this page (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='page', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text for this page (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='page', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this page (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='page', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this page (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='page', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this page (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='page', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this page (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='page', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this page (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + migrations.AlterField( + model_name='page', + name='verbose_name_lang1', + field=models.CharField(blank=True, help_text='The name displayed for this page (in the primary language).', max_length=256, verbose_name='Name (primary)'), + ), + migrations.AlterField( + model_name='page', + name='verbose_name_lang2', + field=models.CharField(blank=True, help_text='The name displayed for this page (in the secondary language).', max_length=256, verbose_name='Name (secondary)'), + ), + migrations.AlterField( + model_name='page', + name='verbose_name_lang3', + field=models.CharField(blank=True, help_text='The name displayed for this page (in the tertiary language).', max_length=256, verbose_name='Name (tertiary)'), + ), + migrations.AlterField( + model_name='page', + name='verbose_name_lang4', + field=models.CharField(blank=True, help_text='The name displayed for this page (in the quaternary language).', max_length=256, verbose_name='Name (quaternary)'), + ), + migrations.AlterField( + model_name='page', + name='verbose_name_lang5', + field=models.CharField(blank=True, help_text='The name displayed for this page (in the quinary language).', max_length=256, verbose_name='Name (quinary)'), + ), + migrations.AlterField( + model_name='question', + name='comment', + field=models.TextField(blank=True, default='', help_text='Additional internal information about this question.', verbose_name='Comment'), + ), + migrations.AlterField( + model_name='question', + name='default_text_lang1', + field=models.TextField(blank=True, default='', help_text='The default text value for this question (in the primary language).', verbose_name='Default text value (primary)'), + ), + migrations.AlterField( + model_name='question', + name='default_text_lang2', + field=models.TextField(blank=True, default='', help_text='The default text value for this question (in the secondary language).', verbose_name='Default text value (secondary)'), + ), + migrations.AlterField( + model_name='question', + name='default_text_lang3', + field=models.TextField(blank=True, default='', help_text='The default text value for this question (in the tertiary language).', verbose_name='Default text value (tertiary)'), + ), + migrations.AlterField( + model_name='question', + name='default_text_lang4', + field=models.TextField(blank=True, default='', help_text='The default text value for this question (in the quaternary language).', verbose_name='Default text value (quaternary)'), + ), + migrations.AlterField( + model_name='question', + name='default_text_lang5', + field=models.TextField(blank=True, default='', help_text='The default text value for this question (in the quinary language).', verbose_name='Default text value (quinary)'), + ), + migrations.AlterField( + model_name='question', + name='help_lang1', + field=models.TextField(blank=True, default='', help_text='The help text for this question (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='question', + name='help_lang2', + field=models.TextField(blank=True, default='', help_text='The help text for this question (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='question', + name='help_lang3', + field=models.TextField(blank=True, default='', help_text='The help text for this question (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='question', + name='help_lang4', + field=models.TextField(blank=True, default='', help_text='The help text for this question (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='question', + name='help_lang5', + field=models.TextField(blank=True, default='', help_text='The help text for this question (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='question', + name='text_lang1', + field=models.TextField(blank=True, default='', help_text='The text for this question (in the primary language).', verbose_name='Text (primary)'), + ), + migrations.AlterField( + model_name='question', + name='text_lang2', + field=models.TextField(blank=True, default='', help_text='The text for this question (in the secondary language).', verbose_name='Text (secondary)'), + ), + migrations.AlterField( + model_name='question', + name='text_lang3', + field=models.TextField(blank=True, default='', help_text='The text for this question (in the tertiary language).', verbose_name='Text (tertiary)'), + ), + migrations.AlterField( + model_name='question', + name='text_lang4', + field=models.TextField(blank=True, default='', help_text='The text for this question (in the quaternary language).', verbose_name='Text (quaternary)'), + ), + migrations.AlterField( + model_name='question', + name='text_lang5', + field=models.TextField(blank=True, default='', help_text='The text for this question (in the quinary language).', verbose_name='Text (quinary)'), + ), + migrations.AlterField( + model_name='question', + name='uri', + field=models.URLField(blank=True, default='', help_text='The Uniform Resource Identifier of this question (auto-generated).', max_length=800, verbose_name='URI'), + ), + migrations.AlterField( + model_name='question', + name='uri_path', + field=models.CharField(blank=True, default='', help_text='The path for the URI of this question.', max_length=512, verbose_name='URI Path'), + ), + migrations.AlterField( + model_name='question', + name='verbose_name_lang1', + field=models.CharField(blank=True, help_text='The name displayed for this question (in the primary language).', max_length=256, verbose_name='Name (primary)'), + ), + migrations.AlterField( + model_name='question', + name='verbose_name_lang2', + field=models.CharField(blank=True, help_text='The name displayed for this question (in the secondary language).', max_length=256, verbose_name='Name (secondary)'), + ), + migrations.AlterField( + model_name='question', + name='verbose_name_lang3', + field=models.CharField(blank=True, help_text='The name displayed for this question (in the tertiary language).', max_length=256, verbose_name='Name (tertiary)'), + ), + migrations.AlterField( + model_name='question', + name='verbose_name_lang4', + field=models.CharField(blank=True, help_text='The name displayed for this question (in the quaternary language).', max_length=256, verbose_name='Name (quaternary)'), + ), + migrations.AlterField( + model_name='question', + name='verbose_name_lang5', + field=models.CharField(blank=True, help_text='The name displayed for this question (in the quinary language).', max_length=256, verbose_name='Name (quinary)'), + ), + migrations.AlterField( + model_name='questionset', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text for this question set (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='questionset', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text for this question set (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='questionset', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text for this question set (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='questionset', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text for this question set (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='questionset', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text for this question set (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='questionset', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this question set (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='questionset', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this question set (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='questionset', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this question set (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='questionset', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this question set (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='questionset', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this question set (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + migrations.AlterField( + model_name='questionset', + name='verbose_name_lang1', + field=models.CharField(blank=True, help_text='The name displayed for this question set (in the primary language).', max_length=256, verbose_name='Name (primary)'), + ), + migrations.AlterField( + model_name='questionset', + name='verbose_name_lang2', + field=models.CharField(blank=True, help_text='The name displayed for this question set (in the secondary language).', max_length=256, verbose_name='Name (secondary)'), + ), + migrations.AlterField( + model_name='questionset', + name='verbose_name_lang3', + field=models.CharField(blank=True, help_text='The name displayed for this question set (in the tertiary language).', max_length=256, verbose_name='Name (tertiary)'), + ), + migrations.AlterField( + model_name='questionset', + name='verbose_name_lang4', + field=models.CharField(blank=True, help_text='The name displayed for this question set (in the quaternary language).', max_length=256, verbose_name='Name (quaternary)'), + ), + migrations.AlterField( + model_name='questionset', + name='verbose_name_lang5', + field=models.CharField(blank=True, help_text='The name displayed for this question set (in the quinary language).', max_length=256, verbose_name='Name (quinary)'), + ), + migrations.AlterField( + model_name='section', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this section (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='section', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this section (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='section', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this section (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='section', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this section (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='section', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this section (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + ] diff --git a/rdmo/questions/models/catalog.py b/rdmo/questions/models/catalog.py index b61ecdd54f..8eec46f90f 100644 --- a/rdmo/questions/models/catalog.py +++ b/rdmo/questions/models/catalog.py @@ -84,52 +84,52 @@ class Catalog(Model, TranslationMixin): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this catalog in the primary language.') + help_text=_('The title for this catalog (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this catalog in the secondary language.') + help_text=_('The title for this catalog (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this catalog in the tertiary language.') + help_text=_('The title for this catalog (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this catalog in the quaternary language.') + help_text=_('The title for this catalog (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this catalog in the quinary language.') + help_text=_('The title for this catalog (in the quinary language).') ) help_lang1 = models.TextField( blank=True, verbose_name=_('Help (primary)'), - help_text=_('The help text for this catalog in the primary language.') + help_text=_('The help text for this catalog (in the primary language).') ) help_lang2 = models.TextField( blank=True, verbose_name=_('Help (secondary)'), - help_text=_('The help text for this catalog in the secondary language.') + help_text=_('The help text for this catalog (in the secondary language).') ) help_lang3 = models.TextField( blank=True, verbose_name=_('Help (tertiary)'), - help_text=_('The help text for this catalog in the tertiary language.') + help_text=_('The help text for this catalog (in the tertiary language).') ) help_lang4 = models.TextField( blank=True, verbose_name=_('Help (quaternary)'), - help_text=_('The help text for this catalog in the quaternary language.') + help_text=_('The help text for this catalog (in the quaternary language).') ) help_lang5 = models.TextField( blank=True, verbose_name=_('Help (quinary)'), - help_text=_('The help text for this catalog in the quinary language.') + help_text=_('The help text for this catalog (in the quinary language).') ) available = models.BooleanField( default=True, diff --git a/rdmo/questions/models/page.py b/rdmo/questions/models/page.py index 05d20fd85c..ad5c8db740 100644 --- a/rdmo/questions/models/page.py +++ b/rdmo/questions/models/page.py @@ -84,102 +84,77 @@ class Page(Model, TranslationMixin): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this page in the primary language.') + help_text=_('The title for this page (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this page in the secondary language.') + help_text=_('The title for this page (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this page in the tertiary language.') + help_text=_('The title for this page (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this page in the quaternary language.') + help_text=_('The title for this page (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this page in the quinary language.') + help_text=_('The title for this page (in the quinary language).') ) help_lang1 = models.TextField( blank=True, verbose_name=_('Help (primary)'), - help_text=_('The help text for this page in the primary language.') + help_text=_('The help text for this page (in the primary language).') ) help_lang2 = models.TextField( blank=True, verbose_name=_('Help (secondary)'), - help_text=_('The help text for this page in the secondary language.') + help_text=_('The help text for this page (in the secondary language).') ) help_lang3 = models.TextField( blank=True, verbose_name=_('Help (tertiary)'), - help_text=_('The help text for this page in the tertiary language.') + help_text=_('The help text for this page (in the tertiary language).') ) help_lang4 = models.TextField( blank=True, verbose_name=_('Help (quaternary)'), - help_text=_('The help text for this page in the quaternary language.') + help_text=_('The help text for this page (in the quaternary language).') ) help_lang5 = models.TextField( blank=True, verbose_name=_('Help (quinary)'), - help_text=_('The help text for this page in the quinary language.') + help_text=_('The help text for this page (in the quinary language).') ) verbose_name_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (primary)'), - help_text=_('The name displayed for this page in the primary language.') + help_text=_('The name displayed for this page (in the primary language).') ) verbose_name_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (secondary)'), - help_text=_('The name displayed for this page in the secondary language.') + help_text=_('The name displayed for this page (in the secondary language).') ) verbose_name_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (tertiary)'), - help_text=_('The name displayed for this page in the tertiary language.') + help_text=_('The name displayed for this page (in the tertiary language).') ) verbose_name_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quaternary)'), - help_text=_('The name displayed for this page in the quaternary language.') + help_text=_('The name displayed for this page (in the quaternary language).') ) verbose_name_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quinary)'), - help_text=_('The name displayed for this page in the quinary language.') - ) - verbose_name_plural_lang1 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (primary)'), - help_text=_('The plural name displayed for this page in the primary language.') - ) - verbose_name_plural_lang2 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (secondary)'), - help_text=_('The plural name displayed for this page in the secondary language.') - ) - verbose_name_plural_lang3 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (tertiary)'), - help_text=_('The plural name displayed for this page in the tertiary language.') - ) - verbose_name_plural_lang4 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quaternary)'), - help_text=_('The plural name displayed for this page in the quaternary language.') - ) - verbose_name_plural_lang5 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quinary)'), - help_text=_('The plural name displayed for this page in the quinary language.') + help_text=_('The name displayed for this page (in the quinary language).') ) conditions = models.ManyToManyField( Condition, blank=True, related_name='pages', @@ -211,10 +186,6 @@ def help(self): def verbose_name(self): return self.trans('verbose_name') - @property - def verbose_name_plural(self): - return self.trans('verbose_name_plural') - @cached_property def is_locked(self): return self.locked or any(section.is_locked for section in self.sections.all()) diff --git a/rdmo/questions/models/question.py b/rdmo/questions/models/question.py index 6244f579c8..6b184ee2e2 100644 --- a/rdmo/questions/models/question.py +++ b/rdmo/questions/models/question.py @@ -16,15 +16,13 @@ class Question(Model, TranslationMixin): - objects = QuestionManager() - prefetch_lookups = ( 'conditions', 'optionsets' ) uri = models.URLField( - max_length=800, blank=True, null=True, + max_length=800, blank=True, default="", verbose_name=_('URI'), help_text=_('The Uniform Resource Identifier of this question (auto-generated).') ) @@ -34,12 +32,12 @@ class Question(Model, TranslationMixin): help_text=_('The prefix for the URI of this question.') ) uri_path = models.CharField( - max_length=512, blank=True, null=True, + max_length=512, blank=True, default="", verbose_name=_('URI Path'), help_text=_('The path for the URI of this question.') ) comment = models.TextField( - blank=True, null=True, + blank=True, default="", verbose_name=_('Comment'), help_text=_('Additional internal information about this question.') ) @@ -69,79 +67,79 @@ class Question(Model, TranslationMixin): help_text=_('The sites that can edit this question (in a multi site setup).') ) help_lang1 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Help (primary)'), - help_text=_('The help text for this question in the primary language.') + help_text=_('The help text for this question (in the primary language).') ) help_lang2 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Help (secondary)'), - help_text=_('The help text for this question in the secondary language.') + help_text=_('The help text for this question (in the secondary language).') ) help_lang3 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Help (tertiary)'), - help_text=_('The help text for this question in the tertiary language.') + help_text=_('The help text for this question (in the tertiary language).') ) help_lang4 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Help (quaternary)'), - help_text=_('The help text for this question in the quaternary language.') + help_text=_('The help text for this question (in the quaternary language).') ) help_lang5 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Help (quinary)'), - help_text=_('The help text for this question in the quinary language.') + help_text=_('The help text for this question (in the quinary language).') ) text_lang1 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Text (primary)'), - help_text=_('The text for this question in the primary language.') + help_text=_('The text for this question (in the primary language).') ) text_lang2 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Text (secondary)'), - help_text=_('The text for this question in the secondary language.') + help_text=_('The text for this question (in the secondary language).') ) text_lang3 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Text (tertiary)'), - help_text=_('The text for this question in the tertiary language.') + help_text=_('The text for this question (in the tertiary language).') ) text_lang4 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Text (quaternary)'), - help_text=_('The text for this question in the quaternary language.') + help_text=_('The text for this question (in the quaternary language).') ) text_lang5 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Text (quinary)'), - help_text=_('The text for this question in the quinary language.') + help_text=_('The text for this question (in the quinary language).') ) default_text_lang1 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Default text value (primary)'), - help_text=_('The default text value for this question in the primary language.') + help_text=_('The default text value for this question (in the primary language).') ) default_text_lang2 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Default text value (secondary)'), - help_text=_('The default text value for this question in the secondary language.') + help_text=_('The default text value for this question (in the secondary language).') ) default_text_lang3 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Default text value (tertiary)'), - help_text=_('The default text value for this question in the tertiary language.') + help_text=_('The default text value for this question (in the tertiary language).') ) default_text_lang4 = models.TextField( - null=True, blank=True, + blank=True, default="", verbose_name=_('Default text value (quaternary)'), - help_text=_('The default text value for this question in the quaternary language.') + help_text=_('The default text value for this question (in the quaternary language).') ) default_text_lang5 = models.TextField( - null=True, blank=True, + default="", blank=True, verbose_name=_('Default text value (quinary)'), - help_text=_('The default text value for this question in the quinary language.') + help_text=_('The default text value for this question (in the quinary language).') ) default_option = models.ForeignKey( Option, blank=True, null=True, on_delete=models.SET_NULL, @@ -156,52 +154,27 @@ class Question(Model, TranslationMixin): verbose_name_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (primary)'), - help_text=_('The name displayed for this question in the primary language.') + help_text=_('The name displayed for this question (in the primary language).') ) verbose_name_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (secondary)'), - help_text=_('The name displayed for this question in the secondary language.') + help_text=_('The name displayed for this question (in the secondary language).') ) verbose_name_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (tertiary)'), - help_text=_('The name displayed for this question in the tertiary language.') + help_text=_('The name displayed for this question (in the tertiary language).') ) verbose_name_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quaternary)'), - help_text=_('The name displayed for this question in the quaternary language.') + help_text=_('The name displayed for this question (in the quaternary language).') ) verbose_name_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quinary)'), - help_text=_('The name displayed for this question in the quinary language.') - ) - verbose_name_plural_lang1 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (primary)'), - help_text=_('The plural name displayed for this question in the primary language.') - ) - verbose_name_plural_lang2 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (secondary)'), - help_text=_('The plural name displayed for this question in the secondary language.') - ) - verbose_name_plural_lang3 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (tertiary)'), - help_text=_('The plural name displayed for this question in the tertiary language.') - ) - verbose_name_plural_lang4 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quaternary)'), - help_text=_('The plural name displayed for this question in the quaternary language.') - ) - verbose_name_plural_lang5 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quinary)'), - help_text=_('The plural name displayed for this question in the quinary language.') + help_text=_('The name displayed for this question (in the quinary language).') ) widget_type = models.CharField( max_length=16, @@ -249,6 +222,8 @@ class Question(Model, TranslationMixin): help_text=_('List of conditions evaluated for this question.') ) + objects = QuestionManager() + class Meta: ordering = ('uri', ) verbose_name = _('Question') @@ -277,10 +252,6 @@ def default_text(self): def verbose_name(self): return self.trans('verbose_name') - @property - def verbose_name_plural(self): - return self.trans('verbose_name_plural') - @cached_property def is_locked(self): return self.locked or \ diff --git a/rdmo/questions/models/questionset.py b/rdmo/questions/models/questionset.py index 8e3f0026cb..4e8fc53f23 100644 --- a/rdmo/questions/models/questionset.py +++ b/rdmo/questions/models/questionset.py @@ -79,102 +79,77 @@ class QuestionSet(Model, TranslationMixin): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this question set in the primary language.') + help_text=_('The title for this question set (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this question set in the secondary language.') + help_text=_('The title for this question set (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this question set in the tertiary language.') + help_text=_('The title for this question set (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this question set in the quaternary language.') + help_text=_('The title for this question set (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this question set in the quinary language.') + help_text=_('The title for this question set (in the quinary language).') ) help_lang1 = models.TextField( blank=True, verbose_name=_('Help (primary)'), - help_text=_('The help text for this question set in the primary language.') + help_text=_('The help text for this question set (in the primary language).') ) help_lang2 = models.TextField( blank=True, verbose_name=_('Help (secondary)'), - help_text=_('The help text for this question set in the secondary language.') + help_text=_('The help text for this question set (in the secondary language).') ) help_lang3 = models.TextField( blank=True, verbose_name=_('Help (tertiary)'), - help_text=_('The help text for this question set in the tertiary language.') + help_text=_('The help text for this question set (in the tertiary language).') ) help_lang4 = models.TextField( blank=True, verbose_name=_('Help (quaternary)'), - help_text=_('The help text for this question set in the quaternary language.') + help_text=_('The help text for this question set (in the quaternary language).') ) help_lang5 = models.TextField( blank=True, verbose_name=_('Help (quinary)'), - help_text=_('The help text for this question set in the quinary language.') + help_text=_('The help text for this question set (in the quinary language).') ) verbose_name_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (primary)'), - help_text=_('The name displayed for this question set in the primary language.') + help_text=_('The name displayed for this question set (in the primary language).') ) verbose_name_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (secondary)'), - help_text=_('The name displayed for this question set in the secondary language.') + help_text=_('The name displayed for this question set (in the secondary language).') ) verbose_name_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (tertiary)'), - help_text=_('The name displayed for this question set in the tertiary language.') + help_text=_('The name displayed for this question set (in the tertiary language).') ) verbose_name_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quaternary)'), - help_text=_('The name displayed for this question set in the quaternary language.') + help_text=_('The name displayed for this question set (in the quaternary language).') ) verbose_name_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Name (quinary)'), - help_text=_('The name displayed for this question set in the quinary language.') - ) - verbose_name_plural_lang1 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (primary)'), - help_text=_('The plural name displayed for this question set in the primary language.') - ) - verbose_name_plural_lang2 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (secondary)'), - help_text=_('The plural name displayed for this question set in the secondary language.') - ) - verbose_name_plural_lang3 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (tertiary)'), - help_text=_('The plural name displayed for this question set in the tertiary language.') - ) - verbose_name_plural_lang4 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quaternary)'), - help_text=_('The plural name displayed for this question set in the quaternary language.') - ) - verbose_name_plural_lang5 = models.CharField( - max_length=256, blank=True, - verbose_name=_('Plural name (quinary)'), - help_text=_('The plural name displayed for this question set in the quinary language.') + help_text=_('The name displayed for this question set (in the quinary language).') ) conditions = models.ManyToManyField( Condition, blank=True, related_name='questionsets', @@ -185,7 +160,7 @@ class QuestionSet(Model, TranslationMixin): class Meta: ordering = ('uri', ) verbose_name = _('Question set') - verbose_name_plural = _('Question set') + verbose_name_plural = _('Question sets') def __str__(self): return self.uri @@ -206,10 +181,6 @@ def help(self): def verbose_name(self): return self.trans('verbose_name') - @property - def verbose_name_plural(self): - return self.trans('verbose_name_plural') - @cached_property def is_locked(self): return self.locked or \ diff --git a/rdmo/questions/models/section.py b/rdmo/questions/models/section.py index bcf4f7dc79..7bec2bb00c 100644 --- a/rdmo/questions/models/section.py +++ b/rdmo/questions/models/section.py @@ -67,27 +67,27 @@ class Section(Model, TranslationMixin): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this section in the primary language.') + help_text=_('The title for this section (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this section in the secondary language.') + help_text=_('The title for this section (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this section in the tertiary language.') + help_text=_('The title for this section (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this section in the quaternary language.') + help_text=_('The title for this section (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this section in the quinary language.') + help_text=_('The title for this section (in the quinary language).') ) class Meta: diff --git a/rdmo/questions/renderers/mixins.py b/rdmo/questions/renderers/mixins.py index f22ef39a81..328e14fdef 100644 --- a/rdmo/questions/renderers/mixins.py +++ b/rdmo/questions/renderers/mixins.py @@ -86,8 +86,6 @@ def render_page(self, xml, page): page['help_%s' % lang_code]) self.render_text_element(xml, 'verbose_name', {'lang': lang_code}, page['verbose_name_%s' % lang_code]) - self.render_text_element(xml, 'verbose_name_plural', {'lang': lang_code}, - page['verbose_name_plural_%s' % lang_code]) xml.startElement('questionsets', {}) for page_questionset in page['page_questionsets']: @@ -154,8 +152,6 @@ def render_questionset(self, xml, questionset): questionset['help_%s' % lang_code]) self.render_text_element(xml, 'verbose_name', {'lang': lang_code}, questionset['verbose_name_%s' % lang_code]) - self.render_text_element(xml, 'verbose_name_plural', {'lang': lang_code}, - questionset['verbose_name_plural_%s' % lang_code]) xml.startElement('questionsets', {}) for questionset_questionset in questionset['questionset_questionsets']: @@ -225,8 +221,6 @@ def render_question(self, xml, question): question['default_text_%s' % lang_code]) self.render_text_element(xml, 'verbose_name', {'lang': lang_code}, question['verbose_name_%s' % lang_code]) - self.render_text_element(xml, 'verbose_name_plural', {'lang': lang_code}, - question['verbose_name_plural_%s' % lang_code]) self.render_text_element(xml, 'default_option', {'dc:uri': question['default_option']}, None) self.render_text_element(xml, 'default_external_id', {}, question['default_external_id']) diff --git a/rdmo/questions/serializers/export.py b/rdmo/questions/serializers/export.py index 5f34bdb283..1183a84ed4 100644 --- a/rdmo/questions/serializers/export.py +++ b/rdmo/questions/serializers/export.py @@ -53,8 +53,7 @@ class Meta: 'help', 'text', 'default_text', - 'verbose_name', - 'verbose_name_plural', + 'verbose_name' ) @@ -109,8 +108,7 @@ class Meta: trans_fields = ( 'title', 'help', - 'verbose_name', - 'verbose_name_plural', + 'verbose_name' ) @@ -162,8 +160,7 @@ class Meta: trans_fields = ( 'title', 'help', - 'verbose_name', - 'verbose_name_plural', + 'verbose_name' ) diff --git a/rdmo/questions/serializers/v1/page.py b/rdmo/questions/serializers/v1/page.py index 33dce4eaa0..e10df08f2e 100644 --- a/rdmo/questions/serializers/v1/page.py +++ b/rdmo/questions/serializers/v1/page.py @@ -66,7 +66,6 @@ class Meta: 'title', 'help', 'verbose_name', - 'verbose_name_plural', 'sections', 'questionsets', 'questions', @@ -80,8 +79,7 @@ class Meta: trans_fields = ( 'title', 'help', - 'verbose_name', - 'verbose_name_plural' + 'verbose_name' ) parent_fields = ( ('sections', 'section', 'page', 'section_pages'), diff --git a/rdmo/questions/serializers/v1/question.py b/rdmo/questions/serializers/v1/question.py index 1a0f35ecda..3235e05fb6 100644 --- a/rdmo/questions/serializers/v1/question.py +++ b/rdmo/questions/serializers/v1/question.py @@ -58,7 +58,6 @@ class Meta: 'help', 'default_text', 'verbose_name', - 'verbose_name_plural', 'pages', 'questionsets', 'optionsets', @@ -74,8 +73,7 @@ class Meta: 'text', 'help', 'default_text', - 'verbose_name', - 'verbose_name_plural', + 'verbose_name' ) parent_fields = ( ('pages', 'page', 'question', 'page_questions'), diff --git a/rdmo/questions/serializers/v1/questionset.py b/rdmo/questions/serializers/v1/questionset.py index 1fbb50f498..c8789f2f73 100644 --- a/rdmo/questions/serializers/v1/questionset.py +++ b/rdmo/questions/serializers/v1/questionset.py @@ -68,7 +68,6 @@ class Meta: 'title', 'help', 'verbose_name', - 'verbose_name_plural', 'pages', 'parents', 'questionsets', @@ -83,8 +82,7 @@ class Meta: trans_fields = ( 'title', 'help', - 'verbose_name', - 'verbose_name_plural' + 'verbose_name' ) parent_fields = ( ('pages', 'page', 'questionset', 'page_questionsets'), diff --git a/rdmo/questions/templates/questions/export/page.html b/rdmo/questions/templates/questions/export/page.html index 84d4d82cc9..3e8efb2ad3 100644 --- a/rdmo/questions/templates/questions/export/page.html +++ b/rdmo/questions/templates/questions/export/page.html @@ -22,17 +22,12 @@ <h3>{% trans 'Page' %} {{ page.title }}</h3> {% endif %} -{% if page.verbose_name or page.verbose_name_plural %} +{% if page.verbose_name %} <p> - <strong>{% trans 'Verbose name' %}:</strong> + <strong>{% trans 'Verbose name' %}: {{ page.verbose_name }}</strong> </p> -<ul> - <li>{% trans 'Verbose name' %}: {{ page.verbose_name }}</li> - <li>{% trans 'Verbose name plural' %}: {{ page.verbose_name_plural }}</li> -</ul> - {% endif %} {% for element in page.elements %} diff --git a/rdmo/questions/templates/questions/export/question.html b/rdmo/questions/templates/questions/export/question.html index 5390c5c98a..c147b52df1 100644 --- a/rdmo/questions/templates/questions/export/question.html +++ b/rdmo/questions/templates/questions/export/question.html @@ -42,17 +42,12 @@ {% endif %} -{% if question.verbose_name or question.verbose_name_plural %} +{% if question.verbose_name %} <p> - <strong>{% trans 'Verbose name' %}:</strong> + <strong>{% trans 'Verbose name' %}: {{ question.verbose_name }}</strong> </p> -<ul> - <li>{% trans 'Verbose name' %}: {{ question.verbose_name }}</li> - <li>{% trans 'Verbose name plural' %}: {{ question.verbose_name_plural }}</li> -</ul> - {% endif %} {% if question.minimum or question.maximum or question.step %} diff --git a/rdmo/questions/templates/questions/export/questionset.html b/rdmo/questions/templates/questions/export/questionset.html index 37458bbc63..0b726fb72e 100644 --- a/rdmo/questions/templates/questions/export/questionset.html +++ b/rdmo/questions/templates/questions/export/questionset.html @@ -24,17 +24,12 @@ {% endif %} -{% if questionset.verbose_name or questionset.verbose_name_plural %} +{% if questionset.verbose_name %} <p> - <strong>{% trans 'Verbose name' %}:</strong> + <strong>{% trans 'Verbose name' %}: {{ questionset.verbose_name }}</strong> </p> -<ul> - <li>{% trans 'Verbose name' %}: {{ questionset.verbose_name }}</li> - <li>{% trans 'Verbose name plural' %}: {{ questionset.verbose_name_plural }}</li> -</ul> - {% endif %} {% for element in questionset.elements %} diff --git a/rdmo/questions/tests/test_viewset_page.py b/rdmo/questions/tests/test_viewset_page.py index 7d292e1b95..3d39cebe9a 100644 --- a/rdmo/questions/tests/test_viewset_page.py +++ b/rdmo/questions/tests/test_viewset_page.py @@ -123,9 +123,7 @@ def test_create(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.post(url, data, content_type='application/json') assert response.status_code == status_map['create'][username], response.json() @@ -155,8 +153,6 @@ def test_create_section(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'sections': [section.id] } response = client.post(url, data, content_type='application/json') @@ -198,8 +194,6 @@ def test_create_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': page_questionsets, 'questions': page_questions, 'conditions': conditions @@ -242,9 +236,7 @@ def test_update(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.put(url, data, content_type='application/json') assert response.status_code == status_map['update'][username], response.json() @@ -284,8 +276,6 @@ def test_update_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': page_questionsets, 'questions': page_questions, 'conditions': conditions diff --git a/rdmo/questions/tests/test_viewset_page_multisite.py b/rdmo/questions/tests/test_viewset_page_multisite.py index 20abffb078..98c06785da 100644 --- a/rdmo/questions/tests/test_viewset_page_multisite.py +++ b/rdmo/questions/tests/test_viewset_page_multisite.py @@ -86,9 +86,7 @@ def test_create(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.post(url, data, content_type='application/json') assert response.status_code == status_map['create'][username], response.json() @@ -118,8 +116,6 @@ def test_create_section(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'sections': [section.id] } response = client.post(url, data, content_type='application/json') @@ -161,8 +157,6 @@ def test_create_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': page_questionsets, 'questions': page_questions, 'conditions': conditions @@ -205,9 +199,7 @@ def test_update(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.put(url, data, content_type='application/json') assert response.status_code == get_obj_perms_status_code(instance, username, 'update'), response.json() @@ -247,8 +239,6 @@ def test_update_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': page_questionsets, 'questions': page_questions, 'conditions': conditions diff --git a/rdmo/questions/tests/test_viewset_question.py b/rdmo/questions/tests/test_viewset_question.py index 929a7a97e6..8ba5f66b72 100644 --- a/rdmo/questions/tests/test_viewset_question.py +++ b/rdmo/questions/tests/test_viewset_question.py @@ -113,8 +113,6 @@ def test_create(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -150,8 +148,6 @@ def test_create_page(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -194,8 +190,6 @@ def test_create_questionset(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -236,8 +230,6 @@ def test_create_m2m(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -280,8 +272,6 @@ def test_update(db, client, username, password): 'text_de': instance.text_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum, @@ -323,8 +313,6 @@ def test_update_m2m(db, client, username, password): 'text_de': instance.text_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum, diff --git a/rdmo/questions/tests/test_viewset_question_multisite.py b/rdmo/questions/tests/test_viewset_question_multisite.py index 230c611633..796121c0d9 100644 --- a/rdmo/questions/tests/test_viewset_question_multisite.py +++ b/rdmo/questions/tests/test_viewset_question_multisite.py @@ -76,8 +76,6 @@ def test_create(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -113,8 +111,6 @@ def test_create_page(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -157,8 +153,6 @@ def test_create_questionset(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -199,8 +193,6 @@ def test_create_m2m(db, client, username, password): 'text_de': instance.text_lang2 or '', 'verbose_name_en': instance.verbose_name_lang1 or '', 'verbose_name_de': instance.verbose_name_lang2 or '', - 'verbose_name_plural_en': instance.verbose_name_plural_lang1 or '', - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 or '', 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum or '', @@ -243,8 +235,6 @@ def test_update(db, client, username, password): 'text_de': instance.text_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum, @@ -286,8 +276,6 @@ def test_update_m2m(db, client, username, password): 'text_de': instance.text_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'widget_type': instance.widget_type, 'value_type': instance.value_type, 'minimum': instance.minimum, diff --git a/rdmo/questions/tests/test_viewset_questionset.py b/rdmo/questions/tests/test_viewset_questionset.py index 0ab31c35cd..cd50a32583 100644 --- a/rdmo/questions/tests/test_viewset_questionset.py +++ b/rdmo/questions/tests/test_viewset_questionset.py @@ -123,9 +123,7 @@ def test_create(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.post(url, data, content_type='application/json') assert response.status_code == status_map['create'][username], response.json() @@ -155,8 +153,6 @@ def test_create_page(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'pages': [page.id] } response = client.post(url, data, content_type='application/json') @@ -193,8 +189,6 @@ def test_create_parent(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'parents': [parent.id] } response = client.post(url, data, content_type='application/json') @@ -236,8 +230,6 @@ def test_create_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': questionsets, 'questions': questions, 'conditions': conditions @@ -282,9 +274,7 @@ def test_update(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.put(url, data, content_type='application/json') assert response.status_code == status_map['update'][username], response.json() @@ -326,8 +316,6 @@ def test_update_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': questionsets, 'questions': questions, 'conditions': conditions diff --git a/rdmo/questions/tests/test_viewset_questionset_multisite.py b/rdmo/questions/tests/test_viewset_questionset_multisite.py index 1d5f42003f..a45360a800 100644 --- a/rdmo/questions/tests/test_viewset_questionset_multisite.py +++ b/rdmo/questions/tests/test_viewset_questionset_multisite.py @@ -86,9 +86,7 @@ def test_create(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.post(url, data, content_type='application/json') assert response.status_code == status_map['create'][username], response.json() @@ -118,8 +116,6 @@ def test_create_page(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'pages': [page.id] } response = client.post(url, data, content_type='application/json') @@ -156,8 +152,6 @@ def test_create_parent(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'parents': [parent.id] } response = client.post(url, data, content_type='application/json') @@ -199,8 +193,6 @@ def test_create_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': questionsets, 'questions': questions, 'conditions': conditions @@ -245,9 +237,7 @@ def test_update(db, client, username, password): 'help_en': instance.help_lang1, 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, - 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2 + 'verbose_name_de': instance.verbose_name_lang2 } response = client.put(url, data, content_type='application/json') assert response.status_code == get_obj_perms_status_code(instance, username, 'update'), response.json() @@ -289,8 +279,6 @@ def test_update_m2m(db, client, username, password): 'help_de': instance.help_lang2, 'verbose_name_en': instance.verbose_name_lang1, 'verbose_name_de': instance.verbose_name_lang2, - 'verbose_name_plural_en': instance.verbose_name_plural_lang1, - 'verbose_name_plural_de': instance.verbose_name_plural_lang2, 'questionsets': questionsets, 'questions': questions, 'conditions': conditions diff --git a/rdmo/services/providers.py b/rdmo/services/providers.py index 41b6530224..d8262161dd 100644 --- a/rdmo/services/providers.py +++ b/rdmo/services/providers.py @@ -1,14 +1,13 @@ import logging from urllib.parse import urlencode -from django.conf import settings from django.http import HttpResponseRedirect from django.shortcuts import render -from django.urls import reverse from django.utils.crypto import get_random_string from django.utils.translation import gettext_lazy as _ import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder logger = logging.getLogger(__name__) @@ -25,14 +24,14 @@ def get(self, request, url): response = requests.get(url, headers=self.get_authorization_headers(access_token)) if response.status_code == 401: - logger.warn('get forbidden: %s (%s)', response.content, response.status_code) + logger.warning('get forbidden: %s (%s)', response.content, response.status_code) else: try: response.raise_for_status() return self.get_success(request, response) except requests.HTTPError: - logger.warn('get error: %s (%s)', response.content, response.status_code) + logger.warning('get error: %s (%s)', response.content, response.status_code) return render(request, 'core/error.html', { 'title': _('OAuth error'), @@ -40,27 +39,35 @@ def get(self, request, url): }, status=200) # if the above did not work authorize first - self.store_in_session(request, 'request', ('get', url, {})) + self.store_in_session(request, 'request', ('get', url)) return self.authorize(request) - def post(self, request, url, data): + def post(self, request, url, json=None, files=None, multipart=None): # get access token from the session access_token = self.get_from_session(request, 'access_token') if access_token: # if the access_token is available post to the upstream service - logger.debug('post: %s %s', url, data) - - response = requests.post(url, json=data, headers=self.get_authorization_headers(access_token)) + logger.debug('post: %s %s', url, json, files) + + if multipart is not None: + multipart_encoder = MultipartEncoder(fields=multipart) + headers = self.get_authorization_headers(access_token) + headers['Content-Type'] = multipart_encoder.content_type + response = requests.post(url, data=multipart_encoder, headers=headers) + elif files is not None: + response = requests.post(url, files=files, headers=self.get_authorization_headers(access_token)) + else: + response = requests.post(url, json=json, headers=self.get_authorization_headers(access_token)) if response.status_code == 401: - logger.warn('post forbidden: %s (%s)', response.content, response.status_code) + logger.warning('post forbidden: %s (%s)', response.content, response.status_code) else: try: response.raise_for_status() return self.post_success(request, response) except requests.HTTPError: - logger.warn('post error: %s (%s)', response.content, response.status_code) + logger.warning('post error: %s (%s)', response.content, response.status_code) return render(request, 'core/error.html', { 'title': _('OAuth error'), @@ -68,7 +75,7 @@ def post(self, request, url, data): }, status=200) # if the above did not work authorize first - self.store_in_session(request, 'request', ('post', url, data)) + self.store_in_session(request, 'request', ('post', url, json, files, multipart)) return self.authorize(request) def authorize(self, request): @@ -105,11 +112,11 @@ def callback(self, request): # get post data from session try: - method, url, data = self.pop_from_session(request, 'request') + method, *args = self.pop_from_session(request, 'request') if method == 'get': - return self.get(request, url) + return self.get(request, *args) elif method == 'post': - return self.post(request, url, data) + return self.post(request, *args) except ValueError: pass @@ -159,95 +166,3 @@ def get_callback_data(self, request): def get_error_message(self, response): return response.json().get('error') - - -class GitHubProviderMixin(OauthProviderMixin): - authorize_url = 'https://github.com/login/oauth/authorize' - token_url = 'https://github.com/login/oauth/access_token' - api_url = 'https://api.github.com' - - @property - def client_id(self): - return settings.GITHUB_PROVIDER['client_id'] - - @property - def client_secret(self): - return settings.GITHUB_PROVIDER['client_secret'] - - @property - def redirect_path(self): - return reverse('oauth_callback', args=['github']) - - def get_authorization_headers(self, access_token): - return { - 'Authorization': f'token {access_token}', - 'Accept': 'application/vnd.github.v3+json' - } - - def get_authorize_params(self, request, state): - return { - 'authorize_url': self.authorize_url, - 'client_id': self.client_id, - 'redirect_uri': request.build_absolute_uri(self.redirect_path), - 'scope': 'repo', - 'state': state, - } - - def get_callback_params(self, request): - return { - 'token_url': self.token_url, - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'code': request.GET.get('code') - } - - -class GitLabProviderMixin(OauthProviderMixin): - - @property - def gitlab_url(self): - return settings.GITLAB_PROVIDER['gitlab_url'].strip('/') - - @property - def authorize_url(self): - return f'{self.gitlab_url}/oauth/authorize' - - @property - def token_url(self): - return f'{self.gitlab_url}/oauth/token' - - @property - def api_url(self): - return f'{self.gitlab_url}/api/v4' - - @property - def client_id(self): - return settings.GITLAB_PROVIDER['client_id'] - - @property - def client_secret(self): - return settings.GITLAB_PROVIDER['client_secret'] - - @property - def redirect_path(self): - return reverse('oauth_callback', args=['gitlab']) - - def get_authorize_params(self, request, state): - return { - 'authorize_url': self.authorize_url, - 'client_id': self.client_id, - 'redirect_uri': request.build_absolute_uri(self.redirect_path), - 'response_type': 'code', - 'scope': 'api', - 'state': state, - } - - def get_callback_params(self, request): - return { - 'token_url': self.token_url, - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'code': request.GET.get('code'), - 'grant_type': 'authorization_code', - 'redirect_uri': request.build_absolute_uri(self.redirect_path) - } diff --git a/rdmo/tasks/admin.py b/rdmo/tasks/admin.py index bb2c85c429..cee88ce3d8 100644 --- a/rdmo/tasks/admin.py +++ b/rdmo/tasks/admin.py @@ -12,13 +12,40 @@ class TaskAdminForm(forms.ModelForm): class Meta: model = Task - fields = '__all__' + fields = [ + "uri", + "uri_prefix", + "uri_path", + "comment", + "locked", + "catalogs", + "sites", + "editors", + "groups", + "title_lang1", + "title_lang2", + "title_lang3", + "title_lang4", + "title_lang5", + "text_lang1", + "text_lang2", + "text_lang3", + "text_lang4", + "text_lang5", + "start_attribute", + "end_attribute", + "days_before", + "days_after", + "conditions", + "available", + ] def clean(self): TaskUniqueURIValidator(self.instance)(self.cleaned_data) TaskLockedValidator(self.instance)(self.cleaned_data) +@admin.register(Task) class TaskAdmin(admin.ModelAdmin): form = TaskAdminForm @@ -27,6 +54,3 @@ class TaskAdmin(admin.ModelAdmin): readonly_fields = ('uri', ) list_filter = ('available', ) filter_horizontal = ('catalogs', 'sites', 'editors', 'groups', 'conditions') - - -admin.site.register(Task, TaskAdmin) diff --git a/rdmo/tasks/imports.py b/rdmo/tasks/imports.py index 7631d1be44..2f9ef7dca8 100644 --- a/rdmo/tasks/imports.py +++ b/rdmo/tasks/imports.py @@ -25,6 +25,8 @@ def import_task(element, save=False, user=None): set_common_fields(task, element) + task.order = element.get('order') or 0 + set_lang_field(task, 'title', element) set_lang_field(task, 'text', element) diff --git a/rdmo/tasks/migrations/0036_task_order.py b/rdmo/tasks/migrations/0036_task_order.py new file mode 100644 index 0000000000..868c80706f --- /dev/null +++ b/rdmo/tasks/migrations/0036_task_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0035_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='order', + field=models.IntegerField(default=0, help_text='The position of this task in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/tasks/migrations/0037_alter_help_text.py b/rdmo/tasks/migrations/0037_alter_help_text.py new file mode 100644 index 0000000000..7ff0452b24 --- /dev/null +++ b/rdmo/tasks/migrations/0037_alter_help_text.py @@ -0,0 +1,63 @@ +# Generated by Django 4.2.6 on 2023-12-04 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0036_task_order'), + ] + + operations = [ + migrations.AlterField( + model_name='task', + name='text_lang1', + field=models.TextField(blank=True, help_text='The text for this task (in the primary language).', verbose_name='Text (primary)'), + ), + migrations.AlterField( + model_name='task', + name='text_lang2', + field=models.TextField(blank=True, help_text='The text for this task (in the secondary language).', verbose_name='Text (secondary)'), + ), + migrations.AlterField( + model_name='task', + name='text_lang3', + field=models.TextField(blank=True, help_text='The text for this task (in the tertiary language).', verbose_name='Text (tertiary)'), + ), + migrations.AlterField( + model_name='task', + name='text_lang4', + field=models.TextField(blank=True, help_text='The text for this task (in the quaternary language).', verbose_name='Text (quaternary)'), + ), + migrations.AlterField( + model_name='task', + name='text_lang5', + field=models.TextField(blank=True, help_text='The text for this task (in the quinary language).', verbose_name='Text (quinary)'), + ), + migrations.AlterField( + model_name='task', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this task (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='task', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this task (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='task', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this task (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='task', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this task (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='task', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this task (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + ] diff --git a/rdmo/tasks/models.py b/rdmo/tasks/models.py index eef1a0c682..3a5891feda 100644 --- a/rdmo/tasks/models.py +++ b/rdmo/tasks/models.py @@ -15,8 +15,6 @@ class Task(TranslationMixin, models.Model): - objects = TaskManager() - uri = models.URLField( max_length=800, blank=True, verbose_name=_('URI'), @@ -42,6 +40,11 @@ class Task(TranslationMixin, models.Model): verbose_name=_('Locked'), help_text=_('Designates whether this task can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this task in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), @@ -66,52 +69,52 @@ class Task(TranslationMixin, models.Model): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this task in the primary language.') + help_text=_('The title for this task (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this task in the secondary language.') + help_text=_('The title for this task (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this task in the tertiary language.') + help_text=_('The title for this task (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this task in the quaternary language.') + help_text=_('The title for this task (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this task in the quinary language.') + help_text=_('The title for this task (in the quinary language).') ) text_lang1 = models.TextField( blank=True, verbose_name=_('Text (primary)'), - help_text=_('The text for this task in the primary language.') + help_text=_('The text for this task (in the primary language).') ) text_lang2 = models.TextField( blank=True, verbose_name=_('Text (secondary)'), - help_text=_('The text for this task in the secondary language.') + help_text=_('The text for this task (in the secondary language).') ) text_lang3 = models.TextField( blank=True, verbose_name=_('Text (tertiary)'), - help_text=_('The text for this task in the tertiary language.') + help_text=_('The text for this task (in the tertiary language).') ) text_lang4 = models.TextField( blank=True, verbose_name=_('Text (quaternary)'), - help_text=_('The text for this task in the quaternary language.') + help_text=_('The text for this task (in the quaternary language).') ) text_lang5 = models.TextField( blank=True, verbose_name=_('Text (quinary)'), - help_text=_('The text for this task in the quinary language.') + help_text=_('The text for this task (in the quinary language).') ) start_attribute = models.ForeignKey( Attribute, blank=True, null=True, on_delete=models.SET_NULL, related_name='tasks_as_start', @@ -145,6 +148,8 @@ class Task(TranslationMixin, models.Model): help_text=_('Designates whether this task is generally available for projects.') ) + objects = TaskManager() + class Meta: ordering = ('uri',) verbose_name = _('Task') diff --git a/rdmo/tasks/renderers/mixins.py b/rdmo/tasks/renderers/mixins.py index 48e879c50c..adb6d1cc9c 100644 --- a/rdmo/tasks/renderers/mixins.py +++ b/rdmo/tasks/renderers/mixins.py @@ -11,6 +11,7 @@ def render_task(self, xml, task): self.render_text_element(xml, 'uri_prefix', {}, task['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, task['uri_path']) self.render_text_element(xml, 'dc:comment', {}, task['comment']) + self.render_text_element(xml, 'order', {}, task['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, task['title_%s' % lang_code]) diff --git a/rdmo/tasks/serializers/export.py b/rdmo/tasks/serializers/export.py index 7de22136d8..8aa3a327a1 100644 --- a/rdmo/tasks/serializers/export.py +++ b/rdmo/tasks/serializers/export.py @@ -20,6 +20,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'start_attribute', 'end_attribute', 'days_before', diff --git a/rdmo/tasks/serializers/v1.py b/rdmo/tasks/serializers/v1.py index cebd38a415..424c0db487 100644 --- a/rdmo/tasks/serializers/v1.py +++ b/rdmo/tasks/serializers/v1.py @@ -21,6 +21,8 @@ class TaskSerializer(TranslationSerializerMixin, ElementModelSerializerMixin, warning = serializers.SerializerMethodField() read_only = serializers.SerializerMethodField() + condition_uris = serializers.SerializerMethodField() + projects_count = serializers.IntegerField(read_only=True) class Meta: @@ -33,6 +35,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites', @@ -47,6 +50,7 @@ class Meta: 'text', 'warning', 'read_only', + 'condition_uris', 'projects_count', ) trans_fields = ( @@ -61,6 +65,9 @@ class Meta: 'title', ) + def get_condition_uris(self, obj): + return [condition.uri for condition in obj.conditions.all()] + class TaskIndexSerializer(serializers.ModelSerializer): diff --git a/rdmo/views/admin.py b/rdmo/views/admin.py index 1cfebec9af..ef4da26fe9 100644 --- a/rdmo/views/admin.py +++ b/rdmo/views/admin.py @@ -12,13 +12,36 @@ class ViewAdminForm(forms.ModelForm): class Meta: model = View - fields = '__all__' + fields = [ + "uri", + "uri_prefix", + "uri_path", + "comment", + "locked", + "catalogs", + "sites", + "editors", + "groups", + "template", + "title_lang1", + "title_lang2", + "title_lang3", + "title_lang4", + "title_lang5", + "help_lang1", + "help_lang2", + "help_lang3", + "help_lang4", + "help_lang5", + "available", + ] def clean(self): ViewUniqueURIValidator(self.instance)(self.cleaned_data) ViewLockedValidator(self.instance)(self.cleaned_data) +@admin.register(View) class ViewAdmin(admin.ModelAdmin): form = ViewAdminForm @@ -27,6 +50,3 @@ class ViewAdmin(admin.ModelAdmin): readonly_fields = ('uri', ) list_filter = ('available', ) filter_horizontal = ('catalogs', 'sites', 'editors', 'groups') - - -admin.site.register(View, ViewAdmin) diff --git a/rdmo/views/imports.py b/rdmo/views/imports.py index 7c09061035..ce7a778cc2 100644 --- a/rdmo/views/imports.py +++ b/rdmo/views/imports.py @@ -18,6 +18,7 @@ def import_view(element, save=False, user=None): set_common_fields(view, element) + view.order = element.get('order') or 0 view.template = element.get('template') set_lang_field(view, 'title', element) diff --git a/rdmo/views/migrations/0029_view_order.py b/rdmo/views/migrations/0029_view_order.py new file mode 100644 index 0000000000..84fc690d19 --- /dev/null +++ b/rdmo/views/migrations/0029_view_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('views', '0028_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='view', + name='order', + field=models.IntegerField(default=0, help_text='The position of this view in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/views/migrations/0030_alter_help_text.py b/rdmo/views/migrations/0030_alter_help_text.py new file mode 100644 index 0000000000..1ff820431e --- /dev/null +++ b/rdmo/views/migrations/0030_alter_help_text.py @@ -0,0 +1,63 @@ +# Generated by Django 4.2.6 on 2023-12-04 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('views', '0029_view_order'), + ] + + operations = [ + migrations.AlterField( + model_name='view', + name='help_lang1', + field=models.TextField(blank=True, help_text='The help text for this view (in the primary language).', verbose_name='Help (primary)'), + ), + migrations.AlterField( + model_name='view', + name='help_lang2', + field=models.TextField(blank=True, help_text='The help text for this view (in the secondary language).', verbose_name='Help (secondary)'), + ), + migrations.AlterField( + model_name='view', + name='help_lang3', + field=models.TextField(blank=True, help_text='The help text for this view (in the tertiary language).', verbose_name='Help (tertiary)'), + ), + migrations.AlterField( + model_name='view', + name='help_lang4', + field=models.TextField(blank=True, help_text='The help text for this view (in the quaternary language).', verbose_name='Help (quaternary)'), + ), + migrations.AlterField( + model_name='view', + name='help_lang5', + field=models.TextField(blank=True, help_text='The help text for this view (in the quinary language).', verbose_name='Help (quinary)'), + ), + migrations.AlterField( + model_name='view', + name='title_lang1', + field=models.CharField(blank=True, help_text='The title for this view (in the primary language).', max_length=256, verbose_name='Title (primary)'), + ), + migrations.AlterField( + model_name='view', + name='title_lang2', + field=models.CharField(blank=True, help_text='The title for this view (in the secondary language).', max_length=256, verbose_name='Title (secondary)'), + ), + migrations.AlterField( + model_name='view', + name='title_lang3', + field=models.CharField(blank=True, help_text='The title for this view (in the tertiary language).', max_length=256, verbose_name='Title (tertiary)'), + ), + migrations.AlterField( + model_name='view', + name='title_lang4', + field=models.CharField(blank=True, help_text='The title for this view (in the quaternary language).', max_length=256, verbose_name='Title (quaternary)'), + ), + migrations.AlterField( + model_name='view', + name='title_lang5', + field=models.CharField(blank=True, help_text='The title for this view (in the quinary language).', max_length=256, verbose_name='Title (quinary)'), + ), + ] diff --git a/rdmo/views/models.py b/rdmo/views/models.py index 4f8561b7fd..e7aec7e855 100644 --- a/rdmo/views/models.py +++ b/rdmo/views/models.py @@ -16,8 +16,6 @@ class View(models.Model, TranslationMixin): - objects = ViewManager() - uri = models.URLField( max_length=800, blank=True, verbose_name=_('URI'), @@ -43,6 +41,11 @@ class View(models.Model, TranslationMixin): verbose_name=_('Locked'), help_text=_('Designates whether this view can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this view in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), @@ -72,52 +75,52 @@ class View(models.Model, TranslationMixin): title_lang1 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (primary)'), - help_text=_('The title for this view in the primary language.') + help_text=_('The title for this view (in the primary language).') ) title_lang2 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (secondary)'), - help_text=_('The title for this view in the secondary language.') + help_text=_('The title for this view (in the secondary language).') ) title_lang3 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (tertiary)'), - help_text=_('The title for this view in the tertiary language.') + help_text=_('The title for this view (in the tertiary language).') ) title_lang4 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quaternary)'), - help_text=_('The title for this view in the quaternary language.') + help_text=_('The title for this view (in the quaternary language).') ) title_lang5 = models.CharField( max_length=256, blank=True, verbose_name=_('Title (quinary)'), - help_text=_('The title for this view in the quinary language.') + help_text=_('The title for this view (in the quinary language).') ) help_lang1 = models.TextField( blank=True, verbose_name=_('Help (primary)'), - help_text=_('The help text for this view in the primary language.') + help_text=_('The help text for this view (in the primary language).') ) help_lang2 = models.TextField( blank=True, verbose_name=_('Help (secondary)'), - help_text=_('The help text for this view in the secondary language.') + help_text=_('The help text for this view (in the secondary language).') ) help_lang3 = models.TextField( blank=True, verbose_name=_('Help (tertiary)'), - help_text=_('The help text for this view in the tertiary language.') + help_text=_('The help text for this view (in the tertiary language).') ) help_lang4 = models.TextField( blank=True, verbose_name=_('Help (quaternary)'), - help_text=_('The help text for this view in the quaternary language.') + help_text=_('The help text for this view (in the quaternary language).') ) help_lang5 = models.TextField( blank=True, verbose_name=_('Help (quinary)'), - help_text=_('The help text for this view in the quinary language.') + help_text=_('The help text for this view (in the quinary language).') ) available = models.BooleanField( default=True, @@ -125,6 +128,8 @@ class View(models.Model, TranslationMixin): help_text=_('Designates whether this view is generally available for projects.') ) + objects = ViewManager() + class Meta: ordering = ('uri', ) verbose_name = _('View') diff --git a/rdmo/views/renderers/mixins.py b/rdmo/views/renderers/mixins.py index 31971975d1..f6ee263d70 100644 --- a/rdmo/views/renderers/mixins.py +++ b/rdmo/views/renderers/mixins.py @@ -11,6 +11,7 @@ def render_view(self, xml, view): self.render_text_element(xml, 'uri_prefix', {}, view['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, view['uri_path']) self.render_text_element(xml, 'dc:comment', {}, view['comment']) + self.render_text_element(xml, 'order', {}, view['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, view['title_%s' % lang_code]) diff --git a/rdmo/views/serializers/export.py b/rdmo/views/serializers/export.py index 3dc6b6ebf3..d8d2527472 100644 --- a/rdmo/views/serializers/export.py +++ b/rdmo/views/serializers/export.py @@ -16,6 +16,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'catalogs', 'template' ) diff --git a/rdmo/views/serializers/v1.py b/rdmo/views/serializers/v1.py index 5862537a29..6b07fe63de 100644 --- a/rdmo/views/serializers/v1.py +++ b/rdmo/views/serializers/v1.py @@ -46,6 +46,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites', diff --git a/testing/config/settings/base.py b/testing/config/settings/base.py index 270ec4ea20..2d8720fcf3 100644 --- a/testing/config/settings/base.py +++ b/testing/config/settings/base.py @@ -2,7 +2,7 @@ from django.utils.translation import gettext_lazy as _ -DEBUG = False +DEBUG = os.getenv("DJANGO_DEBUG", False) == "True" TEMPLATE_DEBUG = False DEBUG_LOGGING = False @@ -79,10 +79,5 @@ ] PROJECT_ISSUE_PROVIDERS = [ - ('github', _('GitHub'), 'rdmo.projects.providers.GitHubIssueProvider') + ('simple', _('Simple provider'), 'rdmo.projects.providers.SimpleIssueProvider') ] - -GITHUB_PROVIDER = { - 'client_id': '', - 'client_secret': '' -} diff --git a/testing/export/project.csv b/testing/export/project.csv index 1092d726f6..6d1bf98884 100644 --- a/testing/export/project.csv +++ b/testing/export/project.csv @@ -1,7 +1,7 @@ Text?,,Lorem ipsum dolor sit amet Textarea?,,"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet." Yes or no?,,Yes -Radio buttons?,,Other: Lorem ipsum +Radio buttons?,,Text: Lorem ipsum Select drop-down?,,One Range slider?,,37 File?,,rdmo-logo.svg @@ -18,7 +18,7 @@ Checkbox?,,One; Three Text?,,Lorem ipsum dolor sit amet Textarea?,,"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet." Yes or no?,,Yes -Radio buttons?,,Other: Lorem ipsum +Radio buttons?,,Text: Lorem ipsum Select drop-down?,,One Range slider?,,37 Date picker?,,2018-01-01 diff --git a/testing/export/project.html b/testing/export/project.html index aba80183d7..b961e65aa4 100644 --- a/testing/export/project.html +++ b/testing/export/project.html @@ -23,7 +23,7 @@ <h3>Yes or no</h3> <h3>Radio buttons</h3> <p><strong>Radio buttons?</strong></p> <p> -<span>Other: Lorem ipsum</span> +<span>Text: Lorem ipsum</span> </p> <h3>Select drop-down</h3> <p><strong>Select drop-down?</strong></p> @@ -171,7 +171,7 @@ <h3>Individual sets I</h3> </p> <p><strong>Radio buttons?</strong></p> <p> -<span>Other: Lorem ipsum</span> +<span>Text: Lorem ipsum</span> </p> <p><strong>Select drop-down?</strong></p> <p> diff --git a/testing/fixtures/options.json b/testing/fixtures/options.json index 7bff355451..7b682a9bbf 100644 --- a/testing/fixtures/options.json +++ b/testing/fixtures/options.json @@ -99,9 +99,9 @@ "model": "options.optionsetoption", "pk": 1, "fields": { - "optionset": 3, - "option": 8, - "order": 4 + "optionset": 1, + "option": 1, + "order": 1 } }, { @@ -109,17 +109,17 @@ "pk": 2, "fields": { "optionset": 1, - "option": 1, - "order": 1 + "option": 2, + "order": 2 } }, { "model": "options.optionsetoption", "pk": 3, "fields": { - "optionset": 2, - "option": 4, - "order": 1 + "optionset": 1, + "option": 3, + "order": 3 } }, { @@ -127,8 +127,8 @@ "pk": 4, "fields": { "optionset": 2, - "option": 7, - "order": 4 + "option": 4, + "order": 1 } }, { @@ -136,8 +136,8 @@ "pk": 5, "fields": { "optionset": 2, - "option": 6, - "order": 3 + "option": 5, + "order": 2 } }, { @@ -145,33 +145,33 @@ "pk": 6, "fields": { "optionset": 2, - "option": 5, - "order": 2 + "option": 6, + "order": 3 } }, { "model": "options.optionsetoption", "pk": 7, "fields": { - "optionset": 1, - "option": 3, - "order": 3 + "optionset": 2, + "option": 7, + "order": 4 } }, { "model": "options.optionsetoption", "pk": 8, "fields": { - "optionset": 1, - "option": 2, - "order": 2 + "optionset": 2, + "option": 8, + "order": 5 } }, { "model": "options.optionsetoption", "pk": 9, "fields": { - "optionset": 5, + "optionset": 3, "option": 9, "order": 1 } @@ -182,16 +182,16 @@ "fields": { "optionset": 5, "option": 10, - "order": 2 + "order": 1 } }, { "model": "options.optionsetoption", "pk": 11, "fields": { - "optionset": 6, + "optionset": 5, "option": 11, - "order": 1 + "order": 2 } }, { @@ -200,6 +200,15 @@ "fields": { "optionset": 6, "option": 12, + "order": 1 + } + }, + { + "model": "options.optionsetoption", + "pk": 13, + "fields": { + "optionset": 6, + "option": 13, "order": 2 } }, @@ -217,7 +226,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -235,7 +244,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -253,7 +262,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -271,7 +280,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -289,7 +298,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -307,7 +316,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [] } }, @@ -315,23 +324,41 @@ "model": "options.option", "pk": 7, "fields": { - "uri": "http://example.com/terms/options/one_two_three_other/other", + "uri": "http://example.com/terms/options/one_two_three_other/text", "uri_prefix": "http://example.com/terms", - "uri_path": "one_two_three_other/other", + "uri_path": "one_two_three_other/text", "comment": "", "locked": false, - "text_lang1": "Other", - "text_lang2": "Sonstige", + "text_lang1": "Text", + "text_lang2": "Text", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": true, + "additional_input": "text", "editors": [] } }, { "model": "options.option", "pk": 8, + "fields": { + "uri": "http://example.com/terms/options/one_two_three_other/textarea", + "uri_prefix": "http://example.com/terms", + "uri_path": "one_two_three_other/textarea", + "comment": "", + "locked": false, + "text_lang1": "Text", + "text_lang2": "Text", + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "additional_input": "textarea", + "editors": [] + } + }, + { + "model": "options.option", + "pk": 9, "fields": { "uri": "http://example.com/terms/options/condition/other", "uri_prefix": "http://example.com/terms", @@ -343,13 +370,13 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": true, + "additional_input": "text", "editors": [] } }, { "model": "options.option", - "pk": 9, + "pk": 10, "fields": { "uri": "https://foo.com/terms/options/foo-option-1", "uri_prefix": "https://foo.com/terms", @@ -361,7 +388,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [ 2 ] @@ -369,7 +396,7 @@ }, { "model": "options.option", - "pk": 10, + "pk": 11, "fields": { "uri": "https://foo.com/terms/options/foo-option-2", "uri_prefix": "https://foo.com/terms", @@ -381,7 +408,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [ 2 ] @@ -389,7 +416,7 @@ }, { "model": "options.option", - "pk": 11, + "pk": 12, "fields": { "uri": "https://bar.com/terms/options/bar-option-1", "uri_prefix": "https://bar.com/terms", @@ -401,7 +428,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [ 3 ] @@ -409,7 +436,7 @@ }, { "model": "options.option", - "pk": 12, + "pk": 13, "fields": { "uri": "https://bar.com/terms/options/bar-option-2", "uri_prefix": "https://bar.com/terms", @@ -421,7 +448,7 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "additional_input": false, + "additional_input": "", "editors": [ 3 ] diff --git a/testing/fixtures/projects.json b/testing/fixtures/projects.json index 791f1a7493..59bfbb2cc9 100644 --- a/testing/fixtures/projects.json +++ b/testing/fixtures/projects.json @@ -15,7 +15,7 @@ "pk": 1, "fields": { "project": 1, - "provider_key": "github" + "provider_key": "simple" } }, { @@ -23,7 +23,7 @@ "pk": 2, "fields": { "project": 2, - "provider_key": "github" + "provider_key": "simple" } }, { @@ -31,8 +31,8 @@ "pk": 1, "fields": { "integration": 1, - "key": "repo", - "value": "example/example", + "key": "project_url", + "value": "https://example.com/projects/1", "secret": false } }, @@ -51,8 +51,8 @@ "pk": 3, "fields": { "integration": 2, - "key": "repo", - "value": "example/example", + "key": "project_url", + "value": "https://example.com/projects/1", "secret": false } }, @@ -135,7 +135,7 @@ "fields": { "issue": 1, "integration": 1, - "url": "https://github.com/example/example/issues/1" + "url": "https://simple.example.com/issues/1" } }, { diff --git a/testing/fixtures/questions.json b/testing/fixtures/questions.json index 0cde0b834f..4db230d2d9 100644 --- a/testing/fixtures/questions.json +++ b/testing/fixtures/questions.json @@ -223,11 +223,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -260,11 +255,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -297,11 +287,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -334,11 +319,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -357,7 +337,7 @@ "attribute": null, "is_collection": false, "title_lang1": "Select drop-down", - "title_lang2": "Select-Aufklappmen\u00fc", + "title_lang2": "Select-Aufklappmenü", "title_lang3": "", "title_lang4": "", "title_lang5": "", @@ -371,11 +351,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -408,11 +383,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -445,11 +415,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -482,11 +447,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -519,11 +479,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -556,11 +511,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -593,11 +543,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -616,7 +561,7 @@ "attribute": null, "is_collection": false, "title_lang1": "Select drop-down", - "title_lang2": "Select-Aufklappmen\u00fc", + "title_lang2": "Select-Aufklappmenü", "title_lang3": "", "title_lang4": "", "title_lang5": "", @@ -630,11 +575,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -667,11 +607,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -704,11 +639,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -741,11 +671,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -778,11 +703,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -815,11 +735,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -852,11 +767,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -889,11 +799,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -926,11 +831,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 3 @@ -965,11 +865,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 8 @@ -1004,11 +899,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 1 @@ -1043,11 +933,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 4 @@ -1082,11 +967,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 5 @@ -1121,11 +1001,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 6 @@ -1160,11 +1035,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 7 @@ -1199,11 +1069,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 9 @@ -1238,11 +1103,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 2 @@ -1277,11 +1137,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 13 @@ -1316,11 +1171,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 10 @@ -1355,11 +1205,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 14 @@ -1394,11 +1239,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 11 @@ -1433,11 +1273,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1470,11 +1305,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1507,11 +1337,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1544,11 +1369,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1581,11 +1401,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1618,11 +1433,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1655,11 +1465,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1692,11 +1497,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1729,11 +1529,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1766,11 +1561,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1803,11 +1593,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1840,11 +1625,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1877,11 +1657,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1914,11 +1689,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1951,11 +1721,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -1988,11 +1753,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 3 @@ -2027,11 +1787,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [ 2 ], @@ -2066,11 +1821,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [ 3 ], @@ -2889,15 +2639,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Text?", - "text_lang2": "\ufffcText?", + "text_lang2": "Text?", "text_lang3": "", "text_lang4": "", "text_lang5": "", "default_text_lang1": "Text", "default_text_lang2": "Text", - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -2905,11 +2655,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -2948,9 +2693,9 @@ "text_lang5": "", "default_text_lang1": "Textarea", "default_text_lang2": "Textarea", - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -2958,11 +2703,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -3001,9 +2741,9 @@ "text_lang5": "", "default_text_lang1": "1", "default_text_lang2": "1", - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3011,11 +2751,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -3052,11 +2787,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": 4, "default_external_id": "", "verbose_name_lang1": "", @@ -3064,11 +2799,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -3103,15 +2833,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": 1, "default_external_id": "", "verbose_name_lang1": "", @@ -3119,11 +2849,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -3164,9 +2889,9 @@ "text_lang5": "", "default_text_lang1": "20", "default_text_lang2": "20", - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3174,11 +2899,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -3217,9 +2937,9 @@ "text_lang5": "", "default_text_lang1": "2020-01-01", "default_text_lang2": "2020-01-01", - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3227,11 +2947,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -3264,15 +2979,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Text?", - "text_lang2": "\ufffcText?", + "text_lang2": "Text?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3280,11 +2995,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -3321,11 +3031,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3333,11 +3043,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -3374,11 +3079,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3386,11 +3091,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -3427,11 +3127,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3439,11 +3139,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -3478,15 +3173,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3494,11 +3189,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -3537,11 +3227,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3549,11 +3239,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -3590,11 +3275,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3602,11 +3287,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -3643,11 +3323,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3655,11 +3335,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "checkbox", "value_type": "option", "minimum": null, @@ -3698,11 +3373,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3710,11 +3385,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -3751,11 +3421,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3763,11 +3433,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -3804,11 +3469,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3816,11 +3481,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -3857,11 +3517,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3869,11 +3529,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -3910,11 +3565,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3922,11 +3577,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -3963,11 +3613,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -3975,11 +3625,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -4016,11 +3661,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4028,11 +3673,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -4067,15 +3707,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4083,11 +3723,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -4126,11 +3761,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4138,11 +3773,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -4179,11 +3809,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4191,11 +3821,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -4232,11 +3857,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4244,11 +3869,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -4283,15 +3903,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4299,11 +3919,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -4342,11 +3957,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4354,11 +3969,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -4395,11 +4005,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4407,11 +4017,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -4448,11 +4053,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4460,11 +4065,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "checkbox", "value_type": "option", "minimum": null, @@ -4503,11 +4103,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4515,11 +4115,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -4556,11 +4151,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4568,11 +4163,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -4609,11 +4199,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4621,11 +4211,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -4662,11 +4247,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4674,11 +4259,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -4713,15 +4293,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4729,11 +4309,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -4772,11 +4347,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4784,11 +4359,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -4825,11 +4395,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4837,11 +4407,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -4878,11 +4443,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4890,11 +4455,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -4931,11 +4491,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4943,11 +4503,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "textarea", "value_type": "text", "minimum": null, @@ -4984,11 +4539,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -4996,11 +4551,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -5037,11 +4587,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5049,11 +4599,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -5088,15 +4633,15 @@ "help_lang4": "", "help_lang5": "", "text_lang1": "Select drop-down?", - "text_lang2": "Select-Aufklappmen\u00fc?", + "text_lang2": "Select-Aufklappmenü?", "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5104,11 +4649,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "option", "minimum": null, @@ -5147,11 +4687,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5159,11 +4699,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "range", "value_type": "float", "minimum": null, @@ -5200,11 +4735,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5212,11 +4747,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "date", "value_type": "datetime", "minimum": null, @@ -5253,11 +4783,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5265,11 +4795,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "checkbox", "value_type": "option", "minimum": null, @@ -5308,11 +4833,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5320,11 +4845,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5361,11 +4881,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5373,11 +4893,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5414,11 +4929,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5426,11 +4941,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5467,11 +4977,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5479,11 +4989,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5520,11 +5025,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5532,11 +5037,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5573,11 +5073,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5585,11 +5085,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5626,11 +5121,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5638,11 +5133,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5679,11 +5169,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5691,11 +5181,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5732,23 +5217,18 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, - "default_option": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", + "default_option": null, "default_external_id": "", "verbose_name_lang1": "", "verbose_name_lang2": "", "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -5785,11 +5265,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5797,11 +5277,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -5840,11 +5315,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5852,11 +5327,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -5895,11 +5365,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5907,11 +5377,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -5950,11 +5415,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -5962,11 +5427,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "option", "minimum": null, @@ -6005,11 +5465,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6017,11 +5477,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "checkbox", "value_type": "text", "minimum": null, @@ -6061,11 +5516,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6073,11 +5528,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "text", "minimum": null, @@ -6116,11 +5566,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6128,11 +5578,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "select", "value_type": "text", "minimum": null, @@ -6171,11 +5616,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6183,11 +5628,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "checkbox", "value_type": "text", "minimum": null, @@ -6226,11 +5666,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6238,11 +5678,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "text", "minimum": null, @@ -6267,26 +5702,26 @@ "uri": "http://example.com/terms/questions/catalog/individual/file/file", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/individual/file/file", - "comment": null, + "comment": "", "locked": false, "attribute": 96, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "File?", "text_lang2": "File?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6294,11 +5729,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6320,26 +5750,26 @@ "uri": "http://example.com/terms/questions/catalog/collections/file/file", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/collections/file/file", - "comment": null, + "comment": "", "locked": false, "attribute": 98, "is_collection": true, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "File?", "text_lang2": "File?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6347,11 +5777,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6373,26 +5798,26 @@ "uri": "http://example.com/terms/questions/catalog/set/individual-single/file", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/set/individual-single/file", - "comment": null, + "comment": "", "locked": false, "attribute": 96, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "File?", "text_lang2": "File?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6400,11 +5825,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6426,26 +5846,26 @@ "uri": "http://example.com/terms/questions/catalog/set/individual-collection/file", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/set/individual-collection/file", - "comment": null, + "comment": "", "locked": false, "attribute": 98, "is_collection": true, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "File?", "text_lang2": "File?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6453,11 +5873,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6494,11 +5909,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6506,11 +5921,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6547,11 +5957,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6559,11 +5969,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "file", "value_type": "file", "minimum": null, @@ -6587,26 +5992,26 @@ "uri": "http://example.com/terms/questions/catalog/individual/autocomplete/autocomplete", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/individual/autocomplete/autocomplete", - "comment": null, + "comment": "", "locked": false, "attribute": 102, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Autocomplete?", "text_lang2": "Autocomplete?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": 1, "default_external_id": "", "verbose_name_lang1": "", @@ -6614,11 +6019,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "text", "minimum": null, @@ -6642,26 +6042,26 @@ "uri": "http://example.com/terms/questions/catalog/collections/autocomplete/autocomplete", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/collections/autocomplete/autocomplete", - "comment": null, + "comment": "", "locked": false, "attribute": 103, "is_collection": true, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Autocomplete?", "text_lang2": "Autocomplete?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6669,11 +6069,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "text", "minimum": null, @@ -6712,11 +6107,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6724,11 +6119,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "option", "minimum": null, @@ -6767,11 +6157,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6779,11 +6169,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "option", "minimum": null, @@ -6822,11 +6207,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6834,11 +6219,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "option", "minimum": null, @@ -6877,11 +6257,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6889,11 +6269,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "option", "minimum": null, @@ -6932,11 +6307,11 @@ "text_lang3": "", "text_lang4": "", "text_lang5": "", - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "simple_1", "verbose_name_lang1": "", @@ -6944,11 +6319,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "text", "minimum": null, @@ -6972,26 +6342,26 @@ "uri": "http://example.com/terms/questions/catalog/blocks/set/block/c", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/blocks/set/block/c", - "comment": null, + "comment": "", "locked": false, "attribute": 110, "is_collection": true, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "C?", "text_lang2": "C?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -6999,11 +6369,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7025,26 +6390,26 @@ "uri": "http://example.com/terms/questions/catalog/blocks/set/block/a", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/blocks/set/block/a", - "comment": null, + "comment": "", "locked": false, "attribute": 108, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "A?", "text_lang2": "A?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7052,11 +6417,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7078,26 +6438,26 @@ "uri": "http://example.com/terms/questions/catalog/blocks/set/block/b", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/blocks/set/block/b", - "comment": null, + "comment": "", "locked": false, "attribute": 109, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "B?", "text_lang2": "B?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7105,11 +6465,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7131,26 +6486,26 @@ "uri": "http://example.com/terms/questions/catalog/blocks/set/block/block/y", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/blocks/set/block/block/y", - "comment": null, + "comment": "", "locked": false, "attribute": 112, "is_collection": false, "is_optional": true, "help_lang1": "Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.", "help_lang2": "Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit amet.", - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Y?", "text_lang2": "Y?", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", "default_text_lang1": "", - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": 3, "default_external_id": "", "verbose_name_lang1": "", @@ -7158,11 +6513,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "autocomplete", "value_type": "text", "minimum": null, @@ -7186,26 +6536,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/input/text", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/input/text", - "comment": null, + "comment": "", "locked": false, "attribute": 81, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Text", "text_lang2": "Text", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7213,11 +6563,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7239,26 +6584,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/input/option", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/input/option", - "comment": null, + "comment": "", "locked": false, "attribute": 82, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Option", "text_lang2": "Option", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7266,11 +6611,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "text", "minimum": null, @@ -7294,26 +6634,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/set/bool", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/set/bool", - "comment": null, + "comment": "", "locked": false, "attribute": 114, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Yes/No", "text_lang2": "Ja/Nein", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7321,11 +6661,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -7347,26 +6682,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/set_set/bool", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/set_set/bool", - "comment": null, + "comment": "", "locked": false, "attribute": 114, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Yes/No", "text_lang2": "Ja/Nein", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7374,11 +6709,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -7400,26 +6730,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/set_set/set/text", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/set_set/set/text", - "comment": null, + "comment": "", "locked": false, "attribute": 118, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Text", "text_lang2": "Text", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7427,11 +6757,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7453,26 +6778,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/set/text", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/set/text", - "comment": null, + "comment": "", "locked": false, "attribute": 115, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Text", "text_lang2": "Text", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7480,11 +6805,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7508,26 +6828,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/optionset/bool", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/optionset/bool", - "comment": null, + "comment": "", "locked": false, "attribute": 120, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Yes/No", "text_lang2": "Ja/Nein", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7535,11 +6855,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -7561,26 +6876,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/optionset/option", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/optionset/option", - "comment": null, + "comment": "", "locked": false, "attribute": 121, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Optionset", "text_lang2": "Optionset", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7588,11 +6903,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "radio", "value_type": "text", "minimum": null, @@ -7617,26 +6927,26 @@ "uri": "http://example.com/terms/questions/catalog/conditions/text_set/bool", "uri_prefix": "http://example.com/terms", "uri_path": "catalog/conditions/text_set/bool", - "comment": null, + "comment": "", "locked": false, "attribute": 114, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "Yes/No", "text_lang2": "Ja/Nein", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7644,11 +6954,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "yesno", "value_type": "boolean", "minimum": null, @@ -7697,11 +7002,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7727,26 +7027,26 @@ "uri": "https://bar.com/terms/questions/bar-question", "uri_prefix": "https://bar.com/terms", "uri_path": "bar-question", - "comment": null, + "comment": "", "locked": false, "attribute": 123, "is_collection": false, "is_optional": false, - "help_lang1": null, - "help_lang2": null, - "help_lang3": null, - "help_lang4": null, - "help_lang5": null, + "help_lang1": "", + "help_lang2": "", + "help_lang3": "", + "help_lang4": "", + "help_lang5": "", "text_lang1": "bar-question", "text_lang2": "bar-question", - "text_lang3": null, - "text_lang4": null, - "text_lang5": null, - "default_text_lang1": null, - "default_text_lang2": null, - "default_text_lang3": null, - "default_text_lang4": null, - "default_text_lang5": null, + "text_lang3": "", + "text_lang4": "", + "text_lang5": "", + "default_text_lang1": "", + "default_text_lang2": "", + "default_text_lang3": "", + "default_text_lang4": "", + "default_text_lang5": "", "default_option": null, "default_external_id": "", "verbose_name_lang1": "", @@ -7754,11 +7054,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "widget_type": "text", "value_type": "text", "minimum": null, @@ -7803,11 +7098,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -7840,11 +7130,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "blocks", - "verbose_name_plural_lang2": "Blocks", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [] } @@ -7877,11 +7162,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [], "conditions": [ 15 @@ -7916,11 +7196,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [ 2 ], @@ -7955,11 +7230,6 @@ "verbose_name_lang3": "", "verbose_name_lang4": "", "verbose_name_lang5": "", - "verbose_name_plural_lang1": "", - "verbose_name_plural_lang2": "", - "verbose_name_plural_lang3": "", - "verbose_name_plural_lang4": "", - "verbose_name_plural_lang5": "", "editors": [ 3 ], diff --git a/testing/xml/elements/attributes.xml b/testing/xml/elements/attributes.xml index 5f7c0fd66b..195fdeab6d 100644 --- a/testing/xml/elements/attributes.xml +++ b/testing/xml/elements/attributes.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:40:24.085182+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:40:24.085182+02:00" version="2.0.0"> <attribute dc:uri="http://example.com/terms/domain/blocks"> <uri_prefix>http://example.com/terms</uri_prefix> <key>blocks</key> diff --git a/testing/xml/elements/catalog.xml b/testing/xml/elements/catalog.xml index a5f31d6eb3..db57783feb 100644 --- a/testing/xml/elements/catalog.xml +++ b/testing/xml/elements/catalog.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:39.297292+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:39.297292+02:00" version="2.0.0"> <catalog dc:uri="http://example.com/terms/questions/catalog"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog</uri_path> diff --git a/testing/xml/elements/catalogs.xml b/testing/xml/elements/catalogs.xml index 9c6952031e..9831d829be 100644 --- a/testing/xml/elements/catalogs.xml +++ b/testing/xml/elements/catalogs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:39.297292+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:39.297292+02:00" version="2.0.0"> <catalog dc:uri="http://example.com/terms/questions/catalog"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog</uri_path> diff --git a/testing/xml/elements/conditions.xml b/testing/xml/elements/conditions.xml index 0afd835112..8e248e570f 100644 --- a/testing/xml/elements/conditions.xml +++ b/testing/xml/elements/conditions.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:37.642472+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:37.642472+02:00" version="2.0.0"> <condition dc:uri="http://example.com/terms/conditions/options_empty"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>options_empty</uri_path> diff --git a/testing/xml/elements/legacy/options.xml b/testing/xml/elements/legacy/options.xml index 6153971803..01118e9b05 100644 --- a/testing/xml/elements/legacy/options.xml +++ b/testing/xml/elements/legacy/options.xml @@ -103,15 +103,15 @@ <text lang="de">Drei</text> <additional_input>False</additional_input> </option> - <option dc:uri="http://example.com/terms/options/one_two_three_other/other"> + <option dc:uri="http://example.com/terms/options/one_two_three_other/text"> <uri_prefix>http://example.com/terms</uri_prefix> - <key>other</key> - <path>one_two_three_other/other</path> + <key>text</key> + <path>one_two_three_other/text</path> <dc:comment/> <optionset dc:uri="http://example.com/terms/options/one_two_three_other"/> <order>4</order> - <text lang="en">Other</text> - <text lang="de">Sonstige</text> + <text lang="en">Text</text> + <text lang="de">Text</text> <additional_input>True</additional_input> </option> <optionset dc:uri="http://example.com/terms/options/plugin"> diff --git a/testing/xml/elements/options.xml b/testing/xml/elements/options.xml index a2d141beb1..ccbe3743a5 100644 --- a/testing/xml/elements/options.xml +++ b/testing/xml/elements/options.xml @@ -1,67 +1,93 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:26.329822+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-10-04T11:01:19.794284+02:00" version="2.0.0"> <option dc:uri="http://example.com/terms/options/one_two_three/one"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three/one</uri_path> <dc:comment/> <text lang="en">One</text> + <help lang="en"/> <text lang="de">Eins</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three/two"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three/two</uri_path> <dc:comment/> <text lang="en">Two</text> + <help lang="en"/> <text lang="de">Zwei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three/three"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three/three</uri_path> <dc:comment/> <text lang="en">Three</text> + <help lang="en"/> <text lang="de">Drei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three_other/one"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three_other/one</uri_path> <dc:comment/> <text lang="en">One</text> + <help lang="en"/> <text lang="de">Eins</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three_other/two"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three_other/two</uri_path> <dc:comment/> <text lang="en">Two</text> + <help lang="en"/> <text lang="de">Zwei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three_other/three"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three_other/three</uri_path> <dc:comment/> <text lang="en">Three</text> + <help lang="en"/> <text lang="de">Drei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> - <option dc:uri="http://example.com/terms/options/one_two_three_other/other"> + <option dc:uri="http://example.com/terms/options/one_two_three_other/text"> <uri_prefix>http://example.com/terms</uri_prefix> - <uri_path>one_two_three_other/other</uri_path> + <uri_path>one_two_three_other/text</uri_path> <dc:comment/> - <text lang="en">Other</text> - <text lang="de">Sonstige</text> - <additional_input>True</additional_input> + <text lang="en">Text</text> + <help lang="en"/> + <text lang="de">Text</text> + <help lang="de"/> + <additional_input>text</additional_input> + </option> + <option dc:uri="http://example.com/terms/options/one_two_three_other/textarea"> + <uri_prefix>http://example.com/terms</uri_prefix> + <uri_path>one_two_three_other/textarea</uri_path> + <dc:comment/> + <text lang="en">Text</text> + <help lang="en"/> + <text lang="de">Text</text> + <help lang="de"/> + <additional_input>textarea</additional_input> </option> <option dc:uri="http://example.com/terms/options/condition/other"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>condition/other</uri_path> <dc:comment/> <text lang="en">Other</text> + <help lang="en"/> <text lang="de">Sonstige</text> - <additional_input>True</additional_input> + <help lang="de"/> + <additional_input>text</additional_input> </option> </rdmo> diff --git a/testing/xml/elements/optionsets.xml b/testing/xml/elements/optionsets.xml index b80c18cd14..d72fb54d63 100644 --- a/testing/xml/elements/optionsets.xml +++ b/testing/xml/elements/optionsets.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:20.530337+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-10-04T11:01:10.645345+02:00" version="2.0.0"> <optionset dc:uri="http://example.com/terms/options/condition"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>condition</uri_path> <dc:comment/> <provider_key/> <options> - <option dc:uri="http://example.com/terms/options/condition/other" order="4"/> + <option dc:uri="http://example.com/terms/options/condition/other" order="1"/> </options> <conditions> <condition dc:uri="http://example.com/terms/conditions/optionset_bool_is_true"/> @@ -17,8 +17,10 @@ <uri_path>condition/other</uri_path> <dc:comment/> <text lang="en">Other</text> + <help lang="en"/> <text lang="de">Sonstige</text> - <additional_input>True</additional_input> + <help lang="de"/> + <additional_input>text</additional_input> </option> <optionset dc:uri="http://example.com/terms/options/one_two_three"> <uri_prefix>http://example.com/terms</uri_prefix> @@ -37,24 +39,30 @@ <uri_path>one_two_three/one</uri_path> <dc:comment/> <text lang="en">One</text> + <help lang="en"/> <text lang="de">Eins</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three/two"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three/two</uri_path> <dc:comment/> <text lang="en">Two</text> + <help lang="en"/> <text lang="de">Zwei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three/three"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three/three</uri_path> <dc:comment/> <text lang="en">Three</text> + <help lang="en"/> <text lang="de">Drei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <optionset dc:uri="http://example.com/terms/options/one_two_three_other"> <uri_prefix>http://example.com/terms</uri_prefix> @@ -65,7 +73,8 @@ <option dc:uri="http://example.com/terms/options/one_two_three_other/one" order="1"/> <option dc:uri="http://example.com/terms/options/one_two_three_other/two" order="2"/> <option dc:uri="http://example.com/terms/options/one_two_three_other/three" order="3"/> - <option dc:uri="http://example.com/terms/options/one_two_three_other/other" order="4"/> + <option dc:uri="http://example.com/terms/options/one_two_three_other/text" order="4"/> + <option dc:uri="http://example.com/terms/options/one_two_three_other/textarea" order="5"/> </options> <conditions/> </optionset> @@ -74,32 +83,50 @@ <uri_path>one_two_three_other/one</uri_path> <dc:comment/> <text lang="en">One</text> + <help lang="en"/> <text lang="de">Eins</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three_other/two"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three_other/two</uri_path> <dc:comment/> <text lang="en">Two</text> + <help lang="en"/> <text lang="de">Zwei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> <option dc:uri="http://example.com/terms/options/one_two_three_other/three"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>one_two_three_other/three</uri_path> <dc:comment/> <text lang="en">Three</text> + <help lang="en"/> <text lang="de">Drei</text> - <additional_input>False</additional_input> + <help lang="de"/> + <additional_input/> </option> - <option dc:uri="http://example.com/terms/options/one_two_three_other/other"> + <option dc:uri="http://example.com/terms/options/one_two_three_other/text"> <uri_prefix>http://example.com/terms</uri_prefix> - <uri_path>one_two_three_other/other</uri_path> + <uri_path>one_two_three_other/text</uri_path> <dc:comment/> - <text lang="en">Other</text> - <text lang="de">Sonstige</text> - <additional_input>True</additional_input> + <text lang="en">Text</text> + <help lang="en"/> + <text lang="de">Text</text> + <help lang="de"/> + <additional_input>text</additional_input> + </option> + <option dc:uri="http://example.com/terms/options/one_two_three_other/textarea"> + <uri_prefix>http://example.com/terms</uri_prefix> + <uri_path>one_two_three_other/textarea</uri_path> + <dc:comment/> + <text lang="en">Text</text> + <help lang="en"/> + <text lang="de">Text</text> + <help lang="de"/> + <additional_input>textarea</additional_input> </option> <optionset dc:uri="http://example.com/terms/options/plugin"> <uri_prefix>http://example.com/terms</uri_prefix> diff --git a/testing/xml/elements/pages.xml b/testing/xml/elements/pages.xml index fa07738f7e..544979e927 100644 --- a/testing/xml/elements/pages.xml +++ b/testing/xml/elements/pages.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:57.426451+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:57.426451+02:00" version="2.0.0"> <page dc:uri="http://example.com/terms/questions/catalog/blocks/set"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks/set</uri_path> diff --git a/testing/xml/elements/question-error.xml b/testing/xml/elements/question-error.xml index f6626c735e..cc3f9f6465 100644 --- a/testing/xml/elements/question-error.xml +++ b/testing/xml/elements/question-error.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="2.0.0"> <question dc:uri="http://example.com/terms/questions/catalog/blocks/set/block/a"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks/set/block/a</uri_path> diff --git a/testing/xml/elements/question.xml b/testing/xml/elements/question.xml index 63ea8a0ea4..1d60dea784 100644 --- a/testing/xml/elements/question.xml +++ b/testing/xml/elements/question.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="2.0.0"> <question dc:uri="http://example.com/terms/questions/catalog/blocks/set/block/a"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks/set/block/a</uri_path> diff --git a/testing/xml/elements/questions.xml b/testing/xml/elements/questions.xml index 54474c2a88..f05addcf73 100644 --- a/testing/xml/elements/questions.xml +++ b/testing/xml/elements/questions.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:10.351808+02:00" version="2.0.0"> <question dc:uri="http://example.com/terms/questions/catalog/blocks/set/block/a"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks/set/block/a</uri_path> diff --git a/testing/xml/elements/questionsets.xml b/testing/xml/elements/questionsets.xml index 810f1151a2..3a94c0779b 100644 --- a/testing/xml/elements/questionsets.xml +++ b/testing/xml/elements/questionsets.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:04.312932+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:04.312932+02:00" version="2.0.0"> <questionset dc:uri="http://example.com/terms/questions/catalog/blocks/set/block"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks/set/block</uri_path> diff --git a/testing/xml/elements/sections.xml b/testing/xml/elements/sections.xml index 3c4b9b28cd..84d774cfdf 100644 --- a/testing/xml/elements/sections.xml +++ b/testing/xml/elements/sections.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:50.794031+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:38:50.794031+02:00" version="2.0.0"> <section dc:uri="http://example.com/terms/questions/catalog/blocks"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>catalog/blocks</uri_path> diff --git a/testing/xml/elements/tasks.xml b/testing/xml/elements/tasks.xml index 30e9ec57d8..90783402e5 100644 --- a/testing/xml/elements/tasks.xml +++ b/testing/xml/elements/tasks.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:55.354321+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:39:55.354321+02:00" version="2.0.0"> <task dc:uri="http://example.com/terms/tasks/text_equal_test"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>text_equal_test</uri_path> diff --git a/testing/xml/elements/views.xml b/testing/xml/elements/views.xml index 795476c747..2567267108 100644 --- a/testing/xml/elements/views.xml +++ b/testing/xml/elements/views.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:40:06.795538+02:00" version="1.9.2"> +<rdmo xmlns:dc="http://purl.org/dc/elements/1.1/" created="2023-04-20T09:40:06.795538+02:00" version="2.0.0"> <view dc:uri="http://example.com/terms/views/view_a"> <uri_prefix>http://example.com/terms</uri_prefix> <uri_path>view_a</uri_path>