mirror of
https://github.com/Funkoala14/KnowledgeBase_OOIN.git
synced 2025-06-08 05:28:16 +08:00
[dev]change permissions
This commit is contained in:
parent
b2df4ebfc8
commit
8f92e25258
@ -61,15 +61,15 @@ const CreateKnowledgeBaseModal = ({
|
||||
if (isAdmin) {
|
||||
return [
|
||||
{ value: 'admin', label: '公共知识库' },
|
||||
{ value: 'leader', label: 'Leader 级知识库' },
|
||||
{ value: 'member', label: 'Member 级知识库' },
|
||||
{ value: 'leader', label: '组长级知识库' },
|
||||
{ value: 'member', label: '组内知识库' },
|
||||
{ value: 'private', label: '私有知识库' },
|
||||
{ value: 'secret', label: '保密知识库' },
|
||||
{ value: 'secret', label: '私密知识库' },
|
||||
];
|
||||
} else if (isLeader) {
|
||||
return [
|
||||
{ value: 'admin', label: '公共知识库' },
|
||||
{ value: 'member', label: 'Member 级知识库' },
|
||||
{ value: 'member', label: '组内知识库' },
|
||||
{ value: 'private', label: '私有知识库' },
|
||||
];
|
||||
} else {
|
||||
@ -180,7 +180,7 @@ const CreateKnowledgeBaseModal = ({
|
||||
</div>
|
||||
|
||||
{/* 仅当不是私有知识库时才显示部门选项 */}
|
||||
{formData.type !== 'private' && (
|
||||
{formData.type === 'member' && (
|
||||
<div className='mb-3'>
|
||||
<label htmlFor='department' className='form-label'>
|
||||
部门 {isAdmin && needSelectGroup && <span className='text-danger'>*</span>}
|
||||
@ -220,7 +220,7 @@ const CreateKnowledgeBaseModal = ({
|
||||
)}
|
||||
|
||||
{/* 仅当不是私有知识库时才显示组别选项 */}
|
||||
{formData.type !== 'private' && (
|
||||
{formData.type === 'member' && (
|
||||
<div className='mb-3'>
|
||||
<label htmlFor='group' className='form-label'>
|
||||
组别 {needSelectGroup && <span className='text-danger'>*</span>}
|
||||
|
@ -89,10 +89,10 @@ export default function SettingsTab({ knowledgeBase }) {
|
||||
allowed = ['admin', 'leader', 'member', 'private', 'secret'].includes(value);
|
||||
} else if (role === 'leader') {
|
||||
// 组长只能选择 member 和 private
|
||||
allowed = ['member', 'private'].includes(value);
|
||||
allowed = ['admin', 'member', 'private'].includes(value);
|
||||
} else {
|
||||
// 普通成员只能选择 private
|
||||
allowed = value === 'private';
|
||||
// 普通成员只能选择公共和private
|
||||
allowed = ['admin', 'private'].includes(value);
|
||||
}
|
||||
|
||||
if (!allowed) {
|
||||
@ -299,6 +299,7 @@ export default function SettingsTab({ knowledgeBase }) {
|
||||
})
|
||||
);
|
||||
// Navigate back to knowledge base list
|
||||
// Redux store 已在 reducer 中更新,不需要重新调用接口获取知识库列表
|
||||
navigate('/knowledge-base');
|
||||
})
|
||||
.catch((error) => {
|
||||
|
@ -27,15 +27,15 @@ const KnowledgeBaseForm = ({
|
||||
if (isAdmin) {
|
||||
return [
|
||||
{ value: 'admin', label: '公共知识库' },
|
||||
{ value: 'leader', label: 'Leader 级知识库' },
|
||||
{ value: 'member', label: 'Member 级知识库' },
|
||||
{ value: 'leader', label: '组长级知识库' },
|
||||
{ value: 'member', label: '组内知识库' },
|
||||
{ value: 'private', label: '私有知识库' },
|
||||
{ value: 'secret', label: '保密知识库' },
|
||||
{ value: 'secret', label: '私密知识库' },
|
||||
];
|
||||
} else if (isLeader) {
|
||||
return [
|
||||
{ value: 'admin', label: '公共知识库' },
|
||||
{ value: 'member', label: 'Member 级知识库' },
|
||||
{ value: 'member', label: '组内知识库' },
|
||||
{ value: 'private', label: '私有知识库' },
|
||||
];
|
||||
} else {
|
||||
@ -125,7 +125,7 @@ const KnowledgeBaseForm = ({
|
||||
</div>
|
||||
|
||||
{/* 仅当不是私有知识库时才显示部门选项 */}
|
||||
{formData.type !== 'private' && (
|
||||
{formData.type === 'member' && (
|
||||
<div className='mb-3'>
|
||||
<label htmlFor='department' className='form-label'>
|
||||
部门 {isAdmin && <span className='text-danger'>*</span>}
|
||||
@ -161,14 +161,13 @@ const KnowledgeBaseForm = ({
|
||||
value={formData.department || ''}
|
||||
readOnly
|
||||
/>
|
||||
<small className='text-muted'>部门信息根据知识库创建者自动填写</small>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 仅当不是私有知识库时才显示组别选项 */}
|
||||
{formData.type !== 'private' && (
|
||||
{formData.type === 'member' && (
|
||||
<div className='mb-3'>
|
||||
<label htmlFor='group' className='form-label'>
|
||||
组别 {isAdmin && <span className='text-danger'>*</span>}
|
||||
@ -205,7 +204,6 @@ const KnowledgeBaseForm = ({
|
||||
value={formData.group || ''}
|
||||
readOnly
|
||||
/>
|
||||
<small className='text-muted'>组别信息根据知识库创建者自动填写</small>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
@ -108,6 +108,7 @@ export default function KnowledgeBase() {
|
||||
// Handle search input change
|
||||
const handleSearchInputChange = (e) => {
|
||||
const value = e.target.value;
|
||||
console.log('搜索框输入值:', value);
|
||||
setSearchKeyword(value);
|
||||
|
||||
// 如果搜索框清空,关闭下拉框
|
||||
@ -206,10 +207,10 @@ export default function KnowledgeBase() {
|
||||
allowed = ['admin', 'leader', 'member', 'private', 'secret'].includes(value);
|
||||
} else if (role === 'leader') {
|
||||
// 组长只能选择 member 和 private
|
||||
allowed = ['member', 'private'].includes(value);
|
||||
allowed = ['admin', 'member', 'private'].includes(value);
|
||||
} else {
|
||||
// 普通成员只能选择 private
|
||||
allowed = value === 'private';
|
||||
allowed = ['admin', 'private'].includes(value);
|
||||
}
|
||||
|
||||
if (!allowed) {
|
||||
@ -401,6 +402,7 @@ export default function KnowledgeBase() {
|
||||
const handleDelete = (e, id) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
// Dispatch delete knowledge base action
|
||||
dispatch(deleteKnowledgeBase(id))
|
||||
.unwrap()
|
||||
@ -411,6 +413,7 @@ export default function KnowledgeBase() {
|
||||
type: 'success',
|
||||
})
|
||||
);
|
||||
// 不需要重新获取知识库列表,Redux store 已经在 reducer 中更新
|
||||
})
|
||||
.catch((error) => {
|
||||
dispatch(
|
||||
|
@ -94,13 +94,14 @@ export default function KnowledgeCard({
|
||||
</span>
|
||||
)}
|
||||
{access === 'full' || access === 'read' ? (
|
||||
<button
|
||||
className='btn btn-outline-dark btn-sm d-flex align-items-center gap-1'
|
||||
onClick={handleNewChat}
|
||||
>
|
||||
<SvgIcon className={'chat-dot'} />
|
||||
新聊天
|
||||
</button>
|
||||
<></>
|
||||
// <button
|
||||
// className='btn btn-outline-dark btn-sm d-flex align-items-center gap-1'
|
||||
// onClick={handleNewChat}
|
||||
// >
|
||||
// <SvgIcon className={'chat-dot'} />
|
||||
// 新聊天
|
||||
// </button>
|
||||
) : (
|
||||
<button
|
||||
className='btn btn-outline-dark btn-sm d-flex align-items-center gap-1'
|
||||
|
@ -222,6 +222,24 @@ export default function PendingRequests() {
|
||||
}
|
||||
};
|
||||
|
||||
// 获取知识库类型的中文描述
|
||||
const getKnowledgeBaseTypeText = (type) => {
|
||||
switch (type) {
|
||||
case 'admin':
|
||||
return '公共知识库';
|
||||
case 'member':
|
||||
return '组内知识库';
|
||||
case 'private':
|
||||
return '私人知识库';
|
||||
case 'leader':
|
||||
return '组长级知识库';
|
||||
case 'secret':
|
||||
return '私密知识库';
|
||||
default:
|
||||
return '未知类型';
|
||||
}
|
||||
};
|
||||
|
||||
// 渲染加载状态
|
||||
if (fetchStatus === 'loading' && permissionRequests.length === 0) {
|
||||
return (
|
||||
@ -275,7 +293,13 @@ export default function PendingRequests() {
|
||||
|
||||
<div className='request-content'>
|
||||
<div className='d-flex justify-content-between align-items-start mb-2'>
|
||||
<div>
|
||||
<p className='mb-0'>申请访问:{request.knowledge_base.name}</p>
|
||||
<small className='text-muted'>
|
||||
类型:{getKnowledgeBaseTypeText(request.knowledge_base.type)}
|
||||
</small>
|
||||
</div>
|
||||
{renderStatusBadge(request.status)}
|
||||
</div>
|
||||
|
||||
{request.permissions.can_edit ? (
|
||||
|
@ -21,6 +21,24 @@ export default function RequestDetailSlideOver({
|
||||
const knowledgeBaseId = request.knowledge_base?.id || '';
|
||||
const knowledgeBaseType = request.knowledge_base?.type || '';
|
||||
|
||||
// 获取知识库类型的中文描述
|
||||
const getKnowledgeBaseTypeText = (type) => {
|
||||
switch (type) {
|
||||
case 'admin':
|
||||
return '公共知识库';
|
||||
case 'member':
|
||||
return '组内知识库';
|
||||
case 'private':
|
||||
return '私人知识库';
|
||||
case 'leader':
|
||||
return '组长级知识库';
|
||||
case 'secret':
|
||||
return '私密知识库';
|
||||
default:
|
||||
return '未知类型';
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className={`slide-over-backdrop ${show ? 'show' : ''}`} onClick={onClose}></div>
|
||||
@ -52,7 +70,7 @@ export default function RequestDetailSlideOver({
|
||||
</p>
|
||||
{knowledgeBaseType && (
|
||||
<p className='mb-1'>
|
||||
<strong>类型:</strong> {knowledgeBaseType}
|
||||
<strong>类型:</strong> {getKnowledgeBaseTypeText(knowledgeBaseType)}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@ -112,7 +130,8 @@ export default function RequestDetailSlideOver({
|
||||
<div className='mb-4'>
|
||||
<h6 className='text-muted mb-2'>审批人</h6>
|
||||
<p className='mb-1'>
|
||||
{request.approver.name || request.approver.username} ({request.approver.department || '未分配部门'})
|
||||
{request.approver.name || request.approver.username} (
|
||||
{request.approver.department || '未分配部门'})
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
@ -126,9 +145,7 @@ export default function RequestDetailSlideOver({
|
||||
|
||||
<div className='mb-4'>
|
||||
<h6 className='text-muted mb-2'>申请理由</h6>
|
||||
<div className='p-3 bg-light rounded'>
|
||||
{request.reason || '无申请理由'}
|
||||
</div>
|
||||
<div className='p-3 bg-light rounded'>{request.reason || '无申请理由'}</div>
|
||||
</div>
|
||||
</div>
|
||||
{request.status === 'pending' && (
|
||||
|
@ -104,7 +104,12 @@ const knowledgeBaseSlice = createSlice({
|
||||
})
|
||||
.addCase(deleteKnowledgeBase.fulfilled, (state, action) => {
|
||||
state.loading = false;
|
||||
state.knowledgeBases = state.knowledgeBases.filter((kb) => kb.id !== action.meta.arg.knowledgeBaseId);
|
||||
const deletedId = action.payload;
|
||||
state.knowledgeBases = state.knowledgeBases.filter((kb) => kb.id !== deletedId);
|
||||
if (state.pagination.total > 0) {
|
||||
state.pagination.total -= 1;
|
||||
state.pagination.total_pages = Math.ceil(state.pagination.total / state.pagination.page_size);
|
||||
}
|
||||
})
|
||||
.addCase(deleteKnowledgeBase.rejected, (state, action) => {
|
||||
state.loading = false;
|
||||
|
Loading…
Reference in New Issue
Block a user