fix(系统设置): 项目组&组织&项目&权限 bug 修改
This commit is contained in:
parent
e34be8e23d
commit
254b29f373
|
@ -23,7 +23,7 @@
|
||||||
import { setFavicon, watchStyle, watchTheme } from '@/utils/theme';
|
import { setFavicon, watchStyle, watchTheme } from '@/utils/theme';
|
||||||
|
|
||||||
import { getPublicKeyRequest } from './api/modules/user';
|
import { getPublicKeyRequest } from './api/modules/user';
|
||||||
import { WorkbenchRouteEnum } from './enums/routeEnum';
|
import { getFirstRouteNameByPermission } from './utils/permission';
|
||||||
import enUS from '@arco-design/web-vue/es/locale/lang/en-us';
|
import enUS from '@arco-design/web-vue/es/locale/lang/en-us';
|
||||||
import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn';
|
import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn';
|
||||||
|
|
||||||
|
@ -91,7 +91,8 @@
|
||||||
}
|
}
|
||||||
if (isLoginPage && isLogin) {
|
if (isLoginPage && isLogin) {
|
||||||
// 当前页面为登录页面,且已经登录,跳转到首页
|
// 当前页面为登录页面,且已经登录,跳转到首页
|
||||||
router.push(WorkbenchRouteEnum.WORKBENCH);
|
const currentRouteName = getFirstRouteNameByPermission(router.getRoutes());
|
||||||
|
router.push({ name: currentRouteName });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// 获取公钥
|
// 获取公钥
|
||||||
|
|
|
@ -36,13 +36,13 @@
|
||||||
{{ t('system.userGroup.systemUserGroup') }}
|
{{ t('system.userGroup.systemUserGroup') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<MsMoreAction
|
|
||||||
|
<icon-plus-circle-fill
|
||||||
v-permission="['SYSTEM_USER_ROLE:READ+ADD']"
|
v-permission="['SYSTEM_USER_ROLE:READ+ADD']"
|
||||||
:list="createSystemUGActionItem"
|
class="cursor-pointer text-[rgb(var(--primary-7))]"
|
||||||
@select="handleCreateUG(AuthScopeEnum.SYSTEM)"
|
size="20"
|
||||||
>
|
@click="handleCreateUG(AuthScopeEnum.SYSTEM)"
|
||||||
<icon-plus-circle-fill class="cursor-pointer text-[rgb(var(--primary-7))]" size="20" />
|
/>
|
||||||
</MsMoreAction>
|
|
||||||
</div>
|
</div>
|
||||||
</CreateUserGroupPopup>
|
</CreateUserGroupPopup>
|
||||||
<Transition>
|
<Transition>
|
||||||
|
@ -123,13 +123,13 @@
|
||||||
{{ t('system.userGroup.orgUserGroup') }}
|
{{ t('system.userGroup.orgUserGroup') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<MsMoreAction
|
|
||||||
|
<icon-plus-circle-fill
|
||||||
v-permission="['ORGANIZATION_USER_ROLE:READ+ADD']"
|
v-permission="['ORGANIZATION_USER_ROLE:READ+ADD']"
|
||||||
:list="createOrgUGActionItem"
|
class="cursor-pointer text-[rgb(var(--primary-7))]"
|
||||||
@select="orgUserGroupVisible = true"
|
size="20"
|
||||||
>
|
@click="orgUserGroupVisible = true"
|
||||||
<icon-plus-circle-fill class="cursor-pointer text-[rgb(var(--primary-7))]" size="20" />
|
/>
|
||||||
</MsMoreAction>
|
|
||||||
</div>
|
</div>
|
||||||
</CreateUserGroupPopup>
|
</CreateUserGroupPopup>
|
||||||
<Transition>
|
<Transition>
|
||||||
|
@ -211,13 +211,13 @@
|
||||||
{{ t('system.userGroup.projectUserGroup') }}
|
{{ t('system.userGroup.projectUserGroup') }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<MsMoreAction
|
|
||||||
|
<icon-plus-circle-fill
|
||||||
v-permission="['PROJECT_GROUP:READ+ADD']"
|
v-permission="['PROJECT_GROUP:READ+ADD']"
|
||||||
:list="createProjectUGActionItem"
|
class="cursor-pointer text-[rgb(var(--primary-7))]"
|
||||||
@select="projectUserGroupVisible = true"
|
size="20"
|
||||||
>
|
@click="projectUserGroupVisible = true"
|
||||||
<icon-plus-circle-fill class="cursor-pointer text-[rgb(var(--primary-7))]" size="20" />
|
/>
|
||||||
</MsMoreAction>
|
|
||||||
</div>
|
</div>
|
||||||
</CreateUserGroupPopup>
|
</CreateUserGroupPopup>
|
||||||
<Transition>
|
<Transition>
|
||||||
|
@ -353,32 +353,8 @@
|
||||||
return userGroupList.value.filter((ele) => ele.type === AuthScopeEnum.PROJECT);
|
return userGroupList.value.filter((ele) => ele.type === AuthScopeEnum.PROJECT);
|
||||||
});
|
});
|
||||||
|
|
||||||
const createSystemUGActionItem: ActionsItem[] = [
|
|
||||||
{ label: 'system.userGroup.addSysUserGroup', eventTag: 'createUserGroup' },
|
|
||||||
];
|
|
||||||
const createOrgUGActionItem: ActionsItem[] = [
|
|
||||||
{ label: 'system.userGroup.addOrgUserGroup', eventTag: 'createUserGroup' },
|
|
||||||
];
|
|
||||||
const createProjectUGActionItem: ActionsItem[] = [
|
|
||||||
{ label: 'system.userGroup.addProjectUserGroup', eventTag: 'createUserGroup' },
|
|
||||||
];
|
|
||||||
|
|
||||||
const addMemberActionItem: ActionsItem[] = [{ label: 'system.userGroup.addMember', eventTag: 'addMember' }];
|
const addMemberActionItem: ActionsItem[] = [{ label: 'system.userGroup.addMember', eventTag: 'addMember' }];
|
||||||
const moreAction: ActionsItem[] = [
|
|
||||||
{
|
|
||||||
label: 'system.userGroup.rename',
|
|
||||||
danger: false,
|
|
||||||
eventTag: 'rename',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
isDivider: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'system.userGroup.delete',
|
|
||||||
danger: true,
|
|
||||||
eventTag: 'delete',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const systemMoreAction: ActionsItem[] = [
|
const systemMoreAction: ActionsItem[] = [
|
||||||
{
|
{
|
||||||
label: 'system.userGroup.rename',
|
label: 'system.userGroup.rename',
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
</template>
|
</template>
|
||||||
<template v-if="hasAnyPermission(props.updatePermission || [])" #action="{ record }">
|
<template v-if="hasAnyPermission(props.updatePermission || [])" #action="{ record }">
|
||||||
<MsRemoveButton
|
<MsRemoveButton
|
||||||
:title="t('system.userGroup.removeName', { name: record.name })"
|
:title="t('system.userGroup.removeName', { name: characterLimit(record.name) })"
|
||||||
:sub-title-tip="t('system.userGroup.removeTip')"
|
:sub-title-tip="t('system.userGroup.removeTip')"
|
||||||
@ok="handleRemove(record)"
|
@ok="handleRemove(record)"
|
||||||
/>
|
/>
|
||||||
|
@ -32,6 +32,7 @@
|
||||||
} from '@/api/modules/setting/usergroup';
|
} from '@/api/modules/setting/usergroup';
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import { useAppStore } from '@/store';
|
import { useAppStore } from '@/store';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
import { hasAnyPermission } from '@/utils/permission';
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { CurrentUserGroupItem, UserTableItem } from '@/models/setting/usergroup';
|
import { CurrentUserGroupItem, UserTableItem } from '@/models/setting/usergroup';
|
||||||
|
|
|
@ -430,6 +430,9 @@
|
||||||
editActiveKey.value = '';
|
editActiveKey.value = '';
|
||||||
currentEditValue.value = '';
|
currentEditValue.value = '';
|
||||||
} else {
|
} else {
|
||||||
|
if (!record[dataIndex]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 触发的是Enter
|
// 触发的是Enter
|
||||||
emit('rowNameChange', record, (v: boolean) => {
|
emit('rowNameChange', record, (v: boolean) => {
|
||||||
if (!v) {
|
if (!v) {
|
||||||
|
|
|
@ -82,6 +82,7 @@ export default function useTableStore() {
|
||||||
// 初始化过了,但是可能有新变动,如列的顺序,列的显示隐藏,列的拖拽
|
// 初始化过了,但是可能有新变动,如列的顺序,列的显示隐藏,列的拖拽
|
||||||
column = columnsTransform(column);
|
column = columnsTransform(column);
|
||||||
const { columnBackup: oldColumn } = selectorColumnMap[tableKey];
|
const { columnBackup: oldColumn } = selectorColumnMap[tableKey];
|
||||||
|
// 比较页面上定义的 column 和 浏览器备份的column 是否相同
|
||||||
const isEqual = isArraysEqualWithOrder<MsTableColumnData>(oldColumn, column);
|
const isEqual = isArraysEqualWithOrder<MsTableColumnData>(oldColumn, column);
|
||||||
if (!isEqual) {
|
if (!isEqual) {
|
||||||
// 如果不相等,说明有变动将新的column存入indexDB
|
// 如果不相等,说明有变动将新的column存入indexDB
|
||||||
|
@ -129,7 +130,7 @@ export default function useTableStore() {
|
||||||
selectorColumnMap[key] = {
|
selectorColumnMap[key] = {
|
||||||
mode,
|
mode,
|
||||||
column: JSON.parse(JSON.stringify(columns)),
|
column: JSON.parse(JSON.stringify(columns)),
|
||||||
columnBackup: JSON.parse(JSON.stringify(columns)),
|
columnBackup: selectorColumnMap[key].columnBackup,
|
||||||
};
|
};
|
||||||
await localforage.setItem('selectorColumnMap', selectorColumnMap);
|
await localforage.setItem('selectorColumnMap', selectorColumnMap);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { WorkbenchRouteEnum } from '@/enums/routeEnum';
|
// import { WorkbenchRouteEnum } from '@/enums/routeEnum';
|
||||||
|
|
||||||
import { DEFAULT_LAYOUT } from '../base';
|
// import { DEFAULT_LAYOUT } from '../base';
|
||||||
import type { AppRouteRecordRaw } from '../types';
|
// import type { AppRouteRecordRaw } from '../types';
|
||||||
|
|
||||||
// const Workbench: AppRouteRecordRaw = {
|
// const Workbench: AppRouteRecordRaw = {
|
||||||
// path: '/workbench',
|
// path: '/workbench',
|
||||||
|
@ -28,3 +28,4 @@ import type { AppRouteRecordRaw } from '../types';
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// export default Workbench;
|
// export default Workbench;
|
||||||
|
export default {};
|
||||||
|
|
|
@ -135,6 +135,7 @@
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import { useAppStore } from '@/store';
|
import { useAppStore } from '@/store';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
import { hasAnyPermission } from '@/utils/permission';
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { CurrentUserGroupItem, UserGroupItem } from '@/models/setting/usergroup';
|
import { CurrentUserGroupItem, UserGroupItem } from '@/models/setting/usergroup';
|
||||||
|
@ -245,7 +246,7 @@
|
||||||
|
|
||||||
const handleDelete = (record: UserGroupItem) => {
|
const handleDelete = (record: UserGroupItem) => {
|
||||||
openDeleteModal({
|
openDeleteModal({
|
||||||
title: t('project.userGroup.deleteName', { name: record.name }),
|
title: t('project.userGroup.deleteName', { name: characterLimit(record.name) }),
|
||||||
content: t('project.userGroup.deleteTip'),
|
content: t('project.userGroup.deleteTip'),
|
||||||
onBeforeOk: async () => {
|
onBeforeOk: async () => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
</template>
|
</template>
|
||||||
<template #operation="{ record }">
|
<template #operation="{ record }">
|
||||||
<MsRemoveButton
|
<MsRemoveButton
|
||||||
:title="t('system.organization.removeName', { name: record.name })"
|
:title="t('system.organization.removeName', { name: characterLimit(record.name) })"
|
||||||
:sub-title-tip="t('system.organization.removeTip')"
|
:sub-title-tip="t('system.organization.removeTip')"
|
||||||
@ok="handleRemove(record)"
|
@ok="handleRemove(record)"
|
||||||
/>
|
/>
|
||||||
|
@ -61,6 +61,7 @@
|
||||||
|
|
||||||
import { deleteUserFromUserGroup, postUserByUserGroup } from '@/api/modules/project-management/usergroup';
|
import { deleteUserFromUserGroup, postUserByUserGroup } from '@/api/modules/project-management/usergroup';
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
|
|
||||||
export interface projectDrawerProps {
|
export interface projectDrawerProps {
|
||||||
visible: boolean;
|
visible: boolean;
|
||||||
|
@ -155,6 +156,7 @@
|
||||||
(visible) => {
|
(visible) => {
|
||||||
currentVisible.value = visible;
|
currentVisible.value = visible;
|
||||||
if (visible) {
|
if (visible) {
|
||||||
|
setKeyword(keyword.value);
|
||||||
fetchData();
|
fetchData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,8 @@ export default {
|
||||||
'system.organization.organizationAdminPlaceholder':
|
'system.organization.organizationAdminPlaceholder':
|
||||||
'The organization administrator defaults to the person who created the organization',
|
'The organization administrator defaults to the person who created the organization',
|
||||||
'system.organization.description': 'Description',
|
'system.organization.description': 'Description',
|
||||||
|
'system.project.affiliatedOrgExtra':
|
||||||
|
'After selecting an organization, prompt the user to confirm the selected organization. After the project is successfully created, the organization cannot be changed',
|
||||||
'system.organization.descriptionPlaceholder': 'Please describe the organization',
|
'system.organization.descriptionPlaceholder': 'Please describe the organization',
|
||||||
'system.organization.ID': 'ID',
|
'system.organization.ID': 'ID',
|
||||||
'system.organization.name': 'Name',
|
'system.organization.name': 'Name',
|
||||||
|
|
|
@ -21,7 +21,8 @@ export default {
|
||||||
'system.organization.organizationAdmin': '组织管理员',
|
'system.organization.organizationAdmin': '组织管理员',
|
||||||
'system.organization.organizationAdminPlaceholder': '默认选择创建组织人为组织管理员',
|
'system.organization.organizationAdminPlaceholder': '默认选择创建组织人为组织管理员',
|
||||||
'system.organization.description': '描述',
|
'system.organization.description': '描述',
|
||||||
'system.organization.descriptionPlaceholder': '请对组织进行描述',
|
'system.organization.descriptionPlaceholder': '请对该组织进行描述',
|
||||||
|
'system.project.affiliatedOrgExtra': '选择组织后提示用户确认所选组织,项目创建成功后组织不可变更',
|
||||||
'system.organization.ID': 'ID',
|
'system.organization.ID': 'ID',
|
||||||
'system.organization.name': '名称',
|
'system.organization.name': '名称',
|
||||||
'system.organization.member': '成员',
|
'system.organization.member': '成员',
|
||||||
|
|
|
@ -112,6 +112,7 @@
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import { useAppStore, useTableStore } from '@/store';
|
import { useAppStore, useTableStore } from '@/store';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
import { hasAnyPermission } from '@/utils/permission';
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { UserItem } from '@/models/setting/log';
|
import { UserItem } from '@/models/setting/log';
|
||||||
|
@ -251,7 +252,7 @@
|
||||||
|
|
||||||
const handleDelete = (record: TableData) => {
|
const handleDelete = (record: TableData) => {
|
||||||
openDeleteModal({
|
openDeleteModal({
|
||||||
title: t('system.organization.deleteName', { name: record.name }),
|
title: t('system.organization.deleteName', { name: characterLimit(record.name) }),
|
||||||
content: t('system.organization.deleteTip'),
|
content: t('system.organization.deleteTip'),
|
||||||
onBeforeOk: async () => {
|
onBeforeOk: async () => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -25,7 +25,11 @@
|
||||||
:label="t('system.organization.organizationName')"
|
:label="t('system.organization.organizationName')"
|
||||||
:rules="[{ required: true, message: t('system.organization.organizationNameRequired') }]"
|
:rules="[{ required: true, message: t('system.organization.organizationNameRequired') }]"
|
||||||
>
|
>
|
||||||
<a-input v-model="form.name" :placeholder="t('system.organization.organizationNamePlaceholder')" />
|
<a-input
|
||||||
|
v-model="form.name"
|
||||||
|
allow-clear
|
||||||
|
:placeholder="t('system.organization.organizationNamePlaceholder')"
|
||||||
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item field="name" :label="t('system.organization.organizationAdmin')">
|
<a-form-item field="name" :label="t('system.organization.organizationAdmin')">
|
||||||
<MsUserSelector
|
<MsUserSelector
|
||||||
|
@ -35,7 +39,13 @@
|
||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item field="description" :label="t('system.organization.description')">
|
<a-form-item field="description" :label="t('system.organization.description')">
|
||||||
<a-input v-model="form.description" :placeholder="t('system.organization.descriptionPlaceholder')" />
|
<a-textarea
|
||||||
|
v-model="form.description"
|
||||||
|
allow-clear
|
||||||
|
:placeholder="t('system.organization.descriptionPlaceholder')"
|
||||||
|
:auto-size="{ minRows: 1 }"
|
||||||
|
style="resize: vertical"
|
||||||
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-form>
|
</a-form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
:options="affiliatedOrgOption"
|
:options="affiliatedOrgOption"
|
||||||
:placeholder="t('system.project.affiliatedOrgPlaceholder')"
|
:placeholder="t('system.project.affiliatedOrgPlaceholder')"
|
||||||
:field-names="{ label: 'name', value: 'id' }"
|
:field-names="{ label: 'name', value: 'id' }"
|
||||||
|
:extra="t('system.project.affiliatedOrgExtra')"
|
||||||
>
|
>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
|
@ -20,7 +20,14 @@
|
||||||
@press-enter="searchUser"
|
@press-enter="searchUser"
|
||||||
></a-input-search>
|
></a-input-search>
|
||||||
</div>
|
</div>
|
||||||
<ms-base-table v-bind="propsRes" v-on="propsEvent" />
|
<ms-base-table v-bind="propsRes" v-on="propsEvent">
|
||||||
|
<template #num="{ record }">
|
||||||
|
<a-tooltip v-if="!record.enable" position="tl" :content="t('system.organization.projectIsDisabled')">
|
||||||
|
<div>{{ record.num }}</div>
|
||||||
|
</a-tooltip>
|
||||||
|
<span v-else>{{ record.num }}</span>
|
||||||
|
</template>
|
||||||
|
</ms-base-table>
|
||||||
</div>
|
</div>
|
||||||
</ms-drawer>
|
</ms-drawer>
|
||||||
</template>
|
</template>
|
||||||
|
@ -54,6 +61,7 @@
|
||||||
{
|
{
|
||||||
title: 'system.organization.ID',
|
title: 'system.organization.ID',
|
||||||
dataIndex: 'num',
|
dataIndex: 'num',
|
||||||
|
slotName: 'num',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'system.project.name',
|
title: 'system.project.name',
|
||||||
|
@ -62,6 +70,7 @@
|
||||||
{
|
{
|
||||||
title: 'system.organization.status',
|
title: 'system.organization.status',
|
||||||
dataIndex: 'enable',
|
dataIndex: 'enable',
|
||||||
|
disableTitle: 'common.end',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'system.organization.creator',
|
title: 'system.organization.creator',
|
||||||
|
@ -70,6 +79,11 @@
|
||||||
{
|
{
|
||||||
title: 'system.organization.createTime',
|
title: 'system.organization.createTime',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
|
width: 180,
|
||||||
|
sortable: {
|
||||||
|
sortDirections: ['ascend', 'descend'],
|
||||||
|
sorter: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
<a-tooltip background-color="#FFFFFF">
|
<a-tooltip background-color="#FFFFFF">
|
||||||
<template #content>
|
<template #content>
|
||||||
<span>
|
<span>
|
||||||
<span class="text-[var(--color-text-1)]">{{ t('system.organization.revokeDeleteToolTip') }}</span>
|
<span class="text-[var(--color-text-1)]">{{
|
||||||
|
t('system.organization.revokeDeleteToolTip', { count: record.remainDayCount })
|
||||||
|
}}</span>
|
||||||
<MsButton
|
<MsButton
|
||||||
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+RECOVER']"
|
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+RECOVER']"
|
||||||
class="ml-[8px]"
|
class="ml-[8px]"
|
||||||
|
@ -87,7 +89,7 @@
|
||||||
<UserDrawer v-bind="currentUserDrawer" @request-fetch-data="fetchData" @cancel="handleUserDrawerCancel" />
|
<UserDrawer v-bind="currentUserDrawer" @request-fetch-data="fetchData" @cancel="handleUserDrawerCancel" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup async>
|
||||||
import { reactive, ref } from 'vue';
|
import { reactive, ref } from 'vue';
|
||||||
import { Message, TableData } from '@arco-design/web-vue';
|
import { Message, TableData } from '@arco-design/web-vue';
|
||||||
|
|
||||||
|
@ -114,6 +116,7 @@
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import { useTableStore } from '@/store';
|
import { useTableStore } from '@/store';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
import { hasAnyPermission } from '@/utils/permission';
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { CreateOrUpdateSystemOrgParams, OrgProjectTableItem } from '@/models/setting/system/orgAndProject';
|
import { CreateOrUpdateSystemOrgParams, OrgProjectTableItem } from '@/models/setting/system/orgAndProject';
|
||||||
|
@ -183,6 +186,10 @@
|
||||||
title: 'system.organization.createTime',
|
title: 'system.organization.createTime',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
width: 180,
|
width: 180,
|
||||||
|
sortable: {
|
||||||
|
sortDirections: ['ascend', 'descend'],
|
||||||
|
sorter: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: hasOperationPermission.value ? 'system.organization.operation' : '',
|
title: hasOperationPermission.value ? 'system.organization.operation' : '',
|
||||||
|
@ -243,7 +250,7 @@
|
||||||
|
|
||||||
const handleDelete = (record: TableData) => {
|
const handleDelete = (record: TableData) => {
|
||||||
openDeleteModal({
|
openDeleteModal({
|
||||||
title: t('system.organization.deleteName', { name: record.name }),
|
title: t('system.organization.deleteName', { name: characterLimit(record.name) }),
|
||||||
content: t('system.organization.deleteTip'),
|
content: t('system.organization.deleteTip'),
|
||||||
onBeforeOk: async () => {
|
onBeforeOk: async () => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
<a-tooltip background-color="#FFFFFF">
|
<a-tooltip background-color="#FFFFFF">
|
||||||
<template #content>
|
<template #content>
|
||||||
<span>
|
<span>
|
||||||
<span class="text-[var(--color-text-1)]">{{ t('system.project.revokeDeleteToolTip') }}</span>
|
<span class="text-[var(--color-text-1)]">{{
|
||||||
|
t('system.project.revokeDeleteToolTip', { count: record.remainDayCount })
|
||||||
|
}}</span>
|
||||||
<MsButton
|
<MsButton
|
||||||
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+RECOVER']"
|
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+RECOVER']"
|
||||||
class="ml-[8px]"
|
class="ml-[8px]"
|
||||||
|
@ -104,6 +106,7 @@
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import { useTableStore } from '@/store';
|
import { useTableStore } from '@/store';
|
||||||
|
import { characterLimit } from '@/utils';
|
||||||
import { hasAnyPermission } from '@/utils/permission';
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { UserItem } from '@/models/setting/log';
|
import { UserItem } from '@/models/setting/log';
|
||||||
|
@ -234,7 +237,7 @@
|
||||||
|
|
||||||
const handleDelete = (record: TableData) => {
|
const handleDelete = (record: TableData) => {
|
||||||
openDeleteModal({
|
openDeleteModal({
|
||||||
title: t('system.organization.deleteName', { name: record.name }),
|
title: t('system.organization.deleteName', { name: characterLimit(record.name) }),
|
||||||
content: t('system.organization.deleteTip'),
|
content: t('system.organization.deleteTip'),
|
||||||
onBeforeOk: async () => {
|
onBeforeOk: async () => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
</a-button>
|
</a-button>
|
||||||
<a-input-search
|
<a-input-search
|
||||||
v-model:model-value="keyword"
|
v-model:model-value="keyword"
|
||||||
:placeholder="t('system.user.searchUser')"
|
:placeholder="t('system.organization.searchUserPlaceholder')"
|
||||||
class="w-[230px]"
|
class="w-[230px]"
|
||||||
allow-clear
|
allow-clear
|
||||||
@search="searchUser"
|
@search="searchUser"
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<div class="mb-4 flex items-center justify-between">
|
<div class="mb-4 flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<a-button
|
<a-button
|
||||||
|
v-if="currentTable !== 'organization' || licenseStore.hasLicense()"
|
||||||
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+ADD']"
|
v-permission="['SYSTEM_ORGANIZATION_PROJECT:READ+ADD']"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handleAddOrganization"
|
@click="handleAddOrganization"
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<a-input-search
|
<a-input-search
|
||||||
v-model="keyword"
|
v-model="keyword"
|
||||||
:placeholder="t('system.user.searchUser')"
|
:placeholder="t('system.organization.searchIndexPlaceholder')"
|
||||||
class="w-[240px]"
|
class="w-[240px]"
|
||||||
allow-clear
|
allow-clear
|
||||||
@press-enter="handleEnter"
|
@press-enter="handleEnter"
|
||||||
|
@ -53,6 +54,7 @@
|
||||||
|
|
||||||
import { getOrgAndProjectCount } from '@/api/modules/setting/organizationAndProject';
|
import { getOrgAndProjectCount } from '@/api/modules/setting/organizationAndProject';
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
import useLicenseStore from '@/store/modules/setting/license';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const currentTable = ref('organization');
|
const currentTable = ref('organization');
|
||||||
|
@ -64,6 +66,7 @@
|
||||||
const orgTableRef = ref();
|
const orgTableRef = ref();
|
||||||
const projectTableRef = ref();
|
const projectTableRef = ref();
|
||||||
const projectVisible = ref(false);
|
const projectVisible = ref(false);
|
||||||
|
const licenseStore = useLicenseStore();
|
||||||
|
|
||||||
// 初始化项目数量和组织数量
|
// 初始化项目数量和组织数量
|
||||||
const initOrgAndProjectCount = async () => {
|
const initOrgAndProjectCount = async () => {
|
||||||
|
|
|
@ -44,7 +44,7 @@ export default {
|
||||||
'system.organization.deleteName': 'Are you sure to delete {name}',
|
'system.organization.deleteName': 'Are you sure to delete {name}',
|
||||||
'system.organization.deleteTip':
|
'system.organization.deleteTip':
|
||||||
'Delete the organization and delete the project data under that organization together. Please be cautious!',
|
'Delete the organization and delete the project data under that organization together. Please be cautious!',
|
||||||
'system.organization.revokeDeleteToolTip': 'The organization will be deleted automatically after 30 days',
|
'system.organization.revokeDeleteToolTip': 'The organization will be deleted automatically after {count} days',
|
||||||
'system.organization.createOrganizationSuccess': 'Create organization success',
|
'system.organization.createOrganizationSuccess': 'Create organization success',
|
||||||
'system.organization.enableTitle': 'Start organization',
|
'system.organization.enableTitle': 'Start organization',
|
||||||
'system.organization.endTitle': 'Close organization',
|
'system.organization.endTitle': 'Close organization',
|
||||||
|
@ -55,6 +55,8 @@ export default {
|
||||||
'system.organization.updateOrganizationSuccess': 'Update organization success',
|
'system.organization.updateOrganizationSuccess': 'Update organization success',
|
||||||
'system.organization.createProject': 'Create project',
|
'system.organization.createProject': 'Create project',
|
||||||
'system.organization.subordinateOrg': 'Subordinate organization',
|
'system.organization.subordinateOrg': 'Subordinate organization',
|
||||||
|
'system.organization.searchUserPlaceholder': 'Search by name/email/phone number',
|
||||||
|
'system.organization.searchIndexPlaceholder': 'Search by name/id',
|
||||||
'system.project.revokeDeleteTitle': 'Confirm revoke {name} ?',
|
'system.project.revokeDeleteTitle': 'Confirm revoke {name} ?',
|
||||||
'system.project.enableTitle': 'Start project',
|
'system.project.enableTitle': 'Start project',
|
||||||
'system.project.endTitle': 'Close project',
|
'system.project.endTitle': 'Close project',
|
||||||
|
@ -72,6 +74,7 @@ export default {
|
||||||
'system.project.projectNameRequired': 'Project name cannot be empty',
|
'system.project.projectNameRequired': 'Project name cannot be empty',
|
||||||
'system.project.createTip': 'After the project is enabled, it will be displayed in the project switching list',
|
'system.project.createTip': 'After the project is enabled, it will be displayed in the project switching list',
|
||||||
'system.project.affiliatedOrgRequired': 'Affiliated organization cannot be empty',
|
'system.project.affiliatedOrgRequired': 'Affiliated organization cannot be empty',
|
||||||
'system.project.revokeDeleteToolTip': 'The project will be deleted automatically after 30 days',
|
'system.project.revokeDeleteToolTip': 'The project will be deleted automatically after {count} days',
|
||||||
'system.project.removeTip': "Remove it, and you'll lose access to the project.",
|
'system.project.removeTip': "Remove it, and you'll lose access to the project.",
|
||||||
|
'system.organization.projectIsDisabled': 'The project has ended and can be opened in the project list.',
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,7 +22,7 @@ export default {
|
||||||
'system.organization.organizationAdmin': '组织管理员',
|
'system.organization.organizationAdmin': '组织管理员',
|
||||||
'system.organization.organizationAdminPlaceholder': '默认选择创建组织人为组织管理员',
|
'system.organization.organizationAdminPlaceholder': '默认选择创建组织人为组织管理员',
|
||||||
'system.organization.description': '描述',
|
'system.organization.description': '描述',
|
||||||
'system.organization.descriptionPlaceholder': '请对组织进行描述',
|
'system.organization.descriptionPlaceholder': '请对该组织进行描述',
|
||||||
'system.organization.ID': 'ID',
|
'system.organization.ID': 'ID',
|
||||||
'system.organization.name': '名称',
|
'system.organization.name': '名称',
|
||||||
'system.organization.member': '成员',
|
'system.organization.member': '成员',
|
||||||
|
@ -41,7 +41,7 @@ export default {
|
||||||
'system.organization.addSuccess': '添加成功',
|
'system.organization.addSuccess': '添加成功',
|
||||||
'system.organization.deleteName': '确认删除 {name} 这个组织吗',
|
'system.organization.deleteName': '确认删除 {name} 这个组织吗',
|
||||||
'system.organization.deleteTip': '删除组织同时将该组织下的项目数据一起删除,请谨慎操作!',
|
'system.organization.deleteTip': '删除组织同时将该组织下的项目数据一起删除,请谨慎操作!',
|
||||||
'system.organization.revokeDeleteToolTip': '该组织将与 30 天后自动删除',
|
'system.organization.revokeDeleteToolTip': '该组织将与 {count} 天后自动删除',
|
||||||
'system.organization.createOrganizationSuccess': '创建组织成功',
|
'system.organization.createOrganizationSuccess': '创建组织成功',
|
||||||
'system.organization.enableTitle': '开启组织',
|
'system.organization.enableTitle': '开启组织',
|
||||||
'system.organization.endTitle': '关闭组织',
|
'system.organization.endTitle': '关闭组织',
|
||||||
|
@ -51,6 +51,8 @@ export default {
|
||||||
'system.organization.updateOrganizationSuccess': '更新组织成功',
|
'system.organization.updateOrganizationSuccess': '更新组织成功',
|
||||||
'system.organization.createProject': '创建项目',
|
'system.organization.createProject': '创建项目',
|
||||||
'system.organization.subordinateOrg': '所属组织',
|
'system.organization.subordinateOrg': '所属组织',
|
||||||
|
'system.organization.searchIndexPlaceholder': '通过ID或名称搜索',
|
||||||
|
'system.organization.searchUserPlaceholder': '通过名称/邮箱/手机号搜索',
|
||||||
'system.project.revokeDeleteTitle': '确认恢复 {name} 这个项目吗?',
|
'system.project.revokeDeleteTitle': '确认恢复 {name} 这个项目吗?',
|
||||||
'system.project.enableTitle': '开启项目',
|
'system.project.enableTitle': '开启项目',
|
||||||
'system.project.endTitle': '关闭项目',
|
'system.project.endTitle': '关闭项目',
|
||||||
|
@ -67,6 +69,7 @@ export default {
|
||||||
'system.project.projectNameRequired': '项目名称不能为空',
|
'system.project.projectNameRequired': '项目名称不能为空',
|
||||||
'system.project.createTip': '项目启用后,将展示在项目切换列表',
|
'system.project.createTip': '项目启用后,将展示在项目切换列表',
|
||||||
'system.project.affiliatedOrgRequired': '所属组织不能为空',
|
'system.project.affiliatedOrgRequired': '所属组织不能为空',
|
||||||
'system.project.revokeDeleteToolTip': '该项目将于30 天后自动删除',
|
'system.project.revokeDeleteToolTip': '该项目将于 {count} 天后自动删除',
|
||||||
'system.project.removeTip': '移除后,将失去项目权限',
|
'system.project.removeTip': '移除后,将失去项目权限',
|
||||||
|
'system.organization.projectIsDisabled': '项目已结束,可在 项目列表 开启',
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue