Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.52 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="robots" content="noindex, nofollow" />
  6. <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
  7.  
  8. <title>Проверка достижений студентов</title>
  9.  
  10. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
  11. integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
  12. crossorigin="anonymous">
  13. <link rel="stylesheet" href="http://scirate.1spbgmu.ru/static/style.css">
  14. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"
  15. integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  16. crossorigin="anonymous"></script>
  17. <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
  18. integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
  19. crossorigin="anonymous"></script>
  20. <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
  21. integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
  22. crossorigin="anonymous"></script>
  23. <style>
  24. .form-group.required .col-form-label:after {
  25. content:"*";
  26. color:red;
  27. }
  28. a.truncate {
  29. display: inline-block;
  30. margin-left: 0;
  31. max-width: 250px;
  32. white-space: nowrap;
  33. overflow: hidden;
  34. text-overflow: ellipsis;
  35. }
  36. .card-link+.card-link {
  37. margin-left: 0;
  38. }
  39. </style>
  40. </head>
  41. <body>
  42. <nav class="navbar navbar-expand-lg navbar-dark ">
  43. <a class="navbar-brand" href="#">ПК УНД</a>
  44. <button class="navbar-toggler navbar-toggler-right"
  45. type="button"
  46. data-toggle="collapse"
  47. data-target="#navbarNav"
  48. aria-controls="navbarNav"
  49. aria-expanded="false"
  50. aria-label="Toggle navigation">
  51. <span class="navbar-toggler-icon"></span>
  52. </button>
  53. <div class="collapse navbar-collapse" id="navbarNav">
  54. <ul class="navbar-nav mr-auto">
  55. <li class="nav-item ">
  56. <a class="nav-link" href="/SciRateSMUWeb/profile">Профиль</a>
  57. </li>
  58. <li class="nav-item">
  59. <a class="nav-link" href="/SciRateSMUWeb/science">Научные достижения</a>
  60. </li>
  61. <li class="nav-item">
  62. <a class="nav-link" href="/SciRateSMUWeb/elibrary-to-sciproduct">Elibrary.ru</a>
  63. </li>
  64. <li class="nav-item ">
  65. <a class="nav-link" href="/SciRateSMUWeb/grants">Гранты</a>
  66. </li>
  67. <li class="nav-item">
  68. <a class="nav-link" href="/SciRateSMUWeb/ratings">Рейтинг студентов</a>
  69. </li>
  70. </ul>
  71. <ul class="navbar-nav">
  72. <li class="nav-item ">
  73. <a class="nav-link" href="/SciRateSMUWeb/logout">Выход</a>
  74. </li>
  75. </ul>
  76. </div>
  77. </nav>
  78.  
  79. <div class="container">
  80. <h2 class="mt-3">Проверка достижений студентов</h2>
  81. <section class="filters mt-4">
  82. <form>
  83. <div class="form-group row required">
  84. <label for="category" class="col-sm-2 col-form-label">Категория</label>
  85. <div class="col">
  86. <select id="category" class="form-control">
  87. <option selected disabled>Выберите категорию...</option>
  88. <option value="science">Наука</option>
  89. <option value="social">Общественная деятельность</option>
  90. <option value="sport_competition">Спорт: соревнования</option>
  91. <option value="sport_gto">Спорт: значок ГТО</option>
  92. <option value="sport_category">Спорт: спортивный разряд</option>
  93. <option value="edu_stipend">Учеба: стипендия</option>
  94. <option value="edu_olympiad">Учеба: олимпиада</option>
  95. <option value="creativity_participation">Культура и творчество: участие в мероприятиях</option>
  96. <option value="creativity_organization">Культура и творчество: проведение мероприятий</option>
  97. <option value="creativity_presentation">Культура и творчество: публичное выступление</option>
  98. </select>
  99. </div>
  100. <div>
  101. <button type="button" id="updateButton" class="btn btn-primary" style="width: 110px;margin-right: 15px;">Загрузить</button>
  102. </div>
  103. </div>
  104. <hr>
  105. <div class="form-group row">
  106. <label for="category" class="col-sm-2 col-form-label">ФИО</label>
  107. <div class="col-sm-10">
  108. <input type="text" id="fullname" class="form-control" placeholder="Иванов" />
  109. <small id="fullnameHelp" class="form-text text-muted">Фильтровать продукты по конкретному пользователю (необязательное поле)</small>
  110. </div>
  111. </div>
  112. <div class="form-group row">
  113. <label for="category" class="col-sm-2 col-form-label">Показать</label>
  114. <div class="col-sm-10 d-flex">
  115. <div class="form-check form-check-inline">
  116. <input class="form-check-input" type="radio" name="checkedFilter" id="inlineRadio1" value="all">
  117. <label class="form-check-label" for="inlineRadio1">Все</label>
  118. </div>
  119. <div class="form-check form-check-inline">
  120. <input class="form-check-input" type="radio" name="checkedFilter" id="inlineRadio2" value="checked">
  121. <label class="form-check-label" for="inlineRadio2">Отмеченные</label>
  122. </div>
  123. <div class="form-check form-check-inline">
  124. <input class="form-check-input" checked type="radio" name="checkedFilter" id="inlineRadio3" value="unchecked">
  125. <label class="form-check-label" for="inlineRadio3">Не отмеченные</label>
  126. </div>
  127. </div>
  128. </div>
  129. <div class="form-group row">
  130. <div class="col-sm-12 text-right">
  131. <button type="button" id="renderButton" class="btn btn-primary">Применить фильтры</button>
  132. </div>
  133. </div>
  134. </form>
  135. </section>
  136. <hr/>
  137. <section class="content">
  138. </section>
  139. </div>
  140. <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  141. <input type="hidden" value="" class="currid">
  142. <div class="modal-dialog modal-dialog-centered" role="document">
  143. <div class="modal-content">
  144. <div class="modal-header">
  145. <h5 class="modal-title" id="exampleModalCenterTitle">Cообщение</h5>
  146. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  147. <span aria-hidden="true">&times;</span>
  148. </button>
  149. </div>
  150. <div class="modal-body">
  151. <textarea class="form-control" id="message" cols="30" rows="10"></textarea>
  152. <hr>
  153. <p>Дней на исправление:</p>
  154. <div class="form-check form-check-inline">
  155. <input class="form-check-input" type="radio" name="hoursTill" id="radio1" value="24">
  156. <label class="form-check-label" for="radio1">1 день</label>
  157. </div>
  158. <div class="form-check form-check-inline">
  159. <input class="form-check-input" type="radio" name="hoursTill" id="radio2" value="120">
  160. <label class="form-check-label" for="radio2">5 дней</label>
  161. </div>
  162. <div class="form-check form-check-inline">
  163. <input class="form-check-input" type="radio" name="hoursTill" id="radio3" value="168">
  164. <label class="form-check-label" for="radio3">7 дней</label>
  165. </div>
  166. <div class="form-check form-check-inline">
  167. <input class="form-check-input" type="radio" name="hoursTill" id="radio0" value="0">
  168. <label class="form-check-label" for="radio0">нет</label>
  169. </div>
  170. <hr>
  171. <p>Разрешить добавление?</p>
  172. <div class="form-check form-check-inline">
  173. <input class="form-check-input" type="radio" name="canManage" id="radio5" value="true">
  174. <label class="form-check-label" for="radio5">Да</label>
  175. </div>
  176. <div class="form-check form-check-inline">
  177. <input class="form-check-input" type="radio" name="canManage" id="radio6" value="false">
  178. <label class="form-check-label" for="radio6">Нет</label>
  179. </div>
  180. </div>
  181. <div class="modal-footer">
  182. <button type="button" class="btn btn-secondary" data-dismiss="modal">Закрыть</button>
  183. <button type="button" class="btn btn-primary">Отправить</button>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188.  
  189.  
  190. <script>
  191. var storage = {};
  192.  
  193.  
  194. function getBaseUrl() {
  195. if (window.location.href.indexOf('localhost') === -1) {
  196. return 'http://scirate.1spbgmu.ru';
  197. } else {
  198. return 'http://localhost:8080';
  199. }
  200. }
  201.  
  202. function wait(cond) {
  203. document.querySelector('html').style.cursor = cond ? 'progress' : 'auto';
  204. }
  205.  
  206. function personnel(personnel) {
  207. console.log(personnel);
  208. return personnel.lastName + ' '
  209. + personnel.firstName
  210. + (personnel.middleName ? ' ' + personnel.middleName : '') + ', '
  211. + personnel.groupNum + ' группа.'
  212. }
  213.  
  214. function links(attachments) {
  215. var links = '';
  216. for (var i = 0; i < attachments.length; i++) {
  217. links += '<a href="' + attachments[i][1] + '" target="_blank" class="card-link truncate mr-2" title="' + attachments[i][0] + '">' + attachments[i][0] + '</a>'
  218. }
  219. return links
  220. }
  221.  
  222. function doAction(data) {
  223. return $.ajax({
  224. url: getBaseUrl() + '/SciRateSMUWeb/approve-data',
  225. method: 'POST',
  226. data: data,
  227. xhrFields: {
  228. withCredentials: true
  229. }
  230. });
  231. }
  232.  
  233. function sendMessage(event_id, message) {
  234. return doAction({
  235. type: 'message',
  236. id: event_id,
  237. message: message
  238. });
  239. }
  240.  
  241. function makeVerdict(event_id, verdict) {
  242. return doAction({
  243. type: 'verdict',
  244. id: event_id,
  245. verdict: verdict,
  246. action: 'create'
  247. })
  248. }
  249.  
  250. function giveHours(event_id, hours, canManage, owner_id) {
  251. return doAction({
  252. type: 'date',
  253. id: event_id,
  254. hours: hours,
  255. canManage: canManage,
  256. productOwner: owner_id
  257. })
  258. }
  259.  
  260. function updateUIVerdict(event_id, verdict) {
  261. $('#card_'+event_id+" .status")
  262. .removeClass('text-success')
  263. .removeClass('text-danger')
  264. .addClass(verdict ? 'text-success' : 'text-danger')
  265. .text(verdict ? "Утверждено" : "Отклонено");
  266. }
  267.  
  268. function make_link(data) {
  269. var id = data.id;
  270. var type = data.subcategory;
  271.  
  272. if (data.category == 'Общественная деятельность') {
  273. return '/SciRateSMUWeb/social-activity-item?said=' + id
  274. }
  275. if (data.category == 'Наука') {
  276. return '/SciRateSMUWeb/sciproduct?spid=' + id
  277. }
  278. if (type == 'Соревнования') {
  279. return '/SciRateSMUWeb/sport-item?type=competition&action=view&id=' + id
  280. }
  281. if (type == 'Значок ГТО') {
  282. return '/SciRateSMUWeb/sport-item?type=gto&action=view&id=' + id
  283. }
  284. if (type == 'Спортивный разряд') {
  285. return '/SciRateSMUWeb/sport-item?type=sportCategory&action=view&id=' + id
  286. }
  287. if (type == 'Олимпиада') {
  288. return '/SciRateSMUWeb/educational-activity-item?type=olympiad&action=view&id=' + id
  289. }
  290. if (type == 'Стипендия') {
  291. return '/SciRateSMUWeb/educational-activity-item?type=stipend&action=view&id=' + id
  292. }
  293. if (type == 'Участие в мероприятиях') {
  294. return '/SciRateSMUWeb/creative-activity-item?type=participation&action=view&id=' + id
  295. }
  296. if (type == 'Проведение мероприятий') {
  297. return '/SciRateSMUWeb/creative-activity-item?type=organizationParticipation&action=view&id=' + id
  298. }
  299. if (type == 'Публичное выступление') {
  300. return '/SciRateSMUWeb/creative-activity-item?type=presentation&action=view&id=' + id
  301. }
  302. return '#'
  303. }
  304.  
  305. function product_to_card(data) {
  306. return (
  307. '<div class="card my-3" id="card_' + data.event_id + '">' +
  308. '<div class="card-header">' +
  309. personnel(data.personnel) +
  310. '</div>' +
  311. '<div class="card-body">' +
  312. '<h6 class="card-subtitle mb-2 text-muted">' +
  313. data.subcategory +
  314. '</h6>' +
  315. '<h5 class="card-title"><a href="' + make_link(data) + '" target="_blank">' + data.title + '</a></h5>' +
  316. (data.journal_name ? ('<p class="card-text">Журнал: ' + data.journal_name + '</p>') : '') +
  317. (data.conference_type ? ('<p class="card-text">' + data.conference_type + ' конференция</p>') : '') +
  318. (data.winner_place ? ('<p class="card-text">' + data.winner_place + ' место</p>') : '') +
  319.  
  320. (data.description ? ('<p class="card-text">' + data.description + '</p>') : '') +
  321. (data.level_name ? ('<p class="card-text">Уровень: ' + data.level_name + '</p>') : '') +
  322. (data.type_name ? ('<p class="card-text">Результат: ' + data.type_name + '</p>') : '') +
  323. links(data.attachments) +
  324. '</div>'+
  325. '<div class="card-footer text-right">' +
  326. '<span class="mr-3 status' + (data.has_been_approved ? (data.is_approved ? " text-success" : " text-danger") : "") + '">' + (data.has_been_approved ? (data.is_approved ? "Утверждено" : "Отклонено") : "Еще не отмечено") + '</span>' +
  327. '<button type="button" class="btn btn-success mr-3" onclick="mark(' + data.event_id + ', true, '+data.personnel.id+');">Утвердить</button>' +
  328. '<button type="button" class="btn btn-danger" onclick="mark(' + data.event_id + ', false, '+data.personnel.id+');">Отклонить</button>' +
  329. '</div>' +
  330. '</div>')
  331. }
  332.  
  333.  
  334. function mark(event_id, verdict, owner_id) {
  335. makeVerdict(event_id, verdict)
  336. .done(function() {
  337. updateUIVerdict(event_id, verdict);
  338. if (!verdict) {
  339. $('.modal .currid').val(event_id);
  340. $('.modal textarea').val('');
  341. $('.modal').modal('show');
  342. $('.modal .btn-primary').off('click');
  343.  
  344. $('.modal .btn-primary').on('click', function() {
  345. var hours = $('[name="hoursTill"]:checked').val();
  346. var canManage = $('[name="canManage"]:checked').val();
  347.  
  348. if (hours && hours !== "0") {
  349. giveHours(event_id, hours, canManage, owner_id);
  350. }
  351. sendMessage(event_id, $('.modal textarea').val())
  352. .always(function() {
  353. $('.modal textarea').val('');
  354. $('.modal').modal('hide');
  355. $('.modal .btn-primary').off('click');
  356. $('.modal .currid').val('');
  357. })
  358. })
  359. }
  360. })
  361. }
  362.  
  363. function check(fullname, personnel) {
  364. return (personnel.firstName != null && ~fullname.toLowerCase().indexOf(personnel.firstName.toLowerCase()))
  365. || (personnel.lastName != null && ~fullname.toLowerCase().indexOf(personnel.lastName.toLowerCase()))
  366. || (personnel.middleName != null && ~fullname.toLowerCase().indexOf(personnel.middleName.toLowerCase()))
  367. }
  368.  
  369. function render(data) {
  370. wait(true);
  371. var fullname = document.querySelector('#fullname').value;
  372. var checkedFilter = document.querySelector('input[name="checkedFilter"]:checked').value;
  373.  
  374. var html = [];
  375.  
  376. for (var i = 0; i < 500; i++) {
  377. if (
  378. (checkedFilter === 'all'
  379. || (checkedFilter === 'unchecked' && !data[i].has_been_approved)
  380. || (checkedFilter === 'checked' && data[i].has_been_approved))
  381. && (fullname.trim() == '' || check(fullname, data[i].personnel))) {
  382. // html += product_to_card(data[i]);
  383. }
  384. }
  385.  
  386. var content = document.querySelector('section.content');
  387. var contentParent = document.querySelector('section.content').parentNode;
  388. contentParent.removeChild(content);
  389.  
  390. var newContent = createDomElement('section', 'content')
  391. newContent.appendChild(c);
  392. contentParent.appendChild(newContent);
  393. wait(false);
  394. }
  395.  
  396. function createDomElement(tag, classes, id) {
  397. var e = document.createElement(tag);
  398. if (classes) { e.className = classes };
  399. if (id) { e.id = id };
  400. return e
  401. }
  402.  
  403. function createLink(classes, href, text) {
  404. var link = createDomElement('a', classes);
  405. link.href = href;
  406. link.innerText = text;
  407. link.title = text;
  408. link.target = "_blank";
  409. return link;
  410. }
  411.  
  412. function createCardText(text) {
  413. var p = createDomElement('p', 'card-text');
  414. p.innerText = text;
  415. return p;
  416. }
  417.  
  418. function createAttchementsLinks(attachments) {
  419. var links = [];
  420. for (var i = 0; i < attachments.length; i++) {
  421. links.push(createLink("card-link truncate mr-2", attachments[i][1], attachments[i][0]))
  422. }
  423. return links
  424. }
  425.  
  426. function createCard(card) {
  427. var cardy = createDomElement('div', 'card my-3', 'card_' + card.event_id);
  428. var cardHeader = createDomElement('div', 'card-header');
  429. cardHeader.innerText = personnel(card.personnel);
  430.  
  431. var cardBody = createDomElement('div', 'card-body');
  432.  
  433. var subtitle = createDomElement('h6', "card-subtitle mb-2 text-muted");
  434. subtitle.innerTex = card.subcategory;
  435.  
  436. var title = createDomElement('h5', "card-title");
  437. title.appendChild(createLink(null, make_link(card), card.title));
  438.  
  439. var paragraphs = [];
  440. paragraphs.push(card.journal_name ? createCardText('Журнал: ' + card.journal_name) : null);
  441. paragraphs.push(card.conference_type ? createCardText(card.conference_type + ' конференция') : null);
  442. paragraphs.push(card.winner_place ? createCardText(card.winner_place + ' место') : null);
  443. paragraphs.push(card.description ? createCardText(card.description) : null);
  444. paragraphs.push(card.level_name ? createCardText('Уровень: ' + card.level_name) : null);
  445. paragraphs.push(card.type_name ? createCardText('Результат: ' + card.type_name) : null);
  446.  
  447. var links = createAttchementsLinks(card.attachments);
  448.  
  449.  
  450. var cardFooter = createDomElement('div', 'card-footer text-right');
  451. var status = createDomElement(
  452. 'span',
  453. 'mr-3 status ' + (card.has_been_approved ? (card.is_approved ? "text-success" : "text-danger") : '')
  454. );
  455. status.innerText = card.has_been_approved ? (card.is_approved ? "Утверждено" : "Отклонено") : "Еще не отмечено";
  456.  
  457. var buttonGreen = createDomElement('button', 'btn btn-success mr-3');
  458. buttonGreen.innerText = 'Утвердить';
  459. buttonGreen.onclick = function() {
  460. mark(card.event_id, true, card.personnel.id);
  461. }
  462. var buttonRed = createDomElement('button', 'btn btn-danger');
  463. buttonRed.innerText = 'Отклонить';
  464. buttonRed.onclick = function() {
  465. mark(card.event_id, false, card.personnel.id);
  466. }
  467. ////////////
  468.  
  469. var bodyContent = [subtitle, title].concat(paragraphs, links);
  470. for (var i = 0; i < bodyContent.length; i++) {
  471. if (bodyContent[i]) {
  472. cardBody.appendChild(bodyContent[i]);
  473. }
  474. }
  475.  
  476. cardFooter.appendChild(status);
  477. cardFooter.appendChild(buttonGreen);
  478. cardFooter.appendChild(buttonRed);
  479.  
  480. ///////////
  481.  
  482. cardy.appendChild(cardHeader);
  483. cardy.appendChild(cardBody);
  484. cardy.appendChild(cardFooter);
  485.  
  486. return cardy;
  487. }
  488.  
  489. function update() {
  490. var category = $('#category').val();
  491. document.querySelector('#updateButton').innerText = 'Загрузка...';
  492. wait(true);
  493. $.get(getBaseUrl().replace('8080', '8888') + '/scirate/cards/list/'+category).done(function(data) {
  494. if (getBaseUrl().indexOf('localhost') !== -1) {
  495. data = JSON.parse(data);
  496. }
  497. storage = data;
  498. render(storage);
  499. document.querySelector('#updateButton').innerText = 'Загрузить';
  500. wait(false);
  501. }).fail(function() {
  502. document.querySelector('#updateButton').innerText = 'Загрузить';
  503. wait(false);
  504. })
  505. }
  506.  
  507. $('#updateButton').click(update);
  508. $('#renderButton').click(function() {
  509. render(storage);
  510. });
  511. </script>
  512. <!-- 22.01.2020 22:54 -->
  513. </body>
  514. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement