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