feat: new editor user permission profile (#4435)

Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com>
Co-authored-by: crazywoola <427733928@qq.com>
This commit is contained in:
Charles Zhou
2024-06-14 07:34:25 -05:00
committed by GitHub
parent cdb6c801c1
commit 8bcc5a36bb
49 changed files with 246 additions and 126 deletions

View File

@@ -28,6 +28,7 @@ const MembersPage = () => {
const RoleMap = {
owner: t('common.members.owner'),
admin: t('common.members.admin'),
editor: t('common.members.editor'),
normal: t('common.members.normal'),
}
const { locale } = useContext(I18n)

View File

@@ -37,6 +37,10 @@ const InviteModal = ({
name: 'normal',
description: t('common.members.normalTip'),
},
{
name: 'editor',
description: t('common.members.editorTip'),
},
{
name: 'admin',
description: t('common.members.adminTip'),
@@ -120,7 +124,7 @@ const InviteModal = ({
<div className='flex flex-row'>
<span
className={cn(
'text-indigo-600 w-8',
'text-indigo-600 mr-2',
'flex items-center',
)}
>
@@ -130,7 +134,7 @@ const InviteModal = ({
<span className={`${selected ? 'font-medium' : 'font-normal'} capitalize block truncate`}>
{t(`common.members.${role.name}`)}
</span>
<span className={`${selected ? 'font-medium' : 'font-normal'} capitalize block truncate`}>
<span className={`${selected ? 'font-medium' : 'font-normal'} capitalize block text-gray-500`}>
{role.description}
</span>
</div>

View File

@@ -36,6 +36,7 @@ const Operation = ({
const RoleMap = {
owner: t('common.members.owner'),
admin: t('common.members.admin'),
editor: t('common.members.editor'),
normal: t('common.members.normal'),
}
const { notify } = useContext(ToastContext)
@@ -98,7 +99,7 @@ const Operation = ({
>
<div className="px-1 py-1">
{
['admin', 'normal'].map(role => (
['admin', 'editor', 'normal'].map(role => (
<Menu.Item key={role}>
<div className={itemClassName} onClick={() => handleUpdateMemberRole(role)}>
{

View File

@@ -47,6 +47,7 @@ import {
} from '@/app/components/base/portal-to-follow-elem'
import { useToastContext } from '@/app/components/base/toast'
import ConfirmCommon from '@/app/components/base/confirm/common'
import { useAppContext } from '@/context/app-context'
type ModelModalProps = {
provider: ModelProvider
@@ -74,7 +75,8 @@ const ModelModal: FC<ModelModalProps> = ({
providerFormSchemaPredefined && provider.custom_configuration.status === CustomConfigurationStatusEnum.active,
currentCustomConfigurationModelFixedFields,
)
const isEditMode = !!formSchemasValue
const { isCurrentWorkspaceManager } = useAppContext()
const isEditMode = !!formSchemasValue && isCurrentWorkspaceManager
const { t } = useTranslation()
const { notify } = useToastContext()
const language = useLanguage()
@@ -344,6 +346,7 @@ const ModelModal: FC<ModelModalProps> = ({
|| filteredRequiredFormSchemas.some(item => value[item.variable] === undefined)
|| (draftConfig?.enabled && (draftConfig?.configs.filter(config => config.enabled).length ?? 0) < 2)
}
>
{t('common.operation.save')}
</Button>

View File

@@ -23,6 +23,7 @@ import Button from '@/app/components/base/button'
import { useProviderContext } from '@/context/provider-context'
import { updateDefaultModel } from '@/service/common'
import { useToastContext } from '@/app/components/base/toast'
import { useAppContext } from '@/context/app-context'
type SystemModelSelectorProps = {
textGenerationDefaultModel: DefaultModelResponse | undefined
@@ -40,6 +41,7 @@ const SystemModel: FC<SystemModelSelectorProps> = ({
}) => {
const { t } = useTranslation()
const { notify } = useToastContext()
const { isCurrentWorkspaceManager } = useAppContext()
const { textGenerationModelList } = useProviderContext()
const updateModelList = useUpdateModelList()
const { data: embeddingModelList } = useModelList(ModelTypeEnum.textEmbedding)
@@ -248,6 +250,7 @@ const SystemModel: FC<SystemModelSelectorProps> = ({
type='primary'
className='!h-8 !text-[13px]'
onClick={handleSave}
disabled={!isCurrentWorkspaceManager}
>
{t('common.operation.save')}
</Button>

View File

@@ -39,7 +39,7 @@ const getKey = (
const AppNav = () => {
const { t } = useTranslation()
const { appId } = useParams()
const { isCurrentWorkspaceManager } = useAppContext()
const { isCurrentWorkspaceEditor } = useAppContext()
const appDetail = useAppStore(state => state.appDetail)
const [showNewAppDialog, setShowNewAppDialog] = useState(false)
const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false)
@@ -71,8 +71,8 @@ const AppNav = () => {
if (appsData) {
const appItems = flatten(appsData?.map(appData => appData.data))
const navItems = appItems.map((app) => {
const link = ((isCurrentWorkspaceManager, app) => {
if (!isCurrentWorkspaceManager) {
const link = ((isCurrentWorkspaceEditor, app) => {
if (!isCurrentWorkspaceEditor) {
return `/app/${app.id}/overview`
}
else {
@@ -81,7 +81,7 @@ const AppNav = () => {
else
return `/app/${app.id}/configuration`
}
})(isCurrentWorkspaceManager, app)
})(isCurrentWorkspaceEditor, app)
return {
id: app.id,
icon: app.icon,
@@ -93,7 +93,7 @@ const AppNav = () => {
})
setNavItems(navItems)
}
}, [appsData, isCurrentWorkspaceManager, setNavItems])
}, [appsData, isCurrentWorkspaceEditor, setNavItems])
// update current app name
useEffect(() => {

View File

@@ -17,7 +17,7 @@ type IAppSelectorProps = {
export default function AppSelector({ appItems, curApp }: IAppSelectorProps) {
const router = useRouter()
const { isCurrentWorkspaceManager } = useAppContext()
const { isCurrentWorkspaceEditor } = useAppContext()
const [showNewAppDialog, setShowNewAppDialog] = useState(false)
const { t } = useTranslation()
@@ -65,7 +65,7 @@ export default function AppSelector({ appItems, curApp }: IAppSelectorProps) {
appItems.map((app: AppDetailResponse) => (
<Menu.Item key={app.id}>
<div className={itemClassName} onClick={() =>
router.push(`/app/${app.id}/${isCurrentWorkspaceManager ? 'configuration' : 'overview'}`)
router.push(`/app/${app.id}/${isCurrentWorkspaceEditor ? 'configuration' : 'overview'}`)
}>
<div className='relative w-6 h-6 mr-2 bg-[#D5F5F6] rounded-[6px]'>
<AppIcon size='tiny' />
@@ -79,7 +79,7 @@ export default function AppSelector({ appItems, curApp }: IAppSelectorProps) {
))
}
</div>)}
{isCurrentWorkspaceManager && <Menu.Item>
{isCurrentWorkspaceEditor && <Menu.Item>
<div className='p-1' onClick={() => setShowNewAppDialog(true)}>
<div
className='flex items-center h-12 rounded-lg cursor-pointer hover:bg-gray-100'

View File

@@ -26,7 +26,7 @@ const navClassName = `
`
const Header = () => {
const { isCurrentWorkspaceManager } = useAppContext()
const { isCurrentWorkspaceEditor } = useAppContext()
const selectedSegment = useSelectedLayoutSegment()
const media = useBreakpoints()
@@ -74,7 +74,7 @@ const Header = () => {
<div className='flex items-center'>
<ExploreNav className={navClassName} />
<AppNav />
{isCurrentWorkspaceManager && <DatasetNav />}
{isCurrentWorkspaceEditor && <DatasetNav />}
<ToolsNav className={navClassName} />
</div>
)}
@@ -93,7 +93,7 @@ const Header = () => {
<div className='w-full flex flex-col p-2 gap-y-1'>
<ExploreNav className={navClassName} />
<AppNav />
{isCurrentWorkspaceManager && <DatasetNav />}
{isCurrentWorkspaceEditor && <DatasetNav />}
<ToolsNav className={navClassName} />
</div>
)}

View File

@@ -34,7 +34,7 @@ export type INavSelectorProps = {
const NavSelector = ({ curNav, navs, createText, isApp, onCreate, onLoadmore }: INavSelectorProps) => {
const { t } = useTranslation()
const router = useRouter()
const { isCurrentWorkspaceManager } = useAppContext()
const { isCurrentWorkspaceEditor } = useAppContext()
const setAppDetail = useAppStore(state => state.setAppDetail)
const handleScroll = useCallback(debounce((e) => {
@@ -122,7 +122,7 @@ const NavSelector = ({ curNav, navs, createText, isApp, onCreate, onLoadmore }:
</div>
</Menu.Button>
)}
{isApp && isCurrentWorkspaceManager && (
{isApp && isCurrentWorkspaceEditor && (
<Menu as="div" className="relative w-full h-full">
{({ open }) => (
<>