Browse Source

Merge branch 'develop' into enhancement/filters

pull/5106/head
Wing-Kam Wong 2 years ago
parent
commit
0d3d1ce9ad
  1. 27435
      package-lock.json
  2. 2
      package.json
  3. 7
      packages/nc-gui/components/cell/ClampedText.vue
  4. 10
      packages/nc-gui/components/smartsheet/Grid.vue
  5. 4
      packages/nc-gui/components/smartsheet/VirtualCell.vue
  6. 4
      packages/nc-gui/components/virtual-cell/components/ListItems.vue
  7. 1
      packages/nc-gui/context/index.ts
  8. 28
      packages/nc-gui/lang/ru.json
  9. 750
      packages/nc-gui/lang/uk.json
  10. 12
      packages/nc-plugin/package-lock.json
  11. 36
      packages/noco-docs/package-lock.json
  12. 12
      packages/nocodb/package-lock.json
  13. 16
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/genRollupSelectv2.ts

27435
package-lock.json generated

File diff suppressed because it is too large Load Diff

2
package.json

@ -17,7 +17,7 @@
"license": "AGPL-3.0-or-later",
"devDependencies": {
"fs": "0.0.1-security",
"lerna": "^3.20.1",
"lerna": "^6.4.1",
"husky": "^8.0.0",
"xlsx": "^0.17.4"
},

7
packages/nc-gui/components/cell/ClampedText.vue

@ -19,6 +19,11 @@ onMounted(() => {
<template>
<div ref="wrapper">
<text-clamp :key="key" class="w-full h-full break-all" :text="`${props.value || ' '}`" :max-lines="props.lines" />
<text-clamp
:key="key + props.value"
class="w-full h-full break-all"
:text="`${props.value || ' '}`"
:max-lines="props.lines"
/>
</div>
</template>

10
packages/nc-gui/components/smartsheet/Grid.vue

@ -283,13 +283,10 @@ const {
activeCell.row = data.value.length - 1
activeCell.col = 0
resetSelectedRange()
makeEditable(data.value[activeCell.row], fields.value[activeCell.col])
nextTick(() => {
;(
document.querySelector('td.cell.active')?.querySelector('input,textarea') as
| HTMLInputElement
| HTMLTextAreaElement
)?.focus()
;(document.querySelector('td.cell.active') as HTMLInputElement | HTMLTextAreaElement)?.scrollIntoView({
behavior: 'smooth',
})
})
}
break
@ -867,6 +864,7 @@ const rowHeight = computed(() => {
:row="row"
:read-only="readOnly"
@navigate="onNavigate"
@save="updateOrSaveRow(row, '', state)"
/>
<LazySmartsheetCell

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

@ -7,6 +7,7 @@ import {
IsFormInj,
IsGridInj,
RowInj,
SaveRowInj,
inject,
isBarcode,
isBt,
@ -30,7 +31,7 @@ const props = defineProps<{
active?: boolean
}>()
const emit = defineEmits(['update:modelValue', 'navigate'])
const emit = defineEmits(['update:modelValue', 'navigate', 'save'])
const column = toRef(props, 'column')
const active = toRef(props, 'active', false)
@ -40,6 +41,7 @@ provide(ColumnInj, column)
provide(ActiveCellInj, active)
provide(RowInj, row)
provide(CellValueInj, toRef(props, 'modelValue'))
provide(SaveRowInj, () => emit('save'))
const isGrid = inject(IsGridInj, ref(false))

4
packages/nc-gui/components/virtual-cell/components/ListItems.vue

@ -6,6 +6,7 @@ import {
ColumnInj,
Empty,
IsPublicInj,
SaveRowInj,
computed,
inject,
isDrawerExist,
@ -43,11 +44,14 @@ const { addLTARRef, isNew } = useSmartsheetRowStoreOrThrow()
const isPublic = inject(IsPublicInj, ref(false))
const saveRow = inject(SaveRowInj, () => {})
const selectedRowIndex = ref(0)
const linkRow = async (row: Record<string, any>) => {
if (isNew.value) {
addLTARRef(row, column?.value as ColumnType)
saveRow()
} else {
await link(row)
}

1
packages/nc-gui/context/index.ts

@ -33,3 +33,4 @@ export const CellUrlDisableOverlayInj: InjectionKey<Ref<boolean>> = Symbol('cell
export const DropZoneRef: InjectionKey<Ref<Element | undefined>> = Symbol('drop-zone-ref')
export const ToggleDialogInj: InjectionKey<Function> = Symbol('toggle-dialog-injection')
export const CellClickHookInj: InjectionKey<EventHook<MouseEvent> | undefined> = Symbol('cell-click-injection')
export const SaveRowInj: InjectionKey<(() => void) | undefined> = Symbol('save-row-injection')

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

@ -265,7 +265,7 @@
"columnName": "Перегиба - имя столбца"
},
"community": {
"starUs1": "Оценка",
"starUs1": "Оценить",
"starUs2": "Мы на Github",
"bookDemo": "Записаться на бесплатную демонстрацию",
"getAnswered": "Получите ответы на ваши вопросы",
@ -328,7 +328,7 @@
"deleteProject": "Удалить проект",
"refreshProject": "Обновить проекты",
"saveProject": "Сохранить проект",
"deleteKanbanStack": "Удалить стопку?",
"deleteKanbanStack": "Удалить стек?",
"createProjectExtended": {
"extDB": "Создать подключение к внешней базе данных",
"excel": "Создать проект из Excel",
@ -385,14 +385,14 @@
"saveRow": "Сохранить строку",
"saveAndExit": "Сохранить и выйти",
"saveAndStay": "Сохранить и остаться",
"insertRow": "Вставить новый строку",
"insertRow": "Вставить новую строку",
"deleteRow": "Удалить строку",
"deleteSelectedRow": "Удалить выбранные строки",
"importExcel": "Импорт из Excel",
"importCSV": "Импорт CSV",
"downloadCSV": "Скачать как CSV.",
"downloadCSV": "Скачать как CSV",
"downloadExcel": "Скачать как XLSX",
"uploadCSV": "Загрузить CSV.",
"uploadCSV": "Загрузить CSV",
"import": "Импортировать",
"importMetadata": "Импорт метаданных",
"exportMetadata": "Экспорт метаданных",
@ -446,11 +446,11 @@
"showJunctionTableNames": "Показать имена таблиц переходов"
},
"kanban": {
"collapseStack": "Свернуть стопку",
"deleteStack": "Удалить стопку",
"collapseStack": "Свернуть стек",
"deleteStack": "Удалить стек",
"stackedBy": "Группировка по",
"chooseGroupingField": "Выберите поле группировки",
"addOrEditStack": "Добавление / редактирование стопки"
"addOrEditStack": "Добавление / редактирование стека"
}
},
"tooltip": {
@ -491,7 +491,7 @@
"confirm": "Подтвердите новый пароль"
},
"searchProjectTree": "Искать таблицы",
"searchFields": "Поля поиска",
"searchFields": "Поиск полей",
"searchColumn": "Поиск {поиск} столбец",
"searchApps": "Поиск приложений",
"searchModels": "Модели поиска",
@ -536,7 +536,7 @@
"shareBasePrivate": "Генерировать общедоступную базу только для чтения",
"shareBasePublic": "Любой в интернете с этой ссылкой может просматривать",
"userInviteNoSMTP": "Похоже, вы еще не настроили почту! Пожалуйста, скопируйте выше приглашенные ссылки и отправьте её",
"dragDropHide": "Перетащите поля здесь, чтобы скрыть",
"dragDropHide": "Перетащите поля сюда, чтобы скрыть",
"formInput": "Введите форму ввода формы",
"formHelpText": "Добавьте текст подсказки",
"onlyCreator": "Видно только для создателя",
@ -578,11 +578,11 @@
},
"sponsor": {
"header": "Вы можете помочь нам!",
"message": "Мы - крошечная команда, работающая на полную ставку, чтобы сделать NoCodb Open-Source. Мы считаем, что инструмент, такой как NOCODB, должен быть свободно доступен каждому решатель проблем в Интернете."
"message": "Мы - крошечная команда, работающая на полную ставку, чтобы сделать NoCodb Open-Source. Мы считаем, что инструмент, такой как Nocodb, должен быть свободно доступен каждому специалисту по решению проблем в Интернете."
},
"loginMsg": "Войдите в NoCodb",
"passwordRecovery": {
"message_1": "Пожалуйста, укажите адрес электронной почты, который вы использовали, когда вы зарегистрировались.",
"message_1": "Пожалуйста, укажите адрес электронной почты, который вы использовали при регистрации.",
"message_2": "Мы вышлем вам электронное письмо со ссылкой на сброс вашего пароля.",
"success": "Пожалуйста, проверьте вашу электронную почту, чтобы сбросить пароль"
},
@ -596,7 +596,7 @@
},
"addView": {
"grid": "Добавить представление сетка",
"gallery": "Добавить Галерию",
"gallery": "Добавить представление галерея",
"form": "Добавить представление форма",
"kanban": "Добавить представление Канбан",
"calendar": "Добавить представление календарь"
@ -630,7 +630,7 @@
"deleteViewConfirmation": "Вы действительно хотите удалить это представление?",
"deleteTableConfirmation": "Вы действительно хотите удалить эту таблицу",
"showM2mTables": "Показать таблицы M2M",
"deleteKanbanStackConfirmation": "Удаление этой стопки также удалит опцию выбора `{stackToBeDeleted}` из `{groupingField}`. Записи переместятся в стопку без категории.",
"deleteKanbanStackConfirmation": "Удаление этого стека также удалит опцию выбора `{stackToBeDeleted}` из `{groupingField}`. Записи переместятся в стек без категории.",
"computedFieldEditWarning": "Вычисляемое поле: содержимое доступно только для чтения. Используйте меню редактирования столбцов для изменения конфигурации",
"computedFieldDeleteWarning": "Вычисляемое поле: содержимое доступно только для чтения. Невозможно очистить содержимое.",
"noMoreRecords": "Больше никаких записей"

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

File diff suppressed because it is too large Load Diff

12
packages/nc-plugin/package-lock.json generated

@ -6466,9 +6466,9 @@
"dev": true
},
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"node_modules/http-proxy-agent": {
@ -17281,9 +17281,9 @@
"dev": true
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
},
"http-proxy-agent": {

36
packages/noco-docs/package-lock.json generated

@ -8308,9 +8308,9 @@
}
},
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
},
"node_modules/http-errors": {
"version": "1.7.3",
@ -14817,9 +14817,9 @@
}
},
"node_modules/terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dependencies": {
"commander": "^2.20.0",
"source-map": "~0.6.1",
@ -14884,9 +14884,9 @@
}
},
"node_modules/terser-webpack-plugin/node_modules/terser": {
"version": "5.16.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
"integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
"version": "5.16.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz",
"integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==",
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
@ -23822,9 +23822,9 @@
}
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
},
"http-errors": {
"version": "1.7.3",
@ -28882,9 +28882,9 @@
}
},
"terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"requires": {
"commander": "^2.20.0",
"source-map": "~0.6.1",
@ -28921,9 +28921,9 @@
}
},
"terser": {
"version": "5.16.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz",
"integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==",
"version": "5.16.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz",
"integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==",
"requires": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",

12
packages/nocodb/package-lock.json generated

@ -8177,9 +8177,9 @@
}
},
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"devOptional": true
},
"node_modules/http-errors": {
@ -25364,9 +25364,9 @@
}
},
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"devOptional": true
},
"http-errors": {

16
packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/genRollupSelectv2.ts

@ -23,23 +23,21 @@ export default async function ({
const childModel = await childCol?.getModel();
const parentCol = await relationColumnOption.getParentColumn();
const parentModel = await parentCol?.getModel();
const refTableAlias = `__nc_rollup`;
switch (relationColumnOption.type) {
case RelationTypes.HAS_MANY:
// if (!rollup.table_name || !rollup.rtn) {
// rollup = { ...rollup, ...hasMany.find(hm => hm.table_name === rollup.rltn) };
// }
return {
builder: knex(childModel?.table_name)
builder: knex(`${childModel?.table_name} as ${refTableAlias}`)
[columnOptions.rollup_function]?.(
knex.ref(`${childModel?.table_name}.${rollupColumn.column_name}`)
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`)
)
.where(
knex.ref(
`${alias || parentModel.table_name}.${parentCol.column_name}`
),
'=',
knex.ref(`${childModel.table_name}.${childCol.column_name}`)
knex.ref(`${refTableAlias}.${childCol.column_name}`)
),
};
case RelationTypes.MANY_TO_MANY: {
@ -48,15 +46,15 @@ export default async function ({
const mmParentCol = await relationColumnOption.getMMParentColumn();
return {
builder: knex(parentModel.table_name)
builder: knex(`${parentModel?.table_name} as ${refTableAlias}`)
[columnOptions.rollup_function]?.(
knex.ref(`${parentModel.table_name}.${rollupColumn.column_name}`)
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`)
)
.innerJoin(
mmModel.table_name,
knex.ref(`${mmModel.table_name}.${mmParentCol.column_name}`),
'=',
knex.ref(`${parentModel.table_name}.${parentCol.column_name}`)
knex.ref(`${refTableAlias}.${parentCol.column_name}`)
)
.where(
knex.ref(`${mmModel.table_name}.${mmChildCol.column_name}`),

Loading…
Cancel
Save