|
|
|
@ -1,36 +1,38 @@
|
|
|
|
|
import React = require("react");
|
|
|
|
|
import { Button, Card, Classes, Icon, InputGroup, Intent, Divider, IconName } from "@blueprintjs/core";
|
|
|
|
|
import { Button, Card, Classes, Divider, IconName, InputGroup, Intent } from "@blueprintjs/core";
|
|
|
|
|
import { observable } from "mobx";
|
|
|
|
|
import { observer } from "mobx-react";
|
|
|
|
|
import AutoSizer from 'react-virtualized-auto-sizer';
|
|
|
|
|
import { VariableSizeList as List } from 'react-window';
|
|
|
|
|
import { begin, end } from "xaop";
|
|
|
|
|
import { DrillingReactor } from "../../../Add-on/DrawDrilling/DrillingReactor";
|
|
|
|
|
import { DrillTypeCount, lookOverBoardInfosTool } from "../../../Add-on/LookOverBoardInfos/LookOverBoardInfosTool";
|
|
|
|
|
import { app } from "../../../ApplicationServices/Application";
|
|
|
|
|
import { arrayRemove } from "../../../Common/ArrayExt";
|
|
|
|
|
import { EBoardKeyList } from "../../../Common/BoardKeyList";
|
|
|
|
|
import { CheckObjectType, CheckoutValid } from "../../../Common/CheckoutVaildValue";
|
|
|
|
|
import { safeEval } from "../../../Common/eval";
|
|
|
|
|
import { FileSystem } from "../../../Common/FileSystem";
|
|
|
|
|
import { KeyBoard } from "../../../Common/KeyEnum";
|
|
|
|
|
import { FixedNotZero } from "../../../Common/Utils";
|
|
|
|
|
import { CylinderHole } from "../../../DatabaseServices/3DSolid/CylinderHole";
|
|
|
|
|
import { CommandHistoryRecord } from "../../../DatabaseServices/CommandHistoryRecord";
|
|
|
|
|
import { CreateObjectData } from "../../../DatabaseServices/CreateObjectData";
|
|
|
|
|
import { Board } from "../../../DatabaseServices/Entity/Board";
|
|
|
|
|
import { FileServer } from "../../../DatabaseServices/FileServer";
|
|
|
|
|
import { ObjectId } from "../../../DatabaseServices/ObjectId";
|
|
|
|
|
import { ProcessingGroupRecord } from "../../../DatabaseServices/ProcessingGroup/ProcessingGroupRecord";
|
|
|
|
|
import { SelectSetBase } from "../../../Editor/SelectBase";
|
|
|
|
|
import { equaln } from "../../../Geometry/GeUtils";
|
|
|
|
|
import { IMetalsType } from "../../../Production/Product";
|
|
|
|
|
import { EFindType } from "../../Store/BoardFindInterface";
|
|
|
|
|
import { ComposingType, FaceDirection, LinesType } from "../../Store/BoardInterface";
|
|
|
|
|
import { LinesType } from "../../Store/BoardInterface";
|
|
|
|
|
import { ModalFooter, ModalHeader } from "../Modal/ModalContainer";
|
|
|
|
|
import { ModalState } from "../Modal/ModalsManage";
|
|
|
|
|
import { AppToaster } from "../Toaster";
|
|
|
|
|
import { BoardInfoList, IBoardInfoOptions } from "./BoardInfosList";
|
|
|
|
|
import { DrillingReactor } from "../../../Add-on/DrawDrilling/DrillingReactor";
|
|
|
|
|
import { CommandHistoryRecord } from "../../../DatabaseServices/CommandHistoryRecord";
|
|
|
|
|
import { CreateObjectData } from "../../../DatabaseServices/CreateObjectData";
|
|
|
|
|
import { CylinderHole } from "../../../DatabaseServices/3DSolid/CylinderHole";
|
|
|
|
|
import { DrillTypeCount, lookOverBoardInfosTool } from "../../../Add-on/LookOverBoardInfos/LookOverBoardInfosTool";
|
|
|
|
|
import { ModalHeader, ModalFooter } from "../Modal/ModalContainer";
|
|
|
|
|
import { IMetalsType } from "../../../Production/Product";
|
|
|
|
|
import { HardwareCompositeEntity } from './../../../DatabaseServices/Hardware/HardwareCompositeEntity';
|
|
|
|
|
import { HardwareTopline } from './../../../DatabaseServices/Hardware/HardwareTopline';
|
|
|
|
|
import { arrayRemove } from "../../../Common/ArrayExt";
|
|
|
|
|
import { ObjectId } from "../../../DatabaseServices/ObjectId";
|
|
|
|
|
import { ProcessingGroupRecord } from "../../../DatabaseServices/ProcessingGroup/ProcessingGroupRecord";
|
|
|
|
|
import { BoardInfoList, IBoardInfoOptions } from "./BoardInfosList";
|
|
|
|
|
|
|
|
|
|
interface BoradDataInArray
|
|
|
|
|
{
|
|
|
|
@ -46,10 +48,26 @@ interface LookOverBoardInfosModalProps
|
|
|
|
|
{
|
|
|
|
|
boardList: (Board | IMetalsType)[];
|
|
|
|
|
}
|
|
|
|
|
interface SortBtnData
|
|
|
|
|
{
|
|
|
|
|
text: string;
|
|
|
|
|
icon: IconName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//列表选中时发出的事件
|
|
|
|
|
class ListItemSelectEvent
|
|
|
|
|
{
|
|
|
|
|
//选中单个列表事件,事件发出后,其他的item取消选中
|
|
|
|
|
SingerSelectItemEvent()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const ListItemSelectEventEmitter = new ListItemSelectEvent;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量查看板件属性 对话框
|
|
|
|
|
* @export
|
|
|
|
|
* @class LookOverBoardInfosModal
|
|
|
|
|
* 批量查看板件属性 对话框 (bbs)
|
|
|
|
|
*/
|
|
|
|
|
@observer
|
|
|
|
|
export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosModalProps, {}>
|
|
|
|
@ -70,14 +88,18 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
//需要修改的数据
|
|
|
|
|
modifyBoardData: Map<Board, IBoardInfoOptions> = new Map();
|
|
|
|
|
//列表中被选中的板件
|
|
|
|
|
@observable selectedBrOnList: Board[] = [];
|
|
|
|
|
selectedBrOnList: Board[] = [];
|
|
|
|
|
//查看同类板件的依据(如宽高、房间名等)
|
|
|
|
|
@observable findSameTypeBrDataKey: string;
|
|
|
|
|
//是否多选/单选
|
|
|
|
|
@observable isCtrlDown: boolean = false;
|
|
|
|
|
titleData = ["房名", "柜名", " 板件名", " 高", " 宽", " 厚", " 纹路", " 加工", "上封边", "下封边", "左封边", "右封边", " 板材名", "材料", "颜色", "异形", "造型"];
|
|
|
|
|
processGroupMap: Map<string, ObjectId[]> = new Map();//板件加工组 按名分类 便于区分
|
|
|
|
|
|
|
|
|
|
//可排序标题按钮的数据
|
|
|
|
|
@observable sortBtnData: SortBtnData[] = [ //tips:注意空格
|
|
|
|
|
{ text: " 高", icon: "blank" },
|
|
|
|
|
{ text: " 宽", icon: "blank" },
|
|
|
|
|
{ text: " 厚", icon: "blank" },
|
|
|
|
|
];
|
|
|
|
|
UNSAFE_componentWillMount()
|
|
|
|
|
{
|
|
|
|
|
this.UpdateDrillCount();
|
|
|
|
@ -127,10 +149,18 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
m.sort((a, b) => a.Index - b.Index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
InitWidth = () =>
|
|
|
|
|
{
|
|
|
|
|
let modal = document.getElementById("modal");
|
|
|
|
|
let modalc0 = modal.children[0] as HTMLElement;
|
|
|
|
|
modal.style.width = Math.min(1160, (window.innerWidth * 0.8)) + "px";
|
|
|
|
|
modalc0.style.width = modal.style.width;
|
|
|
|
|
};
|
|
|
|
|
//注册事件
|
|
|
|
|
componentDidMount()
|
|
|
|
|
{
|
|
|
|
|
let ed = app.Editor;
|
|
|
|
|
this.InitWidth();
|
|
|
|
|
|
|
|
|
|
let selectCtrl = app.Editor.SelectCtrl;
|
|
|
|
|
let dr = new DrillingReactor();
|
|
|
|
|
const UpdateByRedoUndo = (historyRec: CommandHistoryRecord) =>
|
|
|
|
@ -190,10 +220,12 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
return true;
|
|
|
|
|
}),
|
|
|
|
|
end(ed.KeyCtrl, ed.KeyCtrl.OnKeyUp, (e: KeyboardEvent) =>
|
|
|
|
|
begin(app.Editor.ModalManage, app.Editor.ModalManage.onKeyUp, (e: KeyboardEvent) =>
|
|
|
|
|
{
|
|
|
|
|
if (e.keyCode === KeyBoard.Control)
|
|
|
|
|
this.isCtrlDown = false;
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
return true;
|
|
|
|
|
}),
|
|
|
|
|
end(dr, dr.StartReactor, () =>
|
|
|
|
|
{
|
|
|
|
@ -287,7 +319,7 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
);
|
|
|
|
|
this.boardDataInArray.push({ br: b, arr: arr });
|
|
|
|
|
}
|
|
|
|
|
this.boardDataInArray.unshift({ br: null, arr: this.titleData });
|
|
|
|
|
this.boardDataInArray.unshift({ br: null, arr: TitleBanner.titleData });
|
|
|
|
|
};
|
|
|
|
|
//获取板的加工组名(加序号的) 在导出csv时使用
|
|
|
|
|
GetBrPGNamesWithNumber = (br: Board) =>
|
|
|
|
@ -365,13 +397,16 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
UpdateSeletctedBr = (index: number, findSameTypeBrDataKey?: string) =>
|
|
|
|
|
{
|
|
|
|
|
let br = this.dataList.realBr[index];
|
|
|
|
|
if (this.isCtrlDown)
|
|
|
|
|
{
|
|
|
|
|
if (this.selectedBrOnList.includes(br))
|
|
|
|
|
this.selectedBrOnList = this.selectedBrOnList.filter((b) => b !== br);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (this.isCtrlDown)//true多选 false单选
|
|
|
|
|
this.selectedBrOnList.push(br);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ListItemSelectEventEmitter.SingerSelectItemEvent();
|
|
|
|
|
this.selectedBrOnList = [br];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -575,9 +610,19 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
FileSystem.WriteFile(`${fileServer.currentFileInfo.name}批量查看板件属性.csv`, "\ufeff" + str);
|
|
|
|
|
};
|
|
|
|
|
//排序
|
|
|
|
|
handleOrder = (type: string, asc: boolean) =>
|
|
|
|
|
handleOrder = (btnText: string) =>
|
|
|
|
|
{
|
|
|
|
|
let d: SortBtnData;
|
|
|
|
|
let asc: boolean = false;
|
|
|
|
|
for (let data of this.sortBtnData)
|
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
if (data.text === btnText)
|
|
|
|
|
{
|
|
|
|
|
asc = data.icon === "symbol-triangle-up";
|
|
|
|
|
d = data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
switch (btnText)
|
|
|
|
|
{
|
|
|
|
|
case " 高":
|
|
|
|
|
this.UpdateDisplayData(this.searchRes.realBr.sort((a, b) => { return asc ? a.Height - b.Height : b.Height - a.Height; }));
|
|
|
|
@ -588,13 +633,20 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
case " 厚":
|
|
|
|
|
this.UpdateDisplayData(this.searchRes.realBr.sort((a, b) => { return asc ? a.Thickness - b.Thickness : b.Thickness - a.Thickness; }));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
//改变图标
|
|
|
|
|
if (d.icon === "blank")
|
|
|
|
|
d.icon = "symbol-triangle-up";
|
|
|
|
|
else
|
|
|
|
|
d.icon = d.icon === "symbol-triangle-up" ? "symbol-triangle-down" : "symbol-triangle-up";
|
|
|
|
|
};
|
|
|
|
|
//------------------------------对话框功能相关 结束------------------------------//
|
|
|
|
|
|
|
|
|
|
render()
|
|
|
|
|
{
|
|
|
|
|
const keyword = [" 高", " 宽", " 厚"];//tips:注意空格
|
|
|
|
|
const listItemHeight = 23;
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<div
|
|
|
|
@ -607,50 +659,66 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
icon="bold"
|
|
|
|
|
close={() => { this.OnOk(ModalState.Cancel); }}
|
|
|
|
|
/>
|
|
|
|
|
<div className={Classes.DIALOG_BODY + " flex " + Classes.CARD}>
|
|
|
|
|
<div className={Classes.DIALOG_BODY + " flex " + Classes.CARD} style={{ height: 400, width: "100%" }}>
|
|
|
|
|
{/* 列表 */}
|
|
|
|
|
<Card>
|
|
|
|
|
{/* 列表标题 */}
|
|
|
|
|
<div>
|
|
|
|
|
<table>
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>{this.titleData.map((data) =>
|
|
|
|
|
{
|
|
|
|
|
return (<th>
|
|
|
|
|
<AutoSizer>
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
keyword.includes(data) ?
|
|
|
|
|
<TitleSortButton text={data} func={this.handleOrder} />
|
|
|
|
|
:
|
|
|
|
|
<>{data}</>
|
|
|
|
|
}
|
|
|
|
|
</th>);
|
|
|
|
|
})}</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
<table>
|
|
|
|
|
<tbody>
|
|
|
|
|
({ height, width }) => (
|
|
|
|
|
<>
|
|
|
|
|
<div
|
|
|
|
|
style={{ height: height * 0.85, width: width }}
|
|
|
|
|
onScroll={() =>
|
|
|
|
|
{
|
|
|
|
|
this.searchRes.dataBr.map((br, index) =>
|
|
|
|
|
let a = document.getElementsByClassName("bbs-list")[0].scrollLeft;
|
|
|
|
|
let b = document.getElementsByClassName("bbs-list-tr title")[0] as HTMLDivElement;
|
|
|
|
|
b.style.left = (-a) + "px";
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<TitleBanner sortBtnData={this.sortBtnData} handleOrder={this.handleOrder} style={{ height: listItemHeight }} />
|
|
|
|
|
<AutoSizer>
|
|
|
|
|
{
|
|
|
|
|
({ height, width }) => (
|
|
|
|
|
<List
|
|
|
|
|
height={height - listItemHeight}
|
|
|
|
|
className="bbs-list"
|
|
|
|
|
width={width}
|
|
|
|
|
itemCount={this.searchRes.dataBr.length}
|
|
|
|
|
itemSize={() => listItemHeight}
|
|
|
|
|
>
|
|
|
|
|
{
|
|
|
|
|
return (
|
|
|
|
|
({ index, style }) => (
|
|
|
|
|
<BoardInfoList
|
|
|
|
|
className="bbs-tr"
|
|
|
|
|
index={index}
|
|
|
|
|
br={br}
|
|
|
|
|
br={this.searchRes.dataBr[index]}
|
|
|
|
|
isSelect={this.selectedBrOnList.includes(this.searchRes.realBr[index])}
|
|
|
|
|
UpdateSeletctedBr={this.UpdateSeletctedBr}
|
|
|
|
|
ModifyDataRecord={this.ModifyDataMap}
|
|
|
|
|
isSelected={this.selectedBrOnList.includes(this.searchRes.realBr[index])}
|
|
|
|
|
style={style}
|
|
|
|
|
processGroupData={this.processGroupMap}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</List>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
</AutoSizer>
|
|
|
|
|
</div>
|
|
|
|
|
<Divider style={{ height: 1, width: width * 0.99 }} />
|
|
|
|
|
{/* 配件信息 */}
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
<div style={{ height: height * 0.15 - 1, width: width, overflow: "auto", paddingLeft: 10 }} >
|
|
|
|
|
{/* 配件信息 */}
|
|
|
|
|
<PartsTable partsCount={this.drillCount} titles={["配件拆单名", "数量", "单位"]} />
|
|
|
|
|
<PartsTable partsCount={this.hardwareCount} titles={["五金名", "数量", "单位"]} />
|
|
|
|
|
</div>
|
|
|
|
|
}
|
|
|
|
|
</>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
</AutoSizer>
|
|
|
|
|
</Card>
|
|
|
|
|
</div>
|
|
|
|
|
<ModalFooter hasConfig={false}>
|
|
|
|
@ -701,22 +769,40 @@ export class LookOverBoardInfosModal extends React.Component<LookOverBoardInfosM
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@observer
|
|
|
|
|
class TitleSortButton extends React.Component<{ text: string, func: Function; }, {}>
|
|
|
|
|
class TitleBanner extends React.Component<{ sortBtnData: SortBtnData[], style: any, handleOrder: Function; }, {}>
|
|
|
|
|
{
|
|
|
|
|
@observable icon: IconName = "blank";
|
|
|
|
|
handleClick = () =>
|
|
|
|
|
static titleData = ["序号", "房名", "柜名", " 板件名", " 高", " 宽", " 厚", " 纹路", " 加工", "上封边", "下封边", "左封边", "右封边", " 板材名", "材料", "颜色", "异形", "造型"];
|
|
|
|
|
render()
|
|
|
|
|
{
|
|
|
|
|
return (
|
|
|
|
|
<div className="bbs-list-tr title" style={{ ...this.props.style, width: "fit-content", position: "relative" }}>
|
|
|
|
|
{
|
|
|
|
|
TitleBanner.titleData.map((data) =>
|
|
|
|
|
<div className="bbs-list-th bbs-td">
|
|
|
|
|
{
|
|
|
|
|
this.props.sortBtnData.findIndex((d) => d.text === data) === -1 ?
|
|
|
|
|
<>{data}</>
|
|
|
|
|
:
|
|
|
|
|
<TitleSortButton
|
|
|
|
|
sortBtnData={this.props.sortBtnData[this.props.sortBtnData.findIndex((d) => d.text === data)]}
|
|
|
|
|
func={this.props.handleOrder}
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class TitleSortButton extends React.Component<{ sortBtnData: SortBtnData, func: Function; }, {}>
|
|
|
|
|
{
|
|
|
|
|
if (this.icon === "blank")
|
|
|
|
|
this.icon = "symbol-triangle-up";
|
|
|
|
|
else
|
|
|
|
|
this.icon = this.icon === "symbol-triangle-up" ? "symbol-triangle-down" : "symbol-triangle-up";
|
|
|
|
|
this.props.func(this.props.text, this.icon === "symbol-triangle-up");
|
|
|
|
|
};
|
|
|
|
|
render()
|
|
|
|
|
{
|
|
|
|
|
return (
|
|
|
|
|
<Button className={"sort-btn"} text={this.props.text} small minimal rightIcon={this.icon} onClick={() => this.handleClick()} />
|
|
|
|
|
<Button className={"sort-btn"} text={this.props.sortBtnData.text} small minimal rightIcon={this.props.sortBtnData.icon} onClick={() => this.props.func(this.props.sortBtnData.text)} />
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -734,21 +820,18 @@ class PartsTable extends React.Component<IPartsTableProps, {}>
|
|
|
|
|
{
|
|
|
|
|
const { partsCount } = this.props;
|
|
|
|
|
|
|
|
|
|
if (!partsCount?.length)
|
|
|
|
|
if (!partsCount)
|
|
|
|
|
return null;
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<Divider />
|
|
|
|
|
<div>
|
|
|
|
|
<table><thead><tr>
|
|
|
|
|
<table>
|
|
|
|
|
<thead><tr>
|
|
|
|
|
{
|
|
|
|
|
this.props.titles.map(s => <th>{s}</th>)
|
|
|
|
|
}
|
|
|
|
|
</tr></thead></table>
|
|
|
|
|
</div>
|
|
|
|
|
<table>
|
|
|
|
|
</tr></thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
{
|
|
|
|
|
partsCount.length > 0 ?
|
|
|
|
|
partsCount.map((data) =>
|
|
|
|
|
{
|
|
|
|
|
return (
|
|
|
|
@ -758,11 +841,15 @@ class PartsTable extends React.Component<IPartsTableProps, {}>
|
|
|
|
|
<td>{`个`}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
);
|
|
|
|
|
})
|
|
|
|
|
}) :
|
|
|
|
|
<tr>
|
|
|
|
|
<td>{"[ 无 ]"}</td>
|
|
|
|
|
<td>{0}</td>
|
|
|
|
|
<td>{`个`}</td>
|
|
|
|
|
</tr>
|
|
|
|
|
}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|