Browse Source

Merge branch 'develop' into feat/attachments

pull/4931/head
Wing-Kam Wong 2 years ago
parent
commit
b44dca7070
  1. 2
      .github/workflows/release-draft.yml
  2. 4
      .github/workflows/release-executables.yml
  3. 86
      .github/workflows/release-pr.yml
  4. 2
      charts/nocodb/.gitignore
  5. 23
      charts/nocodb/.helmignore
  6. 12
      charts/nocodb/Chart.yaml
  7. 22
      charts/nocodb/templates/NOTES.txt
  8. 82
      charts/nocodb/templates/_helpers.tpl
  9. 13
      charts/nocodb/templates/configmap.yaml
  10. 73
      charts/nocodb/templates/deployment.yaml
  11. 28
      charts/nocodb/templates/hpa.yaml
  12. 61
      charts/nocodb/templates/ingress.yaml
  13. 14
      charts/nocodb/templates/pvc.yaml
  14. 13
      charts/nocodb/templates/secret.yaml
  15. 15
      charts/nocodb/templates/service.yaml
  16. 12
      charts/nocodb/templates/serviceaccount.yaml
  17. 15
      charts/nocodb/templates/tests/test-connection.yaml
  18. 98
      charts/nocodb/values.yaml
  19. 27
      markdown/readme/languages/korean.md
  20. 2
      packages/nc-gui/components/account/UserList.vue
  21. 2
      packages/nc-gui/components/smartsheet/column/LookupOptions.vue
  22. 2
      packages/nc-gui/components/smartsheet/column/RollupOptions.vue
  23. 2
      packages/nc-gui/components/smartsheet/toolbar/ShareView.vue
  24. 13
      packages/nc-gui/composables/useSharedFormViewStore.ts
  25. 1
      packages/nc-gui/lang/ar.json
  26. 1
      packages/nc-gui/lang/bn_IN.json
  27. 1
      packages/nc-gui/lang/cs.json
  28. 1
      packages/nc-gui/lang/da.json
  29. 4
      packages/nc-gui/lang/de.json
  30. 1
      packages/nc-gui/lang/en.json
  31. 1
      packages/nc-gui/lang/es.json
  32. 1
      packages/nc-gui/lang/eu.json
  33. 1
      packages/nc-gui/lang/fa.json
  34. 1
      packages/nc-gui/lang/fi.json
  35. 81
      packages/nc-gui/lang/fr.json
  36. 1
      packages/nc-gui/lang/he.json
  37. 1
      packages/nc-gui/lang/hi.json
  38. 1
      packages/nc-gui/lang/hr.json
  39. 1
      packages/nc-gui/lang/id.json
  40. 1
      packages/nc-gui/lang/it.json
  41. 1
      packages/nc-gui/lang/ja.json
  42. 1
      packages/nc-gui/lang/ko.json
  43. 1
      packages/nc-gui/lang/lv.json
  44. 1
      packages/nc-gui/lang/nl.json
  45. 1
      packages/nc-gui/lang/no.json
  46. 1
      packages/nc-gui/lang/pl.json
  47. 1
      packages/nc-gui/lang/pt.json
  48. 1
      packages/nc-gui/lang/pt_BR.json
  49. 1
      packages/nc-gui/lang/ru.json
  50. 1
      packages/nc-gui/lang/sk.json
  51. 1
      packages/nc-gui/lang/sl.json
  52. 1
      packages/nc-gui/lang/sv.json
  53. 1
      packages/nc-gui/lang/th.json
  54. 1
      packages/nc-gui/lang/tr.json
  55. 1
      packages/nc-gui/lang/uk.json
  56. 1
      packages/nc-gui/lang/vi.json
  57. 1
      packages/nc-gui/lang/zh-Hans.json
  58. 1
      packages/nc-gui/lang/zh-Hant.json
  59. 2
      packages/nc-gui/package-lock.json
  60. 2
      packages/nc-lib-gui/package.json
  61. 4
      packages/nocodb-sdk/package-lock.json
  62. 2
      packages/nocodb-sdk/package.json
  63. 2
      packages/nocodb-sdk/src/lib/Api.ts
  64. 1
      packages/nocodb/README.md
  65. 20
      packages/nocodb/package-lock.json
  66. 4
      packages/nocodb/package.json
  67. 2
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/pg.ts
  68. 18
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts
  69. 2
      packages/nocodb/src/lib/meta/api/swagger/swaggerHtml.ts
  70. 3
      scripts/sdk/swagger.json
  71. 22
      tests/playwright/tests/columnFormula.spec.ts

2
.github/workflows/release-draft.yml

@ -56,7 +56,7 @@ jobs:
echo "TARGET_SHA=${TARGET_SHA}" >> $GITHUB_OUTPUT echo "TARGET_SHA=${TARGET_SHA}" >> $GITHUB_OUTPUT
echo "Setting TARGET_SHA: ${TARGET_SHA}" echo "Setting TARGET_SHA: ${TARGET_SHA}"
- name: Create tag - name: Create tag
uses: actions/github-script@v6 uses: actions/github-script@v3
with: with:
# need workflows permission but it's not in GITHUB_TOKEN scope # need workflows permission but it's not in GITHUB_TOKEN scope
# need a custom PAT with workflows permission here # need a custom PAT with workflows permission here

4
.github/workflows/release-executables.yml

@ -105,6 +105,8 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
draft: true
tag_name: ${{ github.event.inputs.tag || inputs.tag }}
files: | files: |
./scripts/pkg-executable/dist/Noco-win-arm64.exe ./scripts/pkg-executable/dist/Noco-win-arm64.exe
./scripts/pkg-executable/dist/Noco-win-x64.exe ./scripts/pkg-executable/dist/Noco-win-x64.exe
@ -171,6 +173,8 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
draft: true
tag_name: ${{ github.event.inputs.tag || inputs.tag }}
files: | files: |
./scripts/pkg-executable/mac-dist/Noco-macos-x64 ./scripts/pkg-executable/mac-dist/Noco-macos-x64
./scripts/pkg-executable/mac-dist/Noco-macos-arm64 ./scripts/pkg-executable/mac-dist/Noco-macos-arm64

86
.github/workflows/release-pr.yml

@ -33,7 +33,7 @@ jobs:
# Get current PR number # Get current PR number
PR_NUMBER=${{github.event.number}} PR_NUMBER=${{github.event.number}}
# Get current version # Get current version
CURRENT_VERSION=$(curl -fs https://docs.nocodb.com/releases | grep article | grep div | grep h2 | grep 'id\="[^"]*' -o | cut -c 5-) CURRENT_VERSION=$(curl -fs https://docs.nocodb.com/releases | grep article | grep div | grep h2 | grep 'id\="[^"]*' -o | cut -c 5- | cut -d\: -f1)
# Construct tag name # Construct tag name
TAG_NAME=pr-${PR_NUMBER}-${CURRENT_DATE}-${CURRENT_TIME} TAG_NAME=pr-${PR_NUMBER}-${CURRENT_DATE}-${CURRENT_TIME}
echo "TARGET_TAG=${TAG_NAME}" >> $GITHUB_OUTPUT echo "TARGET_TAG=${TAG_NAME}" >> $GITHUB_OUTPUT
@ -72,14 +72,14 @@ jobs:
DOCKERHUB_TOKEN: "${{ secrets.DOCKERHUB_TOKEN }}" DOCKERHUB_TOKEN: "${{ secrets.DOCKERHUB_TOKEN }}"
# Build executables and publish to GitHub # Build executables and publish to GitHub
release-executables: # 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' && github.event.action != 'closed' }} # 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] # needs: [set-tag, release-npm]
uses: ./.github/workflows/release-timely-executables.yml # uses: ./.github/workflows/release-timely-executables.yml
with: # with:
tag: ${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }} # tag: ${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}
secrets: # secrets:
NC_GITHUB_TOKEN: "${{ secrets.NC_GITHUB_TOKEN }}" # NC_GITHUB_TOKEN: "${{ secrets.NC_GITHUB_TOKEN }}"
# Add a comment for PR docker build # Add a comment for PR docker build
leave-comment: leave-comment:
@ -132,40 +132,40 @@ jobs:
retention-days: 2 retention-days: 2
# Add a comment for PR executable build # Add a comment for PR executable build
leave-executable-comment: # 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' && github.event.action != 'closed' }} # 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' # runs-on: 'ubuntu-latest'
needs: [release-executables, set-tag] # needs: [release-executables, set-tag]
steps: # steps:
- uses: peter-evans/commit-comment@v2 # - uses: peter-evans/commit-comment@v2
with: # with:
body: | # body: |
### Run Executables # ### Run Executables
#### MacOS # #### MacOS
```bash # ```bash
mkdir -p ./${{ needs.set-tag.outputs.current_version }}/${{ needs.set-tag.outputs.target_tag }} && cd "$_" \ # mkdir -p ./${{ needs.set-tag.outputs.current_version }}/${{ needs.set-tag.outputs.target_tag }} && cd "$_" \
&& curl http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-macos-arm64 -o noco -L \ # && curl http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-macos-arm64 -o noco -L \
&& chmod +x noco \ # && chmod +x noco \
&& ./noco # && ./noco
``` # ```
#### Linux # #### Linux
```bash # ```bash
mkdir -p ./${{ needs.set-tag.outputs.current_version }}/${{ needs.set-tag.outputs.target_tag }} && cd "$_" \ # mkdir -p ./${{ needs.set-tag.outputs.current_version }}/${{ needs.set-tag.outputs.target_tag }} && cd "$_" \
&& curl http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-linux-x64 -o noco -L \ # && curl http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-linux-x64 -o noco -L \
&& chmod +x noco \ # && chmod +x noco \
&& ./noco # && ./noco
``` # ```
#### Windows # #### Windows
```bash # ```bash
iwr http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-win-arm64.exe # iwr http://dl.nocodb.com/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}/Noco-win-arm64.exe
.\Noco-win-arm64.exe # .\Noco-win-arm64.exe
``` # ```
For executables visit [here](https://github.com/nocodb/nocodb-timely/releases/tag/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}) # 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 the uffizzi preview created off of this PR
delete-uffizzi-preview: delete-uffizzi-preview:

2
charts/nocodb/.gitignore vendored

@ -0,0 +1,2 @@
charts/
Chart.lock

23
charts/nocodb/.helmignore

@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

12
charts/nocodb/Chart.yaml

@ -0,0 +1,12 @@
apiVersion: v2
appVersion: 0.100.2
dependencies:
- condition: postgresql.enabled
name: postgresql
repository: https://charts.bitnami.com/bitnami
version: ~11.6.6
description: A Helm chart for Kubernetes
maintainers: []
name: nocodb
type: application
version: 0.3.0

22
charts/nocodb/templates/NOTES.txt

@ -0,0 +1,22 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "nocodb.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "nocodb.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "nocodb.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "nocodb.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}

82
charts/nocodb/templates/_helpers.tpl

@ -0,0 +1,82 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "nocodb.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "nocodb.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "nocodb.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "nocodb.labels" -}}
helm.sh/chart: {{ include "nocodb.chart" . }}
{{ include "nocodb.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "nocodb.selectorLabels" -}}
app.kubernetes.io/name: {{ include "nocodb.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "nocodb.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "nocodb.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
{{- define "postgresHost" -}}
{{- printf "%s-postgresql" .Release.Name }}
{{- end }}
{{- define "postgresDatabase" -}}
{{- .Values.postgresql.auth.database }}
{{- end }}
{{- define "postgresUsername" -}}
{{- .Values.postgresql.auth.username }}
{{- end }}
{{- define "postgresPassword" -}}
{{- .Values.postgresql.auth.password }}
{{- end }}
{{- define "databaseUri" -}}
{{- printf "pg://%s:5432?u=%s&p=%s&d=%s" (include "postgresHost" .) (include "postgresUsername" .) (include "postgresPassword" .) (include "postgresDatabase" .) }}
{{- end }}

13
charts/nocodb/templates/configmap.yaml

@ -0,0 +1,13 @@
{{- if .Values.extraEnvs }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
data:
{{- range $key, $value := .Values.extraEnvs }}
{{ $key }}: |-
{{- $value | nindent 4 }}
{{- end }}
{{- end }}

73
charts/nocodb/templates/deployment.yaml

@ -0,0 +1,73 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "nocodb.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "nocodb.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
volumeMounts:
- name: {{ include "nocodb.fullname" . }}
mountPath: /usr/app/data
envFrom:
- configMapRef:
name: {{ include "nocodb.fullname" . }}
- secretRef:
name: {{ include "nocodb.fullname" . }}
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: {{ include "nocodb.fullname" . }}
persistentVolumeClaim:
claimName: {{ include "nocodb.fullname" . }}

28
charts/nocodb/templates/hpa.yaml

@ -0,0 +1,28 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "nocodb.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
{{- end }}
{{- end }}

61
charts/nocodb/templates/ingress.yaml

@ -0,0 +1,61 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "nocodb.fullname" . -}}
{{- $svcPort := .Values.ingress.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

14
charts/nocodb/templates/pvc.yaml

@ -0,0 +1,14 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.selectorLabels" . | nindent 8 }}
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: {{ .Values.storage.size }}
storageClassName: {{ .Values.storage.storageClassName }}
volumeMode: Filesystem

13
charts/nocodb/templates/secret.yaml

@ -0,0 +1,13 @@
{{- if .Values.extraSecretEnvs }}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
data:
NC_DB: {{ include "databaseUri" . | b64enc}}
{{- range $key, $value := .Values.extraSecretEnvs }}
{{ $key }}: '{{ $value | b64enc }}'
{{- end }}
{{- end }}

15
charts/nocodb/templates/service.yaml

@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "nocodb.fullname" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "nocodb.selectorLabels" . | nindent 4 }}

12
charts/nocodb/templates/serviceaccount.yaml

@ -0,0 +1,12 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "nocodb.serviceAccountName" . }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}

15
charts/nocodb/templates/tests/test-connection.yaml

@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "nocodb.fullname" . }}-test-connection"
labels:
{{- include "nocodb.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "nocodb.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

98
charts/nocodb/values.yaml

@ -0,0 +1,98 @@
# Default values for nocodb.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nocodb/nocodb
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: false
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 8080
ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths: []
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}
extraEnvs:
NC_PUBLIC_URL: https:/nocodb.local.org
extraSecretEnvs:
NC_AUTH_JWT_SECRET: secretString
storage:
size: 3Gi
storageClassName: ""
postgresql:
enabled: false
auth:
database: nocodb
username: nocodb
password: secretPass
persistence:
size: 8Gi

27
markdown/readme/languages/korean.md

@ -6,7 +6,7 @@
</h1> </h1>
<p align="center"> <p align="center">
MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 똑똑한 스프레드시트로 바꿔줍니다. MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 스마트 스프레드시트로 바꿔줍니다.
</p> </p>
<div align="center"> <div align="center">
@ -32,7 +32,7 @@ MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 똑똑한 스프레드시트
<a href="https://www.producthunt.com/posts/nocodb?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-nocodb" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=297536&theme=dark" alt="NocoDB - The Open Source Airtable alternative | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a> <a href="https://www.producthunt.com/posts/nocodb?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-nocodb" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=297536&theme=dark" alt="NocoDB - The Open Source Airtable alternative | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
</p> </p>
# 바로 써보기 # 빠른 시도
### Docker 사용 ### Docker 사용
@ -65,7 +65,7 @@ npm start
### GUI ### GUI
대시보드 접근하기 : [http://localhost:8080/dashboard](http://localhost:8080/dashboard) 대시보드 접근 : [http://localhost:8080/dashboard](http://localhost:8080/dashboard)
# 커뮤니티 가입 # 커뮤니티 가입
@ -114,18 +114,17 @@ npm start
# 기능 # 기능
### 스프레드시트같은 인터페이스 ### 스프레드시트 인터페이스
- ⚡ 정말 쉬운 검색, 정렬, 필터링, 열 숨기기 - ⚡ 기본 오퍼레이션: 테이블, 칼럼, 로우 CRUD
- ⚡ 뷰 만들기: 그리드, 갤러리, 칸반, 간트 차트, 양식 - ⚡ 필드 오퍼레이션: 정렬, 필터, 칼럼 보기/숨기기
- ⚡ 뷰 공유하기: 완전 공개, 패스워드 걸고 공개 - ⚡ 뷰 타입: 그리드, 갤러리, 칸반, 간트 차트, 양식(Form)
- ⚡ 개인화하거나 잠글 수 있는 뷰 - ⚡ 공유: 공개 / 비공개 뷰 (비밀 번호 설정)
- ⚡ 이미지를 자신의 공간에 업로드 (S3, Minio, GCP, Azure, Digitalocean, Linode, OVH, Backblaze 등) - ⚡ 다양한 셀 타입: ID, LinkToAnotherRecord, Lookup, Rollup, SingleLine Text, Attachment, Currency, Formula 등
- ⚡ 역할 부여: 소유자, 작성자, 편집자, 보기 전용, 의견 제시만, 원하는 대로 - ⚡ 역할에 따른 접근 제한: 다양한 수준의 세분화된 액세스 제어
- ⚡ 접근 통제: 데이터베이스, 테이블 및 열 수준까지도 상세한 통제 가능
### 워크플로 자동화를 위한 앱스토어 ### 워크플로 자동화를 위한 앱스토어
크게 채팅, 이메일, 저장소 세 가지 카테고리에 대한 통합을 제공합니다. 자세한 사항은 <a href="https://docs.nocodb.com/setup-and-usages/app-store" target="_blank">App Store</a> 를 참고하세요.
- ⚡ 채팅: MS 팀즈, 슬랙, 디스코드, 매터모스트 - ⚡ 채팅: MS 팀즈, 슬랙, 디스코드, 매터모스트
- ⚡ 이메일: SMTP, SES, MailChimp - ⚡ 이메일: SMTP, SES, MailChimp
- ⚡ SMS: Twilio - ⚡ SMS: Twilio
@ -188,12 +187,12 @@ docker-compose up -d
여기서 확인해주세요. 여기서 확인해주세요.
[환경변수 ](https://docs.nocodb.com/getting-started/installation#environment-variables) [환경변수 ](https://docs.nocodb.com/getting-started/installation#environment-variables)
# 개발 환경에 설치하기 # 개발 환경에 설치
여기서 확인해주세요. 여기서 확인해주세요.
[개발 환경에 설치하는 법](https://docs.nocodb.com/engineering/development-setup) [개발 환경에 설치하는 법](https://docs.nocodb.com/engineering/development-setup)
# 기여하기 # 기여
여기서 확인해주세요. 여기서 확인해주세요.
[기여 가이드라인](https://github.com/nocodb/nocodb/blob/master/.github/CONTRIBUTING.md). [기여 가이드라인](https://github.com/nocodb/nocodb/blob/master/.github/CONTRIBUTING.md).

2
packages/nc-gui/components/account/UserList.vue

@ -71,7 +71,7 @@ const deleteUser = async (userId: string) => {
Modal.confirm({ Modal.confirm({
title: 'Are you sure you want to delete this user?', title: 'Are you sure you want to delete this user?',
type: 'warn', type: 'warn',
content: 'On deleting, user will remove from organization and any sync source(Airtable) created by user will get removed', content: 'Upon deletion, the user will be removed from the installation.',
onOk: async () => { onOk: async () => {
try { try {
await api.orgUsers.delete(userId) await api.orgUsers.delete(userId)

2
packages/nc-gui/components/smartsheet/column/LookupOptions.vue

@ -56,7 +56,7 @@ const columns = $computed<ColumnType[]>(() => {
<template> <template>
<div class="p-6 w-full flex flex-col border-2 mb-2 mt-4"> <div class="p-6 w-full flex flex-col border-2 mb-2 mt-4">
<div class="w-full flex flex-row space-x-2"> <div class="w-full flex flex-row space-x-2">
<a-form-item class="flex w-1/2 pb-2" :label="$t('labels.childTable')" v-bind="validateInfos.fk_relation_column_id"> <a-form-item class="flex w-1/2 pb-2" :label="$t('labels.linkToAnotherRecord')" v-bind="validateInfos.fk_relation_column_id">
<a-select <a-select
v-model:value="vModel.fk_relation_column_id" v-model:value="vModel.fk_relation_column_id"
dropdown-class-name="!w-64 nc-dropdown-relation-table" dropdown-class-name="!w-64 nc-dropdown-relation-table"

2
packages/nc-gui/components/smartsheet/column/RollupOptions.vue

@ -76,7 +76,7 @@ const columns = $computed(() => {
<template> <template>
<div class="p-6 w-full flex flex-col border-2 mb-2 mt-4"> <div class="p-6 w-full flex flex-col border-2 mb-2 mt-4">
<div class="w-full flex flex-row space-x-2"> <div class="w-full flex flex-row space-x-2">
<a-form-item class="flex w-1/2 pb-2" :label="$t('labels.childTable')" v-bind="validateInfos.fk_relation_column_id"> <a-form-item class="flex w-1/2 pb-2" :label="$t('labels.linkToAnotherRecord')" v-bind="validateInfos.fk_relation_column_id">
<a-select <a-select
v-model:value="vModel.fk_relation_column_id" v-model:value="vModel.fk_relation_column_id"
dropdown-class-name="!w-64 nc-dropdown-relation-table" dropdown-class-name="!w-64 nc-dropdown-relation-table"

2
packages/nc-gui/components/smartsheet/toolbar/ShareView.vue

@ -205,7 +205,7 @@ const iframeCode = computed(() => {
frameborder="0" frameborder="0"
width="100%" width="100%"
height="700" height="700"
style="background: transparent; border: 1px solid #ddd"/>` style="background: transparent; border: 1px solid #ddd"></iframe>`
}) })
const copyIframeCode = async () => { const copyIframeCode = async () => {

13
packages/nc-gui/composables/useSharedFormViewStore.ts

@ -43,7 +43,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
const { metas, setMeta } = useMetas() const { metas, setMeta } = useMetas()
const { loadProject } = useProject() const { project } = useProject()
const { t } = useI18n() const { t } = useI18n()
@ -86,7 +86,16 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
await setMeta(viewMeta.model) await setMeta(viewMeta.model)
await loadProject(true, viewMeta.project_id) // if project is not defined then set it with an object containing base
if (!project.value?.bases)
project.value = {
bases: [
{
id: viewMeta.base_id,
type: viewMeta.client,
},
],
}
const relatedMetas = { ...viewMeta.relatedMetas } const relatedMetas = { ...viewMeta.relatedMetas }

1
packages/nc-gui/lang/ar.json

@ -277,6 +277,7 @@
"selectUserRole": "حدد دور المستخدم", "selectUserRole": "حدد دور المستخدم",
"childTable": "جدول فرعي", "childTable": "جدول فرعي",
"childColumn": "عمود فرعي", "childColumn": "عمود فرعي",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "عند التحديث", "onUpdate": "عند التحديث",
"onDelete": "عند الحذف", "onDelete": "عند الحذف",
"account": "حساب", "account": "حساب",

1
packages/nc-gui/lang/bn_IN.json

@ -277,6 +277,7 @@
"selectUserRole": "বযবহরকর ভিিচন করন", "selectUserRole": "বযবহরকর ভিিচন করন",
"childTable": "Child table", "childTable": "Child table",
"childColumn": "Child column", "childColumn": "Child column",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "আপড", "onUpdate": "আপড",
"onDelete": "ডিিটএ", "onDelete": "ডিিটএ",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/cs.json

@ -277,6 +277,7 @@
"selectUserRole": "Vybrat uživatelskou roli", "selectUserRole": "Vybrat uživatelskou roli",
"childTable": "Podřízená tabulka", "childTable": "Podřízená tabulka",
"childColumn": "Podřízený sloupec", "childColumn": "Podřízený sloupec",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Při aktualizaci", "onUpdate": "Při aktualizaci",
"onDelete": "Při odstranění", "onDelete": "Při odstranění",
"account": "Účet", "account": "Účet",

1
packages/nc-gui/lang/da.json

@ -277,6 +277,7 @@
"selectUserRole": "Vælg brugerrolle", "selectUserRole": "Vælg brugerrolle",
"childTable": "Børnebord", "childTable": "Børnebord",
"childColumn": "Barn kolonne", "childColumn": "Barn kolonne",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "På opdatering", "onUpdate": "På opdatering",
"onDelete": "På Delete.", "onDelete": "På Delete.",
"account": "Account", "account": "Account",

4
packages/nc-gui/lang/de.json

@ -277,6 +277,7 @@
"selectUserRole": "Benutzerrolle auswählen", "selectUserRole": "Benutzerrolle auswählen",
"childTable": "Child-Tabelle", "childTable": "Child-Tabelle",
"childColumn": "Child-Spalte", "childColumn": "Child-Spalte",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Update", "onUpdate": "Update",
"onDelete": "Löschen", "onDelete": "Löschen",
"account": "Benutzerkonto", "account": "Benutzerkonto",
@ -504,8 +505,7 @@
}, },
"nonEditableFields": { "nonEditableFields": {
"computedFieldUnableToClear": "Warning: Computed field - unable to clear text", "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
"qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed.", "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
"barcodeFieldsCannotBeDirectlyChanged": "Warning: Barcode fields cannot be directly changed."
} }
}, },
"info": { "info": {

1
packages/nc-gui/lang/en.json

@ -278,6 +278,7 @@
"selectUserRole": "Select User Role", "selectUserRole": "Select User Role",
"childTable": "Child table", "childTable": "Child table",
"childColumn": "Child column", "childColumn": "Child column",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "On Update", "onUpdate": "On Update",
"onDelete": "On Delete", "onDelete": "On Delete",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/es.json

@ -277,6 +277,7 @@
"selectUserRole": "Seleccione el rol de usuario", "selectUserRole": "Seleccione el rol de usuario",
"childTable": "Tabla hija", "childTable": "Tabla hija",
"childColumn": "Columna hija", "childColumn": "Columna hija",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "En actualización", "onUpdate": "En actualización",
"onDelete": "En eliminar", "onDelete": "En eliminar",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/eu.json

@ -277,6 +277,7 @@
"selectUserRole": "Select User Role", "selectUserRole": "Select User Role",
"childTable": "Child table", "childTable": "Child table",
"childColumn": "Child column", "childColumn": "Child column",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "On Update", "onUpdate": "On Update",
"onDelete": "On Delete", "onDelete": "On Delete",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/fa.json

@ -277,6 +277,7 @@
"selectUserRole": "نقش کاربر را انتخاب کنید", "selectUserRole": "نقش کاربر را انتخاب کنید",
"childTable": "جدول فرزند", "childTable": "جدول فرزند",
"childColumn": "ستون فرزند", "childColumn": "ستون فرزند",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "هنگام به روز رسانی", "onUpdate": "هنگام به روز رسانی",
"onDelete": "هنگام حذف", "onDelete": "هنگام حذف",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/fi.json

@ -277,6 +277,7 @@
"selectUserRole": "Valitse käyttäjän rooli", "selectUserRole": "Valitse käyttäjän rooli",
"childTable": "Lapsipöytä", "childTable": "Lapsipöytä",
"childColumn": "Lapsipylväs", "childColumn": "Lapsipylväs",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Päivitys", "onUpdate": "Päivitys",
"onDelete": "Poista", "onDelete": "Poista",
"account": "Account", "account": "Account",

81
packages/nc-gui/lang/fr.json

@ -26,9 +26,9 @@
"install": "Installer", "install": "Installer",
"show": "Montrer", "show": "Montrer",
"hide": "Cacher", "hide": "Cacher",
"showAll": "Afficher tout", "showAll": "Tout afficher",
"hideAll": "Cacher tout", "hideAll": "Tout cacher",
"showMore": "Montrer plus", "showMore": "Afficher davantage",
"showOptions": "Afficher les options", "showOptions": "Afficher les options",
"hideOptions": "Masquer les options", "hideOptions": "Masquer les options",
"showMenu": "Afficher le menu", "showMenu": "Afficher le menu",
@ -59,7 +59,7 @@
"confirm": "Confirmer", "confirm": "Confirmer",
"generate": "Générer", "generate": "Générer",
"copy": "Copier", "copy": "Copier",
"misc": "Miscellaneous", "misc": "Divers",
"lock": "Verrouiller", "lock": "Verrouiller",
"unlock": "Déverrouiller", "unlock": "Déverrouiller",
"credentials": "Identifiants", "credentials": "Identifiants",
@ -68,10 +68,10 @@
"reachOut": "Reach out here", "reachOut": "Reach out here",
"betaNote": "Cette fonctionnalité est encore en développement.", "betaNote": "Cette fonctionnalité est encore en développement.",
"moreInfo": "Plus d'informations peuvent être trouvées ici", "moreInfo": "Plus d'informations peuvent être trouvées ici",
"logs": "Logs", "logs": "Journaux",
"groupingField": "Grouping Field", "groupingField": "Champ de regroupement",
"insertAfter": "Insert After", "insertAfter": "Insérer après",
"insertBefore": "Insert Before", "insertBefore": "Insérer avant",
"hideField": "Masquer le champ", "hideField": "Masquer le champ",
"sortAsc": "Trier par ordre croissant", "sortAsc": "Trier par ordre croissant",
"sortDesc": "Trier par ordre décroissant" "sortDesc": "Trier par ordre décroissant"
@ -198,14 +198,14 @@
"apiDocs": "Docs API", "apiDocs": "Docs API",
"importFromAirtable": "Importer depuis Airtable", "importFromAirtable": "Importer depuis Airtable",
"generateToken": "Générer un jeton", "generateToken": "Générer un jeton",
"APIsAndSupport": "Les API et la prise en charge", "APIsAndSupport": "API & Assistance",
"helpCenter": "Help center", "helpCenter": "Centre d'aide",
"swaggerDocumentation": "Swagger Documentation", "swaggerDocumentation": "Documentation de Swagger",
"quickImportFrom": "Quick Import From", "quickImportFrom": "Quick Import From",
"quickImport": "Importation rapide", "quickImport": "Importation rapide",
"advancedSettings": "Paramètres avancés", "advancedSettings": "Paramètres avancés",
"codeSnippet": "Code Snippet", "codeSnippet": "Extrait de code",
"keyboardShortcut": "Keyboard Shortcuts" "keyboardShortcut": "Raccourcis clavier"
}, },
"labels": { "labels": {
"createdBy": "Créé par", "createdBy": "Créé par",
@ -241,17 +241,17 @@
"chat": "Discussion", "chat": "Discussion",
"email": "Courriel", "email": "Courriel",
"storage": "Stockage", "storage": "Stockage",
"uiAcl": "UI-ACL", "uiAcl": "IU ACL",
"models": "Modèles", "models": "Modèles",
"syncState": "État de synchronisation", "syncState": "État de synchronisation",
"created": "Créé", "created": "Créé",
"sqlOutput": "Sortie SQL", "sqlOutput": "Sortie SQL",
"addOption": "Ajouter une option", "addOption": "Ajouter une option",
"qrCodeValueColumn": "Column with QR code value", "qrCodeValueColumn": "Colonne avec une valeur code QR",
"barcodeValueColumn": "Column with Barcode value", "barcodeValueColumn": "Colonne avec une valeur code-barres",
"barcodeFormat": "Barcode format", "barcodeFormat": "Format du code-barres",
"qrCodeValueTooLong": "Trop de caractères pour un code QR", "qrCodeValueTooLong": "Trop de caractères pour un code QR",
"barcodeValueTooLong": "Too many characters for a barcode", "barcodeValueTooLong": "Trop de caractères pour un code-barres",
"aggregateFunction": "Fonction agrégée", "aggregateFunction": "Fonction agrégée",
"dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas", "dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas",
"clientKey": "Clé client", "clientKey": "Clé client",
@ -264,9 +264,9 @@
"columnName": "Inflexion - Nom de la colonne" "columnName": "Inflexion - Nom de la colonne"
}, },
"community": { "community": {
"starUs1": "Étoile", "starUs1": "Mettre en favoris",
"starUs2": "sur Github", "starUs2": "sur Github",
"bookDemo": "Planifier une démonstration gratuite", "bookDemo": "Réserver une démonstration gratuite",
"getAnswered": "Obtenir des réponses à vos questions", "getAnswered": "Obtenir des réponses à vos questions",
"joinDiscord": "Rejoindre le serveur Discord", "joinDiscord": "Rejoindre le serveur Discord",
"joinCommunity": "Rejoindre la communauté NocoDB", "joinCommunity": "Rejoindre la communauté NocoDB",
@ -277,6 +277,7 @@
"selectUserRole": "Sélectionner le rôle d'utilisateur", "selectUserRole": "Sélectionner le rôle d'utilisateur",
"childTable": "Table enfant", "childTable": "Table enfant",
"childColumn": "Colonne enfant", "childColumn": "Colonne enfant",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Mise à jour en cours", "onUpdate": "Mise à jour en cours",
"onDelete": "Suppression en cours", "onDelete": "Suppression en cours",
"account": "Compte", "account": "Compte",
@ -339,7 +340,7 @@
"translate": "Aider à la traduction", "translate": "Aider à la traduction",
"account": { "account": {
"authToken": "Copier le jeton d'authentification", "authToken": "Copier le jeton d'authentification",
"swagger": "Swagger : les API REST", "swagger": "Swagger : API REST",
"projInfo": "Copier les informations du projet", "projInfo": "Copier les informations du projet",
"themes": "Thèmes" "themes": "Thèmes"
}, },
@ -350,7 +351,7 @@
"share": "Partager", "share": "Partager",
"shareBase": { "shareBase": {
"disable": "Désactiver la base partagée", "disable": "Désactiver la base partagée",
"enable": "N'importe qui avec le lien", "enable": "N'importe qui disposant du lien",
"link": "Partager le lien de la base" "link": "Partager le lien de la base"
}, },
"invite": "Inviter", "invite": "Inviter",
@ -431,7 +432,7 @@
"linkRecord": "Link record", "linkRecord": "Link record",
"addNewRecord": "Add new record", "addNewRecord": "Add new record",
"useConnectionUrl": "Use Connection URL", "useConnectionUrl": "Use Connection URL",
"toggleCommentsDraw": "Toggle comments draw", "toggleCommentsDraw": "Afficher ou masquer le panneau des commentaires",
"expandRecord": "Expand Record", "expandRecord": "Expand Record",
"deleteRecord": "Delete Record", "deleteRecord": "Delete Record",
"erd": { "erd": {
@ -445,7 +446,7 @@
"collapseStack": "Collapse Stack", "collapseStack": "Collapse Stack",
"deleteStack": "Delete Stack", "deleteStack": "Delete Stack",
"stackedBy": "Stacked By", "stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field", "chooseGroupingField": "Choisir un champ de regroupement",
"addOrEditStack": "Add / Edit Stack" "addOrEditStack": "Add / Edit Stack"
} }
}, },
@ -461,7 +462,7 @@
}, },
"addTable": "Ajouter un nouveau tableau", "addTable": "Ajouter un nouveau tableau",
"inviteMore": "Inviter plus d'utilisateurs", "inviteMore": "Inviter plus d'utilisateurs",
"toggleNavDraw": "Basculer le tiroir de navigation", "toggleNavDraw": "Afficher ou masquer le panneau de navigation",
"reloadApiToken": "Recharger les jetons API", "reloadApiToken": "Recharger les jetons API",
"generateNewApiToken": "Générer de nouveaux jetons d'API", "generateNewApiToken": "Générer de nouveaux jetons d'API",
"addRole": "Ajouter un nouveau rôle", "addRole": "Ajouter un nouveau rôle",
@ -500,7 +501,7 @@
"msg": { "msg": {
"warning": { "warning": {
"barcode": { "barcode": {
"renderError": "Barcode error - please check compatibility between input and barcode type" "renderError": "Erreur de code-barres - veuillez vérifier la compatibiltié entre la donnée d'entrée et le type de code-barres"
}, },
"nonEditableFields": { "nonEditableFields": {
"computedFieldUnableToClear": "Warning: Computed field - unable to clear text", "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
@ -518,7 +519,7 @@
"upload_sub": "ou glisser-déposer un fichier", "upload_sub": "ou glisser-déposer un fichier",
"excelSupport": "Pris en charge: .xls, .xlsx, .xlsm, .ods, .ots", "excelSupport": "Pris en charge: .xls, .xlsx, .xlsm, .ods, .ots",
"excelURL": "Définir l'URL du fichier Excel", "excelURL": "Définir l'URL du fichier Excel",
"csvURL": "Définir l'URL du fichier CSV", "csvURL": "URL vers le fichier CSV",
"footMsg": "Nombre de lignes à analyser pour déduire le type de données", "footMsg": "Nombre de lignes à analyser pour déduire le type de données",
"excelImport": "Les tableaux sont disponibles pour l'import", "excelImport": "Les tableaux sont disponibles pour l'import",
"exportMetadata": "Voulez-vous exporter des métadonnées des méta-tables?", "exportMetadata": "Voulez-vous exporter des métadonnées des méta-tables?",
@ -536,19 +537,19 @@
"formInput": "Entrer le libellé du formulaire", "formInput": "Entrer le libellé du formulaire",
"formHelpText": "Ajouter un texte d'aide", "formHelpText": "Ajouter un texte d'aide",
"onlyCreator": "Visible uniquement pour les créateurs", "onlyCreator": "Visible uniquement pour les créateurs",
"formDesc": "Ajouter une description du formulaire", "formDesc": "Ajouter une description au formulaire",
"beforeEnablePwd": "Restreindre l’accès à l’aide d’un mot de passe", "beforeEnablePwd": "Restreindre l’accès à l’aide d’un mot de passe",
"afterEnablePwd": "L’accès est restreint par un mot de passe", "afterEnablePwd": "L’accès est restreint par un mot de passe",
"privateLink": "Cette vue est partagée avec un lien privé", "privateLink": "Cette vue est partagée avec un lien privé",
"privateLinkAdditionalInfo": "Les personnes ayant le lien privé peuvent voir uniquement les cellules visibles de cette vue", "privateLinkAdditionalInfo": "Les personnes ayant le lien privé peuvent voir uniquement les cellules visibles de cette vue",
"afterFormSubmitted": "Après que le formulaire est soumis", "afterFormSubmitted": "Après que le formulaire ait été soumis",
"apiOptions": "Accéder au projet via", "apiOptions": "Accéder au projet via",
"submitAnotherForm": "Afficher le bouton \"Soumettre un autre formulaire\"", "submitAnotherForm": "Afficher le bouton \"Soumettre un autre formulaire\"",
"showBlankForm": "Montrer un formulaire vierge après 5 secondes", "showBlankForm": "Montrer un formulaire vierge après 5 secondes",
"emailForm": "Écrivez-moi à", "emailForm": "Écrivez-moi à",
"showSysFields": "Afficher les champs système", "showSysFields": "Afficher les champs système",
"filterAutoApply": "Appliquer automatiquement", "filterAutoApply": "Appliquer automatiquement",
"showMessage": "Montrer ce message", "showMessage": "Montrer ce message ",
"viewNotShared": "La vue actuelle n'est pas partagée!", "viewNotShared": "La vue actuelle n'est pas partagée!",
"showAllViews": "Montrer toutes les vues partagées sur cette table", "showAllViews": "Montrer toutes les vues partagées sur cette table",
"collabView": "Les collaborateurs avec des autorisations d'édition ou plus peuvent modifier la configuration de la vue.", "collabView": "Les collaborateurs avec des autorisations d'édition ou plus peuvent modifier la configuration de la vue.",
@ -574,7 +575,7 @@
}, },
"sponsor": { "sponsor": {
"header": "Vous pouvez nous aider !", "header": "Vous pouvez nous aider !",
"message": "Nous sommes une petite équipe travaillant à plein temps pour rendre Nocodb Open-Source. Nous croyons qu'un outil comme Nocodb devrait être disponible librement à chaque solveur de problèmes sur Internet." "message": "Nous sommes une petite équipe travaillant à plein temps pour rendre NocoDB open-Source. Nous croyons qu'un outil comme NocoDB devrait être disponible librement à chaque solutionneur de problème sur Internet."
}, },
"loginMsg": "Se connecter à NocoDB", "loginMsg": "Se connecter à NocoDB",
"passwordRecovery": { "passwordRecovery": {
@ -583,7 +584,7 @@
"success": "Veuillez vérifier votre email pour réinitialiser le mot de passe" "success": "Veuillez vérifier votre email pour réinitialiser le mot de passe"
}, },
"signUp": { "signUp": {
"superAdmin": "Vous serez le 'super admin'", "superAdmin": "Vous serez le « super administrateur »",
"alreadyHaveAccount": "Avez-vous déjà un compte ?", "alreadyHaveAccount": "Avez-vous déjà un compte ?",
"workEmail": "Saisir votre adresse mail professionnelle", "workEmail": "Saisir votre adresse mail professionnelle",
"enterPassword": "Saisir votre mot de passe", "enterPassword": "Saisir votre mot de passe",
@ -606,7 +607,7 @@
"credentials": "Où trouver ceci ?" "credentials": "Où trouver ceci ?"
}, },
"import": { "import": {
"clickOrDrag": "Click or drag file to this area to upload" "clickOrDrag": "Cliquez ou glissez un fichier dans cette zone pour téléverser"
}, },
"metaDataRecreated": "Table metadata recreated successfully", "metaDataRecreated": "Table metadata recreated successfully",
"invalidCredentials": "Identifiants invalides", "invalidCredentials": "Identifiants invalides",
@ -622,10 +623,10 @@
"valueAlreadyInList": "This value is already in the list", "valueAlreadyInList": "This value is already in the list",
"noColumnsToUpdate": "Aucune colonne à mettre à jour", "noColumnsToUpdate": "Aucune colonne à mettre à jour",
"tableDeleted": "Tableau supprimé avec succès", "tableDeleted": "Tableau supprimé avec succès",
"generatePublicShareableReadonlyBase": "Generate publicly shareable readonly base", "generatePublicShareableReadonlyBase": "Génère une base publique partagée en lecture seule",
"deleteViewConfirmation": "Êtes-vous sûr de vouloir effacer cette vue ?", "deleteViewConfirmation": "Êtes-vous sûr de vouloir effacer cette vue ?",
"deleteTableConfirmation": "Voulez-vous supprimer ce tableau", "deleteTableConfirmation": "Voulez-vous supprimer ce tableau",
"showM2mTables": "Show M2M Tables", "showM2mTables": "Afficher les tables plusieurs à plusieurs",
"deleteKanbanStackConfirmation": "Deleting this stack will also remove the select option `{stackToBeDeleted}` from the `{groupingField}`. The records will move to the uncategorized stack.", "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", "computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure",
"computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content." "computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content."
@ -640,7 +641,7 @@
"dbConnectionFailed": "Echec de connexion :", "dbConnectionFailed": "Echec de connexion :",
"signUpRules": { "signUpRules": {
"emailReqd": "Adresse mail requise", "emailReqd": "Adresse mail requise",
"emailInvalid": "L'adresse mail doit être valide", "emailInvalid": "L'adresse électronique doit être valide",
"passwdRequired": "Mot de passe requis", "passwdRequired": "Mot de passe requis",
"passwdLength": "Votre mot de passe doit contenir au moins 8 caractères", "passwdLength": "Votre mot de passe doit contenir au moins 8 caractères",
"passwdMismatch": "Les mots de passe ne correspondent pas", "passwdMismatch": "Les mots de passe ne correspondent pas",
@ -654,12 +655,12 @@
"invalidURL": "URL invalide", "invalidURL": "URL invalide",
"internalError": "Une erreur interne est survenue", "internalError": "Une erreur interne est survenue",
"templateGeneratorNotFound": "Template Generator cannot be found!", "templateGeneratorNotFound": "Template Generator cannot be found!",
"fileUploadFailed": "Failed to upload file", "fileUploadFailed": "Échec du téléversement du fichier",
"primaryColumnUpdateFailed": "Failed to update primary column", "primaryColumnUpdateFailed": "Failed to update primary column",
"formDescriptionTooLong": "Data too long for Form Description", "formDescriptionTooLong": "Data too long for Form Description",
"columnsRequired": "Following columns are required", "columnsRequired": "Following columns are required",
"selectAtleastOneColumn": "At least one column has to be selected", "selectAtleastOneColumn": "Au moins une colonne doit être sélectionnée",
"columnDescriptionNotFound": "Cannot find the destination column for", "columnDescriptionNotFound": "Impossible de trouver la colonne de destination pour",
"duplicateMappingFound": "Duplicate mapping found, please remove one of the mapping", "duplicateMappingFound": "Duplicate mapping found, please remove one of the mapping",
"nullValueViolatesNotNull": "Null value violates not-null constraint", "nullValueViolatesNotNull": "Null value violates not-null constraint",
"sourceHasInvalidNumbers": "Source data contains some invalid numbers", "sourceHasInvalidNumbers": "Source data contains some invalid numbers",
@ -704,7 +705,7 @@
"projInfo": "Informations de projet copiées dans le presse-papier", "projInfo": "Informations de projet copiées dans le presse-papier",
"inviteUrlCopy": "URL d'invitation copiée dans le presse-papier", "inviteUrlCopy": "URL d'invitation copiée dans le presse-papier",
"createView": "Vue créée avec succès", "createView": "Vue créée avec succès",
"formEmailSMTP": "Veuillez activer le plugin SMTP dans l'App Store pour permettre la notification par courrier électronique", "formEmailSMTP": "Veuillez activer le plugin SMTP dans le magasin d'applications pour permettre la notification par courriel",
"collabView": "Vous êtes bien dans la vue collaborative", "collabView": "Vous êtes bien dans la vue collaborative",
"lockedView": "Vous êtes bien dans la vue vérouillée", "lockedView": "Vous êtes bien dans la vue vérouillée",
"futureRelease": "Bientôt disponible !" "futureRelease": "Bientôt disponible !"

1
packages/nc-gui/lang/he.json

@ -277,6 +277,7 @@
"selectUserRole": "בחר תפקיד משתמש", "selectUserRole": "בחר תפקיד משתמש",
"childTable": "טבלת ילדים", "childTable": "טבלת ילדים",
"childColumn": "טור ילדים", "childColumn": "טור ילדים",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "על עדכון", "onUpdate": "על עדכון",
"onDelete": "על מחיקה", "onDelete": "על מחיקה",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/hi.json

@ -277,6 +277,7 @@
"selectUserRole": "Select User Role", "selectUserRole": "Select User Role",
"childTable": "Child table", "childTable": "Child table",
"childColumn": "Child column", "childColumn": "Child column",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "On Update", "onUpdate": "On Update",
"onDelete": "On Delete", "onDelete": "On Delete",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/hr.json

@ -277,6 +277,7 @@
"selectUserRole": "Odaberite korisničku ulogu", "selectUserRole": "Odaberite korisničku ulogu",
"childTable": "Dječji stol", "childTable": "Dječji stol",
"childColumn": "Dječji stupac", "childColumn": "Dječji stupac",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Na ažuriranje", "onUpdate": "Na ažuriranje",
"onDelete": "Na brisanje", "onDelete": "Na brisanje",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/id.json

@ -277,6 +277,7 @@
"selectUserRole": "Pilih Peran Pengguna", "selectUserRole": "Pilih Peran Pengguna",
"childTable": "Tabel Anak", "childTable": "Tabel Anak",
"childColumn": "Kolom anak.", "childColumn": "Kolom anak.",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Pada pembaruan", "onUpdate": "Pada pembaruan",
"onDelete": "Hapus", "onDelete": "Hapus",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/it.json

@ -277,6 +277,7 @@
"selectUserRole": "Seleziona il ruolo utente", "selectUserRole": "Seleziona il ruolo utente",
"childTable": "Sottotabella", "childTable": "Sottotabella",
"childColumn": "Sottocolonna", "childColumn": "Sottocolonna",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "All'aggiornamento", "onUpdate": "All'aggiornamento",
"onDelete": "All'eliminazione", "onDelete": "All'eliminazione",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/ja.json

@ -277,6 +277,7 @@
"selectUserRole": "ユーザーのロールを選択してください", "selectUserRole": "ユーザーのロールを選択してください",
"childTable": "子テーブル", "childTable": "子テーブル",
"childColumn": "子カラム", "childColumn": "子カラム",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "更新中", "onUpdate": "更新中",
"onDelete": "削除中", "onDelete": "削除中",
"account": "アカウント", "account": "アカウント",

1
packages/nc-gui/lang/ko.json

@ -277,6 +277,7 @@
"selectUserRole": "사용자 역할을 선택하세요", "selectUserRole": "사용자 역할을 선택하세요",
"childTable": "자식 테이블", "childTable": "자식 테이블",
"childColumn": "자식 컬럼", "childColumn": "자식 컬럼",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "업데이트 시 ", "onUpdate": "업데이트 시 ",
"onDelete": "삭제 시", "onDelete": "삭제 시",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/lv.json

@ -277,6 +277,7 @@
"selectUserRole": "Izvēlēties lietotāja lomu", "selectUserRole": "Izvēlēties lietotāja lomu",
"childTable": "Apakštabula", "childTable": "Apakštabula",
"childColumn": "Apakškolonna", "childColumn": "Apakškolonna",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Atjaunojot", "onUpdate": "Atjaunojot",
"onDelete": "Dzēšot", "onDelete": "Dzēšot",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/nl.json

@ -277,6 +277,7 @@
"selectUserRole": "Selecteer de rol van de gebruiker", "selectUserRole": "Selecteer de rol van de gebruiker",
"childTable": "Child Tabel", "childTable": "Child Tabel",
"childColumn": "Child Kolom", "childColumn": "Child Kolom",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Bij update", "onUpdate": "Bij update",
"onDelete": "Bij verwijdering", "onDelete": "Bij verwijdering",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/no.json

@ -277,6 +277,7 @@
"selectUserRole": "Velg Brukerrolle", "selectUserRole": "Velg Brukerrolle",
"childTable": "Barnbord", "childTable": "Barnbord",
"childColumn": "Barn kolonne", "childColumn": "Barn kolonne",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "På oppdatering", "onUpdate": "På oppdatering",
"onDelete": "På slette", "onDelete": "På slette",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/pl.json

@ -277,6 +277,7 @@
"selectUserRole": "Wybierz rolę użytkownika", "selectUserRole": "Wybierz rolę użytkownika",
"childTable": "Stół dziecka.", "childTable": "Stół dziecka.",
"childColumn": "Kolumna dla dzieci", "childColumn": "Kolumna dla dzieci",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Na aktualizacji", "onUpdate": "Na aktualizacji",
"onDelete": "Na delete.", "onDelete": "Na delete.",
"account": "Konto", "account": "Konto",

1
packages/nc-gui/lang/pt.json

@ -277,6 +277,7 @@
"selectUserRole": "Selecione a função do usuário", "selectUserRole": "Selecione a função do usuário",
"childTable": "Mesa de criança", "childTable": "Mesa de criança",
"childColumn": "Coluna de criança", "childColumn": "Coluna de criança",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Na atualização", "onUpdate": "Na atualização",
"onDelete": "Em excluir", "onDelete": "Em excluir",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/pt_BR.json

@ -277,6 +277,7 @@
"selectUserRole": "Selecione a função do usuário", "selectUserRole": "Selecione a função do usuário",
"childTable": "Mesa de criança", "childTable": "Mesa de criança",
"childColumn": "Coluna de criança", "childColumn": "Coluna de criança",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Na atualização", "onUpdate": "Na atualização",
"onDelete": "Em excluir", "onDelete": "Em excluir",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/ru.json

@ -277,6 +277,7 @@
"selectUserRole": "Выберите роль пользователя", "selectUserRole": "Выберите роль пользователя",
"childTable": "Дочерняя таблица", "childTable": "Дочерняя таблица",
"childColumn": "Дочерний столбец", "childColumn": "Дочерний столбец",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "При обновлении", "onUpdate": "При обновлении",
"onDelete": "При удалении", "onDelete": "При удалении",
"account": "Учётная запись", "account": "Учётная запись",

1
packages/nc-gui/lang/sk.json

@ -277,6 +277,7 @@
"selectUserRole": "Select User Role", "selectUserRole": "Select User Role",
"childTable": "Child table", "childTable": "Child table",
"childColumn": "Child column", "childColumn": "Child column",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "On Update", "onUpdate": "On Update",
"onDelete": "On Delete", "onDelete": "On Delete",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/sl.json

@ -277,6 +277,7 @@
"selectUserRole": "Izberite vlogo uporabnika", "selectUserRole": "Izberite vlogo uporabnika",
"childTable": "Otroška miza", "childTable": "Otroška miza",
"childColumn": "Otroška stolpec", "childColumn": "Otroška stolpec",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Na posodobitvi", "onUpdate": "Na posodobitvi",
"onDelete": "Na izbrisu", "onDelete": "Na izbrisu",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/sv.json

@ -277,6 +277,7 @@
"selectUserRole": "Välj användarroll", "selectUserRole": "Välj användarroll",
"childTable": "Barnbord", "childTable": "Barnbord",
"childColumn": "Barnkolonn", "childColumn": "Barnkolonn",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Vid uppdatering", "onUpdate": "Vid uppdatering",
"onDelete": "På radera", "onDelete": "På radera",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/th.json

@ -277,6 +277,7 @@
"selectUserRole": "เลอกบทบาทผใช", "selectUserRole": "เลอกบทบาทผใช",
"childTable": "โตะเดก", "childTable": "โตะเดก",
"childColumn": "คอลมนเดก", "childColumn": "คอลมนเดก",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "เมออปเดต", "onUpdate": "เมออปเดต",
"onDelete": "ในการลบ", "onDelete": "ในการลบ",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/tr.json

@ -277,6 +277,7 @@
"selectUserRole": "Kullanıcı Rolü Seç", "selectUserRole": "Kullanıcı Rolü Seç",
"childTable": "Alt tablo", "childTable": "Alt tablo",
"childColumn": "Alt sütun", "childColumn": "Alt sütun",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Güncellenince", "onUpdate": "Güncellenince",
"onDelete": "Silinince", "onDelete": "Silinince",
"account": "Account", "account": "Account",

1
packages/nc-gui/lang/uk.json

@ -277,6 +277,7 @@
"selectUserRole": "Виберіть Роль користувача", "selectUserRole": "Виберіть Роль користувача",
"childTable": "Дитячий стіл", "childTable": "Дитячий стіл",
"childColumn": "Дитяча колонка", "childColumn": "Дитяча колонка",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "На оновлення", "onUpdate": "На оновлення",
"onDelete": "На видалі", "onDelete": "На видалі",
"account": "Обліковий запис", "account": "Обліковий запис",

1
packages/nc-gui/lang/vi.json

@ -277,6 +277,7 @@
"selectUserRole": "Chọn vai trò người dùng", "selectUserRole": "Chọn vai trò người dùng",
"childTable": "Bảng con", "childTable": "Bảng con",
"childColumn": "Cột trẻ con.", "childColumn": "Cột trẻ con.",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Trên bản cập nhật", "onUpdate": "Trên bản cập nhật",
"onDelete": "Trên xóa", "onDelete": "Trên xóa",
"account": "Tài khoản", "account": "Tài khoản",

1
packages/nc-gui/lang/zh-Hans.json

@ -277,6 +277,7 @@
"selectUserRole": "选择用户角色", "selectUserRole": "选择用户角色",
"childTable": "子表", "childTable": "子表",
"childColumn": "子列", "childColumn": "子列",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "更新", "onUpdate": "更新",
"onDelete": "删除", "onDelete": "删除",
"account": "帐户", "account": "帐户",

1
packages/nc-gui/lang/zh-Hant.json

@ -277,6 +277,7 @@
"selectUserRole": "選擇使用者角色", "selectUserRole": "選擇使用者角色",
"childTable": "子表格", "childTable": "子表格",
"childColumn": "子欄", "childColumn": "子欄",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "更新", "onUpdate": "更新",
"onDelete": "在刪除", "onDelete": "在刪除",
"account": "Account", "account": "Account",

2
packages/nc-gui/package-lock.json generated

@ -95,7 +95,7 @@
} }
}, },
"../nocodb-sdk": { "../nocodb-sdk": {
"version": "0.101.0", "version": "0.101.1",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",

2
packages/nc-lib-gui/package.json

@ -1,6 +1,6 @@
{ {
"name": "nc-lib-gui", "name": "nc-lib-gui",
"version": "0.101.0", "version": "0.101.2",
"description": "NocoDB GUI", "description": "NocoDB GUI",
"author": { "author": {
"name": "NocoDB", "name": "NocoDB",

4
packages/nocodb-sdk/package-lock.json generated

@ -1,12 +1,12 @@
{ {
"name": "nocodb-sdk", "name": "nocodb-sdk",
"version": "0.101.0", "version": "0.101.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nocodb-sdk", "name": "nocodb-sdk",
"version": "0.101.0", "version": "0.101.2",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",

2
packages/nocodb-sdk/package.json

@ -1,6 +1,6 @@
{ {
"name": "nocodb-sdk", "name": "nocodb-sdk",
"version": "0.101.0", "version": "0.101.2",
"description": "NocoDB SDK", "description": "NocoDB SDK",
"main": "build/main/index.js", "main": "build/main/index.js",
"typings": "build/main/index.d.ts", "typings": "build/main/index.d.ts",

2
packages/nocodb-sdk/src/lib/Api.ts

@ -4004,6 +4004,7 @@ export class Api<
* @response `200` `(ViewType & { * @response `200` `(ViewType & {
relatedMetas?: any, relatedMetas?: any,
client?: string, client?: string,
base_id?: string,
columns?: ((GridColumnType | FormColumnType | GalleryColumnType) & ColumnType), columns?: ((GridColumnType | FormColumnType | GalleryColumnType) & ColumnType),
model?: TableType, model?: TableType,
@ -4017,6 +4018,7 @@ export class Api<
ViewType & { ViewType & {
relatedMetas?: any; relatedMetas?: any;
client?: string; client?: string;
base_id?: string;
columns?: (GridColumnType | FormColumnType | GalleryColumnType) & columns?: (GridColumnType | FormColumnType | GalleryColumnType) &
ColumnType; ColumnType;
model?: TableType; model?: TableType;

1
packages/nocodb/README.md

@ -19,3 +19,4 @@ If you wish to combine the frontend and backend together in your local developme
``` ```
In this case, whenever there are any changes made in the 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/``.

20
packages/nocodb/package-lock.json generated

@ -1,12 +1,12 @@
{ {
"name": "nocodb", "name": "nocodb",
"version": "0.101.0", "version": "0.101.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nocodb", "name": "nocodb",
"version": "0.101.0", "version": "0.101.2",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@google-cloud/storage": "^5.7.2", "@google-cloud/storage": "^5.7.2",
@ -65,7 +65,7 @@
"mysql2": "^2.2.5", "mysql2": "^2.2.5",
"nanoid": "^3.1.20", "nanoid": "^3.1.20",
"nc-help": "0.2.85", "nc-help": "0.2.85",
"nc-lib-gui": "0.101.0", "nc-lib-gui": "0.101.2",
"nc-plugin": "0.1.2", "nc-plugin": "0.1.2",
"ncp": "^2.0.0", "ncp": "^2.0.0",
"nocodb-sdk": "file:../nocodb-sdk", "nocodb-sdk": "file:../nocodb-sdk",
@ -153,7 +153,7 @@
} }
}, },
"../nocodb-sdk": { "../nocodb-sdk": {
"version": "0.101.0", "version": "0.101.1",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",
@ -11161,9 +11161,9 @@
} }
}, },
"node_modules/nc-lib-gui": { "node_modules/nc-lib-gui": {
"version": "0.101.0", "version": "0.101.2",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.101.0.tgz", "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.101.2.tgz",
"integrity": "sha512-25sDt2KKlJNq2wFpi+97OZfG2WTNfBPIafN57MV0bIJ6OH3168hIUbSOwhY+Q4dujtKZw3goq6X2OX2Y/P9FHg==", "integrity": "sha512-mwvSo+pTirZ8XIL3pe9tq2zdOLeigrzdYFHadsJ/xEIx+0U0NNlJglKtnKzr+Zy1wH0LceQCjOZV28v45AtfqQ==",
"dependencies": { "dependencies": {
"express": "^4.17.1" "express": "^4.17.1"
} }
@ -27687,9 +27687,9 @@
} }
}, },
"nc-lib-gui": { "nc-lib-gui": {
"version": "0.101.0", "version": "0.101.2",
"resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.101.0.tgz", "resolved": "https://registry.npmjs.org/nc-lib-gui/-/nc-lib-gui-0.101.2.tgz",
"integrity": "sha512-25sDt2KKlJNq2wFpi+97OZfG2WTNfBPIafN57MV0bIJ6OH3168hIUbSOwhY+Q4dujtKZw3goq6X2OX2Y/P9FHg==", "integrity": "sha512-mwvSo+pTirZ8XIL3pe9tq2zdOLeigrzdYFHadsJ/xEIx+0U0NNlJglKtnKzr+Zy1wH0LceQCjOZV28v45AtfqQ==",
"requires": { "requires": {
"express": "^4.17.1" "express": "^4.17.1"
} }

4
packages/nocodb/package.json

@ -1,6 +1,6 @@
{ {
"name": "nocodb", "name": "nocodb",
"version": "0.101.0", "version": "0.101.2",
"description": "NocoDB Backend", "description": "NocoDB Backend",
"main": "dist/bundle.js", "main": "dist/bundle.js",
"author": { "author": {
@ -105,7 +105,7 @@
"mysql2": "^2.2.5", "mysql2": "^2.2.5",
"nanoid": "^3.1.20", "nanoid": "^3.1.20",
"nc-help": "0.2.85", "nc-help": "0.2.85",
"nc-lib-gui": "0.101.0", "nc-lib-gui": "0.101.2",
"nc-plugin": "0.1.2", "nc-plugin": "0.1.2",
"ncp": "^2.0.0", "ncp": "^2.0.0",
"nocodb-sdk": "file:../nocodb-sdk", "nocodb-sdk": "file:../nocodb-sdk",

2
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/pg.ts

@ -91,7 +91,7 @@ const pg = {
DATE_PART('year', AGE(${datetime_expr2}, '1900/01/01')) * 4) - 1)`; DATE_PART('year', AGE(${datetime_expr2}, '1900/01/01')) * 4) - 1)`;
break; break;
case 'year': case 'year':
sql = `DATE_PART('year', ${datetime_expr1}::TIMESTAMP) - DATE_PART('year', ${datetime_expr2}::TIMESTAMP)`; sql = `DATE_PART('year', AGE(${datetime_expr1}, ${datetime_expr2}))`;
break; break;
case 'day': case 'day':
sql = `DATE_PART('day', ${datetime_expr1}::TIMESTAMP - ${datetime_expr2}::TIMESTAMP)`; sql = `DATE_PART('day', ${datetime_expr1}::TIMESTAMP - ${datetime_expr2}::TIMESTAMP)`;

18
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts

@ -130,7 +130,23 @@ const sqlite3 = {
sql = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 4 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) / 3`; sql = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 4 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) / 3`;
break; break;
case 'years': case 'years':
sql = `strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})`; sql = `CASE
WHEN (${datetime_expr2} < ${datetime_expr1}) THEN
(
(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2}))
- (strftime('%m', ${datetime_expr1}) < strftime('%m', ${datetime_expr2})
OR (strftime('%m', ${datetime_expr1}) = strftime('%m', ${datetime_expr2})
AND strftime('%d', ${datetime_expr1}) < strftime('%d', ${datetime_expr2})))
)
WHEN (${datetime_expr2} > ${datetime_expr1}) THEN
-1 * (
(strftime('%Y', ${datetime_expr2}) - strftime('%Y', ${datetime_expr1}))
- (strftime('%m', ${datetime_expr2}) < strftime('%m', ${datetime_expr1})
OR (strftime('%m', ${datetime_expr2}) = strftime('%m', ${datetime_expr1})
AND strftime('%d', ${datetime_expr2}) < strftime('%d', ${datetime_expr1})))
)
ELSE 0
END`;
break; break;
case 'days': case 'days':
sql = `JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})`; sql = `JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})`;

2
packages/nocodb/src/lib/meta/api/swagger/swaggerHtml.ts

File diff suppressed because one or more lines are too long

3
scripts/sdk/swagger.json

@ -5529,6 +5529,9 @@
"client": { "client": {
"type": "string" "type": "string"
}, },
"base_id": {
"type": "string"
},
"columns": { "columns": {
"allOf": [ "allOf": [
{ {

22
tests/playwright/tests/columnFormula.spec.ts

@ -38,6 +38,10 @@ const formulaDataByDbType = (context: NcContext) => [
formula: `DATETIME_DIFF("2022/10/14", "2022/10/15", "minutes")`, formula: `DATETIME_DIFF("2022/10/14", "2022/10/15", "minutes")`,
result: ['-1440', '-1440', '-1440', '-1440', '-1440'], result: ['-1440', '-1440', '-1440', '-1440', '-1440'],
}, },
{
formula: `DATETIME_DIFF("2023/10/14", "2023/01/13", "minutes")`,
result: ['394560', '394560', '394560', '394560', '394560'],
},
{ {
formula: `DATETIME_DIFF("2022/10/14", "2022/10/15", "seconds")`, formula: `DATETIME_DIFF("2022/10/14", "2022/10/15", "seconds")`,
result: ['-86400', '-86400', '-86400', '-86400', '-86400'], result: ['-86400', '-86400', '-86400', '-86400', '-86400'],
@ -67,19 +71,31 @@ const formulaDataByDbType = (context: NcContext) => [
result: ['-1', '-1', '-1', '-1', '-1'], result: ['-1', '-1', '-1', '-1', '-1'],
}, },
{ {
formula: `DATETIME_DIFF(NOW(), "2023/10/14", "y")`, formula: `DATETIME_DIFF("2023/01/12", "2023/10/14", "y")`,
result: ['0', '0', '0', '0', '0'], result: ['0', '0', '0', '0', '0'],
}, },
{ {
formula: `DATETIME_DIFF("2023/10/14", NOW(), "y")`, formula: `DATETIME_DIFF("2023/10/14", "2023/01/12", "y")`,
result: ['0', '0', '0', '0', '0'], result: ['0', '0', '0', '0', '0'],
}, },
{
formula: `DATETIME_DIFF("2023-01-12", "2021-08-29", "y")`,
result: ['1', '1', '1', '1', '1'],
},
{
formula: `DATETIME_DIFF("2021-01-12", "2026-01-29", "y")`,
result: ['-5', '-5', '-5', '-5', '-5'],
},
{
formula: `DATETIME_DIFF("1990-01-12", "2046-12-29", "y")`,
result: ['-56', '-56', '-56', '-56', '-56'],
},
{ {
formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "d")`, formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "d")`,
result: ['-365', '-365', '-365', '-365', '-365'], result: ['-365', '-365', '-365', '-365', '-365'],
}, },
{ {
formula: `DATETIME_DIFF("2022/10/14", NOW(), "d")`, formula: `DATETIME_DIFF("2022/10/14", "2023/01/12", "d")`,
result: ['-90', '-90', '-90', '-90', '-90'], result: ['-90', '-90', '-90', '-90', '-90'],
}, },
{ {

Loading…
Cancel
Save