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 18 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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) {
  16. let container = document.querySelector(`#log${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]`).val();
  28. $.get(
  29. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`,
  30. (data) => {
  31. if (data.Lines == 0) {
  32. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  33. $(`.message${version_name}`).css("display", "block");
  34. setTimeout(function () {
  35. $(`.message${version_name}`).css("display", "none");
  36. }, 1000);
  37. } else {
  38. if (end_line === data.EndLine) {
  39. return;
  40. } else {
  41. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  42. $(`#log${version_name}`).append("<pre>" + data.Content);
  43. }
  44. }
  45. }
  46. ).fail(function (err) {
  47. console.log(err);
  48. });
  49. }
  50. if (scrollTop == 0 && scrollLeft == 0) {
  51. let start_line = $(`#log${version_name} input[name=start_line]`).val();
  52. $.get(
  53. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`,
  54. (data) => {
  55. if (data.Lines == 0) {
  56. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  57. $(`.message${version_name}`).css("display", "block");
  58. setTimeout(function () {
  59. $(`.message${version_name}`).css("display", "none");
  60. }, 1000);
  61. } else {
  62. $(`#log${version_name} input[name=start_line]`).val(data.StartLine); //如果变动就改变所对应的值
  63. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  64. }
  65. }
  66. ).fail(function (err) {
  67. console.log(err);
  68. });
  69. }
  70. }
  71. const fn = debounce(logScroll, 500);
  72. $(".log-scroll").scroll(function () {
  73. let version_name = $(this).data("version");
  74. let ID = $(`#accordion${version_name}`).data("jobid");
  75. let repoPath = $(`#accordion${version_name}`).data("repopath");
  76. fn(version_name, repoPath, ID);
  77. });
  78. function scrollAnimation(dom, currentY, targetY, currentX) {
  79. let needScrollTop = targetY - currentY;
  80. let _currentY = currentY;
  81. setTimeout(() => {
  82. // 一次调用滑动帧数,每次调用会不一样
  83. //取总距离的十分之一
  84. const dist = Math.ceil(needScrollTop / 10);
  85. _currentY += dist;
  86. //移动一个十分之一
  87. dom.scrollTo(currentX || 0, _currentY, "smooth");
  88. // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
  89. if (needScrollTop > 10 || needScrollTop < -10) {
  90. scrollAnimation(dom, _currentY, targetY);
  91. } else {
  92. dom.scrollTo(0, targetY, "smooth");
  93. }
  94. }, 1);
  95. }
  96. $(".log_top").click(function () {
  97. // let logContentDom = document.querySelector('.log')
  98. // if(!logContentDom)
  99. // return
  100. // let version_name = $('.log_top').data('version')
  101. let version_name = $(this).data("version");
  102. let logContentDom = document.querySelector(`#log${version_name}`);
  103. let ID = $(`#accordion${version_name}`).data("jobid");
  104. let repoPath = $(`#accordion${version_name}`).data("repopath");
  105. $(`#log_file${version_name}`).siblings("pre").remove();
  106. $(".ui.inverted.active.dimmer").css("display", "block");
  107. $.get(
  108. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`,
  109. (data) => {
  110. $(".ui.inverted.active.dimmer").css("display", "none");
  111. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  112. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  113. $(`#log${version_name}`).prepend("<pre>" + data.Content);
  114. $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
  115. $(`.message${version_name}`).css("display", "block");
  116. setTimeout(function () {
  117. $(`.message${version_name}`).css("display", "none");
  118. }, 1000);
  119. scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
  120. }
  121. );
  122. });
  123. $(".log_bottom").click(function (e) {
  124. let version_name = $(this).data("version");
  125. let logContentDom = document.querySelector(`#log${version_name}`);
  126. let ID = $(`#accordion${version_name}`).data("jobid");
  127. let repoPath = $(`#accordion${version_name}`).data("repopath");
  128. $(`#log_file${version_name}`).siblings("pre").remove();
  129. let end_line = $(`#log${version_name} input[name=end_line]`).val();
  130. $(".ui.inverted.active.dimmer").css("display", "block");
  131. $.get(
  132. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`,
  133. (data) => {
  134. $(".ui.inverted.active.dimmer").css("display", "none");
  135. if (!data.CanLogDownload) {
  136. $(`#${version_name}-log-down`)
  137. .removeClass("ti-download-file")
  138. .addClass("disabled");
  139. }
  140. $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
  141. $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
  142. $(`#log${version_name}`).append("<pre>" + data.Content);
  143. $.get(
  144. `/api/v1/repos/${repoPath}/${ID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`,
  145. (data) => {
  146. $(".ui.inverted.active.dimmer").css("display", "none");
  147. if (data.Lines == 0) {
  148. $(`.message${version_name} #header`).text("您已翻阅至日志底部");
  149. $(`.message${version_name}`).css("display", "block");
  150. setTimeout(function () {
  151. $(`.message${version_name}`).css("display", "none");
  152. }, 1000);
  153. } else {
  154. if (end_line === data.EndLine || end_line === "") {
  155. return;
  156. } else {
  157. $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
  158. $(`#log${version_name}`).append("<pre>" + data.Content);
  159. }
  160. }
  161. }
  162. ).fail(function (err) {
  163. console.log(err);
  164. });
  165. scrollAnimation(
  166. logContentDom,
  167. logContentDom.scrollTop + 1,
  168. logContentDom.scrollHeight - logContentDom.clientHeight
  169. );
  170. }
  171. );
  172. });
  173. function loadLog(version_name) {
  174. document.getElementById("mask").style.display = "block";
  175. $.get(
  176. `/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&lines=50&order=asc`,
  177. (data) => {
  178. $("input[name=end_line]").val(data.EndLine);
  179. $("input[name=start_line]").val(data.StartLine);
  180. $(`#log_file${version_name}`).text(data.Content);
  181. document.getElementById("mask").style.display = "none";
  182. }
  183. ).fail(function (err) {
  184. document.getElementById("mask").style.display = "none";
  185. console.log(err);
  186. });
  187. }
  188. $(".refresh-status").click(function (e) {
  189. let version_name = $(this).data("version");
  190. let ID = $(`#accordion${version_name}`).data("jobid");
  191. let repoPath = $(`#accordion${version_name}`).data("repopath");
  192. refreshStatusShow(version_name, ID, repoPath);
  193. $(`.log-info-${version_name} .log_bottom`).trigger("click");
  194. e.stopPropagation();
  195. });
  196. $(".stop-show-version").click(function (e) {
  197. const ID = this.dataset.jobid;
  198. const repoPath = this.dataset.repopath;
  199. const version_name = this.dataset.version;
  200. const url = `/api/v1/repos/${repoPath}/${ID}/stop_version`;
  201. $.post(url, { version_name: version_name }, (data) => {
  202. if (data.StatusOK === 0) {
  203. $(`#${version_name}-stop`).removeClass("blue");
  204. $(`#${version_name}-stop`).addClass("disabled");
  205. refreshStatusShow(version_name, ID, repoPath);
  206. }
  207. }).fail(function (err) {
  208. console.log(err);
  209. });
  210. e.stopPropagation();
  211. });
  212. $(".delete-show-version").click(function (e) {
  213. const ID = this.dataset.jobid;
  214. const repoPath = this.dataset.repopath;
  215. const version_name = this.dataset.version;
  216. const url = `/api/v1/repos/${repoPath}/${ID}/del_version`;
  217. $(".ui.basic.modal")
  218. .modal({
  219. onApprove: function () {
  220. $.post(url, { version_name: version_name }, (data) => {
  221. console.log(data);
  222. if (data.StatusOK === 0) {
  223. if (data.VersionListCount === 0) {
  224. location.href = `/${repoPath}`;
  225. } else {
  226. $("#accordion" + version_name).remove();
  227. }
  228. refreshStatusShow(version_name, ID, repoPath);
  229. } else {
  230. return;
  231. }
  232. }).fail(function (err) {
  233. console.log(err);
  234. });
  235. },
  236. })
  237. .modal("show");
  238. e.stopPropagation();
  239. });
  240. function refreshStatusShow(version_name, ID, repoPath) {
  241. $.get(
  242. `/api/v1/repos/${repoPath}/${ID}?version_name=${version_name}`,
  243. (data) => {
  244. //accroding下的状态
  245. $(`#${version_name}-status-span span`).text(data.JobStatus);
  246. //accroding下的状态图标
  247. $(`#${version_name}-status-span i`).attr("class", data.JobStatus);
  248. //accroding下的运行时长
  249. $(`#${version_name}-duration-span`).text(data.JobDuration);
  250. //配置信息详情页的状态
  251. $(`#${version_name}-status`).text(data.JobStatus);
  252. //配置信息详情页的状态
  253. $(`#${version_name}-duration`).text(data.JobDuration);
  254. }
  255. ).fail(function (err) {
  256. console.log(err);
  257. });
  258. }
  259. //
  260. $(".content-pad").on("click", ".load-model-file", function () {
  261. let downloadFlag = $(this).data("download-flag") || "";
  262. let gpuFlag = $(this).data("gpu-flag") || "";
  263. let version_name = $(this).data("version");
  264. let parents = $(this).data("parents");
  265. let filename = $(this).data("filename");
  266. let init = $(this).data("init") || "";
  267. let path = $(this).data("path");
  268. let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
  269. $.get(url, (data) => {
  270. $(`#dir_list${version_name}`).empty();
  271. if (data.Dirs) {
  272. renderDir(path, data, version_name, downloadFlag, gpuFlag);
  273. }
  274. if (init === "init") {
  275. $(`input[name=model${version_name}]`).val("");
  276. $(`input[name=modelback${version_name}]`).val(version_name);
  277. $(`#file_breadcrumb${version_name}`).empty();
  278. let htmlBread = "";
  279. if (version_name) {
  280. htmlBread += `<div class='active section'>${version_name}</div>`;
  281. } else {
  282. htmlBread += `<div class='active section'>result</div>`;
  283. }
  284. htmlBread += "<div class='divider'> / </div>";
  285. $(`#file_breadcrumb${version_name}`).append(htmlBread);
  286. } else {
  287. renderBrend(
  288. path,
  289. version_name,
  290. parents,
  291. filename,
  292. init,
  293. downloadFlag,
  294. gpuFlag
  295. );
  296. }
  297. }).fail(function (err) {
  298. console.log(err, version_name);
  299. });
  300. });
  301. function renderSize(value) {
  302. if (null == value || value == "") {
  303. return "0 Bytes";
  304. }
  305. var unitArr = new Array(
  306. "Bytes",
  307. "KB",
  308. "MB",
  309. "GB",
  310. "TB",
  311. "PB",
  312. "EB",
  313. "ZB",
  314. "YB"
  315. );
  316. var index = 0;
  317. var srcsize = parseFloat(value);
  318. index = Math.floor(Math.log(srcsize) / Math.log(1024));
  319. var size = srcsize / Math.pow(1024, index);
  320. size = size.toFixed(0); //保留的小数位数
  321. return size + unitArr[index];
  322. }
  323. function renderBrend(
  324. path,
  325. version_name,
  326. parents,
  327. filename,
  328. init,
  329. downloadFlag,
  330. gpuFlag
  331. ) {
  332. if (init == "folder") {
  333. let htmlBrend = "";
  334. let sectionName = $(
  335. `#file_breadcrumb${version_name} .active.section`
  336. ).text();
  337. let parents1 = $(`input[name=model${version_name}]`).val();
  338. let filename1 = $(`input[name=modelback${version_name}]`).val();
  339. if (parents1 === "") {
  340. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  341. `<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>`
  342. );
  343. } else {
  344. $(`#file_breadcrumb${version_name} .active.section`).replaceWith(
  345. `<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>`
  346. );
  347. }
  348. htmlBrend += `<div class='active section'>${filename}</div>`;
  349. htmlBrend += "<div class='divider'> / </div>";
  350. $(`#file_breadcrumb${version_name}`).append(htmlBrend);
  351. $(`input[name=model${version_name}]`).val(parents);
  352. $(`input[name=modelback${version_name}]`).val(filename);
  353. } else {
  354. $(`input[name=model${version_name}]`).val(parents);
  355. $(`input[name=modelback${version_name}]`).val(filename);
  356. let selectEle = $(`#file_breadcrumb${version_name} a.section`).filter(
  357. (index, item) => {
  358. return item.text == filename;
  359. }
  360. );
  361. selectEle.nextAll().remove();
  362. selectEle.after("<div class='divider'> / </div>");
  363. selectEle.replaceWith(`<div class='active section'>${filename}</div>`);
  364. }
  365. }
  366. function renderDir(path, data, version_name, downloadFlag, gpuFlag) {
  367. let html = "";
  368. html += "<div class='ui grid' style='margin:0;'>";
  369. html += "<div class='row' style='padding: 0;'>";
  370. html += "<div class='ui sixteen wide column' style='padding:1rem;'>";
  371. html += "<div class='dir list'>";
  372. html += "<table id='repo-files-table' class='ui single line table pad20'>";
  373. html += "<tbody>";
  374. // html += "</tbody>"
  375. for (let i = 0; i < data.Dirs.length; i++) {
  376. let dirs_size = renderSize(data.Dirs[i].Size);
  377. html += "<tr>";
  378. html += "<td class='name six wid'>";
  379. html += "<span class='truncate'>";
  380. html += "<span class='octicon octicon-file-directory'>";
  381. html += "</span>";
  382. if (data.Dirs[i].IsDir) {
  383. 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'>`;
  384. html +=
  385. "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" +
  386. data.Dirs[i].FileName +
  387. "</span>";
  388. } else {
  389. if (downloadFlag) {
  390. if (gpuFlag) {
  391. if (path.includes("model_list")) {
  392. 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}">`;
  393. } else {
  394. 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}">`;
  395. }
  396. } else {
  397. if (path.includes("model_list")) {
  398. html += `<a href="${location.href}/model_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  399. } else {
  400. html += `<a href="${location.href}/result_download?version_name=${version_name}&file_name=${data.Dirs[i].FileName}&parent_dir=${data.Dirs[i].ParenDir}">`;
  401. }
  402. }
  403. } else {
  404. html += `<a class="disabled">`;
  405. }
  406. html +=
  407. "<span class='fitted'><i class='file icon' width='16' height='16' aria-hidden='true'></i>" +
  408. data.Dirs[i].FileName +
  409. "</span>";
  410. }
  411. html += "</a>";
  412. html += "</span>";
  413. html += "</td>";
  414. html += "<td class='message1 seven wide'>";
  415. if (data.Dirs[i].IsDir) {
  416. html += "<span class='truncate has-emoji'></span>";
  417. } else {
  418. html +=
  419. "<span class='truncate has-emoji'>" + `${dirs_size}` + "</span>";
  420. }
  421. html += "</td>";
  422. html += "<td class='text right age three wide'>";
  423. html +=
  424. "<span class='truncate has-emoji'>" + data.Dirs[i].ModTime + "</span>";
  425. html += "</td>";
  426. html += "</tr>";
  427. }
  428. html += "</tbody>";
  429. html += "</table>";
  430. html += "</div>";
  431. html += "</div>";
  432. html += "</div>";
  433. html += "</div>";
  434. $(`#dir_list${version_name}`).append(html);
  435. }
  436. }