Almascript - Alma Start Process List Helper

Show what isn't done and display uploaded files.

目前为 2019-08-02 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Almascript - Alma Start Process List Helper
  3. // @namespace https://greasyfork.org/en/users/8332-sreyemnayr
  4. // @version 2019.08.02.3
  5. // @description Show what isn't done and display uploaded files.
  6. // @author Ryan Meyers
  7. // @match https://sges.getalma.com/workflows/processes/*/review
  8. // @require https://greasyfork.org/scripts/388114-pdf-js/code/PDFjs.js?version=721820
  9. // @grant unsafeWindow
  10. // ==/UserScript==
  11.  
  12. // Loaded via <script> tag, create shortcut to access PDF.js exports.
  13. var pdfjsLib = window['pdfjs-dist/build/pdf'];
  14.  
  15. // The workerSrc property shall be specified.
  16. pdfjsLib.GlobalWorkerOptions.workerSrc = '//greasyfork.org/scripts/388115-pdf-js-worker/code/PDFjs%20Worker.js?version=721821';
  17.  
  18. function fetchAndUpdate(node) {
  19. const updateNode = node;
  20.  
  21. fetch(node.href).then(function(response) { return response.text(); }).then(function(body) {
  22. //console.log(body);
  23. var parser = new DOMParser();
  24. var doc = parser.parseFromString(body, "text/html");
  25. var xpath = "//li[contains(@class,'task')][not(contains(@class,'task-complete'))]";
  26. var result = document.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  27. //console.log(result);
  28. var node, nodes = [];
  29. while (node = result.iterateNext()) {
  30. //console.log(node.textContent.trim());
  31. var newNode = document.createElement('div');
  32. newNode.classList.add("pill");
  33.  
  34. newNode.innerHTML = "<i class=\"far fa-times-circle\" style=\"color:#eb6841;\"></i>"+node.textContent.trim();
  35.  
  36. updateNode.parentElement.parentElement.children[4].append(newNode);
  37. }
  38.  
  39. });
  40.  
  41. }
  42.  
  43. function fetchHealthForm(node) {
  44. const updateNode = node;
  45.  
  46. fetch(node.href).then(function(response) { return response.text(); }).then(function(body) {
  47. //console.log(body);
  48. var parser = new DOMParser();
  49. var doc = parser.parseFromString(body, "text/html");
  50. var xpath = "//li[contains(@class,'task')]";
  51. var result = document.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
  52. //console.log(result);
  53. var node, nodes = [];
  54. while (node = result.iterateNext()) {
  55. var taskUri = node.dataset.href;
  56. var formUri = taskUri.replace("task-details","form");
  57. let headers = new Headers({
  58. "Accept" : "application/json",
  59. "Content-Type" : "application/json",
  60. "X-Requested-With": "XMLHttpRequest"
  61. });
  62.  
  63. fetch(formUri, {method: "GET", headers: headers})
  64. .then(function(response) {
  65. return response.json();
  66. }).then(function(myJson) {
  67. //console.log(myJson);
  68. var jsonHTML = myJson.Message.html;
  69. jsonHTML = jsonHTML.replace(/form-section/g,"form-section-off");
  70. jsonHTML = jsonHTML.replace(/<ul class/g,"<ul style=\"display:none;\" class");
  71. //console.log(jsonHTML);
  72. //var files = jsonHTML.match(/<a href="(\/workflows\/processes\/.*\/get-file\?id=[a-zA-z0-9]*)">/g);
  73. var files = jsonHTML.match(/\/workflows\/processes\/.*\/get-file\?id=[a-zA-z0-9]*/g);
  74. if (files) {
  75. for (var file of files) {
  76. fetch(file).then(function(response) {
  77.  
  78.  
  79. return response.blob(); }
  80. ).then(async function(blob) {
  81.  
  82. console.log(blob.type);
  83. let reader = new FileReader();
  84. reader.readAsArrayBuffer(blob);
  85. reader.onload = async function() {
  86. var newImg;
  87.  
  88. //blob.arrayBuffer().then(async function(myBuffer){
  89. if (blob.type === "application/pdf") {
  90. newImg = document.createElement('canvas');
  91.  
  92. var loadingTask = pdfjsLib.getDocument(file);
  93. loadingTask.promise.then(function(pdf) {
  94. console.log('PDF loaded');
  95.  
  96. // Fetch the first page
  97. var pageNumber = 1;
  98. pdf.getPage(pageNumber).then(function(page) {
  99. console.log('Page loaded');
  100.  
  101. var scale = 0.25;
  102. var viewport = page.getViewport(scale);
  103.  
  104. // Prepare canvas using PDF page dimensions
  105. var canvas = newImg;
  106. var context = canvas.getContext('2d');
  107. canvas.height = 230;
  108. canvas.width = 160;
  109.  
  110. // Render PDF page into canvas context
  111. var renderContext = {
  112. canvasContext: context,
  113. viewport: viewport
  114. };
  115. var renderTask = page.render(renderContext);
  116. renderTask.promise.then(function () {
  117. console.log('Page rendered');
  118. });
  119. });
  120. }, function (reason) {
  121. // PDF loading error
  122. console.error(reason);
  123. });
  124.  
  125. //newImg = document.createElement('a');
  126. //newImg.href = file;
  127. //newImg.innerHTML = "Download";
  128. updateNode.append(newImg);
  129. }
  130. else {
  131. newImg = document.createElement('img');
  132. newImg.src = file;
  133. newImg.width = 200;
  134. updateNode.append(newImg);
  135.  
  136. }
  137.  
  138.  
  139. };
  140.  
  141. });
  142. }
  143. }
  144.  
  145.  
  146.  
  147.  
  148. });
  149. }
  150. });
  151. }
  152.  
  153. function doIncomplete() {
  154. var xpath = "//tr[td[text()='Active (in progress)']]/td[2]/a";
  155. var result = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
  156. var node, nodes = [];
  157. while (node = result.iterateNext()) {
  158. nodes.push(node);
  159. //console.log(node.href);
  160. fetchAndUpdate(node);
  161. }
  162. }
  163.  
  164. function doComplete() {
  165. var xpath = "//tr[td[text()='Active (complete)']]/td[2]/a";
  166. var result = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
  167. var node, nodes = [];
  168. while (node = result.iterateNext()) {
  169. nodes.push(node);
  170. //console.log(node.href);
  171. fetchHealthForm(node);
  172. }
  173. }
  174.  
  175. (function() {
  176. 'use strict';
  177. var newStyle = document.createElement('style');
  178. newStyle.innerHTML = `
  179. .pill {
  180. background-color: #fff;
  181. padding: .5em;
  182. border-radius: 5px;
  183. display: inline-block;
  184. cursor: default;
  185. margin-top: 1em;
  186. font-size: 8pt;
  187. }
  188. `;
  189. document.getElementsByTagName('head')[0].append(newStyle);
  190.  
  191. var showFormsButton = document.createElement('button');
  192. showFormsButton.onclick = doComplete;
  193. showFormsButton.innerHTML = "Show Uploads";
  194. document.getElementById('page-header').append(showFormsButton);
  195.  
  196.  
  197.  
  198.  
  199. doIncomplete();
  200.  
  201. })();