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