!2044 功能:公用模型发布

pull/2047/head
黄诗津 2 years ago committed by ChenX
parent 7f26d39e89
commit aba8d13a22

@ -83,6 +83,7 @@ export const TemplateUrls = {
check: CURRENT_HOST + "/GoodsSearch-moduleManage", check: CURRENT_HOST + "/GoodsSearch-moduleManage",
uploadCover: CURRENT_HOST + "/CAD-moduleDiyLogo", uploadCover: CURRENT_HOST + "/CAD-moduleDiyLogo",
collection: CURRENT_HOST + "/CAD-colModuleList", collection: CURRENT_HOST + "/CAD-colModuleList",
publishing: CURRENT_HOST + "/CAD-moduleDeploy",
}; };
export const ConfigUrls = { export const ConfigUrls = {

@ -15,6 +15,7 @@ import { copyTextToClipboard } from '../../../Common/Utils';
import { TemplateParam } from '../../../DatabaseServices/Template/Param/TemplateParam'; import { TemplateParam } from '../../../DatabaseServices/Template/Param/TemplateParam';
import { GetOnlineTemplate } from '../../../DatabaseServices/Template/TempateUtils'; import { GetOnlineTemplate } from '../../../DatabaseServices/Template/TempateUtils';
import { commandMachine } from '../../../Editor/CommandMachine'; import { commandMachine } from '../../../Editor/CommandMachine';
import { userConfig } from '../../../Editor/UserConfig';
import { DisableChangeParName, DrawerTempParName, IDrawerDoorTempInfo, ISelectTempInfo } from '../../Store/DoorInterface'; import { DisableChangeParName, DrawerTempParName, IDrawerDoorTempInfo, ISelectTempInfo } from '../../Store/DoorInterface';
import { ITemplateParam } from "../../Store/RightPanelStore/ITemplateParam"; import { ITemplateParam } from "../../Store/RightPanelStore/ITemplateParam";
import { TempalteEditorStore } from '../../Store/TemplateEditorStore'; import { TempalteEditorStore } from '../../Store/TemplateEditorStore';
@ -23,6 +24,7 @@ import { CommonPanel, IDirectoryProps } from '../SourceManage/CommonPanel';
import { AppToaster } from '../Toaster'; import { AppToaster } from '../Toaster';
import { IGetRoomInfo } from './GetRoomCabName'; import { IGetRoomInfo } from './GetRoomCabName';
import { TemplateDetail } from './TemplateDetail'; import { TemplateDetail } from './TemplateDetail';
import { TemplateResourceTree } from './TemplateResourceTree';
export interface ITemplateListProps export interface ITemplateListProps
{ {
deleteFun?: (temp: { module_id; }) => void; deleteFun?: (temp: { module_id; }) => void;
@ -67,6 +69,7 @@ export interface ITempItemBack
export class TemplateList extends React.Component<ITemplateListProps> { export class TemplateList extends React.Component<ITemplateListProps> {
private _params: TemplateParam[] = []; private _params: TemplateParam[] = [];
private watchDir: Function; private watchDir: Function;
openResourceTree = observable.box(false);
store: TempalteEditorStore; store: TempalteEditorStore;
UNSAFE_componentWillMount() UNSAFE_componentWillMount()
{ {
@ -113,6 +116,10 @@ export class TemplateList extends React.Component<ITemplateListProps> {
currentDir={this.props.currentDir} currentDir={this.props.currentDir}
isShowDetail={this.props.isShowDetail} isShowDetail={this.props.isShowDetail}
/> />
<TemplateResourceTree
openResourceTree={this.openResourceTree}
handleNodeClick={this.handleResourceTreeNodeclick}
/>;
</div> </div>
); );
} }
@ -246,6 +253,14 @@ export class TemplateList extends React.Component<ITemplateListProps> {
onClick={() => this.openDir(temp)} onClick={() => this.openDir(temp)}
/> />
} }
{
userConfig.isAdmin &&
<MenuItem
icon="upload"
text="公用模型发布"
onClick={() => this.openResourceTree.set(true)}
/>
}
</Menu>, </Menu>,
{ left: e.clientX, top: e.clientY }, { left: e.clientX, top: e.clientY },
() => this.setState({ isContextMenuOpen: false }), () => this.setState({ isContextMenuOpen: false }),
@ -256,6 +271,34 @@ export class TemplateList extends React.Component<ITemplateListProps> {
e.preventDefault(); e.preventDefault();
}; };
private handleResourceTreeNodeclick = async (nodeDataId: number) =>
{
if (!nodeDataId) return;
let selectIds = [...this.props.selectIds];
let res = await PostJson(TemplateUrls.publishing, {
module_ids: selectIds,
class_id: nodeDataId
});
if (res.err_code === RequestStatus.Ok)
{
AppToaster.show({
message: "模型发布成功",
timeout: 1000,
intent: Intent.SUCCESS,
});
}
else
{
AppToaster.show({
message: `${res.err_msg}`,
timeout: 1000,
intent: Intent.DANGER,
});
}
this.openResourceTree.set(false);
};
//复制ID //复制ID
private copyid = (temp: ITempItemBack) => private copyid = (temp: ITempItemBack) =>
{ {

@ -0,0 +1,25 @@
.resourceTree-card {
height: 100%;
padding: 0;
display: flex;
flex-direction: column;
}
.resourceTree-tree {
flex-grow: 1;
height: 100px;
.bp3-tree {
height: 100%;
overflow-y: scroll;
}
}
.resourceTree-state {
display: flex;
justify-content: flex-end;
button {
margin: 5px;
}
}

@ -0,0 +1,144 @@
import { Button, Card, Classes, Dialog, ITreeNode, Tree } from "@blueprintjs/core";
import { action, IObservableValue, observable } from "mobx";
import { observer } from "mobx-react";
import React from "react";
import { ResourceLibraryURL } from "../../../Common/HostUrl";
import { PostJson, RequestStatus } from "../../../Common/Request";
import { Intent } from "../../../Common/Toaster";
import { RenderClassList } from "../ToolBar/ResourceLibrary/ResourceInterfaces";
import "./TemplateResourceTree.less";
interface ITemplateResourceTree
{
openResourceTree: IObservableValue<boolean>;
handleNodeClick: (nodeId: number) => void;
}
@observer
export class TemplateResourceTree extends React.Component<ITemplateResourceTree>
{
constructor(prop)
{
super(prop);
this.GetResource();
}
@observable isloading = false;
private nodes: ITreeNode[] = [];
@observable private currentNodeId: number;
@action
async GetResource()
{
this.isloading = false;
let response = await PostJson(ResourceLibraryURL.RenderClassList, { class_type: 1 }) as RenderClassList;
if (response.err_code === RequestStatus.Ok)
{
this.nodes = this.parseNodes(response.class);
}
this.isloading = true;
}
private handleNodeClick = (nodeData: ITreeNode, _nodePath: number[]) =>
{
this.isloading = false;
this.currentNodeId = undefined;
this.forEachNode(this.nodes, n => (n.isSelected = false));
if (nodeData.childNodes.length === 0)
{
this.currentNodeId = Number(nodeData.id);
nodeData.isSelected = true;
}
this.isloading = true;
};
private forEachNode(nodes: ITreeNode[], callback: (node: ITreeNode) => void)
{
if (nodes == null)
{
return;
}
for (const node of nodes)
{
callback(node);
this.forEachNode(node.childNodes, callback);
}
}
private handleNodeCollapse = (nodeData: ITreeNode, isCollapse: boolean) =>
{
this.isloading = false;
nodeData.isExpanded = !isCollapse;
this.isloading = true;
};
private parseNodes = (dirs: any) =>
{
let newNodes: ITreeNode[] = [];
if (!dirs) return newNodes;
for (let dir of dirs)
{
let node: ITreeNode = {
id: dir.id,
label: dir.name,
isExpanded: false,
hasCaret: dir.c?.length > 0,
className: dir.id,
childNodes: this.parseNodes(dir.c),
};
newNodes.push(node);
}
return newNodes;
};
handleClose = () =>
{
this.props.openResourceTree.set(false);
};
render(): React.ReactNode
{
return (
<Dialog
isOpen={this.props.openResourceTree.get()}
onClose={this.handleClose}
icon="info-sign"
title="选择模型库"
usePortal={true}
canOutsideClickClose={false}
portalContainer={document.getElementById('modal')}
portalClassName="select-img"
style={{
width: 300,
height: 500
}}
>
<Card className={Classes.DIALOG_BODY + " resourceTree-card"}>
<div className="resourceTree-tree">
{
this.isloading && this.nodes &&
<Tree
contents={this.nodes}
onNodeClick={this.handleNodeClick}
onNodeCollapse={(node) => this.handleNodeCollapse(node, true)}
onNodeExpand={(node) => this.handleNodeCollapse(node, false)}
className={Classes.ELEVATION_0}
/>
}
</div>
<div className="resourceTree-state">
<Button
disabled={!Boolean(this.currentNodeId)}
text="发布"
intent={Intent.SUCCESS}
onClick={() => { this.props.handleNodeClick(this.currentNodeId); }}
/>
<Button
text="取消"
intent={Intent.DANGER}
onClick={this.handleClose}
/>
</div>
</Card>
</Dialog>
);
}
}

@ -76,38 +76,39 @@ export default class Resource_Search extends Component<{}, {}>
e.target.value = ''; e.target.value = '';
}; };
render() RenderCategoryItem = (item: ResourceClass) =>
{ {
const RenderCategoryItem = (item: ResourceClass) => return (
{ <div key={item.id}>
return ( <span className={Classes.POPOVER_DISMISS}
<div key={item.id}> onClick={() =>
<span className={Classes.POPOVER_DISMISS}
onClick={() =>
{
this.resourceStore.HandleCategoryOnChange(item);
}}>
{item.name}
</span>
{item?.c?.map((item: ResourceClass) =>
{ {
return ( this.resourceStore.HandleCategoryOnChange(item);
<Button }}>
minimal {item.name}
small </span>
key={item.id} {item?.c?.map((item: ResourceClass) =>
className={Classes.POPOVER_DISMISS} {
onClick={() => return (
{ <Button
this.resourceStore.HandleCategoryOnChange(item); minimal
}} small
> {item.name} key={item.id}
</Button> className={Classes.POPOVER_DISMISS}
); onClick={() =>
})} {
</div> this.resourceStore.HandleCategoryOnChange(item);
); }}
}; > {item.name}
</Button>
);
})}
</div>
);
};
render()
{
return ( return (
<> <>
<div className="header"> <div className="header">
@ -145,7 +146,7 @@ export default class Resource_Search extends Component<{}, {}>
{this.resourceStore.resourceClass.map((item: ResourceClass) => {this.resourceStore.resourceClass.map((item: ResourceClass) =>
{ {
return ( return (
RenderCategoryItem(item) this.RenderCategoryItem(item)
); );
})} })}
</div> </div>
@ -159,7 +160,7 @@ export default class Resource_Search extends Component<{}, {}>
{this.resourceStore.resourceClass.map((item: ResourceClass) => {this.resourceStore.resourceClass.map((item: ResourceClass) =>
{ {
return ( return (
RenderCategoryItem(item) this.RenderCategoryItem(item)
); );
})} })}
</div> </div>
@ -215,7 +216,6 @@ export default class Resource_Search extends Component<{}, {}>
{ {
this.resourceStore.clearAble = false; this.resourceStore.clearAble = false;
} }
// console.log(this.resourceStore.clearAble);
}} }}
onKeyDown={(e: React.KeyboardEvent) => onKeyDown={(e: React.KeyboardEvent) =>
{ {

Loading…
Cancel
Save