You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

showinfo.tmpl 24 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. {{template "base/head" .}}
  2. <div class="repository">
  3. {{template "repo/header" .}}
  4. <style>
  5. .model_header_text{
  6. font-size: 14px;
  7. color: #101010;
  8. font-weight: bold;
  9. }
  10. .ti_form{
  11. text-align: left;
  12. max-width: 100%;
  13. vertical-align: middle;
  14. }
  15. .ti-text-form-label {
  16. padding-bottom: 20px;
  17. padding-right: 20px;
  18. color: #8a8e99;
  19. font-size: 14px;
  20. white-space: nowrap !important;
  21. width: 80px;
  22. line-height: 30px;
  23. }
  24. .ti-text-form-content {
  25. line-height: 30px;
  26. padding-bottom: 20px;
  27. width: 100%;
  28. }
  29. .change-version{
  30. min-width: auto !important;
  31. border: 1px solid rgba(187, 187, 187, 100) !important;
  32. border-radius: .38571429rem !important;
  33. margin-left: 1.5em;
  34. }
  35. .title-word-elipsis{
  36. overflow: hidden;
  37. text-overflow: ellipsis;
  38. white-space: nowrap;
  39. width: 30%;
  40. }
  41. .word-elipsis{
  42. overflow: hidden;
  43. text-overflow: ellipsis;
  44. white-space: nowrap;
  45. padding-right: 80px;
  46. }
  47. .half-table{
  48. width: 50%;
  49. float: left;
  50. }
  51. .text-width80 {
  52. width: 100px;
  53. line-height: 30px;
  54. }
  55. .tableStyle{
  56. width:100%;
  57. table-layout: fixed;
  58. }
  59. .iword-elipsis{
  60. display: inline-block;
  61. width: 80%;
  62. overflow: hidden;
  63. text-overflow: ellipsis;
  64. white-space: nowrap;
  65. }
  66. </style>
  67. <div class="ui container">
  68. <h4 class="ui header" id="vertical-segment">
  69. <!-- <a href="javascript:window.history.back();"><i class="arrow left icon"></i>返回</a> -->
  70. <div class="ui breadcrumb">
  71. <a class="section" href="{{$.RepoLink}}/modelmanage/show_model">
  72. {{$.i18n.Tr "repo.model.manage.model_manage"}}
  73. </a>
  74. <div class="divider"> / </div>
  75. <div class="active section">{{.name}}</div>
  76. </div>
  77. <select class="ui dropdown tiny change-version" id="dropdown" onchange="changeInfo(this.value)">
  78. </select>
  79. </h4>
  80. <div id="showInfo" style="border:1px solid #e2e2e2;padding: 20px 60px;margin-top:24px">
  81. <div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);">
  82. <a class="active item" data-tab="first">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a>
  83. <a class="item" data-tab="second">{{$.i18n.Tr "repo.model_download"}}</a>
  84. </div>
  85. <div class="ui tab active" data-tab="first">
  86. <div class="half-table">
  87. <span class="model_header_text">{{$.i18n.Tr "repo.model.manage.baseinfo"}}</span>
  88. <table class="tableStyle" style="margin-top:20px;">
  89. <tbody>
  90. <tr>
  91. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.model_name"}}</td>
  92. <td class="ti-text-form-content word-elipsis"><span id="ModelName" title=""></span></td>
  93. </tr>
  94. <tr>
  95. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.version"}}</td>
  96. <td class="ti-text-form-content word-elipsis"><span id="Version" title=""></span></td>
  97. </tr>
  98. <tr>
  99. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.migrate_items_labels"}}</td>
  100. <td class="ti-text-form-content">
  101. <div id="Label" style="overflow: hidden;width: 95%;">
  102. </div>
  103. </td>
  104. </tr>
  105. <tr>
  106. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.model_size"}}</td>
  107. <td class="ti-text-form-content word-elipsis"><span id="Size" title=""></span></td>
  108. </tr>
  109. <tr>
  110. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.createtime"}}</td>
  111. <td class="ti-text-form-content word-elipsis"><span id="CreateTime" title=""></span></td>
  112. </tr>
  113. <tr>
  114. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.description"}}</td>
  115. <td class="ti-text-form-content" >
  116. <div id="edit-td" style="display:flex">
  117. <span id="Description" title="" class="iword-elipsis"></span>
  118. <i id="edit-pencil" data-id="" data-desc="" class="pencil alternate icon" style="cursor:pointer;vertical-align: top;" id="editor" onclick="editorFn(this)"></i>
  119. </div>
  120. </td>
  121. </tr>
  122. <tr>
  123. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job"}}</td>
  124. <td class="ti-text-form-content word-elipsis">
  125. <a id="DisplayJobNameHref" class="title" style="font-size: 14px;" target="_blank">
  126. <span id="DisplayJobName" class="fitted" style="width: 90%;vertical-align: middle;"></span>
  127. </a>
  128. </td>
  129. </tr>
  130. <tr>
  131. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.code_version"}}</td>
  132. <td class="ti-text-form-content word-elipsis"><span id="CodeBranch" title=""></span></td>
  133. </tr>
  134. <tr>
  135. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.start_file"}}</td>
  136. <td class="ti-text-form-content word-elipsis"><span id="BootFile" title=""></span></td>
  137. </tr>
  138. <tr>
  139. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}}</td>
  140. <td class="ti-text-form-content word-elipsis"><span id="DatasetName" title=""></span></td>
  141. </tr>
  142. <tr>
  143. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</td>
  144. <td class="ti-text-form-content word-elipsis"><span id="Parameters" title=""></span></td>
  145. </tr>
  146. <tr>
  147. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.AI_Engine"}}</td>
  148. <td class="ti-text-form-content word-elipsis"><span id="EngineName" title=""></span></td>
  149. </tr>
  150. <tr>
  151. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.standard"}}</td>
  152. <td class="ti-text-form-content word-elipsis"><span id="FlavorName" title=""></span></td>
  153. </tr>
  154. <tr>
  155. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.modelarts.train_job.compute_node"}}</td>
  156. <td class="ti-text-form-content word-elipsis"><span id="WorkServerNumber" title=""></span></td>
  157. </tr>
  158. </tbody>
  159. </table>
  160. </div>
  161. <div class="half-table">
  162. <span class="model_header_text">{{$.i18n.Tr "repo.model.manage.model_accuracy"}}</span>
  163. <table class="tableStyle" style="margin-top:20px;">
  164. <tbody>
  165. <tr>
  166. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Accuracy"}}</td>
  167. <td class="ti-text-form-content word-elipsis"><span id="Accuracy" title=""></span></td>
  168. </tr>
  169. <tr>
  170. <td class="ti-text-form-label text-width80">F1</td>
  171. <td class="ti-text-form-content word-elipsis"><span id="F1" title=""></span></td>
  172. </tr>
  173. <tr>
  174. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Precision"}}</td>
  175. <td class="ti-text-form-content word-elipsis"><span id="Precision" title=""></span></td>
  176. </tr>
  177. <tr>
  178. <td class="ti-text-form-label text-width80">{{$.i18n.Tr "repo.model.manage.Recall"}}</td>
  179. <td class="ti-text-form-content word-elipsis"><span id="Recall" title=""></span></td>
  180. </tr>
  181. </tbody>
  182. </table>
  183. </div>
  184. <div style="clear: both;"></div>
  185. </div>
  186. <div class="ui tab" data-tab="second">
  187. <input type="hidden" name="model" value="-1">
  188. <input type="hidden" name="modelback" value="-1">
  189. <div class='ui breadcrumb model_file_bread' id='file_breadcrumb'>
  190. <div class="active section"></div>
  191. <div class="divider"> / </div>
  192. </div>
  193. <div id="dir_list">
  194. </div>
  195. </div>
  196. </div>
  197. </div>
  198. </div>
  199. {{template "base/footer" .}}
  200. <script>
  201. let url = location.href.split('show_model')[0]
  202. let trainJobUrl =url.split('modelmanage')[0]
  203. let ID = location.search.split('?name=').pop()
  204. $(document).ready(function(){
  205. $('.secondary.menu .item').tab();
  206. });
  207. $(document).ready(loadInfo);
  208. function changeInfo(version){
  209. $.get(`${url}show_model_info_api?name=${ID}`,(data)=>{
  210. let versionData = data.filter((item)=>{
  211. return item.Version === version
  212. })
  213. let returnArray = []
  214. returnArray = transObj(versionData)
  215. let [initObj,initModelAcc,id] = returnArray
  216. editorCancel('','')
  217. renderInfo(initObj,initModelAcc,id)
  218. loadModelFile(versionData[0].ID,versionData[0].Version,'','','init')
  219. })
  220. }
  221. function loadInfo(){
  222. $.get(`${url}show_model_info_api?name=${ID}`,(data)=>{
  223. let html = ''
  224. for (let i=0;i<data.length;i++){
  225. if(!data[i].IsCanOper){
  226. $("#edit-pencil").css("display","none")
  227. }
  228. html += `<option value="${data[i].Version}">${data[i].Version}</option>`
  229. }
  230. $('#dropdown').append(html)
  231. let returnArray = []
  232. returnArray = transObj(data)
  233. let [initObj,initModelAcc,id] = returnArray
  234. renderInfo(initObj,initModelAcc,id)
  235. loadModelFile(data[0].ID,data[0].Version,'','','init')
  236. })
  237. }
  238. function getEngineName(model){
  239. if(model.Engine == 0){
  240. return "PyTorch";
  241. }else if(model.Engine == 1 || model.Engine == 121 || model.Engine == 38){
  242. return "TensorFlow";
  243. }else if(model.Engine == 2 || model.Engine == 122 || model.Engine == 35 || model.Engine == 37){
  244. return "MindSpore";
  245. }else if(model.Engine == 3){
  246. return "Other";
  247. }else if(model.Engine == 4){
  248. return "PaddlePaddle";
  249. }else if(model.Engine == 5){
  250. return "OneFlow";
  251. }else if(model.Engine == 6){
  252. return "MXNet";
  253. }
  254. else{
  255. return "Other"
  256. }
  257. }
  258. function transObj(data){
  259. let {ID,Name,Version,Label,Size,Description,CreatedUnix,Accuracy,CodeBranch,CodeCommitID,TrainTaskInfo} = data[0]
  260. let modelAcc = JSON.parse(Accuracy)
  261. TrainTaskInfo = JSON.parse(TrainTaskInfo)
  262. // Parameters = JSON.parse(Parameters)
  263. let {Parameters} = TrainTaskInfo
  264. let EngineName = getEngineName(data[0])
  265. Parameters = JSON.parse(Parameters)
  266. Parameters = Parameters.parameter.length === 0 ? '--':Parameters.parameter
  267. let size = tranSize(Size)
  268. let time = transTime(CreatedUnix)
  269. let initObj = {
  270. ModelName:Name || '--',
  271. Version:Version,
  272. Label:Label || '--',
  273. Size:size,
  274. CreateTime:time,
  275. Description:Description || '--',
  276. CodeBranch:CodeBranch || '--',
  277. CodeCommitID:CodeCommitID || '--',
  278. BootFile:TrainTaskInfo.BootFile || '--',
  279. DatasetName:TrainTaskInfo.DatasetName || '--',
  280. Parameters:TrainTaskInfo.Parameters || '--',
  281. FlavorName:TrainTaskInfo.FlavorName || '--',
  282. WorkServerNumber:TrainTaskInfo.WorkServerNumber || '1',
  283. Parameters:Parameters,
  284. EngineName:EngineName,
  285. DisplayJobName:TrainTaskInfo.DisplayJobName || '--',
  286. TrainJobVersionName:TrainTaskInfo.VersionName || '',
  287. CloudBrainJobID:TrainTaskInfo.JobID|| '',
  288. CloudBrainType:TrainTaskInfo.Type,
  289. }
  290. let initModelAcc = {
  291. Accuracy: modelAcc.Accuracy || '--',
  292. F1: modelAcc.F1 || '--',
  293. Precision:modelAcc.Precision || '--',
  294. Recall: modelAcc.Recall || '--'
  295. }
  296. return [initObj,initModelAcc,ID]
  297. }
  298. function transTime(time){
  299. let date = new Date(time * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  300. let Y = date.getFullYear() + '-';
  301. let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1):date.getMonth()+1) + '-';
  302. let D = (date.getDate()< 10 ? '0'+date.getDate():date.getDate())+ ' ';
  303. let h = (date.getHours() < 10 ? '0'+date.getHours():date.getHours())+ ':';
  304. let m = (date.getMinutes() < 10 ? '0'+date.getMinutes():date.getMinutes()) + ':';
  305. let s = date.getSeconds() < 10 ? '0'+date.getSeconds():date.getSeconds();
  306. return Y+M+D+h+m+s;
  307. }
  308. function tranSize(value){
  309. if(null==value||value==''){
  310. return "0 Bytes";
  311. }
  312. var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
  313. var index=0;
  314. var srcsize = parseFloat(value);
  315. index=Math.floor(Math.log(srcsize)/Math.log(1024));
  316. var size =srcsize/Math.pow(1024,index);
  317. size=size.toFixed(2);//保留的小数位数
  318. return size+unitArr[index];
  319. }
  320. function editorFn(context){
  321. let id= context.dataset.id
  322. let text = context.dataset.desc
  323. let textValue = text.replace(/enter;/g,'\r\n')
  324. $('#edit-td').replaceWith(`<div id='edit-div' style='width:80%;display: inline-block;'><textarea id='textarea-value' value='' rows='3' maxlength='255' style='width:80%;white-space: nowrap;' id='edit-text'>${textValue}</textarea><i class='check icon' style='color: #50d4ab;' onclick='editorSure("${text}","${id}")'></i><i class='times icon' style='color: #f66f6a;' onclick='editorCancel("${text}","${id}")'></i></div>`);
  325. }
  326. function editorCancel(text,id){
  327. let objkey = text.replace(/enter;/g,'\r\n')
  328. $('#edit-div').replaceWith(`<div id="edit-td" style="display:flex;"><span id="Description" title="${objkey}" class="iword-elipsis">${objkey}</span><i id="edit-pencil" data-id="${id}" data-desc="${text}" class="pencil alternate icon" style="cursor:pointer;vertical-align: top;" id="editor" onclick="editorFn(this)"></div>`)
  329. }
  330. function editorSure(text,id){
  331. let description=$('#textarea-value').val()
  332. let sourcetext = $('#textarea-value').val().replace(/\n/g,'enter;')
  333. let data = {
  334. ID:id,
  335. Description:description
  336. }
  337. $.ajax({
  338. url:`${url}modify_model`,
  339. type:'PUT',
  340. data:data
  341. }).done((res)=>{
  342. $('#edit-div').replaceWith(`<div id="edit-td" style="display:flex;"><span id="Description" title="${description}" class="iword-elipsis">${description}</span><i id="edit-pencil" data-id="${id}" data-desc="${sourcetext}" class="pencil alternate icon" style="cursor:pointer;vertical-align: top;" id="editor" onclick="editorFn(this)"></div>`)
  343. })
  344. }
  345. function renderInfo(obj,accObj,id){
  346. for(let key in obj){
  347. if(key==="Description"){
  348. let descriptionText=obj[key].replace(/\r\n|\n/g,'enter;')
  349. $(`#${key}`).text(obj[key])
  350. $(`#${key}`).attr("title",obj[key])
  351. $('#edit-pencil').attr("data-id",id)
  352. $('#edit-pencil').attr("data-desc",descriptionText)
  353. }
  354. else if(key==="Label"){
  355. $('#Label').empty()
  356. if(obj[key]==='--'){
  357. $('#Label').text(obj[key])
  358. }else{
  359. let labelArray = obj[key].trim().replace(/ +/g,' ').split(' ')
  360. let html=''
  361. for(let i=0;i<labelArray.length;i++){
  362. html += `<a class="ui label" title="${labelArray[i]}">${labelArray[i]}</a>`
  363. }
  364. $('#Label').append(html)
  365. }
  366. }
  367. else if(key==="CodeCommitID"){
  368. let codeCommit = obj[key].slice(0,10)
  369. let html = `<a style="margin-left:1rem" class="ui label" title="${codeCommit}">${codeCommit}</a>`
  370. $('#CodeBranch').append(html)
  371. }
  372. else if(key==="DisplayJobName"){
  373. let type=obj["CloudBrainType"]
  374. let href=""
  375. if(type==1){
  376. href=trainJobUrl + "modelarts/train-job/" + obj["CloudBrainJobID"]
  377. }else if(type==0){
  378. href=trainJobUrl + "cloudbrain/train-job/" + obj["CloudBrainJobID"]
  379. }else if(type==2){
  380. href=trainJobUrl + "grampus/train-job/" + obj["CloudBrainJobID"]
  381. }
  382. $(`#DisplayJobNameHref`).attr("href",href)
  383. $(`#DisplayJobNameHref`).attr("title",obj[key])
  384. $(`#${key}`).text(obj[key])
  385. let versionName = obj["TrainJobVersionName"]
  386. if(versionName!=""){
  387. let html = `<span style="margin-left:1rem" class="ui label">${versionName}</span>`
  388. $('#DisplayJobName').append(html)
  389. }
  390. }
  391. else if(key==="Parameters"){
  392. if(obj[key]==='--'){
  393. $(`#${key}`).text(obj[key])
  394. }else{
  395. const parameterArray = obj[key].map(element => {
  396. let labelValue = `${element.label}=${element.value}`
  397. return labelValue
  398. });
  399. const parameter = parameterArray.join('; ')
  400. $(`#${key}`).text(parameter)
  401. $(`#${key}`).attr("title",parameter)
  402. }
  403. }
  404. else{
  405. $(`#${key}`).text(obj[key])
  406. $(`#${key}`).attr("title",obj[key])
  407. }
  408. }
  409. for(let key in accObj){
  410. $(`#${key}`).text(accObj[key])
  411. $(`#${key}`).attr("title",accObj[key])
  412. }
  413. }
  414. function loadModelFile(ID,version_name,parents,filename,init){
  415. $.get(`${url}query_onelevel_modelfile?ID=${ID}&parentDir=${parents}`, (data) => {
  416. $('#dir_list').empty()
  417. renderDir(data,ID,version_name)
  418. if(init==="init"){
  419. $('input[name=model]').val("")
  420. $('input[name=modelback]').val(version_name)
  421. $('#file_breadcrumb').empty()
  422. let htmlBread = ""
  423. htmlBread += `<div class='active section'>${version_name}</div>`
  424. htmlBread += "<div class='divider'> / </div>"
  425. $('#file_breadcrumb').append(htmlBread)
  426. }else{
  427. renderBrend(ID,version_name,parents,filename,init)
  428. }
  429. })
  430. }
  431. function renderSize(value){
  432. if(null==value||value==''){
  433. return "0 Bytes";
  434. }
  435. var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
  436. var index=0;
  437. var srcsize = parseFloat(value);
  438. index=Math.floor(Math.log(srcsize)/Math.log(1024));
  439. var size =srcsize/Math.pow(1024,index);
  440. size=size.toFixed(2);//保留的小数位数
  441. return size+unitArr[index];
  442. }
  443. function renderBrend(ID,version_name,parents,filename,init){
  444. if(init=="folder"){
  445. let htmlBrend = ""
  446. let sectionName=$('#file_breadcrumb .active.section').text()
  447. let parents1 = $('input[name=model]').val()
  448. let filename1 = $('input[name=modelback]').val()
  449. if(parents1===""){
  450. $('#file_breadcrumb .active.section').replaceWith(`<a class='section' onclick="loadModelFile('${ID}','${version_name}','${parents1}','','init')">${sectionName}</a>`)
  451. }else{
  452. $('#file_breadcrumb .active.section').replaceWith(`<a class='section' onclick="loadModelFile('${ID}','${version_name}','${parents1}','${filename1}')">${sectionName}</a>`)
  453. }
  454. htmlBrend += `<div class='active section'>${filename}</div>`
  455. htmlBrend += "<div class='divider'> / </div>"
  456. $('#file_breadcrumb').append(htmlBrend)
  457. $('input[name=model]').val(parents)
  458. $('input[name=modelback]').val(filename)
  459. }else{
  460. $('input[name=model]').val(parents)
  461. $('input[name=modelback]').val(filename)
  462. let selectEle = $('#file_breadcrumb a.section').filter(
  463. (index, item) => {
  464. return item.text == filename;
  465. }
  466. );
  467. selectEle.nextAll().remove();
  468. selectEle.after("<div class='divider'> / </div>");
  469. selectEle.replaceWith(`<div class='active section'>${filename}</div>`);
  470. }
  471. }
  472. function renderDir(data,ID,version_name){
  473. let html=""
  474. html += "<div class='ui grid' style='margin:0;'>"
  475. html += "<div class='row' style='padding: 0;'>"
  476. html += "<div class='ui sixteen wide column' style='padding:1rem;'>"
  477. html += "<div class='dir list'>"
  478. html += "<table id='repo-files-table' class='ui single line table pad20'>"
  479. html += '<tbody>'
  480. for(let i=0;i<data.length;i++){
  481. let dirs_size = renderSize(data[i].Size)
  482. html += "<tr>"
  483. html += "<td class='name six wid'>"
  484. html += "<span class='truncate'>"
  485. html += "<span class='octicon octicon-file-directory'>"
  486. html += "</span>"
  487. if(data[i].IsDir){
  488. html += `<a onclick="loadModelFile('${ID}','${version_name}','${data[i].ParenDir}','${data[i].FileName}','folder')">`
  489. html += "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" + data[i].FileName + "</span>"
  490. }else{
  491. html += `<a href="${url}${ID}/downloadsingle?parentDir=${data[i].ParenDir}&fileName=${data[i].FileName}">`
  492. html += "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" + data[i].FileName + "</span>"
  493. }
  494. html += '</a>'
  495. html += "</span>"
  496. html += "</td>"
  497. html += "<td class='message seven wide'>"
  498. if(data[i].IsDir){
  499. html += "<span class='truncate has-emoji'></span>"
  500. }else{
  501. html += "<span class='truncate has-emoji'>"+ `${dirs_size}` + "</span>"
  502. }
  503. html += "</td>"
  504. html += "<td class='text right age three wide'>"
  505. html += "<span class='truncate has-emoji'>" + data[i].ModTime + "</span>"
  506. html += "</td>"
  507. html += "</tr>"
  508. }
  509. html += "</tbody>"
  510. html += "</table>"
  511. html += "</div>"
  512. html += "</div>"
  513. html += "</div>"
  514. html += "</div>"
  515. $('#dir_list').append(html)
  516. }
  517. </script>