Browse Source

Merge pull request #8755 from nocodb/develop

pull/8756/head 0.250.2
github-actions[bot] 2 weeks ago committed by GitHub
parent
commit
ee3084252e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      packages/nc-gui/components/dlg/ViewCreate.vue
  2. 26
      packages/nc-gui/components/erd/View.vue
  3. 4
      packages/nc-gui/components/nc/Checkbox.vue
  4. 8
      packages/nc-gui/components/shared-view/AskPassword.vue
  5. 4
      packages/nc-gui/components/smartsheet/Form.vue
  6. 1
      packages/nc-gui/components/smartsheet/Kanban.vue
  7. 2
      packages/nc-gui/components/smartsheet/column/AttachmentOptions.vue
  8. 20
      packages/nc-gui/components/smartsheet/column/BarcodeOptions.vue
  9. 10
      packages/nc-gui/components/smartsheet/column/CheckboxOptions.vue
  10. 7
      packages/nc-gui/components/smartsheet/column/CurrencyOptions.vue
  11. 9
      packages/nc-gui/components/smartsheet/column/DateOptions.vue
  12. 18
      packages/nc-gui/components/smartsheet/column/DateTimeOptions.vue
  13. 5
      packages/nc-gui/components/smartsheet/column/DecimalOptions.vue
  14. 6
      packages/nc-gui/components/smartsheet/column/DurationOptions.vue
  15. 6
      packages/nc-gui/components/smartsheet/column/EditOrAdd.vue
  16. 2
      packages/nc-gui/components/smartsheet/column/LinkOptions.vue
  17. 4
      packages/nc-gui/components/smartsheet/column/NumberOptions.vue
  18. 6
      packages/nc-gui/components/smartsheet/column/PercentOptions.vue
  19. 36
      packages/nc-gui/components/smartsheet/column/RatingOptions.vue
  20. 4
      packages/nc-gui/components/smartsheet/column/TimeOptions.vue
  21. 7
      packages/nc-gui/components/smartsheet/column/UserOptions.vue
  22. 45
      packages/nc-gui/components/smartsheet/details/Fields.vue
  23. 2
      packages/nc-gui/components/smartsheet/expanded-form/Comments.vue
  24. 20
      packages/nc-gui/components/smartsheet/grid/useColumnDrag.ts
  25. 4
      packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue
  26. 6
      packages/nc-gui/composables/useAttachment.ts
  27. 45
      packages/nc-gui/composables/useDebounceFnCached.ts
  28. 156
      packages/nc-gui/composables/useViewFilters.ts
  29. 2
      packages/nc-gui/composables/useViewGroupBy.ts
  30. 119
      packages/nc-gui/helpers/columnDefaultMeta.ts
  31. 19
      packages/nc-gui/lang/ar.json
  32. 19
      packages/nc-gui/lang/bn_IN.json
  33. 19
      packages/nc-gui/lang/cs.json
  34. 19
      packages/nc-gui/lang/da.json
  35. 19
      packages/nc-gui/lang/de.json
  36. 27
      packages/nc-gui/lang/es.json
  37. 19
      packages/nc-gui/lang/eu.json
  38. 19
      packages/nc-gui/lang/fa.json
  39. 19
      packages/nc-gui/lang/fi.json
  40. 23
      packages/nc-gui/lang/fr.json
  41. 19
      packages/nc-gui/lang/he.json
  42. 19
      packages/nc-gui/lang/hi.json
  43. 19
      packages/nc-gui/lang/hr.json
  44. 19
      packages/nc-gui/lang/id.json
  45. 25
      packages/nc-gui/lang/it.json
  46. 19
      packages/nc-gui/lang/ja.json
  47. 21
      packages/nc-gui/lang/ko.json
  48. 19
      packages/nc-gui/lang/lv.json
  49. 19
      packages/nc-gui/lang/nl.json
  50. 19
      packages/nc-gui/lang/no.json
  51. 63
      packages/nc-gui/lang/pl.json
  52. 19
      packages/nc-gui/lang/pt.json
  53. 19
      packages/nc-gui/lang/pt_BR.json
  54. 23
      packages/nc-gui/lang/ru.json
  55. 19
      packages/nc-gui/lang/sk.json
  56. 19
      packages/nc-gui/lang/sl.json
  57. 19
      packages/nc-gui/lang/sv.json
  58. 19
      packages/nc-gui/lang/th.json
  59. 19
      packages/nc-gui/lang/tr.json
  60. 19
      packages/nc-gui/lang/uk.json
  61. 19
      packages/nc-gui/lang/vi.json
  62. 21
      packages/nc-gui/lang/zh-Hans.json
  63. 19
      packages/nc-gui/lang/zh-Hant.json
  64. 2
      packages/nc-gui/package.json
  65. 3
      packages/noco-docs/docs/080.records/030.expand-record.md
  66. 2
      packages/nocodb/package.json
  67. 21
      packages/nocodb/src/db/BaseModelSqlv2.ts
  68. 4
      packages/nocodb/src/helpers/catchError.ts
  69. 29
      packages/nocodb/src/meta/meta.service.ts
  70. 15
      packages/nocodb/src/models/BaseUser.ts
  71. 2
      packages/nocodb/src/models/KanbanView.ts
  72. 2
      packages/nocodb/src/models/Model.ts
  73. 17
      packages/nocodb/src/models/SyncSource.ts
  74. 3
      packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts
  75. 6
      packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts
  76. 2
      packages/nocodb/src/services/columns.service.ts
  77. 6
      packages/nocodb/src/services/org-users.service.ts
  78. 4
      pnpm-lock.yaml
  79. 3
      tests/playwright/pages/Dashboard/Details/FieldsPage.ts

4
packages/nc-gui/components/dlg/ViewCreate.vue

@ -13,7 +13,7 @@ interface Props {
groupingFieldColumnId?: string
geoDataFieldColumnId?: string
tableId: string
calendarRange: Array<{
calendarRange?: Array<{
fk_from_column_id: string
fk_to_column_id: string | null // for ee only
}>
@ -36,7 +36,7 @@ interface Form {
// for calendar view only
calendar_range: Array<{
fk_from_column_id: string
fk_to_column_id: string | undefined // for ee only
fk_to_column_id: string | null // for ee only
}>
}

26
packages/nc-gui/components/erd/View.vue

@ -45,14 +45,26 @@ const config = reactive<ERDConfig>({
isFullScreen: false,
})
const loadMetaOfTablesNotInMetas = async (localTables: TableType[]) => {
await Promise.all(
localTables
.filter((table) => !metas.value[table.id!])
.map(async (table) => {
const fetchMissingTableMetas = async (localTables: TableType[]) => {
const chunkSize = 5
// Function to process a chunk of tables
const processChunk = async (chunk: TableType[]) => {
await Promise.all(
chunk.map(async (table) => {
await getMeta(table.id!)
}),
)
)
}
// filter out tables that are already loaded and are not from the same source
const filteredTables = localTables.filter((t) => !metas.value[t.id!] && t.source_id === props.sourceId)
// Split the tables into chunks and process each chunk sequentially to avoid hitting throttling limits
for (let i = 0; i < filteredTables.length; i += chunkSize) {
const chunk = filteredTables.slice(i, i + chunkSize)
await processChunk(chunk)
}
}
const populateTables = async () => {
@ -73,7 +85,7 @@ const populateTables = async () => {
localTables = baseTables.value
}
await loadMetaOfTablesNotInMetas(localTables)
await fetchMissingTableMetas(localTables)
tables.value = localTables
.filter(

4
packages/nc-gui/components/nc/Checkbox.vue

@ -1,6 +1,6 @@
<script lang="ts" setup>
interface Props {
checked: boolean
checked?: boolean
size?: 'small' | 'default' | 'large'
disabled?: boolean
}
@ -15,7 +15,7 @@ const emit = defineEmits(['change', 'update:checked'])
const checked = useVModel(props, 'checked', emit)
const onChange = (e: Event) => {
emit('change', e, checked.value)
emit('change', e, (e.target as HTMLInputElement).checked)
}
</script>

8
packages/nc-gui/components/shared-view/AskPassword.vue

@ -44,13 +44,6 @@ const focus: VNodeRef = (el: typeof InputPassword) => {
return el && el?.focus?.()
}
watch(
() => formState.value.password,
() => {
passwordError.value = null
},
)
const bgImageName = computed(() => {
switch (props.viewType) {
case ViewTypes.GRID:
@ -97,6 +90,7 @@ const bgImageName = computed(() => {
class="!rounded-lg !text-small"
hide-details
:placeholder="$t('msg.enterPassword')"
@input="passwordError = null"
/>
<Transition name="layout">
<div v-if="passwordError" class="mb-2 text-sm text-red-500">{{ passwordError }}</div>

4
packages/nc-gui/components/smartsheet/Form.vue

@ -969,7 +969,7 @@ useEventListener(
:bordered="false"
:data-testid="NcForm.heading"
:data-title="NcForm.heading"
@update:value="updateView"
@input="updateView"
@focus="activeRow = NcForm.heading"
@blur="activeRow = ''"
/>
@ -1280,7 +1280,7 @@ useEventListener(
:placeholder="$t('msg.info.formInput')"
@focus="onFocusActiveFieldLabel"
@keydown.enter.prevent
@update:value="updateFieldTitle"
@input="updateFieldTitle($event.target.value)"
@change="updateColMeta(activeField)"
/>

1
packages/nc-gui/components/smartsheet/Kanban.vue

@ -113,7 +113,6 @@ const kanbanContainerRef = ref()
const selectedStackTitle = ref('')
reloadViewDataHook?.on(async () => {
console.log('load')
await loadKanbanMeta()
await loadKanbanData()
})

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

@ -33,7 +33,7 @@ vModel.value.meta = {
// allow all mime types by default
supportedAttachmentMimeTypes: ['*'],
}),
...vModel.value.meta,
...(vModel.value.meta || {}),
}
const expandedKeys = ref<(string | number)[]>([])

20
packages/nc-gui/components/smartsheet/column/BarcodeOptions.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { ColumnType, UITypes } from 'nocodb-sdk'
import { type ColumnType, UITypes } from 'nocodb-sdk'
import { AllowedColumnTypesForQrAndBarcodes, isVirtualCol } from 'nocodb-sdk'
const props = defineProps<{
@ -29,25 +29,11 @@ const columnsAllowedAsBarcodeValue = computed<ColumnType[]>(() => {
)
})
const supportedBarcodeFormats = [
{ value: 'CODE128', label: 'CODE128' },
{ value: 'upc', label: 'UPC' },
{ value: 'EAN13', label: 'EAN-13' },
{ value: 'EAN8', label: 'EAN-8' },
{ value: 'EAN5', label: 'EAN-5' },
{ value: 'EAN2', label: 'EAN-2' },
{ value: 'CODE39', label: 'CODE39' },
{ value: 'ITF14', label: 'ITF-14' },
{ value: 'MSI', label: 'MSI' },
{ value: 'PHARMACODE', label: 'PHARMACODE' },
{ value: 'CODABAR', label: 'CODABAR' },
]
onMounted(() => {
// set default value
vModel.value.meta = {
barcodeFormat: supportedBarcodeFormats[0].value,
...vModel.value.meta,
...columnDefaultMeta[UITypes.Barcode],
...(vModel.value.meta || {}),
}
vModel.value.fk_barcode_value_column_id =
(column?.value?.colOptions as Record<string, any>)?.fk_barcode_value_column_id || columnsAllowedAsBarcodeValue.value?.[0]?.id

10
packages/nc-gui/components/smartsheet/column/CheckboxOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -50,12 +52,8 @@ const isOpenColorPicker = ref(false)
// set default value
vModel.value.meta = {
icon: {
checked: 'mdi-check-bold',
unchecked: 'mdi-crop-square',
},
color: '#777',
...vModel.value.meta,
...columnDefaultMeta[UITypes.Checkbox],
...(vModel.value.meta || {}),
}
// antdv doesn't support object as value

7
packages/nc-gui/components/smartsheet/column/CurrencyOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
interface Option {
label: string
value: string
@ -64,9 +66,8 @@ function filterOption(input: string, option: Option) {
// set default value
vModel.value.meta = {
currency_locale: 'en-US',
currency_code: 'USD',
...vModel.value.meta,
...columnDefaultMeta[UITypes.Currency],
...(vModel.value.meta || {}),
}
currencyLocales().then((locales) => {

9
packages/nc-gui/components/smartsheet/column/DateOptions.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { dateFormats, dateMonthFormats } from 'nocodb-sdk'
import { UITypes, dateFormats, dateMonthFormats } from 'nocodb-sdk'
const props = defineProps<{
value: any
@ -9,9 +9,10 @@ const emit = defineEmits(['update:value'])
const vModel = useVModel(props, 'value', emit)
if (!vModel.value.meta?.date_format) {
if (!vModel.value.meta) vModel.value.meta = {}
vModel.value.meta.date_format = dateFormats[0]
// set default value
vModel.value.meta = {
...columnDefaultMeta[UITypes.Date],
...(vModel.value.meta || {}),
}
</script>

18
packages/nc-gui/components/smartsheet/column/DateTimeOptions.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { dateFormats, timeFormats } from 'nocodb-sdk'
import { UITypes, dateFormats, timeFormats } from 'nocodb-sdk'
const props = defineProps<{
value: any
@ -9,18 +9,10 @@ const emit = defineEmits(['update:value'])
const vModel = useVModel(props, 'value', emit)
if (!vModel.value.meta?.date_format) {
if (!vModel.value.meta) vModel.value.meta = {}
vModel.value.meta.date_format = dateFormats[0]
}
if (!vModel.value.meta?.time_format) {
if (!vModel.value.meta) vModel.value.meta = {}
vModel.value.meta.time_format = timeFormats[0]
}
if (vModel.value.meta?.is12hrFormat === undefined) {
if (!vModel.value.meta) vModel.value.meta = {}
vModel.value.meta.is12hrFormat = false
// set default value
vModel.value.meta = {
...columnDefaultMeta[UITypes.DateTime],
...(vModel.value.meta || {}),
}
</script>

5
packages/nc-gui/components/smartsheet/column/DecimalOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -24,8 +26,7 @@ const vModel = useVModel(props, 'value', emit)
// set default value
vModel.value.meta = {
precision: precisionFormats[0],
isLocaleString: false,
...columnDefaultMeta[UITypes.Decimal],
...(vModel.value.meta || {}),
}

6
packages/nc-gui/components/smartsheet/column/DurationOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -16,8 +18,8 @@ const durationOptionList =
// set default value
vModel.value.meta = {
duration: 0,
...vModel.value.meta,
...columnDefaultMeta[UITypes.Duration],
...(vModel.value.meta || {}),
}
</script>

6
packages/nc-gui/components/smartsheet/column/EditOrAdd.vue

@ -115,12 +115,13 @@ const showDeprecated = ref(false)
const isSystemField = (t: { name: UITypes }) =>
[UITypes.CreatedBy, UITypes.CreatedTime, UITypes.LastModifiedBy, UITypes.LastModifiedTime].includes(t.name)
const uiFilters = (t: { name: UITypes; virtual?: number }) => {
const uiFilters = (t: { name: UITypes; virtual?: number; deprecated?: boolean }) => {
const systemFiledNotEdited = !isSystemField(t) || formState.value.uidt === t.name || !isEdit.value
const geoDataToggle = geoDataToggleCondition(t) && (!isEdit.value || !t.virtual || t.name === formState.value.uidt)
const specificDBType = t.name === UITypes.SpecificDBType && isXcdbBase(meta.value?.source_id)
const showDeprecatedField = !t.deprecated || showDeprecated.value
return systemFiledNotEdited && geoDataToggle && !specificDBType
return systemFiledNotEdited && geoDataToggle && !specificDBType && showDeprecatedField
}
const uiTypesOptions = computed<typeof uiTypes>(() => {
@ -329,7 +330,6 @@ const filterOption = (input: string, option: { value: UITypes }) => {
'w-[384px]': !props.embedMode,
'min-w-500px': formState.uidt === UITypes.LinkToAnotherRecord || formState.uidt === UITypes.Links,
'!w-116 overflow-visible': formState.uidt === UITypes.Formula && !props.embedMode,
'!w-[500px]': formState.uidt === UITypes.Attachment && !props.embedMode && !appInfo.ee,
'!w-[600px]': formState.uidt === UITypes.LinkToAnotherRecord || formState.uidt === UITypes.Links,
'shadow-lg border-1 border-gray-200 shadow-gray-300 rounded-xl p-5': !embedMode,
}"

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

@ -44,7 +44,7 @@ setAdditionalValidations({
vModel.value.meta = {
singular: '',
plural: '',
...vModel.value.meta,
...(vModel.value.meta || {}),
}
</script>

4
packages/nc-gui/components/smartsheet/column/NumberOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -9,7 +11,7 @@ const vModel = useVModel(props, 'value', emit)
// set default value
vModel.value.meta = {
isLocaleString: false,
...columnDefaultMeta[UITypes.Number],
...(vModel.value.meta || {}),
}
</script>

6
packages/nc-gui/components/smartsheet/column/PercentOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
isEdit?: boolean
@ -18,8 +20,8 @@ setAdditionalValidations({
// set default value
vModel.value.meta = {
is_progress: false,
...vModel.value.meta,
...columnDefaultMeta[UITypes.Percent],
...(vModel.value.meta || {}),
}
</script>

36
packages/nc-gui/components/smartsheet/column/RatingOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -7,30 +9,6 @@ const emit = defineEmits(['update:value'])
const vModel = useVModel(props, 'value', emit)
// cater existing v1 cases
const iconList = [
{
full: 'mdi-star',
empty: 'mdi-star-outline',
},
{
full: 'mdi-heart',
empty: 'mdi-heart-outline',
},
{
full: 'mdi-moon-full',
empty: 'mdi-moon-new',
},
{
full: 'mdi-thumb-up',
empty: 'mdi-thumb-up-outline',
},
{
full: 'mdi-flag',
empty: 'mdi-flag-outline',
},
]
const picked = computed({
get: () => vModel.value.meta.color,
set: (val) => {
@ -42,14 +20,8 @@ const isOpenColorPicker = ref(false)
// set default value
vModel.value.meta = {
iconIdx: 0,
icon: {
full: 'mdi-star',
empty: 'mdi-star-outline',
},
color: '#fcb401',
max: 5,
...vModel.value.meta,
...columnDefaultMeta[UITypes.Rating],
...(vModel.value.meta || {}),
}
// antdv doesn't support object as value

4
packages/nc-gui/components/smartsheet/column/TimeOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
}>()
@ -9,7 +11,7 @@ const vModel = useVModel(props, 'value', emit)
// set default value
vModel.value.meta = {
is12hrFormat: false,
...columnDefaultMeta[UITypes.Time],
...(vModel.value.meta ?? {}),
}
</script>

7
packages/nc-gui/components/smartsheet/column/UserOptions.vue

@ -1,4 +1,6 @@
<script setup lang="ts">
import { UITypes } from 'nocodb-sdk'
const props = defineProps<{
value: any
isEdit: boolean
@ -22,9 +24,8 @@ setAdditionalValidations({
// set default value
vModel.value.meta = {
is_multi: false,
notify: false,
...vModel.value.meta,
...columnDefaultMeta[UITypes.User],
...(vModel.value.meta || {}),
}
onMounted(() => {

45
packages/nc-gui/components/smartsheet/details/Fields.vue

@ -46,6 +46,8 @@ const isLocked = inject(IsLockedInj, ref(false))
const { openedViewsTab } = storeToRefs(useViewsStore())
const localMetaColumns = ref<ColumnType[] | undefined>([])
const moveOps = ref<moveOp[]>([])
const visibilityOps = ref<fieldsVisibilityOps[]>([])
@ -99,7 +101,7 @@ const getFieldOrder = (field?: TableExplorerColumn) => {
const fields = computed<TableExplorerColumn[]>({
get: () => {
const x = ((meta.value?.columns as ColumnType[]) ?? [])
const x = ((localMetaColumns.value as ColumnType[]) ?? [])
.filter((field) => !field.fk_column_id && !isSystemColumn(field))
.concat(newFields.value)
.map((field) => updateDefaultColumnValues(field))
@ -109,7 +111,7 @@ const fields = computed<TableExplorerColumn[]>({
return x
},
set: (val) => {
meta.value!.columns = meta.value?.columns?.map((col) => {
localMetaColumns.value = localMetaColumns.value?.map((col) => {
const field = val.find((f) => compareCols(f, col))
if (field) {
return field
@ -217,15 +219,15 @@ const addField = (field?: TableExplorerColumn, before = false) => {
}
const displayColumn = computed(() => {
if (!meta.value?.columns) return
return meta.value?.columns.find((col) => col.pv)
if (!localMetaColumns.value) return
return localMetaColumns.value.find((col) => col.pv)
})
const duplicateField = async (field: TableExplorerColumn) => {
if (!meta.value?.columns) return
if (!localMetaColumns.value) return
// generate duplicate column name
const duplicateColumnName = getUniqueColumnName(`${field.title}_copy`, meta.value?.columns)
const duplicateColumnName = getUniqueColumnName(`${field.title}_copy`, localMetaColumns.value)
let fieldPayload = {}
@ -306,7 +308,12 @@ const onFieldUpdate = (state: TableExplorerColumn, skipLinkChecks = false) => {
}
}
const diffs = diff(col, state) as Partial<TableExplorerColumn>
const pdiffs: Record<string, any> = diff(col, state)
// remove undefined values
const diffs = Object.fromEntries(
Object.entries(pdiffs).filter(([_, value]) => value !== undefined),
) as Partial<TableExplorerColumn>
if (Object.keys(diffs).length === 0 || (Object.keys(diffs).length === 1 && 'altered' in diffs)) {
ops.value = ops.value.filter((op) => op.op === 'add' || !compareCols(op.column, state))
@ -604,6 +611,21 @@ const clearChanges = () => {
const isColumnsValid = computed(() => fields.value.every((f) => isColumnValid(f)))
const metaToLocal = () => {
localMetaColumns.value = meta.value?.columns?.map((c: ColumnType) => {
if (c.uidt && c.uidt in columnDefaultMeta) {
if (!c.meta) c.meta = {}
c.meta = {
...columnDefaultMeta[c.uidt],
...(c.meta || {}),
}
}
return {
...c,
}
})
}
const saveChanges = async () => {
if (!isColumnsValid.value) {
message.error(t('msg.error.multiFieldSaveValidation'))
@ -692,6 +714,9 @@ const saveChanges = async () => {
}
await getMeta(meta.value.id, true)
metaToLocal()
columnsHash.value = (await $api.dbTableColumn.hash(meta.value?.id)).hash
visibilityOps.value = []
@ -841,6 +866,10 @@ onMounted(async () => {
if (meta.value && meta.value.id) {
columnsHash.value = (await $api.dbTableColumn.hash(meta.value.id)).hash
}
await until(() => meta.value?.columns)
metaToLocal()
})
const onFieldOptionUpdate = () => {
@ -874,7 +903,7 @@ watch(
const defaultColumnName = generateUniqueColumnName({
formState: oldField,
tableExplorerColumns: fields.value || [],
metaColumns: meta.value?.columns || [],
metaColumns: localMetaColumns.value || [],
newFieldTitles,
})

2
packages/nc-gui/components/smartsheet/expanded-form/Comments.vue

@ -3,7 +3,7 @@ import { type CommentType, ProjectRoles } from 'nocodb-sdk'
const props = defineProps<{
loading: boolean
primaryKey: string
primaryKey: string | null
}>()
const {

20
packages/nc-gui/components/smartsheet/grid/useColumnDrag.ts

@ -18,6 +18,7 @@ export const useColumnDrag = ({
const { leftSidebarWidth } = storeToRefs(useSidebarStore())
const { width } = useWindowSize()
const isProcessing = ref<boolean>(false)
const draggedCol = ref<ColumnType | null>(null)
const dragColPlaceholderDomRef = ref<HTMLElement | null>(null)
const toBeDroppedColId = ref<string | null>(null)
@ -57,7 +58,7 @@ export const useColumnDrag = ({
const lastViewCol = gridViewCols.value[lastCol.id!]
// if nextToViewCol/toViewCol is null, return
if (nextToViewCol === null || lastViewCol === null) return
if (nextToViewCol === null && lastViewCol === null) return
const newOrder = nextToViewCol ? toViewCol.order! + (nextToViewCol.order! - toViewCol.order!) / 2 : lastViewCol.order! + 1
const oldOrder = toBeReorderedViewCol.order
@ -106,9 +107,16 @@ export const useColumnDrag = ({
}
const handleReorderColumn = async () => {
dragColPlaceholderDomRef.value!.style.left = '0px'
dragColPlaceholderDomRef.value!.style.height = '0px'
await reorderColumn(draggedCol.value!.id!, toBeDroppedColId.value!)
isProcessing.value = true
try {
dragColPlaceholderDomRef.value!.style.left = '0px'
dragColPlaceholderDomRef.value!.style.height = '0px'
await reorderColumn(draggedCol.value!.id!, toBeDroppedColId.value!)
} catch (error) {
console.error('Failed to reorder column: ', error)
} finally {
isProcessing.value = false
}
draggedCol.value = null
toBeDroppedColId.value = null
}
@ -180,9 +188,11 @@ export const useColumnDrag = ({
}
// fallback for safari browser
const onDragEnd = (e: DragEvent) => {
const onDragEnd = async (e: DragEvent) => {
e.preventDefault()
await until(() => !isProcessing.value).toBeTruthy()
if (!e.dataTransfer || !draggedCol.value || !toBeDroppedColId.value) return
handleReorderColumn()

4
packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue

@ -878,7 +878,7 @@ const changeToDynamic = async (filter, i) => {
'mt-1 mb-2': filters.length,
}"
>
<NcButton :ref="addFilterBtnRef" size="small" type="text" class="nc-btn-focus" @click.stop="addFilter()">
<NcButton size="small" type="text" class="nc-btn-focus" @click.stop="addFilter()">
<div class="flex items-center gap-1">
<component :is="iconMap.plus" />
<!-- Add Filter -->
@ -904,7 +904,7 @@ const changeToDynamic = async (filter, i) => {
'mt-1 mb-2': filters.length,
}"
>
<NcButton :ref="addFilterBtnRef" class="nc-btn-focus" size="small" type="text" @click.stop="addFilter()">
<NcButton class="nc-btn-focus" size="small" type="text" @click.stop="addFilter()">
<div class="flex items-center gap-1">
<component :is="iconMap.plus" />
<!-- Add Filter -->

6
packages/nc-gui/composables/useAttachment.ts

@ -5,9 +5,9 @@ const useAttachment = () => {
const res: string[] = []
if (item?.data) res.push(item.data)
if (item?.file) res.push(window.URL.createObjectURL(item.file))
if (item?.signedPath) res.push(encodeURI(`${appInfo.value.ncSiteUrl}/${item.signedPath}`))
if (item?.signedUrl) res.push(encodeURI(item.signedUrl))
if (item?.path) res.push(encodeURI(`${appInfo.value.ncSiteUrl}/${item.path}`))
if (item?.signedPath) res.push(`${appInfo.value.ncSiteUrl}/${encodeURI(item.signedPath)}`)
if (item?.signedUrl) res.push(item.signedUrl)
if (item?.path) res.push(`${appInfo.value.ncSiteUrl}/${encodeURI(item.path)}`)
if (item?.url) res.push(item.url)
return res
}

45
packages/nc-gui/composables/useDebounceFnCached.ts

@ -0,0 +1,45 @@
import type { DebounceFilterOptions, MaybeRefOrGetter } from '@vueuse/core'
type FunctionArgs = (...args: any[]) => any
// Default function to generate a cache key
function defaultGetCacheKey(): string {
return 'default'
}
/**
* Creates a cached debounced version of the given function.
*
* @param fn - The function to debounce.
* @param ms - The debounce delay in milliseconds. Default is 500ms.
* @param getCacheKey - Function to generate a unique cache key based on the arguments.
* @param options - Additional options for debouncing.
*
* @returns A debounced version of the input function with caching.
*/
export function useCachedDebouncedFunction<T extends FunctionArgs>(
fn: T,
ms: MaybeRefOrGetter<number> = 500,
getCacheKey: (...args: Parameters<T>) => string | number = defaultGetCacheKey,
options: DebounceFilterOptions = {},
): (...args: Parameters<T>) => ReturnType<T> {
// Cache to store debounced functions based on a unique key
const debounceCache = new Map<string | number, any>()
return (...args: Parameters<T>): ReturnType<T> => {
// Generate a unique key for the given arguments
const key = getCacheKey(...args)
// If the debounced function for the given key is not in the cache, create and cache it
if (!debounceCache.has(key)) {
const debouncedFn = useDebounceFn(fn, ms, options)
debounceCache.set(key, debouncedFn)
}
// Retrieve the cached debounced function
const debouncedFn = debounceCache.get(key)
// Call and return the result of the debounced function
return debouncedFn!(...args)
}
}

156
packages/nc-gui/composables/useViewFilters.ts

@ -10,12 +10,14 @@ import type { ComputedRef, Ref } from 'vue'
import type { SelectProps } from 'ant-design-vue'
import { UITypes, isSystemColumn } from 'nocodb-sdk'
type ColumnFilterType = FilterType & { status?: string; id?: string; children?: ColumnFilterType[]; is_group?: boolean }
export function useViewFilters(
view: Ref<ViewType | undefined>,
_parentId: Ref<string | null> | null | string,
autoApply?: ComputedRef<boolean>,
reloadData?: () => void,
_currentFilters?: Filter[],
_currentFilters?: ColumnFilterType[],
isNestedRoot?: boolean,
isWebhook?: boolean,
isLink?: boolean,
@ -27,7 +29,7 @@ export function useViewFilters(
const currentFilters = ref(_currentFilters)
const btLookupTypesMap = ref({})
const btLookupTypesMap = ref<Record<string, any>>({})
const reloadHook = inject(ReloadViewDataHookInj)
@ -45,15 +47,15 @@ export function useViewFilters(
const { addUndo, clone, defineViewScope } = useUndoRedo()
const _filters = ref<FilterType[]>([...(currentFilters.value || [])])
const _filters = ref<ColumnFilterType[]>([...(currentFilters.value || [])])
const nestedMode = computed(() => isPublic.value || !isUIAllowed('filterSync') || !isUIAllowed('filterChildrenRead'))
const filters = computed<FilterType[]>({
const filters = computed<ColumnFilterType[]>({
get: () => {
return nestedMode.value && !isLink && !isWebhook ? currentFilters.value! : _filters.value
},
set: (value: Filter[]) => {
set: (value: ColumnFilterType[]) => {
if (nestedMode.value) {
currentFilters.value = value
if (!isLink && !isWebhook) {
@ -117,9 +119,9 @@ export function useViewFilters(
}, {})
})
const lastFilters = ref<Filter[]>([])
const lastFilters = ref<ColumnFilterType[]>([])
watchOnce(filters, (filters: Filter[]) => {
watchOnce(filters, (filters: ColumnFilterType[]) => {
lastFilters.value = clone(filters)
})
@ -131,7 +133,7 @@ export function useViewFilters(
}
const isComparisonOpAllowed = (
filter: FilterType,
filter: ColumnFilterType,
compOp: {
text: string
value: string
@ -141,7 +143,7 @@ export function useViewFilters(
},
) => {
const isNullOrEmptyOp = ['empty', 'notempty', 'null', 'notnull'].includes(compOp.value)
const uidt = types.value[filter.fk_column_id]
const uidt = types.value[filter.fk_column_id!]
if (compOp.includedTypes) {
// include allowed values only if selected column type matches
@ -167,7 +169,7 @@ export function useViewFilters(
}
const isComparisonSubOpAllowed = (
filter: FilterType,
filter: ColumnFilterType,
compOp: {
text: string
value: string
@ -176,7 +178,7 @@ export function useViewFilters(
excludedTypes?: UITypes[]
},
) => {
const uidt = types.value[filter.fk_column_id]
const uidt = types.value[filter.fk_column_id!]
if (compOp.includedTypes) {
// include allowed values only if selected column type matches
@ -187,7 +189,7 @@ export function useViewFilters(
}
}
const placeholderFilter = (): Filter => {
const placeholderFilter = (): ColumnFilterType => {
const logicalOps = new Set(filters.value.slice(1).map((filter) => filter.logical_op))
return {
@ -200,7 +202,7 @@ export function useViewFilters(
}
}
const placeholderGroupFilter = (): Filter => {
const placeholderGroupFilter = (): ColumnFilterType => {
const logicalOps = new Set(filters.value.slice(1).map((filter) => filter.logical_op))
return {
@ -210,12 +212,12 @@ export function useViewFilters(
}
}
const loadAllChildFilters = async (filters: Filter[]) => {
const loadAllChildFilters = async (filters: ColumnFilterType[]) => {
// Array to store promises of child filter loading
const promises = []
// Array to store all child filters
const allChildFilters: Filter[] = []
const allChildFilters: ColumnFilterType[] = []
// Iterate over all filters
for (const filter of filters) {
@ -223,7 +225,7 @@ export function useViewFilters(
if (filter.id && filter.is_group) {
// Load children filters from the backend
const childFilterPromise = $api.dbTableFilter.childrenRead(filter.id).then((response) => {
const childFilters = response.list as Filter[]
const childFilters = response.list as ColumnFilterType[]
allChildFilters.push(...childFilters)
return loadAllChildFilters(childFilters)
})
@ -235,7 +237,7 @@ export function useViewFilters(
await Promise.all(promises)
// Push all child filters into the allFilters array
if (!isLink && !isWebhook) allFilters.value.push(...allChildFilters)
if (!isLink && !isWebhook) allFilters.value.push(...(allChildFilters as FilterType[]))
}
const loadFilters = async ({
@ -259,25 +261,25 @@ export function useViewFilters(
try {
if (isWebhook || hookId) {
if (parentId.value) {
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as Filter[]
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as ColumnFilterType[]
} else if (hookId && !isNestedRoot) {
filters.value = (await $api.dbTableWebhookFilter.read(hookId)).list as Filter[]
filters.value = (await $api.dbTableWebhookFilter.read(hookId)).list as ColumnFilterType[]
}
} else {
if (isLink || linkColId?.value) {
if (parentId.value) {
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as Filter[]
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as ColumnFilterType[]
} else if (linkColId?.value && !isNestedRoot) {
filters.value = (await $api.dbTableLinkFilter.read(linkColId?.value)).list as Filter[]
filters.value = (await $api.dbTableLinkFilter.read(linkColId?.value)).list as ColumnFilterType[]
}
} else {
if (parentId.value) {
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as Filter[]
filters.value = (await $api.dbTableFilter.childrenRead(parentId.value)).list as ColumnFilterType[]
} else {
filters.value = (await $api.dbTableFilter.read(view.value!.id!)).list as Filter[]
filters.value = (await $api.dbTableFilter.read(view.value!.id!)).list as ColumnFilterType[]
if (loadAllFilters) {
allFilters.value = [...filters.value]
await loadAllChildFilters(allFilters.value)
allFilters.value = [...filters.value] as FilterType[]
await loadAllChildFilters(allFilters.value as ColumnFilterType[])
}
}
}
@ -311,23 +313,26 @@ export function useViewFilters(
...filter,
children: undefined,
fk_parent_id: parentId.value,
})) as unknown as FilterType
} as FilterType)) as ColumnFilterType
} else if (linkId || linkColId?.value) {
filters.value[+i] = (await $api.dbTableLinkFilter.create(linkId || linkColId.value, {
...filter,
children: undefined,
fk_parent_id: parentId.value,
})) as unknown as FilterType
} as FilterType)) as ColumnFilterType
} else {
filters.value[+i] = await $api.dbTableFilter.create(view?.value?.id as string, {
...filter,
fk_parent_id: parentId.value,
})
filters.value[+i] = (await $api.dbTableFilter.create(
view?.value?.id as string,
{
...filter,
fk_parent_id: parentId.value,
} as FilterType,
)) as ColumnFilterType
}
if (children) filters.value[+i].children = children
if (!isLink && !isWebhook) allFilters.value.push(filters.value[+i])
if (!isLink && !isWebhook) allFilters.value.push(filters.value[+i] as FilterType)
}
}
@ -338,13 +343,18 @@ export function useViewFilters(
}
}
const saveOrUpdate = async (filter: Filter, i: number, force = false, undo = false, skipDataReload = false) => {
const saveOrUpdateDebounced = useCachedDebouncedFunction(saveOrUpdate, 500, (_filter: ColumnFilterType, i: number) => i)
async function saveOrUpdate(filter: ColumnFilterType, i: number, force = false, undo = false, skipDataReload = false) {
// if already in progress the debounced function which will call this function again with 500ms delay until it's not saving
if (savingStatus[i]) {
return saveOrUpdateDebounced(filter, i, force, undo, skipDataReload)
} else {
savingStatus[i] = true
}
// wait if any previous filter save is in progress, it's to avoid messing up the order of filters
else if (Array.from({ length: i }).some((_, index) => savingStatus[index])) {
return saveOrUpdateDebounced(filter, i, force, undo, skipDataReload)
}
savingStatus[i] = true
if (!view.value && !linkColId?.value) return
@ -358,7 +368,7 @@ export function useViewFilters(
fn: (prop: string, data: any) => {
const f = filters.value[i]
if (f) {
f[prop as keyof Filter] = data
f[prop as keyof ColumnFilterType] = data
saveOrUpdate(f, i, force, true)
}
},
@ -368,25 +378,24 @@ export function useViewFilters(
fn: (prop: string, data: any) => {
const f = filters.value[i]
if (f) {
f[prop as keyof Filter] = data
f[prop as keyof ColumnFilterType] = data
saveOrUpdate(f, i, force, true)
}
},
args: [Object.keys(delta)[0], filter[Object.keys(delta)[0] as keyof Filter]],
args: [Object.keys(delta)[0], filter[Object.keys(delta)[0] as keyof ColumnFilterType]],
},
scope: defineViewScope({ view: activeView.value }),
})
}
}
}
try {
if (nestedMode.value) {
filters.value[i] = { ...filter }
filters.value = [...filters.value]
} else if (!autoApply?.value && !force) {
filter.status = filter.id ? 'update' : 'create'
} else if (filters.value[i]?.id && filter.status !== 'create') {
} else if (filters.value[i]?.id && filters.value[i]?.status !== 'create') {
await $api.dbTableFilter.update(filters.value[i].id!, {
...filter,
fk_parent_id: parentId.value,
@ -399,17 +408,33 @@ export function useViewFilters(
})
} else {
if (linkColId?.value) {
filters.value[i] = await $api.dbTableLinkFilter.create(linkColId.value, {
const savedFilter = await $api.dbTableLinkFilter.create(linkColId.value, {
...filter,
fk_parent_id: parentId,
fk_parent_id: parentId.value,
})
// extract id from saved filter and update the filter object
// avoiding whole object update to prevent overwriting of current filter object changes
filters.value[i] = {
...filters.value[i],
fk_parent_id: parentId.value,
id: savedFilter.id,
status: undefined,
}
} else {
filters.value[i] = await $api.dbTableFilter.create(view.value.id!, {
const savedFilter = await $api.dbTableFilter.create(view.value!.id!, {
...filter,
fk_parent_id: parentId.value,
})
// extract id from saved filter and update the filter object
// avoiding whole object update to prevent overwriting of current filter object changes
filters.value[i] = {
...filters.value[i],
fk_parent_id: parentId.value,
id: savedFilter.id,
status: undefined,
}
}
if (!isLink && !isWebhook) allFilters.value.push(filters.value[+i])
if (!isLink && !isWebhook) allFilters.value.push(filters.value[+i] as FilterType)
}
} catch (e: any) {
console.log(e)
@ -423,7 +448,7 @@ export function useViewFilters(
if (!isWebhook && !skipDataReload && !isLink) reloadData?.()
}
function deleteFilterGroupFromAllFilters(filter: Filter) {
function deleteFilterGroupFromAllFilters(filter: ColumnFilterType) {
if (!isLink && !isWebhook) return
// Find all child filters of the specified parentId
@ -432,7 +457,7 @@ export function useViewFilters(
// Recursively delete child filter of child filter
childFilters.forEach((childFilter) => {
if (childFilter.is_group) {
deleteFilterGroupFromAllFilters(childFilter)
deleteFilterGroupFromAllFilters(childFilter as ColumnFilterType)
}
})
@ -440,11 +465,13 @@ export function useViewFilters(
allFilters.value = allFilters.value.filter((f) => f.id !== filter.id && f.fk_parent_id !== filter.id)
}
const deleteFilter = async (filter: Filter, i: number, undo = false) => {
const deleteFilter = async (filter: ColumnFilterType, i: number, undo = false) => {
// update the filter status
filter.status = 'delete'
if (!undo && !filter.is_group) {
addUndo({
undo: {
fn: async (fl: Filter) => {
fn: async (fl: ColumnFilterType) => {
fl.status = 'create'
filters.value.splice(i, 0, fl)
await saveOrUpdate(fl, i, false, true)
@ -496,11 +523,10 @@ export function useViewFilters(
if (!isLink && !isWebhook) allFilters.value = allFilters.value.filter((f) => f.id !== filter.id)
}
}
const saveOrUpdateDebounced = useDebounceFn(saveOrUpdate, 500)
const addFilter = async (undo = false, draftFilter: Partial<FilterType> = {}) => {
filters.value.push(draftFilter?.fk_column_id ? { ...placeholderFilter(), ...draftFilter } : placeholderFilter())
filters.value.push(
(draftFilter?.fk_column_id ? { ...placeholderFilter(), ...draftFilter } : placeholderFilter()) as ColumnFilterType,
)
if (!undo) {
addUndo({
undo: {
@ -511,7 +537,7 @@ export function useViewFilters(
args: [filters.value.length - 1],
},
redo: {
fn: async (i: number, fl: Filter) => {
fn: async (i: number, fl: ColumnFilterType) => {
fl.status = 'create'
filters.value.splice(i, 0, fl)
await saveOrUpdate(fl, i, false, true)
@ -530,7 +556,7 @@ export function useViewFilters(
const addFilterGroup = async () => {
const child = placeholderFilter()
const placeHolderGroupFilter: Filter = placeholderGroupFilter()
const placeHolderGroupFilter: ColumnFilterType = placeholderGroupFilter()
if (nestedMode.value) placeHolderGroupFilter.children = [child]
@ -562,28 +588,34 @@ export function useViewFilters(
// method to extract looked up column meta for all bt lookup columns
// it helps to decide the condition operations for the column
const loadBtLookupTypes = async () => {
const btLookupTypes = {}
const btLookupTypes: Record<string, any> = {}
try {
for (const col of meta.value?.columns || []) {
if (col.uidt !== UITypes.Lookup) continue
let nextCol = col
let nextCol: ColumnType | undefined = col
// check all the relation of nested lookup columns is bt or not
// include the column only if all only if all relations are bt
while (nextCol && nextCol.uidt === UITypes.Lookup) {
// extract the relation column meta
const lookupRelation = (await getMeta(nextCol.fk_model_id))?.columns?.find(
(c) => c.id === (nextCol.colOptions as LookupType).fk_relation_column_id,
const lookupRelation = (await getMeta(nextCol.fk_model_id!))?.columns?.find(
(c) => c.id === (nextCol!.colOptions as LookupType).fk_relation_column_id,
)
const relatedTableMeta = await getMeta((lookupRelation.colOptions as LinkToAnotherRecordType).fk_related_model_id)
nextCol = relatedTableMeta?.columns?.find((c) => c.id === (nextCol.colOptions as LookupType).fk_lookup_column_id)
// this is less likely to happen but if relation column is not found then break the loop
if (!lookupRelation) {
break
}
const relatedTableMeta = await getMeta((lookupRelation?.colOptions as LinkToAnotherRecordType).fk_related_model_id!)
nextCol = relatedTableMeta?.columns?.find((c) => c.id === (nextCol!.colOptions as LookupType).fk_lookup_column_id)
// if next column is same as root lookup column then break the loop
// since it's going to be a circular loop
if (nextCol.id === col.id) {
if (nextCol?.id === col.id) {
break
}
}
btLookupTypes[col.id] = nextCol
btLookupTypes[col.id!] = nextCol
}
btLookupTypesMap.value = btLookupTypes
} catch (e) {

2
packages/nc-gui/composables/useViewGroupBy.ts

@ -532,6 +532,8 @@ const [useProvideViewGroupBy, useViewGroupBy] = useInjectionState(
(c) => c.id === (nextCol?.colOptions as LookupType).fk_relation_column_id,
)
if (!lookupRelation?.colOptions) break
const relatedTableMeta = await getMeta(
(lookupRelation?.colOptions as LinkToAnotherRecordType).fk_related_model_id as string,
)

119
packages/nc-gui/helpers/columnDefaultMeta.ts

@ -0,0 +1,119 @@
import { UITypes, dateFormats, timeFormats } from 'nocodb-sdk'
export const precisionFormats = [1, 2, 3, 4, 5, 6, 7, 8]
export const iconList = [
{
full: 'mdi-star',
empty: 'mdi-star-outline',
},
{
full: 'mdi-heart',
empty: 'mdi-heart-outline',
},
{
full: 'mdi-moon-full',
empty: 'mdi-moon-new',
},
{
full: 'mdi-thumb-up',
empty: 'mdi-thumb-up-outline',
},
{
full: 'mdi-flag',
empty: 'mdi-flag-outline',
},
]
export const supportedBarcodeFormats = [
{ value: 'CODE128', label: 'CODE128' },
{ value: 'upc', label: 'UPC' },
{ value: 'EAN13', label: 'EAN-13' },
{ value: 'EAN8', label: 'EAN-8' },
{ value: 'EAN5', label: 'EAN-5' },
{ value: 'EAN2', label: 'EAN-2' },
{ value: 'CODE39', label: 'CODE39' },
{ value: 'ITF14', label: 'ITF-14' },
{ value: 'MSI', label: 'MSI' },
{ value: 'PHARMACODE', label: 'PHARMACODE' },
{ value: 'CODABAR', label: 'CODABAR' },
]
const barcodeDefaultMeta = {
barcodeFormat: supportedBarcodeFormats[0].value,
}
const checkboxDefaultMeta = {
iconIdx: 0,
icon: {
checked: 'mdi-check-bold',
unchecked: 'mdi-crop-square',
},
color: '#777',
}
const currencyDefaultMeta = {
currency_locale: 'en-US',
currency_code: 'USD',
}
const dateDefaultMeta = {
date_format: dateFormats[0],
}
const dateTimeDefaultMeta = {
date_format: dateFormats[0],
time_format: timeFormats[0],
is12hrFormat: false,
}
const decimalDefaultMeta = {
precision: precisionFormats[0],
isLocaleString: false,
}
const durationDefaultMeta = {
duration: 0,
}
const numberDefaultMeta = {
isLocaleString: false,
}
const percentDefaultMeta = {
is_progress: false,
}
const ratingDefaultMeta = {
iconIdx: 0,
icon: {
full: 'mdi-star',
empty: 'mdi-star-outline',
},
color: '#fcb401',
max: 5,
}
const timeDefaultMeta = {
is12hrFormat: false,
}
const userDefaultMeta = {
is_multi: false,
notify: false,
}
export const columnDefaultMeta = {
[UITypes.Checkbox]: checkboxDefaultMeta,
[UITypes.Currency]: currencyDefaultMeta,
[UITypes.Date]: dateDefaultMeta,
[UITypes.DateTime]: dateTimeDefaultMeta,
[UITypes.Decimal]: decimalDefaultMeta,
[UITypes.Duration]: durationDefaultMeta,
[UITypes.Number]: numberDefaultMeta,
[UITypes.Percent]: percentDefaultMeta,
[UITypes.Rating]: ratingDefaultMeta,
[UITypes.Time]: timeDefaultMeta,
[UITypes.User]: userDefaultMeta,
[UITypes.Barcode]: barcodeDefaultMeta,
}

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Kód měny",
"searchMembers": "Vyhledávání členů",
"noMembersFound": "Nenalezeni žádní členové",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Kopírovat URL záznamu",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Sbalit zásobník",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Odstranit zásobník",
"stackedBy": "Seskupeno dle",
"chooseGroupingField": "Výběr pole pro seskupení",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Vytvoření osobních API tokenů pro použití při automatizaci nebo v externích aplikacích.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Kollaps af stak",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Slet stak",
"stackedBy": "Stablet af",
"chooseGroupingField": "Vælg et grupperingsfelt",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Kopfzeilen",
"parameterName": "Parametername",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Währung",
"currencyCode": "Währungscode",
"searchMembers": "Nach Nutzern suchen",
"noMembersFound": "Keine Mitglieder gefunden",
"dateJoined": "Beitrittsdatum",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Rich-Text-Format aktivieren",
"idColon": "ID:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Stapel einklappen",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Stapel löschen",
"stackedBy": "Gestapelt von",
"chooseGroupingField": "Wählen Sie ein Gruppierungsfeld",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Ungültige Uhrzeit",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Ungültige Telefonnummer",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Personalisierte API Tokens zur Verwendung in Automatisierungen oder externen Apps erstellen.",
"selectFieldToSort": "Feld zum Sortieren auswählen",
"selectFieldToGroup": "Feld zum Gruppieren auswählen",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parámetro",
"headers": "Encabezados",
"parameterName": "Nombre del parámetro",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Moneda local",
"currencyCode": "Código de moneda",
"searchMembers": "Buscar miembros",
"noMembersFound": "Ningún miembro encontrado",
"dateJoined": "Fecha de incorporación",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Selecciona los campos del panel derecho para añadirlos aquí",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Nombre del encabezado",
"icon": "Icono",
"max": "Máximo",
"enableRichText": "Enable rich text",
"enableRichText": "Activar Texto Enriquecido",
"idColon": "Id:",
"copiedRecordURL": "URL del registro copiado",
"copyRecordURL": "Copiar URL de registro",
@ -598,7 +600,7 @@
"untitledToken": "Token sin título",
"tableName": "Nombre de la tabla",
"dashboardName": "Nombre del panel",
"createView": "Crear Vista",
"createView": "Crear una vista",
"creatingView": "Creando Vista",
"duplicateView": "Duplicar vista",
"duplicateGridView": "Duplicar vista en cuadrcula",
@ -937,7 +939,7 @@
"clearMetadata": "Limpiar metadatos",
"exportToFile": "Exportar a archivo",
"changePwd": "Cambia la contraseña",
"createView": "Crear vista",
"createView": "Crear una Vista",
"shareView": "Compartir vista",
"findRowByCodeScan": "Find row by scan",
"fillByCodeScan": "Rellenar por escaneo",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Colapsar pila",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Borrar pila",
"stackedBy": "Apilado por",
"chooseGroupingField": "Elija un campo de agrupación",
@ -1033,7 +1038,7 @@
"group": "Group"
},
"tooltip": {
"reachedSourceLimit": "Limitado a una única fuente de datos por el momento",
"reachedSourceLimit": "Limited to 10 data sources per base",
"saveChanges": "Guardar cambios",
"xcDB": "Crear un nuevo proyecto",
"extDB": "Soporta MySQL, PostgreSQL, SQL Server y SQLite",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Hora no válida",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Tamaño de página modificado",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No hay registros vinculados",
"noLinkedRecords": "No linked records",
"recordsLinked": "registros vinculados",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Sólo acepta",
"apiTokenCreate": "Cree tokens de API personales para utilizarlos en la automatización o en aplicaciones externas.",
"selectFieldToSort": "Seleccionar campo para ordenar",
"selectFieldToGroup": "Seleccione el campo al grupo",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "Los tipos de archivo aceptados son .xls, .xlsx, .xlsm, .ods, .ots",
"parameterKeyCannotBeEmpty": "La clave del parámetro no puede estar vacía",
"duplicateParameterKeysAreNotAllowed": "No se permiten claves de parámetros duplicadas",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value} no puede estar vacía.",
"projectNotAccessible": "Proyecto no accesible",
"copyToClipboardError": "Fallo al copiar al portapapeles",
"pasteFromClipboardError": "Failed to paste from clipboard",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parametroa",
"headers": "Goiburuak",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "Ez da kiderik aurkitu",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "پارامتر",
"headers": "سربرگ",
"parameterName": "نام پارامتر",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "کد واحد پولی",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "جمع کردن دسته",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "حذف دسته",
"stackedBy": "دستهبندی با",
"chooseGroupingField": "انتخاب فیلد گروهبندی",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Pinoaminen Pinoaminen",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Poista pino",
"stackedBy": "Pinottu by",
"chooseGroupingField": "Valitse ryhmittelykenttä",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Couleur ",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Propriétaire",
@ -336,8 +337,8 @@
"parameter": "Paramètre",
"headers": "En-têtes",
"parameterName": "Nom du paramètre",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Langue de la devise",
"currencyCode": "Code de la devise",
"searchMembers": "Rechercher des membres",
"noMembersFound": "Aucun membre trouvé",
"dateJoined": "Date d'inscription",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Sélectionnez les champs du panneau de droite à ajouter ici",
"noOptionsFound": "Aucune option trouvée",
"surveyFormSubmitConfirmMsg": "Êtes-vous sûr de vouloir envoyer ce formulaire ?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Sélectionner une vue",
@ -598,7 +600,7 @@
"untitledToken": "Jeton sans titre",
"tableName": "Nom du tableau",
"dashboardName": "Nom du tableau de bord",
"createView": "Créer vue",
"createView": "Créer une vue",
"creatingView": "Création de la vue",
"duplicateView": "Dupliquer la vue",
"duplicateGridView": "Dupliquer la vue Grille",
@ -937,7 +939,7 @@
"clearMetadata": "Effacer les métadonnées",
"exportToFile": "Exporter vers le fichier",
"changePwd": "Changer le mot de passe",
"createView": "Créer vue",
"createView": "Créer une vue",
"shareView": "Partager la vue",
"findRowByCodeScan": "Find row by scan",
"fillByCodeScan": "Remplir avec un scanner",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Pile d'effondrement",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Supprimer la pile",
"stackedBy": "Empilés par",
"chooseGroupingField": "Choisir un champ de regroupement",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Le champ de type Lookup n'est pas supporté pour les relations de non appartenance",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "Vous n'avez aucun lien défini pour ajouter un champ Lookup",
"recordCouldNotBeFound": "L'enregistrement n'a pas pu être trouvé",
"invalidPhoneNumber": "Numéro de téléphone invalide",
"pageSizeChanged": "Taille de la page modifiée",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "Aucun enregistrement lié",
"noLinkedRecords": "Aucun enregistrement lié",
"recordsLinked": "enregistrements liés",
"acceptOnlyValid": "N'accepte que les {type} valides",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Créer des jetons d'API personnels à utiliser dans une automatisation ou des applications externes.",
"selectFieldToSort": "Sélectionner le champ de tri",
"selectFieldToGroup": "Sélectionner le champ de regroupement",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "Les types de fichiers acceptés sont .xls, .xlsx, .xlsm, .ods, .ots.",
"parameterKeyCannotBeEmpty": "La clé de paramètre ne peut pas être vide",
"duplicateParameterKeysAreNotAllowed": "Les doublons de clés de paramètres ne sont pas autorisés",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value} ne peut pas être vide.",
"projectNotAccessible": "Projet non accessible",
"copyToClipboardError": "Échec de la copie dans le presse-papiers",
"pasteFromClipboardError": "Échec du collage à partir du presse-papiers",

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

@ -210,7 +210,8 @@
"set": "הגדר",
"format": "פורמט",
"colour": "צבע",
"use": "השתמש"
"use": "השתמש",
"stack": "Stack"
},
"objects": {
"owner": "בעלים",
@ -336,8 +337,8 @@
"parameter": "פרמטר",
"headers": "כותרות",
"parameterName": "שם פרמטר",
"currencyLocale": "אזור",
"currencyCode": "קוד",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "חיפוש חברים",
"noMembersFound": "לא נמצאו חברים",
"dateJoined": "תאריך הצטרפות",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "בחר שדות מהפאנל הימני להוסיף כאן",
"noOptionsFound": "לא נמצאו אפשרויות",
"surveyFormSubmitConfirmMsg": "האם אתה בטוח שברצונך לשלוח את הטופס הזה?",
"noResultsMatchedYourSearch": "לא נמצאו תוצאות התואמות את החיפוש שלך."
"noResultsMatchedYourSearch": "לא נמצאו תוצאות התואמות את החיפוש שלך.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "שם הכותרת",
"icon": "סמל",
"max": "מקסימום",
"enableRichText": "אפשר טקסט עשיר",
"enableRichText": "Enable Rich Text",
"idColon": "מזהה:",
"copiedRecordURL": "כתובת URL של הרשומה הועתקה",
"copyRecordURL": "העתק כתובת URL של הרשומה",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "כווץ מחסנית",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "מחק מחסנית",
"stackedBy": "מחוסנית על ידי",
"chooseGroupingField": "בחר שדה לקיבוץ",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "שאילתה מקורטת מופעלת",
"lookupNonBtWarning": "שדה החיפוש לא נתמך לאינטרקציה מחוץ ליחס 'נמצא ב'",
"invalidTime": "זמן לא חוקי",
"linkColumnClearNotSupportedYet": "אין לך שום קישורים נתמכים עבור {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "הרשומה לא נמצאה",
"invalidPhoneNumber": "מספר טלפון לא חוקי",
"pageSizeChanged": "גודל העמוד השתנה",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "לא נקשרו רשומות",
"noLinkedRecords": "אין רשומות מקושרות",
"recordsLinked": "רשומות מקושרות",
"acceptOnlyValid": "קבל רק {type} חוקי",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "צור אסימון API אישי כדי להשתמש באוטומציה או ביישומי חיצוניים.",
"selectFieldToSort": "בחר שדה למיון",
"selectFieldToGroup": "בחר שדה לקיבוץ",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Sakrij hrpu (stack)",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Izbriši hrpu (stack)",
"stackedBy": "Spojeno prema",
"chooseGroupingField": "Odaberite polje za grupiranje",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Tumpukan Runtuh",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Hapus Tumpukan",
"stackedBy": "Ditumpuk oleh",
"chooseGroupingField": "Pilih Bidang Pengelompokan",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parametro",
"headers": "Intestazioni",
"parameterName": "Nome Parametro",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Valuta Locale",
"currencyCode": "Codice valuta",
"searchMembers": "Cerca membri",
"noMembersFound": "Nessun membro trovato",
"dateJoined": "Data iscrizione",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Nome dell'intestazione",
"icon": "Icona",
"max": "Massimo",
"enableRichText": "Enable rich text",
"enableRichText": "Abilita Rich Text",
"idColon": "Id:",
"copiedRecordURL": "URL del record copiato",
"copyRecordURL": "Copia URL Record",
@ -598,7 +600,7 @@
"untitledToken": "Token senza titolo",
"tableName": "Nome della tabella",
"dashboardName": "Nome dashboard",
"createView": "Crea vista",
"createView": "Crea una vista",
"creatingView": "Creazione vista",
"duplicateView": "Duplica vista",
"duplicateGridView": "Duplica Visualizzazione Griglia",
@ -937,7 +939,7 @@
"clearMetadata": "Cancella metadati",
"exportToFile": "Esporta su file",
"changePwd": "Cambia password",
"createView": "Crea vista",
"createView": "Crea una vista",
"shareView": "Condividi vista",
"findRowByCodeScan": "Find row by scan",
"fillByCodeScan": "Riempi per scansione",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collasso della pila",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Cancellare la pila",
"stackedBy": "Impilato da",
"chooseGroupingField": "Scegliere un campo di raggruppamento",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "La query ottimizzata è abilitata",
"lookupNonBtWarning": "Il campo Lookup non è supportato per la relazione non-appartenente",
"invalidTime": "Ora non valida",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "Non ci sono collegamenti supportati per Lookup",
"recordCouldNotBeFound": "Riga non trovata",
"invalidPhoneNumber": "Numero di telefono non valido",
"pageSizeChanged": "Dimensione pagina modificata",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "Nessun record collegato",
"noLinkedRecords": "No linked records",
"recordsLinked": "record collegati",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accetta solo",
"apiTokenCreate": "Creare token API personali da utilizzare nell'automazione o in applicazioni esterne.",
"selectFieldToSort": "Selezionare il campo da ordinare",
"selectFieldToGroup": "Selezionare il campo da raggruppare",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "I tipi di file accettati sono .xls, .xlsx, .xlsm, .ods, .ots",
"parameterKeyCannotBeEmpty": "La chiave del parametro non può essere vuota",
"duplicateParameterKeysAreNotAllowed": "Le chiavi dei parametri duplicate non sono consentite",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value} non può essere vuoto.",
"projectNotAccessible": "Progetto non accessibile",
"copyToClipboardError": "Non è riuscito a copiare negli appunti",
"pasteFromClipboardError": "Impossibile incollare dagli appunti",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "スタックを折りたたむ",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "スタックを削除",
"stackedBy": "スタック",
"chooseGroupingField": "グループ化するフィールドを選択",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "매개 변수",
"headers": "제목",
"parameterName": "매개변수 이름",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "통화 로케일",
"currencyCode": "통화 코드",
"searchMembers": "회원 검색",
"noMembersFound": "회원을 찾을 수 없습니다.",
"dateJoined": "가입일",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "헤더 이름",
"icon": "아이콘",
"max": "최대",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "ID:",
"copiedRecordURL": "레코드 URL을 복사했습니다.",
"copyRecordURL": "레코드 URL 복사",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "스택 축소",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "스택 삭제",
"stackedBy": "스택 기준",
"chooseGroupingField": "그룹화 필드 선택",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "최적화된 쿼리가 활성화되었습니다",
"lookupNonBtWarning": "Lookup 필드는 Belongs To 관계에서만 사용할 수 있습니다.",
"invalidTime": "유효하지 않은 시간형식입니다.",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "링크 열의 내용을 지우는 것은 아직 지원되지 않습니다.",
"recordCouldNotBeFound": "레코드를 찾을 수 없습니다.",
"invalidPhoneNumber": "유효하지 않은 전화번호입니다.",
"pageSizeChanged": "페이지 크기가 변경되었습니다.",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "레코드가 연결되지 않았습니다.",
"noLinkedRecords": "No linked records",
"recordsLinked": "레코드가 연결되었습니다.",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "유효한 값만 허용",
"apiTokenCreate": "새 API 토큰 생성",
"selectFieldToSort": "정렬할 필드 선택",
"selectFieldToGroup": "Select Field to Group",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "허용되는 파일 형식은 .xls, .xlsx, .xlsm, .ods, .ots입니다",
"parameterKeyCannotBeEmpty": "매개 변수 키는 비워 둘 수 없습니다.",
"duplicateParameterKeysAreNotAllowed": "중복 매개 변수 키는 허용되지 않습니다.",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value}은(는) 비워 둘 수 없습니다.",
"projectNotAccessible": "프로젝트에 액세스할 수 없습니다.",
"copyToClipboardError": "클립 보드에 복사할 수 없습니다.",
"pasteFromClipboardError": "Failed to paste from clipboard",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Virsraksta nosaukums",
"icon": "Ikons",
"max": "Maksimums",
"enableRichText": "Enable rich text",
"enableRichText": "Ieslēgt bagātīgu tekstu",
"idColon": "Id:",
"copiedRecordURL": "Kopēts ieraksta URL",
"copyRecordURL": "Kopēt ieraksta URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Salocīt kaudze",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Izdzēst kaudze",
"stackedBy": "Sakrautas ar",
"chooseGroupingField": "Izvēlieties grupēšanas lauku",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Stapel samenvouwen",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Stapel verwijderen",
"stackedBy": "Gestapeld door",
"chooseGroupingField": "Kies een groepeerveld",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -98,7 +98,7 @@
"bulkUpdate": "Masowa aktualizacja",
"deleting": "Usuwanie",
"update": "Aktualizuj",
"updating": "Updating",
"updating": "Aktualizacja",
"rename": "Zmień nazwę",
"reload": "Przeładuj",
"reset": "Zresetuj",
@ -206,11 +206,12 @@
"apply": "Zastosuj",
"text": "Tekst",
"appearance": "Wygląd",
"now": "Now",
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"now": "Teraz",
"set": "Ustaw",
"format": "Formatowanie",
"colour": "Kolor",
"use": "Użyj",
"stack": "Stos"
},
"objects": {
"owner": "Właściciel",
@ -336,8 +337,8 @@
"parameter": "Parametr",
"headers": "Nagłówki",
"parameterName": "Nazwa parametru",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Lokalizacja waluty",
"currencyCode": "Kod waluty",
"searchMembers": "Szukaj członków",
"noMembersFound": "Nie znaleziono członków",
"dateJoined": "Data dołączenia",
@ -451,13 +452,14 @@
"selectFieldsFromRightPannelToAddHere": "Wybierz pole z panelu po prawej stronie aby tutaj dodać",
"noOptionsFound": "Nie znaleziono opcji",
"surveyFormSubmitConfirmMsg": "Czy na pewno chcesz przesłać ten formularz?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Wygląda na to, że ten stos nie ma żadnych rekordów"
},
"labels": {
"selectView": "Select a View",
"connectionDetails": "Connection Details",
"metaSync": "Meta Sync",
"mention": "Mention",
"selectView": "Wybierz widok",
"connectionDetails": "Szczegóły połączenia",
"metaSync": "Synchronizacja Meta",
"mention": "Wzmianka",
"today": "Dziś",
"workspace": "Obszar roboczy",
"txt": "Wartość rekordu TXT",
@ -493,7 +495,7 @@
"userOptions": "Opcje użytkownika",
"deleteThisOrganization": "Usuń tę organizację",
"dangerZone": "Strefa zagrożenia",
"childView": "Child View",
"childView": "Pole podrzędne",
"selectYear": "Wybierz rok",
"save": "Zapisz",
"cancel": "Anuluj",
@ -543,7 +545,7 @@
"headerName": "Nazwa nagłówka",
"icon": "Ikona",
"max": "Maks",
"enableRichText": "Enable rich text",
"enableRichText": "Włącz Edytor Tekstu",
"idColon": "Id:",
"copiedRecordURL": "Skopiowano URL rekordu",
"copyRecordURL": "Kopiuj URL rekordu",
@ -774,16 +776,16 @@
"limitOptions": "Ogranicz opcje",
"limitOptionsSubtext": "Ogranicz opcje widoczne dla użytkowników, wybierając dostępne opcje",
"clearSelection": "Wyczyść wybór",
"displayAsProgress": "Display as progress",
"relationType": "Relation type",
"showThousandsSeparator": "Show thousands separator",
"signUpForFree": "Sign up for free",
"displayAsProgress": "Wyświetl postęp",
"relationType": "Typ relacji",
"showThousandsSeparator": "Pokaż separator tysięcy",
"signUpForFree": "Załóż darmowe konto",
"coverImageField": "Cover image field",
"fitImage": "Fit image",
"coverImageArea": "Cover image"
"fitImage": "Dopasuj zdjęcie",
"coverImageArea": "Obraz okładki"
},
"activity": {
"hideWeekends": "Hide weekends",
"hideWeekends": "Ukryj weekendy",
"renameBase": "Zmień nazwę tabeli",
"renameWorkspace": "Zmień nazwę przestrzeni roboczej",
"deactivate": "Deaktywuj",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Zwiń stos",
"collapseAll": "Zwiń wszystkie",
"expandAll": "Rozwiń wszystko",
"renameStack": "Zmień nazwę stosu",
"deleteStack": "Usuń stos",
"stackedBy": "Ułożone według",
"chooseGroupingField": "Wybierz pole grupowania",
@ -1119,7 +1124,7 @@
"searchOptions": "Opcje wyszukiwania"
},
"msg": {
"formulaNotSupported": "This function is unavailable for your database",
"formulaNotSupported": "Ta funkcja jest niedostępna dla Twojej bazy danych",
"controlOrgAppearance": "Kontroluj nazwę i wygląd organizacji.",
"addCompanyDomains": "Dodaj domeny firmy, aby ograniczyć dostęp od niechcianych użytkowników.",
"restrictUsersFromSharing": "Ogranicz użytkowników z możliwości publicznego udostępniania baz danych.",
@ -1133,13 +1138,13 @@
"thisSharedViewIsProtected": "Ten współdzielony widok jest chroniony",
"successfullySubmittedFormData": "Pomyślnie przesłano dane formularza",
"formViewNotSupportedOnMobile": "Widok formularza nie jest obsługiwany na urządzeniach mobilnych",
"calendarViewNotSupportedOnMobile": "Calendar view is not supported on mobile",
"calendarViewNotSupportedOnMobile": "Widok formularza nie jest obsługiwany na urządzeniach mobilnych",
"newFormWillBeLoaded": "Nowy formularz zostanie załadowany po {seconds} sekundach",
"optimizedQueryDisabled": "Zoptymalizowane zapytanie jest wyłączone",
"optimizedQueryEnabled": "Zoptymalizowane zapytanie jest włączone",
"lookupNonBtWarning": "Pole wyszukiwania nie jest obsługiwane dla relacji innych niż 'Należy do'",
"invalidTime": "Nieprawidłowy Czas",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "Nie masz jeszcze żadnych obsługiwanych linków do pola Lookup",
"recordCouldNotBeFound": "Nie można znaleźć rekordu",
"invalidPhoneNumber": "Nieprawidłowy numer telefonu",
"pageSizeChanged": "Zmieniono rozmiar strony",
@ -1212,12 +1217,12 @@
"noRecordsLinked": "Żadne rekordy nie są powiązane",
"noLinkedRecords": "Brak powiązanych rekordów",
"recordsLinked": "rekordy powiązane",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Akceptuje tylko",
"apiTokenCreate": "Utwórz osobiste tokeny API do użytku w automatyzacji lub zewnętrznych aplikacjach.",
"selectFieldToSort": "Wybierz pole do sortowania",
"selectFieldToGroup": "Wybierz pole do grupowania",
"thereAreNoRecordsInTable": "Nie ma rekordów w tabeli",
"noRecordsAvailForLinking": "No records are currently available for linking",
"noRecordsAvailForLinking": "Obecnie nie są dostępne żadne rekordy do powiązania",
"createWebhookMsg1": "Rozpocznij pracę z webhookami!",
"createWebhookMsg2": "Zasil automatyzację. Otrzymuj powiadomienia jak tylko pojawią się zmiany w Twoich danych",
"areYouSureUWantTo": "Czy na pewno chcesz usunąć następujące",
@ -1431,7 +1436,7 @@
"preventHideAllOptions": "Nie możesz ukryć wszystkich opcji, jeśli pole jest wymagane"
},
"error": {
"errorLoadingRecord": "Error loading record data",
"errorLoadingRecord": "Błąd ładowania danych",
"fetchingCalendarData": "Błąd podczas pobierania danych kalendarza",
"fetchingActiveDates": "Błąd podczas pobierania aktywnych dat",
"scopesRequired": "Wymagane zakresy",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "Akceptowane typy plików to: .xls, .xlsx, .xlsm, .ods, .ots",
"parameterKeyCannotBeEmpty": "Klucz parametru nie może być pusty",
"duplicateParameterKeysAreNotAllowed": "Zduplikowane klucze parametrów są niedozwolone",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value} nie może być puste.",
"projectNotAccessible": "Projekt niedostępny",
"copyToClipboardError": "Nie udało się skopiować do schowka",
"pasteFromClipboardError": "Nie udało się wkleić ze schowka",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parâmetro",
"headers": "Cabeçalhos",
"parameterName": "Nome do parâmetro",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Moeda local",
"currencyCode": "Código de moeda",
"searchMembers": "Procurar membros",
"noMembersFound": "Nenhum membro encontrado",
"dateJoined": "Data de adesão",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Seleccione campos do painel direito para adicionar aqui",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Nome do cabeçalho",
"icon": "Ícone",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Ativar texto rico",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Pilha de Colapso",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Apagar pilha",
"stackedBy": "Empilhado por",
"chooseGroupingField": "Escolha um Campo de Agrupamento",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Recolher pilha",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Apagar pilha",
"stackedBy": "Empilhado por",
"chooseGroupingField": "Escolha um Campo de Agrupamento",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Параметр",
"headers": "Заголовки",
"parameterName": "Имя параметра",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Валютная локаль",
"currencyCode": "Код валюты",
"searchMembers": "Поиск участников",
"noMembersFound": "Участников не найдено",
"dateJoined": "Дата вступления",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Название заголовка",
"icon": "Иконка",
"max": "Макс",
"enableRichText": "Enable rich text",
"enableRichText": "Включить насыщенный текст",
"idColon": "Id:",
"copiedRecordURL": "URL скопированной записи",
"copyRecordURL": "Копировать URL записи",
@ -598,7 +600,7 @@
"untitledToken": "Untitled token",
"tableName": "Название таблицы",
"dashboardName": "Dashboard name",
"createView": "Create View",
"createView": "Create a View",
"creatingView": "Creating View",
"duplicateView": "Duplicate View",
"duplicateGridView": "Duplicate Grid View",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Свернуть стек",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Удалить стек",
"stackedBy": "Группировка по",
"chooseGroupingField": "Выберите поле группировки",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "Допустимые типы файлов: .xls, .xlsx, .xlsm, .ods, .ots",
"parameterKeyCannotBeEmpty": "Ключ параметра не может быть пустым",
"duplicateParameterKeysAreNotAllowed": "Дублирование ключей параметров не допускается",
"fieldRequired": "This field cannot be empty.",
"fieldRequired": "{value} не может быть пустым.",
"projectNotAccessible": "Проект недоступен",
"copyToClipboardError": "Не удалось скопировать в буфер обмена",
"pasteFromClipboardError": "Failed to paste from clipboard",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Zrútiť zásobník",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Odstrániť zásobník",
"stackedBy": "Naskladané podľa",
"chooseGroupingField": "Výber zoskupovacieho poľa",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Zbijanje kupa",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Brisanje sklada",
"stackedBy": "Zloženo po",
"chooseGroupingField": "Izberite polje za združevanje",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Ikon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Kollaps av stapeln",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Ta bort stacken",
"stackedBy": "Staplade av",
"chooseGroupingField": "Välj ett grupperingsfält",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Ogiltigt telefonnummer",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Delete Stack",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parametre",
"headers": "Üstbilgi",
"parameterName": "Parametre Adı",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Para Birimi Dili",
"currencyCode": "Para Birimi",
"searchMembers": "Üyeleri Bul",
"noMembersFound": "Üye bulunamadı",
"dateJoined": "Katılım Tarihi",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Buraya eklemek için sağ panelden alanları seçin",
"noOptionsFound": "Seçenek bulunamadı",
"surveyFormSubmitConfirmMsg": "Bu formu göndermek istediğinizden emin misiniz?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Başlık Adı",
"icon": "Simge",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Zengin Metni Etkinleştir",
"idColon": "Id:",
"copiedRecordURL": "Kayıt URL'si Kopyalandı",
"copyRecordURL": "Kayıt URL'sini Kopyala",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Yığını Daralt",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Yığını Sil",
"stackedBy": "Tarafından Yığılmış",
"chooseGroupingField": "Bir Gruplama Alanı Seçin",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Згорнути стек",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Видалити стек",
"stackedBy": "Групувати по",
"chooseGroupingField": "Виберіть поле групування",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "Collapse Stack",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "Xóa ngăn xếp",
"stackedBy": "Stacked By",
"chooseGroupingField": "Choose a Grouping Field",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "所有者",
@ -336,8 +337,8 @@
"parameter": "参数",
"headers": "请求头",
"parameterName": "参数名称",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "货币地区",
"currencyCode": "货币代码",
"searchMembers": "搜索成员",
"noMembersFound": "未找到成员",
"dateJoined": "加入日期",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "从右侧面板选择要添加的字段",
"noOptionsFound": "未找到选项",
"surveyFormSubmitConfirmMsg": "您确定要提交吗?",
"noResultsMatchedYourSearch": "您的搜索没有任何匹配结果"
"noResultsMatchedYourSearch": "您的搜索没有任何匹配结果",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "标题名称",
"icon": "图标",
"max": "最大",
"enableRichText": "Enable rich text",
"enableRichText": "启用富文本",
"idColon": "Id:",
"copiedRecordURL": "复制的记录 URL",
"copyRecordURL": "复制该记录卡片的 URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "折叠此类别",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "删除此类别",
"stackedBy": "分类依据为",
"chooseGroupingField": "选择分组字段",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "已启用优化查询",
"lookupNonBtWarning": "非 \"所属关系 \"不支持查找字段",
"invalidTime": "无效时间",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "您没有任何支持查找的链接",
"recordCouldNotBeFound": "找不到记录",
"invalidPhoneNumber": "无效电话号码",
"pageSizeChanged": "页面大小已更改",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "没有链接记录",
"noLinkedRecords": "暂无引用数据",
"recordsLinked": "链接的记录",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "仅接受",
"apiTokenCreate": "创建个人 API tokens,以便在自动化或外部应用程序中使用。",
"selectFieldToSort": "选择要排序的字段",
"selectFieldToGroup": "选择要分组的字段",
@ -1519,7 +1524,7 @@
"theAcceptedFileTypesAreXlsXlsxXlsmOdsOts": "可接受的文件类型是 .xls, .xlsx, .xlsm, .ods, .ots",
"parameterKeyCannotBeEmpty": "参数键不能为空",
"duplicateParameterKeysAreNotAllowed": "不允许重复的参数键",
"fieldRequired": "此字段不能为空。",
"fieldRequired": "{value} 不能为空。",
"projectNotAccessible": "无权访问此项目",
"copyToClipboardError": "未能复制到剪贴板",
"pasteFromClipboardError": "从剪贴板粘贴失败",

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

@ -210,7 +210,8 @@
"set": "Set",
"format": "Format",
"colour": "Colour",
"use": "Use"
"use": "Use",
"stack": "Stack"
},
"objects": {
"owner": "Owner",
@ -336,8 +337,8 @@
"parameter": "Parameter",
"headers": "Headers",
"parameterName": "Parameter Name",
"currencyLocale": "Locale",
"currencyCode": "Code",
"currencyLocale": "Currency Locale",
"currencyCode": "Currency Code",
"searchMembers": "Search Members",
"noMembersFound": "No members found",
"dateJoined": "Date Joined",
@ -451,7 +452,8 @@
"selectFieldsFromRightPannelToAddHere": "Select fields from right panel to add here",
"noOptionsFound": "No options found",
"surveyFormSubmitConfirmMsg": "Are you sure you want to submit this form?",
"noResultsMatchedYourSearch": "Your search did not yield any matching results."
"noResultsMatchedYourSearch": "Your search did not yield any matching results.",
"looksLikeThisStackIsEmpty": "Looks like this stack does not have any records"
},
"labels": {
"selectView": "Select a View",
@ -543,7 +545,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
"enableRichText": "Enable rich text",
"enableRichText": "Enable Rich Text",
"idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
@ -1006,6 +1008,9 @@
},
"kanban": {
"collapseStack": "摺疊此類別",
"collapseAll": "Collapse all",
"expandAll": "Expand all",
"renameStack": "Rename stack",
"deleteStack": "刪除此類別",
"stackedBy": "分類依據",
"chooseGroupingField": "選擇一個分組欄位",
@ -1139,7 +1144,7 @@
"optimizedQueryEnabled": "Optimized query is enabled",
"lookupNonBtWarning": "Lookup field is not supported for non-Belongs to relation",
"invalidTime": "Invalid Time",
"linkColumnClearNotSupportedYet": "You don't have any supported links for {type}",
"linkColumnClearNotSupportedYet": "You don't have any supported links for Lookup",
"recordCouldNotBeFound": "Record could not be found",
"invalidPhoneNumber": "Invalid phone number",
"pageSizeChanged": "Page size changed",
@ -1212,7 +1217,7 @@
"noRecordsLinked": "No records linked",
"noLinkedRecords": "No linked records",
"recordsLinked": "records linked",
"acceptOnlyValid": "Accept only valid {type}",
"acceptOnlyValid": "Accepts only",
"apiTokenCreate": "Create personal API tokens to use in automation or external apps.",
"selectFieldToSort": "Select Field to Sort",
"selectFieldToGroup": "Select Field to Group",

2
packages/nc-gui/package.json

@ -76,7 +76,7 @@
"marked": "^4.3.0",
"monaco-editor": "^0.45.0",
"monaco-sql-languages": "^0.11.0",
"nocodb-sdk": "0.250.1",
"nocodb-sdk": "workspace:^",
"papaparse": "^5.4.1",
"parse-github-url": "^1.0.2",
"pinia": "^2.1.7",

3
packages/noco-docs/docs/080.records/030.expand-record.md

@ -75,8 +75,7 @@ In comments list of an expanded form,
![expand record comment](/img/v2/records/expand-record-comments-edit-3.png)
:::note
You can only edit your own comments. You cannot delete a comment, but can edit it to remove the content.
Changes to comments are also recorded in the audit log.
You can only edit your own comments. Changes to comments are also recorded in the audit log.
:::
## Record Actions

2
packages/nocodb/package.json

@ -137,7 +137,7 @@
"ncp": "^2.0.0",
"nestjs-kafka": "^1.0.6",
"nestjs-throttler-storage-redis": "^0.4.4",
"nocodb-sdk": "0.250.1",
"nocodb-sdk": "workspace:^",
"nodemailer": "^6.9.13",
"object-hash": "^3.0.0",
"object-sizeof": "^2.6.4",

21
packages/nocodb/src/db/BaseModelSqlv2.ts

@ -3850,7 +3850,6 @@ class BaseModelSqlv2 {
let preInsertOps: (() => Promise<string>)[] = [];
let aiPkCol: Column;
let agPkCol: Column;
if (!raw) {
const columns = await this.model.getColumns(this.context);
@ -3873,7 +3872,11 @@ class BaseModelSqlv2 {
);
}
if (col.system && !allowSystemColumn) {
if (
col.system &&
!allowSystemColumn &&
col.uidt !== UITypes.ForeignKey
) {
NcError.badRequest(
`Column "${col.title}" is system column and cannot be updated`,
);
@ -4950,7 +4953,7 @@ class BaseModelSqlv2 {
);
}
if (column.system) {
if (column.system && column.uidt !== UITypes.ForeignKey) {
NcError.badRequest(
`Column "${column.title}" is system column and cannot be updated`,
);
@ -7184,7 +7187,7 @@ class BaseModelSqlv2 {
);
}
async getCustomConditionsAndApply(_params: {
async getCustomConditionsAndApply(params: {
view?: View;
column: Column<any>;
qb?;
@ -7193,7 +7196,8 @@ class BaseModelSqlv2 {
rowId;
columns?: Column[];
}): Promise<any> {
return;
const { filters, qb } = params;
await conditionV2(this, filters, qb);
}
}
@ -7500,10 +7504,11 @@ export function _wherePk(
}
export function getCompositePkValue(primaryKeys: Column[], row) {
if (typeof row !== 'object') return row;
if (row === null)
if (row === null || row === undefined) {
NcError.requiredFieldMissing(primaryKeys.map((c) => c.title).join(','));
}
if (typeof row !== 'object') return row;
return primaryKeys.map((c) => row[c.title] ?? row[c.column_name]).join('___');
}

4
packages/nocodb/src/helpers/catchError.ts

@ -670,7 +670,9 @@ export class NcError {
id: string | string[] | Record<string, string> | Record<string, string>[],
args?: NcErrorArgs,
) {
if (typeof id === 'string') {
if (!id) {
id = 'unknown';
} else if (typeof id === 'string') {
id = [id];
} else if (Array.isArray(id)) {
if (id.every((i) => typeof i === 'string')) {

29
packages/nocodb/src/meta/meta.service.ts

@ -326,35 +326,6 @@ export class MetaService {
return query.del();
}
/***
* Delete meta data with condition (USE WITH CAUTION)
* @param target - Table name
* @param idOrCondition - If string, will delete the record with the given id. If object, will delete the record with the given condition.
* @param xcCondition - Additional nested or complex condition to be added to the query.
*/
public async metaDeleteAll(
target: string,
idOrCondition: string | { [p: string]: any },
xcCondition?: Condition,
): Promise<void> {
const query = this.knexConnection(target);
if (typeof idOrCondition !== 'object') {
query.where('id', idOrCondition);
} else if (idOrCondition) {
query.where(idOrCondition);
}
if (xcCondition) {
query.condition(xcCondition, {});
}
// Check if a condition is present in the query builder and throw an error if not.
this.checkConditionPresent(query, 'delete');
return query.del();
}
/***
* Get meta data
* @param workspace_id - Workspace id

15
packages/nocodb/src/models/BaseUser.ts

@ -8,12 +8,12 @@ import {
CacheGetType,
CacheScope,
MetaTable,
RootScopes,
} from '~/utils/globals';
import Noco from '~/Noco';
import NocoCache from '~/cache/NocoCache';
import { extractProps } from '~/helpers/extractProps';
import { parseMetaProp } from '~/utils/modelUtils';
import { NcError } from '~/helpers/catchError';
export default class BaseUser {
fk_workspace_id?: string;
@ -359,14 +359,11 @@ export default class BaseUser {
userId: string,
ncMeta = Noco.ncMeta,
): Promise<BaseUser[]> {
return await ncMeta.metaList2(
RootScopes.BASE,
RootScopes.BASE,
MetaTable.PROJECT_USERS,
{
condition: { fk_user_id: userId },
},
);
if (!userId) NcError.badRequest('User Id is required');
return await ncMeta.knex(MetaTable.PROJECT_USERS).where({
fk_user_id: userId,
});
}
static async getProjectsList(

2
packages/nocodb/src/models/KanbanView.ts

@ -109,7 +109,7 @@ export default class KanbanView implements KanbanType {
insertObj.meta = {
fk_cover_image_object_fit:
parseMetaProp(insertObj)?.fk_cover_image_object_fit || 'cover',
parseMetaProp(insertObj)?.fk_cover_image_object_fit || 'fit',
};
insertObj.meta = stringifyMetaProp(insertObj);

2
packages/nocodb/src/models/Model.ts

@ -236,6 +236,7 @@ export default class Model implements TableType {
]);
let { list: modelList } = cachedList;
const { isNoneList } = cachedList;
if (!isNoneList && !modelList.length) {
modelList = await ncMeta.metaList2(
context.workspace_id,
@ -245,6 +246,7 @@ export default class Model implements TableType {
orderBy: {
order: 'asc',
},
...(source_id ? { condition: { source_id } } : {}),
},
);

17
packages/nocodb/src/models/SyncSource.ts

@ -150,17 +150,14 @@ export default class SyncSource {
);
}
static async deleteByUserId(
context: NcContext,
userId: string,
ncMeta = Noco.ncMeta,
) {
throw new Error('Method not implemented.');
static async deleteByUserId(userId: string, ncMeta = Noco.ncMeta) {
if (!userId) NcError.badRequest('User Id is required');
return await ncMeta.metaDeleteAll(MetaTable.SYNC_SOURCE, {
fk_user_id: userId,
});
return await ncMeta
.knex(MetaTable.SYNC_SOURCE)
.where({
fk_user_id: userId,
})
.del();
}
}

3
packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts

@ -279,6 +279,9 @@ export class ExportService {
if (view.type === ViewTypes.KANBAN) {
const meta = parseMetaProp(view.view) as Record<string, any>;
for (const [k, v] of Object.entries(meta)) {
// keep non-array meta as it is
if (!Array.isArray(v)) continue;
const colId = idMap.get(k as string);
for (const op of v) {
op.fk_column_id = idMap.get(op.fk_column_id);

6
packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts

@ -1563,6 +1563,12 @@ export class ImportService {
case 'meta': {
const meta = {};
for (const [mk, mv] of Object.entries(v as any)) {
// copy non-array meta as it is
if (!Array.isArray(mv)) {
meta[mk] = mv;
continue;
}
const tempVal = [];
for (const vl of mv as any) {
if (vl.fk_column_id) {

2
packages/nocodb/src/services/columns.service.ts

@ -542,7 +542,7 @@ export class ColumnsService {
},
);
if (data.length) {
if (data.length && column.uidt !== colBody.uidt) {
const existingOptions = colBody.colOptions.options.map(
(el) => el.title,
);

6
packages/nocodb/src/services/org-users.service.ts

@ -16,7 +16,7 @@ import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
import { extractProps } from '~/helpers/extractProps';
import { randomTokenString } from '~/helpers/stringHelpers';
import { BaseUser, Store, User } from '~/models';
import { BaseUser, Store, SyncSource, User } from '~/models';
import Noco from '~/Noco';
import { MetaTable, RootScopes } from '~/utils/globals';
@ -65,7 +65,6 @@ export class OrgUsersService {
}
// delete base user entry and assign to super admin
// TODO-TENANT: scope this to org
const baseUsers = await BaseUser.getProjectsIdList(param.userId, ncMeta);
// todo: clear cache
@ -84,8 +83,7 @@ export class OrgUsersService {
}
// delete sync source entry
// TODO-TENANT: ENABLE THIS & CONFIRM SCOPE
// await SyncSource.deleteByUserId(param.userId, ncMeta);
await SyncSource.deleteByUserId(param.userId, ncMeta);
// delete user
await User.delete(param.userId, ncMeta);

4
pnpm-lock.yaml

@ -158,7 +158,7 @@ importers:
specifier: ^0.11.0
version: 0.11.0
nocodb-sdk:
specifier: 0.250.1
specifier: workspace:^
version: link:../nocodb-sdk
papaparse:
specifier: ^5.4.1
@ -727,7 +727,7 @@ importers:
specifier: ^0.4.4
version: 0.4.4(@nestjs/common@10.3.8)(@nestjs/core@10.3.8)(@nestjs/throttler@5.1.2)(ioredis@5.4.1)(reflect-metadata@0.2.1)
nocodb-sdk:
specifier: 0.250.1
specifier: workspace:^
version: link:../nocodb-sdk
nodemailer:
specifier: ^6.9.13

3
tests/playwright/pages/Dashboard/Details/FieldsPage.ts

@ -272,6 +272,9 @@ export class FieldsPage extends BasePage {
}
async saveChanges() {
// allow the changes triggered earlier (toggle visibility, etc) to settle
await this.rootPage.waitForTimeout(1000);
await this.waitForResponse({
uiAction: async () => await this.saveChangesButton.click(),
requestUrlPathToMatch: 'api/v1/db/meta/tables/',

Loading…
Cancel
Save