diff --git a/Imports/breadcrumbs.mf b/Imports/breadcrumbs.mf new file mode 100644 index 0000000..17f1936 --- /dev/null +++ b/Imports/breadcrumbs.mf @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Imports/breadcrumbs/Import/CommandBarButton/hl_itemview.breadcrumbs.xml b/Imports/breadcrumbs/Import/CommandBarButton/hl_itemview.breadcrumbs.xml new file mode 100644 index 0000000..64db276 --- /dev/null +++ b/Imports/breadcrumbs/Import/CommandBarButton/hl_itemview.breadcrumbs.xml @@ -0,0 +1,7 @@ + + + UpdateTearOffWindowState + + hl_itemview.breadcrumbs + + \ No newline at end of file diff --git a/Imports/breadcrumbs/Import/CommandBarSectionItem/itemview.titlebar.default hl_itemview.breadcrumbs.xml b/Imports/breadcrumbs/Import/CommandBarSectionItem/itemview.titlebar.default hl_itemview.breadcrumbs.xml new file mode 100644 index 0000000..006096b --- /dev/null +++ b/Imports/breadcrumbs/Import/CommandBarSectionItem/itemview.titlebar.default hl_itemview.breadcrumbs.xml @@ -0,0 +1,13 @@ + + + Add + C72B97BF295F42339C4A610F3A3F741D + + + World + + + 512 + ECB4E1CD4587418FBB415F577A8DD807 + + \ No newline at end of file diff --git a/Imports/breadcrumbs/Import/Method/hl_Breadcrumbs_Init.xml b/Imports/breadcrumbs/Import/Method/hl_Breadcrumbs_Init.xml new file mode 100644 index 0000000..c89fdf2 --- /dev/null +++ b/Imports/breadcrumbs/Import/Method/hl_Breadcrumbs_Init.xml @@ -0,0 +1,200 @@ + + + HL : FAW369 : 面包屑导航 + + + World + + + '; + + let itemToolBar = titleBarControl.querySelector('.aras-toolbar'); + titleBarControl.insertBefore(breadcrumbs, itemToolBar); + } + + breadOlEle = breadcrumbs.querySelector("#breadOl"); + if(openerWin){ + addPathNode(openerWin.name,false); + } + addPathNode(window.name,true); + + titleBarControl.style.height = "auto"; +}catch{ + +} + +mainWindow.openPreWindow = (aNodeId,currentWin) => { + if (!mainWindow) { + mainWindow = aras.getMainWindow(); + } + + let targetNode=currentWin.document.getElementById(aNodeId); + let winName = targetNode.name; + const preWnd = mainWindow[winName]; + if (!preWnd) { + if(targetNode.isItemWindow){ + const itemWin=findLastVersionWindow(targetNode); + if(!itemWin){ + aras.getNotifyByContext(currentWin)("页面已关闭"); + return; + } + winName=itemWin.name; + }else{ + aras.getNotifyByContext(currentWin)("页面已关闭"); + return; + } + } + + let closeTabs=[currentWin.name]; + while(targetNode.parentElement.nextSibling){ + const nextNode=targetNode.parentElement.nextSibling.firstChild; + if(nextNode.tagName=="EM"){ + break; + } + + let nextWin=mainWindow[nextNode.name]; + if(!nextWin){ + if(nextNode.isItemWindow){ + nextWin=findLastVersionWindow(nextNode); + if(nextWin){ + closeTabs.push(nextWin.name); + } + } + }else{ + closeTabs.push(nextWin.name); + } + targetNode=nextNode; + } + mainWindow.arasTabs.selectTab(winName); + //mainWindow.arasTabs.closeTabs(closeTabs).then((xxx)=>{ + // mainWindow.arasTabs.selectTab(winName); + //}); +}; + +function addPathNode(winName,isLastPath){ + let pageName; + // let isItemWindow; + let breadIcon; + const openerWin = mainWindow[winName]; + // if (openerWin.isItemsGrid) { + // pageName = "搜索"; + // breadIcon = '../images/ExecuteSearch.svg'; + // } else if (openerWin.isItemWindow) { + // pageName = aras.getKeyedNameEx(openerWin.item); + // breadIcon=getItemTypeIcon(openerWin.item,openerWin.itemTypeName); + // isItemWindow=true; + // } else if (openerWin.name.includes('page_Ans_Dashboard_UI')) { + // pageName = "看板"; + // breadIcon = '../images/NodeView.svg'; + // } else if (openerWin.name.includes('page_hl_Navigation')) { + // pageName = "导航"; + // breadIcon = '../images/EBOM.svg'; + // }else if(openerWin.ES){ + // pageName = "全局搜索"; + // breadIcon = '../images/Loupe.svg'; + // }else if (openerWin?.windowType == "whereUsed") { + // pageName = "用于何处"; + // breadIcon=getItemTypeIcon(aras.getItemById(openerWin.itemTypeName,openerWin.itemId),openerWin.itemTypeName); + // } else if (openerWin?.windowType == "structureBrowser") { + // pageName = "结构浏览"; + // breadIcon=getItemTypeIcon(aras.getItemById(openerWin.itemTypeName,openerWin.itemId),openerWin.itemTypeName); + // }else if(openerWin?.SPDM?.FileExplorer){ + // pageName = "文件管理"; + // breadIcon = '../images/Help.svg'; + // } else { + // pageName = "未知页面"; + // breadIcon = '../images/Help.svg'; + // } + + const winTab=mainWindow.arasTabs.data.get(winName); + breadIcon=winTab.image; + pageName=winTab.label; + + let newP = winDoc.createElement("li"); + let aNode; + if (isLastPath) { + aNode = winDoc.createElement("em"); + aNode.id=winName; + newP.className = "current"; + } else { + aNode = winDoc.createElement("a"); + aNode.id=winName; + aNode.href = `javascript:aras.getMainWindow().openPreWindow('${winName}',this);`; + aNode.name = winName; + if(openerWin.isItemWindow){ + aNode.isItemWindow=true; + aNode.itemTypeName=openerWin.itemTypeName; + aNode.itemID=openerWin.itemID; + } + } + + let spanNode = winDoc.createElement("span"); + spanNode.style.backgroundImage = `url('${breadIcon}')`; + aNode.appendChild(spanNode); + let textNode = winDoc.createElement("a"); + textNode.innerText=pageName; + aNode.appendChild(textNode); + + newP.appendChild(aNode); + breadOlEle.appendChild(newP); +} + +function findLastVersionWindow(targetNode){ + const itemType = aras.getItemTypeForClient(targetNode.itemTypeName, 'name'); + if(itemType.getProperty('is_versionable') == '1'){ + const lastItem=mainWindow.aras.getItemLastVersion(targetNode.itemTypeName,targetNode.itemID); + // const itemWin=aras.uiFindAndSetFocusWindowEx(lastItem.getAttribute("id")); + const itemWin=aras.uiFindWindowEx(lastItem.getAttribute("id")); + return itemWin; + } + return null; +} + +function getItemTypeIcon(currentItem, itName) { + let breadIcon; + const itemType = aras.getItemTypeForClient(itName, 'name'); + if (typeof currentItem !== "undefined" && currentItem) { + breadIcon = breadIcon || aras.getItemProperty(currentItem, 'icon') || aras.getItemProperty(currentItem, 'image') || aras.getItemProperty(currentItem, 'open_icon') || aras.getItemProperty(currentItem, 'thumbnail'); + } + breadIcon = breadIcon || itemType.getProperty('large_icon') || '../images/DefaultItemType.svg'; + return breadIcon; +}]]> + JavaScript + hl_Breadcrumbs_Init + + \ No newline at end of file diff --git a/Imports/breadcrumbs/Import/Method/hl_ItemView_Breadcrumbs_Init.xml b/Imports/breadcrumbs/Import/Method/hl_ItemView_Breadcrumbs_Init.xml new file mode 100644 index 0000000..435eb34 --- /dev/null +++ b/Imports/breadcrumbs/Import/Method/hl_ItemView_Breadcrumbs_Init.xml @@ -0,0 +1,24 @@ + + + HL : FAW369 : 面包屑导航 + + + World + + + + JavaScript + hl_ItemView_Breadcrumbs_Init + + \ No newline at end of file diff --git a/Innovator/Client/javascript/IncludeNamespaceConfig.xml b/Innovator/Client/javascript/IncludeNamespaceConfig.xml new file mode 100644 index 0000000..3d29f17 --- /dev/null +++ b/Innovator/Client/javascript/IncludeNamespaceConfig.xml @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Innovator/Client/styles/huilian/breadcrumb-nav.css b/Innovator/Client/styles/huilian/breadcrumb-nav.css new file mode 100644 index 0000000..30616eb --- /dev/null +++ b/Innovator/Client/styles/huilian/breadcrumb-nav.css @@ -0,0 +1,229 @@ +/* -------------------------------- + +Add by tz 2022/6/6 面包屑效果样式 + +-------------------------------- */ +.htmleaf-container { + margin: 0 auto; + text-align: center; + overflow: hidden; + line-height: 1px; +} + +.htmleaf-container a { + text-decoration: none; + outline: none; + height: 20px; +} + +/* -------------------------------- + +Basic Style + +-------------------------------- */ +.cd-breadcrumb { + padding: 0.5em 1em; + margin: 1em auto; + background-color: #edeff0; + border-radius: .25em; + margin-block: auto; } + +.cd-breadcrumb li { + display: inline-block; + float: left; + margin: 0.5em 0; +} + +.cd-breadcrumb li::after { + /* this is the separator between items */ + display: inline-block; + content: '\00bb'; + margin: 0 .6em; + color: #959fa5; +} + +.cd-breadcrumb li:last-of-type::after { + /* hide separator after the last item */ + display: none; +} + +.cd-breadcrumb li>* { + /* single step */ + display: inline-block; + font-size: 10px; + color: #2c3f4c; +} + +.cd-breadcrumb li.current>* { + /* selected step */ + color: #96c03d; +} + +.cd-breadcrumb li>a:hover { + /* steps already visited */ + color: #96c03d; +} + +.cd-breadcrumb.custom-separator li::after { + /* replace the default arrow separator with a custom icon */ + content: ''; + height: 16px; + width: 16px; + background: url(../styles/../img/cd-custom-separator.svg) no-repeat center center; + vertical-align: middle; +} + +.cd-breadcrumb.custom-icons li>a>span, .cd-breadcrumb.custom-icons li>em>span { + /* add a custom icon before each item */ + content: ''; + display: inline-block; + height: 20px; + width: 20px; + margin-right: .4em; + margin-top: -2px; + /* background: url(../styles/./img/cd-custom-icons-01.svg) no-repeat 0 0; */ + vertical-align: middle; + /* background: url(../styles/./img/ExecuteSearch.svg) no-repeat; */ + background-size: 100% 100%; +} + +.cd-breadcrumb.custom-icons li>a>a, .cd-breadcrumb.custom-icons li>em>a { + /* add a custom icon before each item */ + max-width: 150px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.cd-breadcrumb.custom-icons li>a, .cd-breadcrumb.custom-icons li>em { + text-overflow: ellipsis; + max-width: 150px; + white-space: nowrap; + /* overflow: hidden; */ +} + +.cd-breadcrumb.custom-icons li>a>a { + display: inline-flex; +} + +/* -------------------------------- + +Triangle breadcrumb + +-------------------------------- */ +.cd-breadcrumb.triangle { + /* reset basic style */ + background-color: transparent; + padding: 0; +} + +.cd-breadcrumb.triangle li { + position: relative; + padding: 0; + margin: 4px 4px 4px 0; +} + +.cd-breadcrumb.triangle li:last-of-type { + margin-right: 0; +} + +.cd-breadcrumb.triangle li>* { + position: relative; + padding: 0.5em 0.8em 0.5em 2.5em; + color: #2c3f4c; + background-color: #d4d4d4; + /* the border color is used to style its ::after pseudo-element */ + border-color: #d4d4d4; +} + +.cd-breadcrumb.triangle li.current>* { + /* selected step */ + color: #ffffff; + background-color: #96c03d; + border-color: #96c03d; + font-style: initial; +} + +.cd-breadcrumb.triangle li:first-of-type>* { + padding-left: 1.6em; + border-radius: .25em 0 0 .25em; +} + +.cd-breadcrumb.triangle li:last-of-type>* { + padding-right: 1.6em; + /* padding-bottom:12px; */ + border-radius: 0 .25em .25em 0; + overflow: hidden; + height: 20px; +} + +.cd-breadcrumb.triangle li>a:hover { + /* steps already visited */ + color: #ffffff; + background-color: #2c3f4c; + border-color: #2c3f4c; +} + +.cd-breadcrumb.triangle li::after, .cd-breadcrumb.triangle li>*::after { + content: ''; + position: absolute; + top: 0; + left: 100%; + content: ''; + height: 0; + width: 0; + /* 48px is the height of the element */ + border: 24px solid transparent; + border-right-width: 0; + border-left-width: 20px; +} + +.cd-breadcrumb.triangle li::after { + /* this is the white separator between two items */ + z-index: 1; + -webkit-transform: translateX(4px); + -moz-transform: translateX(4px); + -ms-transform: translateX(4px); + -o-transform: translateX(4px); + transform: translateX(4px); + border-left-color: #ffffff; + /* reset style */ + margin: 0; +} + +.cd-breadcrumb.triangle li>*::after { + /* this is the colored triangle after each element */ + z-index: 2; + border-left-color: inherit; +} + +.cd-breadcrumb.triangle li:last-of-type::after, .cd-breadcrumb.triangle li:last-of-type>*::after { + /* hide the triangle after the last step */ + display: none; +} + +.cd-breadcrumb.triangle.custom-separator li::after { + /* reset style */ + background-image: none; +} + +.cd-breadcrumb.triangle.custom-icons li::after, .cd-breadcrumb.triangle.custom-icons li>*::after { + /* 50px is the height of the element */ + border-top-width: 15px; + border-bottom-width: 15px; +} + +/* -------------------------------- + +Custom icons hover effects - breadcrumb and multi-steps + +-------------------------------- */ +.cd-breadcrumb.triangle.custom-icons li a:hover span { + background-color: #ffffff; +} + +/* -------------------------------- + +End by tz 2022/6/6 面包屑效果样式 + +-------------------------------- */ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6febcaa --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# 面包屑导航 + +Aras Innovator面包屑导航功能,开启对象页面后会在顶部展示当前页面来源路径,点击导航节点可跳转至其它对象页面 + +![screenshot](Screenshots/效果图.png) + +## 支持系统版本 +Aras Innovator Version 22 Build: 14.0.8.35675 + +## 安装 + +#### 提醒! +**请提前备份数据库与CodeTree** + +### 必备条件 + +1. Aras Innovator 已安装 (version 22) +2. Aras Package Import 导入工具 + +#### Code tree 安装步骤 + +1. 备份您的CodeTree并存储在安全的地方 +2. 打开本地 `..\BreadcrumbNavigation\` 文件夹 +3. 复制 `\Innovator\` 文件夹 +4. 将其粘贴到安装目录的根目录 + + 默认情况下路径为 `C:\Program Files\Aras\Innovator\` + +#### Database 安装步骤 + +1. 备份您的数据库并将BAK文件存储在安全的地方 +2. 打开 Aras Package Import 工具 +3. 输入Aras Innovator系统地址并点击 **Login** +4. 在弹出的登录页面中输入登录信息 +4. 在 **TargetRelease** 控件中输入**包**的名称(可随意填写,建议填写 `BreadcrumbNavigation`) + * 可选: 在 **Description** 控件中描述信息 +5. 在 **Path** 控件中输入本地安装包路径 `..\BreadcrumbNavigation\Imports\breadcrumbs.mf` +6. 在 **Available for Import** 控件中勾选 **breadcrumbs** +7. 选择 Type = **Merge** , Mode = **Thorough Mode** +8. 点击顶部左侧 **Import** +9. 等待导入成功后关闭 Aras Package Import 工具 + +#### + +现在您可以访问系统并使用面包屑导航功能了 + + +## 联系我 +[QQ:408153664](tencent://message/?uin=408153664) + diff --git "a/Screenshots/\346\225\210\346\236\234\345\233\276.png" "b/Screenshots/\346\225\210\346\236\234\345\233\276.png" new file mode 100644 index 0000000..e4eeb5c Binary files /dev/null and "b/Screenshots/\346\225\210\346\236\234\345\233\276.png" differ