|
|
@@ -0,0 +1,103 @@
|
|
|
+import { GridContent } from '@ant-design/pro-layout'
|
|
|
+import React, { useState, useRef, useLayoutEffect } from 'react'
|
|
|
+import { Menu } from 'antd'
|
|
|
+import Staff from '../components/Staff'
|
|
|
+import Organization from '../components/Organization'
|
|
|
+import Role from '../components/Role'
|
|
|
+import styles from '@/pages/Institutions/Company/style.less'
|
|
|
+
|
|
|
+const { Item } = Menu
|
|
|
+
|
|
|
+type CompanyNameStateKeys = 'staff' | 'organization' | 'role'
|
|
|
+type CompanyNameState = {
|
|
|
+ mode: 'inline' | 'horizontal'
|
|
|
+ selectKey: CompanyNameStateKeys
|
|
|
+}
|
|
|
+
|
|
|
+const CompanyName: React.FC = () => {
|
|
|
+ const menuMap: Record<string, React.ReactNode> = {
|
|
|
+ staff: '人员管理',
|
|
|
+ organization: '组织架构',
|
|
|
+ role: '角色权限'
|
|
|
+ }
|
|
|
+ const [initConfig, setInitConfig] = useState<CompanyNameState>({
|
|
|
+ mode: 'inline',
|
|
|
+ selectKey: 'staff'
|
|
|
+ })
|
|
|
+ const dom = useRef<HTMLDivElement>()
|
|
|
+ const resize = () => {
|
|
|
+ requestAnimationFrame(() => {
|
|
|
+ if (!dom.current) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let mode: 'inline' | 'horizontal' = 'inline'
|
|
|
+ const { offsetWidth } = dom.current
|
|
|
+ if (dom.current.offsetWidth < 641 && offsetWidth > 400) {
|
|
|
+ mode = 'horizontal'
|
|
|
+ }
|
|
|
+ if (window.innerWidth < 768 && offsetWidth > 400) {
|
|
|
+ mode = 'horizontal'
|
|
|
+ }
|
|
|
+ setInitConfig({ ...initConfig, mode: mode as SettingsState['mode'] })
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ useLayoutEffect(() => {
|
|
|
+ if (dom.current) {
|
|
|
+ window.addEventListener('resize', resize)
|
|
|
+ resize()
|
|
|
+ }
|
|
|
+ return () => {
|
|
|
+ window.removeEventListener('resize', resize)
|
|
|
+ }
|
|
|
+ }, [dom.current])
|
|
|
+ const getMenu = () => {
|
|
|
+ return Object.keys(menuMap).map(item => <Item key={item}>{menuMap[item]}</Item>)
|
|
|
+ }
|
|
|
+
|
|
|
+ const renderChildren = () => {
|
|
|
+ const { selectKey } = initConfig
|
|
|
+ switch (selectKey) {
|
|
|
+ case 'staff':
|
|
|
+ return <Staff />
|
|
|
+ case 'organization':
|
|
|
+ return <Organization />
|
|
|
+ case 'role':
|
|
|
+ return <Role />
|
|
|
+ default:
|
|
|
+ return null
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ <GridContent>
|
|
|
+ <div
|
|
|
+ className={styles.main}
|
|
|
+ ref={ref => {
|
|
|
+ if (ref) {
|
|
|
+ dom.current = ref
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ <div className={styles.leftMenu}>
|
|
|
+ <Menu
|
|
|
+ mode={initConfig.mode}
|
|
|
+ selectedKeys={[initConfig.selectKey]}
|
|
|
+ onClick={({ key }) => {
|
|
|
+ setInitConfig({
|
|
|
+ ...initConfig,
|
|
|
+ selectKey: key as CompanyNameStateKeys
|
|
|
+ })
|
|
|
+ }}>
|
|
|
+ {getMenu()}
|
|
|
+ </Menu>
|
|
|
+ </div>
|
|
|
+ <div className={styles.right}>
|
|
|
+ <div className={styles.title}>{menuMap[initConfig.selectKey]}</div>
|
|
|
+ {renderChildren()}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </GridContent>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+export default CompanyName
|