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.

home.js 17 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. var token;
  2. if(isEmpty(token)){
  3. var meta = $("meta[name=_uid]");
  4. if(!isEmpty(meta)){
  5. token = meta.attr("content");
  6. }
  7. }
  8. var swiperNewMessage = new Swiper(".newslist", {
  9. direction: "vertical",
  10. slidesPerView: 10,
  11. loop: true,
  12. autoplay: {
  13. delay: 2500,
  14. disableOnInteraction: false,
  15. },
  16. });
  17. var swiperRepo = new Swiper(".homepro-list", {
  18. slidesPerView: 1,
  19. slidesPerColumn: 2,
  20. slidesPerColumnFill:'row',
  21. spaceBetween: 30,
  22. pagination: {
  23. el: ".swiper-pagination",
  24. clickable: true,
  25. },
  26. autoplay: {
  27. delay: 2500,
  28. disableOnInteraction: false,
  29. },
  30. breakpoints: {
  31. 768: {
  32. slidesPerView: 2,
  33. },
  34. 1024: {
  35. slidesPerView: 3,
  36. },
  37. },
  38. });
  39. var swiperOrg = new Swiper(".homeorg-list", {
  40. slidesPerView: 1,
  41. slidesPerColumn: 4,
  42. slidesPerColumnFill:'row',
  43. spaceBetween: 15,
  44. pagination: {
  45. el: ".swiper-pagination",
  46. clickable: true,
  47. },
  48. autoplay: {
  49. delay: 4500,
  50. disableOnInteraction: false,
  51. },
  52. breakpoints: {
  53. 768: {
  54. slidesPerView: 2,
  55. },
  56. 1024: {
  57. slidesPerView: 3,
  58. },
  59. },
  60. });
  61. var output = document.getElementById("newmessage");
  62. var url = "ws://" + document.location.host + "/action/notification";
  63. if(document.location.host == "git.openi.org.cn" || document.URL.startsWith("https")){
  64. url = "wss://" + document.location.host + "/action/notification"
  65. }
  66. var socket = new WebSocket(url);
  67. socket.onopen = function () {
  68. messageQueue = [];
  69. console.log("message has connected.");
  70. };
  71. var maxSize = 20;
  72. var html =document.documentElement;
  73. var lang = html.attributes["lang"]
  74. var isZh = true;
  75. if(lang != null && lang.nodeValue =="en-US" ){
  76. isZh=false;
  77. }else{
  78. }
  79. socket.onmessage = function (e) {
  80. var data =JSON.parse(e.data)
  81. var html = "";
  82. if (data != null){
  83. if(messageQueue.length > maxSize){
  84. delete messageQueue[0];
  85. }else{
  86. messageQueue.push(data);
  87. }
  88. var currentTime = new Date().getTime();
  89. for(var i = 0; i < messageQueue.length; i++){
  90. var record = messageQueue[i];
  91. var actionName = getAction(record.OpType,isZh);
  92. if(record.ActUser == null){
  93. console.log("receive action type=" + record.OpType + " name=" + actionName + " but user is null.");
  94. continue;
  95. }
  96. var recordPrefix = getMsg(record);
  97. if(record.OpType == "6" || record.OpType == "10" || record.OpType == "12" || record.OpType == "13"){
  98. html += recordPrefix + actionName;
  99. html += " <a href=\"" + getIssueLink(record) + "\" rel=\"nofollow\">" + getIssueText(record) + "</a>"
  100. }
  101. else if(record.OpType == "7" || record.OpType == "11" || record.OpType == "14" || record.OpType == "15" || record.OpType == "22"
  102. || record.OpType == "23"){
  103. html += recordPrefix + actionName;
  104. html += " <a href=\"" + getPRLink(record) + "\" rel=\"nofollow\">" + getPRText(record) + "</a>"
  105. }
  106. else if(record.OpType == "1"){
  107. html += recordPrefix + actionName;
  108. html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" +getRepotext(record) + "</a>"
  109. }
  110. else if(record.OpType == "5"){
  111. branch = "<a href=\"" + getRepoLink(record) + "/src/branch/" + encodeURI(record.RefName) + "\" rel=\"nofollow\">" + record.RefName + "</a>"
  112. actionName = actionName.replace("{branch}",branch);
  113. html += recordPrefix + actionName;
  114. html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepotext(record) + "</a>"
  115. }else if(record.OpType == "9"){
  116. branch = "<a href=\"" + getRepoLink(record) + "/src/tag/" + encodeURI(record.RefName) + "\" rel=\"nofollow\">" + record.RefName + "</a>"
  117. actionName = actionName.replace("{branch}",branch);
  118. html += recordPrefix + actionName;
  119. html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepotext(record) + "</a>"
  120. }
  121. else if(record.OpType == "17"){
  122. actionName = actionName.replace("{deleteBranchName}",record.RefName);
  123. var repoLink = "<a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepotext(record) + "</a>"
  124. actionName = actionName.replace("{repoName}",repoLink);
  125. html += recordPrefix + actionName;
  126. }
  127. else if(record.OpType == "2"){
  128. actionName = actionName.replace("{oldRepoName}",record.Content);
  129. html += recordPrefix + actionName;
  130. html += " <a href=\"" + getRepoLink(record) + "\" rel=\"nofollow\">" + getRepotext(record) + "</a>"
  131. }
  132. else if(record.OpType == "24" || record.OpType == "26" || record.OpType == "27" || record.OpType == "28" || record.OpType == "30"){
  133. html += recordPrefix + actionName;
  134. html += " <a href=\"" + getTaskLink(record) + "\" rel=\"nofollow\">" + record.RefName + "</a>"
  135. }
  136. else if(record.OpType == "25" || record.OpType == "29"){
  137. html += recordPrefix + actionName;
  138. html += " <a href=\"" + getTaskLink(record) + "\" rel=\"nofollow\">" + record.RefName + "</a>"
  139. }
  140. else{
  141. continue;
  142. }
  143. if(record.Repo != null){
  144. var time = getTime(record.CreatedUnix,currentTime);
  145. html += " " + time;
  146. }
  147. html += "</div>";
  148. html += "</div>";
  149. }
  150. }
  151. output.innerHTML = html;
  152. swiperNewMessage.updateSlides();
  153. swiperNewMessage.updateProgress();
  154. };
  155. function getTaskLink(record){
  156. var re = getRepoLink(record);
  157. if(record.OpType == 24){
  158. re = re + "/datasets?type=" + record.Content;
  159. }else if(record.OpType == 25){
  160. re = re + "/cloudbrain/" + record.Content;
  161. }else if(record.OpType == 26){
  162. re = re + "/modelarts/notebook/" + record.Content;
  163. }else if(record.OpType == 27){
  164. re = re + "/modelarts/train-job/" + record.Content;
  165. }else if(record.OpType == 28){
  166. re = re + "/modelarts/inference-job/" + record.Content;
  167. }else if(record.OpType == 29){
  168. re = re + "/cloudbrain/benchmark/" + record.Content;
  169. }else if(record.OpType == 30){
  170. re = re + "/modelmanage/show_model_info?name=" + record.RefName;
  171. }
  172. re = encodeURI(re);
  173. return re;
  174. }
  175. function getMsg(record){
  176. var html ="";
  177. html += "<div class=\"swiper-slide item\">";
  178. var name = "";
  179. if(record.ActUser != null){
  180. name = record.ActUser.Name;
  181. }else{
  182. console.log("act user is null.");
  183. }
  184. html += " <img class=\"ui avatar image\" src=\"/user/avatar/" + name + "/-1\" alt=\"\">"
  185. html += " <div class=\"middle aligned content nowrap\">"
  186. html += " <a href=\"/" + encodeURI(name) + "\" title=\"\">" + name + "</a>"
  187. return html;
  188. }
  189. function getRepotext(record){
  190. if(record.Repo.Alias){
  191. return record.Repo.OwnerName + "/" + record.Repo.Alias;
  192. }else{
  193. return record.Repo.OwnerName + "/" + record.Repo.Name;
  194. }
  195. }
  196. function getRepoLink(record){
  197. return encodeURI(record.Repo.OwnerName + "/" + record.Repo.Name);
  198. }
  199. function getTime(UpdatedUnix,currentTime){
  200. UpdatedUnix = UpdatedUnix;
  201. currentTime = currentTime / 1000;
  202. var timeEscSecond = currentTime - UpdatedUnix;
  203. if( timeEscSecond < 0){
  204. timeEscSecond = 1;
  205. }
  206. var hours= Math.floor(timeEscSecond / 3600);
  207. //计算相差分钟数
  208. var leave2 = Math.floor(timeEscSecond % (3600)); //计算小时数后剩余的秒数
  209. var minutes= Math.floor(leave2 / 60);//计算相差分钟数
  210. var leave3=Math.floor(leave2 % 60); //计算分钟数后剩余的秒数
  211. var seconds= leave3;
  212. if(hours == 0 && minutes == 0){
  213. return seconds + getRepoOrOrg(6,isZh,seconds);
  214. }else{
  215. if(hours > 0){
  216. return hours + getRepoOrOrg(4,isZh,hours);
  217. }else{
  218. return minutes + getRepoOrOrg(5,isZh,minutes);
  219. }
  220. }
  221. }
  222. function getPRLink(record){
  223. return encodeURI("/" + record.Repo.OwnerName + "/" + record.Repo.Name + "/pulls/" + getIssueId(record));
  224. }
  225. function getPRText(record){
  226. if(record.Repo.Alias){
  227. return record.Repo.OwnerName + "/" + record.Repo.Alias + "#" + getIssueId(record);
  228. }else{
  229. return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record);
  230. }
  231. }
  232. function getIssueLink(record){
  233. return encodeURI("/" + record.Repo.OwnerName + "/" + record.Repo.Name + "/issues/" + getIssueId(record));
  234. }
  235. function getIssueId(record){
  236. var Id = "1";
  237. if(!isEmpty(record.Comment) && !isEmpty(record.Comment.Issue)){
  238. Id = record.Comment.Issue.Index;
  239. }else{
  240. if(!isEmpty(record.Content)){
  241. var content = record.Content;
  242. var index = content.indexOf("|");
  243. if(index != -1){
  244. Id = content.substring(0,index);
  245. }
  246. }
  247. }
  248. return Id;
  249. }
  250. function getIssueText(record){
  251. if(record.Repo.Alias){
  252. return record.Repo.OwnerName + "/" + record.Repo.Alias + "#" + getIssueId(record);
  253. }else{
  254. return record.Repo.OwnerName + "/" + record.Repo.Name + "#" + getIssueId(record);
  255. }
  256. }
  257. /*
  258. ActionCreateRepo ActionType = iota + 1 // 1
  259. ActionRenameRepo // 2
  260. ActionStarRepo // 3
  261. ActionWatchRepo // 4
  262. ActionCommitRepo // 5
  263. ActionCreateIssue // 6
  264. ActionCreatePullRequest // 7
  265. ActionTransferRepo // 8
  266. ActionPushTag // 9
  267. ActionCommentIssue // 10
  268. ActionMergePullRequest // 11
  269. ActionCloseIssue // 12
  270. ActionReopenIssue // 13
  271. ActionClosePullRequest // 14
  272. ActionReopenPullRequest // 15
  273. ActionDeleteTag // 16
  274. ActionDeleteBranch // 17
  275. ActionMirrorSyncPush // 18
  276. ActionMirrorSyncCreate // 19
  277. ActionMirrorSyncDelete // 20
  278. ActionApprovePullRequest // 21
  279. ActionRejectPullRequest // 22
  280. ActionCommentPull // 23
  281. */
  282. var actionNameZH={
  283. "1":"创建了项目",
  284. "2":"重命名项目 {oldRepoName} 为",
  285. "5":"推送了 {branch} 分支的代码到",
  286. "6":"创建了任务",
  287. "7":"创建了合并请求",
  288. "9":"推送了标签 {branch} 到",
  289. "10":"评论了任务",
  290. "11":"合并了合并请求",
  291. "12":"关闭了任务",
  292. "13":"重新开启了任务",
  293. "14":"关闭了合并请求",
  294. "15":"重新开启了合并请求",
  295. "17":"从 {repoName} 删除分支 {deleteBranchName}",
  296. "22":"建议变更",
  297. "23":"评论了合并请求",
  298. "24":"上传了数据集文件",
  299. "25":"创建了CPU/GPU类型调试任务",
  300. "26":"创建了NPU类型调试任务",
  301. "27":"创建了训练任务",
  302. "28":"创建了推理任务",
  303. "29":"创建了评测任务",
  304. "30":"导入了新模型"
  305. };
  306. var actionNameEN={
  307. "1":" created repository",
  308. "2":" renamed repository from {oldRepoName} to ",
  309. "5":" pushed to {branch} at",
  310. "6":" opened issue",
  311. "7":" created pull request",
  312. "9":" pushed tag {branch} to ",
  313. "10":" commented on issue",
  314. "11":" merged pull request",
  315. "12":" closed issue",
  316. "13":" reopened issue",
  317. "14":" closed pull request",
  318. "15":" reopened pull request",
  319. "17":" deleted branch {deleteBranchName} from {repoName}",
  320. "22":" proposed changes",
  321. "23":" commented on pull request",
  322. "24":" upload dataset ",
  323. "25":" created CPU/GPU type debugging task ",
  324. "26":" created NPU type debugging task ",
  325. "27":" created training task",
  326. "28":" created reasoning task",
  327. "29":" created profiling task",
  328. "30":" created new model"
  329. };
  330. var repoAndOrgZH={
  331. "1":"项目",
  332. "2":"成员",
  333. "3":"团队",
  334. "11":"项目",
  335. "21":"成员",
  336. "31":"团队",
  337. "4":"小时前",
  338. "5":"分钟前",
  339. "6":"秒前",
  340. "41":"小时前",
  341. "51":"分钟前",
  342. "61":"秒前"
  343. };
  344. var repoAndOrgEN={
  345. "1":"Repository",
  346. "2":"Member ",
  347. "3":"Team",
  348. "11":"Repositories",
  349. "21":"Members ",
  350. "31":"Teams",
  351. "4":" hour ago",
  352. "5":" minute ago",
  353. "6":" second ago",
  354. "41":" hours ago",
  355. "51":" minutes ago",
  356. "61":" seconds ago"
  357. };
  358. function getAction(opType,isZh){
  359. if(isZh){
  360. return actionNameZH[opType]
  361. }else{
  362. return actionNameEN[opType]
  363. }
  364. }
  365. queryRecommendData();
  366. function queryRecommendData(){
  367. $.ajax({
  368. type:"GET",
  369. url:"/recommend/org",
  370. headers: {
  371. authorization:token,
  372. },
  373. dataType:"json",
  374. async:false,
  375. success:function(json){
  376. displayOrg(json);
  377. },
  378. error:function(response) {
  379. }
  380. });
  381. $.ajax({
  382. type:"GET",
  383. url:"/recommend/repo",
  384. headers: {
  385. authorization:token,
  386. },
  387. dataType:"json",
  388. async:false,
  389. success:function(json){
  390. displayRepo(json);
  391. },
  392. error:function(response) {
  393. }
  394. });
  395. }
  396. function displayRepo(json){
  397. var orgRepo = document.getElementById("recommendrepo");
  398. var html = "";
  399. if (json != null && json.length > 0){
  400. for(var i = 0; i < json.length;i++){
  401. var record = json[i]
  402. html += "<div class=\"swiper-slide\">";
  403. html += " <div class=\"ui fluid card\">";
  404. html += " <div class=\"content\">";
  405. html += " <span class=\"right floated meta\">";
  406. html += " <i class=\"ri-star-line\"></i>" + record["NumStars"] + "<i class=\"ri-git-branch-line am-ml-10\"></i>" + record["NumForks"];
  407. html += " </span>";
  408. html += " <img class=\"left floated mini ui image\" src=\"" + record["Avatar"] + "\">";
  409. html += " <a class=\"header nowrap\" href=\"/" + record["OwnerName"] + "/" + record["Name"] + "\">" + record["Alias"] +"</a>";
  410. html += " <div class=\"description nowrap-2\">" + record["Description"] + " </div>";
  411. html += " <div class=\"ui tags nowrap am-mt-10\">"
  412. if(record["Topics"] != null){
  413. for(var j = 0; j < record["Topics"].length; j++){
  414. topic = record["Topics"][j];
  415. url = "/explore/repos?q=" + (topic) + "&amp;topic="
  416. html += "<a class=\"ui small label topic\" href=\"" + url + "\">" + topic + "</a>";
  417. }
  418. }
  419. html += " </div>";
  420. html += " </div>";
  421. html += " </div>";
  422. html += "</div>";
  423. }
  424. }
  425. orgRepo.innerHTML = html;
  426. swiperRepo.updateSlides();
  427. swiperRepo.updateProgress();
  428. }
  429. function getRepoOrOrg(key,isZhLang,numbers=1){
  430. if(numbers > 1){
  431. key+="1";
  432. }
  433. if(isZhLang){
  434. return repoAndOrgZH[key];
  435. }else{
  436. return repoAndOrgEN[key];
  437. }
  438. }
  439. function displayOrg(json){
  440. var orgDiv = document.getElementById("recommendorg");
  441. var html = "";
  442. if (json != null && json.length > 0){
  443. for(var i = 0; i < json.length;i++){
  444. var record = json[i]
  445. html += "<div class=\"swiper-slide\">";
  446. html += " <a href=\"/" + record["Name"] + "\" class=\"ui fluid card\">";
  447. html += " <div class=\"content\">";
  448. html += " <div class=\"ui small header\">";
  449. html += " <img class=\"ui image\" src=\"" + record["Avatar"] + "\">";
  450. html += " <div class=\"content nowrap\">";
  451. html += " <span class=\"ui blue\">" + record["Name"] + "</span> " + record["FullName"];
  452. html += " <div class=\"sub header\">" + record["NumRepos"] +" " + getRepoOrOrg(1,isZh,record["NumRepos"]) + " ・ " + record["NumMembers"] +" " + getRepoOrOrg(2,isZh,record["NumMembers"]) + " ・ " + record["NumTeams"] + " " + getRepoOrOrg(3,isZh,record["NumTeams"]) + "</div>";
  453. html += " </div>";
  454. html += " </div>";
  455. html += " </div>";
  456. html += " </a>";
  457. html += "</div>";
  458. }
  459. }
  460. orgDiv.innerHTML = html;
  461. swiperOrg.updateSlides();
  462. }