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