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