Advertisement
Guest User

Untitled

a guest
Aug 10th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.57 KB | None | 0 0
  1. var Helper = function(){
  2. this.replacePlaceholders = function(template, report) {
  3. template = Handlebars.compile(template);
  4. if (typeof report['linux_file_path'] !== "undefined") {
  5. var i = 'linux_file_path';
  6. //we have to php serialize, then base64 encode it
  7. report[i] = 's:' + this.utf8Size(report[i]) + ':"' + report[i] + '"';
  8. report[i] = btoa(report[i]);
  9. }
  10. report['director'] = routes.urls.director;
  11. return template(report);
  12. }
  13.  
  14. this.utf8Size = function(str) {
  15. var size = 0
  16. var i = 0
  17. var l = str.length
  18. var code = ''
  19. for (i = 0; i < l; i++) {
  20. code = str.charCodeAt(i)
  21. if (code < 0x0080) {
  22. size += 1
  23. } else if (code < 0x0800) {
  24. size += 2
  25. } else {
  26. size += 3
  27. }
  28. }
  29. return size
  30. }
  31. }
  32.  
  33. var Updater = function(type,category_log_id) {
  34. this.accession_ids = [];
  35. this.addAccession = function (accession) {
  36. this.accession_ids.push(accession);
  37. }
  38. this.setAccessions = function (accessions) {
  39. this.accession_ids = accessions;
  40. }
  41. this.update = function (value) {
  42. if (this.accession_ids.length === 0) {
  43. var dfd = $.Deferred();
  44. dfd.resolve();
  45. return dfd.promise();
  46. }
  47. return $.ajax({
  48. url: '/reclassification/update_accession_status',
  49. data: {accession_ids: this.accession_ids, log_id: category_log_id, step: type, value: value},
  50. method: 'POST',
  51. dataType: 'json'
  52. });
  53. }
  54. this.clear = function () {
  55. accession_ids = [];
  56. }
  57. }
  58.  
  59. var PreviewContainer = function(){
  60. $("#report_modal_container .modal-body").html("").append($(".report-preview-loader").html());
  61. $("#report_modal_container").modal();
  62. this.helper = new Helper();
  63. this.applyData = function(data){
  64. var template = $(".report-preview-template").html();
  65. template = this.helper.replacePlaceholders(template, data);
  66. $("#report_modal_container .modal-body").html("").append(template);
  67. }
  68. };
  69.  
  70. var ReportGenerator = function (accession_id, variant_id) {
  71. this.helper = new Helper();
  72. var that = this;
  73. this.generateReport = function (button_selector) {
  74. var $btn = $(button_selector);
  75. var preview = new PreviewContainer();
  76. this.createReport().done(function(data) {
  77. preview.applyData(data);
  78. $('#pdf_form').submit();
  79.  
  80. that.postReportUpdateEvent($btn);
  81. });
  82. }
  83.  
  84. this.postReportUpdateEvent = function($btn){
  85. var updater = new Updater('generated',$btn.closest("td").data("log_id"));
  86. updater.addAccession(accession_id);
  87. updater.update(true);
  88. var updater = new Updater('report_id',$btn.closest("td").data("log_id"));
  89. updater.addAccession(accession_id);
  90. updater.update(data.report_id);
  91. $btn.closest("td").find(".refresh-row-btn").click();
  92.  
  93. //commented to allow regenerate all the time
  94. //$btn.addClass('disabled')
  95. var $nextBtns = $btn.nextAll('.sign-report-btn, .preview-report-btn');
  96. $nextBtns.removeClass('disabled').data('report_id',data.report_id);
  97. }
  98.  
  99. this.previewReport = function (report_id){
  100. var preview = new PreviewContainer();
  101. this.getPreviewReclassificationReportData(report_id).done(function(data){
  102. preview.applyData(data);
  103. $('#pdf_form').submit();
  104. });
  105. }
  106. this.createReport = function(report_id,report_approval, new_signature) {
  107. var params = {
  108. accession_id: accession_id,
  109. variant_id: variant_id,
  110. report_id: report_id,
  111. report_approval: report_approval,
  112. new_signature: new_signature
  113. };
  114.  
  115. return $.ajax({
  116. url: '/reportgenerator2/createReclassificationReport?' + $.param(params)
  117. });
  118. }
  119.  
  120. this.getPreviewReclassificationReportData = function(report_id){
  121. return $.ajax({
  122. url: '/reportgenerator2/getReclassificationReportData?report_id=' + report_id
  123. });
  124. }
  125.  
  126. this.signReport = function(button_selector) {
  127. $("#report_sign_modal_container").find('.modal-body').html('').append($('.report-signing-original-body').html());
  128. $("#report_sign_modal_container").modal();
  129. var report_id = $(button_selector).data('report_id');
  130. var accession_id = $(button_selector).data('accession_id');
  131.  
  132. var that = this;
  133. var template = $(".report-signing-loader").html();
  134.  
  135. $('.sign-report-form').on('submit',function(e){
  136. e.preventDefault();
  137. var form = this;
  138. $(form).find('.password-group').removeClass('has-error has-feedback');
  139.  
  140. var new_signature = $(this).find('.user-signature').val();
  141. //validate user and password
  142. that.validateUser(this).success(function(data){
  143. if(data.status == 'error'){
  144. //validation failed
  145. $(form).find('.password-group').addClass('has-error has-feedback');
  146. return;
  147. }
  148.  
  149. //show loader
  150. var tempTemplate = that.helper.replacePlaceholders(template, {'status' : "Signing Report..."});
  151. $("#report_sign_modal_container").find('.modal-body').html('').append(tempTemplate);
  152.  
  153. //call signing action
  154. that.signReportAction(report_id).done(function(data){
  155. if(data.status == 'success'){
  156. var tempTemplate = that.helper.replacePlaceholders(template, {'status' : "Updating Status..."});
  157. $("#report_sign_modal_container").find('.modal-body').html('').append(tempTemplate);
  158.  
  159. that.createReport(report_id, 1,new_signature).done(function (data) {
  160. if (data.report_id != '') {
  161. var updater = new Updater('signed', $(button_selector).closest("td").data("log_id"));
  162. updater.addAccession(accession_id);
  163. updater.update(true);
  164. }
  165.  
  166. var tempTemplate = that.helper.replacePlaceholders(template, {'status': "Generating Preview..."});
  167. $("#report_sign_modal_container").find('.modal-body').html('').append(tempTemplate);
  168.  
  169. $("#report_sign_modal_container").modal('toggle');
  170. that.previewReport(data.report_id);
  171.  
  172. $(button_selector).closest("td").find(".refresh-row-btn").click();
  173. });
  174. }
  175. });
  176. });
  177.  
  178. });
  179. }
  180.  
  181. this.signReportAction = function(report_id){
  182. return $.ajax({
  183. url: '/reports/pdfinfoview/approvereclassification',
  184. type: 'post',
  185. data: {
  186. report_id: report_id
  187. },
  188. error: function() {
  189. $("#report_sign_modal_container").modal('toggle');
  190. }
  191. });
  192. }
  193.  
  194. this.validateUser = function(form){
  195. var email = $(form).find('input[class=user_email]').val();
  196. var password = $(form).find('.user-password').val();
  197. return $.ajax({
  198. url: '/reports/pdfinfoview/validate',
  199. type: 'post',
  200. data: {
  201. email_address: email,
  202. password: password
  203. },
  204. error: function() {
  205. $('.blackout').hide();
  206. }
  207. });
  208. }
  209. };
  210.  
  211. var noteHandler = function () {
  212. function init() {
  213. $('.save-note-btn').on('click', handleSaveNoteClick);
  214. $('.remove-note-btn').on('click', handleRemoveNoteClick);
  215. $('.add-note-modal').on('show.bs.modal', clearPreviousNote);
  216. }
  217.  
  218. function clearPreviousNote() {
  219. $(this).find('textarea').val('');
  220. }
  221.  
  222. function reinit() {
  223. $('.save-note-btn').off('click');
  224. $('.remove-note-btn').off('click');
  225. init();
  226. }
  227.  
  228. function handleSaveNoteClick(e) {
  229. e.preventDefault();
  230. var $modal = $(this).closest('.modal');
  231. var note = $modal.find('textarea').val();
  232. var category_log_id = $(this).data('category-log-id');
  233. showSubmitting.call($modal, 'fa-save');
  234. saveNote(category_log_id, note)
  235. .done(updateNoteList.bind($modal))
  236. .done(closeModal.bind($modal))
  237. .always(hideSubmitting.bind($modal, 'fa-save'));
  238. }
  239.  
  240. function handleRemoveNoteClick(e) {
  241. e.preventDefault();
  242. var $row = $(this).closest('.list-group-item');
  243. var $kebab = $(this).closest('.dropdown');
  244. var id = $(this).data('id');
  245. showSubmitting.call($kebab, 'fa-ellipsis-v');
  246. removeNote(id)
  247. .done(removeRow.bind($row))
  248. .always(hideSubmitting.bind($kebab, 'fa-ellipsis-v'));
  249. }
  250.  
  251. function removeRow() {
  252. var $container = $(this).closest('.list-group');
  253. var $accordion = $container.closest(".panel").find(".panel-heading");
  254. $(this).remove();
  255. if ($container.children().length === 0) {
  256. $container.addClass("hidden");
  257. $container.parent().append($container.data('empty-template').template);
  258. $accordion.find(".notes-count-label").removeClass("label-primary").addClass("label-default");
  259. }
  260. $accordion.find(".notes-count-label").html($container.find(".list-group-item").length);
  261. }
  262.  
  263. function removeNote(id) {
  264. return $.ajax({
  265. url: '/reclassification/remove_note',
  266. method: 'POST',
  267. data: {id: id},
  268. dataType: 'json'
  269. });
  270. }
  271.  
  272.  
  273. function updateNoteList(note) {
  274. var $panel = $(this).prev(".panel-body");
  275. var $accordion = $panel.closest(".panel").find(".panel-heading");
  276. var $container = $panel.find(".list-group");
  277. $container.find(".blank-slate-pf").remove();
  278. var template = Handlebars.compile($container.data('note-template').template);
  279.  
  280. var d = new Date();
  281. var month = d.toLocaleString("en-us", {month: "long"});
  282. var day = d.getDate();
  283. var year = d.getFullYear();
  284. var replacements = $.extend(note, {
  285. id: note.insert_id,
  286. day: day,
  287. month: month,
  288. year: year
  289. });
  290. var html = template(replacements);
  291. var $template = $($.parseHTML(html));
  292. $container.append($template);
  293. $container.add($container.parent()).removeClass("hidden");
  294. $container.add($container.parent()).siblings(".blank-slate-pf").remove();
  295. $accordion.find(".notes-count-label").addClass("label-primary").removeClass("label-default").html($container.find(".list-group-item").length);
  296. reinit();
  297. }
  298.  
  299. function saveNote(category_log_id, note) {
  300. return $.ajax({
  301. url: '/reclassification/save_note',
  302. method: 'POST',
  303. data: {log_id: category_log_id, note: note},
  304. dataType: 'json'
  305. });
  306. }
  307.  
  308. function showSubmitting(icon) {
  309. $(this).find('.' + icon).toggleClass(icon + " fa-circle-o-notch fa-spin");
  310. }
  311.  
  312. function hideSubmitting(icon) {
  313. $(this).find(".fa-circle-o-notch.fa-spin").toggleClass(icon + " fa-circle-o-notch fa-spin");
  314. }
  315.  
  316. function closeModal() {
  317. $(this).modal('hide');
  318. }
  319.  
  320. return {
  321. init: init
  322. }
  323. };
  324.  
  325. var statusLoaderModal = function(){
  326. var $container = $('#status_container');
  327. var template = $(".status-template").html();
  328.  
  329. var displayModal = function(){
  330. $container.modal();
  331. }
  332. }
  333.  
  334. var showPanel = function () {
  335. const loadingIcon = 'fa-circle-o-notch fa-spin';
  336. const defaultIcon = 'fa-angle-right fa-angle-down';
  337.  
  338. this.init = function() {
  339. $('.list-view-pf-expand').on('click', showReports);
  340. }
  341. this.loadReports = function(variant_id, category_id, category_log_id){
  342. return loadReports(variant_id, category_id, category_log_id)
  343. }
  344.  
  345. var loadReports = function(variant_id, category_id, category_log_id) {
  346. return $.ajax({
  347. url: '/reclassification/fetch_reports',
  348. dataType: 'json',
  349. data: {variant_id: variant_id, category_id: category_id, category_log_id: category_log_id}
  350. });
  351. }
  352.  
  353. function displayLoading() {
  354. $(this).find('.fa').removeClass(defaultIcon).addClass(loadingIcon);
  355. }
  356.  
  357. function hideLoading() {
  358. $(this).find('.fa').removeClass(loadingIcon).addClass(defaultIcon);
  359. }
  360.  
  361. var showReports = function(){
  362. $(this).data('open', !($(this).data('open')));
  363. if ($(this).data('open')) {
  364. var variant_id = $(this).data('variant-id');
  365. var category_id = $(this).data('category-id');
  366. var category_log_id = $(this).data('category-log-id');
  367. var reclassified_date = new Date($(this).data('reclassified-date'));
  368. var $panel = $(this).closest(".list-group-item").next(".list-group-item-container");
  369. var $table = $panel.find('table').first();
  370. //if no accessions loaded
  371. if ($table.find('tbody tr').length === 0) {
  372. displayLoading.call(this);
  373. loadReports(variant_id, category_id, category_log_id)
  374. .done(getReports($panel, reclassified_date, category_log_id, variant_id,category_id).displayReports)
  375. .always(hideLoading.bind(this));
  376. }
  377. }
  378. }
  379. };
  380.  
  381. var getReports = function ($panel, reclassified_date, category_log_id, variant_id,category_id) {
  382. var rowTemplate = $panel.find(".row-template").remove().html();
  383. var $totalCard = getCard(".total-card");
  384. var $opsReviewedCard = getCard(".ops-reviewed-card");
  385. var $generatedCard = getCard(".generated-card");
  386. var $signedCard = getCard(".signed-card");
  387. var $removedCard = getCard(".removed-card");
  388. var opsReviewUpdater = new Updater('ops_reviewed',category_log_id);
  389. var removedUpdater = new Updater('removed',category_log_id);
  390.  
  391. $panel.find('table').on('click', '.remove-report-btn', removeReport);
  392. $panel.find('table').on('click', '.remove-selected-reports-btn', removeSelectedReports);
  393. $panel.find('table').on('click','.generate_all_selected', generateAllReports);
  394.  
  395. function removeReport(e) {
  396. e.preventDefault();
  397. var $row = $(this).closest('tr');
  398. var accession_id = $row.data('accession-id');
  399. removedUpdater.addAccession(accession_id);
  400. var is_removed = $(this).data('removed');
  401. removedUpdater.update(!is_removed).done(function () {
  402. removedUpdater.clear();
  403. if (is_removed) {
  404. setIsNotRemoved($row);
  405. } else {
  406. setIsRemoved($row);
  407. }
  408. });
  409. }
  410.  
  411. function generateAllReports(e){
  412. e.preventDefault();
  413. var $rows = $panel.find('.select-report:checked');
  414. var accession_ids = $rows.map(function () {
  415. return $(this).closest('tr').data('accession-id');
  416. }).get();
  417.  
  418. //display modal container
  419. var loader = new statusLoaderModal();
  420.  
  421. console.log("starting generation...")
  422. var failedIds = [];
  423. generateChunkedReports(accession_ids,$rows).done(function(data){
  424. //done event...
  425. console.log("Finally DONE!");
  426. }.bind(this)).progress(handleReportGenerationResponse.bind(this));
  427.  
  428. function handleReportGenerationResponse(data){
  429. var variant_id = $(rows).eq(data.current).closest('tr').find('td[class=actions]').data('variant_id');
  430. var reportGenerator = new ReportGenerator(accession_ids[data.current], variant_id);
  431.  
  432. var $btn = $(rows).eq(data.current).closest('tr').find('.generate-report-btn');
  433. reportGenerator.postReportUpdateEvent($btn);
  434. }
  435. }
  436.  
  437. //updateProgress.bind($panel)
  438.  
  439. function generateChunkedReports(accession_ids,rows){
  440. var dfd = $.Deferred();
  441. if (accession_ids.length) {
  442. loadReports(accession_ids,rows,0, {}, dfd);
  443. } else {
  444. dfd.resolve({});
  445. }
  446. return dfd.promise();
  447. }
  448.  
  449. function loadReports(accession_ids,rows, start_idx, carry, deferred){
  450. var statusObj = {
  451. percent: Math.min((((start_idx) / accession_ids.length) * 100), 100),
  452. total: accession_ids.length,
  453. current: start_idx,
  454. failed: ('failed' in carry) ? carry.failed : [],
  455. responses:('responses' in carry) ? carry.responses : [],
  456. };
  457.  
  458. if (start_idx >= accession_ids.length) {
  459. deferred.resolve(statusObj);
  460. return;
  461. }
  462. deferred.notify(statusObj);
  463.  
  464. var variant_id = $(rows).eq(start_idx).closest('tr').find('td[class=actions]').data('variant_id');
  465. var reportGenerator = new ReportGenerator(accession_ids[start_idx], variant_id);
  466.  
  467. reportGenerator.createReport().done(function(response){
  468. statusObj.responses.push(response);
  469. loadReports(accession_ids,rows, start_idx + 1, statusObj, deferred);
  470. }).fail(function(response){
  471. statusObj.failed.push(start_idx);
  472. statusObj.responses.push('Failed Response!');
  473. loadReports(accession_ids,rows, start_idx + 1, statusObj, deferred);
  474. })
  475. }
  476.  
  477. function removeSelectedReports(e) {
  478. e.preventDefault();
  479. var $rows = $panel.find('.select-report:checked');
  480. var accession_ids = $rows.map(function () {
  481. return $(this).closest('tr').data('accession-id');
  482. }).get();
  483. removedUpdater.setAccessions(accession_ids);
  484. removedUpdater.update(true).done(function () {
  485. removedUpdater.clear();
  486. $rows.each(function () {
  487. setIsRemoved($(this).closest('tr'));
  488. });
  489. });
  490. }
  491.  
  492.  
  493. function displayReports(reports) {
  494. var $progress = $panel.find('.portal-information-progress');
  495.  
  496. loadPortalInformation(reports).done(function (data) {
  497. $progress.remove();
  498. var $tbody = $panel.find('tbody');
  499. var previous;
  500. var maxReportId = {};
  501. for (var accession_id in reports) {
  502. var length = reports[accession_id].length;
  503. var ops = data[accession_id];
  504. for (var row = 0; row < length; row++) {
  505. var report = reports[accession_id][row];
  506. $template = createRow(report, previous, accession_id, length, ops);
  507. previous = accession_id;
  508. $tbody.append($template);
  509. }
  510. }
  511. $(".generate-report-btn").on("click", function () {
  512. //generate report
  513. var accession_id = $(this).data("accession_id");
  514. var variant_id = $(this).data("variant_id");
  515. var report = new ReportGenerator(accession_id, variant_id);
  516. report.generateReport(this);
  517. });
  518.  
  519. $(".sign-report-btn").on('click',function() {
  520. var accession_id = $(this).data("accession_id");
  521. var variant_id = $(this).data("variant_id");
  522.  
  523. var report = new ReportGenerator(accession_id, variant_id);
  524. report.signReport(this);
  525. });
  526.  
  527. $(".preview-report-btn").on('click', function() {
  528. var report = new ReportGenerator();
  529. var report_id = $(this).data('report_id');
  530. report.previewReport(report_id);
  531. });
  532.  
  533. opsReviewUpdater.update(true);
  534. opsReviewUpdater.clear();
  535. //disable sorting because our rowspan workaround will fail if it is not sorted by accession
  536. $panel.find("table").dataTable({bSort: false});
  537.  
  538. updateStatus();
  539. }.bind(this)).progress(updateProgress.bind($panel));
  540. }
  541.  
  542. function updateProgress(data) {
  543. var $progress = $(this);
  544. $bar = $progress.find('.progress-bar');
  545. $bar
  546. .css('width', Math.round(data.percent) + '%')
  547. .attr('aria-valuenow', data.percent)
  548. .find('span')
  549. .html(Math.round(data.percent) + '% (' + data.current + ' of ' + data.total + ' accessions)')
  550. }
  551.  
  552. function loadPortalInformation(reports) {
  553. var accession_ids = Object.keys(reports);
  554. return loadPortalAccessionInformation(accession_ids);
  555. }
  556.  
  557. function loadPortalAccessionInformation(accession_ids) {
  558. var dfd = $.Deferred();
  559. if (accession_ids.length) {
  560. loadChunkedPortal(accession_ids, 0, {}, dfd);
  561. } else {
  562. dfd.resolve({});
  563. }
  564. return dfd.promise();
  565. }
  566.  
  567. function loadChunkedPortal(accession_ids, start_idx, carry, deferred) {
  568. deferred.notify({
  569. percent: Math.min((((start_idx) / accession_ids.length) * 100), 100),
  570. total: accession_ids.length,
  571. current: start_idx
  572. });
  573. $.ajax({
  574. url: '/reclassification/get_portal_info',
  575. data: {accession_ids: accession_ids.slice(start_idx, start_idx + 100)},
  576. dataType: 'json'
  577. }).done(function (response) {
  578. $.extend(carry, response);
  579. if (start_idx + 100 >= accession_ids.length) {
  580. deferred.resolve(carry);
  581. } else {
  582. loadChunkedPortal(accession_ids, start_idx + 100, carry, deferred);
  583. }
  584. });
  585. }
  586.  
  587. function createRow(report, previous, accession_id, length, ops) {
  588. var template = rowTemplate;
  589. $.extend(report, ops);
  590. report.portal_url = routes.urls.portal;
  591. report.count = length;
  592. report.variant_id = variant_id;
  593. report.log_id = category_log_id;
  594. report.category_id = category_id;
  595. var helper = new Helper();
  596. $template = $($.parseHTML(helper.replacePlaceholders(template, report)));
  597. if (previous === accession_id && length > 1) {
  598. //dataTables doesn't support rowspan (it complains about missing cells in the following rows)
  599. //so to work around it, instead of removing the cells, set them to not show up
  600. $template.find('[rowspan]').removeAttr('rowspan').css('display', 'none');
  601. }
  602. if (!parseInt(report.removed)) {
  603. if (checkOpsReview($template, report)) {
  604. if (parseInt(report.generated)) {
  605. setIsGenerated($template);
  606. if (parseInt(report.signed)) {
  607. setIsSigned($template);
  608. }
  609. }
  610. }
  611. } else {
  612. setIsRemoved($template)
  613. }
  614. refreshReportRowHandler.init($template.find(".refresh-row-btn"));
  615. return $template;
  616. }
  617.  
  618. function setIsGenerated($row) {
  619. $generatedCard.increment($row);
  620. //$row.find(".generate-report-btn").addClass('disabled');
  621. $row.find(".sign-report-btn").removeClass('disabled');
  622. $row.find(".preview-report-btn").removeClass('disabled');
  623. }
  624.  
  625. function setIsNotGenerated($row) {
  626. $generatedCard.decrement($row);
  627. $row.find(".generate-report-btn").removeClass('disabled');
  628. $row.find(".sign-report-btn").addClass('disabled');
  629. $row.find(".preview-report-btn").addClass('disabled');
  630. }
  631.  
  632. function setIsSigned($row) {
  633. $signedCard.increment($row);
  634. $row.find(".sign-report-btn").addClass('disabled');
  635. $row.find(".remove-report-btn").addClass('disabled');
  636. }
  637.  
  638. function setIsNotSigned($row) {
  639. $signedCard.decrement($row);
  640. $row.find(".sign-report-btn").removeClass('disabled');
  641. $row.find(".remove-report-btn").removeClass('disabled');
  642. }
  643.  
  644. function setIsRemoved($row) {
  645. $row.add($row.nextAll().slice(0,$row.find('td[rowspan]').attr('rowspan')-1)).addClass("removed");
  646. $row.find('[type="checkbox"]').prop('checked', false).prop('disabled', true);
  647. var $btn = $row.find(".remove-report-btn");
  648. $btn.html($btn.html().replace('Remove', 'Unremove'));
  649. $btn.data('removed', true);
  650. if ($row.find(".ops-review-btn.disabled").length) {
  651. $opsReviewedCard.decrement($row);
  652. if ($row.find(".generate-report-btn.disabled").length) {
  653. $generatedCard.decrement($row);
  654. }
  655. }
  656. $removedCard.increment($row);
  657. updateStatus();
  658. }
  659.  
  660. function setIsNotRemoved($row) {
  661. $row.find('[type="checkbox"]').prop('checked', true).prop('disabled', false);
  662. $row.add($row.nextAll().slice(0,$row.find('td[rowspan]').attr('rowspan')-1)).removeClass("removed");
  663. var $btn = $row.find(".remove-report-btn");
  664. $btn.html($btn.html().replace('Unremove', 'Remove'));
  665. $btn.data('removed', false);
  666. if ($row.find(".ops-review-btn.disabled").length) {
  667. $opsReviewedCard.increment($row);
  668. if ($row.find(".generate-report-btn.disabled").length) {
  669. $generatedCard.increment($row);
  670. }
  671. }
  672. $removedCard.decrement($row);
  673. updateStatus();
  674. }
  675.  
  676. function getCard(card) {
  677. var $card = $panel.find(card).find(".card-pf-aggregate-status-count");
  678. var card_accessions = [];
  679. return {
  680. card: $card,
  681. increment: function ($row) {
  682. var tAccession = $row.closest('tr').data('accession-id');
  683. if($.inArray(tAccession, card_accessions) === -1){
  684. card_accessions.push(tAccession)
  685. }
  686. $card.html(card_accessions.length);
  687. },
  688. decrement: function ($row) {
  689. var tAccession = $row.closest('tr').data('accession-id');
  690. card_accessions.splice( $.inArray(tAccession, card_accessions), 1 );
  691. $card.html(card_accessions.length);
  692. },
  693. value: function () {
  694. return parseInt($card.html());
  695. }
  696. }
  697. }
  698.  
  699. function checkOpsReview($row, report) {
  700. var ops_date = new Date(report.reviewed_at);
  701. var is_ops_reviewed = (ops_date > reclassified_date);
  702. if (is_ops_reviewed) {
  703. setIsOpsReviewed($row);
  704. opsReviewUpdater.addAccession(report.accession_id);
  705. return true;
  706. } else {
  707. setIsNotOpsReviewed($row);
  708. return false;
  709. }
  710. }
  711.  
  712. function setIsOpsReviewed($row) {
  713. $row.find(".ops-review-btn").addClass("disabled");
  714. $row.find(".generate-report-btn").removeClass("disabled");
  715. if($row.find(".preview-report-btn").data('report_id') != '') {
  716. $row.find(".preview-report-btn").removeClass("disabled");
  717. }
  718. $row.data('ops-reviewed', true);
  719. $opsReviewedCard.increment($row);
  720. updateStatus();
  721. }
  722.  
  723. function setIsNotOpsReviewed($row) {
  724. $row.find(".ops-review-btn").removeClass("disabled");
  725. $row.find(".generate-report-btn").addClass("disabled");
  726. $row.find(".preview-report-btn").addClass("disabled");
  727. if ($row.data('ops-reviewed')) {
  728. $opsReviewedCard.decrement($row);
  729. updateStatus();
  730. }
  731. $row.data('ops-reviewed', false);
  732. }
  733.  
  734. function updateStatus() {
  735. var total = $totalCard.value() - $removedCard.value();
  736. var reviewed = $opsReviewedCard.value();
  737. var generated = $generatedCard.value();
  738. var signed = $signedCard.value();
  739. var step1 = reviewed == total;
  740. var step2 = step1 && generated == total;
  741. var step3 = step2 && signed == total;
  742. $panel.find(".step-ops-review").find(".wizard-pf-step-number").toggleClass("pulse", !step1);
  743. $panel.find(".step-reports-generated").toggleClass("active", step1).find(".wizard-pf-step-number").toggleClass("pulse", step1 && !step2);
  744. $panel.find(".step-reports-signed").toggleClass("active", step2).find(".wizard-pf-step-number").toggleClass("pulse", step2 && !step3);
  745. $panel.find('.complete-container').toggleClass('hidden',!step3);
  746. }
  747.  
  748. var refreshReportRowHandler = (function () {
  749. function init($btn) {
  750. $btn.on("click", refreshRow);
  751. }
  752.  
  753. function refreshRow(e) {
  754. e.preventDefault();
  755. showLoading.call($(this));
  756. var $row = $(this).closest('tr');
  757. var $container = $(this).closest('.list-group-item-container');
  758. var $header = $container.prev(".list-group-item");
  759. var accession_id = $row.data('accession-id');
  760. var log_id = $(this).closest('td').data('log_id');
  761. var $promise = loadPortalInformation(accession_id);
  762. $promise.done(function (report) {
  763. var opsReviewUpdater = new Updater('ops_reviewed',category_log_id);
  764. is_reviewed = checkOpsReview($row, report[accession_id]);
  765. if (!is_reviewed) {
  766. opsReviewUpdater.addAccession(accession_id);
  767. opsReviewUpdater.update(true).done(opsReviewUpdater.clear);
  768. }
  769. else{
  770. //check if report_id changed
  771. fetch_report_id(log_id,accession_id).done(function(data){
  772. //if has report
  773. if(data.report_id != ''){
  774. setIsGenerated($row);
  775. $(this).closest('td').find('.preview-report-btn').removeClass('disabled').data('report_id',data.report_id);
  776.  
  777. //if report is signed
  778. if(data.signed == 1){
  779. setIsSigned($row);
  780. $(this).closest('td').find('.sign-report-btn').addClass('disabled').data('report_id',data.report_id);
  781. }
  782.  
  783. updateStatus();
  784. }
  785. });
  786. }
  787. hideLoading.call($row);
  788. });
  789. }
  790.  
  791. function fetch_report_id(log_id,accession_id){
  792. return $.ajax({
  793. url: '/reclassification/get_report_id',
  794. data: {log_id: log_id, accession_id: accession_id},
  795. dataType: 'json'
  796. });
  797. }
  798.  
  799. function loadPortalInformation(accession_id) {
  800. return loadPortalAccessionInformation([accession_id]);
  801. }
  802.  
  803. function showLoading() {
  804. this.find(".fa-refresh").addClass("fa-spin");
  805. }
  806.  
  807. function hideLoading() {
  808. this.find(".fa-refresh").removeClass("fa-spin");
  809. }
  810.  
  811. return {
  812. init: init
  813. }
  814. })()
  815.  
  816. return {
  817. displayReports: displayReports,
  818. loadPortalAccessionInformation: loadPortalAccessionInformation
  819. }
  820. };
  821.  
  822. $("document").ready(function () {
  823. var note = new noteHandler;
  824. var panel = new showPanel;
  825. note.init();
  826. panel.init();
  827. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement