Commit 332b01a11a5bac187104eff216e4f89da5b2614c

Authored by xp.Huang
2 parents 4152575a ec61e3d1

Merge branch 'fix/DEFECT-2063' into 'feat/account-role-manage'

fix: 修复子租户管理员新增组织可以创建平级组织

See merge request yunteng/thingskit-front!1313
@@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
25 label: '编辑', 25 label: '编辑',
26 auth: 'api:yt:organization:update', 26 auth: 'api:yt:organization:update',
27 icon: 'clarity:note-edit-line', 27 icon: 'clarity:note-edit-line',
  28 + disabled: record.isRoot && getIsChildTenant,
28 onClick: handleEdit.bind(null, record), 29 onClick: handleEdit.bind(null, record),
29 }, 30 },
30 { 31 {
@@ -32,6 +33,7 @@ @@ -32,6 +33,7 @@
32 auth: 'api:yt:organization:delete', 33 auth: 'api:yt:organization:delete',
33 icon: 'ant-design:delete-outlined', 34 icon: 'ant-design:delete-outlined',
34 color: 'error', 35 color: 'error',
  36 + disabled: record.isRoot && getIsChildTenant,
35 popConfirm: { 37 popConfirm: {
36 title: getDeleteTitle(), //是否确认删除//getDeleteTitle() 38 title: getDeleteTitle(), //是否确认删除//getDeleteTitle()
37 confirm: handleDeleteOrBatchDelete.bind(null, record), 39 confirm: handleDeleteOrBatchDelete.bind(null, record),
@@ -45,7 +47,7 @@ @@ -45,7 +47,7 @@
45 </div> 47 </div>
46 </template> 48 </template>
47 <script lang="ts"> 49 <script lang="ts">
48 - import { computed, defineComponent, nextTick } from 'vue'; 50 + import { computed, defineComponent, nextTick, unref } from 'vue';
49 import { BasicTable, useTable, TableAction } from '/@/components/Table'; 51 import { BasicTable, useTable, TableAction } from '/@/components/Table';
50 // 加载自定义侧边弹出框 组件 52 // 加载自定义侧边弹出框 组件
51 import { useDrawer } from '/@/components/Drawer'; 53 import { useDrawer } from '/@/components/Drawer';
@@ -56,6 +58,8 @@ @@ -56,6 +58,8 @@
56 import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; 58 import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
57 import { Authority } from '/@/components/Authority'; 59 import { Authority } from '/@/components/Authority';
58 import { Popconfirm } from 'ant-design-vue'; 60 import { Popconfirm } from 'ant-design-vue';
  61 + import { getJwtToken } from '/@/utils/auth';
  62 + import jwtDecode from 'jwt-decode';
59 63
60 export default defineComponent({ 64 export default defineComponent({
61 name: 'DeptManagement', 65 name: 'DeptManagement',
@@ -65,6 +69,11 @@ @@ -65,6 +69,11 @@
65 const { t } = useI18n(); // 加载国际化 69 const { t } = useI18n(); // 加载国际化
66 const getI18n = computed(() => t('routes.common.organization.toolCreateOrganization')); 70 const getI18n = computed(() => t('routes.common.organization.toolCreateOrganization'));
67 71
  72 + const getIsChildTenant = computed(() => {
  73 + const token = getJwtToken();
  74 + return !!(jwtDecode(token as string) as Recordable)?.isCommonTenant;
  75 + });
  76 +
68 const [registerTable, { reload, expandAll, setProps }] = useTable({ 77 const [registerTable, { reload, expandAll, setProps }] = useTable({
69 title: t('routes.common.organization.toolOrganizationList'), 78 title: t('routes.common.organization.toolOrganizationList'),
70 api: getOrganizationList, 79 api: getOrganizationList,
@@ -76,6 +85,14 @@ @@ -76,6 +85,14 @@
76 showTableSetting: true, 85 showTableSetting: true,
77 bordered: true, 86 bordered: true,
78 showIndexColumn: false, 87 showIndexColumn: false,
  88 + afterFetch: (data: Recordable[]) => {
  89 + if (data && data.length) {
  90 + data.forEach((item) => {
  91 + item.isRoot = true;
  92 + });
  93 + }
  94 + return data;
  95 + },
79 actionColumn: { 96 actionColumn: {
80 width: 200, 97 width: 200,
81 title: t('routes.common.common.operation'), //操作 98 title: t('routes.common.common.operation'), //操作
@@ -91,7 +108,15 @@ @@ -91,7 +108,15 @@
91 setProps 108 setProps
92 ); 109 );
93 nextTick(() => { 110 nextTick(() => {
94 - setProps(selectionOptions); 111 + setProps({
  112 + ...selectionOptions,
  113 + rowSelection: {
  114 + ...selectionOptions.rowSelection,
  115 + getCheckboxProps: (data) => {
  116 + return { disabled: data?.isRoot && unref(getIsChildTenant) };
  117 + },
  118 + },
  119 + });
95 }); 120 });
96 /** 121 /**
97 * 获得删除提示框的文字 122 * 获得删除提示框的文字
@@ -124,6 +149,7 @@ @@ -124,6 +149,7 @@
124 } 149 }
125 150
126 return { 151 return {
  152 + getIsChildTenant,
127 getI18n, 153 getI18n,
128 registerTable, 154 registerTable,
129 registerModal, 155 registerModal,
  1 +import jwtDecode from 'jwt-decode';
1 import { BasicColumn } from '/@/components/Table'; 2 import { BasicColumn } from '/@/components/Table';
2 import { FormSchema } from '/@/components/Table'; 3 import { FormSchema } from '/@/components/Table';
3 import { useI18n } from '/@/hooks/web/useI18n'; 4 import { useI18n } from '/@/hooks/web/useI18n';
  5 +import { getJwtToken } from '/@/utils/auth';
4 import { createOrganizationSearch } from '/@/utils/organizationSearch'; 6 import { createOrganizationSearch } from '/@/utils/organizationSearch';
5 const { t } = useI18n(); 7 const { t } = useI18n();
6 8
@@ -32,6 +34,12 @@ export const formSchema: FormSchema[] = [ @@ -32,6 +34,12 @@ export const formSchema: FormSchema[] = [
32 field: 'parentId', 34 field: 'parentId',
33 label: t('routes.common.organization.parentOrganization'), 35 label: t('routes.common.organization.parentOrganization'),
34 component: 'TreeSelect', 36 component: 'TreeSelect',
  37 + dynamicRules: () => {
  38 + const token = getJwtToken();
  39 + const res = jwtDecode(token as string) as Record<'isCommonTenant', boolean>;
  40 + return [{ required: res?.isCommonTenant, message: '请选择上级组织' }];
  41 + },
  42 + rulesMessageJoinLabel: true,
35 componentProps: { 43 componentProps: {
36 replaceFields: { 44 replaceFields: {
37 title: 'name', 45 title: 'name',