diff --git a/.github/uffizzi/docker-compose.uffizzi.yml b/.github/uffizzi/docker-compose.uffizzi.yml index 318ad64367..ae78efb590 100644 --- a/.github/uffizzi/docker-compose.uffizzi.yml +++ b/.github/uffizzi/docker-compose.uffizzi.yml @@ -31,7 +31,7 @@ services: MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password MYSQL_USER: noco - image: "mysql:8.0.32" + image: "mysql:8.0.35" deploy: resources: limits: diff --git a/README.md b/README.md index fbeab2db7d..941a7e8934 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart spreadshe --> -[![Stargazers repo roster for @nocodb/nocodb](https://reporoster.com/stars/nocodb/nocodb)](https://github.com/nocodb/nocodb/stargazers) +[![Stargazers repo roster for @nocodb/nocodb](http://reporoster.com/stars/nocodb/nocodb)](https://github.com/nocodb/nocodb/stargazers) # Quick try diff --git a/docker-compose/mysql/docker-compose.yml b/docker-compose/mysql/docker-compose.yml index 76e2e232cc..323c00d3a8 100644 --- a/docker-compose/mysql/docker-compose.yml +++ b/docker-compose/mysql/docker-compose.yml @@ -27,7 +27,7 @@ services: - "-h" - localhost timeout: 20s - image: "mysql:8.0.32" + image: "mysql:8.0.35" restart: always volumes: - "db_data:/var/lib/mysql" diff --git a/docker-compose/nginx-proxy-manager/docker-compose.yml b/docker-compose/nginx-proxy-manager/docker-compose.yml index 89409c77c9..62aec02a06 100644 --- a/docker-compose/nginx-proxy-manager/docker-compose.yml +++ b/docker-compose/nginx-proxy-manager/docker-compose.yml @@ -46,7 +46,7 @@ services: - "-h" - localhost timeout: 20s - image: "mysql:8.0.32" + image: "mysql:8.0.35" networks: - default restart: always diff --git a/package.json b/package.json index 6242a7000d..e8a13f0c66 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "devDependencies": { "fs": "0.0.1-security", "lerna": "^7.0.2", - "husky": "^8.0.0", + "husky": "^8.0.3", "xlsx": "^0.17.4" }, "husky": { diff --git a/packages/nc-gui/assets/style.scss b/packages/nc-gui/assets/style.scss index 4a620c5276..7d9c703132 100644 --- a/packages/nc-gui/assets/style.scss +++ b/packages/nc-gui/assets/style.scss @@ -678,3 +678,7 @@ input[type='number'] { @apply xs:(visible opacity-100 !text-gray-500) } } + +.ant-message-notice-content { + @apply !rounded-md; +} \ No newline at end of file diff --git a/packages/nc-gui/components.d.ts b/packages/nc-gui/components.d.ts index 57affe1553..f8954cf149 100644 --- a/packages/nc-gui/components.d.ts +++ b/packages/nc-gui/components.d.ts @@ -26,7 +26,6 @@ declare module '@vue/runtime-core' { AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] ADatePicker: typeof import('ant-design-vue/es')['DatePicker'] ADivider: typeof import('ant-design-vue/es')['Divider'] - ADrawer: typeof import('ant-design-vue/es')['Drawer'] ADropdown: typeof import('ant-design-vue/es')['Dropdown'] ADropdownButton: typeof import('ant-design-vue/es')['DropdownButton'] AEmpty: typeof import('ant-design-vue/es')['Empty'] @@ -47,7 +46,6 @@ declare module '@vue/runtime-core' { AMenu: typeof import('ant-design-vue/es')['Menu'] AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] - AMenuItemGroup: typeof import('ant-design-vue/es')['MenuItemGroup'] AModal: typeof import('ant-design-vue/es')['Modal'] APagination: typeof import('ant-design-vue/es')['Pagination'] APopover: typeof import('ant-design-vue/es')['Popover'] @@ -64,7 +62,6 @@ declare module '@vue/runtime-core' { ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table'] - ATableColumn: typeof import('ant-design-vue/es')['TableColumn'] ATabPane: typeof import('ant-design-vue/es')['TabPane'] ATabs: typeof import('ant-design-vue/es')['Tabs'] ATag: typeof import('ant-design-vue/es')['Tag'] diff --git a/packages/nc-gui/components/cell/Json.vue b/packages/nc-gui/components/cell/Json.vue index 18326296f9..b4eaf90dac 100644 --- a/packages/nc-gui/components/cell/Json.vue +++ b/packages/nc-gui/components/cell/Json.vue @@ -72,13 +72,7 @@ const clear = () => { const formatJson = (json: string) => { try { - json = json - .trim() - .replace(/^\{\s*|\s*\}$/g, '') - .replace(/\n\s*/g, '') - json = `{${json}}` - - return json + return JSON.stringify(JSON.parse(json)) } catch (e) { console.log(e) return json diff --git a/packages/nc-gui/components/cell/TextArea.vue b/packages/nc-gui/components/cell/TextArea.vue index 826e76a7a1..90581d7e85 100644 --- a/packages/nc-gui/components/cell/TextArea.vue +++ b/packages/nc-gui/components/cell/TextArea.vue @@ -16,6 +16,7 @@ import { const props = defineProps<{ modelValue?: string | number isFocus?: boolean + virtual?: boolean }>() const emits = defineEmits(['update:modelValue']) @@ -65,6 +66,13 @@ onClickOutside(inputWrapperRef, (e) => { isVisible.value = false }) + +const onDblClick = () => { + if (!props.virtual) return + + isVisible.value = true + editEnabled.value = true +} + { :table-id="contextMenuTarget.value?.id" :base-id="base?.id" /> + + +
diff --git a/packages/nc-gui/components/dlg/AirtableImport.vue b/packages/nc-gui/components/dlg/AirtableImport.vue index 692da11e3e..9b8ec341eb 100644 --- a/packages/nc-gui/components/dlg/AirtableImport.vue +++ b/packages/nc-gui/components/dlg/AirtableImport.vue @@ -90,8 +90,10 @@ const onStatus = async (status: JobStatus, data?: any) => { refreshCommandPalette() // TODO: add tab of the first table } else if (status === JobStatus.FAILED) { + await loadTables() goBack.value = true pushProgress(data.error.message, status) + refreshCommandPalette() } } @@ -115,7 +117,10 @@ const { validateInfos } = useForm(syncSource, validators) const disableImportButton = computed(() => !syncSource.value.details.apiKey || !syncSource.value.details.syncSourceUrlOrId) +const isLoading = ref(false) + async function saveAndSync() { + isLoading.value = true await createOrUpdate() await sync() } @@ -178,6 +183,7 @@ async function listenForUpdates(id?: string) { } } else { listeningForUpdates.value = false + isLoading.value = false } }, ) @@ -494,6 +500,7 @@ onMounted(async () => { v-e="['c:sync-airtable:save-and-sync']" type="primary" class="nc-btn-airtable-import" + :loading="isLoading" :disabled="disableImportButton" @click="saveAndSync" > diff --git a/packages/nc-gui/components/dlg/ColumnDuplicate.vue b/packages/nc-gui/components/dlg/ColumnDuplicate.vue index 82dd82612c..2c87a60ca0 100644 --- a/packages/nc-gui/components/dlg/ColumnDuplicate.vue +++ b/packages/nc-gui/components/dlg/ColumnDuplicate.vue @@ -17,10 +17,6 @@ const dialogShow = useVModel(props, 'modelValue', emit) const { $e, $poller } = useNuxtApp() -const basesStore = useBases() - -const { createProject: _createProject } = basesStore - const { activeTable: _activeTable } = storeToRefs(useTablesStore()) const reloadDataHook = inject(ReloadViewDataHookInj) @@ -101,7 +97,9 @@ onKeyStroke('Enter', () => { } }) -const isEaster = ref(false) +defineExpose({ + duplicate: _duplicate, +})