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", "license": "AGPL-3.0-or-later",
"devDependencies": { "devDependencies": {
"fs": "0.0.1-security", "fs": "0.0.1-security",
"lerna": "^3.20.1", "lerna": "^6.4.1",
"husky": "^8.0.0", "husky": "^8.0.0",
"xlsx": "^0.17.4" "xlsx": "^0.17.4"
}, },

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

@ -19,6 +19,11 @@ onMounted(() => {
<template> <template>
<div ref="wrapper"> <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> </div>
</template> </template>

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

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

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

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

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

@ -6,6 +6,7 @@ import {
ColumnInj, ColumnInj,
Empty, Empty,
IsPublicInj, IsPublicInj,
SaveRowInj,
computed, computed,
inject, inject,
isDrawerExist, isDrawerExist,
@ -43,11 +44,14 @@ const { addLTARRef, isNew } = useSmartsheetRowStoreOrThrow()
const isPublic = inject(IsPublicInj, ref(false)) const isPublic = inject(IsPublicInj, ref(false))
const saveRow = inject(SaveRowInj, () => {})
const selectedRowIndex = ref(0) const selectedRowIndex = ref(0)
const linkRow = async (row: Record<string, any>) => { const linkRow = async (row: Record<string, any>) => {
if (isNew.value) { if (isNew.value) {
addLTARRef(row, column?.value as ColumnType) addLTARRef(row, column?.value as ColumnType)
saveRow()
} else { } else {
await link(row) 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 DropZoneRef: InjectionKey<Ref<Element | undefined>> = Symbol('drop-zone-ref')
export const ToggleDialogInj: InjectionKey<Function> = Symbol('toggle-dialog-injection') export const ToggleDialogInj: InjectionKey<Function> = Symbol('toggle-dialog-injection')
export const CellClickHookInj: InjectionKey<EventHook<MouseEvent> | undefined> = Symbol('cell-click-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": "Перегиба - имя столбца" "columnName": "Перегиба - имя столбца"
}, },
"community": { "community": {
"starUs1": "Оценка", "starUs1": "Оценить",
"starUs2": "Мы на Github", "starUs2": "Мы на Github",
"bookDemo": "Записаться на бесплатную демонстрацию", "bookDemo": "Записаться на бесплатную демонстрацию",
"getAnswered": "Получите ответы на ваши вопросы", "getAnswered": "Получите ответы на ваши вопросы",
@ -328,7 +328,7 @@
"deleteProject": "Удалить проект", "deleteProject": "Удалить проект",
"refreshProject": "Обновить проекты", "refreshProject": "Обновить проекты",
"saveProject": "Сохранить проект", "saveProject": "Сохранить проект",
"deleteKanbanStack": "Удалить стопку?", "deleteKanbanStack": "Удалить стек?",
"createProjectExtended": { "createProjectExtended": {
"extDB": "Создать подключение к внешней базе данных", "extDB": "Создать подключение к внешней базе данных",
"excel": "Создать проект из Excel", "excel": "Создать проект из Excel",
@ -385,14 +385,14 @@
"saveRow": "Сохранить строку", "saveRow": "Сохранить строку",
"saveAndExit": "Сохранить и выйти", "saveAndExit": "Сохранить и выйти",
"saveAndStay": "Сохранить и остаться", "saveAndStay": "Сохранить и остаться",
"insertRow": "Вставить новый строку", "insertRow": "Вставить новую строку",
"deleteRow": "Удалить строку", "deleteRow": "Удалить строку",
"deleteSelectedRow": "Удалить выбранные строки", "deleteSelectedRow": "Удалить выбранные строки",
"importExcel": "Импорт из Excel", "importExcel": "Импорт из Excel",
"importCSV": "Импорт CSV", "importCSV": "Импорт CSV",
"downloadCSV": "Скачать как CSV.", "downloadCSV": "Скачать как CSV",
"downloadExcel": "Скачать как XLSX", "downloadExcel": "Скачать как XLSX",
"uploadCSV": "Загрузить CSV.", "uploadCSV": "Загрузить CSV",
"import": "Импортировать", "import": "Импортировать",
"importMetadata": "Импорт метаданных", "importMetadata": "Импорт метаданных",
"exportMetadata": "Экспорт метаданных", "exportMetadata": "Экспорт метаданных",
@ -446,11 +446,11 @@
"showJunctionTableNames": "Показать имена таблиц переходов" "showJunctionTableNames": "Показать имена таблиц переходов"
}, },
"kanban": { "kanban": {
"collapseStack": "Свернуть стопку", "collapseStack": "Свернуть стек",
"deleteStack": "Удалить стопку", "deleteStack": "Удалить стек",
"stackedBy": "Группировка по", "stackedBy": "Группировка по",
"chooseGroupingField": "Выберите поле группировки", "chooseGroupingField": "Выберите поле группировки",
"addOrEditStack": "Добавление / редактирование стопки" "addOrEditStack": "Добавление / редактирование стека"
} }
}, },
"tooltip": { "tooltip": {
@ -491,7 +491,7 @@
"confirm": "Подтвердите новый пароль" "confirm": "Подтвердите новый пароль"
}, },
"searchProjectTree": "Искать таблицы", "searchProjectTree": "Искать таблицы",
"searchFields": "Поля поиска", "searchFields": "Поиск полей",
"searchColumn": "Поиск {поиск} столбец", "searchColumn": "Поиск {поиск} столбец",
"searchApps": "Поиск приложений", "searchApps": "Поиск приложений",
"searchModels": "Модели поиска", "searchModels": "Модели поиска",
@ -536,7 +536,7 @@
"shareBasePrivate": "Генерировать общедоступную базу только для чтения", "shareBasePrivate": "Генерировать общедоступную базу только для чтения",
"shareBasePublic": "Любой в интернете с этой ссылкой может просматривать", "shareBasePublic": "Любой в интернете с этой ссылкой может просматривать",
"userInviteNoSMTP": "Похоже, вы еще не настроили почту! Пожалуйста, скопируйте выше приглашенные ссылки и отправьте её", "userInviteNoSMTP": "Похоже, вы еще не настроили почту! Пожалуйста, скопируйте выше приглашенные ссылки и отправьте её",
"dragDropHide": "Перетащите поля здесь, чтобы скрыть", "dragDropHide": "Перетащите поля сюда, чтобы скрыть",
"formInput": "Введите форму ввода формы", "formInput": "Введите форму ввода формы",
"formHelpText": "Добавьте текст подсказки", "formHelpText": "Добавьте текст подсказки",
"onlyCreator": "Видно только для создателя", "onlyCreator": "Видно только для создателя",
@ -578,11 +578,11 @@
}, },
"sponsor": { "sponsor": {
"header": "Вы можете помочь нам!", "header": "Вы можете помочь нам!",
"message": "Мы - крошечная команда, работающая на полную ставку, чтобы сделать NoCodb Open-Source. Мы считаем, что инструмент, такой как NOCODB, должен быть свободно доступен каждому решатель проблем в Интернете." "message": "Мы - крошечная команда, работающая на полную ставку, чтобы сделать NoCodb Open-Source. Мы считаем, что инструмент, такой как Nocodb, должен быть свободно доступен каждому специалисту по решению проблем в Интернете."
}, },
"loginMsg": "Войдите в NoCodb", "loginMsg": "Войдите в NoCodb",
"passwordRecovery": { "passwordRecovery": {
"message_1": "Пожалуйста, укажите адрес электронной почты, который вы использовали, когда вы зарегистрировались.", "message_1": "Пожалуйста, укажите адрес электронной почты, который вы использовали при регистрации.",
"message_2": "Мы вышлем вам электронное письмо со ссылкой на сброс вашего пароля.", "message_2": "Мы вышлем вам электронное письмо со ссылкой на сброс вашего пароля.",
"success": "Пожалуйста, проверьте вашу электронную почту, чтобы сбросить пароль" "success": "Пожалуйста, проверьте вашу электронную почту, чтобы сбросить пароль"
}, },
@ -596,7 +596,7 @@
}, },
"addView": { "addView": {
"grid": "Добавить представление сетка", "grid": "Добавить представление сетка",
"gallery": "Добавить Галерию", "gallery": "Добавить представление галерея",
"form": "Добавить представление форма", "form": "Добавить представление форма",
"kanban": "Добавить представление Канбан", "kanban": "Добавить представление Канбан",
"calendar": "Добавить представление календарь" "calendar": "Добавить представление календарь"
@ -630,7 +630,7 @@
"deleteViewConfirmation": "Вы действительно хотите удалить это представление?", "deleteViewConfirmation": "Вы действительно хотите удалить это представление?",
"deleteTableConfirmation": "Вы действительно хотите удалить эту таблицу", "deleteTableConfirmation": "Вы действительно хотите удалить эту таблицу",
"showM2mTables": "Показать таблицы M2M", "showM2mTables": "Показать таблицы M2M",
"deleteKanbanStackConfirmation": "Удаление этой стопки также удалит опцию выбора `{stackToBeDeleted}` из `{groupingField}`. Записи переместятся в стопку без категории.", "deleteKanbanStackConfirmation": "Удаление этого стека также удалит опцию выбора `{stackToBeDeleted}` из `{groupingField}`. Записи переместятся в стек без категории.",
"computedFieldEditWarning": "Вычисляемое поле: содержимое доступно только для чтения. Используйте меню редактирования столбцов для изменения конфигурации", "computedFieldEditWarning": "Вычисляемое поле: содержимое доступно только для чтения. Используйте меню редактирования столбцов для изменения конфигурации",
"computedFieldDeleteWarning": "Вычисляемое поле: содержимое доступно только для чтения. Невозможно очистить содержимое.", "computedFieldDeleteWarning": "Вычисляемое поле: содержимое доступно только для чтения. Невозможно очистить содержимое.",
"noMoreRecords": "Больше никаких записей" "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 "dev": true
}, },
"node_modules/http-cache-semantics": { "node_modules/http-cache-semantics": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true "dev": true
}, },
"node_modules/http-proxy-agent": { "node_modules/http-proxy-agent": {
@ -17281,9 +17281,9 @@
"dev": true "dev": true
}, },
"http-cache-semantics": { "http-cache-semantics": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true "dev": true
}, },
"http-proxy-agent": { "http-proxy-agent": {

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

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

12
packages/nocodb/package-lock.json generated

@ -8177,9 +8177,9 @@
} }
}, },
"node_modules/http-cache-semantics": { "node_modules/http-cache-semantics": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"devOptional": true "devOptional": true
}, },
"node_modules/http-errors": { "node_modules/http-errors": {
@ -25364,9 +25364,9 @@
} }
}, },
"http-cache-semantics": { "http-cache-semantics": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"devOptional": true "devOptional": true
}, },
"http-errors": { "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 childModel = await childCol?.getModel();
const parentCol = await relationColumnOption.getParentColumn(); const parentCol = await relationColumnOption.getParentColumn();
const parentModel = await parentCol?.getModel(); const parentModel = await parentCol?.getModel();
const refTableAlias = `__nc_rollup`;
switch (relationColumnOption.type) { switch (relationColumnOption.type) {
case RelationTypes.HAS_MANY: case RelationTypes.HAS_MANY:
// if (!rollup.table_name || !rollup.rtn) {
// rollup = { ...rollup, ...hasMany.find(hm => hm.table_name === rollup.rltn) };
// }
return { return {
builder: knex(childModel?.table_name) builder: knex(`${childModel?.table_name} as ${refTableAlias}`)
[columnOptions.rollup_function]?.( [columnOptions.rollup_function]?.(
knex.ref(`${childModel?.table_name}.${rollupColumn.column_name}`) knex.ref(`${refTableAlias}.${rollupColumn.column_name}`)
) )
.where( .where(
knex.ref( knex.ref(
`${alias || parentModel.table_name}.${parentCol.column_name}` `${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: { case RelationTypes.MANY_TO_MANY: {
@ -48,15 +46,15 @@ export default async function ({
const mmParentCol = await relationColumnOption.getMMParentColumn(); const mmParentCol = await relationColumnOption.getMMParentColumn();
return { return {
builder: knex(parentModel.table_name) builder: knex(`${parentModel?.table_name} as ${refTableAlias}`)
[columnOptions.rollup_function]?.( [columnOptions.rollup_function]?.(
knex.ref(`${parentModel.table_name}.${rollupColumn.column_name}`) knex.ref(`${refTableAlias}.${rollupColumn.column_name}`)
) )
.innerJoin( .innerJoin(
mmModel.table_name, mmModel.table_name,
knex.ref(`${mmModel.table_name}.${mmParentCol.column_name}`), knex.ref(`${mmModel.table_name}.${mmParentCol.column_name}`),
'=', '=',
knex.ref(`${parentModel.table_name}.${parentCol.column_name}`) knex.ref(`${refTableAlias}.${parentCol.column_name}`)
) )
.where( .where(
knex.ref(`${mmModel.table_name}.${mmChildCol.column_name}`), knex.ref(`${mmModel.table_name}.${mmChildCol.column_name}`),

Loading…
Cancel
Save