diff --git a/.github/uffizzi/docker-compose.uffizzi.yml b/.github/uffizzi/docker-compose.uffizzi.yml new file mode 100644 index 0000000000..4232733013 --- /dev/null +++ b/.github/uffizzi/docker-compose.uffizzi.yml @@ -0,0 +1,24 @@ +version: '3' + +x-uffizzi: + ingress: + service: nocodb + port: 8080 + +services: + postgres: + image: postgres + restart: always + environment: + POSTGRES_PASSWORD: password + POSTGRES_USER: postgres + POSTGRES_DB: root_db + nocodb: + image: "${NOCODB_IMAGE}" + ports: + - "8080:8080" + restart: always + environment: + NC_DB: "pg://localhost:5432?u=postgres&p=password&d=root_db" + NC_ADMIN_EMAIL: admin@nocodb.com + NC_ADMIN_PASSWORD: password diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index d104e79089..80c4780c31 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -6,7 +6,8 @@ on: # reopened: closed pull request is reopened # synchronize: commit(s) pushed to the pull request # ready_for_review: non PR release - types: [opened, reopened, synchronize, ready_for_review] + # closed: pull request is closed, used to delete uffizzi previews + types: [opened, reopened, synchronize, ready_for_review, closed] paths: - "packages/nocodb-sdk/**" - "packages/nc-gui/**" @@ -20,7 +21,7 @@ concurrency: jobs: # enrich tag for pr release set-tag: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} runs-on: 'ubuntu-latest' steps: - name: set-tag @@ -47,7 +48,7 @@ jobs: # Build, install, publish frontend and backend to npm release-npm: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} needs: [set-tag] uses: ./.github/workflows/release-npm.yml with: @@ -58,7 +59,7 @@ jobs: # Build docker image and push to docker hub release-docker: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} needs: [release-npm, set-tag] uses: ./.github/workflows/release-docker.yml with: @@ -72,7 +73,7 @@ jobs: # Build executables and publish to GitHub release-executables: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} needs: [set-tag, release-npm] uses: ./.github/workflows/release-timely-executables.yml with: @@ -82,7 +83,7 @@ jobs: # Add a comment for PR docker build leave-comment: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} runs-on: 'ubuntu-latest' needs: [release-docker, set-tag] steps: @@ -94,9 +95,45 @@ jobs: docker run -d -p 8888:8080 nocodb/nocodb-timely:${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }} ``` + # Create a preview for the pull request + preview-pull-request: + name: "Trigger Uffizzi Preview" + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} + runs-on: 'ubuntu-latest' + needs: [release-docker, set-tag] + outputs: + compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Render Compose File + run: | + NOCODB_IMAGE=nocodb/nocodb-timely:${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }} + export NOCODB_IMAGE + # Render simple template from environment variables. + envsubst < .github/uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml + cat docker-compose.rendered.yml + - name: Upload Rendered Compose File as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: docker-compose.rendered.yml + retention-days: 2 + - name: Serialize PR Event to File + run: | + cat << EOF > event.json + ${{ toJSON(github.event) }} + EOF + - name: Upload PR Event as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: event.json + retention-days: 2 + # Add a comment for PR executable build leave-executable-comment: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' }} + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action != 'closed' }} runs-on: 'ubuntu-latest' needs: [release-executables, set-tag] steps: @@ -129,3 +166,23 @@ jobs: ``` For executables visit [here](https://github.com/nocodb/nocodb-timely/releases/tag/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}) + + # delete the uffizzi preview created off of this PR + delete-uffizzi-preview: + name: Call for Preview Deletion + runs-on: ubuntu-latest + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' && github.event.pull_request.draft == false && github.base_ref == 'develop' && github.event.action == 'closed' }} + steps: + # If this PR is closing, we will not render a compose file nor pass it to the next workflow. + - name: Serialize PR Event to File + run: | + cat << EOF > event.json + ${{ toJSON(github.event) }} + + EOF + - name: Upload PR Event as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: event.json + retention-days: 2 \ No newline at end of file diff --git a/.github/workflows/uffizzi-preview.yml b/.github/workflows/uffizzi-preview.yml new file mode 100644 index 0000000000..470acaa0e0 --- /dev/null +++ b/.github/workflows/uffizzi-preview.yml @@ -0,0 +1,88 @@ +name: Deploy Uffizzi Preview + +on: + workflow_run: + workflows: + - "PR Release" + types: + - completed + +jobs: + cache-compose-file: + name: Cache Compose File + runs-on: ubuntu-latest + outputs: + compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }} + pr-number: ${{ env.PR_NUMBER }} + steps: + - name: 'Download artifacts' + # Fetch output (zip archive) from the workflow run that triggered this workflow. + uses: actions/github-script@v6 + with: + script: | + let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { + return artifact.name == "preview-spec" + })[0]; + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + }); + let fs = require('fs'); + fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data)); + + - name: 'Unzip artifact' + run: unzip preview-spec.zip + + - name: Read Event into ENV + run: | + echo 'EVENT_JSON<> $GITHUB_ENV + cat event.json >> $GITHUB_ENV + echo 'EOF' >> $GITHUB_ENV + + - name: Hash Rendered Compose File + id: hash + # If the previous workflow was triggered by a PR close event, we will not have a compose file artifact. + if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} + run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV + + - name: Cache Rendered Compose File + if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} + uses: actions/cache@v3 + with: + path: docker-compose.rendered.yml + key: ${{ env.COMPOSE_FILE_HASH }} + + - name: Read PR Number From Event Object + id: pr + run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV + + - name: DEBUG - Print Job Outputs + if: ${{ runner.debug }} + run: | + echo "PR number: ${{ env.PR_NUMBER }}" + echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}" + cat event.json + + deploy-uffizzi-preview: + name: Use Remote Workflow to Preview on Uffizzi + needs: + - cache-compose-file + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + with: + # If this workflow was triggered by a PR close event, cache-key will be an empty string + # and this reusable workflow will delete the preview deployment. + compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }} + compose-file-cache-path: docker-compose.rendered.yml + server: https://app.uffizzi.com + pr-number: ${{ needs.cache-compose-file.outputs.pr-number }} + permissions: + contents: read + pull-requests: write + id-token: write \ No newline at end of file diff --git a/README.md b/README.md index d96964efb8..b4dc25ff27 100644 --- a/README.md +++ b/README.md @@ -33,16 +33,6 @@ Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadshe ![All Views](https://user-images.githubusercontent.com/35857179/194825053-3aa3373d-3e0f-4b42-b3f1-42928332054a.gif) -

- - Deploy NocoDB to Heroku with 1-Click - -

-
[](markdown/readme/languages/chinese.md) @@ -80,20 +70,6 @@ Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadshe # Quick try -## 1-Click Deploy to Heroku - -Before doing so, make sure you have a Heroku account. By default, an add-on Heroku Postgres will be used as meta database. You can see the connection string defined in `DATABASE_URL` by navigating to Heroku App Settings and selecting Config Vars. - - - Deploy NocoDB to Heroku with 1-Click - - -
- ## NPX You can run below command if you need an interactive configuration. @@ -226,7 +202,6 @@ Access Dashboard using : [http://localhost:8080/dashboard](http://localhost:8080 # Table of Contents - [Quick try](#quick-try) - * [1-Click Deploy to Heroku](#1-click-deploy-to-heroku) * [NPX](#npx) * [Node Application](#node-application) * [Docker](#docker) diff --git a/markdown/readme/languages/chinese.md b/markdown/readme/languages/chinese.md index f8814e2f7d..3880ac417e 100644 --- a/markdown/readme/languages/chinese.md +++ b/markdown/readme/languages/chinese.md @@ -33,21 +33,6 @@ # 快速尝试 -### 一键部署 - -在部署之前,请确保你有一个 Heroku 账户。默认情况下,将使用一个附加的 Heroku Postgres 作为数据库。你可以通过访问 Heroku 应用程序设置并选择 Config Vars 来查看 DATABASE_URL 中定义的连接方式。 - -#### Heroku - - - 一键部署 NocoDB 到 Heroku - -
- ## NPX 如果你需要一个交互式的配置,你可以运行下面的命令。 diff --git a/markdown/readme/languages/dutch.md b/markdown/readme/languages/dutch.md index 6a0e2f6bca..ed45c20743 100644 --- a/markdown/readme/languages/dutch.md +++ b/markdown/readme/languages/dutch.md @@ -34,19 +34,6 @@ Draait elke MySQL, PostgreSQL, SQL Server, SQLITE & MARIADB in een Smart-Spreads # Snel proberen -### 1-Click Deploy - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Docker gebruiken ```bash diff --git a/markdown/readme/languages/french.md b/markdown/readme/languages/french.md index 2c5dda6dd0..cce007c8c8 100644 --- a/markdown/readme/languages/french.md +++ b/markdown/readme/languages/french.md @@ -34,18 +34,6 @@ Transformez n'importe quel MySQL, PostgreSQL, SQL Server, SQLite & Mariadb en un # Essayez rapidement -### Déploiement en 1 Clic - -#### Heroku -Avant de le faire, assurez-vous que vous avez un compte Heroku. Par défaut, un add-on Heroku Postgres sera utilisé comme meta database. Vous pouvez voir la string pour se connecter définie en tant que `DATABASE_URL` en naviguant dans Heroku App Settings et en sélectionnant Config Vars. - - Deploy NocoDB to Heroku with 1-Click - -
### Utilisez Docker ```bash diff --git a/markdown/readme/languages/german.md b/markdown/readme/languages/german.md index 3ead650a12..2784eb794e 100644 --- a/markdown/readme/languages/german.md +++ b/markdown/readme/languages/german.md @@ -34,19 +34,6 @@ Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & MariaDB in eine Smart-T # Schneller Versuch -### 1-Klick-Bereitstellung - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Verwenden von Docker ```bash diff --git a/markdown/readme/languages/indonesian.md b/markdown/readme/languages/indonesian.md index 1e5e289f4e..db92fd3bc9 100644 --- a/markdown/readme/languages/indonesian.md +++ b/markdown/readme/languages/indonesian.md @@ -34,19 +34,6 @@ Mengubah MySQL, PostgreSQL, SQL Server, SQLite & MariaDB apapun menjadi spreadsh # Mulai Cepat -### 1-Klik Deploy - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Menggunakan Docker ```bash diff --git a/markdown/readme/languages/italian.md b/markdown/readme/languages/italian.md index a5321b98a4..d9a01cab86 100644 --- a/markdown/readme/languages/italian.md +++ b/markdown/readme/languages/italian.md @@ -31,20 +31,8 @@ Trasforma qualsiasi MySQL, PostgreSQL, SQL Server, SQLite & Mariadb in un foglio

NocoDB - The Open Source Airtable alternative | Product Hunt

-# Prova veloce - -### 1-Click Deploy -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
+# Prova veloce ### Con Docker diff --git a/markdown/readme/languages/japanese.md b/markdown/readme/languages/japanese.md index 97c465b1e2..9f5dc2dd4c 100644 --- a/markdown/readme/languages/japanese.md +++ b/markdown/readme/languages/japanese.md @@ -34,19 +34,6 @@ MySQL、PostgreSQL、SQL Server、SQLite&Mariadbをスマートスプレッド # クイック試し -### 1-Click Deploy - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Docker を使う ```bash diff --git a/markdown/readme/languages/korean.md b/markdown/readme/languages/korean.md index fc4d43340c..0e87dfd4dc 100644 --- a/markdown/readme/languages/korean.md +++ b/markdown/readme/languages/korean.md @@ -34,19 +34,6 @@ MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 똑똑한 스프레드시트 # 바로 써보기 -### 원클릭 배포 - -#### Heroku - - - NocoDB를 Heroku에 원클릭 배포하기 - -
- ### Docker 사용 ```bash diff --git a/markdown/readme/languages/portuguese.md b/markdown/readme/languages/portuguese.md index f63554eea6..e643bcc0d6 100644 --- a/markdown/readme/languages/portuguese.md +++ b/markdown/readme/languages/portuguese.md @@ -34,19 +34,6 @@ Transforma qualquer MySQL, PostgreSQL, SQL Server, Sqlite e MariaDB em uma plani # Experimente rápida -### 1-Click Deploy - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Usando o Docker. ```bash diff --git a/markdown/readme/languages/russian.md b/markdown/readme/languages/russian.md index 038c56bf28..51aa48597b 100644 --- a/markdown/readme/languages/russian.md +++ b/markdown/readme/languages/russian.md @@ -34,19 +34,6 @@ # Быстрый старт -### 1-Нажмите на Deploy - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Используя Docker ```bash diff --git a/markdown/readme/languages/spanish.md b/markdown/readme/languages/spanish.md index 04d8068c6b..d70f3ba6b1 100644 --- a/markdown/readme/languages/spanish.md +++ b/markdown/readme/languages/spanish.md @@ -34,19 +34,6 @@ Convierte cualquier MySQL, PostgreSQL, SQL Server, SQLite y Mariadb en una hoja # Prueba rápida -### Implementación en 1-Click - -#### Heroku - - - Deploy NocoDB to Heroku with 1-Click - -
- ### Usando docker ```bash diff --git a/packages/nc-cli/package-lock.json b/packages/nc-cli/package-lock.json index bdcd528f31..efb0fac26f 100644 --- a/packages/nc-cli/package-lock.json +++ b/packages/nc-cli/package-lock.json @@ -16,7 +16,7 @@ "colors": "1.4.0", "download": "^8.0.0", "download-git-repo": "^3.0.2", - "express": "^4.17.1", + "express": "^4.18.2", "fs-extra": "^9.0.1", "glob": "^7.1.6", "inquirer": "^7.3.3", @@ -1208,12 +1208,12 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -2292,23 +2292,26 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -2322,7 +2325,7 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/boxen": { "version": "4.2.0", @@ -2488,9 +2491,9 @@ } }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -2611,7 +2614,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -4321,9 +4323,9 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -4884,17 +4886,21 @@ } }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-file": { "version": "1.0.0", @@ -5179,7 +5185,7 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.4.38", @@ -5229,7 +5235,7 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -5381,7 +5387,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "2.0.0", @@ -5476,7 +5482,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -5736,37 +5742,38 @@ } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -6083,16 +6090,16 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -6110,7 +6117,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "2.1.0", @@ -6495,7 +6502,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -6585,7 +6592,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -7368,7 +7374,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7520,18 +7525,18 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/http-proxy-agent": { @@ -9270,7 +9275,7 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } @@ -9664,9 +9669,9 @@ "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -10179,7 +10184,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10289,9 +10293,9 @@ } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -11306,9 +11310,12 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -11376,12 +11383,12 @@ } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -12009,23 +12016,23 @@ } }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -12042,7 +12049,7 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serialize-error": { "version": "2.1.0", @@ -12054,14 +12061,14 @@ } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -12188,7 +12195,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -13039,11 +13045,11 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stream-events": { @@ -13445,14 +13451,6 @@ "readable-stream": "^3.0.1" } }, - "node_modules/tedious/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/tedious/node_modules/iconv-lite": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", @@ -14776,7 +14774,7 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } @@ -16443,12 +16441,12 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -17297,20 +17295,22 @@ "dev": true }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -17324,7 +17324,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -17446,9 +17446,9 @@ "dev": true }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cache-base": { "version": "1.0.1", @@ -17549,7 +17549,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -18865,9 +18864,9 @@ "dev": true }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", @@ -19309,14 +19308,14 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-file": { "version": "1.0.0", @@ -19535,7 +19534,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { "version": "1.4.38", @@ -19579,7 +19578,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -19695,7 +19694,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "2.0.0", @@ -19767,7 +19766,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "event-target-shim": { "version": "5.0.1", @@ -19957,37 +19956,38 @@ } }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -20237,16 +20237,16 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -20261,7 +20261,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -20561,7 +20561,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "from2": { "version": "2.3.0", @@ -20629,7 +20629,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -21229,8 +21228,7 @@ "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-to-string-tag-x": { "version": "1.4.1", @@ -21342,14 +21340,14 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" } }, @@ -22626,7 +22624,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "mem": { "version": "5.1.1", @@ -22929,9 +22927,9 @@ "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -23343,8 +23341,7 @@ "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" }, "object-is": { "version": "1.1.5", @@ -23421,9 +23418,9 @@ } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -24164,9 +24161,12 @@ "dev": true }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } }, "query-string": { "version": "5.1.1", @@ -24205,12 +24205,12 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -24682,23 +24682,23 @@ } }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -24712,7 +24712,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } } @@ -24725,14 +24725,14 @@ "dev": true }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "set-blocking": { @@ -24830,7 +24830,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -25517,9 +25516,9 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "stream-events": { "version": "1.0.5", @@ -25827,11 +25826,6 @@ "readable-stream": "^3.0.1" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, "iconv-lite": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", @@ -26806,7 +26800,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "unset-value": { "version": "1.0.0", diff --git a/packages/nc-cli/package.json b/packages/nc-cli/package.json index cceabe8ed3..6f7eef8141 100644 --- a/packages/nc-cli/package.json +++ b/packages/nc-cli/package.json @@ -73,7 +73,7 @@ "colors": "1.4.0", "download": "^8.0.0", "download-git-repo": "^3.0.2", - "express": "^4.17.1", + "express": "^4.18.2", "fs-extra": "^9.0.1", "glob": "^7.1.6", "inquirer": "^7.3.3", diff --git a/packages/nc-gui/components/smartsheet/Grid.vue b/packages/nc-gui/components/smartsheet/Grid.vue index 0243f4613e..0bcddde8d4 100644 --- a/packages/nc-gui/components/smartsheet/Grid.vue +++ b/packages/nc-gui/components/smartsheet/Grid.vue @@ -227,7 +227,6 @@ const { selectCell, startSelectRange, endSelectRange, clearSelectedRange, copyVa switch (e.key) { case 'ArrowUp': e.preventDefault() - $e('c:shortcut', { key: 'CTRL + ArrowUp' }) selectedCell.row = 0 selectedCell.col = selectedCell.col ?? 0 scrollToCell?.() @@ -235,7 +234,6 @@ const { selectCell, startSelectRange, endSelectRange, clearSelectedRange, copyVa return true case 'ArrowDown': e.preventDefault() - $e('c:shortcut', { key: 'CTRL + ArrowDown' }) selectedCell.row = data.value.length - 1 selectedCell.col = selectedCell.col ?? 0 scrollToCell?.() @@ -243,7 +241,6 @@ const { selectCell, startSelectRange, endSelectRange, clearSelectedRange, copyVa return true case 'ArrowRight': e.preventDefault() - $e('c:shortcut', { key: 'CTRL + ArrowRight' }) selectedCell.row = selectedCell.row ?? 0 selectedCell.col = fields.value?.length - 1 scrollToCell?.() @@ -251,7 +248,6 @@ const { selectCell, startSelectRange, endSelectRange, clearSelectedRange, copyVa return true case 'ArrowLeft': e.preventDefault() - $e('c:shortcut', { key: 'CTRL + ArrowLeft' }) selectedCell.row = selectedCell.row ?? 0 selectedCell.col = 0 scrollToCell?.() diff --git a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue index 1ccb069b43..c55bc8ec85 100644 --- a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue +++ b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue @@ -2,8 +2,8 @@ import type { Ref } from 'vue' import type { ListItem as AntListItem } from 'ant-design-vue' import jsep from 'jsep' -import type { ColumnType } from 'nocodb-sdk' -import { UITypes, jsepCurlyHook } from 'nocodb-sdk' +import type { ColumnType, FormulaType } from 'nocodb-sdk' +import { UITypes, jsepCurlyHook, substituteColumnIdWithAliasInFormula } from 'nocodb-sdk' import { MetaInj, NcAutocompleteTree, @@ -604,7 +604,16 @@ function scrollToSelectedOption() { } // set default value -vModel.value.formula_raw = (column?.value?.colOptions as Record)?.formula_raw || '' +if ((column.value?.colOptions as any)?.formula_raw) { + vModel.value.formula_raw = + substituteColumnIdWithAliasInFormula( + (column.value?.colOptions as FormulaType)?.formula, + meta?.value?.columns as ColumnType[], + (column.value?.colOptions as any)?.formula_raw, + ) || '' +} else { + vModel.value.formula_raw = '' +} // set additional validations setAdditionalValidations({ diff --git a/packages/nc-gui/components/template/Editor.vue b/packages/nc-gui/components/template/Editor.vue index 21d92a40a4..770109fd9a 100644 --- a/packages/nc-gui/components/template/Editor.vue +++ b/packages/nc-gui/components/template/Editor.vue @@ -431,7 +431,9 @@ async function importTemplate() { input = null } } else if (v.uidt === UITypes.Date) { - input = parseStringDate(input, v.meta.date_format) + if (input) { + input = parseStringDate(input, v.meta.date_format) + } } res[col.destCn] = input } diff --git a/packages/nc-gui/lang/de.json b/packages/nc-gui/lang/de.json index 20b037afbf..7304e360f8 100644 --- a/packages/nc-gui/lang/de.json +++ b/packages/nc-gui/lang/de.json @@ -16,7 +16,7 @@ "cancel": "Abbrechen", "submit": "Übertragen", "create": "Erstellen", - "duplicate": "Duplicate", + "duplicate": "Duplizieren", "insert": "Einfügen", "delete": "Löschen", "update": "Aktualisieren", @@ -69,12 +69,12 @@ "betaNote": "Diese Funktion befindet sich derzeit in der Beta.", "moreInfo": "Mehr Informationen können hier gefunden werden", "logs": "Protokolle", - "groupingField": "Grouping Field", - "insertAfter": "Insert After", - "insertBefore": "Insert Before", - "hideField": "Hide Field", - "sortAsc": "Sort Ascending", - "sortDesc": "Sort Descending" + "groupingField": "Gruppierungsfeld", + "insertAfter": "danach einfügen", + "insertBefore": "davor einfügen", + "hideField": "Feld ausblenden", + "sortAsc": "Aufsteigend sortieren", + "sortDesc": "Absteigend sortieren" }, "objects": { "project": "Projekt", @@ -205,10 +205,10 @@ "quickImport": "Schnell Importieren", "advancedSettings": "Erweiterte Einstellungen", "codeSnippet": "Code Ausschnitt", - "keyboardShortcut": "Keyboard Shortcuts" + "keyboardShortcut": "Tastenkürzel" }, "labels": { - "createdBy": "Created By", + "createdBy": "Erstellt von", "notifyVia": "Benachrichtigen mit", "projName": "Projektname", "tableName": "Tabellenname", @@ -247,8 +247,8 @@ "created": "Erstellt", "sqlOutput": "SQL-Ausgabe", "addOption": "Option hinzufügen", - "qrCodeValueColumn": "Column with QR code value", - "qrCodeValueTooLong": "Too many characters for a QR code", + "qrCodeValueColumn": "Spalte mit QR-Code", + "qrCodeValueTooLong": "Zu viele Zeichen für einen QR-Code", "aggregateFunction": "Globale Funktion", "dbCreateIfNotExists": "Datenbank: Erstellen, falls nicht vorhanden", "clientKey": "Client-Schlüssel", @@ -291,24 +291,24 @@ "importAttachmentColumns": "Import Attachment Columns", "importFormulaColumns": "Import Formula Columns", "noData": "Keine Daten", - "goToDashboard": "Go to Dashboard", - "importing": "Importing", + "goToDashboard": "Zum Dashboard gehen", + "importing": "Wird importiert", "flattenNested": "Flatten Nested", "downloadAllowed": "Download erlaubt", "weAreHiring": "Wir stellen ein!", "primaryKey": "Primärschlüssel", "hasMany": "hat viele", "belongsTo": "gehört zu", - "manyToMany": "have many to many relation", - "extraConnectionParameters": "Extra connection parameters", + "manyToMany": "haben M:N-Beziehnungen", + "extraConnectionParameters": "Zusätzliche Verbindungsparameter", "commentsOnly": "Nur Kommentare", "documentation": "Dokumentation", "subscribeNewsletter": "Abonnieren Sie unseren wöchentlichen Newsletter", - "signUpWithGoogle": "Sign up with Google", - "signInWithGoogle": "Sign in with Google", + "signUpWithGoogle": "Mit Google anmelden", + "signInWithGoogle": "Mit Google einloggen", "agreeToTos": "Mit Ihrer Anmeldung stimmen Sie den allgemeinen Nutzungsbedingungen zu", "welcomeToNc": "Willkommen bei NocoDB!", - "inviteOnlySignup": "Allow signup only using invite url" + "inviteOnlySignup": "Anmeldung nur über Einladungs-URL zulassen" }, "activity": { "createProject": "Projekt erstellen", @@ -353,7 +353,7 @@ "invite": "Einladen", "inviteMore": "Mehr einladen", "inviteTeam": "Team einladen", - "inviteUser": "Invite User", + "inviteUser": "Benutzer einladen", "inviteToken": "Token einladen", "newUser": "Neuer Benutzer", "editUser": "Benutzer bearbeiten", @@ -376,8 +376,8 @@ "setPrimary": "Als Primärwert festlegen", "addRow": "Neue Zeile hinzufügen", "saveRow": "Zeile speichern", - "saveAndExit": "Save & Exit", - "saveAndStay": "Save & Stay", + "saveAndExit": "Speichern & Verlassen", + "saveAndStay": "Speichern & Bleiben", "insertRow": "Neue Zeile einfügen", "deleteRow": "Zeile löschen", "deleteSelectedRow": "Ausgewählte Zeilen löschen", @@ -421,9 +421,9 @@ "editConnJson": "Verbindung JSON bearbeiten", "sponsorUs": "Sponsor uns", "sendEmail": "E-MAIL SENDEN", - "addUserToProject": "Add user to project", - "getApiSnippet": "Get API Snippet", - "clearCell": "Clear cell", + "addUserToProject": "Benutzer zum Projekt hinzufügen", + "getApiSnippet": "zeige API Snippet", + "clearCell": "Zelle leeren", "addFilterGroup": "Add Filter Group", "linkRecord": "Link record", "addNewRecord": "Add new record", @@ -492,7 +492,7 @@ "defaultValue": "Standardwert", "filterByEmail": "Filtern nach E-Mail", "filterQuery": "Filter-Abfrage", - "selectField": "Select field" + "selectField": "Feld wählen" }, "msg": { "warning": { @@ -668,13 +668,13 @@ "rowUpdateFailed": "Row update failed", "deleteRowFailed": "Fehler beim Löschen der Zeile", "setFormDataFailed": "Failed to set form data", - "formViewUpdateFailed": "Failed to update form view", - "tableNameRequired": "Table name is required", - "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", - "followingCharactersAreNotAllowed": "Following characters are not allowed", - "columnNameRequired": "Column name is required", + "formViewUpdateFailed": "Fehler beim Aktualisieren der Formularansicht", + "tableNameRequired": "Tabellenname ist erforderlich", + "nameShouldStartWithAnAlphabetOr_": "Name muss mit einem Buchstaben oder _ beginnen", + "followingCharactersAreNotAllowed": "Folgende Zeichen sind nicht erlaubt", + "columnNameRequired": "Spaltenname ist erforderlich", "projectNameExceeds50Characters": "Projektname überschreitet 50 Zeichen", - "projectNameCannotStartWithSpace": "Project name cannot start with space", + "projectNameCannotStartWithSpace": "Projektname darf nicht mit einem Leerzeichen beginnen", "requiredField": "Pflichtfeld", "ipNotAllowed": "IP nicht erlaubt", "targetFileIsNotAnAcceptedFileType": "Target file is not an accepted file type", diff --git a/packages/nc-gui/lang/ja.json b/packages/nc-gui/lang/ja.json index c07195ef1c..a9cab22389 100644 --- a/packages/nc-gui/lang/ja.json +++ b/packages/nc-gui/lang/ja.json @@ -16,7 +16,7 @@ "cancel": "キャンセル", "submit": "送信", "create": "作成", - "duplicate": "Duplicate", + "duplicate": "複製", "insert": "挿入", "delete": "削除", "update": "更新", @@ -56,25 +56,25 @@ "notification": "通知", "reference": "リファレンス", "function": "関数", - "confirm": "Confirm", - "generate": "Generate", - "copy": "Copy", + "confirm": "確認", + "generate": "生成", + "copy": "コピー", "misc": "Miscellaneous", "lock": "Lock", "unlock": "Unlock", - "credentials": "Credentials", - "help": "Help", + "credentials": "認証情報", + "help": "ヘルプ", "questions": "Questions", "reachOut": "Reach out here", - "betaNote": "This feature is currently in beta.", + "betaNote": "この機能はまだベータ版です", "moreInfo": "More information can be found here", - "logs": "Logs", - "groupingField": "Grouping Field", - "insertAfter": "Insert After", - "insertBefore": "Insert Before", + "logs": "ログ", + "groupingField": "グループ フィールド", + "insertAfter": "後に挿入", + "insertBefore": "前に挿入", "hideField": "Hide Field", - "sortAsc": "Sort Ascending", - "sortDesc": "Sort Descending" + "sortAsc": "昇順", + "sortDesc": "降順" }, "objects": { "project": "プロジェクト", @@ -113,7 +113,7 @@ "orgLevelCreator": "Organization Level Creator", "orgLevelViewer": "Organization Level Viewer" }, - "sqlVIew": "SQL View" + "sqlVIew": "SQL ビュー" }, "datatype": { "ID": "ID", @@ -195,17 +195,17 @@ "headLogin": "ログイン | NocoDB", "resetPassword": "パスワードをリセットする", "teamAndSettings": "チームと設定", - "apiDocs": "API Docs", - "importFromAirtable": "Import From Airtable", - "generateToken": "Generate Token", + "apiDocs": "API ドキュメント", + "importFromAirtable": "Airtable からインポート", + "generateToken": "トークンを生成", "APIsAndSupport": "APIとサポート", - "helpCenter": "Help center", - "swaggerDocumentation": "Swagger Documentation", + "helpCenter": "ヘルプセンター", + "swaggerDocumentation": "Swagger ドキュメント", "quickImportFrom": "Quick Import From", "quickImport": "Quick Import", - "advancedSettings": "Advanced Settings", - "codeSnippet": "Code Snippet", - "keyboardShortcut": "Keyboard Shortcuts" + "advancedSettings": "詳細設定", + "codeSnippet": "コードスニペット", + "keyboardShortcut": "キーボードショートカット" }, "labels": { "createdBy": "Created By", @@ -226,7 +226,7 @@ "port": "ポート番号", "username": "ユーザー名", "password": "パスワード", - "schemaName": "Schema name", + "schemaName": "スキーマ名", "database": "データベース", "action": "アクション", "actions": "アクション", @@ -266,7 +266,7 @@ "bookDemo": "デモを予約", "getAnswered": "あなたの質問に回答しましょう", "joinDiscord": "Discord に参加", - "joinCommunity": "Join NocoDB Community", + "joinCommunity": "NocoDB のコミュニティに参加", "joinReddit": "/r/NocoDB に参加", "followNocodb": "NocoDB をフォロー" }, @@ -278,11 +278,11 @@ "onDelete": "削除中", "account": "アカウント", "language": "言語", - "primaryColor": "Primary Color", - "accentColor": "Accent Color", - "customTheme": "Custom Theme", + "primaryColor": "プライマリカラー", + "accentColor": "アクセントカラー", + "customTheme": "カスタムテーマ", "requestDataSource": "Request a data source you need?", - "apiKey": "API Key", + "apiKey": "API キー", "sharedBase": "Shared Base", "importData": "Import Data", "importSecondaryViews": "Import Secondary Views", @@ -290,25 +290,25 @@ "importLookupColumns": "Import Lookup Columns", "importAttachmentColumns": "Import Attachment Columns", "importFormulaColumns": "Import Formula Columns", - "noData": "No Data", - "goToDashboard": "Go to Dashboard", - "importing": "Importing", - "flattenNested": "Flatten Nested", + "noData": "データがありません", + "goToDashboard": "ダッシュボードに移動", + "importing": "インポート中", + "flattenNested": "入れ子を平坦化", "downloadAllowed": "ダウンロードを許可", "weAreHiring": "We are Hiring!", - "primaryKey": "Primary key", + "primaryKey": "プライマリーキー", "hasMany": "has many", "belongsTo": "belongs to", "manyToMany": "have many to many relation", "extraConnectionParameters": "Extra connection parameters", - "commentsOnly": "Comments only", - "documentation": "Documentation", - "subscribeNewsletter": "Subscribe to our weekly newsletter", - "signUpWithGoogle": "Sign up with Google", - "signInWithGoogle": "Sign in with Google", - "agreeToTos": "By signing up, you agree to the Terms of Service", - "welcomeToNc": "Welcome to NocoDB!", - "inviteOnlySignup": "Allow signup only using invite url" + "commentsOnly": "コメントのみ", + "documentation": "ドキュメント", + "subscribeNewsletter": "週刊ニュースレターを購読する", + "signUpWithGoogle": "Googleでログイン", + "signInWithGoogle": "Googleでログイン", + "agreeToTos": "サインアップすることで、利用規約に同意するものとみなされます。", + "welcomeToNc": "NocoDB へようこそ!", + "inviteOnlySignup": "招待URL からのサインアップのみ許可" }, "activity": { "createProject": "プロジェクトを作成", @@ -336,7 +336,7 @@ "translate": "翻訳に協力する", "account": { "authToken": "Auth Tokenをコピー", - "swagger": "Swagger: REST APIs", + "swagger": "Swagger: REST API", "projInfo": "プロジェクト情報をコピー", "themes": "テーマ" }, @@ -353,14 +353,14 @@ "invite": "招待", "inviteMore": "さらに招待", "inviteTeam": "チームへ招待", - "inviteUser": "Invite User", + "inviteUser": "ユーザーを招待", "inviteToken": "招待用トークン", "newUser": "ユーザーを作成", "editUser": "ユーザーを編集", "deleteUser": "プロジェクトからユーザーを削除", "resendInvite": "招待用メールを再送信", "copyInviteURL": "招待用 URL をコピー", - "copyPasswordResetURL": "Copy password reset URL", + "copyPasswordResetURL": "パスワードリセット URL をコピー", "newRole": "新しいロール", "reloadRoles": "ロールをリロード", "nextPage": "次のページ", @@ -376,13 +376,13 @@ "setPrimary": "プライマリ値として設定", "addRow": "行を追加", "saveRow": "行を保存", - "saveAndExit": "Save & Exit", - "saveAndStay": "Save & Stay", + "saveAndExit": "保存して終了", + "saveAndStay": "保存して続ける", "insertRow": "行を挿入", "deleteRow": "行を削除", "deleteSelectedRow": "選択行を削除", "importExcel": "エクセルファイルをインポート", - "importCSV": "Import CSV", + "importCSV": "CSV のインポート", "downloadCSV": "CSVをダウンロード", "downloadExcel": "XLSXをダウンロード", "uploadCSV": "CSVをアップロード", @@ -421,21 +421,21 @@ "editConnJson": "コネクション JSON を編集", "sponsorUs": "スポンサーになる", "sendEmail": "メールを送信", - "addUserToProject": "Add user to project", + "addUserToProject": "ユーザーをプロジェクトに追加", "getApiSnippet": "APIスニペットを取得", - "clearCell": "Clear cell", + "clearCell": "セルをクリア", "addFilterGroup": "フィルターグループを追加", - "linkRecord": "Link record", - "addNewRecord": "Add new record", - "useConnectionUrl": "Use Connection URL", + "linkRecord": "レコードをリンク", + "addNewRecord": "レコードを追加", + "useConnectionUrl": "接続 URL を使用", "toggleCommentsDraw": "Toggle comments draw", - "expandRecord": "Expand Record", - "deleteRecord": "Delete Record", + "expandRecord": "レコードを展開", + "deleteRecord": "レコードを削除", "erd": { - "showColumns": "Show Columns", - "showPkAndFk": "Show Primary and Foreign Keys", - "showSqlViews": "Show SQL Views", - "showMMTables": "Show Many to Many tables", + "showColumns": "列を表示", + "showPkAndFk": "プライマリキーと外部キーを表示", + "showSqlViews": "SQL ビューを表示", + "showMMTables": "多対多のテーブルを表示", "showJunctionTableNames": "Show Junction Table Names" }, "kanban": { @@ -492,20 +492,20 @@ "defaultValue": "デフォルト値", "filterByEmail": "メールアドレスでフィルタ", "filterQuery": "クエリを入力", - "selectField": "Select field" + "selectField": "フィールドを選択" }, "msg": { "warning": { "nonEditableFields": { - "computedFieldUnableToClear": "Warning: Computed field - unable to clear text", - "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed." + "computedFieldUnableToClear": "警告: 計算フィールド - テキストをクリアできません", + "qrFieldsCannotBeDirectlyChanged": "警告:QRコードフィールドは直接変更できません。" } }, "info": { - "pasteNotSupported": "Paste operation is not supported on the active cell", + "pasteNotSupported": "現在アクティブなセルでは貼り付けはサポートされていません", "roles": { - "orgCreator": "Creator can create new projects and access any invited project.", - "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." + "orgCreator": "「作成者」は新しいプロジェクトを作成でき、かつ招待されたプロジェクトにもアクセスできます。", + "orgViewer": "ビューアーは新規プロジェクトを作成することはできませんが、招待されたプロジェクトにアクセスできます。" }, "footerInfo": "1ページあたりの行数", "upload": "アップロードするファイルを選択してください", @@ -600,29 +600,29 @@ "credentials": "Where to find this?" }, "import": { - "clickOrDrag": "Click or drag file to this area to upload" + "clickOrDrag": "この領域をクリック、またはファイルをドラッグしてアップロード" }, - "metaDataRecreated": "Table metadata recreated successfully", - "invalidCredentials": "Invalid credentials", + "metaDataRecreated": "テーブルメタデータを再作成しました", + "invalidCredentials": "不正な認証情報です", "downloadingMoreFiles": "Downloading more files", - "copiedToClipboard": "Copied to clipboard", - "requriedFieldsCantBeMoved": "Required field can't be moved", - "updateNotAllowedWithoutPK": "Update not allowed for table which doesn't have primary key", - "autoIncFieldNotEditable": "Auto increment field is not editable", - "editingPKnotSupported": "Editing primary key not supported", - "deletedCache": "Deleted cache successfully", - "cacheEmpty": "Cache is empty", - "exportedCache": "Exported Cache Successfully", - "valueAlreadyInList": "This value is already in the list", - "noColumnsToUpdate": "No columns to update", - "tableDeleted": "Deleted table successfully", + "copiedToClipboard": "クリップボードにコピーしました", + "requriedFieldsCantBeMoved": "必須フィールドは移動できません", + "updateNotAllowedWithoutPK": "プライマリキーを持たないテーブルは更新できません", + "autoIncFieldNotEditable": "オートインクリメントフィールドは編集できません", + "editingPKnotSupported": "プライマリキーは編集できません", + "deletedCache": "キャッシュをクリアしました", + "cacheEmpty": "キャッシュは空です", + "exportedCache": "キャッシュをエクスポートしました", + "valueAlreadyInList": "この値は既にリストにあります", + "noColumnsToUpdate": "更新するカラムはありません", + "tableDeleted": "テーブルを削除しました", "generatePublicShareableReadonlyBase": "Generate publicly shareable readonly base", - "deleteViewConfirmation": "Are you sure you want to delete this view?", - "deleteTableConfirmation": "Do you want to delete the table", + "deleteViewConfirmation": "このビューを本当に削除しますか?", + "deleteTableConfirmation": "テーブルを削除しますか?", "showM2mTables": "Show M2M Tables", "deleteKanbanStackConfirmation": "スタックを削除すると、`{stackToBeDeleted}`から選択肢`{groupingField}`も削除されます。レコードは未分類スタックに移動します。", - "computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure", - "computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content." + "computedFieldEditWarning": "計算フィールド: コンテンツは読み取り専用です。列編集メニューを使用して再設定してください。", + "computedFieldDeleteWarning": "計算フィールド: コンテンツは読み取り専用です。コンテンツを消去できません。" }, "error": { "searchProject": "{search} の検索結果が見つかりませんでした", @@ -638,53 +638,53 @@ "passwdRequired": "パスワードが必要です", "passwdLength": "パスワードは8文字以上にしてください", "passwdMismatch": "パスワードが一致していません", - "completeRuleSet": "At least 8 characters with one Uppercase, one number and one special character", - "atLeast8Char": "At least 8 characters", - "atLeastOneUppercase": "One Uppercase letter", - "atLeastOneNumber": "One Number", - "atLeastOneSpecialChar": "One special character", - "allowedSpecialCharList": "Allowed special character list" + "completeRuleSet": "英大文字、数字、記号をそれぞれ1文字以上含みかつ 8 文字以上", + "atLeast8Char": "8 文字以上", + "atLeastOneUppercase": "英大文字 1 文字", + "atLeastOneNumber": "数字 1 文字", + "atLeastOneSpecialChar": "記号 1 文字", + "allowedSpecialCharList": "利用できる記号の一覧" }, - "invalidURL": "Invalid URL", - "internalError": "Some internal error occurred", - "templateGeneratorNotFound": "Template Generator cannot be found!", - "fileUploadFailed": "Failed to upload file", - "primaryColumnUpdateFailed": "Failed to update primary column", - "formDescriptionTooLong": "Data too long for Form Description", - "columnsRequired": "Following columns are required", - "selectAtleastOneColumn": "At least one column has to be selected", - "columnDescriptionNotFound": "Cannot find the destination column for", + "invalidURL": "無効なURL", + "internalError": "内部エラーが発生しました", + "templateGeneratorNotFound": "テンプレートジェネレーターが見つかりません!", + "fileUploadFailed": "ファイルのアップロードに失敗しました", + "primaryColumnUpdateFailed": "プライマリカラムの更新に失敗しました", + "formDescriptionTooLong": "フォームの説明が長すぎます", + "columnsRequired": "以下のカラムが必要です", + "selectAtleastOneColumn": "少なくとも1つのカラムを選択してください", + "columnDescriptionNotFound": "次の宛先カラムが見つかりません:", "duplicateMappingFound": "Duplicate mapping found, please remove one of the mapping", "nullValueViolatesNotNull": "Null value violates not-null constraint", - "sourceHasInvalidNumbers": "Source data contains some invalid numbers", - "sourceHasInvalidBoolean": "Source data contains some invalid boolean values", + "sourceHasInvalidNumbers": "ソースデータに無効な数値が含まれています", + "sourceHasInvalidBoolean": "ソースデータに無効なブール値が含まれています", "invalidForm": "Invalid Form", - "formValidationFailed": "Form validation failed", - "youHaveBeenSignedOut": "You have been signed out", - "failedToLoadList": "Failed to load list", + "formValidationFailed": "入力内容に誤りがあります", + "youHaveBeenSignedOut": "サインアウトしました", + "failedToLoadList": "リストの読み込みに失敗しました", "failedToLoadChildrenList": "Failed to load children list", - "deleteFailed": "Delete failed", - "unlinkFailed": "Unlink failed", + "deleteFailed": "削除に失敗しました", + "unlinkFailed": "リンク解除に失敗しました", "rowUpdateFailed": "行の更新に失敗", "deleteRowFailed": "行の削除に失敗", "setFormDataFailed": "Failed to set form data", "formViewUpdateFailed": "Failed to update form view", - "tableNameRequired": "Table name is required", - "nameShouldStartWithAnAlphabetOr_": "Name should start with an alphabet or _", - "followingCharactersAreNotAllowed": "Following characters are not allowed", - "columnNameRequired": "Column name is required", - "projectNameExceeds50Characters": "Project name exceeds 50 characters", - "projectNameCannotStartWithSpace": "Project name cannot start with space", - "requiredField": "Required field", - "ipNotAllowed": "IP not allowed", + "tableNameRequired": "テーブル名が必要です", + "nameShouldStartWithAnAlphabetOr_": "名前はアルファベットまたは_で始まる必要があります", + "followingCharactersAreNotAllowed": "以下の文字種は使用できません", + "columnNameRequired": "列名が必要です", + "projectNameExceeds50Characters": "プロジェクト名が50文字を超えています", + "projectNameCannotStartWithSpace": "プロジェクト名の先頭にはスペースは利用できません", + "requiredField": "必須フィールド", + "ipNotAllowed": "IPアドレスが許可されていません", "targetFileIsNotAnAcceptedFileType": "Target file is not an accepted file type", "theAcceptedFileTypeIsCsv": "The accepted file type is .csv", "theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "The accepted file types are .xls, .xlsx, .xlsm, .ods, .ots", - "parameterKeyCannotBeEmpty": "Parameter key cannot be empty", - "duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed", - "fieldRequired": "{value} cannot be empty.", - "projectNotAccessible": "Project not accessible", - "copyToClipboardError": "Failed to copy to clipboard" + "parameterKeyCannotBeEmpty": "パラメータキーは空にできません", + "duplicateParameterKeysAreNotAllowed": "パラメータキーの重複は許可されていません", + "fieldRequired": "{value} を空にすることはできません。", + "projectNotAccessible": "このプロジェクトにはアクセスできません", + "copyToClipboardError": "クリップボードへのコピーに失敗しました" }, "toast": { "exportMetadata": "プロジェクトメタデータは正常にエクスポートされました", @@ -704,39 +704,39 @@ "futureRelease": "近日公開!" }, "success": { - "columnDuplicated": "Column duplicated successfully", - "updatedUIACL": "Updated UI ACL for tables successfully", - "pluginUninstalled": "Plugin uninstalled successfully", - "pluginSettingsSaved": "Plugin settings saved successfully", - "pluginTested": "Successfully tested plugin settings", - "tableRenamed": "Table renamed successfully", - "viewDeleted": "View deleted successfully", + "columnDuplicated": "カラムを複製しました", + "updatedUIACL": "テーブルの UI ACL を更新しました", + "pluginUninstalled": "プラグインをアンインストールしました", + "pluginSettingsSaved": "プラグインの設定を保存しました", + "pluginTested": "プラグイン設定のテストに成功しました", + "tableRenamed": "テーブル名を変更しました", + "viewDeleted": "ビューを削除しました", "primaryColumnUpdated": "Successfully updated as primary column", - "tableDataExported": "Successfully exported all table data", - "updated": "Successfully updated", - "sharedViewDeleted": "Deleted shared view successfully", - "userDeleted": "User deleted successfully", - "viewRenamed": "View renamed successfully", - "tokenGenerated": "Token generated successfully", - "tokenDeleted": "Token deleted successfully", - "userAddedToProject": "Successfully added user to project", - "userAdded": "Successfully added user", - "userDeletedFromProject": "Successfully deleted user from project", - "inviteEmailSent": "Invite Email sent successfully", - "inviteURLCopied": "Invite URL copied to clipboard", - "passwordResetURLCopied": "Password reset URL copied to clipboard", + "tableDataExported": "テーブルの全データをエクスポートしました", + "updated": "正常に更新されました", + "sharedViewDeleted": "共有ビューを削除しました", + "userDeleted": "ユーザを削除しました", + "viewRenamed": "ビュー名を変更しました", + "tokenGenerated": "トークンを生成しました", + "tokenDeleted": "トークンを削除しました", + "userAddedToProject": "プロジェクトにユーザーを追加しました", + "userAdded": "ユーザーを追加しました", + "userDeletedFromProject": "プロジェクトからユーザーを削除しました", + "inviteEmailSent": "招待メールを送信しました", + "inviteURLCopied": "招待 URL をクリップボードにコピーしました", + "passwordResetURLCopied": "パスワードリセット URL をクリップボードにコピーしました", "shareableURLCopied": "Copied shareable base URL to clipboard!", - "embeddableHTMLCodeCopied": "Copied embeddable HTML code!", - "userDetailsUpdated": "Successfully updated the user details", - "tableDataImported": "Successfully imported table data", - "webhookUpdated": "Webhook details updated successfully", + "embeddableHTMLCodeCopied": "埋め込み用 HTML をコピーしました", + "userDetailsUpdated": "ユーザーの詳細を更新しました", + "tableDataImported": "テーブルへデータをインポートしました", + "webhookUpdated": "Webhook の詳細を更新しました", "webhookDeleted": "Hook deleted successfully", - "webhookTested": "Webhook tested successfully", + "webhookTested": "Webhook のテストに成功しました", "columnUpdated": "列が更新されました", - "columnCreated": "Column created", - "passwordChanged": "Password changed successfully. Please login again.", - "settingsSaved": "Settings saved successfully", - "roleUpdated": "Role updated successfully" + "columnCreated": "列を作成しました", + "passwordChanged": "パスワードが変更されました。もう一度ログインしてください。", + "settingsSaved": "設定を保存しました", + "roleUpdated": "ロールを更新しました" } } } diff --git a/packages/nc-gui/lang/ru.json b/packages/nc-gui/lang/ru.json index 0f896804ca..8449d73f9a 100644 --- a/packages/nc-gui/lang/ru.json +++ b/packages/nc-gui/lang/ru.json @@ -16,7 +16,7 @@ "cancel": "Отмена", "submit": "Отправить", "create": "Создать", - "duplicate": "Duplicate", + "duplicate": "Копировать", "insert": "Вставить", "delete": "Удалить", "update": "Обновить", @@ -56,25 +56,25 @@ "notification": "Уведомление", "reference": "Ссылка", "function": "Функция", - "confirm": "Confirm", + "confirm": "Подтвердить", "generate": "Generate", - "copy": "Copy", - "misc": "Miscellaneous", - "lock": "Lock", - "unlock": "Unlock", - "credentials": "Credentials", - "help": "Help", - "questions": "Questions", + "copy": "Копировать", + "misc": "Прочее", + "lock": "Блокировать", + "unlock": "Разблокировать", + "credentials": "Учетные данные", + "help": "Помощь", + "questions": "Вопросы", "reachOut": "Reach out here", - "betaNote": "This feature is currently in beta.", - "moreInfo": "More information can be found here", - "logs": "Logs", - "groupingField": "Grouping Field", - "insertAfter": "Insert After", - "insertBefore": "Insert Before", - "hideField": "Hide Field", - "sortAsc": "Sort Ascending", - "sortDesc": "Sort Descending" + "betaNote": "Эта функция еще на стадии бета-версии.", + "moreInfo": "Больше информации можно найти здесь", + "logs": "Журналы", + "groupingField": "Поле группировки", + "insertAfter": "Вставить после", + "insertBefore": "Вставить перед", + "hideField": "Скрыть поле", + "sortAsc": "По Возрастанию", + "sortDesc": "По убыванию" }, "objects": { "project": "Проект", @@ -110,10 +110,10 @@ "editor": "Редактор", "commenter": "Комментатор", "viewer": "Просмотр", - "orgLevelCreator": "Organization Level Creator", - "orgLevelViewer": "Organization Level Viewer" + "orgLevelCreator": "Уровень Создатель", + "orgLevelViewer": "Уровень Читатель" }, - "sqlVIew": "SQL View" + "sqlVIew": "Просмотр SQL" }, "datatype": { "ID": "Идентификатор", @@ -194,21 +194,21 @@ "headCreateProject": "Создать проект |. NOCODB", "headLogin": "Войти |. NOCODB", "resetPassword": "Сбросить пароль", - "teamAndSettings": "Team & Settings", - "apiDocs": "API Docs", - "importFromAirtable": "Import From Airtable", - "generateToken": "Generate Token", + "teamAndSettings": "Команда и настройки", + "apiDocs": "Документация API", + "importFromAirtable": "Импортировать из Airtable", + "generateToken": "Создать Токен", "APIsAndSupport": "APIs & Support", - "helpCenter": "Help center", - "swaggerDocumentation": "Swagger Documentation", - "quickImportFrom": "Quick Import From", - "quickImport": "Quick Import", - "advancedSettings": "Advanced Settings", + "helpCenter": "Центр поддержки", + "swaggerDocumentation": "Документация Swagger", + "quickImportFrom": "Быстрый импорт из", + "quickImport": "Быстрый импорт", + "advancedSettings": "Расширенные настройки", "codeSnippet": "Code Snippet", - "keyboardShortcut": "Keyboard Shortcuts" + "keyboardShortcut": "Горячие клавиши" }, "labels": { - "createdBy": "Created By", + "createdBy": "Автор", "notifyVia": "Уведомлять через", "projName": "Название проекта", "tableName": "Название таблицы", @@ -226,7 +226,7 @@ "port": "Номер порта", "username": "Имя пользователя", "password": "Пароль", - "schemaName": "Schema name", + "schemaName": "Имя схемы", "database": "База данных", "action": "Действие", "actions": "Действия", @@ -247,8 +247,8 @@ "created": "Созданный", "sqlOutput": "Вывод SQL", "addOption": "Добавить настройку", - "qrCodeValueColumn": "Column with QR code value", - "qrCodeValueTooLong": "Too many characters for a QR code", + "qrCodeValueColumn": "Столбец с QR-кодом", + "qrCodeValueTooLong": "Слишком много символов для QR-кода", "aggregateFunction": "Агрегатная функция", "dbCreateIfNotExists": "База данных: создать, если не существует", "clientKey": "Ключ клиента", @@ -266,7 +266,7 @@ "bookDemo": "Забронировать бесплатное демо", "getAnswered": "Получите ответы на ваши вопросы", "joinDiscord": "Присоединиться к", - "joinCommunity": "Join NocoDB Community", + "joinCommunity": "Присоединяйтесь к сообществу NocoDB", "joinReddit": "Присоединиться /r/NocoDB", "followNocodb": "Следите за NocoDB" }, @@ -276,11 +276,11 @@ "childColumn": "Дочерний столбец", "onUpdate": "При обновлении", "onDelete": "При удалении", - "account": "Account", - "language": "Language", - "primaryColor": "Primary Color", + "account": "Учётная запись", + "language": "Язык", + "primaryColor": "Основной цвет", "accentColor": "Accent Color", - "customTheme": "Custom Theme", + "customTheme": "Пользовательская тема", "requestDataSource": "Request a data source you need?", "apiKey": "API Key", "sharedBase": "Shared Base", @@ -429,12 +429,12 @@ "addNewRecord": "Add new record", "useConnectionUrl": "Use Connection URL", "toggleCommentsDraw": "Toggle comments draw", - "expandRecord": "Expand Record", - "deleteRecord": "Delete Record", + "expandRecord": "Развернуть запись", + "deleteRecord": "Удалить запись", "erd": { - "showColumns": "Show Columns", + "showColumns": "Показать колонки", "showPkAndFk": "Show Primary and Foreign Keys", - "showSqlViews": "Show SQL Views", + "showSqlViews": "Показать SQL представления", "showMMTables": "Show Many to Many tables", "showJunctionTableNames": "Show Junction Table Names" }, @@ -442,7 +442,7 @@ "collapseStack": "Collapse Stack", "deleteStack": "Delete Stack", "stackedBy": "Stacked By", - "chooseGroupingField": "Choose a Grouping Field", + "chooseGroupingField": "Выберите поле группировки", "addOrEditStack": "Add / Edit Stack" } }, @@ -492,20 +492,20 @@ "defaultValue": "Значение по умолчанию", "filterByEmail": "Фильтр по электронной почте", "filterQuery": "Filter query", - "selectField": "Select field" + "selectField": "Выбрать поле" }, "msg": { "warning": { "nonEditableFields": { - "computedFieldUnableToClear": "Warning: Computed field - unable to clear text", - "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed." + "computedFieldUnableToClear": "Предупреждение: Вычисляемое поле - невозможно очистить текст", + "qrFieldsCannotBeDirectlyChanged": "Внимание: QR-поля не могут быть изменены напрямую." } }, "info": { - "pasteNotSupported": "Paste operation is not supported on the active cell", + "pasteNotSupported": "Операция Вставки не поддерживается в выделенной ячейке", "roles": { "orgCreator": "Creator can create new projects and access any invited project.", - "orgViewer": "Viewer is not allowed to create new projects but they can access any invited project." + "orgViewer": "Читателю не может создавать новые проекты, но может получить доступ к любому проекту по приглашению." }, "footerInfo": "Строк на страницу", "upload": "Выберите файл для загрузки", @@ -597,28 +597,28 @@ "addDefaultColumns": "Добавьте столбцы по умолчанию", "tableNameInDb": "Название таблицы как сохранено в базе данных", "airtable": { - "credentials": "Where to find this?" + "credentials": "Где найти это?" }, "import": { - "clickOrDrag": "Click or drag file to this area to upload" + "clickOrDrag": "Нажмите или перетащите файл в эту область для загрузки" }, - "metaDataRecreated": "Table metadata recreated successfully", - "invalidCredentials": "Invalid credentials", + "metaDataRecreated": "Метаданные таблицы успешно воссозданы", + "invalidCredentials": "Неверные учетные данные", "downloadingMoreFiles": "Downloading more files", - "copiedToClipboard": "Copied to clipboard", - "requriedFieldsCantBeMoved": "Required field can't be moved", - "updateNotAllowedWithoutPK": "Update not allowed for table which doesn't have primary key", + "copiedToClipboard": "Скопировано в буфер", + "requriedFieldsCantBeMoved": "Обязательное поле не может быть перемещено", + "updateNotAllowedWithoutPK": "Обновление не разрешено для таблицы, которая не имеет первичного ключа", "autoIncFieldNotEditable": "Auto increment field is not editable", - "editingPKnotSupported": "Editing primary key not supported", - "deletedCache": "Deleted cache successfully", - "cacheEmpty": "Cache is empty", + "editingPKnotSupported": "Редактирование первичного ключа не поддерживается", + "deletedCache": "Очистка кэша завершена", + "cacheEmpty": "Кэш пуст", "exportedCache": "Exported Cache Successfully", - "valueAlreadyInList": "This value is already in the list", - "noColumnsToUpdate": "No columns to update", - "tableDeleted": "Deleted table successfully", + "valueAlreadyInList": "Это значение уже есть в списке", + "noColumnsToUpdate": "Нет столбцов для обновления", + "tableDeleted": "Таблица успешно удалена", "generatePublicShareableReadonlyBase": "Generate publicly shareable readonly base", - "deleteViewConfirmation": "Are you sure you want to delete this view?", - "deleteTableConfirmation": "Do you want to delete the table", + "deleteViewConfirmation": "Вы действительно хотите удалить это представление?", + "deleteTableConfirmation": "Вы действительно хотите удалить эту таблицу", "showM2mTables": "Show M2M Tables", "deleteKanbanStackConfirmation": "Deleting this stack will also remove the select option `{stackToBeDeleted}` from the `{groupingField}`. The records will move to the uncategorized stack.", "computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure", @@ -639,13 +639,13 @@ "passwdLength": "Ваш пароль должен быть не короче 8 символов", "passwdMismatch": "Пароли не совпадают", "completeRuleSet": "At least 8 characters with one Uppercase, one number and one special character", - "atLeast8Char": "At least 8 characters", - "atLeastOneUppercase": "One Uppercase letter", - "atLeastOneNumber": "One Number", - "atLeastOneSpecialChar": "One special character", - "allowedSpecialCharList": "Allowed special character list" + "atLeast8Char": "Минимум 8 символов", + "atLeastOneUppercase": "Одна прописная буква", + "atLeastOneNumber": "Одна цифра", + "atLeastOneSpecialChar": "Один специальный символ", + "allowedSpecialCharList": "Список разрешенных специальных символов" }, - "invalidURL": "Invalid URL", + "invalidURL": "Неверный URL", "internalError": "Some internal error occurred", "templateGeneratorNotFound": "Template Generator cannot be found!", "fileUploadFailed": "Failed to upload file", diff --git a/packages/nc-gui/package-lock.json b/packages/nc-gui/package-lock.json index ece9e3e56f..c4a1c9ac9a 100644 --- a/packages/nc-gui/package-lock.json +++ b/packages/nc-gui/package-lock.json @@ -90,6 +90,28 @@ "windicss": "^3.5.6" } }, + "../nocodb-sdk": { + "version": "0.100.2", + "license": "AGPL-3.0-or-later", + "dependencies": { + "axios": "^0.21.1", + "jsep": "^1.3.6" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "typescript": "^4.0.2" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -8417,6 +8439,7 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "devOptional": true, "funding": [ { "type": "individual", @@ -11772,21 +11795,8 @@ } }, "node_modules/nocodb-sdk": { - "version": "0.100.2", - "resolved": "file:../nocodb-sdk", - "license": "AGPL-3.0-or-later", - "dependencies": { - "axios": "^0.21.1", - "jsep": "^1.3.6" - } - }, - "node_modules/nocodb-sdk/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } + "resolved": "../nocodb-sdk", + "link": true }, "node_modules/node-abi": { "version": "3.23.0", @@ -23632,7 +23642,8 @@ "follow-redirects": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "devOptional": true }, "form-data": { "version": "4.0.0", @@ -26100,20 +26111,22 @@ } }, "nocodb-sdk": { - "version": "0.100.2", + "version": "file:../nocodb-sdk", "requires": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "jsep": "^1.3.6" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - } + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "jsep": "^1.3.6", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "typescript": "^4.0.2" } }, "node-abi": { diff --git a/packages/nc-gui/utils/parsers/parserHelpers.ts b/packages/nc-gui/utils/parsers/parserHelpers.ts index b0759389b6..36986b3007 100644 --- a/packages/nc-gui/utils/parsers/parserHelpers.ts +++ b/packages/nc-gui/utils/parsers/parserHelpers.ts @@ -21,7 +21,7 @@ const booleanOptions = [ const aggBooleanOptions: any = booleanOptions.reduce((obj, o) => ({ ...obj, ...o }), {}) const getColVal = (row: any, col?: number) => { - return row && col ? row[col] : row + return row && col !== undefined ? row[col] : row } export const isCheckboxType: any = (values: [], col?: number) => { diff --git a/packages/noco-docs/content/en/getting-started/installation.md b/packages/noco-docs/content/en/getting-started/installation.md index f019870064..a23eb4fcaa 100644 --- a/packages/noco-docs/content/en/getting-started/installation.md +++ b/packages/noco-docs/content/en/getting-started/installation.md @@ -14,18 +14,6 @@ Simple installation - takes about three minutes! ## Quick try -### Heroku - -Before doing so, make sure you have a Heroku account. By default, an add-on Heroku Postgres will be used as meta database. You can see the connection string defined in `DATABASE_URL` by navigating to Heroku App Settings and selecting Config Vars. - - - Deploy NocoDB to Heroku with 1-Click - - ### Docker If you are a Docker user, you may try this way! @@ -466,7 +454,7 @@ It is mandatory to configure `NC_DB` environment variables for production usecas | NC_DB | Yes | See our database URLs | A local SQLite will be created in root folder | | | NC_DB_JSON | Yes | Can be used instead of `NC_DB` and value should be valid knex connection JSON | | | | NC_DB_JSON_FILE | Yes | Can be used instead of `NC_DB` and value should be a valid path to knex connection JSON | | | -| DATABASE_URL | No | JDBC URL Format. Can be used instead of NC_DB. Used in 1-Click Heroku deployment | | | +| DATABASE_URL | No | JDBC URL Format. Can be used instead of NC_DB. | | | | DATABASE_URL_FILE | No | Can be used instead of DATABASE_URL: path to file containing JDBC URL Format. | | | | NC_AUTH_JWT_SECRET | Yes | JWT secret used for auth and storing other secrets | A Random secret will be generated | | | PORT | No | For setting app running port | `8080` | | @@ -486,7 +474,6 @@ It is mandatory to configure `NC_DB` environment variables for production usecas | NC_GOOGLE_CLIENT_ID | No | Google client id to enable google authentication | | | | NC_GOOGLE_CLIENT_SECRET | No | Google client secret to enable google authentication | | | | NC_MIGRATIONS_DISABLED | No | Disable NocoDB migration | | | -| NC_ONE_CLICK | No | Used for Heroku one-click deployment | | | | NC_MIN | No | If set to any non-empty string the default splash screen(initial welcome animation) and matrix screensaver will disable | | | | NC_SENTRY_DSN | No | For Sentry monitoring | | | | NC_REDIS_URL | No | Custom Redis URL. Example: `redis://:authpassword@127.0.0.1:6380/4` | Meta data will be stored in memory | | @@ -526,7 +513,4 @@ It is mandatory to configure `NC_DB` environment variables for production usecas ### Using NPX - - -### Heroku Deployment - + \ No newline at end of file diff --git a/packages/noco-docs/content/en/getting-started/upgrading.md b/packages/noco-docs/content/en/getting-started/upgrading.md index e1f6d75685..84b628abb9 100644 --- a/packages/noco-docs/content/en/getting-started/upgrading.md +++ b/packages/noco-docs/content/en/getting-started/upgrading.md @@ -1,6 +1,6 @@ --- title: 'Upgrading' -description: 'Upgrading NocoDB : Docker, Node, Heroku and Homebrew!' +description: 'Upgrading NocoDB : Docker, Node and Homebrew!' position: 20 category: 'Getting started' menuTitle: 'Upgrading' @@ -60,44 +60,6 @@ npm uninstall nocodb npm install --save nocodb ``` -## Heroku - -### Using the Heroku CLI login - -```bash -heroku container:login -docker pull nocodb/nocodb:latest -docker tag nocodb/nocodb:latest registry.heroku.com//web -docker push registry.heroku.com//web -heroku container:release -a web -``` - -#### On Apple M1 Chipset - -> Please make sure you change Docker's default architecture to `linux/amd64` by running the following command _before_ executing the aforementioned steps -> -> ```export DOCKER_DEFAULT_PLATFORM=linux/amd64``` -> -> More details can be found [here](https://medium.com/geekculture/from-apple-silicon-to-heroku-docker-registry-without-swearing-36a2f59b30a3). - -### Using GitHub - -Fork the [nocodb-seed-heroku repository](https://github.com/nocodb/nocodb-seed-heroku) to your GitHub account. -Login to Heroku, go to your NocoDB app, and head to the "Deploy" tab. -Select "GitHub" in the "Deployment method" section. - -In the "Connect to GitHub" section, search for your forked nocodb-seed-heroku repo. Connect to it: - -![image](https://user-images.githubusercontent.com/55474996/143479577-e8bdc1f0-99d1-4072-8d95-4879cc54ddb2.png) - -In the "Automatic deploys" section, select "Enable Automatic Deploys": - -![image](https://user-images.githubusercontent.com/55474996/143479705-b5280199-aa31-40db-a5aa-7586eb918c01.png) - -Head back to your forked nocodb-seed-heroku repo on your GitHub account. Edit one of your files and make a simple modification (example, add some random characters to the readme.md) and commit the change directly to the main branch. - -This will trigger the Heroku deployment. Your app should now be updated to the latest release of NocoDB. - ## Homebrew Run following commands to upgrade Homebrew Nocodb version. diff --git a/packages/noco-docs/package-lock.json b/packages/noco-docs/package-lock.json index 8d7e5b58a7..b649a13567 100644 --- a/packages/noco-docs/package-lock.json +++ b/packages/noco-docs/package-lock.json @@ -12676,9 +12676,9 @@ } }, "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -26779,9 +26779,9 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } diff --git a/packages/nocodb-sdk/.cspell.json b/packages/nocodb-sdk/.cspell.json index 59c785dd42..f122c09e5f 100644 --- a/packages/nocodb-sdk/.cspell.json +++ b/packages/nocodb-sdk/.cspell.json @@ -31,4 +31,4 @@ "tsconfig.json", "node_modules/**" ] -} +} diff --git a/packages/nocodb-sdk/src/lib/formulaHelpers.ts b/packages/nocodb-sdk/src/lib/formulaHelpers.ts index 237e1ac4af..94f22b79b5 100644 --- a/packages/nocodb-sdk/src/lib/formulaHelpers.ts +++ b/packages/nocodb-sdk/src/lib/formulaHelpers.ts @@ -19,7 +19,10 @@ export const jsepCurlyHook = { context.index += 1; env.node = { type: jsep.IDENTIFIER, - name: nodes.map((node) => node.name).join(' '), + // column name with space would break it down to jsep.IDENTIFIER + jsep.LITERAL + // either take node.name for jsep.IDENTIFIER + // or take node.value for jsep.LITERAL + name: nodes.map((node) => node.name || node.value).join(' '), }; return env.node; } else { diff --git a/packages/nocodb/README.md b/packages/nocodb/README.md index b348b6d25c..7318eee241 100644 --- a/packages/nocodb/README.md +++ b/packages/nocodb/README.md @@ -4,19 +4,18 @@ Even though this package is a backend project, you can still visit the dashboard as it includes ``nc-lib-gui``. -``` - +```sh npm install npm run watch:run # open localhost:8080/dashboard in browser ``` -As ``nc-lib-gui`` is hosted in npm registry, for local development, you should run ``nc-gui`` separately. +As ``nc-lib-gui`` is hosted in the npm registry, for local development, you should run ``nc-gui`` separately. -If you wish to combine the frontend and backend together in your local devlopment environment, you may use ``packages/nc-lib-gui`` as a local depenedency by updating the ``packages/nocodb/package.json`` to +If you wish to combine the frontend and backend together in your local development environment, you may use ``packages/nc-lib-gui`` as a local dependency by updating the ``packages/nocodb/package.json`` to ```json "nc-lib-gui": "file:../nc-lib-gui" ``` -In this case, whenever there is any changes made in frontend, you need to run ``npm run build:copy`` under ``packages/nc-gui/``. +In this case, whenever there are any changes made in the frontend, you need to run ``npm run build:copy`` under ``packages/nc-gui/``. diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json index a3e2075d27..6efa3fe845 100644 --- a/packages/nocodb/package-lock.json +++ b/packages/nocodb/package-lock.json @@ -63,7 +63,7 @@ "multer": "^1.4.2", "mysql2": "^2.2.5", "nanoid": "^3.1.20", - "nc-help": "0.2.79", + "nc-help": "0.2.82", "nc-lib-gui": "0.100.2", "nc-plugin": "0.1.2", "ncp": "^2.0.0", @@ -151,6 +151,28 @@ "vuedraggable": "^2.24.3" } }, + "../nocodb-sdk": { + "version": "0.100.2", + "license": "AGPL-3.0-or-later", + "dependencies": { + "axios": "^0.21.1", + "jsep": "^1.3.6" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "typescript": "^4.0.2" + } + }, "node_modules/@azure/abort-controller": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", @@ -455,11 +477,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -706,6 +728,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", @@ -3009,14 +3036,14 @@ "dev": true }, "node_modules/bull": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/bull/-/bull-4.9.0.tgz", - "integrity": "sha512-yiaSb41dywjIhJ3i1mczjQGDmM6pLIoM1Ea0Gcf5HKDxOoEzL5i9XEEKW7fbsj7u083UEOnQ4gSWfbWIUDO6JQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/bull/-/bull-4.10.2.tgz", + "integrity": "sha512-xa65xtWjQsLqYU/eNaXxq9VRG8xd6qNsQEjR7yjYuae05xKrzbVMVj2QgrYsTMmSs/vsqJjHqHSRRiW1+IkGXQ==", "dependencies": { "cron-parser": "^4.2.1", "debuglog": "^1.0.0", "get-port": "^5.1.1", - "ioredis": "^4.28.5", + "ioredis": "^5.0.0", "lodash": "^4.17.21", "msgpackr": "^1.5.2", "p-timeout": "^3.2.0", @@ -3024,7 +3051,38 @@ "uuid": "^8.3.0" }, "engines": { - "node": ">=10.1" + "node": ">=12" + } + }, + "node_modules/bull/node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/bull/node_modules/ioredis": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", + "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.0.1", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" } }, "node_modules/bullmq": { @@ -10567,9 +10625,9 @@ } }, "node_modules/nc-help": { - "version": "0.2.79", - "resolved": "https://registry.npmjs.org/nc-help/-/nc-help-0.2.79.tgz", - "integrity": "sha512-r5lzCJE6OGA32KFhNm2uZdt+KtCGNZNTVJztjLnMPKTzHqHxM6+IqrNohOdwdW2b4qMu2LTM+gXloYacbLY6Qg==", + "version": "0.2.82", + "resolved": "https://registry.npmjs.org/nc-help/-/nc-help-0.2.82.tgz", + "integrity": "sha512-R/jGDhMt4qEA17Hev6XbJHSkNm2W+n2vkilUMhOK/oBvFtG/2Vf9fsTdBanFW6ZY7y7Tdhi5BFTVvGtx/CRlrw==", "dependencies": { "@rudderstack/rudder-sdk-node": "^1.1.3", "axios": "^0.21.1", @@ -10634,13 +10692,8 @@ "dev": true }, "node_modules/nocodb-sdk": { - "version": "0.100.2", - "resolved": "file:../nocodb-sdk", - "license": "AGPL-3.0-or-later", - "dependencies": { - "axios": "^0.21.1", - "jsep": "^1.3.6" - } + "resolved": "../nocodb-sdk", + "link": true }, "node_modules/node-abort-controller": { "version": "3.0.1", @@ -12784,9 +12837,9 @@ "dev": true }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regex-not": { "version": "1.0.2", @@ -13224,9 +13277,9 @@ } }, "node_modules/safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", "engines": { "node": ">=10" } @@ -17993,11 +18046,11 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@bitauth/libauth": { @@ -18191,6 +18244,11 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, "@jridgewell/resolve-uri": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", @@ -20075,19 +20133,42 @@ "dev": true }, "bull": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/bull/-/bull-4.9.0.tgz", - "integrity": "sha512-yiaSb41dywjIhJ3i1mczjQGDmM6pLIoM1Ea0Gcf5HKDxOoEzL5i9XEEKW7fbsj7u083UEOnQ4gSWfbWIUDO6JQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/bull/-/bull-4.10.2.tgz", + "integrity": "sha512-xa65xtWjQsLqYU/eNaXxq9VRG8xd6qNsQEjR7yjYuae05xKrzbVMVj2QgrYsTMmSs/vsqJjHqHSRRiW1+IkGXQ==", "requires": { "cron-parser": "^4.2.1", "debuglog": "^1.0.0", "get-port": "^5.1.1", - "ioredis": "^4.28.5", + "ioredis": "^5.0.0", "lodash": "^4.17.21", "msgpackr": "^1.5.2", "p-timeout": "^3.2.0", "semver": "^7.3.2", "uuid": "^8.3.0" + }, + "dependencies": { + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, + "ioredis": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", + "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "requires": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.0.1", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + } + } } }, "bullmq": { @@ -25987,9 +26068,9 @@ "integrity": "sha512-3AryS9uwa5NfISLxMciUonrH7YfXp+nlahB9T7girXIsLQrmwX4MdnuKs32akduCOGpKmjTJSWmATULbuMkbfw==" }, "nc-help": { - "version": "0.2.79", - "resolved": "https://registry.npmjs.org/nc-help/-/nc-help-0.2.79.tgz", - "integrity": "sha512-r5lzCJE6OGA32KFhNm2uZdt+KtCGNZNTVJztjLnMPKTzHqHxM6+IqrNohOdwdW2b4qMu2LTM+gXloYacbLY6Qg==", + "version": "0.2.82", + "resolved": "https://registry.npmjs.org/nc-help/-/nc-help-0.2.82.tgz", + "integrity": "sha512-R/jGDhMt4qEA17Hev6XbJHSkNm2W+n2vkilUMhOK/oBvFtG/2Vf9fsTdBanFW6ZY7y7Tdhi5BFTVvGtx/CRlrw==", "requires": { "@rudderstack/rudder-sdk-node": "^1.1.3", "axios": "^0.21.1", @@ -26042,10 +26123,22 @@ "dev": true }, "nocodb-sdk": { - "version": "0.100.2", + "version": "file:../nocodb-sdk", "requires": { + "@typescript-eslint/eslint-plugin": "^4.0.1", + "@typescript-eslint/parser": "^4.0.1", "axios": "^0.21.1", - "jsep": "^1.3.6" + "cspell": "^4.1.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-functional": "^3.0.2", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^4.0.0", + "jsep": "^1.3.6", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.1", + "typescript": "^4.0.2" } }, "node-abort-controller": { @@ -27688,9 +27781,9 @@ "dev": true }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regex-not": { "version": "1.0.2", @@ -28021,9 +28114,9 @@ } }, "safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==" }, "safer-buffer": { "version": "2.1.2", diff --git a/packages/nocodb/package.json b/packages/nocodb/package.json index af6b535349..a421d41fe6 100644 --- a/packages/nocodb/package.json +++ b/packages/nocodb/package.json @@ -103,7 +103,7 @@ "multer": "^1.4.2", "mysql2": "^2.2.5", "nanoid": "^3.1.20", - "nc-help": "0.2.79", + "nc-help": "0.2.82", "nc-lib-gui": "0.100.2", "nc-plugin": "0.1.2", "ncp": "^2.0.0", diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts index 115e5e7d03..ccced13ce2 100644 --- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts +++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts @@ -19,6 +19,8 @@ class SqliteClient extends KnexClient { private _version: any; constructor(connectionConfig) { + // sqlite does not support inserting default values and knex fires a warning without this flag + connectionConfig.connection.useNullAsDefault = true; super(connectionConfig); this.sqlClient = knex(connectionConfig.connection); this.queries = queries; diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts index 429252ae59..25f5d7c348 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts @@ -1987,11 +1987,15 @@ class BaseModelSqlv2 { async bulkDelete(ids: any[], { cookie }: { cookie?: any } = {}) { let transaction; try { + const deleteIds = await Promise.all( + ids.map((d) => this.model.mapAliasToColumn(d)) + ); + transaction = await this.dbDriver.transaction(); // await this.beforeDeleteb(ids, transaction); const res = []; - for (const d of ids) { + for (const d of deleteIds) { if (Object.keys(d).length) { const response = await transaction(this.model.table_name) .del() diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts index 526f954df6..b114d11526 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/CustomKnex.ts @@ -988,6 +988,11 @@ function parseNestedCondition(obj, qb, pKey?, table?, tableAlias?) { type CustomKnex = Knex; function CustomKnex(arg: string | Knex.Config | any): CustomKnex { + // sqlite does not support inserting default values and knex fires a warning without this flag + if (arg?.client === 'sqlite3') { + arg.useNullAsDefault = true; + } + const kn: any = knex(arg); const knexRaw = kn.raw; diff --git a/packages/nocodb/src/lib/meta/MetaAPILogger.ts b/packages/nocodb/src/lib/meta/MetaAPILogger.ts index 8531e96c44..88aac02eec 100644 --- a/packages/nocodb/src/lib/meta/MetaAPILogger.ts +++ b/packages/nocodb/src/lib/meta/MetaAPILogger.ts @@ -11,7 +11,6 @@ export default class MetaAPILogger { connection: { filename: 'noco_log.db', }, - useNullAsDefault: true, }); } diff --git a/packages/nocodb/src/lib/meta/NcMetaIOImpl.ts b/packages/nocodb/src/lib/meta/NcMetaIOImpl.ts index e2b3e87a0c..578afa059f 100644 --- a/packages/nocodb/src/lib/meta/NcMetaIOImpl.ts +++ b/packages/nocodb/src/lib/meta/NcMetaIOImpl.ts @@ -77,10 +77,6 @@ export default class NcMetaIOImpl extends NcMetaIO { constructor(app: Noco, config: NcConfig, trx = null) { super(app, config); - if (this.config?.meta?.db?.client === 'sqlite3') { - this.config.meta.db.useNullAsDefault = true; - } - if (this.config?.meta?.db) { this.connection = trx || XKnex(this.config?.meta?.db); } else { diff --git a/packages/nocodb/src/lib/meta/api/dataApis/helpers.ts b/packages/nocodb/src/lib/meta/api/dataApis/helpers.ts index 0a8b5c5a15..2a9398fab0 100644 --- a/packages/nocodb/src/lib/meta/api/dataApis/helpers.ts +++ b/packages/nocodb/src/lib/meta/api/dataApis/helpers.ts @@ -57,7 +57,10 @@ export async function extractXlsxData(view: View, req: Request) { }); const { offset, dbRows, elapsed } = await getDbRows(baseModel, view, req); - const data = XLSX.utils.json_to_sheet(dbRows); + + const fields = req.query.fields as string[]; + + const data = XLSX.utils.json_to_sheet(dbRows, { header: fields }); return { offset, dbRows, elapsed, data }; } diff --git a/packages/nocodb/src/lib/meta/api/projectApis.ts b/packages/nocodb/src/lib/meta/api/projectApis.ts index cafc073080..e2f07a1147 100644 --- a/packages/nocodb/src/lib/meta/api/projectApis.ts +++ b/packages/nocodb/src/lib/meta/api/projectApis.ts @@ -138,7 +138,6 @@ async function projectCreate(req: Request, res) { connection: { filename: `${toolDir}/nc_minimal_dbs/${projectTitle}_${dbId}.db`, }, - useNullAsDefault: true, }, }, inflection_column: 'camelize', diff --git a/packages/nocodb/src/lib/meta/api/publicApis/publicDataExportApis.ts b/packages/nocodb/src/lib/meta/api/publicApis/publicDataExportApis.ts index 6d56f2f393..530504c9b7 100644 --- a/packages/nocodb/src/lib/meta/api/publicApis/publicDataExportApis.ts +++ b/packages/nocodb/src/lib/meta/api/publicApis/publicDataExportApis.ts @@ -32,7 +32,9 @@ async function exportExcel(req: Request, res: Response) { const { offset, dbRows, elapsed } = await getDbRows(model, view, req); - const data = XLSX.utils.json_to_sheet(dbRows); + const fields = req.query.fields as string[]; + + const data = XLSX.utils.json_to_sheet(dbRows, { header: fields }); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, data, view.title); const buf = XLSX.write(wb, { type: 'base64', bookType: 'xlsx' }); diff --git a/packages/nocodb/src/lib/meta/helpers/extractProps.ts b/packages/nocodb/src/lib/meta/helpers/extractProps.ts index 426937d196..639891992c 100644 --- a/packages/nocodb/src/lib/meta/helpers/extractProps.ts +++ b/packages/nocodb/src/lib/meta/helpers/extractProps.ts @@ -1,6 +1,6 @@ import DOMPurify from 'isomorphic-dompurify'; -export function extractProps(body: T, props: string[]): Partial { +export function extractProps(body: T, props: string[]): Partial { // todo: throw error if no props found return props.reduce((o, key) => { if (key in body) o[key] = body[key]; @@ -8,7 +8,7 @@ export function extractProps(body: T, props: string[]): Partial { }, {}); } -export function extractPropsAndSanitize( +export function extractPropsAndSanitize( body: T, props: string[] ): Partial { diff --git a/packages/nocodb/src/lib/utils/NcConfigFactory.ts b/packages/nocodb/src/lib/utils/NcConfigFactory.ts index 75c7924475..7424b1b2ba 100644 --- a/packages/nocodb/src/lib/utils/NcConfigFactory.ts +++ b/packages/nocodb/src/lib/utils/NcConfigFactory.ts @@ -200,7 +200,6 @@ export default class NcConfigFactory implements NcConfig { }, database: url.searchParams.get('d') || url.searchParams.get('database'), - useNullAsDefault: true, }, } as any; } else { @@ -496,7 +495,6 @@ export default class NcConfigFactory implements NcConfig { connection: { ...dbConnectionConfig, database: dbConnectionConfig.connection.filename, - useNullAsDefault: true, }, }; } diff --git a/tests/playwright/fixtures/expectedBaseDownloadData.txt b/tests/playwright/fixtures/expectedBaseDownloadData.txt index ffce972614..36d43c36ba 100644 --- a/tests/playwright/fixtures/expectedBaseDownloadData.txt +++ b/tests/playwright/fixtures/expectedBaseDownloadData.txt @@ -1,110 +1,110 @@ -Country,City List -Afghanistan,Kabul -Algeria,"Batna, Bchar, Skikda" -American Samoa,Tafuna -Angola,"Benguela, Namibe" -Anguilla,South Hill -Argentina,"Almirante Brown, Avellaneda, Baha Blanca, Crdoba, Escobar, Ezeiza, La Plata, Merlo, Quilmes, San Miguel de Tucumn, Santa F, Tandil, Vicente Lpez" -Armenia,Yerevan -Australia,Woodridge -Austria,"Graz, Linz, Salzburg" -Azerbaijan,"Baku, Sumqayit" -Bahrain,al-Manama -Bangladesh,"Dhaka, Jamalpur, Tangail" -Belarus,"Mogiljov, Molodetno" -Bolivia,"El Alto, Sucre" -Brazil,"Alvorada, Angra dos Reis, Anpolis, Aparecida de Goinia, Araatuba, Bag, Belm, Blumenau, Boa Vista, Braslia, Goinia, Guaruj, guas Lindas de Gois, Ibirit, Juazeiro do Norte, Juiz de Fora, Luzinia, Maring, Po, Poos de Caldas, Rio Claro, Santa Brbara dOeste, Santo Andr, So Bernardo do Campo, So Leopoldo" -Brunei,Bandar Seri Begawan -Bulgaria,"Ruse, Stara Zagora" -Cambodia,"Battambang, Phnom Penh" -Cameroon,"Bamenda, Yaound" -Canada,"Gatineau, Halifax, Lethbridge, London, Oshawa, Richmond Hill, Vancouver" -Chad,NDjamna -Chile,"Antofagasta, Coquimbo, Rancagua" -China,"Baicheng, Baiyin, Binzhou, Changzhou, Datong, Daxian, Dongying, Emeishan, Enshi, Ezhou, Fuyu, Fuzhou, Haining, Hami, Hohhot, Huaian, Jinchang, Jining, Jinzhou, Junan, Korla, Laiwu, Laohekou, Lengshuijiang, Leshan" -Colombia,"Buenaventura, Dos Quebradas, Florencia, Pereira, Sincelejo, Sogamoso" -"Congo, The Democratic Republic of the","Lubumbashi, Mwene-Ditu" -Czech Republic,Olomouc -Dominican Republic,"La Romana, San Felipe de Puerto Plata, Santiago de los Caballeros" -Ecuador,"Loja, Portoviejo, Robamba" -Egypt,"Bilbays, Idfu, Mit Ghamr, Qalyub, Sawhaj, Shubra al-Khayma" -Estonia,Tartu -Ethiopia,Addis Abeba -Faroe Islands,Trshavn -Finland,Oulu -France,"Brest, Le Mans, Toulon, Toulouse" -French Guiana,Cayenne -French Polynesia,"Faaa, Papeete" -Gambia,Banjul -Germany,"Duisburg, Erlangen, Halle/Saale, Mannheim, Saarbrcken, Siegen, Witten" -Greece,"Athenai, Patras" -Greenland,Nuuk -Holy See (Vatican City State),Citt del Vaticano -Hong Kong,Kowloon and New Kowloon -Hungary,Szkesfehrvr -India,"Adoni, Ahmadnagar, Allappuzha (Alleppey), Ambattur, Amroha, Balurghat, Berhampore (Baharampur), Bhavnagar, Bhilwara, Bhimavaram, Bhopal, Bhusawal, Bijapur, Chandrapur, Chapra, Dhule (Dhulia), Etawah, Firozabad, Gandhinagar, Gulbarga, Haldia, Halisahar, Hoshiarpur, Hubli-Dharwad, Jaipur" -Indonesia,"Cianjur, Ciomas, Ciparay, Gorontalo, Jakarta, Lhokseumawe, Madiun, Pangkal Pinang, Pemalang, Pontianak, Probolinggo, Purwakarta, Surakarta, Tegal" -Iran,"Arak, Esfahan, Kermanshah, Najafabad, Qomsheh, Shahr-e Kord, Sirjan, Tabriz" -Iraq,Mosul -Israel,"Ashdod, Ashqelon, Bat Yam, Tel Aviv-Jaffa" -Italy,"Alessandria, Bergamo, Brescia, Brindisi, Livorno, Syrakusa, Udine" -Japan,"Akishima, Fukuyama, Higashiosaka, Hino, Hiroshima, Isesaki, Iwaki, Iwakuni, Iwatsuki, Izumisano, Kakamigahara, Kamakura, Kanazawa, Koriyama, Kurashiki, Kuwana, Matsue, Miyakonojo, Nagareyama, Okayama, Okinawa, Omiya, Onomichi, Otsu, Sagamihara" -Kazakstan,"Pavlodar, Zhezqazghan" -Kenya,"Kisumu, Nyeri" -Kuwait,Jalib al-Shuyukh -Latvia,"Daugavpils, Liepaja" -Liechtenstein,Vaduz -Lithuania,Vilnius -Madagascar,Mahajanga -Malawi,Lilongwe -Malaysia,"Ipoh, Kuching, Sungai Petani" -Mexico,"Acua, Allende, Atlixco, Carmen, Celaya, Coacalco de Berriozbal, Coatzacoalcos, Cuauhtmoc, Cuautla, Cuernavaca, El Fuerte, Guadalajara, Hidalgo, Huejutla de Reyes, Huixquilucan, Jos Azueta, Jurez, La Paz, Matamoros, Mexicali, Monclova, Nezahualcyotl, Pachuca de Soto, Salamanca, San Felipe del Progreso" -Moldova,Chisinau -Morocco,"Beni-Mellal, Nador, Sal" -Mozambique,"Beira, Naala-Porto, Tete" -Myanmar,"Monywa, Myingyan" -Nauru,Yangor -Nepal,Birgunj -Netherlands,"Amersfoort, Apeldoorn, Ede, Emmen, s-Hertogenbosch" -New Zealand,Hamilton -Nigeria,"Benin City, Deba Habe, Effon-Alaiye, Ife, Ikerre, Ilorin, Kaduna, Ogbomosho, Ondo, Owo, Oyo, Sokoto, Zaria" -North Korea,Pyongyang -Oman,"Masqat, Salala" -Pakistan,"Dadu, Mandi Bahauddin, Mardan, Okara, Shikarpur" -Paraguay,"Asuncin, Ciudad del Este, San Lorenzo" -Peru,"Callao, Hunuco, Lima, Sullana" -Philippines,"Baybay, Bayugan, Bislig, Cabuyao, Cavite, Davao, Gingoog, Hagonoy, Iligan, Imus, Lapu-Lapu, Mandaluyong, Ozamis, Santa Rosa, Taguig, Talavera, Tanauan, Tanza, Tarlac, Tuguegarao" -Poland,"Bydgoszcz, Czestochowa, Jastrzebie-Zdrj, Kalisz, Lublin, Plock, Tychy, Wroclaw" -Puerto Rico,"Arecibo, Ponce" -Romania,"Botosani, Bucuresti" -Runion,Saint-Denis -Russian Federation,"Atinsk, Balaiha, Dzerzinsk, Elista, Ivanovo, Jaroslavl, Jelets, Kaliningrad, Kamyin, Kirovo-Tepetsk, Kolpino, Korolev, Kurgan, Kursk, Lipetsk, Ljubertsy, Maikop, Moscow, Nabereznyje Telny, Niznekamsk, Novoterkassk, Pjatigorsk, Serpuhov, Smolensk, Syktyvkar" -Saint Vincent and the Grenadines,Kingstown -Saudi Arabia,"Abha, al-Hawiya, al-Qatif, Jedda, Tabuk" -Senegal,Ziguinchor -Slovakia,Bratislava -South Africa,"Boksburg, Botshabelo, Chatsworth, Johannesburg, Kimberley, Klerksdorp, Newcastle, Paarl, Rustenburg, Soshanguve, Springs" -South Korea,"Cheju, Kimchon, Naju, Tonghae, Uijongbu" -Spain,"A Corua (La Corua), Donostia-San Sebastin, Gijn, Ourense (Orense), Santiago de Compostela" -Sri Lanka,Jaffna -Sudan,"al-Qadarif, Omdurman" -Sweden,Malm -Switzerland,"Basel, Bern, Lausanne" -Taiwan,"Changhwa, Chiayi, Chungho, Fengshan, Hsichuh, Lungtan, Nantou, Tanshui, Touliu, Tsaotun" -Tanzania,"Mwanza, Tabora, Zanzibar" -Thailand,"Nakhon Sawan, Pak Kret, Songkhla" -Tonga,Nukualofa -Tunisia,Sousse -Turkey,"Adana, Balikesir, Batman, Denizli, Eskisehir, Gaziantep, Inegl, Kilis, Ktahya, Osmaniye, Sivas, Sultanbeyli, Tarsus, Tokat, Usak" -Turkmenistan,Ashgabat -Tuvalu,Funafuti -Ukraine,"Kamjanets-Podilskyi, Konotop, Mukateve, ostka, Simferopol, Sumy" -United Arab Emirates,"Abu Dhabi, al-Ayn, Sharja" -United Kingdom,"Bradford, Dundee, London, Southampton, Southend-on-Sea, Southport, Stockport, York" -United States,"Akron, Arlington, Augusta-Richmond County, Aurora, Bellevue, Brockton, Cape Coral, Citrus Heights, Clarksville, Compton, Dallas, Dayton, El Monte, Fontana, Garden Grove, Garland, Grand Prairie, Greensboro, Joliet, Kansas City, Lancaster, Laredo, Lincoln, Manchester, Memphis" -Venezuela,"Barcelona, Caracas, Cuman, Maracabo, Ocumare del Tuy, Valencia, Valle de la Pascua" -Vietnam,"Cam Ranh, Haiphong, Hanoi, Nam Dinh, Nha Trang, Vinh" -"Virgin Islands, U.S.",Charlotte Amalie -Yemen,"Aden, Hodeida, Sanaa, Taizz" -Yugoslavia,"Kragujevac, Novi Sad" +Country,City List +Afghanistan,Kabul +Algeria,"Batna, Bchar, Skikda" +American Samoa,Tafuna +Angola,"Benguela, Namibe" +Anguilla,South Hill +Argentina,"Almirante Brown, Avellaneda, Baha Blanca, Crdoba, Escobar, Ezeiza, La Plata, Merlo, Quilmes, San Miguel de Tucumn, Santa F, Tandil, Vicente Lpez" +Armenia,Yerevan +Australia,Woodridge +Austria,"Graz, Linz, Salzburg" +Azerbaijan,"Baku, Sumqayit" +Bahrain,al-Manama +Bangladesh,"Dhaka, Jamalpur, Tangail" +Belarus,"Mogiljov, Molodetno" +Bolivia,"El Alto, Sucre" +Brazil,"Alvorada, Angra dos Reis, Anpolis, Aparecida de Goinia, Araatuba, Bag, Belm, Blumenau, Boa Vista, Braslia, Goinia, Guaruj, guas Lindas de Gois, Ibirit, Juazeiro do Norte, Juiz de Fora, Luzinia, Maring, Po, Poos de Caldas, Rio Claro, Santa Brbara dOeste, Santo Andr, So Bernardo do Campo, So Leopoldo" +Brunei,Bandar Seri Begawan +Bulgaria,"Ruse, Stara Zagora" +Cambodia,"Battambang, Phnom Penh" +Cameroon,"Bamenda, Yaound" +Canada,"Gatineau, Halifax, Lethbridge, London, Oshawa, Richmond Hill, Vancouver" +Chad,NDjamna +Chile,"Antofagasta, Coquimbo, Rancagua" +China,"Baicheng, Baiyin, Binzhou, Changzhou, Datong, Daxian, Dongying, Emeishan, Enshi, Ezhou, Fuyu, Fuzhou, Haining, Hami, Hohhot, Huaian, Jinchang, Jining, Jinzhou, Junan, Korla, Laiwu, Laohekou, Lengshuijiang, Leshan" +Colombia,"Buenaventura, Dos Quebradas, Florencia, Pereira, Sincelejo, Sogamoso" +"Congo, The Democratic Republic of the","Lubumbashi, Mwene-Ditu" +Czech Republic,Olomouc +Dominican Republic,"La Romana, San Felipe de Puerto Plata, Santiago de los Caballeros" +Ecuador,"Loja, Portoviejo, Robamba" +Egypt,"Bilbays, Idfu, Mit Ghamr, Qalyub, Sawhaj, Shubra al-Khayma" +Estonia,Tartu +Ethiopia,Addis Abeba +Faroe Islands,Trshavn +Finland,Oulu +France,"Brest, Le Mans, Toulon, Toulouse" +French Guiana,Cayenne +French Polynesia,"Faaa, Papeete" +Gambia,Banjul +Germany,"Duisburg, Erlangen, Halle/Saale, Mannheim, Saarbrcken, Siegen, Witten" +Greece,"Athenai, Patras" +Greenland,Nuuk +Holy See (Vatican City State),Citt del Vaticano +Hong Kong,Kowloon and New Kowloon +Hungary,Szkesfehrvr +India,"Adoni, Ahmadnagar, Allappuzha (Alleppey), Ambattur, Amroha, Balurghat, Berhampore (Baharampur), Bhavnagar, Bhilwara, Bhimavaram, Bhopal, Bhusawal, Bijapur, Chandrapur, Chapra, Dhule (Dhulia), Etawah, Firozabad, Gandhinagar, Gulbarga, Haldia, Halisahar, Hoshiarpur, Hubli-Dharwad, Jaipur" +Indonesia,"Cianjur, Ciomas, Ciparay, Gorontalo, Jakarta, Lhokseumawe, Madiun, Pangkal Pinang, Pemalang, Pontianak, Probolinggo, Purwakarta, Surakarta, Tegal" +Iran,"Arak, Esfahan, Kermanshah, Najafabad, Qomsheh, Shahr-e Kord, Sirjan, Tabriz" +Iraq,Mosul +Israel,"Ashdod, Ashqelon, Bat Yam, Tel Aviv-Jaffa" +Italy,"Alessandria, Bergamo, Brescia, Brindisi, Livorno, Syrakusa, Udine" +Japan,"Akishima, Fukuyama, Higashiosaka, Hino, Hiroshima, Isesaki, Iwaki, Iwakuni, Iwatsuki, Izumisano, Kakamigahara, Kamakura, Kanazawa, Koriyama, Kurashiki, Kuwana, Matsue, Miyakonojo, Nagareyama, Okayama, Okinawa, Omiya, Onomichi, Otsu, Sagamihara" +Kazakstan,"Pavlodar, Zhezqazghan" +Kenya,"Kisumu, Nyeri" +Kuwait,Jalib al-Shuyukh +Latvia,"Daugavpils, Liepaja" +Liechtenstein,Vaduz +Lithuania,Vilnius +Madagascar,Mahajanga +Malawi,Lilongwe +Malaysia,"Ipoh, Kuching, Sungai Petani" +Mexico,"Acua, Allende, Atlixco, Carmen, Celaya, Coacalco de Berriozbal, Coatzacoalcos, Cuauhtmoc, Cuautla, Cuernavaca, El Fuerte, Guadalajara, Hidalgo, Huejutla de Reyes, Huixquilucan, Jos Azueta, Jurez, La Paz, Matamoros, Mexicali, Monclova, Nezahualcyotl, Pachuca de Soto, Salamanca, San Felipe del Progreso" +Moldova,Chisinau +Morocco,"Beni-Mellal, Nador, Sal" +Mozambique,"Beira, Naala-Porto, Tete" +Myanmar,"Monywa, Myingyan" +Nauru,Yangor +Nepal,Birgunj +Netherlands,"Amersfoort, Apeldoorn, Ede, Emmen, s-Hertogenbosch" +New Zealand,Hamilton +Nigeria,"Benin City, Deba Habe, Effon-Alaiye, Ife, Ikerre, Ilorin, Kaduna, Ogbomosho, Ondo, Owo, Oyo, Sokoto, Zaria" +North Korea,Pyongyang +Oman,"Masqat, Salala" +Pakistan,"Dadu, Mandi Bahauddin, Mardan, Okara, Shikarpur" +Paraguay,"Asuncin, Ciudad del Este, San Lorenzo" +Peru,"Callao, Hunuco, Lima, Sullana" +Philippines,"Baybay, Bayugan, Bislig, Cabuyao, Cavite, Davao, Gingoog, Hagonoy, Iligan, Imus, Lapu-Lapu, Mandaluyong, Ozamis, Santa Rosa, Taguig, Talavera, Tanauan, Tanza, Tarlac, Tuguegarao" +Poland,"Bydgoszcz, Czestochowa, Jastrzebie-Zdrj, Kalisz, Lublin, Plock, Tychy, Wroclaw" +Puerto Rico,"Arecibo, Ponce" +Romania,"Botosani, Bucuresti" +Runion,Saint-Denis +Russian Federation,"Atinsk, Balaiha, Dzerzinsk, Elista, Ivanovo, Jaroslavl, Jelets, Kaliningrad, Kamyin, Kirovo-Tepetsk, Kolpino, Korolev, Kurgan, Kursk, Lipetsk, Ljubertsy, Maikop, Moscow, Nabereznyje Telny, Niznekamsk, Novoterkassk, Pjatigorsk, Serpuhov, Smolensk, Syktyvkar" +Saint Vincent and the Grenadines,Kingstown +Saudi Arabia,"Abha, al-Hawiya, al-Qatif, Jedda, Tabuk" +Senegal,Ziguinchor +Slovakia,Bratislava +South Africa,"Boksburg, Botshabelo, Chatsworth, Johannesburg, Kimberley, Klerksdorp, Newcastle, Paarl, Rustenburg, Soshanguve, Springs" +South Korea,"Cheju, Kimchon, Naju, Tonghae, Uijongbu" +Spain,"A Corua (La Corua), Donostia-San Sebastin, Gijn, Ourense (Orense), Santiago de Compostela" +Sri Lanka,Jaffna +Sudan,"al-Qadarif, Omdurman" +Sweden,Malm +Switzerland,"Basel, Bern, Lausanne" +Taiwan,"Changhwa, Chiayi, Chungho, Fengshan, Hsichuh, Lungtan, Nantou, Tanshui, Touliu, Tsaotun" +Tanzania,"Mwanza, Tabora, Zanzibar" +Thailand,"Nakhon Sawan, Pak Kret, Songkhla" +Tonga,Nukualofa +Tunisia,Sousse +Turkey,"Adana, Balikesir, Batman, Denizli, Eskisehir, Gaziantep, Inegl, Kilis, Ktahya, Osmaniye, Sivas, Sultanbeyli, Tarsus, Tokat, Usak" +Turkmenistan,Ashgabat +Tuvalu,Funafuti +Ukraine,"Kamjanets-Podilskyi, Konotop, Mukateve, ostka, Simferopol, Sumy" +United Arab Emirates,"Abu Dhabi, al-Ayn, Sharja" +United Kingdom,"Bradford, Dundee, London, Southampton, Southend-on-Sea, Southport, Stockport, York" +United States,"Akron, Arlington, Augusta-Richmond County, Aurora, Bellevue, Brockton, Cape Coral, Citrus Heights, Clarksville, Compton, Dallas, Dayton, El Monte, Fontana, Garden Grove, Garland, Grand Prairie, Greensboro, Joliet, Kansas City, Lancaster, Laredo, Lincoln, Manchester, Memphis" +Venezuela,"Barcelona, Caracas, Cuman, Maracabo, Ocumare del Tuy, Valencia, Valle de la Pascua" +Vietnam,"Cam Ranh, Haiphong, Hanoi, Nam Dinh, Nha Trang, Vinh" +"Virgin Islands, U.S.",Charlotte Amalie +Yemen,"Aden, Hodeida, Sanaa, Taizz" +Yugoslavia,"Kragujevac, Novi Sad" Zambia,Kitwe \ No newline at end of file diff --git a/tests/playwright/fixtures/expectedBaseDownloadDataPg.txt b/tests/playwright/fixtures/expectedBaseDownloadDataPg.txt index ffce972614..36d43c36ba 100644 --- a/tests/playwright/fixtures/expectedBaseDownloadDataPg.txt +++ b/tests/playwright/fixtures/expectedBaseDownloadDataPg.txt @@ -1,110 +1,110 @@ -Country,City List -Afghanistan,Kabul -Algeria,"Batna, Bchar, Skikda" -American Samoa,Tafuna -Angola,"Benguela, Namibe" -Anguilla,South Hill -Argentina,"Almirante Brown, Avellaneda, Baha Blanca, Crdoba, Escobar, Ezeiza, La Plata, Merlo, Quilmes, San Miguel de Tucumn, Santa F, Tandil, Vicente Lpez" -Armenia,Yerevan -Australia,Woodridge -Austria,"Graz, Linz, Salzburg" -Azerbaijan,"Baku, Sumqayit" -Bahrain,al-Manama -Bangladesh,"Dhaka, Jamalpur, Tangail" -Belarus,"Mogiljov, Molodetno" -Bolivia,"El Alto, Sucre" -Brazil,"Alvorada, Angra dos Reis, Anpolis, Aparecida de Goinia, Araatuba, Bag, Belm, Blumenau, Boa Vista, Braslia, Goinia, Guaruj, guas Lindas de Gois, Ibirit, Juazeiro do Norte, Juiz de Fora, Luzinia, Maring, Po, Poos de Caldas, Rio Claro, Santa Brbara dOeste, Santo Andr, So Bernardo do Campo, So Leopoldo" -Brunei,Bandar Seri Begawan -Bulgaria,"Ruse, Stara Zagora" -Cambodia,"Battambang, Phnom Penh" -Cameroon,"Bamenda, Yaound" -Canada,"Gatineau, Halifax, Lethbridge, London, Oshawa, Richmond Hill, Vancouver" -Chad,NDjamna -Chile,"Antofagasta, Coquimbo, Rancagua" -China,"Baicheng, Baiyin, Binzhou, Changzhou, Datong, Daxian, Dongying, Emeishan, Enshi, Ezhou, Fuyu, Fuzhou, Haining, Hami, Hohhot, Huaian, Jinchang, Jining, Jinzhou, Junan, Korla, Laiwu, Laohekou, Lengshuijiang, Leshan" -Colombia,"Buenaventura, Dos Quebradas, Florencia, Pereira, Sincelejo, Sogamoso" -"Congo, The Democratic Republic of the","Lubumbashi, Mwene-Ditu" -Czech Republic,Olomouc -Dominican Republic,"La Romana, San Felipe de Puerto Plata, Santiago de los Caballeros" -Ecuador,"Loja, Portoviejo, Robamba" -Egypt,"Bilbays, Idfu, Mit Ghamr, Qalyub, Sawhaj, Shubra al-Khayma" -Estonia,Tartu -Ethiopia,Addis Abeba -Faroe Islands,Trshavn -Finland,Oulu -France,"Brest, Le Mans, Toulon, Toulouse" -French Guiana,Cayenne -French Polynesia,"Faaa, Papeete" -Gambia,Banjul -Germany,"Duisburg, Erlangen, Halle/Saale, Mannheim, Saarbrcken, Siegen, Witten" -Greece,"Athenai, Patras" -Greenland,Nuuk -Holy See (Vatican City State),Citt del Vaticano -Hong Kong,Kowloon and New Kowloon -Hungary,Szkesfehrvr -India,"Adoni, Ahmadnagar, Allappuzha (Alleppey), Ambattur, Amroha, Balurghat, Berhampore (Baharampur), Bhavnagar, Bhilwara, Bhimavaram, Bhopal, Bhusawal, Bijapur, Chandrapur, Chapra, Dhule (Dhulia), Etawah, Firozabad, Gandhinagar, Gulbarga, Haldia, Halisahar, Hoshiarpur, Hubli-Dharwad, Jaipur" -Indonesia,"Cianjur, Ciomas, Ciparay, Gorontalo, Jakarta, Lhokseumawe, Madiun, Pangkal Pinang, Pemalang, Pontianak, Probolinggo, Purwakarta, Surakarta, Tegal" -Iran,"Arak, Esfahan, Kermanshah, Najafabad, Qomsheh, Shahr-e Kord, Sirjan, Tabriz" -Iraq,Mosul -Israel,"Ashdod, Ashqelon, Bat Yam, Tel Aviv-Jaffa" -Italy,"Alessandria, Bergamo, Brescia, Brindisi, Livorno, Syrakusa, Udine" -Japan,"Akishima, Fukuyama, Higashiosaka, Hino, Hiroshima, Isesaki, Iwaki, Iwakuni, Iwatsuki, Izumisano, Kakamigahara, Kamakura, Kanazawa, Koriyama, Kurashiki, Kuwana, Matsue, Miyakonojo, Nagareyama, Okayama, Okinawa, Omiya, Onomichi, Otsu, Sagamihara" -Kazakstan,"Pavlodar, Zhezqazghan" -Kenya,"Kisumu, Nyeri" -Kuwait,Jalib al-Shuyukh -Latvia,"Daugavpils, Liepaja" -Liechtenstein,Vaduz -Lithuania,Vilnius -Madagascar,Mahajanga -Malawi,Lilongwe -Malaysia,"Ipoh, Kuching, Sungai Petani" -Mexico,"Acua, Allende, Atlixco, Carmen, Celaya, Coacalco de Berriozbal, Coatzacoalcos, Cuauhtmoc, Cuautla, Cuernavaca, El Fuerte, Guadalajara, Hidalgo, Huejutla de Reyes, Huixquilucan, Jos Azueta, Jurez, La Paz, Matamoros, Mexicali, Monclova, Nezahualcyotl, Pachuca de Soto, Salamanca, San Felipe del Progreso" -Moldova,Chisinau -Morocco,"Beni-Mellal, Nador, Sal" -Mozambique,"Beira, Naala-Porto, Tete" -Myanmar,"Monywa, Myingyan" -Nauru,Yangor -Nepal,Birgunj -Netherlands,"Amersfoort, Apeldoorn, Ede, Emmen, s-Hertogenbosch" -New Zealand,Hamilton -Nigeria,"Benin City, Deba Habe, Effon-Alaiye, Ife, Ikerre, Ilorin, Kaduna, Ogbomosho, Ondo, Owo, Oyo, Sokoto, Zaria" -North Korea,Pyongyang -Oman,"Masqat, Salala" -Pakistan,"Dadu, Mandi Bahauddin, Mardan, Okara, Shikarpur" -Paraguay,"Asuncin, Ciudad del Este, San Lorenzo" -Peru,"Callao, Hunuco, Lima, Sullana" -Philippines,"Baybay, Bayugan, Bislig, Cabuyao, Cavite, Davao, Gingoog, Hagonoy, Iligan, Imus, Lapu-Lapu, Mandaluyong, Ozamis, Santa Rosa, Taguig, Talavera, Tanauan, Tanza, Tarlac, Tuguegarao" -Poland,"Bydgoszcz, Czestochowa, Jastrzebie-Zdrj, Kalisz, Lublin, Plock, Tychy, Wroclaw" -Puerto Rico,"Arecibo, Ponce" -Romania,"Botosani, Bucuresti" -Runion,Saint-Denis -Russian Federation,"Atinsk, Balaiha, Dzerzinsk, Elista, Ivanovo, Jaroslavl, Jelets, Kaliningrad, Kamyin, Kirovo-Tepetsk, Kolpino, Korolev, Kurgan, Kursk, Lipetsk, Ljubertsy, Maikop, Moscow, Nabereznyje Telny, Niznekamsk, Novoterkassk, Pjatigorsk, Serpuhov, Smolensk, Syktyvkar" -Saint Vincent and the Grenadines,Kingstown -Saudi Arabia,"Abha, al-Hawiya, al-Qatif, Jedda, Tabuk" -Senegal,Ziguinchor -Slovakia,Bratislava -South Africa,"Boksburg, Botshabelo, Chatsworth, Johannesburg, Kimberley, Klerksdorp, Newcastle, Paarl, Rustenburg, Soshanguve, Springs" -South Korea,"Cheju, Kimchon, Naju, Tonghae, Uijongbu" -Spain,"A Corua (La Corua), Donostia-San Sebastin, Gijn, Ourense (Orense), Santiago de Compostela" -Sri Lanka,Jaffna -Sudan,"al-Qadarif, Omdurman" -Sweden,Malm -Switzerland,"Basel, Bern, Lausanne" -Taiwan,"Changhwa, Chiayi, Chungho, Fengshan, Hsichuh, Lungtan, Nantou, Tanshui, Touliu, Tsaotun" -Tanzania,"Mwanza, Tabora, Zanzibar" -Thailand,"Nakhon Sawan, Pak Kret, Songkhla" -Tonga,Nukualofa -Tunisia,Sousse -Turkey,"Adana, Balikesir, Batman, Denizli, Eskisehir, Gaziantep, Inegl, Kilis, Ktahya, Osmaniye, Sivas, Sultanbeyli, Tarsus, Tokat, Usak" -Turkmenistan,Ashgabat -Tuvalu,Funafuti -Ukraine,"Kamjanets-Podilskyi, Konotop, Mukateve, ostka, Simferopol, Sumy" -United Arab Emirates,"Abu Dhabi, al-Ayn, Sharja" -United Kingdom,"Bradford, Dundee, London, Southampton, Southend-on-Sea, Southport, Stockport, York" -United States,"Akron, Arlington, Augusta-Richmond County, Aurora, Bellevue, Brockton, Cape Coral, Citrus Heights, Clarksville, Compton, Dallas, Dayton, El Monte, Fontana, Garden Grove, Garland, Grand Prairie, Greensboro, Joliet, Kansas City, Lancaster, Laredo, Lincoln, Manchester, Memphis" -Venezuela,"Barcelona, Caracas, Cuman, Maracabo, Ocumare del Tuy, Valencia, Valle de la Pascua" -Vietnam,"Cam Ranh, Haiphong, Hanoi, Nam Dinh, Nha Trang, Vinh" -"Virgin Islands, U.S.",Charlotte Amalie -Yemen,"Aden, Hodeida, Sanaa, Taizz" -Yugoslavia,"Kragujevac, Novi Sad" +Country,City List +Afghanistan,Kabul +Algeria,"Batna, Bchar, Skikda" +American Samoa,Tafuna +Angola,"Benguela, Namibe" +Anguilla,South Hill +Argentina,"Almirante Brown, Avellaneda, Baha Blanca, Crdoba, Escobar, Ezeiza, La Plata, Merlo, Quilmes, San Miguel de Tucumn, Santa F, Tandil, Vicente Lpez" +Armenia,Yerevan +Australia,Woodridge +Austria,"Graz, Linz, Salzburg" +Azerbaijan,"Baku, Sumqayit" +Bahrain,al-Manama +Bangladesh,"Dhaka, Jamalpur, Tangail" +Belarus,"Mogiljov, Molodetno" +Bolivia,"El Alto, Sucre" +Brazil,"Alvorada, Angra dos Reis, Anpolis, Aparecida de Goinia, Araatuba, Bag, Belm, Blumenau, Boa Vista, Braslia, Goinia, Guaruj, guas Lindas de Gois, Ibirit, Juazeiro do Norte, Juiz de Fora, Luzinia, Maring, Po, Poos de Caldas, Rio Claro, Santa Brbara dOeste, Santo Andr, So Bernardo do Campo, So Leopoldo" +Brunei,Bandar Seri Begawan +Bulgaria,"Ruse, Stara Zagora" +Cambodia,"Battambang, Phnom Penh" +Cameroon,"Bamenda, Yaound" +Canada,"Gatineau, Halifax, Lethbridge, London, Oshawa, Richmond Hill, Vancouver" +Chad,NDjamna +Chile,"Antofagasta, Coquimbo, Rancagua" +China,"Baicheng, Baiyin, Binzhou, Changzhou, Datong, Daxian, Dongying, Emeishan, Enshi, Ezhou, Fuyu, Fuzhou, Haining, Hami, Hohhot, Huaian, Jinchang, Jining, Jinzhou, Junan, Korla, Laiwu, Laohekou, Lengshuijiang, Leshan" +Colombia,"Buenaventura, Dos Quebradas, Florencia, Pereira, Sincelejo, Sogamoso" +"Congo, The Democratic Republic of the","Lubumbashi, Mwene-Ditu" +Czech Republic,Olomouc +Dominican Republic,"La Romana, San Felipe de Puerto Plata, Santiago de los Caballeros" +Ecuador,"Loja, Portoviejo, Robamba" +Egypt,"Bilbays, Idfu, Mit Ghamr, Qalyub, Sawhaj, Shubra al-Khayma" +Estonia,Tartu +Ethiopia,Addis Abeba +Faroe Islands,Trshavn +Finland,Oulu +France,"Brest, Le Mans, Toulon, Toulouse" +French Guiana,Cayenne +French Polynesia,"Faaa, Papeete" +Gambia,Banjul +Germany,"Duisburg, Erlangen, Halle/Saale, Mannheim, Saarbrcken, Siegen, Witten" +Greece,"Athenai, Patras" +Greenland,Nuuk +Holy See (Vatican City State),Citt del Vaticano +Hong Kong,Kowloon and New Kowloon +Hungary,Szkesfehrvr +India,"Adoni, Ahmadnagar, Allappuzha (Alleppey), Ambattur, Amroha, Balurghat, Berhampore (Baharampur), Bhavnagar, Bhilwara, Bhimavaram, Bhopal, Bhusawal, Bijapur, Chandrapur, Chapra, Dhule (Dhulia), Etawah, Firozabad, Gandhinagar, Gulbarga, Haldia, Halisahar, Hoshiarpur, Hubli-Dharwad, Jaipur" +Indonesia,"Cianjur, Ciomas, Ciparay, Gorontalo, Jakarta, Lhokseumawe, Madiun, Pangkal Pinang, Pemalang, Pontianak, Probolinggo, Purwakarta, Surakarta, Tegal" +Iran,"Arak, Esfahan, Kermanshah, Najafabad, Qomsheh, Shahr-e Kord, Sirjan, Tabriz" +Iraq,Mosul +Israel,"Ashdod, Ashqelon, Bat Yam, Tel Aviv-Jaffa" +Italy,"Alessandria, Bergamo, Brescia, Brindisi, Livorno, Syrakusa, Udine" +Japan,"Akishima, Fukuyama, Higashiosaka, Hino, Hiroshima, Isesaki, Iwaki, Iwakuni, Iwatsuki, Izumisano, Kakamigahara, Kamakura, Kanazawa, Koriyama, Kurashiki, Kuwana, Matsue, Miyakonojo, Nagareyama, Okayama, Okinawa, Omiya, Onomichi, Otsu, Sagamihara" +Kazakstan,"Pavlodar, Zhezqazghan" +Kenya,"Kisumu, Nyeri" +Kuwait,Jalib al-Shuyukh +Latvia,"Daugavpils, Liepaja" +Liechtenstein,Vaduz +Lithuania,Vilnius +Madagascar,Mahajanga +Malawi,Lilongwe +Malaysia,"Ipoh, Kuching, Sungai Petani" +Mexico,"Acua, Allende, Atlixco, Carmen, Celaya, Coacalco de Berriozbal, Coatzacoalcos, Cuauhtmoc, Cuautla, Cuernavaca, El Fuerte, Guadalajara, Hidalgo, Huejutla de Reyes, Huixquilucan, Jos Azueta, Jurez, La Paz, Matamoros, Mexicali, Monclova, Nezahualcyotl, Pachuca de Soto, Salamanca, San Felipe del Progreso" +Moldova,Chisinau +Morocco,"Beni-Mellal, Nador, Sal" +Mozambique,"Beira, Naala-Porto, Tete" +Myanmar,"Monywa, Myingyan" +Nauru,Yangor +Nepal,Birgunj +Netherlands,"Amersfoort, Apeldoorn, Ede, Emmen, s-Hertogenbosch" +New Zealand,Hamilton +Nigeria,"Benin City, Deba Habe, Effon-Alaiye, Ife, Ikerre, Ilorin, Kaduna, Ogbomosho, Ondo, Owo, Oyo, Sokoto, Zaria" +North Korea,Pyongyang +Oman,"Masqat, Salala" +Pakistan,"Dadu, Mandi Bahauddin, Mardan, Okara, Shikarpur" +Paraguay,"Asuncin, Ciudad del Este, San Lorenzo" +Peru,"Callao, Hunuco, Lima, Sullana" +Philippines,"Baybay, Bayugan, Bislig, Cabuyao, Cavite, Davao, Gingoog, Hagonoy, Iligan, Imus, Lapu-Lapu, Mandaluyong, Ozamis, Santa Rosa, Taguig, Talavera, Tanauan, Tanza, Tarlac, Tuguegarao" +Poland,"Bydgoszcz, Czestochowa, Jastrzebie-Zdrj, Kalisz, Lublin, Plock, Tychy, Wroclaw" +Puerto Rico,"Arecibo, Ponce" +Romania,"Botosani, Bucuresti" +Runion,Saint-Denis +Russian Federation,"Atinsk, Balaiha, Dzerzinsk, Elista, Ivanovo, Jaroslavl, Jelets, Kaliningrad, Kamyin, Kirovo-Tepetsk, Kolpino, Korolev, Kurgan, Kursk, Lipetsk, Ljubertsy, Maikop, Moscow, Nabereznyje Telny, Niznekamsk, Novoterkassk, Pjatigorsk, Serpuhov, Smolensk, Syktyvkar" +Saint Vincent and the Grenadines,Kingstown +Saudi Arabia,"Abha, al-Hawiya, al-Qatif, Jedda, Tabuk" +Senegal,Ziguinchor +Slovakia,Bratislava +South Africa,"Boksburg, Botshabelo, Chatsworth, Johannesburg, Kimberley, Klerksdorp, Newcastle, Paarl, Rustenburg, Soshanguve, Springs" +South Korea,"Cheju, Kimchon, Naju, Tonghae, Uijongbu" +Spain,"A Corua (La Corua), Donostia-San Sebastin, Gijn, Ourense (Orense), Santiago de Compostela" +Sri Lanka,Jaffna +Sudan,"al-Qadarif, Omdurman" +Sweden,Malm +Switzerland,"Basel, Bern, Lausanne" +Taiwan,"Changhwa, Chiayi, Chungho, Fengshan, Hsichuh, Lungtan, Nantou, Tanshui, Touliu, Tsaotun" +Tanzania,"Mwanza, Tabora, Zanzibar" +Thailand,"Nakhon Sawan, Pak Kret, Songkhla" +Tonga,Nukualofa +Tunisia,Sousse +Turkey,"Adana, Balikesir, Batman, Denizli, Eskisehir, Gaziantep, Inegl, Kilis, Ktahya, Osmaniye, Sivas, Sultanbeyli, Tarsus, Tokat, Usak" +Turkmenistan,Ashgabat +Tuvalu,Funafuti +Ukraine,"Kamjanets-Podilskyi, Konotop, Mukateve, ostka, Simferopol, Sumy" +United Arab Emirates,"Abu Dhabi, al-Ayn, Sharja" +United Kingdom,"Bradford, Dundee, London, Southampton, Southend-on-Sea, Southport, Stockport, York" +United States,"Akron, Arlington, Augusta-Richmond County, Aurora, Bellevue, Brockton, Cape Coral, Citrus Heights, Clarksville, Compton, Dallas, Dayton, El Monte, Fontana, Garden Grove, Garland, Grand Prairie, Greensboro, Joliet, Kansas City, Lancaster, Laredo, Lincoln, Manchester, Memphis" +Venezuela,"Barcelona, Caracas, Cuman, Maracabo, Ocumare del Tuy, Valencia, Valle de la Pascua" +Vietnam,"Cam Ranh, Haiphong, Hanoi, Nam Dinh, Nha Trang, Vinh" +"Virgin Islands, U.S.",Charlotte Amalie +Yemen,"Aden, Hodeida, Sanaa, Taizz" +Yugoslavia,"Kragujevac, Novi Sad" Zambia,Kitwe \ No newline at end of file diff --git a/tests/playwright/fixtures/expectedData.txt b/tests/playwright/fixtures/expectedData.txt index 6de66cde96..8e6d239482 100644 --- a/tests/playwright/fixtures/expectedData.txt +++ b/tests/playwright/fixtures/expectedData.txt @@ -1,4 +1,4 @@ -Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List1 -1661 Abha Drive,Tamil Nadu,14400,270456873752,"{""x"":78.8214191,""y"":10.3812871}",1,,Pudukkottai, -1993 Tabuk Lane,Tamil Nadu,64221,648482415405,"{""x"":80.1270701,""y"":12.9246028}",2,,Tambaram, +Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List1 +1661 Abha Drive,Tamil Nadu,14400,270456873752,"{""x"":78.8214191,""y"":10.3812871}",1,,Pudukkottai, +1993 Tabuk Lane,Tamil Nadu,64221,648482415405,"{""x"":80.1270701,""y"":12.9246028}",2,,Tambaram, 381 Kabul Way,Taipei,87272,55477302294,"{""x"":0,""y"":0}",2,,Hsichuh, \ No newline at end of file diff --git a/tests/playwright/fixtures/expectedDataSqlite.txt b/tests/playwright/fixtures/expectedDataSqlite.txt index cbf8d9cccb..188590b915 100644 --- a/tests/playwright/fixtures/expectedDataSqlite.txt +++ b/tests/playwright/fixtures/expectedDataSqlite.txt @@ -1,19 +1,19 @@ -Address,District,PostalCode,Phone,Customer List,Staff List,City,Staff List1 -1013 Tabuk Boulevard," ",96203," ",2,,Kanchrapara, -1168 Najafabad Parkway," ",40301," ",1,,Kabul, -1294 Firozabad Drive," ",70618," ",2,,Pingxiang, -1342 Abha Boulevard," ",10714," ",2,,Bucuresti, -1368 Maracabo Boulevard," ",32716," ",2,,South Hill, -1427 Tabuk Place," ",31342," ",2,,Cape Coral, -1519 Santiago de los Caballeros Loop," ",22025," ",2,,Mwene-Ditu, -1661 Abha Drive," ",14400," ",1,,Pudukkottai, -17 Kabul Boulevard," ",38594," ",1,,Nagareyama, -1838 Tabriz Lane," ",1195," ",1,,Dhaka, -1888 Kabul Drive," ",20936," ",1,,Ife, -1892 Nabereznyje Telny Lane," ",28396," ",2,,Tafuna, -1993 Tabuk Lane," ",64221," ",2,,Tambaram, -217 Botshabelo Place," ",49521," ",2,,Davao, -381 Kabul Way," ",87272," ",2,,Hsichuh, -44 Najafabad Way," ",61391," ",2,,Donostia-San Sebastin, -48 Maracabo Place," ",1570," ",1,,Talavera, +Address,District,PostalCode,Phone,Customer List,Staff List,City,Staff List1 +1013 Tabuk Boulevard," ",96203," ",2,,Kanchrapara, +1168 Najafabad Parkway," ",40301," ",1,,Kabul, +1294 Firozabad Drive," ",70618," ",2,,Pingxiang, +1342 Abha Boulevard," ",10714," ",2,,Bucuresti, +1368 Maracabo Boulevard," ",32716," ",2,,South Hill, +1427 Tabuk Place," ",31342," ",2,,Cape Coral, +1519 Santiago de los Caballeros Loop," ",22025," ",2,,Mwene-Ditu, +1661 Abha Drive," ",14400," ",1,,Pudukkottai, +17 Kabul Boulevard," ",38594," ",1,,Nagareyama, +1838 Tabriz Lane," ",1195," ",1,,Dhaka, +1888 Kabul Drive," ",20936," ",1,,Ife, +1892 Nabereznyje Telny Lane," ",28396," ",2,,Tafuna, +1993 Tabuk Lane," ",64221," ",2,,Tambaram, +217 Botshabelo Place," ",49521," ",2,,Davao, +381 Kabul Way," ",87272," ",2,,Hsichuh, +44 Najafabad Way," ",61391," ",2,,Donostia-San Sebastin, +48 Maracabo Place," ",1570," ",1,,Talavera, 669 Firozabad Loop," ",92265," ",1,,al-Ayn, \ No newline at end of file diff --git a/tests/playwright/pages/Dashboard/Grid/Column/index.ts b/tests/playwright/pages/Dashboard/Grid/Column/index.ts index e3e97b3236..15bd509e27 100644 --- a/tests/playwright/pages/Dashboard/Grid/Column/index.ts +++ b/tests/playwright/pages/Dashboard/Grid/Column/index.ts @@ -85,12 +85,14 @@ export class ColumnPageObject extends BasePage { }); break; case 'Duration': - await this.get().locator('.ant-select-single').nth(1).click(); - await this.rootPage - .locator(`.ant-select-item`, { - hasText: format, - }) - .click(); + if (format) { + await this.get().locator('.ant-select-single').nth(1).click(); + await this.rootPage + .locator(`.ant-select-item`, { + hasText: format, + }) + .click(); + } break; case 'DateTime': // Date Format diff --git a/tests/playwright/pages/Dashboard/common/Cell/RatingCell.ts b/tests/playwright/pages/Dashboard/common/Cell/RatingCell.ts index e5ec9a7bc9..da8b44d9f7 100644 --- a/tests/playwright/pages/Dashboard/common/Cell/RatingCell.ts +++ b/tests/playwright/pages/Dashboard/common/Cell/RatingCell.ts @@ -14,6 +14,14 @@ export class RatingCellPageObject extends BasePage { return this.cell.get({ index, columnHeader }); } + async select({ index, columnHeader, rating }: { index?: number; columnHeader: string; rating: number }) { + await this.waitForResponse({ + uiAction: this.get({ index, columnHeader }).locator('.ant-rate-star > div').nth(rating).click(), + httpMethodsToMatch: ['POST', 'PATCH'], + requestUrlPathToMatch: 'api/v1/db/data/noco/', + }); + } + async verify({ index, columnHeader, rating }: { index?: number; columnHeader: string; rating: number }) { await expect(await this.get({ index, columnHeader }).locator(`div[role="radio"][aria-checked="true"]`)).toHaveCount( rating diff --git a/tests/playwright/pages/Dashboard/common/Cell/index.ts b/tests/playwright/pages/Dashboard/common/Cell/index.ts index bb32f48fa7..9294eda81e 100644 --- a/tests/playwright/pages/Dashboard/common/Cell/index.ts +++ b/tests/playwright/pages/Dashboard/common/Cell/index.ts @@ -54,7 +54,20 @@ export class CellPageObject extends BasePage { index, columnHeader, }); - await this.get({ index, columnHeader }).locator('input').fill(text); + const isInputBox = async () => (await this.get({ index, columnHeader }).locator('input').count()) > 0; + + for (let i = 0; i < 10; i++) { + if (await isInputBox()) { + break; + } + await this.rootPage.waitForTimeout(200); + } + + if (await isInputBox()) { + await this.get({ index, columnHeader }).locator('input').fill(text); + } else { + await this.get({ index, columnHeader }).locator('textarea').fill(text); + } } async inCellExpand({ index, columnHeader }: { index: number; columnHeader: string }) { @@ -211,7 +224,9 @@ export class CellPageObject extends BasePage { ...clickOptions: Parameters ) { await this.get({ index, columnHeader }).click(...clickOptions); + await (await this.get({ index, columnHeader }).elementHandle()).waitForElementState('stable'); await this.get({ index, columnHeader }).press((await this.isMacOs()) ? 'Meta+C' : 'Control+C'); + await this.verifyToast({ message: 'Copied to clipboard' }); } } diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts b/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts index ca999fb118..508e958be9 100644 --- a/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts +++ b/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts @@ -4,6 +4,7 @@ import { GridPage } from '../../Grid'; import { ToolbarPage } from './index'; // @ts-ignore import fs from 'fs'; +import XLSX from 'xlsx'; export class ToolbarViewMenuPage extends BasePage { readonly toolbar: ToolbarPage; @@ -38,14 +39,42 @@ export class ToolbarViewMenuPage extends BasePage { ]); // Save downloaded file somewhere - await download.saveAs('./output/at.txt'); + await download.saveAs('./output/test.txt'); // verify downloaded content against expected content - const expectedData = fs.readFileSync(expectedDataFile, 'utf8'); - const file = fs.readFileSync('./output/at.txt', 'utf8'); + const expectedData = fs.readFileSync(expectedDataFile, 'utf8').replace(/\r/g, '').split('\n'); + const file = fs.readFileSync('./output/test.txt', 'utf8').replace(/\r/g, '').split('\n'); await expect(file).toEqual(expectedData); } + async verifyDownloadAsXLSX({ + downloadLocator, + expectedDataFile, + }: { + downloadLocator: Locator; + expectedDataFile: string; + }) { + const [download] = await Promise.all([ + // Start waiting for the download + this.rootPage.waitForEvent('download'), + // Perform the action that initiates download + downloadLocator.click(), + ]); + + // Save downloaded file somewhere + await download.saveAs('./output/test.xlsx'); + + // convert xlsx to csv + const wb = XLSX.readFile('./output/test.xlsx'); + XLSX.writeFile(wb, './output/test.txt', { bookType: 'csv' }); + + // verify downloaded content against expected content + const expectedData = fs.readFileSync(expectedDataFile, 'utf8'); + const file = fs.readFileSync('./output/test.txt', 'utf8'); + // XLSX writes file with UTF-8 BOM, adds '\ufeff' to cater it + await expect(file).toEqual('\ufeff' + expectedData); + } + // menu items // Collaborative View // Download @@ -68,6 +97,13 @@ export class ToolbarViewMenuPage extends BasePage { .last(), expectedDataFile: verificationInfo?.verificationFile ?? './fixtures/expectedBaseDownloadData.txt', }); + } else if (subMenu === 'Download as XLSX') { + await this.verifyDownloadAsXLSX({ + downloadLocator: await this.rootPage + .locator(`.ant-dropdown-menu-title-content:has-text("${subMenu}")`) + .last(), + expectedDataFile: verificationInfo?.verificationFile ?? './fixtures/expectedBaseDownloadData.txt', + }); } else { await this.rootPage.locator(`.ant-dropdown-menu-title-content:has-text("${subMenu}")`).last().click(); } @@ -78,6 +114,11 @@ export class ToolbarViewMenuPage extends BasePage { message: 'Successfully exported all table data', }); break; + case 'Download as XLSX': + await this.verifyToast({ + message: 'Successfully exported all table data', + }); + break; case 'Locked View': await this.verifyToast({ message: 'Successfully Switched to locked view', diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/index.ts b/tests/playwright/pages/Dashboard/common/Toolbar/index.ts index 02c1f6bedb..c97c263051 100644 --- a/tests/playwright/pages/Dashboard/common/Toolbar/index.ts +++ b/tests/playwright/pages/Dashboard/common/Toolbar/index.ts @@ -128,8 +128,8 @@ export class ToolbarPage extends BasePage { await download.saveAs('./output/at.txt'); // verify downloaded content against expected content - const expectedData = fs.readFileSync(`./fixtures/${verificationFile}`, 'utf8'); - const file = fs.readFileSync('./output/at.txt', 'utf8'); + const expectedData = fs.readFileSync(`./fixtures/${verificationFile}`, 'utf8').replace(/\r/g, '').split('\n'); + const file = fs.readFileSync('./output/at.txt', 'utf8').replace(/\r/g, '').split('\n'); await expect(file).toEqual(expectedData); } diff --git a/tests/playwright/tests/gridOperations.spec.ts b/tests/playwright/tests/gridOperations.spec.ts deleted file mode 100644 index d05b9fcc54..0000000000 --- a/tests/playwright/tests/gridOperations.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { DashboardPage } from '../pages/Dashboard'; -import setup from '../setup'; - -test.describe('Grid operations', () => { - let dashboard: DashboardPage; - let context: any; - - test.beforeEach(async ({ page }) => { - context = await setup({ page }); - dashboard = new DashboardPage(page, context.project); - }); - - test('Clipboard support', async () => { - // close 'Team & Auth' tab - await dashboard.closeTab({ title: 'Team & Auth' }); - - await dashboard.treeView.createTable({ title: 'Sheet1' }); - - await dashboard.grid.column.create({ - title: 'Number', - type: 'Number', - }); - await dashboard.grid.column.create({ - title: 'Checkbox', - type: 'Checkbox', - }); - await dashboard.grid.column.create({ - title: 'Date', - type: 'Date', - }); - await dashboard.grid.column.create({ - title: 'Attachment', - type: 'Attachment', - }); - - await dashboard.grid.addNewRow({ - index: 0, - }); - await dashboard.grid.cell.click({ - index: 0, - columnHeader: 'Number', - }); - await dashboard.grid.cell.fillText({ - index: 0, - columnHeader: 'Number', - text: '123', - }); - await dashboard.grid.cell.click({ - index: 0, - columnHeader: 'Checkbox', - }); - - const today = new Date().toISOString().slice(0, 10); - await dashboard.grid.cell.date.open({ - index: 0, - columnHeader: 'Date', - }); - await dashboard.grid.cell.date.selectDate({ - date: today, - }); - await dashboard.grid.cell.date.close(); - - await dashboard.grid.cell.attachment.addFile({ - index: 0, - columnHeader: 'Attachment', - filePath: `${process.cwd()}/fixtures/sampleFiles/1.json`, - }); - - await dashboard.grid.cell.copyToClipboard({ - index: 0, - columnHeader: 'Title', - }); - expect(await dashboard.grid.cell.getClipboardText()).toBe('Row 0'); - - await dashboard.grid.cell.copyToClipboard({ - index: 0, - columnHeader: 'Number', - }); - expect(await dashboard.grid.cell.getClipboardText()).toBe('123'); - - await dashboard.grid.cell.copyToClipboard( - { - index: 0, - columnHeader: 'Checkbox', - }, - { position: { x: 1, y: 1 } } - ); - await new Promise(resolve => setTimeout(resolve, 5000)); - expect(await dashboard.grid.cell.getClipboardText()).toBe('true'); - - await dashboard.grid.cell.click({ - index: 0, - columnHeader: 'Checkbox', - }); - await dashboard.grid.cell.copyToClipboard( - { - index: 0, - columnHeader: 'Checkbox', - }, - { position: { x: 1, y: 1 } } - ); - expect(await dashboard.grid.cell.getClipboardText()).toBe('false'); - - await dashboard.grid.cell.copyToClipboard({ - index: 0, - columnHeader: 'Date', - }); - expect(await dashboard.grid.cell.getClipboardText()).toBe(today); - - await dashboard.grid.cell.copyToClipboard({ - index: 0, - columnHeader: 'Attachment', - }); - // expect(await dashboard.grid.cell.getClipboardText()).toBe('1.json'); - }); -}); diff --git a/tests/playwright/tests/keyboardShortcuts.spec.ts b/tests/playwright/tests/keyboardShortcuts.spec.ts index 168bbe948c..d9de119030 100644 --- a/tests/playwright/tests/keyboardShortcuts.spec.ts +++ b/tests/playwright/tests/keyboardShortcuts.spec.ts @@ -101,4 +101,354 @@ test.describe('Verify shortcuts', () => { await page.waitForTimeout(2000); await grid.cell.verify({ index: 1, columnHeader: 'Country', value: 'NewAlgeria' }); }); + + test('Clipboard support for cells', async () => { + // close 'Team & Auth' tab + await dashboard.closeTab({ title: 'Team & Auth' }); + + await dashboard.treeView.createTable({ title: 'Sheet1' }); + + await dashboard.grid.column.create({ + title: 'SingleLineText', + type: 'SingleLineText', + }); + await dashboard.grid.column.create({ + title: 'LongText', + type: 'LongText', + }); + await dashboard.grid.column.create({ + title: 'Number', + type: 'Number', + }); + await dashboard.grid.column.create({ + title: 'PhoneNumber', + type: 'PhoneNumber', + }); + await dashboard.grid.column.create({ + title: 'Email', + type: 'Email', + }); + await dashboard.grid.column.create({ + title: 'URL', + type: 'URL', + }); + await dashboard.grid.column.create({ + title: 'Decimal', + type: 'Decimal', + }); + await dashboard.grid.column.create({ + title: 'Percent', + type: 'Percent', + }); + await dashboard.grid.column.create({ + title: 'Currency', + type: 'Currency', + }); + await dashboard.grid.column.create({ + title: 'Duration', + type: 'Duration', + }); + await dashboard.grid.column.create({ + title: 'Rating', + type: 'Rating', + }); + await dashboard.grid.column.create({ + title: 'SingleSelect', + type: 'SingleSelect', + }); + await dashboard.grid.column.create({ + title: 'MultiSelect', + type: 'MultiSelect', + }); + await dashboard.grid.column.create({ + title: 'Checkbox', + type: 'Checkbox', + }); + await dashboard.grid.column.create({ + title: 'Date', + type: 'Date', + }); + await dashboard.grid.column.create({ + title: 'Attachment', + type: 'Attachment', + }); + + // ######################################## + + await dashboard.grid.addNewRow({ + index: 0, + }); + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'SingleLineText', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'SingleLineText', + text: 'SingleLineText', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'LongText', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'LongText', + text: 'LongText', + }); + + await grid.cell.selectOption.select({ index: 0, columnHeader: 'SingleSelect', option: 'Option 1' }); + await grid.cell.selectOption.select({ + index: 0, + columnHeader: 'MultiSelect', + option: 'Option 2', + multiSelect: true, + }); + await grid.cell.selectOption.select({ + index: 0, + columnHeader: 'MultiSelect', + option: 'Option 1', + multiSelect: true, + }); + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Number', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Number', + text: '123', + }); + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'PhoneNumber', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'PhoneNumber', + text: '987654321', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Email', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Email', + text: 'test@example.com', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'URL', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'URL', + text: 'nocodb.com', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Decimal', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Decimal', + text: '1.1', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Percent', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Percent', + text: '80', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Currency', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Currency', + text: '20', + }); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Duration', + }); + await dashboard.grid.cell.fillText({ + index: 0, + columnHeader: 'Duration', + text: '0008', + }); + + await dashboard.grid.cell.rating.select({ + index: 0, + columnHeader: 'Rating', + rating: 3, + }); + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Checkbox', + }); + + const today = new Date().toISOString().slice(0, 10); + await dashboard.grid.cell.date.open({ + index: 0, + columnHeader: 'Date', + }); + await dashboard.grid.cell.date.selectDate({ + date: today, + }); + await dashboard.grid.cell.date.close(); + + await dashboard.grid.cell.attachment.addFile({ + index: 0, + columnHeader: 'Attachment', + filePath: `${process.cwd()}/fixtures/sampleFiles/1.json`, + }); + + // ######################################## + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'SingleLineText', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('SingleLineText'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'LongText', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('LongText'); + + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'SingleSelect', + }, + { position: { x: 1, y: 1 } } + ); + expect(await dashboard.grid.cell.getClipboardText()).toBe('Option 1'); + + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'MultiSelect', + }, + { position: { x: 1, y: 1 } } + ); + expect(await dashboard.grid.cell.getClipboardText()).toContain('Option 1'); + expect(await dashboard.grid.cell.getClipboardText()).toContain('Option 2'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Title', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('Row 0'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Number', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('123'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'PhoneNumber', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('987654321'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Email', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('test@example.com'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'URL', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('nocodb.com'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Decimal', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('1.1'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Percent', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('80'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Currency', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('20'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Duration', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe('480'); + + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'Rating', + }, + { position: { x: 1, y: 1 } } + ); + expect(await dashboard.grid.cell.getClipboardText()).toBe('4'); + + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'Checkbox', + }, + { position: { x: 1, y: 1 } } + ); + await new Promise(resolve => setTimeout(resolve, 5000)); + expect(await dashboard.grid.cell.getClipboardText()).toBe('true'); + + await dashboard.grid.cell.click({ + index: 0, + columnHeader: 'Checkbox', + }); + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'Checkbox', + }, + { position: { x: 1, y: 1 } } + ); + expect(await dashboard.grid.cell.getClipboardText()).toBe('false'); + + await dashboard.grid.cell.copyToClipboard({ + index: 0, + columnHeader: 'Date', + }); + expect(await dashboard.grid.cell.getClipboardText()).toBe(today); + + await dashboard.grid.cell.copyToClipboard( + { + index: 0, + columnHeader: 'Attachment', + }, + { position: { x: 1, y: 1 } } + ); + const attachmentsInfo = JSON.parse(await dashboard.grid.cell.getClipboardText()); + expect(attachmentsInfo[0]['title']).toBe('1.json'); + }); }); diff --git a/tests/playwright/tests/viewMenu.spec.ts b/tests/playwright/tests/viewMenu.spec.ts index 51037e3b6b..39ac76bd33 100644 --- a/tests/playwright/tests/viewMenu.spec.ts +++ b/tests/playwright/tests/viewMenu.spec.ts @@ -56,4 +56,24 @@ test.describe('Grid view locked', () => { }, }); }); + + test('Download XLSX', async () => { + // close 'Team & Auth' tab + await dashboard.closeTab({ title: 'Team & Auth' }); + await dashboard.treeView.openTable({ title: 'Country' }); + + await dashboard.grid.toolbar.clickFields(); + // Hide 'LastUpdate' column + await dashboard.grid.toolbar.fields.click({ + title: 'LastUpdate', + }); + + await dashboard.grid.toolbar.viewsMenu.click({ + menu: 'Download', + subMenu: 'Download as XLSX', + verificationInfo: { + verificationFile: isPg(context) ? './fixtures/expectedBaseDownloadDataPg.txt' : null, + }, + }); + }); });