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 "Setting TARGET_SHA: ${TARGET_SHA}"
- name: Create tag
uses: actions/github-script@v6
uses: actions/github-script@v3
with:
# need workflows permission but it's not in GITHUB_TOKEN scope
# need a custom PAT with workflows permission here

4
.github/workflows/release-executables.yml

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

86
.github/workflows/release-pr.yml

@ -33,7 +33,7 @@ jobs:
# Get current PR number
PR_NUMBER=${{github.event.number}}
# 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
TAG_NAME=pr-${PR_NUMBER}-${CURRENT_DATE}-${CURRENT_TIME}
echo "TARGET_TAG=${TAG_NAME}" >> $GITHUB_OUTPUT
@ -72,14 +72,14 @@ jobs:
DOCKERHUB_TOKEN: "${{ secrets.DOCKERHUB_TOKEN }}"
# 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' && github.event.action != 'closed' }}
needs: [set-tag, release-npm]
uses: ./.github/workflows/release-timely-executables.yml
with:
tag: ${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}
secrets:
NC_GITHUB_TOKEN: "${{ secrets.NC_GITHUB_TOKEN }}"
# 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' }}
# needs: [set-tag, release-npm]
# uses: ./.github/workflows/release-timely-executables.yml
# with:
# tag: ${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }}
# secrets:
# NC_GITHUB_TOKEN: "${{ secrets.NC_GITHUB_TOKEN }}"
# Add a comment for PR docker build
leave-comment:
@ -132,40 +132,40 @@ jobs:
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' && github.event.action != 'closed' }}
runs-on: 'ubuntu-latest'
needs: [release-executables, set-tag]
steps:
- uses: peter-evans/commit-comment@v2
with:
body: |
### Run Executables
#### MacOS
```bash
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 \
&& chmod +x noco \
&& ./noco
```
#### Linux
```bash
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 \
&& chmod +x noco \
&& ./noco
```
#### Windows
```bash
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
```
For executables visit [here](https://github.com/nocodb/nocodb-timely/releases/tag/${{ needs.set-tag.outputs.current_version }}-${{ needs.set-tag.outputs.target_tag }})
# 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' }}
# runs-on: 'ubuntu-latest'
# needs: [release-executables, set-tag]
# steps:
# - uses: peter-evans/commit-comment@v2
# with:
# body: |
# ### Run Executables
# #### MacOS
# ```bash
# 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 \
# && chmod +x noco \
# && ./noco
# ```
# #### Linux
# ```bash
# 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 \
# && chmod +x noco \
# && ./noco
# ```
# #### Windows
# ```bash
# 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
# ```
# 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:

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>
<p align="center">
MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 똑똑한 스프레드시트로 바꿔줍니다.
MySQL, PostgreSQL, SQL Server, SQLite, MariaDB를 스마트 스프레드시트로 바꿔줍니다.
</p>
<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>
</p>
# 바로 써보기
# 빠른 시도
### Docker 사용
@ -65,7 +65,7 @@ npm start
### GUI
대시보드 접근하기 : [http://localhost:8080/dashboard](http://localhost:8080/dashboard)
대시보드 접근 : [http://localhost:8080/dashboard](http://localhost:8080/dashboard)
# 커뮤니티 가입
@ -114,18 +114,17 @@ npm start
# 기능
### 스프레드시트같은 인터페이스
### 스프레드시트 인터페이스
- ⚡ 정말 쉬운 검색, 정렬, 필터링, 열 숨기기
- ⚡ 뷰 만들기: 그리드, 갤러리, 칸반, 간트 차트, 양식
- ⚡ 뷰 공유하기: 완전 공개, 패스워드 걸고 공개
- ⚡ 개인화하거나 잠글 수 있는 뷰
- ⚡ 이미지를 자신의 공간에 업로드 (S3, Minio, GCP, Azure, Digitalocean, Linode, OVH, Backblaze 등)
- ⚡ 역할 부여: 소유자, 작성자, 편집자, 보기 전용, 의견 제시만, 원하는 대로
- ⚡ 접근 통제: 데이터베이스, 테이블 및 열 수준까지도 상세한 통제 가능
- ⚡ 기본 오퍼레이션: 테이블, 칼럼, 로우 CRUD
- ⚡ 필드 오퍼레이션: 정렬, 필터, 칼럼 보기/숨기기
- ⚡ 뷰 타입: 그리드, 갤러리, 칸반, 간트 차트, 양식(Form)
- ⚡ 공유: 공개 / 비공개 뷰 (비밀 번호 설정)
- ⚡ 다양한 셀 타입: 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 팀즈, 슬랙, 디스코드, 매터모스트
- ⚡ 이메일: SMTP, SES, MailChimp
- ⚡ SMS: Twilio
@ -188,12 +187,12 @@ docker-compose up -d
여기서 확인해주세요.
[환경변수 ](https://docs.nocodb.com/getting-started/installation#environment-variables)
# 개발 환경에 설치하기
# 개발 환경에 설치
여기서 확인해주세요.
[개발 환경에 설치하는 법](https://docs.nocodb.com/engineering/development-setup)
# 기여하기
# 기여
여기서 확인해주세요.
[기여 가이드라인](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({
title: 'Are you sure you want to delete this user?',
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 () => {
try {
await api.orgUsers.delete(userId)

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

@ -56,7 +56,7 @@ const columns = $computed<ColumnType[]>(() => {
<template>
<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">
<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
v-model:value="vModel.fk_relation_column_id"
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>
<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">
<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
v-model:value="vModel.fk_relation_column_id"
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"
width="100%"
height="700"
style="background: transparent; border: 1px solid #ddd"/>`
style="background: transparent; border: 1px solid #ddd"></iframe>`
})
const copyIframeCode = async () => {

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

@ -43,7 +43,7 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
const { metas, setMeta } = useMetas()
const { loadProject } = useProject()
const { project } = useProject()
const { t } = useI18n()
@ -86,7 +86,16 @@ const [useProvideSharedFormStore, useSharedFormStore] = useInjectionState((share
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 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -26,9 +26,9 @@
"install": "Installer",
"show": "Montrer",
"hide": "Cacher",
"showAll": "Afficher tout",
"hideAll": "Cacher tout",
"showMore": "Montrer plus",
"showAll": "Tout afficher",
"hideAll": "Tout cacher",
"showMore": "Afficher davantage",
"showOptions": "Afficher les options",
"hideOptions": "Masquer les options",
"showMenu": "Afficher le menu",
@ -59,7 +59,7 @@
"confirm": "Confirmer",
"generate": "Générer",
"copy": "Copier",
"misc": "Miscellaneous",
"misc": "Divers",
"lock": "Verrouiller",
"unlock": "Déverrouiller",
"credentials": "Identifiants",
@ -68,10 +68,10 @@
"reachOut": "Reach out here",
"betaNote": "Cette fonctionnalité est encore en développement.",
"moreInfo": "Plus d'informations peuvent être trouvées ici",
"logs": "Logs",
"groupingField": "Grouping Field",
"insertAfter": "Insert After",
"insertBefore": "Insert Before",
"logs": "Journaux",
"groupingField": "Champ de regroupement",
"insertAfter": "Insérer après",
"insertBefore": "Insérer avant",
"hideField": "Masquer le champ",
"sortAsc": "Trier par ordre croissant",
"sortDesc": "Trier par ordre décroissant"
@ -198,14 +198,14 @@
"apiDocs": "Docs API",
"importFromAirtable": "Importer depuis Airtable",
"generateToken": "Générer un jeton",
"APIsAndSupport": "Les API et la prise en charge",
"helpCenter": "Help center",
"swaggerDocumentation": "Swagger Documentation",
"APIsAndSupport": "API & Assistance",
"helpCenter": "Centre d'aide",
"swaggerDocumentation": "Documentation de Swagger",
"quickImportFrom": "Quick Import From",
"quickImport": "Importation rapide",
"advancedSettings": "Paramètres avancés",
"codeSnippet": "Code Snippet",
"keyboardShortcut": "Keyboard Shortcuts"
"codeSnippet": "Extrait de code",
"keyboardShortcut": "Raccourcis clavier"
},
"labels": {
"createdBy": "Créé par",
@ -241,17 +241,17 @@
"chat": "Discussion",
"email": "Courriel",
"storage": "Stockage",
"uiAcl": "UI-ACL",
"uiAcl": "IU ACL",
"models": "Modèles",
"syncState": "État de synchronisation",
"created": "Créé",
"sqlOutput": "Sortie SQL",
"addOption": "Ajouter une option",
"qrCodeValueColumn": "Column with QR code value",
"barcodeValueColumn": "Column with Barcode value",
"barcodeFormat": "Barcode format",
"qrCodeValueColumn": "Colonne avec une valeur code QR",
"barcodeValueColumn": "Colonne avec une valeur code-barres",
"barcodeFormat": "Format du code-barres",
"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",
"dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas",
"clientKey": "Clé client",
@ -264,9 +264,9 @@
"columnName": "Inflexion - Nom de la colonne"
},
"community": {
"starUs1": "Étoile",
"starUs1": "Mettre en favoris",
"starUs2": "sur Github",
"bookDemo": "Planifier une démonstration gratuite",
"bookDemo": "Réserver une démonstration gratuite",
"getAnswered": "Obtenir des réponses à vos questions",
"joinDiscord": "Rejoindre le serveur Discord",
"joinCommunity": "Rejoindre la communauté NocoDB",
@ -277,6 +277,7 @@
"selectUserRole": "Sélectionner le rôle d'utilisateur",
"childTable": "Table enfant",
"childColumn": "Colonne enfant",
"linkToAnotherRecord": "Link to another record",
"onUpdate": "Mise à jour en cours",
"onDelete": "Suppression en cours",
"account": "Compte",
@ -339,7 +340,7 @@
"translate": "Aider à la traduction",
"account": {
"authToken": "Copier le jeton d'authentification",
"swagger": "Swagger : les API REST",
"swagger": "Swagger : API REST",
"projInfo": "Copier les informations du projet",
"themes": "Thèmes"
},
@ -350,7 +351,7 @@
"share": "Partager",
"shareBase": {
"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"
},
"invite": "Inviter",
@ -431,7 +432,7 @@
"linkRecord": "Link record",
"addNewRecord": "Add new record",
"useConnectionUrl": "Use Connection URL",
"toggleCommentsDraw": "Toggle comments draw",
"toggleCommentsDraw": "Afficher ou masquer le panneau des commentaires",
"expandRecord": "Expand Record",
"deleteRecord": "Delete Record",
"erd": {
@ -445,7 +446,7 @@
"collapseStack": "Collapse Stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
"chooseGroupingField": "Choisir un champ de regroupement",
"addOrEditStack": "Add / Edit Stack"
}
},
@ -461,7 +462,7 @@
},
"addTable": "Ajouter un nouveau tableau",
"inviteMore": "Inviter plus d'utilisateurs",
"toggleNavDraw": "Basculer le tiroir de navigation",
"toggleNavDraw": "Afficher ou masquer le panneau de navigation",
"reloadApiToken": "Recharger les jetons API",
"generateNewApiToken": "Générer de nouveaux jetons d'API",
"addRole": "Ajouter un nouveau rôle",
@ -500,7 +501,7 @@
"msg": {
"warning": {
"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": {
"computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
@ -518,7 +519,7 @@
"upload_sub": "ou glisser-déposer un fichier",
"excelSupport": "Pris en charge: .xls, .xlsx, .xlsm, .ods, .ots",
"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",
"excelImport": "Les tableaux sont disponibles pour l'import",
"exportMetadata": "Voulez-vous exporter des métadonnées des méta-tables?",
@ -536,19 +537,19 @@
"formInput": "Entrer le libellé du formulaire",
"formHelpText": "Ajouter un texte d'aide",
"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",
"afterEnablePwd": "L’accès est restreint par un mot de passe",
"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",
"afterFormSubmitted": "Après que le formulaire est soumis",
"afterFormSubmitted": "Après que le formulaire ait été soumis",
"apiOptions": "Accéder au projet via",
"submitAnotherForm": "Afficher le bouton \"Soumettre un autre formulaire\"",
"showBlankForm": "Montrer un formulaire vierge après 5 secondes",
"emailForm": "Écrivez-moi à",
"showSysFields": "Afficher les champs système",
"filterAutoApply": "Appliquer automatiquement",
"showMessage": "Montrer ce message",
"showMessage": "Montrer ce message ",
"viewNotShared": "La vue actuelle n'est pas partagée!",
"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.",
@ -574,7 +575,7 @@
},
"sponsor": {
"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",
"passwordRecovery": {
@ -583,7 +584,7 @@
"success": "Veuillez vérifier votre email pour réinitialiser le mot de passe"
},
"signUp": {
"superAdmin": "Vous serez le 'super admin'",
"superAdmin": "Vous serez le « super administrateur »",
"alreadyHaveAccount": "Avez-vous déjà un compte ?",
"workEmail": "Saisir votre adresse mail professionnelle",
"enterPassword": "Saisir votre mot de passe",
@ -606,7 +607,7 @@
"credentials": "Où trouver ceci ?"
},
"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",
"invalidCredentials": "Identifiants invalides",
@ -622,10 +623,10 @@
"valueAlreadyInList": "This value is already in the list",
"noColumnsToUpdate": "Aucune colonne à mettre à jour",
"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 ?",
"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.",
"computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure",
"computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content."
@ -640,7 +641,7 @@
"dbConnectionFailed": "Echec de connexion :",
"signUpRules": {
"emailReqd": "Adresse mail requise",
"emailInvalid": "L'adresse mail doit être valide",
"emailInvalid": "L'adresse électronique doit être valide",
"passwdRequired": "Mot de passe requis",
"passwdLength": "Votre mot de passe doit contenir au moins 8 caractères",
"passwdMismatch": "Les mots de passe ne correspondent pas",
@ -654,12 +655,12 @@
"invalidURL": "URL invalide",
"internalError": "Une erreur interne est survenue",
"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",
"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",
"selectAtleastOneColumn": "Au moins une colonne doit être sélectionnée",
"columnDescriptionNotFound": "Impossible de trouver la colonne de destination pour",
"duplicateMappingFound": "Duplicate mapping found, please remove one of the mapping",
"nullValueViolatesNotNull": "Null value violates not-null constraint",
"sourceHasInvalidNumbers": "Source data contains some invalid numbers",
@ -704,7 +705,7 @@
"projInfo": "Informations de projet copiées dans le presse-papier",
"inviteUrlCopy": "URL d'invitation copiée dans le presse-papier",
"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",
"lockedView": "Vous êtes bien dans la vue vérouillée",
"futureRelease": "Bientôt disponible !"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2
packages/nocodb-sdk/package.json

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

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

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

20
packages/nocodb/package-lock.json generated

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

4
packages/nocodb/package.json

@ -1,6 +1,6 @@
{
"name": "nocodb",
"version": "0.101.0",
"version": "0.101.2",
"description": "NocoDB Backend",
"main": "dist/bundle.js",
"author": {
@ -105,7 +105,7 @@
"mysql2": "^2.2.5",
"nanoid": "^3.1.20",
"nc-help": "0.2.85",
"nc-lib-gui": "0.101.0",
"nc-lib-gui": "0.101.2",
"nc-plugin": "0.1.2",
"ncp": "^2.0.0",
"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)`;
break;
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;
case 'day':
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`;
break;
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;
case 'days':
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": {
"type": "string"
},
"base_id": {
"type": "string"
},
"columns": {
"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")`,
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")`,
result: ['-86400', '-86400', '-86400', '-86400', '-86400'],
@ -67,19 +71,31 @@ const formulaDataByDbType = (context: NcContext) => [
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'],
},
{
formula: `DATETIME_DIFF("2023/10/14", NOW(), "y")`,
formula: `DATETIME_DIFF("2023/10/14", "2023/01/12", "y")`,
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")`,
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'],
},
{

Loading…
Cancel
Save