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