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