组织快捷调整页面

pull/5/head
Chengliang 2 years ago
parent 68e26fa992
commit 7747f91160

@ -1,7 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="449daba1-1dd3-4ffd-906d-6ef641fb81de" name="Default Changelist" comment="" />
<list default="true" id="449daba1-1dd3-4ffd-906d-6ef641fb81de" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.umirc.ts" beforeDir="false" afterPath="$PROJECT_DIR$/.umirc.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/d3-org-chart.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/d3-org-chart.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/company.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/company.jsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/pages/index.less" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/index.less" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -9,13 +15,34 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf>
<file pinned="false" current-in-tab="true">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/d3-org-chart.js">
<provider selected="true" editor-type-id="text-editor">
<state>
<state relative-caret-position="-20">
<folding>
<element signature="e#0#49#0" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/components/dialog/index.jsx">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2297">
<folding>
<element signature="e#0#26#0" expanded="true" />
</folding>
</state>
</provider>
@ -320,9 +347,9 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="PackagesPane" />
<pane id="CatdeaLogs" />
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
@ -335,6 +362,19 @@
<item name="org-chart-frant" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="org-chart-frant" type="b2602c69:ProjectViewProjectNode" />
<item name="org-chart-frant" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="components" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="org-chart-frant" type="b2602c69:ProjectViewProjectNode" />
<item name="org-chart-frant" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="components" type="462c0819:PsiDirectoryNode" />
<item name="dialog" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
@ -344,7 +384,7 @@
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1689842769496" />
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1690341396252" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="project.structure.last.edited" value="Project" />
@ -378,30 +418,25 @@
<option name="presentableId" value="Default" />
<updated>1689842546961</updated>
<workItem from="1689842557088" duration="205000" />
<workItem from="1690192167781" duration="39000" />
<workItem from="1690341272941" duration="164000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="205000" />
<option name="totallyTimeSpent" value="408000" />
</component>
<component name="ToolWindowManager">
<frame x="0" y="28" width="1440" height="872" extended-state="0" />
<frame x="0" y="0" width="1440" height="900" extended-state="0" />
<layout>
<window_info id="JRebel" side_tool="true" />
<window_info id="Image Layers" />
<window_info id="UI Designer" />
<window_info id="Favorites" side_tool="true" />
<window_info id="Capture Tool" />
<window_info id="Designer" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24964234" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25679544" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Terminal" />
<window_info anchor="bottom" id="Messages" />
<window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Docker" show_stripe_button="false" />
<window_info anchor="bottom" id="JRebel Console" side_tool="true" />
<window_info id="JRebel" order="2" side_tool="true" />
<window_info id="Image Layers" order="3" />
<window_info id="Capture Tool" order="4" />
<window_info id="UI Designer" order="5" />
<window_info id="Favorites" order="6" side_tool="true" />
<window_info id="Designer" order="7" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
@ -409,30 +444,66 @@
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="right" id="Palette" />
<window_info anchor="right" id="Capture Analysis" />
<window_info anchor="right" id="aiXcoder" />
<window_info anchor="right" id="Maven Projects" />
<window_info anchor="right" id="Database" />
<window_info anchor="right" id="Palette&#9;" />
<window_info anchor="right" id="Theme Preview" />
<window_info anchor="bottom" id="Event Log" order="7" side_tool="true" />
<window_info anchor="bottom" id="Terminal" order="8" />
<window_info anchor="bottom" id="Docker" order="9" show_stripe_button="false" />
<window_info anchor="bottom" id="Messages" order="10" />
<window_info anchor="bottom" id="Database Changes" order="11" show_stripe_button="false" />
<window_info active="true" anchor="bottom" id="Version Control" order="12" visible="true" weight="0.32891566" />
<window_info anchor="bottom" id="JRebel Console" order="13" side_tool="true" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Palette" order="3" />
<window_info anchor="right" id="Capture Analysis" order="4" />
<window_info anchor="right" id="Maven Projects" order="5" />
<window_info anchor="right" id="aiXcoder" order="6" />
<window_info anchor="right" id="Database" order="7" />
<window_info anchor="right" id="Palette&#9;" order="8" />
<window_info anchor="right" id="Theme Preview" order="9" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="Vcs.Log.History.Properties">
<option name="COLUMN_ORDER">
<list>
<option value="0" />
<option value="2" />
<option value="3" />
<option value="1" />
</list>
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/d3-org-chart.js">
<provider selected="true" editor-type-id="text-editor">
<state>
<state relative-caret-position="-20">
<folding>
<element signature="e#0#49#0" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
<element signature="n#style#0;n#div#0;n#!!top" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/components/dialog/index.jsx">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2297">
<folding>
<element signature="e#0#26#0" expanded="true" />
</folding>
</state>
</provider>

@ -1,11 +1,3 @@
/*
* @Author: Chengliang 1546584672@qq.com
* @Date: 2022-08-04 10:22:55
* @LastEditors: Chengliang 1546584672@qq.com
* @LastEditTime: 2023-07-24 09:57:14
* @FilePath: /org-chart-frant/.umirc.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { defineConfig } from 'umi';
export default defineConfig({
@ -20,6 +12,7 @@ export default defineConfig({
routes: [
{ path: '/user', component: '@/pages/user' },
{ path: '/company', component: '@/pages/company' },
{ path: '/dragtree', component: '@/pages/dragTree' },
],
fastRefresh: {},
antd: {},

Binary file not shown.

@ -28,29 +28,6 @@ export default class OperateDialog extends React.Component {
this.setState({ open: false });
message.success('操作成功');
}, 200);
// if (description.length == 0) {
// return message.error('');
// }
// this.setState({ confirmLoading: true });
// let api =
// '/api/bs/hrmorganization/orgchart/versionRecord?fclass=' +
// requestData.fclass +
// '&description=' +
// description;
// fetch(api)
// .then((res) => res.json())
// .then((data) => {
// if (data.api_status) {
// this.setState({
// open: false,
// confirmLoading: false,
// description: '',
// });
// message.success(',', 2, 3);
// } else {
// message.error(',', 2, 3);
// }
// });
};
/**

@ -230,8 +230,8 @@ export class OrgChart {
top: {
nodeLeftX: (node) => -node.width / 2,
nodeRightX: (node) => node.width / 2,
nodeTopY: (node) => 0,
// "nodeTopY": node => node.height/0.4,
//nodeTopY: (node) => 0,
nodeTopY: (node) => node.height / 0.3,
nodeBottomY: (node) => node.height,
nodeJoinX: (node) => node.x - node.width / 2,
nodeJoinY: (node) => node.y + node.height,
@ -509,7 +509,9 @@ export class OrgChart {
// Get zooming function
behaviors.zoom = d3
.zoom()
.on('zoom', (event, d) => this.zoomed(event, d))
.on('zoom', (event, d) => {
this.zoomed(event, d);
})
.scaleExtent(attrs.scaleExtent);
attrs.zoomBehavior = behaviors.zoom;
}

@ -119,7 +119,7 @@ export default function companyPage() {
//
const nodeWidthRender = (d) => {
if (d.data.ftype == 0) {
return 1000;
return 220;
} else if (d.data.ftype == 1) {
return 160;
} else if (d.data.ftype == 2) {

@ -0,0 +1,156 @@
import { Tree, message } from 'antd';
import React, { useEffect, useState, useRef } from 'react';
import * as d3 from 'd3';
import qs from 'qs';
import { HomeOutlined, FolderOutlined } from '@ant-design/icons';
import './index.less';
const DragTree = () => {
const [gData, setGData] = useState([]);
const [expandedKeys, setExpandedKeys] = useState([]);
useEffect(() => {
d3.json('/api/bs/hrmorganization/orgchart/getMovingTree').then((data) => {
setGData(data.movingTree);
setExpandedKeys(data.expandedKeys);
});
}, [true]);
const onDragEnter = (info) => {
//console.log(info);
// expandedKeys
// setExpandedKeys(info.expandedKeys)
};
const onDrop = (info) => {
debugger;
//
const dropKey = info.node.key;
const dragKey = info.dragNode.key;
const dropPos = info.node.pos.split('-');
const dropPosition =
info.dropPosition - Number(dropPos[dropPos.length - 1]);
const loop = (data, key, callback) => {
for (let i = 0; i < data.length; i++) {
if (data[i].key === key) {
return callback(data[i], i, data);
}
if (data[i].children) {
loop(data[i].children, key, callback);
}
}
};
const data = [...gData];
// Find dragObject
let dragObj;
loop(data, dragKey, (item, index, arr) => {
arr.splice(index, 1);
dragObj = item;
});
if (!info.dropToGap) {
// Drop on the content
loop(data, dropKey, (item) => {
item.children = item.children || [];
// where to insert
item.children.unshift(dragObj);
});
} else if (
(info.node.props.children || []).length > 0 &&
// Has children
info.node.props.expanded &&
// Is expanded
dropPosition === 1 // On the bottom gap
) {
loop(data, dropKey, (item) => {
item.children = item.children || [];
// where to insert
item.children.unshift(dragObj);
// in previous version, we use item.children.push(dragObj) to insert the
// item to the tail of the children
});
} else {
let ar = [];
let i;
loop(data, dropKey, (_item, index, arr) => {
ar = arr;
i = index;
});
if (dropPosition === -1) {
ar.splice(i, 0, dragObj);
} else {
ar.splice(i + 1, 0, dragObj);
}
}
setGData(data);
};
const onDelete = (nodeData) => {
const extend = nodeData.type == '1' ? 'comp' : 'dept';
d3.json(`/api/bs/hrmorganization/${extend}/deleteByIds`)
.header('Content-Type', 'application/json')
.post(JSON.stringify({ ids: nodeData.id }))
.then(function (response) {
message.success('删除成功');
})
.catch(function (error) {
message.error('接口异常,请联系管理员');
});
};
const onTitleRender = (nodeData) => {
let extend = nodeData.type == '1' ? 'companyExtend' : 'departmentExtend';
let attr = nodeData.type == '1' ? 'none' : 'inline-block';
let icon = nodeData.type == '1' ? <HomeOutlined /> : <FolderOutlined />;
return (
<div>
<span>
{icon}
<span style={{ marginLeft: '5px' }}>{nodeData.title}</span>
</span>
<div id="drag-button-ops">
<span
className="drag-button"
onClick={() =>
window.open(
`/spa/organization/static/index.html#/main/organization/${extend}/${nodeData.id}`,
'_blank',
)
}
>
查看
</span>
<span className="drag-button" onClick={onDelete(nodeData)}>
删除
</span>
<span className="drag-button" onClick={onDelete(nodeData)}>
封存
</span>
<span style={{ display: attr }} className="drag-button">
合并
</span>
<span style={{ display: attr }} className="drag-button">
复制
</span>
</div>
</div>
);
};
return (
<Tree
className="draggable-tree"
defaultExpandedKeys={expandedKeys}
draggable
icon={false}
blockNode
onDragEnter={onDragEnter}
onDrop={onDrop}
treeData={gData}
titleRender={onTitleRender}
/>
);
};
export default DragTree;

@ -9,3 +9,30 @@
.contentWrapper {
background-color: #f7f9fd;
}
.ant-tree .ant-tree-node-content-wrapper:hover {
background-color: #e6f7ff;
}
.ant-tree .ant-tree-node-content-wrapper:hover #drag-button-ops {
display: inline-block;
}
#drag-button-ops {
display: none;
width: 500px;
height: 16px;
font-size: 12px;
line-height: 16px;
margin-left: 100px;
.drag-button {
display: inline-block;
padding: 0 10px;
color: #333;
cursor: pointer;
}
.drag-button:hover {
color: #22c8fb;
}
}

@ -99,7 +99,7 @@ export default function userPage() {
//
useEffect(() => {
document.cookie =
'ecology_JSessionid=aaauntrtgZdkuanT5w2Ly; JSESSIONID=aaauntrtgZdkuanT5w2Ly; loginidweaver=1; languageidweaver=7; loginuuids=1; __randcode__=c5235342-7633-4eec-a754-b36eefdf8c9e';
'ecology_JSessionid=aaaqxkKrIiwa59VyYrwMy; JSESSIONID=aaaqxkKrIiwa59VyYrwMy; loginidweaver=1; languageidweaver=7; loginuuids=1; __randcode__=61884b51-d206-4953-8fd2-78cfc6cc7044';
d3.json(
// "/user/data"
'/api/bs/hrmorganization/orgchart/userData?fclass=0&fisvitual=0&root=0&level=3&id=0',

Loading…
Cancel
Save