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.

cloudbrainShow.js 29 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. export default async function initCloudrainSow() {
  2. function debounce(fn, delay) {
  3. let timer;
  4. return (...args) => {
  5. // 判断定时器是否存在,清除定时器
  6. if (timer) {
  7. clearTimeout(timer);
  8. }
  9. // 重新调用setTimeout
  10. timer = setTimeout(() => {
  11. fn.apply(this, args);
  12. }, delay);
  13. };
  14. }
  15. function logScroll(version_name, repoPath, ID) {
  16. let container = document.querySelector(`#log${version_name}`);
  17. let scrollTop = container.scrollTop;
  18. let scrollHeight = container.scrollHeight;
  19. let clientHeight = container.clientHeight;
  20. let scrollLeft = container.scrollLeft;
  21. if (
  22. (parseInt(scrollTop) + clientHeight == scrollHeight ||
  23. parseInt(scrollTop) + clientHeight + 1 == scrollHeight ||
  24. parseInt(scrollTop) + clientHeight - 1 == scrollHeight) &&
  25. scrollLeft === 0
  26. ) {
  27. let end_line = $(`#log${version_name} input[name=end_line]`).val();
  28. $.get(
  29. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`,
  30. (data) => {
  31. if (data.Lines == 0) {
  32. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  33. $(`.message${version_name}`).css("display", "block");
  34. setTimeout(function () {
  35. $(`.message${version_name}`).css("display", "none");
  36. }, 1000);
  37. } else {
  38. if (end_line === data.EndLine) {
  39. return;
  40. } else {
  41. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  42. $(`#log${version_name}`).append("<pre>" + data.Content);
  43. }
  44. }
  45. }
  46. ).fail(function (err) {
  47. console.log(err);
  48. });
  49. }
  50. if (scrollTop == 0 && scrollLeft == 0) {
  51. let start_line = $(`#log${version_name} input[name=start_line]`).val();
  52. $.get(
  53. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`,
  54. (data) => {
  55. if (data.Lines == 0) {
  56. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  57. $(`.message${version_name}`).css("display", "block");
  58. setTimeout(function () {
  59. $(`.message${version_name}`).css("display", "none");
  60. }, 1000);
  61. } else {
  62. $(`#log${version_name} input[name=start_line]`).val(data.StartLine); //如果变动就改变所对应的值
  63. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  64. }
  65. }
  66. ).fail(function (err) {
  67. console.log(err);
  68. });
  69. }
  70. }
  71. const fn = debounce(logScroll, 500);
  72. $(".log-scroll").scroll(function () {
  73. let version_name = $(this).data("version");
  74. let ID = $(`#accordion${version_name}`).data("jobid");
  75. let repoPath = $(`#accordion${version_name}`).data("repopath");
  76. fn(version_name, repoPath, ID);
  77. });
  78. function scrollAnimation(dom, currentY, targetY, currentX) {
  79. let needScrollTop = targetY - currentY;
  80. let _currentY = currentY;
  81. setTimeout(() => {
  82. // 一次调用滑动帧数,每次调用会不一样
  83. //取总距离的十分之一
  84. const dist = Math.ceil(needScrollTop / 10);
  85. _currentY += dist;
  86. //移动一个十分之一
  87. dom.scrollTo(currentX || 0, _currentY, "smooth");
  88. // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
  89. if (needScrollTop > 10 || needScrollTop < -10) {
  90. scrollAnimation(dom, _currentY, targetY);
  91. } else {
  92. dom.scrollTo(0, targetY, "smooth");
  93. }
  94. }, 1);
  95. }
  96. $(".log_top").click(function () {
  97. // let logContentDom = document.querySelector('.log')
  98. // if(!logContentDom)
  99. // return
  100. // let version_name = $('.log_top').data('version')
  101. let version_name = $(this).data("version");
  102. let logContentDom = document.querySelector(`#log${version_name}`);
  103. let ID = $(`#accordion${version_name}`).data("jobid");
  104. let repoPath = $(`#accordion${version_name}`).data("repopath");
  105. $(`#log_file${version_name}`).siblings("pre").remove();
  106. $(`#log${version_name} .ui.inverted.active.dimmer`).css("display", "block");
  107. $.get(
  108. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`,
  109. (data) => {
  110. $(".ui.inverted.active.dimmer").css("display", "none");
  111. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  112. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  113. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  114. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  115. $(`.message${version_name}`).css("display", "block");
  116. setTimeout(function () {
  117. $(`.message${version_name}`).css("display", "none");
  118. }, 1000);
  119. scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
  120. }
  121. ).fail((err) => {
  122. $(`#log${version_name} .ui.inverted.active.dimmer`).css(
  123. "display",
  124. "none"
  125. );
  126. throw err;
  127. });
  128. });
  129. $(".log_bottom").click(function (e) {
  130. let version_name = $(this).data("version");
  131. let logContentDom = document.querySelector(`#log${version_name}`);
  132. let ID = $(`#accordion${version_name}`).data("jobid");
  133. let repoPath = $(`#accordion${version_name}`).data("repopath");
  134. $(`#log_file${version_name}`).siblings("pre").remove();
  135. let end_line = $(`#log${version_name} input[name=end_line]`).val();
  136. $(`#log${version_name} .ui.inverted.active.dimmer`).css("display", "block");
  137. $.get(
  138. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`,
  139. (data) => {
  140. $(`#log${version_name} .ui.inverted.active.dimmer`).css(
  141. "display",
  142. "none"
  143. );
  144. if (!data.CanLogDownload) {
  145. $(`#${version_name}-log-down`)
  146. .removeClass("ti-download-file")
  147. .addClass("disabled");
  148. } else {
  149. $(`#${version_name}-log-down`)
  150. .addClass("ti-download-file")
  151. .removeClass("disabled");
  152. }
  153. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  154. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  155. $(`#log${version_name}`).append("<pre>" + data.Content);
  156. $.get(
  157. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`,
  158. (data) => {
  159. $(".ui.inverted.active.dimmer").css("display", "none");
  160. if (data.Lines == 0) {
  161. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  162. $(`.message${version_name}`).css("display", "block");
  163. setTimeout(function () {
  164. $(`.message${version_name}`).css("display", "none");
  165. }, 1000);
  166. } else {
  167. if (end_line === data.EndLine || end_line === "") {
  168. return;
  169. } else {
  170. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  171. $(`#log${version_name}`).append("<pre>" + data.Content);
  172. }
  173. }
  174. }
  175. ).fail(function (err) {
  176. $(`#log${version_name} .ui.inverted.active.dimmer`).css(
  177. "display",
  178. "none"
  179. );
  180. console.log(err);
  181. });
  182. scrollAnimation(
  183. logContentDom,
  184. logContentDom.scrollTop + 1,
  185. logContentDom.scrollHeight - logContentDom.clientHeight
  186. );
  187. }
  188. ).fail((err) => {
  189. $(`#log${version_name} .ui.inverted.active.dimmer`).css(
  190. "display",
  191. "none"
  192. );
  193. throw err;
  194. });
  195. });
  196. function loadLog(version_name) {
  197. document.getElementById("mask").style.display = "block";
  198. $.get(
  199. `/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`,
  200. (data) => {
  201. $("input[name=end_line]").val(data.EndLine);
  202. $("input[name=start_line]").val(data.StartLine);
  203. $(`#log_file${version_name}`).text(data.Content);
  204. document.getElementById("mask").style.display = "none";
  205. }
  206. ).fail(function (err) {
  207. document.getElementById("mask").style.display = "none";
  208. console.log(err);
  209. });
  210. }
  211. $(".refresh-status").click(function (e) {
  212. let version_name = $(this).data("version");
  213. let ID = $(`#accordion${version_name}`).data("jobid");
  214. let repoPath = $(`#accordion${version_name}`).data("repopath");
  215. refreshStatusShow(version_name, ID, repoPath);
  216. $(`.log-info-${version_name} .log_bottom`).trigger("click");
  217. e.stopPropagation();
  218. });
  219. $(".stop-show-version").click(function (e) {
  220. const ID = this.dataset.jobid;
  221. const repoPath = this.dataset.repopath;
  222. const version_name = this.dataset.version;
  223. const url = `/api/v1/repos/${repoPath}/${ID}/stop_version`;
  224. $.post(url, { version_name: version_name }, (data) => {
  225. if (data.StatusOK === 0) {
  226. $(`#${version_name}-stop`).removeClass("blue");
  227. $(`#${version_name}-stop`).addClass("disabled");
  228. refreshStatusShow(version_name, ID, repoPath);
  229. }
  230. }).fail(function (err) {
  231. console.log(err);
  232. });
  233. e.stopPropagation();
  234. });
  235. $(".delete-show-version").click(function (e) {
  236. const ID = this.dataset.jobid;
  237. const repoPath = this.dataset.repopath;
  238. const version_name = this.dataset.version;
  239. const url = `/api/v1/repos/${repoPath}/${ID}/del_version`;
  240. $(".ui.basic.modal")
  241. .modal({
  242. onApprove: function () {
  243. $.post(url, { version_name: version_name }, (data) => {
  244. console.log(data);
  245. if (data.StatusOK === 0) {
  246. if (data.VersionListCount === 0) {
  247. location.href = `/${repoPath}`;
  248. } else {
  249. $("#accordion" + version_name).remove();
  250. }
  251. refreshStatusShow(version_name, ID, repoPath);
  252. } else {
  253. return;
  254. }
  255. }).fail(function (err) {
  256. console.log(err);
  257. });
  258. },
  259. })
  260. .modal("show");
  261. e.stopPropagation();
  262. });
  263. function refreshStatusShow(version_name, ID, repoPath) {
  264. $.get(
  265. `/api/v1/repos/${repoPath}/${ID}?version_name=${version_name}`,
  266. (data) => {
  267. //accroding下的状态
  268. $(`#${version_name}-status-span span`).text(data.JobStatus);
  269. //accroding下的状态图标
  270. $(`#${version_name}-status-span i`).attr("class", data.JobStatus);
  271. //accroding下的运行时长
  272. $(`#${version_name}-duration-span`).text(data.JobDuration);
  273. //配置信息详情页的状态
  274. $(`#${version_name}-status`).text(data.JobStatus);
  275. //配置信息详情页的状态
  276. $(`#${version_name}-duration`).text(data.JobDuration);
  277. }
  278. ).fail(function (err) {
  279. console.log(err);
  280. });
  281. }
  282. //
  283. $(".content-pad").on("click", ".load-model-file", function () {
  284. let downloadFlag = $(this).data("download-flag") || "";
  285. let gpuFlag = $(this).data("gpu-flag") || "";
  286. let version_name = $(this).data("version");
  287. let parents = $(this).data("parents");
  288. let filename = $(this).data("filename");
  289. let init = $(this).data("init") || "";
  290. let path = $(this).data("path");
  291. $(`#dir_list${version_name}`).empty();
  292. let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
  293. $.get(url, (data) => {
  294. if (data.StatusOK == 0) { // 成功
  295. if (data.Dirs) {
  296. renderDir(path, data, version_name, downloadFlag, gpuFlag);
  297. }
  298. if (init === "init") {
  299. $(`input[name=model${version_name}]`).val("");
  300. $(`input[name=modelback${version_name}]`).val(version_name);
  301. $(`#file_breadcrumb${version_name}`).empty();
  302. let htmlBread = "";
  303. if (version_name) {
  304. htmlBread += `<div class='active section'>${version_name}</div>`;
  305. } else {
  306. htmlBread += `<div class='active section'>result</div>`;
  307. }
  308. htmlBread += "<div class='divider'> / </div>";
  309. $(`#file_breadcrumb${version_name}`).append(htmlBread);
  310. } else {
  311. renderBrend(
  312. path,
  313. version_name,
  314. parents,
  315. filename,
  316. init,
  317. downloadFlag,
  318. gpuFlag
  319. );
  320. }
  321. } else if (data.StatusOK == 1) { // 处理中
  322. $(`#file_breadcrumb${version_name}`).empty();
  323. $(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
  324. <style>
  325. @-webkit-keyframes spinning {
  326. 0% { -webkit-transform: rotate(0deg); }
  327. 100% { -webkit-transform: rotate(360deg); }
  328. }
  329. </style>
  330. <div style="display:flex;justify-content:center;align-items:center;height:24px;width:24px;margin-right:5px;animation-duration:3s;animation-iteration-count:infinite;animation-name:spinning;animation-timing-function:linear;animation-fill-mode:backwards;">
  331. <svg xmlns="http://www.w3.org/2000/svg" class="styles__StyledSVGIconPathComponent-sc-16fsqc8-0 iKfgJk svg-icon-path-icon fill" viewBox="0 0 48 48" width="16" height="16"><defs data-reactroot=""></defs><g><g><rect width="48" height="48" fill="white" fill-opacity="0.01" stroke-linejoin="round" stroke-width="4" stroke="none" fill-rule="evenodd"></rect><g transform="translate(7.000000, 3.500000)"><path d="M0,0.5 L34,0.5" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke="#333" fill="none" fill-rule="evenodd"></path><path d="M0,40.5 L34,40.5" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke="#333" fill="none" fill-rule="evenodd"></path><path d="M30,20.4999965 C27.3333333,33.8388874 23,40.5055541 17,40.4999965 C11,40.494439 6.66666667,33.8277723 4,20.4999965 L30,20.4999965 Z" fill="none" fill-rule="nonzero" transform="translate(17.000000, 30.499998) rotate(180.000000) translate(-17.000000, -30.499998) " stroke-linejoin="round" stroke-width="4" stroke="#333"></path><path d="M30,0.5 C27.3333333,13.8388909 23,20.5055575 17,20.5 C11,20.4944425 6.66666667,13.8277758 4,0.5 L30,0.5 Z" fill="none" fill-rule="nonzero" stroke-linejoin="round" stroke-width="4" stroke="#333"></path></g></g></g></svg>
  332. </div>
  333. <span>${i18n['file_sync_ing']}</span>
  334. </div>`);
  335. } else if (data.StatusOK == 2) { // 失败
  336. $(`#file_breadcrumb${version_name}`).empty();
  337. $(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
  338. <div style="display:flex;justify-content:center;align-items:center;height:24px;width:24px;margin-right:5px;">
  339. <svg xmlns="http://www.w3.org/2000/svg" class="styles__StyledSVGIconPathComponent-sc-16fsqc8-0 iKfgJk svg-icon-path-icon fill" viewBox="64 64 896 896" width="16" height="16"><defs data-reactroot=""></defs><g><path d="M464 720a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"></path></g></svg>
  340. </div>
  341. <span>${i18n['file_sync_fail']}</span>
  342. </div>`);
  343. } else if (data.StatusOK == 3) { // 无文件
  344. $(`#file_breadcrumb${version_name}`).empty();
  345. $(`#dir_list${version_name}`).html(`<div style="height:200px;display:flex;justify-content:center;align-items:center;font-size:14px;color:rgb(16, 16, 16);">
  346. <div style="display:flex;justify-content:center;align-items:center;height:24px;width:24px;margin-right:5px;">
  347. <svg xmlns="http://www.w3.org/2000/svg" class="styles__StyledSVGIconPathComponent-sc-16fsqc8-0 iKfgJk svg-icon-path-icon fill" viewBox="0 0 24 24" width="16" height="16"><defs data-reactroot=""></defs><g><circle cx="15.5" cy="9.5" r="1.5"></circle><circle cx="8.5" cy="9.5" r="1.5"></circle><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z"></path></g></svg>
  348. </div>
  349. <span>${i18n['no_file_to_download']}</span>
  350. </div>`);
  351. }
  352. }).fail(function (err) {
  353. console.log(err, version_name);
  354. });
  355. });
  356. function renderSize(value) {
  357. if (null == value || value == "") {
  358. return "0 Bytes";
  359. }
  360. var unitArr = new Array(
  361. "Bytes",
  362. "KB",
  363. "MB",
  364. "GB",
  365. "TB",
  366. "PB",
  367. "EB",
  368. "ZB",
  369. "YB"
  370. );
  371. var index = 0;
  372. var srcsize = parseFloat(value);
  373. index = Math.floor(Math.log(srcsize) / Math.log(1024));
  374. var size = srcsize / Math.pow(1024, index);
  375. size = size.toFixed(0); //保留的小数位数
  376. return size + unitArr[index];
  377. }
  378. function renderBrend(
  379. path,
  380. version_name,
  381. parents,
  382. filename,
  383. init,
  384. downloadFlag,
  385. gpuFlag
  386. ) {
  387. if (init == "folder") {
  388. let htmlBrend = "";
  389. let sectionName = $(
  390. `#file_breadcrumb${version_name} .active.section`
  391. ).text();
  392. let parents1 = $(`input[name=model${version_name}]`).val();
  393. let filename1 = $(`input[name=modelback${version_name}]`).val();
  394. if (parents1 === "") {
  395. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  396. `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-gpu-flag='${gpuFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='' data-init='init'>${sectionName}</a>`
  397. );
  398. } else {
  399. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  400. `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-gpu-flag='${gpuFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='${filename1}'>${sectionName}</a>`
  401. );
  402. }
  403. htmlBrend += `<div class='active section'>${filename}</div>`;
  404. htmlBrend += "<div class='divider'> / </div>";
  405. $(`#file_breadcrumb${version_name}`).append(htmlBrend);
  406. $(`input[name=model${version_name}]`).val(parents);
  407. $(`input[name=modelback${version_name}]`).val(filename);
  408. } else {
  409. $(`input[name=model${version_name}]`).val(parents);
  410. $(`input[name=modelback${version_name}]`).val(filename);
  411. let selectEle = $(`#file_breadcrumb${version_name} a.section`).filter(
  412. (index, item) => {
  413. return item.text == filename;
  414. }
  415. );
  416. selectEle.nextAll().remove();
  417. selectEle.after("<div class='divider'> / </div>");
  418. selectEle.replaceWith(`<div class='active section'>${filename}</div>`);
  419. }
  420. }
  421. function renderDir(path, data, version_name, downloadFlag, gpuFlag) {
  422. let html = "";
  423. html += "<div class='ui grid' style='margin:0;'>";
  424. html += "<div class='row' style='padding: 0;'>";
  425. html += "<div class='ui sixteen wide column' style='padding:1rem;'>";
  426. html += "<div class='dir list'>";
  427. html += "<table id='repo-files-table' class='ui single line table pad20'>";
  428. html += "<tbody>";
  429. // html += "</tbody>"
  430. for (let i = 0; i < data.Dirs.length; i++) {
  431. let dirs_size = renderSize(data.Dirs[i].Size);
  432. html += "<tr>";
  433. html += "<td class='name six wid'>";
  434. html += "<span class='truncate'>";
  435. html += "<span class='octicon octicon-file-directory'>";
  436. html += "</span>";
  437. if (data.Dirs[i].IsDir) {
  438. html += `<a class='load-model-file' data-download-flag='${downloadFlag}' data-gpu-flag='${gpuFlag}' data-path='${path}' data-version='${version_name}' data-parents='${data.Dirs[i].ParenDir}' data-filename='${data.Dirs[i].FileName}' data-init='folder'>`;
  439. html +=
  440. "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" +
  441. data.Dirs[i].FileName +
  442. "</span>";
  443. } else {
  444. if (downloadFlag) {
  445. if (gpuFlag) {
  446. if (path.includes("model_list")) {
  447. html += `<a href="${location.href}/download_model?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
  448. } else {
  449. html += `<a href="${location.href}/result_download?version_name=${version_name}&fileName=${data.Dirs[i].FileName}&parentDir=${data.Dirs[i].ParenDir}&jobName=${data.task.JobName}">`;
  450. }
  451. } else {
  452. if (path.includes("model_list")) {
  453. html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  454. } else {
  455. html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  456. }
  457. }
  458. } else {
  459. html += `<a class="disabled">`;
  460. }
  461. html +=
  462. "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" +
  463. data.Dirs[i].FileName +
  464. "</span>";
  465. }
  466. html += "</a>";
  467. html += "</span>";
  468. html += "</td>";
  469. html += "<td class='message1 seven wide'>";
  470. if (data.Dirs[i].IsDir) {
  471. html += "<span class='truncate has-emoji'></span>";
  472. } else {
  473. html +=
  474. "<span class='truncate has-emoji'>" + `${dirs_size}` + "</span>";
  475. }
  476. html += "</td>";
  477. html += "<td class='text right age three wide'>";
  478. html +=
  479. "<span class='truncate has-emoji'>" + data.Dirs[i].ModTime + "</span>";
  480. html += "</td>";
  481. html += "</tr>";
  482. }
  483. html += "</tbody>";
  484. html += "</table>";
  485. html += "</div>";
  486. html += "</div>";
  487. html += "</div>";
  488. html += "</div>";
  489. $(`#dir_list${version_name}`).append(html);
  490. }
  491. let nameMap, nameList;
  492. let RepoLink = $(".cloudbrain-type").data("repo-link");
  493. let type = $(".cloudbrain-type").data("cloudbrain-type");
  494. let flagModel = $(".cloudbrain-type").data("flag-model");
  495. // 获取模型列表和模型名称对应的模型版本
  496. $(document).ready(function () {
  497. if (!flagModel) return;
  498. else {
  499. $.get(
  500. `${RepoLink}/modelmanage/query_model_for_predict?type=${type}`,
  501. (data) => {
  502. nameMap = data.nameMap;
  503. nameList = data.nameList;
  504. let html = `<div class="item"></div>`;
  505. nameList.forEach((element) => {
  506. html += `<div class="item" data-value=${element}>${element}</div>`;
  507. });
  508. if (nameList.length !== 0) {
  509. $("#model_name").append(html);
  510. }
  511. let faildModelName = $('input[name="model_name"]').val();
  512. let faildModelVersion = $('input[name="model_version"]').val();
  513. let dataID;
  514. // 新建错误的表单返回初始化
  515. if (faildModelName && nameList.includes(faildModelName)) {
  516. $("#select_model").dropdown("set text", faildModelName);
  517. $("#select_model").dropdown("set value", faildModelName);
  518. nameMap[faildModelName].forEach((element) => {
  519. if (element.Version === faildModelVersion) {
  520. dataID = element.ID;
  521. }
  522. });
  523. initModelVerison(faildModelName, nameMap, faildModelVersion);
  524. initModelckpt(dataID);
  525. }
  526. }
  527. );
  528. }
  529. $("#select_model").dropdown({
  530. onChange: function (value, text, $selectedItem) {
  531. $("#model_name_version").empty();
  532. if (value) {
  533. let html = "";
  534. nameMap[value].forEach((element) => {
  535. let { TrainTaskInfo } = element;
  536. TrainTaskInfo = JSON.parse(TrainTaskInfo);
  537. html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${element.Path}">${element.Version}</div>`;
  538. });
  539. $("#model_name_version").append(html);
  540. const initVersionText = $(
  541. "#model_name_version div.item:first-child"
  542. ).text();
  543. const initVersionValue = $(
  544. "#model_name_version div.item:first-child"
  545. ).data("value");
  546. $("#select_model_version").dropdown("set text", initVersionText);
  547. $("#select_model_version").dropdown(
  548. "set value",
  549. initVersionValue,
  550. initVersionText,
  551. $("#model_name_version div.item:first-child")
  552. );
  553. } else {
  554. $("#select_model_version").dropdown("set text", "");
  555. $("#select_model_version").dropdown("set value", "");
  556. $("#select_model_checkpoint").dropdown("set text", "");
  557. $("#select_model_checkpoint").dropdown("set value", "");
  558. }
  559. },
  560. });
  561. $("#select_model_version").dropdown({
  562. onChange: function (value, text, $selectedItem) {
  563. if (!value) return;
  564. const dataID =
  565. $selectedItem && $selectedItem[0].getAttribute("data-id");
  566. $("input#ai_model_version").val(text);
  567. $("#select_model_checkpoint").dropdown("set text", "");
  568. $("#select_model_checkpoint").addClass("loading");
  569. $("#model_checkpoint").empty();
  570. let html = "";
  571. loadCheckpointList(dataID).then((res) => {
  572. res.forEach((element) => {
  573. const ckptSuffix = element.FileName.split(".");
  574. const loadCheckpointFile = [
  575. "ckpt",
  576. "pb",
  577. "h5",
  578. "json",
  579. "pkl",
  580. "pth",
  581. "t7",
  582. "pdparams",
  583. "onnx",
  584. "pbtxt",
  585. "keras",
  586. "mlmodel",
  587. "cfg",
  588. "pt",
  589. ];
  590. if (
  591. !element.IsDir &&
  592. loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1])
  593. ) {
  594. html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`;
  595. }
  596. });
  597. $("#model_checkpoint").append(html);
  598. $("#select_model_checkpoint").removeClass("loading");
  599. const initVersionText = $(
  600. "#model_checkpoint div.item:first-child"
  601. ).text();
  602. const initVersionValue = $(
  603. "#model_checkpoint div.item:first-child"
  604. ).data("value");
  605. $("#select_model_checkpoint").dropdown("set text", initVersionText);
  606. $("#select_model_checkpoint").dropdown(
  607. "set value",
  608. initVersionValue,
  609. initVersionText,
  610. $("#model_name_version div.item:first-child")
  611. );
  612. });
  613. },
  614. });
  615. });
  616. function initModelVerison(value, nameMap, faildModelVersion) {
  617. let faildTrainUrl = $('input[name="pre_train_model_url"]').val();
  618. let html = "";
  619. nameMap[value].forEach((element) => {
  620. let { TrainTaskInfo } = element;
  621. TrainTaskInfo = JSON.parse(TrainTaskInfo);
  622. html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${element.Path}">${element.Version}</div>`;
  623. });
  624. $("#model_name_version").append(html);
  625. $("#select_model_version").dropdown("set text", faildModelVersion);
  626. $("#select_model_version").dropdown("set value", faildTrainUrl);
  627. }
  628. function initModelckpt(dataID) {
  629. let faildCkptName = $('input[name="ckpt_name"]').val();
  630. $("#select_model_checkpoint").addClass("loading");
  631. $("#model_checkpoint").empty();
  632. let html = "";
  633. loadCheckpointList(dataID).then((res) => {
  634. res.forEach((element) => {
  635. const ckptSuffix = element.FileName.split(".");
  636. const loadCheckpointFile = [
  637. "ckpt",
  638. "pb",
  639. "h5",
  640. "json",
  641. "pkl",
  642. "pth",
  643. "t7",
  644. "pdparams",
  645. "onnx",
  646. "pbtxt",
  647. "keras",
  648. "mlmodel",
  649. "cfg",
  650. "pt",
  651. ];
  652. if (
  653. !element.IsDir &&
  654. loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1])
  655. ) {
  656. html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`;
  657. }
  658. });
  659. $("#model_checkpoint").append(html);
  660. $("#select_model_checkpoint").removeClass("loading");
  661. $("#select_model_checkpoint").dropdown("set text", faildCkptName);
  662. $("#select_model_checkpoint").dropdown("set value", faildCkptName);
  663. });
  664. }
  665. function loadCheckpointList(value) {
  666. return new Promise((resolve, reject) => {
  667. $.get(
  668. `${RepoLink}/modelmanage/query_modelfile_for_predict`,
  669. { ID: value },
  670. (data) => {
  671. resolve(data);
  672. }
  673. );
  674. });
  675. }
  676. }