|
|
@@ -3,7 +3,7 @@ import Box from "@mui/material/Box";
|
|
|
import 'handsontable/dist/handsontable.full.min.css';
|
|
|
//import 'handsontable/styles/ht-theme-main.min.css';
|
|
|
import { HandsonTable } from 'handsontable/base';
|
|
|
-import { Table } from "antd";
|
|
|
+import { Table, ConfigProvider } from "antd";
|
|
|
import {HotTable} from "@handsontable/react";
|
|
|
import { registerAllModules } from 'handsontable/registry';
|
|
|
import {RichTreeView } from "@mui/x-tree-view/RichTreeView";
|
|
|
@@ -47,6 +47,12 @@ function copy(input) {
|
|
|
|
|
|
|
|
|
export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuFK, clickCallback, loadingCallback, dingeclick}) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
const hyperformulaInstance = HyperFormula.buildEmpty({
|
|
|
// to use an external HyperFormula instance,
|
|
|
// initialize it with the `'internal-use-in-handsontable'` license key
|
|
|
@@ -65,41 +71,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
setSelectedRowKeys([record.key]);
|
|
|
}
|
|
|
|
|
|
- function coverRenderer(_instance, td, _row, _col, _prop, value, _cellProperties) {
|
|
|
-
|
|
|
- let z = _instance.getDataAtRow(_row);
|
|
|
- if(z[1] == null || z[1].length == 0) {
|
|
|
- const button = document.createElement('button');
|
|
|
- button.innerText="删除";
|
|
|
- //img.src = value;
|
|
|
- /*button.addEventListener('click', (event) => {
|
|
|
- console.log(hotRef.current?.hotInstance?.getData()[selectedRow.current]);
|
|
|
- hotRef.current?.hotInstance?.alter('remove_row', selectedRow.current, 1);
|
|
|
- //console.log(plugin);
|
|
|
- event.preventDefault();
|
|
|
- });*/
|
|
|
- button.addEventListener('mousedown', (event) => {
|
|
|
- setDetail(shanchu(hotRef, selectedRow));
|
|
|
- //console.log(plugin);
|
|
|
- event.preventDefault();
|
|
|
- });
|
|
|
- td.innerText = '';
|
|
|
- td.appendChild(button);
|
|
|
- } else {
|
|
|
- const button = document.createElement('button');
|
|
|
- button.innerText="全部删除";
|
|
|
- //img.src = value;
|
|
|
- button.addEventListener('mousedown', (event) => {
|
|
|
- setDetail(quanbushanchu(hotRef, selectedRow));
|
|
|
- event.preventDefault();
|
|
|
- });
|
|
|
- td.innerText = '';
|
|
|
- td.appendChild(button);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- return td;
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -115,20 +87,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
}
|
|
|
|
|
|
});
|
|
|
- registerRenderer('highlightRowRenderer', (hotInstance, TD, row, column, ...rest) => {
|
|
|
- if (row == selectedRow.current) {
|
|
|
- if(column > 0 ) {
|
|
|
- textRenderer(hotInstance, TD, row, column, ...rest);
|
|
|
- TD.style.color = 'green';
|
|
|
- TD.style.background = '#d7f1e1';
|
|
|
- }
|
|
|
- if (column == 0) {
|
|
|
- coverRenderer(hotInstance, TD, row, column, ...rest);
|
|
|
- }
|
|
|
- } else {
|
|
|
- textRenderer(hotInstance, TD, row, column, ...rest);
|
|
|
- }
|
|
|
- });
|
|
|
+
|
|
|
|
|
|
|
|
|
const [detail, setDetail] = React.useState([
|
|
|
@@ -159,6 +118,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
const highlight = React.useRef([]);
|
|
|
const selectedRow = React.useRef(-1);
|
|
|
const hotRef = React.useRef(null);
|
|
|
+ const detailRef = React.useRef(null);
|
|
|
const hotRcjRef = React.useRef(null);
|
|
|
const hotTuijianRef = React.useRef(null);
|
|
|
const rgdeRef = React.useRef(null);
|
|
|
@@ -202,6 +162,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
'暂估价' : '', '综合人工工日' : '', '备注' : '', 'key' : '1'}]; */
|
|
|
|
|
|
setDetail(x);
|
|
|
+ detailRef.current = x;
|
|
|
|
|
|
setRcjhl([]);
|
|
|
setFuzhu([]);
|
|
|
@@ -217,7 +178,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
let keys = Object.keys(beizhu["BZBH"]);
|
|
|
for(let i = 0; i < keys.length; i++) {
|
|
|
let key = keys[i];
|
|
|
- result.push({'id': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});
|
|
|
+ result.push({'id': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});//序号很重要
|
|
|
}
|
|
|
setFuzhu(result);
|
|
|
setRowSelectionModel({type: 'include',
|
|
|
@@ -246,11 +207,12 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
const [success, data] = changguidinge(JSON.parse(dingeclick), selectedRowKeys[0]);
|
|
|
if (success) {
|
|
|
setDetail(data);
|
|
|
+ detailRef.current = data;
|
|
|
setExpandedRowKeys([...expandedRowKeys, selectedRowKeys[0]]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- }, [dingeclick]
|
|
|
+ }, [dingeclick]//常规添加定额
|
|
|
);
|
|
|
React.useEffect(
|
|
|
() => {
|
|
|
@@ -365,6 +327,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
let newData = updateDercj(selectedRowKeys[0], data);
|
|
|
setDetail(newData);
|
|
|
+ detailRef.current = newData;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
@@ -406,7 +369,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
});
|
|
|
}else{
|
|
|
let qdbm = null;
|
|
|
- let qd = detail.filter(x=>
|
|
|
+ let qd = detailRef.current.filter(x=>
|
|
|
x["children"].filter(y=>y['key'] == row[0]).length > 0
|
|
|
)[0];
|
|
|
qdbm = qd['清单编码'];
|
|
|
@@ -501,11 +464,12 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
<Box>
|
|
|
<Stack direction='row' spacing={2}>
|
|
|
- <Button variant="outlined" onClick={() => {
|
|
|
+ <Button variant="outlined" size="small" onClick={() => {
|
|
|
if (selectedRowKeys.length > 0) {
|
|
|
const [success, data] = danxiangdinge(selectedRowKeys[0]);
|
|
|
if(success) {
|
|
|
setDetail(data);
|
|
|
+ detailRef.current = data;
|
|
|
setExpandedRowKeys([...expandedRowKeys, selectedRowKeys[0]]);
|
|
|
}
|
|
|
}
|
|
|
@@ -513,10 +477,11 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
}}
|
|
|
>单项定额</Button>
|
|
|
- <Button variant="outlined" onClick={() => {
|
|
|
+ <Button variant="outlined" size="small" onClick={() => {
|
|
|
if (selectedRowKeys.length > 0) {
|
|
|
let newData = shanchu(selectedRowKeys[0]);
|
|
|
setDetail(newData);
|
|
|
+ detailRef.current = newData;
|
|
|
if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0) {
|
|
|
setSelectedRowKeys([]);
|
|
|
handleSelection([]);
|
|
|
@@ -529,9 +494,10 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
}}
|
|
|
>删除</Button>
|
|
|
- <Button variant="outlined" onClick={() => {
|
|
|
+ <Button variant="outlined" size="small" onClick={() => {
|
|
|
let newData = undo();
|
|
|
setDetail(newData);
|
|
|
+ detailRef.current = newData;
|
|
|
if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0
|
|
|
&& newData.filter(x=>x["children"].filter(y=>y['key']==selectedRowKeys[0]).length > 0).length == 0) {
|
|
|
setSelectedRowKeys([]);
|
|
|
@@ -542,9 +508,10 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
}}
|
|
|
>撤销</Button>
|
|
|
- <Button variant="outlined" onClick={() => {
|
|
|
+ <Button variant="outlined" size="small" onClick={() => {
|
|
|
let newData = redo();
|
|
|
setDetail(newData);
|
|
|
+ detailRef.current = newData;
|
|
|
if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0
|
|
|
&& newData.filter(x=>x["children"].filter(y=>y['key']==selectedRowKeys[0]).length > 0).length == 0) {
|
|
|
setSelectedRowKeys([]);
|
|
|
@@ -555,7 +522,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
}}
|
|
|
>重做</Button>
|
|
|
- <Button variant="outlined" onClick={() => {
|
|
|
+ <Button variant="outlined" size="small" onClick={() => {
|
|
|
console.log("save to cloud");
|
|
|
loadingCallback();
|
|
|
|
|
|
@@ -564,9 +531,19 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
|
|
|
</Stack>
|
|
|
+ <ConfigProvider
|
|
|
+ theme={{
|
|
|
+ components: {
|
|
|
+ Table: {
|
|
|
+ /* here is your component tokens */
|
|
|
+ cellPaddingBlock : 8
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }}
|
|
|
+ >
|
|
|
<Table
|
|
|
dataSource={detail}
|
|
|
-
|
|
|
+
|
|
|
|
|
|
//afterSelection={handleSelection}
|
|
|
//afterSelection={handleSelection}
|
|
|
@@ -591,7 +568,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
selectRow(record);
|
|
|
}
|
|
|
})}
|
|
|
- scroll={{ x: 'max-content' , y : 500}}
|
|
|
+ scroll={{ x: 'max-content' , y : 'calc(100vh - 400px)'}}
|
|
|
pagination={{ position: ['none', 'none'] }}
|
|
|
columns = {[
|
|
|
|
|
|
@@ -624,19 +601,21 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
]}
|
|
|
|
|
|
/>
|
|
|
+ </ConfigProvider>
|
|
|
</Box>
|
|
|
<Box >
|
|
|
|
|
|
<TabContext value={value}>
|
|
|
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
|
|
|
- <TabList onChange={handleChange} aria-label="lab API tabs example">
|
|
|
- <Tab label="人材机含量" value="1" />
|
|
|
- <Tab label="标准定额人材机含量" value="2" />
|
|
|
- <Tab label="定额附注" value="3" />
|
|
|
- <Tab label="组价推荐" value="4" />
|
|
|
+ <TabList sx={{minHeight: '24px'}} onChange={handleChange} aria-label="lab API tabs example">
|
|
|
+ <Tab sx={{p: 0, minHeight: '24px'}} label="人材机含量" value="1" />
|
|
|
+ <Tab sx={{p: 0, minHeight: '24px'}} label="标准定额人材机含量" value="2" />
|
|
|
+ <Tab sx={{p: 0, minHeight: '24px'}} label="定额附注" value="3" />
|
|
|
+ <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="4" />
|
|
|
</TabList>
|
|
|
</Box>
|
|
|
- <TabPanel value="1">
|
|
|
+
|
|
|
+ <TabPanel sx={{p: 1}} value="1">
|
|
|
<HotTable
|
|
|
nestedRows={false}
|
|
|
data={rcjhl
|
|
|
@@ -645,13 +624,14 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
manualColumnResize={true}
|
|
|
rowHeaders={true}
|
|
|
colHeaders={true}
|
|
|
- height="300"
|
|
|
+ height="200"
|
|
|
formulas={{
|
|
|
engine: hyperformulaInstance,
|
|
|
sheetName: 'Rcj',
|
|
|
}}
|
|
|
|
|
|
cells={(row, col) => {
|
|
|
+ if (isQdrcj.current) return {readOnly: true, renderer: "customStylesRenderer"};
|
|
|
if (row === 0) {
|
|
|
return { readOnly: true, renderer: "customStylesRenderer" };
|
|
|
}
|
|
|
@@ -671,7 +651,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
/>
|
|
|
|
|
|
</TabPanel>
|
|
|
- <TabPanel value="2">
|
|
|
+ <TabPanel sx={{p: 1}} value="2">
|
|
|
<HotTable
|
|
|
nestedRows={false}
|
|
|
data={rcjhl2
|
|
|
@@ -679,7 +659,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
manualColumnResize={true}
|
|
|
rowHeaders={true}
|
|
|
colHeaders={true}
|
|
|
- height="300"
|
|
|
+ height="200"
|
|
|
readOnly={true}
|
|
|
fixedRowsTop={1}
|
|
|
selectionMode="single"
|
|
|
@@ -689,7 +669,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
/>
|
|
|
|
|
|
</TabPanel>
|
|
|
- <TabPanel value="3">
|
|
|
+ <TabPanel sx={{p: 1}} value="3">
|
|
|
<DataGrid
|
|
|
getRowHeight={(params) => "auto"}
|
|
|
columns={
|
|
|
@@ -709,18 +689,22 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
|
|
|
]
|
|
|
}
|
|
|
+ scroll={{ x: 'max-content' , y : 200}}
|
|
|
rows={fuzhu}
|
|
|
hideFooter={true}
|
|
|
checkboxSelection={fuzhuEnable}
|
|
|
rowSelectionModel={rowSelectionModel}
|
|
|
onRowSelectionModelChange={(newRowSelectionModel) => {
|
|
|
setRowSelectionModel(newRowSelectionModel);
|
|
|
- handleBeizhu(beizhuFKRef.current, selectedRowKeys[0], newRowSelectionModel.ids, fuzhu);
|
|
|
+ const [newData, newHl] = handleBeizhu(beizhuFKRef.current, selectedRowKeys[0], newRowSelectionModel.ids, fuzhu);
|
|
|
+ setDetail(newData);
|
|
|
+ detailRef.current = newData;
|
|
|
+ setRcjhl(newHl);
|
|
|
}}
|
|
|
/>
|
|
|
|
|
|
</TabPanel>
|
|
|
- <TabPanel value="4">
|
|
|
+ <TabPanel sx={{p: 1}} value="4">
|
|
|
<HotTable
|
|
|
nestedRows={false}
|
|
|
data={tuijian
|
|
|
@@ -729,7 +713,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
|
|
|
manualColumnResize={true}
|
|
|
rowHeaders={true}
|
|
|
colHeaders={true}
|
|
|
- height="300"
|
|
|
+ height="200"
|
|
|
readOnly={true}
|
|
|
fixedRowsTop={1}
|
|
|
selectionMode="single"
|