This is an automated email from the ASF dual-hosted git repository.
lauraxia pushed a commit to branch antdUI-gravitino-base1.1.0
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/antdUI-gravitino-base1.1.0 by
this push:
new 2f4ce92d1f [#9628][#9639][#9640][#9641][#9642][#9644][#9645][#9646]
fix table related issue and drop template and fileset/model name issue
2f4ce92d1f is described below
commit 2f4ce92d1fb7df2ce06555cf4b3086589c3897a7
Author: Qian Xia <[email protected]>
AuthorDate: Thu Jan 8 18:13:03 2026 +0800
[#9628][#9639][#9640][#9641][#9642][#9644][#9645][#9646] fix table related
issue and drop template and fileset/model name issue
---
conf/gravitino.conf.template | 1 +
.../catalogs/rightContent/CreateFilesetDialog.js | 7 +-
.../app/catalogs/rightContent/CreateTableDialog.js | 9 +-
.../catalogs/rightContent/RegisterModelDialog.js | 2 +-
.../entitiesContent/ModelDetailsPage.js | 1 +
.../entitiesContent/TableDetailsPage.js | 7 +-
web/web/src/app/jobTemplates/page.js | 4 +-
web/web/src/app/jobs/RegisterJobTemplateDialog.js | 4 +-
web/web/src/app/login/components/DefaultLogin.js | 2 +-
web/web/src/app/login/page.js | 4 +
web/web/src/app/metalakes/page.js | 2 +-
.../src/appOld/login/components/DefaultLogin.js | 223 ++++++++++++---------
.../appOld/login/components/defaultLoginSchema.js | 48 +++++
web/web/src/appOld/login/page.js | 2 +-
web/web/src/appOld/rootLayout/Logout.js | 14 +-
web/web/src/lib/store/metalakes/index.js | 26 ++-
web/web/src/lib/utils/index.js | 4 +-
17 files changed, 239 insertions(+), 121 deletions(-)
diff --git a/conf/gravitino.conf.template b/conf/gravitino.conf.template
index 029e1d2121..9e340f5a6e 100644
--- a/conf/gravitino.conf.template
+++ b/conf/gravitino.conf.template
@@ -78,6 +78,7 @@ gravitino.cache.implementation = caffeine
# Whether Gravitino enable authorization or not
gravitino.authorization.enable = false
# The admins of Gravitino service, multiple admins are spitted by comma.
+gravitino.server.visibleConfigs=gravitino.authorization.serviceAdmins
gravitino.authorization.serviceAdmins = anonymous
# THE CONFIGURATION FOR AUXILIARY SERVICE
diff --git a/web/web/src/app/catalogs/rightContent/CreateFilesetDialog.js
b/web/web/src/app/catalogs/rightContent/CreateFilesetDialog.js
index 41693a5c99..561cbe61bf 100644
--- a/web/web/src/app/catalogs/rightContent/CreateFilesetDialog.js
+++ b/web/web/src/app/catalogs/rightContent/CreateFilesetDialog.js
@@ -141,9 +141,6 @@ export default function CreateFilesetDialog({ ...props }) {
}
}, [open, editFileset, metalake, catalog, schema])
- // const { trigger: submitFileset, isMutating } = useCreateFilesetAsync()
- // const { trigger: updateFileset, isMutating: isUpdateMutating } =
useUpdateFilesetAsync()
-
const handleSubmit = e => {
e.preventDefault()
form
@@ -185,7 +182,7 @@ export default function CreateFilesetDialog({ ...props }) {
} else {
await dispatch(createFileset({ data: submitData, metalake, catalog,
catalogType, schema }))
}
- !editFileset && treeRef.current.onLoadData({ key:
`${catalog}/${schema}`, nodeType: 'schema' })
+ treeRef.current.onLoadData({ key: `${catalog}/${schema}`, nodeType:
'schema' })
setConfirmLoading(false)
setOpen(false)
})
@@ -250,7 +247,7 @@ export default function CreateFilesetDialog({ ...props }) {
label='Fileset Name'
rules={[{ required: true }, { type: 'string', max: 64 }, {
pattern: new RegExp(nameRegex) }]}
>
- <Input data-refer='fileset-name-field'
placeholder={mismatchName} disabled={!init} />
+ <Input data-refer='fileset-name-field'
placeholder={mismatchName} disabled={init} />
</Form.Item>
<Form.Item
name='type'
diff --git a/web/web/src/app/catalogs/rightContent/CreateTableDialog.js
b/web/web/src/app/catalogs/rightContent/CreateTableDialog.js
index 0ea3d438b0..3d0bdfeee7 100644
--- a/web/web/src/app/catalogs/rightContent/CreateTableDialog.js
+++ b/web/web/src/app/catalogs/rightContent/CreateTableDialog.js
@@ -375,7 +375,7 @@ export default function CreateTableDialog({ ...props }) {
default:
form.setFieldValue(
['columns', key, 'typeObj', 'type'],
- capitalizeFirstLetter(table.columns[key].type)
+ capitalizeFirstLetter(table.columns[key].type?.type)
)
}
}
@@ -397,6 +397,7 @@ export default function CreateTableDialog({ ...props }) {
const fields = item.fieldName || item.fieldNames.map(f => f[0])
form.setFieldValue(['partitions', idxPartiton, 'strategy'],
item.strategy)
form.setFieldValue(['partitions', idxPartiton, 'fieldName'],
fields)
+ form.setFieldValue(['partitions', idxPartiton, 'number'],
item.width || item.number)
idxPartiton++
})
}
@@ -405,11 +406,17 @@ export default function CreateTableDialog({ ...props }) {
table.sortOrders.forEach(item => {
const strategy = item.sortTerm?.type === 'field' ? 'field' :
item.sortTerm?.funcName
+ const number =
+ item.sortTerm?.type === 'function'
+ ? item.sortTerm?.funcArgs.find(f => f.type ===
'literal')?.value
+ : undefined
+
const fieldName =
item.sortTerm?.type === 'field'
? item.sortTerm.fieldName[0]
: item.sortTerm?.funcArgs.find(f =>
f.fieldName)?.fieldName[0]
form.setFieldValue(['sortOrders', idxSortOrder, 'strategy'],
strategy)
+ form.setFieldValue(['sortOrders', idxSortOrder, 'number'],
number)
form.setFieldValue(['sortOrders', idxSortOrder, 'fieldName'],
fieldName)
form.setFieldValue(['sortOrders', idxSortOrder, 'direction'],
item.direction)
form.setFieldValue(['sortOrders', idxSortOrder,
'nullOrdering'], item.nullOrdering)
diff --git a/web/web/src/app/catalogs/rightContent/RegisterModelDialog.js
b/web/web/src/app/catalogs/rightContent/RegisterModelDialog.js
index 5e4dd910e2..817395c019 100644
--- a/web/web/src/app/catalogs/rightContent/RegisterModelDialog.js
+++ b/web/web/src/app/catalogs/rightContent/RegisterModelDialog.js
@@ -191,7 +191,7 @@ export default function RegisterModelDialog({ ...props }) {
label='Model Name'
rules={[{ required: true }, { type: 'string', max: 64 }, {
pattern: new RegExp(nameRegex) }]}
>
- <Input placeholder={mismatchName} disabled={!init} />
+ <Input placeholder={mismatchName} disabled={init} />
</Form.Item>
<Form.Item name='comment' label='Comment'>
<TextArea />
diff --git
a/web/web/src/app/catalogs/rightContent/entitiesContent/ModelDetailsPage.js
b/web/web/src/app/catalogs/rightContent/entitiesContent/ModelDetailsPage.js
index edea952810..ec777e2cad 100644
--- a/web/web/src/app/catalogs/rightContent/entitiesContent/ModelDetailsPage.js
+++ b/web/web/src/app/catalogs/rightContent/entitiesContent/ModelDetailsPage.js
@@ -491,6 +491,7 @@ export default function ModelDetailsPage({ ...props }) {
catalog={catalog}
schema={schema}
editModel={model}
+ init={true}
/>
)}
{openOwner && (
diff --git
a/web/web/src/app/catalogs/rightContent/entitiesContent/TableDetailsPage.js
b/web/web/src/app/catalogs/rightContent/entitiesContent/TableDetailsPage.js
index f0fd398689..cde4b05c28 100644
--- a/web/web/src/app/catalogs/rightContent/entitiesContent/TableDetailsPage.js
+++ b/web/web/src/app/catalogs/rightContent/entitiesContent/TableDetailsPage.js
@@ -205,12 +205,15 @@ export default function TableDetailsPage({ ...props }) {
})
const sortOrders = store.activatedDetails?.sortOrders?.map((i, index) => {
+ const fields =
+ i.sortTerm?.type === 'field' ? i.sortTerm.fieldName :
i.sortTerm?.funcArgs.find(f => f.fieldName)?.fieldName
+
return {
key: index,
- fields: i.sortTerm.fieldName,
+ fields: fields,
dir: i.direction,
no: i.nullOrdering,
- text: `${i.sortTerm.fieldName[0]} ${i.direction} ${i.nullOrdering}`
+ text: `${fields[0]} ${i.direction} ${i.nullOrdering}`
}
})
diff --git a/web/web/src/app/jobTemplates/page.js
b/web/web/src/app/jobTemplates/page.js
index 1f4d02b91b..d9c3caa73d 100644
--- a/web/web/src/app/jobTemplates/page.js
+++ b/web/web/src/app/jobTemplates/page.js
@@ -120,7 +120,7 @@ export default function JobTemplatesPage() {
}
modal.confirm({
- title: `Are you sure to cancel the Job Template ${jobTemplateName}?`,
+ title: `Are you sure to cancel the Job Template ${jobTemplate}?`,
icon: <ExclamationCircleFilled />,
content: (
<NameContext.Consumer>
@@ -128,7 +128,7 @@ export default function JobTemplatesPage() {
<ConfirmInput
name={name}
type={type}
- confirmTips={`Please enter \"${jobTemplateName}\" to confirm
deletion!`}
+ confirmTips={`Please enter \"${jobTemplate}\" to confirm
deletion!`}
notMatchTips={`The entered name does not match the job template
name`}
setConfirmInput={setConfirmInput}
registerValidate={registerValidate}
diff --git a/web/web/src/app/jobs/RegisterJobTemplateDialog.js
b/web/web/src/app/jobs/RegisterJobTemplateDialog.js
index 5ddb051bf1..e1d7f31fe1 100644
--- a/web/web/src/app/jobs/RegisterJobTemplateDialog.js
+++ b/web/web/src/app/jobs/RegisterJobTemplateDialog.js
@@ -377,7 +377,7 @@ export default function RegisterJobTemplateDialog({
...props }) {
<Form.Item
{...restField}
name={[name, 'configName']}
- rules={[{ required: true, message:
t('job.thConfigNameRequired') }]}
+ rules={[{ required: true, message:
'Please input config name!' }]}
className='mb-0 w-full grow'
>
<Input placeholder='Config Name' />
@@ -385,7 +385,7 @@ export default function RegisterJobTemplateDialog({
...props }) {
<Form.Item
{...restField}
name={[name, 'configValue']}
- rules={[{ required: true, message:
t('job.thConfigValueRequired') }]}
+ rules={[{ required: true, message:
'Please input config value!' }]}
className='mb-0 w-full grow'
>
<Input placeholder='Config Value' />
diff --git a/web/web/src/app/login/components/DefaultLogin.js
b/web/web/src/app/login/components/DefaultLogin.js
index b317c31a29..fe29c01143 100644
--- a/web/web/src/app/login/components/DefaultLogin.js
+++ b/web/web/src/app/login/components/DefaultLogin.js
@@ -64,7 +64,7 @@ function DefaultLogin() {
{store.authType === 'simple' && store.anthEnable ? (
<>
<Form.Item label='Username' name='username' rules={[{ required:
true, message: 'Username is required' }]}>
- <Input placeholder='' />
+ <Input placeholder='Please enter your username' />
</Form.Item>
</>
) : (
diff --git a/web/web/src/app/login/page.js b/web/web/src/app/login/page.js
index cdfa29aec9..2abef50ed1 100644
--- a/web/web/src/app/login/page.js
+++ b/web/web/src/app/login/page.js
@@ -28,6 +28,8 @@ import { useEffect, useState } from 'react'
import OidcLogin from './components/OidcLogin'
import DefaultLogin from './components/DefaultLogin'
import { oauthProviderFactory } from '@/lib/auth/providers/factory'
+import { resetMetalakeStore } from '@/lib/store/metalakes'
+import { useAppDispatch } from '@/lib/hooks/useStore'
const fonts = Roboto({ subsets: ['latin'], weight: ['400'], display: 'swap' })
@@ -35,6 +37,7 @@ const { Title } = Typography
const LoginPage = () => {
const [providerType, setProviderType] = useState(null)
+ const dispatch = useAppDispatch()
useEffect(() => {
const detectProviderType = async () => {
@@ -46,6 +49,7 @@ const LoginPage = () => {
}
}
+ dispatch(resetMetalakeStore())
detectProviderType()
}, [])
diff --git a/web/web/src/app/metalakes/page.js
b/web/web/src/app/metalakes/page.js
index 651e900e8d..c863d726fa 100644
--- a/web/web/src/app/metalakes/page.js
+++ b/web/web/src/app/metalakes/page.js
@@ -378,7 +378,7 @@ const MetalakeList = () => {
placeholder='Search...'
onChange={onSearchTable}
/>
- {([...(serviceAdmins || '').split(',')].includes(authUser?.name)
|| !authUser) && (
+ {([...(serviceAdmins || '').split(',')].includes(authUser?.name)
|| !anthEnable) && (
<Button
data-refer='create-metalake-btn'
type='primary'
diff --git a/web/web/src/appOld/login/components/DefaultLogin.js
b/web/web/src/appOld/login/components/DefaultLogin.js
index fd5ff0debf..2ee598a291 100644
--- a/web/web/src/appOld/login/components/DefaultLogin.js
+++ b/web/web/src/appOld/login/components/DefaultLogin.js
@@ -20,41 +20,31 @@
'use client'
import { useRouter } from 'next/navigation'
-import { useEffect } from 'react'
+import { useEffect, useMemo } from 'react'
import { Grid, Button, Typography, TextField, FormControl, FormHelperText }
from '@mui/material'
-import * as yup from 'yup'
import { useForm, Controller } from 'react-hook-form'
import { yupResolver } from '@hookform/resolvers/yup'
import { useAppDispatch, useAppSelector } from '@/lib/hooks/useStore'
-import { loginAction, setIntervalIdAction, clearIntervalId } from
'@/lib/store/auth'
-
-const defaultValues = {
- grant_type: 'client_credentials',
- client_id: '',
- client_secret: '',
- scope: ''
-}
-
-const schema = yup.object().shape({
- grant_type: yup.string().required(),
- client_id: yup.string().required(),
- client_secret: yup.string().required(),
- scope: yup.string().required()
-})
+import { loginAction, setIntervalIdAction, clearIntervalId, setAuthUser } from
'@/lib/store/auth'
+import { DEFAULT_LOGIN_DEFAULT_VALUES, createDefaultLoginSchema } from
'./defaultLoginSchema'
function DefaultLogin() {
const router = useRouter()
const dispatch = useAppDispatch()
const store = useAppSelector(state => state.auth)
+ const isSimpleAuth = store.authType === 'simple' && store.anthEnable
+
+ const schema = useMemo(() => createDefaultLoginSchema({ isSimpleAuth }),
[isSimpleAuth])
+
const {
control,
handleSubmit,
reset,
formState: { errors }
} = useForm({
- defaultValues: Object.assign({}, defaultValues),
+ defaultValues: Object.assign({}, DEFAULT_LOGIN_DEFAULT_VALUES),
mode: 'onChange',
resolver: yupResolver(schema)
})
@@ -66,8 +56,13 @@ function DefaultLogin() {
}, [store.intervalId])
const onSubmit = async data => {
- await dispatch(loginAction({ params: data, router }))
- await dispatch(setIntervalIdAction())
+ if (isSimpleAuth) {
+ await dispatch(setAuthUser({ name: String(data.username || '').trim(),
type: 'user' }))
+ router.push('/metalakes')
+ } else {
+ await dispatch(loginAction({ params: data, router }))
+ await dispatch(setIntervalIdAction())
+ }
reset({ ...data })
}
@@ -78,86 +73,120 @@ function DefaultLogin() {
return (
<form autoComplete='off' onSubmit={handleSubmit(onSubmit, onError)}>
- <Grid item xs={12} sx={{ mt: 4 }}>
- <FormControl fullWidth>
- <Controller
- name='grant_type'
- control={control}
- rules={{ required: true }}
- render={({ field: { value, onChange } }) => (
- <TextField
- value={value}
- label='Grant Type'
- disabled
- onChange={onChange}
- placeholder=''
- error={Boolean(errors.grant_type)}
- />
+ {isSimpleAuth ? (
+ <Grid item xs={12} sx={{ mt: 4 }}>
+ <FormControl fullWidth>
+ <Controller
+ name='username'
+ control={control}
+ rules={{ required: true }}
+ render={({ field: { value, onChange } }) => (
+ <TextField
+ value={value}
+ label='Username'
+ onChange={onChange}
+ placeholder=''
+ error={Boolean(errors.username)}
+ />
+ )}
+ />
+ {errors.username && (
+ <FormHelperText
className={'twc-text-error-main'}>{errors.username.message}</FormHelperText>
)}
- />
- {errors.grant_type && (
- <FormHelperText
className={'twc-text-error-main'}>{errors.grant_type.message}</FormHelperText>
- )}
- </FormControl>
- </Grid>
-
- <Grid item xs={12} sx={{ mt: 4 }}>
- <FormControl fullWidth>
- <Controller
- name='client_id'
- control={control}
- rules={{ required: true }}
- render={({ field: { value, onChange } }) => (
- <TextField
- value={value}
- label='Client ID'
- onChange={onChange}
- placeholder=''
- error={Boolean(errors.client_id)}
+ </FormControl>
+ </Grid>
+ ) : (
+ <>
+ <Grid item xs={12} sx={{ mt: 4 }}>
+ <FormControl fullWidth>
+ <Controller
+ name='grant_type'
+ control={control}
+ rules={{ required: true }}
+ render={({ field: { value, onChange } }) => (
+ <TextField
+ value={value}
+ label='Grant Type'
+ disabled
+ onChange={onChange}
+ placeholder=''
+ error={Boolean(errors.grant_type)}
+ />
+ )}
/>
- )}
- />
- {errors.client_id && (
- <FormHelperText
className={'twc-text-error-main'}>{errors.client_id.message}</FormHelperText>
- )}
- </FormControl>
- </Grid>
-
- <Grid item xs={12} sx={{ mt: 4 }}>
- <FormControl fullWidth>
- <Controller
- name='client_secret'
- control={control}
- rules={{ required: true }}
- render={({ field: { value, onChange } }) => (
- <TextField
- value={value}
- label='Client Secret'
- onChange={onChange}
- placeholder=''
- error={Boolean(errors.client_secret)}
+ {errors.grant_type && (
+ <FormHelperText
className={'twc-text-error-main'}>{errors.grant_type.message}</FormHelperText>
+ )}
+ </FormControl>
+ </Grid>
+
+ <Grid item xs={12} sx={{ mt: 4 }}>
+ <FormControl fullWidth>
+ <Controller
+ name='client_id'
+ control={control}
+ rules={{ required: true }}
+ render={({ field: { value, onChange } }) => (
+ <TextField
+ value={value}
+ label='Client ID'
+ onChange={onChange}
+ placeholder=''
+ error={Boolean(errors.client_id)}
+ />
+ )}
/>
- )}
- />
- {errors.client_secret && (
- <FormHelperText
className={'twc-text-error-main'}>{errors.client_secret.message}</FormHelperText>
- )}
- </FormControl>
- </Grid>
-
- <Grid item xs={12} sx={{ mt: 4 }}>
- <FormControl fullWidth>
- <Controller
- name='scope'
- control={control}
- rules={{ required: true }}
- render={({ field: { value, onChange } }) => (
- <TextField value={value} label='Scope' onChange={onChange}
placeholder='' error={Boolean(errors.scope)} />
- )}
- />
- {errors.scope && <FormHelperText
className={'twc-text-error-main'}>{errors.scope.message}</FormHelperText>}
- </FormControl>
- </Grid>
+ {errors.client_id && (
+ <FormHelperText
className={'twc-text-error-main'}>{errors.client_id.message}</FormHelperText>
+ )}
+ </FormControl>
+ </Grid>
+
+ <Grid item xs={12} sx={{ mt: 4 }}>
+ <FormControl fullWidth>
+ <Controller
+ name='client_secret'
+ control={control}
+ rules={{ required: true }}
+ render={({ field: { value, onChange } }) => (
+ <TextField
+ value={value}
+ label='Client Secret'
+ onChange={onChange}
+ placeholder=''
+ error={Boolean(errors.client_secret)}
+ />
+ )}
+ />
+ {errors.client_secret && (
+ <FormHelperText
className={'twc-text-error-main'}>{errors.client_secret.message}</FormHelperText>
+ )}
+ </FormControl>
+ </Grid>
+
+ <Grid item xs={12} sx={{ mt: 4 }}>
+ <FormControl fullWidth>
+ <Controller
+ name='scope'
+ control={control}
+ rules={{ required: true }}
+ render={({ field: { value, onChange } }) => (
+ <TextField
+ value={value}
+ label='Scope'
+ onChange={onChange}
+ placeholder=''
+ error={Boolean(errors.scope)}
+ />
+ )}
+ />
+ {errors.scope && (
+ <FormHelperText
className={'twc-text-error-main'}>{errors.scope.message}</FormHelperText>
+ )}
+ </FormControl>
+ </Grid>
+ </>
+ )}
<Button fullWidth size='large' type='submit' variant='contained' sx={{
mb: 7, mt: 12 }}>
Login
diff --git a/web/web/src/appOld/login/components/defaultLoginSchema.js
b/web/web/src/appOld/login/components/defaultLoginSchema.js
new file mode 100644
index 0000000000..43874d831f
--- /dev/null
+++ b/web/web/src/appOld/login/components/defaultLoginSchema.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import * as yup from 'yup'
+
+export const DEFAULT_LOGIN_DEFAULT_VALUES = {
+ grant_type: 'client_credentials',
+ client_id: '',
+ client_secret: '',
+ scope: '',
+ username: ''
+}
+
+export function createDefaultLoginSchema({ isSimpleAuth }) {
+ if (isSimpleAuth) {
+ return yup.object().shape({
+ username: yup.string().trim().required('Username is required'),
+ grant_type: yup.string().notRequired(),
+ client_id: yup.string().notRequired(),
+ client_secret: yup.string().notRequired(),
+ scope: yup.string().notRequired()
+ })
+ }
+
+ return yup.object().shape({
+ grant_type: yup.string().required(),
+ client_id: yup.string().required(),
+ client_secret: yup.string().required(),
+ scope: yup.string().required(),
+ username: yup.string().notRequired()
+ })
+}
diff --git a/web/web/src/appOld/login/page.js b/web/web/src/appOld/login/page.js
index f11a499b94..4dfdd93e35 100644
--- a/web/web/src/appOld/login/page.js
+++ b/web/web/src/appOld/login/page.js
@@ -57,7 +57,7 @@ const LoginPage = () => {
<CardContent className='twc-p-12'>
<Box className='twc-mb-8 twc-flex twc-items-center
twc-justify-center'>
<Image
- src={`${process.env.NEXT_PUBLIC_BASE_PATH ??
''}/icons/gravitino.svg`}
+ src={`${process.env.NEXT_PUBLIC_BASE_PATH ??
''}/icons/gravitino_old.svg`}
width={24}
height={24}
alt='Gravitino Logo'
diff --git a/web/web/src/appOld/rootLayout/Logout.js
b/web/web/src/appOld/rootLayout/Logout.js
index 1cca5ee49b..81803be302 100644
--- a/web/web/src/appOld/rootLayout/Logout.js
+++ b/web/web/src/appOld/rootLayout/Logout.js
@@ -22,7 +22,7 @@
import { useRouter } from 'next/navigation'
import { useState, useEffect } from 'react'
-import { Box, IconButton } from '@mui/material'
+import { Box, IconButton, Tooltip } from '@mui/material'
import Icon from '@/components/Icon'
import { useAppDispatch, useAppSelector } from '@/lib/hooks/useStore'
@@ -34,6 +34,8 @@ const LogoutButton = () => {
const dispatch = useAppDispatch()
const authStore = useAppSelector(state => state.auth)
const [showLogoutButton, setShowLogoutButton] = useState(false)
+ const authEnabled = authStore.anthEnable === true || authStore.anthEnable
=== 'true'
+ const userName = authStore.authUser?.name
useEffect(() => {
const checkAuthStatus = async () => {
@@ -68,10 +70,12 @@ const LogoutButton = () => {
return (
<Box>
- {showLogoutButton ? (
- <IconButton onClick={handleLogout}>
- <Icon icon={'bx:exit'} />
- </IconButton>
+ {(authEnabled && userName) || showLogoutButton ? (
+ <Tooltip title={userName || ''} disableHoverListener={!userName}>
+ <IconButton onClick={handleLogout}>
+ <Icon icon={'bx:exit'} />
+ </IconButton>
+ </Tooltip>
) : null}
</Box>
)
diff --git a/web/web/src/lib/store/metalakes/index.js
b/web/web/src/lib/store/metalakes/index.js
index 1d15d59bf8..263c07a2f0 100644
--- a/web/web/src/lib/store/metalakes/index.js
+++ b/web/web/src/lib/store/metalakes/index.js
@@ -1757,7 +1757,31 @@ export const appMetalakesSlice = createSlice({
setTableProps(state, action) {
state.tableProps = action.payload
},
- resetMetalakeStore(state, action) {}
+ resetMetalakeStore(state, action) {
+ state.metalakes = []
+ state.filteredMetalakes = []
+ state.tableData = []
+ state.tableProps = []
+ state.catalogs = []
+ state.schemas = []
+ state.tables = []
+ state.columns = []
+ state.filesets = []
+ state.topics = []
+ state.models = []
+ state.versions = []
+ state.metalakeTree = []
+ state.loadedNodes = []
+ state.selectedNodes = []
+ state.expandedNodes = []
+ state.activatedDetails = null
+ state.activatedDetailsLoading = false
+ state.tableLoading = false
+ state.treeLoading = false
+ state.currentMetalakeOwner = null
+ state.currentEntityTags = []
+ state.currentEntityPolicies = []
+ }
},
extraReducers: builder => {
builder.addCase(fetchMetalakes.fulfilled, (state, action) => {
diff --git a/web/web/src/lib/utils/index.js b/web/web/src/lib/utils/index.js
index 933fa6c4cf..374e11bc29 100644
--- a/web/web/src/lib/utils/index.js
+++ b/web/web/src/lib/utils/index.js
@@ -159,8 +159,8 @@ export const genUpdates = (originalData, newData,
disableUpdate = false) => {
})
}
if (
- getColumnType(originalColumnsMap[key].type) !==
getColumnType(newColumnsMap[key].type) ||
- (ColumnSpesicalType.includes(getColumnType(newColumnsMap[key].type))
&& !disableUpdate)
+ getColumnType(originalColumnsMap[key].type) !==
getColumnType(newColumnsMap[key].type).toLowerCase() ||
+
(ColumnSpesicalType.includes(getColumnType(newColumnsMap[key].type).toLowerCase())
&& !disableUpdate)
) {
updates.push({
'@type': 'updateColumnType',