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 30 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
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  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, max = "", lines = 50) {
  16. console.log("----------");
  17. let container = document.querySelector(`#log${max}${version_name}`);
  18. let scrollTop = container.scrollTop;
  19. let scrollHeight = container.scrollHeight;
  20. let clientHeight = container.clientHeight;
  21. let scrollLeft = container.scrollLeft;
  22. if (
  23. (parseInt(scrollTop) + clientHeight == scrollHeight ||
  24. parseInt(scrollTop) + clientHeight + 1 == scrollHeight ||
  25. parseInt(scrollTop) + clientHeight - 1 == scrollHeight) &&
  26. scrollLeft === 0
  27. ) {
  28. let end_line = $(`#log${version_name} input[name=end_line${max}]`).val();
  29. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
  30. "background-color": "#fff",
  31. display: "block",
  32. });
  33. $.get(
  34. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${end_line}&lines=${lines}&order=desc`,
  35. (data) => {
  36. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  37. "display",
  38. "none"
  39. );
  40. if (data.Lines == 0) {
  41. if (max) {
  42. $("body").toast({
  43. class: "info",
  44. message: `您已翻阅至日志底部,请稍后再试!`,
  45. });
  46. } else {
  47. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  48. $(`.message${version_name}`).css("display", "block");
  49. setTimeout(function () {
  50. $(`.message${version_name}`).css("display", "none");
  51. }, 1000);
  52. }
  53. } else {
  54. if (end_line === data.EndLine) {
  55. return;
  56. } else {
  57. $(`#log${version_name} input[name=end_line${max}]`).val(
  58. data.EndLine
  59. );
  60. $(`#log${max}${version_name}`).append("<pre>" + data.Content);
  61. }
  62. }
  63. }
  64. ).fail(function (err) {
  65. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  66. "display",
  67. "none"
  68. );
  69. console.log(err);
  70. });
  71. }
  72. if (scrollTop == 0 && scrollLeft == 0) {
  73. let start_line = $(
  74. `#log${version_name} input[name=start_line${max}]`
  75. ).val();
  76. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
  77. "background-color": "#fff",
  78. display: "block",
  79. });
  80. $.get(
  81. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${start_line}&lines=${lines}&order=asc`,
  82. (data) => {
  83. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  84. "display",
  85. "none"
  86. );
  87. if (data.Lines == 0) {
  88. if (max) {
  89. $("body").toast({
  90. class: "info",
  91. message: `您已翻阅至日志顶部,请稍后再试!`,
  92. });
  93. } else {
  94. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  95. $(`.message${version_name}`).css("display", "block");
  96. setTimeout(function () {
  97. $(`.message${version_name}`).css("display", "none");
  98. }, 1000);
  99. }
  100. } else {
  101. $(`#log${version_name} input[name=start_line${max}]`).val(
  102. data.StartLine
  103. ); //如果变动就改变所对应的值
  104. $(`#log${max}${version_name}`).prepend("<pre>" + data.Content);
  105. }
  106. }
  107. ).fail(function (err) {
  108. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  109. "display",
  110. "none"
  111. );
  112. console.log(err);
  113. });
  114. }
  115. }
  116. const fn = debounce(logScroll, 500);
  117. $(".log-scroll").scroll(function () {
  118. let version_name = $(this).data("version");
  119. let ID = $(`#accordion${version_name}`).data("jobid");
  120. let repoPath = $(`#accordion${version_name}`).data("repopath");
  121. fn(version_name, repoPath, ID);
  122. });
  123. function scrollAnimation(dom, currentY, targetY, currentX) {
  124. let needScrollTop = targetY - currentY;
  125. let _currentY = currentY;
  126. setTimeout(() => {
  127. // 一次调用滑动帧数,每次调用会不一样
  128. //取总距离的十分之一
  129. const dist = Math.ceil(needScrollTop / 10);
  130. _currentY += dist;
  131. //移动一个十分之一
  132. dom.scrollTo(currentX || 0, _currentY, "smooth");
  133. // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
  134. if (needScrollTop > 10 || needScrollTop < -10) {
  135. scrollAnimation(dom, _currentY, targetY);
  136. } else {
  137. dom.scrollTo(0, targetY, "smooth");
  138. }
  139. }, 1);
  140. }
  141. function logTop(e) {
  142. let max = e.currentTarget.getAttribute("data-max") || "";
  143. let lines = !!max ? 100 : 50;
  144. let version_name = $(this).data("version");
  145. let logContentDom = document.querySelector(`#log${max}${version_name}`);
  146. let ID = $(`#accordion${version_name}`).data("jobid");
  147. let repoPath = $(`#accordion${version_name}`).data("repopath");
  148. $(`#log_file${max}${version_name}`).siblings("pre").remove();
  149. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
  150. "background-color": "#fff",
  151. display: "block",
  152. });
  153. $.get(
  154. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=${lines}&order=asc`,
  155. (data) => {
  156. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  157. "display",
  158. "none"
  159. );
  160. $(`#log${version_name} input[name=end_line${max}]`).val(data.EndLine); //如果变动就改变所对应的值
  161. $(`#log${version_name} input[name=start_line${max}]`).val(
  162. data.StartLine
  163. );
  164. $(`#log${max}${version_name}`).prepend("<pre>" + data.Content);
  165. if (data.Lines == 0) {
  166. if (max) {
  167. $("body").toast({
  168. class: "info",
  169. message: `您已翻阅至日志顶部,请稍后再试!`,
  170. });
  171. } else {
  172. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  173. $(`.message${version_name}`).css("display", "block");
  174. setTimeout(function () {
  175. $(`.message${version_name}`).css("display", "none");
  176. }, 1000);
  177. }
  178. }
  179. scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
  180. }
  181. ).fail((err) => {
  182. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  183. "display",
  184. "none"
  185. );
  186. throw err;
  187. });
  188. }
  189. function logBottom(e) {
  190. let max = e.currentTarget.getAttribute("data-max") || "";
  191. let lines = !!max ? 100 : 50;
  192. let version_name = $(this).data("version");
  193. let logContentDom = document.querySelector(`#log${max}${version_name}`);
  194. let ID = $(`#accordion${version_name}`).data("jobid");
  195. let repoPath = $(`#accordion${version_name}`).data("repopath");
  196. $(`#log_file${max}${version_name}`).siblings("pre").remove();
  197. let end_line = $(`#log${version_name} input[name=end_line${max}]`).val();
  198. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css({
  199. "background-color": "#fff",
  200. display: "block",
  201. });
  202. $.get(
  203. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=${lines}&order=desc`,
  204. (data) => {
  205. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  206. "display",
  207. "none"
  208. );
  209. if (!data.CanLogDownload) {
  210. $(`#${version_name}-log-down`)
  211. .removeClass("ti-download-file")
  212. .addClass("disabled");
  213. } else {
  214. $(`#${version_name}-log-down`)
  215. .addClass("ti-download-file")
  216. .removeClass("disabled");
  217. }
  218. $(`#log${version_name} input[name=end_line${max}]`).val(data.EndLine); //如果变动就改变所对应的值
  219. if ($(this)[0].hasAttribute("data-tab")) {
  220. $(`#log${version_name} input[name=end_line-max]`).val(data.EndLine);
  221. $(`#log${version_name} input[name=start_line-max]`).val(
  222. data.StartLine
  223. );
  224. $(`#log${version_name} input[name=start_line-max-copy]`).val(
  225. data.StartLine
  226. );
  227. }
  228. $(`#log${version_name} input[name=start_line${max}]`).val(
  229. data.StartLine
  230. );
  231. $(`#log${max}${version_name}`).append("<pre>" + data.Content);
  232. $.get(
  233. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=${lines}&order=desc`,
  234. (data) => {
  235. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  236. "display",
  237. "none"
  238. );
  239. if (data.Lines == 0) {
  240. if (max) {
  241. $("body").toast({
  242. class: "info",
  243. message: `您已翻阅至日志底部,请稍后再试!`,
  244. });
  245. } else {
  246. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  247. $(`.message${version_name}`).css("display", "block");
  248. setTimeout(function () {
  249. $(`.message${version_name}`).css("display", "none");
  250. }, 1000);
  251. }
  252. } else {
  253. if (end_line === data.EndLine || end_line === "") {
  254. return;
  255. } else {
  256. $(`#log${version_name} input[name=end_line${max}]`).val(
  257. data.EndLine
  258. );
  259. if ($(this)[0].hasAttribute("data-tab")) {
  260. $(`#log${version_name} input[name=end_line-max]`).val(
  261. data.EndLine
  262. );
  263. }
  264. $(`#log${max}${version_name}`).append("<pre>" + data.Content);
  265. }
  266. }
  267. }
  268. ).fail(function (err) {
  269. $(`#log${max}${version_name} .ui.inverted.active.dimmer`).css(
  270. "display",
  271. "none"
  272. );
  273. console.log(err);
  274. });
  275. let test = $(`#log_file${version_name}`).nextAll();
  276. $(`#log${version_name} input[name=init_log]`).val(test[0].innerHTML);
  277. scrollAnimation(
  278. logContentDom,
  279. logContentDom.scrollTop + 1,
  280. logContentDom.scrollHeight - logContentDom.clientHeight - 10
  281. );
  282. }
  283. ).fail((err) => {
  284. $(`#log${version_name} .ui.inverted.active.dimmer`).css(
  285. "display",
  286. "none"
  287. );
  288. throw err;
  289. });
  290. }
  291. $(".log_top").click(logTop);
  292. $(".log_bottom").click(logBottom);
  293. // $(".log-scroll-max").scroll();
  294. $(".full-log-dialog").click(function () {
  295. let version_name = $(this).data("version");
  296. let log_type = $(this).data("log-type") || "";
  297. let logContentDom = document.querySelector(`#log-max${version_name}`);
  298. $(`.ui.modal.max-full-log${version_name}`)
  299. .modal({
  300. closable: false,
  301. onShow: function () {
  302. $(".ui.dimmer.modals").css({
  303. "background-color": "rgb(136, 136, 136,0.7)",
  304. });
  305. $(".log-scroll-max .ui.inverted.active.dimmer").css(
  306. "display",
  307. "none"
  308. );
  309. },
  310. onVisible: function () {
  311. $(`#log-max${version_name}`).append(
  312. "<pre>" + $(`#log${version_name} input[name=init_log]`).val()
  313. );
  314. scrollAnimation(
  315. logContentDom,
  316. logContentDom.scrollTop + 1,
  317. logContentDom.scrollHeight - logContentDom.clientHeight
  318. );
  319. if (log_type !== "c2Net") {
  320. $(".log-scroll-max").bind("scroll", function () {
  321. let version_name = $(this).data("version");
  322. let ID = $(`#accordion${version_name}`).data("jobid");
  323. let repoPath = $(`#accordion${version_name}`).data("repopath");
  324. fn(version_name, repoPath, ID, "-max", 100);
  325. });
  326. }
  327. $(".log_bottom-max").bind("click", logBottom);
  328. $(".log_top-max").bind("click", logTop);
  329. },
  330. onHide: function () {
  331. let startLine = $(
  332. `#log${version_name} input[name=start_line-max-copy]`
  333. ).val();
  334. $(`#log-file-max${version_name}`).siblings("pre").remove();
  335. $(`#log${version_name} input[name=start_line-max]`).val(startLine);
  336. $(".log-scroll-max").unbind("scroll");
  337. $(".log_bottom-max").unbind("click");
  338. $(".log_top-max").unbind("click");
  339. },
  340. })
  341. .modal("show");
  342. });
  343. function loadLog(version_name) {
  344. document.getElementById("mask").style.display = "block";
  345. $.get(
  346. `/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`,
  347. (data) => {
  348. $("input[name=end_line]").val(data.EndLine);
  349. $("input[name=start_line]").val(data.StartLine);
  350. $(`#log_file${version_name}`).text(data.Content);
  351. document.getElementById("mask").style.display = "none";
  352. }
  353. ).fail(function (err) {
  354. document.getElementById("mask").style.display = "none";
  355. console.log(err);
  356. });
  357. }
  358. $(".refresh-status").click(function (e) {
  359. let version_name = $(this).data("version");
  360. let ID = $(`#accordion${version_name}`).data("jobid");
  361. let repoPath = $(`#accordion${version_name}`).data("repopath");
  362. refreshStatusShow(version_name, ID, repoPath);
  363. $(`.log-info-${version_name} .log_bottom`).trigger("click");
  364. e.stopPropagation();
  365. });
  366. $(".stop-show-version").click(function (e) {
  367. const ID = this.dataset.jobid;
  368. const repoPath = this.dataset.repopath;
  369. const version_name = this.dataset.version;
  370. const url = `/api/v1/repos/${repoPath}/${ID}/stop_version`;
  371. $.post(url, { version_name: version_name }, (data) => {
  372. if (data.StatusOK === 0) {
  373. $(`#${version_name}-stop`).removeClass("blue");
  374. $(`#${version_name}-stop`).addClass("disabled");
  375. refreshStatusShow(version_name, ID, repoPath);
  376. }
  377. }).fail(function (err) {
  378. console.log(err);
  379. });
  380. e.stopPropagation();
  381. });
  382. $(".delete-show-version").click(function (e) {
  383. const ID = this.dataset.jobid;
  384. const repoPath = this.dataset.repopath;
  385. const version_name = this.dataset.version;
  386. const url = `/api/v1/repos/${repoPath}/${ID}/del_version`;
  387. $(".ui.basic.modal")
  388. .modal({
  389. onApprove: function () {
  390. $.post(url, { version_name: version_name }, (data) => {
  391. if (data.StatusOK === 0) {
  392. if (data.VersionListCount === 0) {
  393. location.href = `/${repoPath}`;
  394. } else {
  395. $("#accordion" + version_name).remove();
  396. }
  397. refreshStatusShow(version_name, ID, repoPath);
  398. } else {
  399. return;
  400. }
  401. }).fail(function (err) {
  402. console.log(err);
  403. });
  404. },
  405. })
  406. .modal("show");
  407. e.stopPropagation();
  408. });
  409. function refreshStatusShow(version_name, ID, repoPath) {
  410. $.get(
  411. `/api/v1/repos/${repoPath}/${ID}?version_name=${version_name}`,
  412. (data) => {
  413. //accroding下的状态
  414. $(`#${version_name}-status-span span`).text(data.JobStatus);
  415. //accroding下的状态图标
  416. $(`#${version_name}-status-span i`).attr("class", data.JobStatus);
  417. //accroding下的运行时长
  418. $(`#${version_name}-duration-span`).text(data.JobDuration);
  419. //配置信息详情页的状态
  420. $(`#${version_name}-status`).text(data.JobStatus);
  421. //配置信息详情页的状态
  422. $(`#${version_name}-duration`).text(data.JobDuration);
  423. }
  424. ).fail(function (err) {
  425. console.log(err);
  426. });
  427. }
  428. //
  429. $(".content-pad").on("click", ".load-model-file", function () {
  430. let downloadFlag = $(this).data("download-flag") || "";
  431. let gpuFlag = $(this).data("gpu-flag") || "";
  432. let version_name = $(this).data("version");
  433. let parents = $(this).data("parents");
  434. let filename = $(this).data("filename");
  435. let init = $(this).data("init") || "";
  436. let path = $(this).data("path");
  437. let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
  438. $.get(url, (data) => {
  439. $(`#dir_list${version_name}`).empty();
  440. if (data.Dirs) {
  441. renderDir(path, data, version_name, downloadFlag, gpuFlag);
  442. }
  443. if (init === "init") {
  444. $(`input[name=model${version_name}]`).val("");
  445. $(`input[name=modelback${version_name}]`).val(version_name);
  446. $(`#file_breadcrumb${version_name}`).empty();
  447. let htmlBread = "";
  448. if (version_name) {
  449. htmlBread += `<div class='active section'>${version_name}</div>`;
  450. } else {
  451. htmlBread += `<div class='active section'>result</div>`;
  452. }
  453. htmlBread += "<div class='divider'> / </div>";
  454. $(`#file_breadcrumb${version_name}`).append(htmlBread);
  455. } else {
  456. renderBrend(
  457. path,
  458. version_name,
  459. parents,
  460. filename,
  461. init,
  462. downloadFlag,
  463. gpuFlag
  464. );
  465. }
  466. }).fail(function (err) {
  467. console.log(err, version_name);
  468. });
  469. });
  470. function renderSize(value) {
  471. if (null == value || value == "") {
  472. return "0 Bytes";
  473. }
  474. var unitArr = new Array(
  475. "Bytes",
  476. "KB",
  477. "MB",
  478. "GB",
  479. "TB",
  480. "PB",
  481. "EB",
  482. "ZB",
  483. "YB"
  484. );
  485. var index = 0;
  486. var srcsize = parseFloat(value);
  487. index = Math.floor(Math.log(srcsize) / Math.log(1024));
  488. var size = srcsize / Math.pow(1024, index);
  489. size = size.toFixed(0); //保留的小数位数
  490. return size + unitArr[index];
  491. }
  492. function renderBrend(
  493. path,
  494. version_name,
  495. parents,
  496. filename,
  497. init,
  498. downloadFlag,
  499. gpuFlag
  500. ) {
  501. if (init == "folder") {
  502. let htmlBrend = "";
  503. let sectionName = $(
  504. `#file_breadcrumb${version_name} .active.section`
  505. ).text();
  506. let parents1 = $(`input[name=model${version_name}]`).val();
  507. let filename1 = $(`input[name=modelback${version_name}]`).val();
  508. if (parents1 === "") {
  509. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  510. `<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>`
  511. );
  512. } else {
  513. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  514. `<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>`
  515. );
  516. }
  517. htmlBrend += `<div class='active section'>${filename}</div>`;
  518. htmlBrend += "<div class='divider'> / </div>";
  519. $(`#file_breadcrumb${version_name}`).append(htmlBrend);
  520. $(`input[name=model${version_name}]`).val(parents);
  521. $(`input[name=modelback${version_name}]`).val(filename);
  522. } else {
  523. $(`input[name=model${version_name}]`).val(parents);
  524. $(`input[name=modelback${version_name}]`).val(filename);
  525. let selectEle = $(`#file_breadcrumb${version_name} a.section`).filter(
  526. (index, item) => {
  527. return item.text == filename;
  528. }
  529. );
  530. selectEle.nextAll().remove();
  531. selectEle.after("<div class='divider'> / </div>");
  532. selectEle.replaceWith(`<div class='active section'>${filename}</div>`);
  533. }
  534. }
  535. function renderDir(path, data, version_name, downloadFlag, gpuFlag) {
  536. let html = "";
  537. html += "<div class='ui grid' style='margin:0;'>";
  538. html += "<div class='row' style='padding: 0;'>";
  539. html += "<div class='ui sixteen wide column' style='padding:1rem;'>";
  540. html += "<div class='dir list'>";
  541. html += "<table id='repo-files-table' class='ui single line table pad20'>";
  542. html += "<tbody>";
  543. // html += "</tbody>"
  544. for (let i = 0; i < data.Dirs.length; i++) {
  545. let dirs_size = renderSize(data.Dirs[i].Size);
  546. html += "<tr>";
  547. html += "<td class='name six wid'>";
  548. html += "<span class='truncate'>";
  549. html += "<span class='octicon octicon-file-directory'>";
  550. html += "</span>";
  551. if (data.Dirs[i].IsDir) {
  552. 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'>`;
  553. html +=
  554. "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" +
  555. data.Dirs[i].FileName +
  556. "</span>";
  557. } else {
  558. if (downloadFlag) {
  559. if (gpuFlag) {
  560. if (path.includes("model_list")) {
  561. 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}">`;
  562. } else {
  563. 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}">`;
  564. }
  565. } else {
  566. if (path.includes("model_list")) {
  567. html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  568. } else {
  569. html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  570. }
  571. }
  572. } else {
  573. html += `<a class="disabled">`;
  574. }
  575. html +=
  576. "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" +
  577. data.Dirs[i].FileName +
  578. "</span>";
  579. }
  580. html += "</a>";
  581. html += "</span>";
  582. html += "</td>";
  583. html += "<td class='message1 seven wide'>";
  584. if (data.Dirs[i].IsDir) {
  585. html += "<span class='truncate has-emoji'></span>";
  586. } else {
  587. html +=
  588. "<span class='truncate has-emoji'>" + `${dirs_size}` + "</span>";
  589. }
  590. html += "</td>";
  591. html += "<td class='text right age three wide'>";
  592. html +=
  593. "<span class='truncate has-emoji'>" + data.Dirs[i].ModTime + "</span>";
  594. html += "</td>";
  595. html += "</tr>";
  596. }
  597. html += "</tbody>";
  598. html += "</table>";
  599. html += "</div>";
  600. html += "</div>";
  601. html += "</div>";
  602. html += "</div>";
  603. $(`#dir_list${version_name}`).append(html);
  604. }
  605. let nameMap, nameList;
  606. let RepoLink = $(".cloudbrain-type").data("repo-link");
  607. let type = $(".cloudbrain-type").data("cloudbrain-type");
  608. let flagModel = $(".cloudbrain-type").data("flag-model");
  609. // 获取模型列表和模型名称对应的模型版本
  610. $(document).ready(function () {
  611. if (!flagModel) return;
  612. else {
  613. $.get(
  614. `${RepoLink}/modelmanage/query_model_for_predict?type=${type}`,
  615. (data) => {
  616. nameMap = data.nameMap;
  617. nameList = data.nameList;
  618. let html = `<div class="item"></div>`;
  619. nameList.forEach((element) => {
  620. html += `<div class="item" data-value=${element}>${element}</div>`;
  621. });
  622. if (nameList.length !== 0) {
  623. $("#model_name").append(html);
  624. }
  625. let faildModelName = $('input[name="model_name"]').val();
  626. let faildModelVersion = $('input[name="model_version"]').val();
  627. let dataID;
  628. // 新建错误的表单返回初始化
  629. if (faildModelName && nameList.includes(faildModelName)) {
  630. $("#select_model").dropdown("set text", faildModelName);
  631. $("#select_model").dropdown("set value", faildModelName);
  632. nameMap[faildModelName].forEach((element) => {
  633. if (element.Version === faildModelVersion) {
  634. dataID = element.ID;
  635. }
  636. });
  637. initModelVerison(faildModelName, nameMap, faildModelVersion);
  638. initModelckpt(dataID);
  639. }
  640. }
  641. );
  642. }
  643. $("#select_model").dropdown({
  644. onChange: function (value, text, $selectedItem) {
  645. $("#model_name_version").empty();
  646. if (value) {
  647. let html = "";
  648. nameMap[value].forEach((element) => {
  649. let { TrainTaskInfo } = element;
  650. TrainTaskInfo = JSON.parse(TrainTaskInfo);
  651. html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${element.Path}">${element.Version}</div>`;
  652. });
  653. $("#model_name_version").append(html);
  654. const initVersionText = $(
  655. "#model_name_version div.item:first-child"
  656. ).text();
  657. const initVersionValue = $(
  658. "#model_name_version div.item:first-child"
  659. ).data("value");
  660. $("#select_model_version").dropdown("set text", initVersionText);
  661. $("#select_model_version").dropdown(
  662. "set value",
  663. initVersionValue,
  664. initVersionText,
  665. $("#model_name_version div.item:first-child")
  666. );
  667. } else {
  668. $("#select_model_version").dropdown("set text", "");
  669. $("#select_model_version").dropdown("set value", "");
  670. $("#select_model_checkpoint").dropdown("set text", "");
  671. $("#select_model_checkpoint").dropdown("set value", "");
  672. }
  673. },
  674. });
  675. $("#select_model_version").dropdown({
  676. onChange: function (value, text, $selectedItem) {
  677. if (!value) return;
  678. const dataID =
  679. $selectedItem && $selectedItem[0].getAttribute("data-id");
  680. $("input#ai_model_version").val(text);
  681. $("#select_model_checkpoint").dropdown("set text", "");
  682. $("#select_model_checkpoint").addClass("loading");
  683. $("#model_checkpoint").empty();
  684. let html = "";
  685. loadCheckpointList(dataID).then((res) => {
  686. res.forEach((element) => {
  687. const ckptSuffix = element.FileName.split(".");
  688. const loadCheckpointFile = [
  689. "ckpt",
  690. "pb",
  691. "h5",
  692. "json",
  693. "pkl",
  694. "pth",
  695. "t7",
  696. "pdparams",
  697. "onnx",
  698. "pbtxt",
  699. "keras",
  700. "mlmodel",
  701. "cfg",
  702. "pt",
  703. ];
  704. if (
  705. !element.IsDir &&
  706. loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1])
  707. ) {
  708. html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`;
  709. }
  710. });
  711. $("#model_checkpoint").append(html);
  712. $("#select_model_checkpoint").removeClass("loading");
  713. const initVersionText = $(
  714. "#model_checkpoint div.item:first-child"
  715. ).text();
  716. const initVersionValue = $(
  717. "#model_checkpoint div.item:first-child"
  718. ).data("value");
  719. $("#select_model_checkpoint").dropdown("set text", initVersionText);
  720. $("#select_model_checkpoint").dropdown(
  721. "set value",
  722. initVersionValue,
  723. initVersionText,
  724. $("#model_name_version div.item:first-child")
  725. );
  726. });
  727. },
  728. });
  729. });
  730. function initModelVerison(value, nameMap, faildModelVersion) {
  731. let faildTrainUrl = $('input[name="pre_train_model_url"]').val();
  732. let html = "";
  733. nameMap[value].forEach((element) => {
  734. let { TrainTaskInfo } = element;
  735. TrainTaskInfo = JSON.parse(TrainTaskInfo);
  736. html += `<div class="item" data-label="${element.Label}" data-id="${element.ID}" data-value="${element.Path}">${element.Version}</div>`;
  737. });
  738. $("#model_name_version").append(html);
  739. $("#select_model_version").dropdown("set text", faildModelVersion);
  740. $("#select_model_version").dropdown("set value", faildTrainUrl);
  741. }
  742. function initModelckpt(dataID) {
  743. let faildCkptName = $('input[name="ckpt_name"]').val();
  744. $("#select_model_checkpoint").addClass("loading");
  745. $("#model_checkpoint").empty();
  746. let html = "";
  747. loadCheckpointList(dataID).then((res) => {
  748. res.forEach((element) => {
  749. const ckptSuffix = element.FileName.split(".");
  750. const loadCheckpointFile = [
  751. "ckpt",
  752. "pb",
  753. "h5",
  754. "json",
  755. "pkl",
  756. "pth",
  757. "t7",
  758. "pdparams",
  759. "onnx",
  760. "pbtxt",
  761. "keras",
  762. "mlmodel",
  763. "cfg",
  764. "pt",
  765. ];
  766. if (
  767. !element.IsDir &&
  768. loadCheckpointFile.includes(ckptSuffix[ckptSuffix.length - 1])
  769. ) {
  770. html += `<div class="item" data-value=${element.FileName}>${element.FileName}</div>`;
  771. }
  772. });
  773. $("#model_checkpoint").append(html);
  774. $("#select_model_checkpoint").removeClass("loading");
  775. $("#select_model_checkpoint").dropdown("set text", faildCkptName);
  776. $("#select_model_checkpoint").dropdown("set value", faildCkptName);
  777. });
  778. }
  779. function loadCheckpointList(value) {
  780. return new Promise((resolve, reject) => {
  781. $.get(
  782. `${RepoLink}/modelmanage/query_modelfile_for_predict`,
  783. { ID: value },
  784. (data) => {
  785. resolve(data);
  786. }
  787. );
  788. });
  789. }
  790. }