{"version":3,"sources":["webpack:///./src/modules/pdf-utils.js","webpack:///./src/modules/paperwork.js","webpack:///./src/modules/image-utils.js","webpack:///./src/modules/ajax.js","webpack:///./src/components/icons.js","webpack:///./src/components/select.js","webpack:///./src/modules/canvas-utils.js","webpack:///./src/modules/guid.js"],"names":["pdfjs","PDFJS","workerSrc","pageToCanvas","page","maxWidth","maxHeight","promise","Promise","resolve","reject","canvas","document","createElement","origViewport","getViewport","origWidth","width","origHeight","height","isLandscape","scale","viewport","renderContext","canvasContext","getContext","render","then","rotateCanvas","pageToImageData","toDataURL","fileToPdf","file","fileReader","FileReader","onload","typedarray","Uint8Array","this","result","getDocument","onerror","e","readAsArrayBuffer","pdfToPages","pdf","promises","i","numPages","push","getPage","all","pdfToImageDataArray","pages","map","fileToImageDataArray","PAGE_LIMIT","getPaperworkDims","dims","barcodeMargin","barcode","padding","safeArea","fontSize","logoWidth","label","outerWidth","outerHeight","WIDTH","HEIGHT","processFiles","files","name","split","pop","toLowerCase","getpdfData","getImageData","image","imageDataIsLandscape","landscape","w","h","resizeImageData","rotateImageData","processFile","arrs","reduce","arr","val","uploadPaperwork","imageData","pageNo","xPos","yPos","Math","round","pageService","uploadAndAssignPaperwork","deletePaperwork","pwkIds","websiteService","getPaperworkForRun","runNo","data","pwk","getConsAndServerImages_cust","despatchDate","customer","normalizeConsAndServerImages","getConsAndServerImages_depot","serverImage","schema","Entity","processStrategy","value","parent","key","newVal","Object","assign","url","getPaperworkURL","id","consignment","serverImages","idAttribute","postcode","toUpperCase","paperwork","localImages","normalize","entities","sortConsByConNo","cons","sort","a","b","conNoA","conNo","conNoB","getPaperworkSettings","JSON","parse","window","localStorage","getItem","defaultXPos","defaultYPos","setPaperworkSettings","setItem","stringify","shouldStopExit","state","anyLocal","keys","length","anyProcessing","bulkModeProcessingFiles","processingFilesForCons","anyUploading","uploadingImages","getOutstandingUploads","dateFrom","dateTo","reqDep","delDep","async","axios","get","params","response","getDuplicatedPaperworkViewers","conNos","includes","obj","pwkImgData","x","y","colDep","paperworkId","barcodeUrl","pwkImageProm","urlToimage","barcodeImageProm","logoImageProm","img","barcodeImage","logoImage","paperworkImage","ctx","ppmm","ppi","paperworkDims","targetWidth","targetHeight","scaleW","naturalWidth","scaleH","naturalHeight","save","translate","rotate","PI","drawImage","restore","bcodeWidth","bcodeHeight","logoHeight","barcodeMarginPx","border","style","drawRectangle","tlText","format","trText","blText","brText","font","writeText","generatePaperworkImageForPrinting","getPaperworkImageForPrinting","imgsInOrder","imgs","customerCopy","dupImgs","imgData","className","src","imageDataToimage","Image","maintainRatio","imageDataToCanvas","resizeCanvas","rotation","fileToImageData","readAsDataURL","ajax","options","defaults","method","dataOnly","stripD","queryStringForGet","parseAspDates","settings","paramsSerializer","join","transformResponse","test","moment","toDate","d","func","location","pathname","iconProps","tick","classNames","color","Icon","FaCheckCircle","spinner","FaSpinner","exclamation","FaExclamation","asterisk","FaAsterisk","cross","FaTimesCircle","info","FaInfoCircle","sharedPropTypes","size","PropTypes","oneOf","string","sharedDefaultProps","props","OutputIcon","type","iconClassNames","undefined","Tick","Asterisk","Spinner","Cross","Exclamation","propTypes","isRequired","defaultProps","Select","CreateReactClass","placeholder","arrayOf","object","selected","any","onChange","valueKey","labelKey","getDefaultProps","optionA","optionB","labelA","labelB","handleChange","option","bind","classNamePrefix","createCanvas","imageToCanvas","background","translateX","translateY","Error","context","fillStyle","fillRect","newCanvas","resize","_canvas","text","align","baseline","textAlign","textBaseline","fillText","shadow","borderDefaults","corners","shadowDefaults","blur","offsetX","offsetY","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","lineWidth","strokeStyle","lineJoin","strokeRect","drawCircle","radius","beginPath","arc","closePath","fill","stroke","drawImageAsCircle","imageOptions","defaultImageOptions","clip","guid","s4","floor","random","toString","substring"],"mappings":"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","file":"js/commons.cc2cadc955b4d5523b9a.js","sourcesContent":["import pdfjs from \"pdfjs-dist\";\nimport { rotateCanvas } from \"canvas-utils\";\n\n//TODO - is there a better way of doing this?\n// see https://github.com/mozilla/pdf.js/blob/master/examples/webpack/webpack.config.js\npdfjs.PDFJS.workerSrc = \"/node_modules/pdfjs-dist/build/pdf.worker.js\";\n\n//1169 x 827 = A4 @ 100dpi\n//2339 x 1653 = A4 @ 200dpi\n//3508 x 2480 = A4 @ 300dpi\nexport const pageToCanvas = function (page, maxWidth = 1653, maxHeight = 2339, forcePortrait = true) {\n // maxWidth refers to shortest side (might be portrait)\n // maxHeight refers to longest side (might be portrait)\n if (maxWidth > maxHeight) { //swap so width is allways shortest\n [maxWidth, maxHeight] = [maxHeight, maxWidth];\n }\n\n var promise = new Promise(function (resolve, reject) {\n var canvas = document.createElement(\"canvas\");\n var origViewport = page.getViewport(1);\n var origWidth = origViewport.width;\n var origHeight = origViewport.height;\n let isLandscape = origWidth > origHeight;\n if (isLandscape) { //if landscape, swap max W&H\n [maxWidth, maxHeight] = [maxHeight, maxWidth];\n }\n //from this point maxWidth refers to horizontal dimension (not necessarily shortest)\n\n // scale to fit a max dimensions (fill width or height)\n var scale = maxWidth / origWidth;\n if ((origWidth / origHeight) < (maxWidth / maxHeight)) {\n scale = maxHeight / origHeight;\n }\n\n var viewport = page.getViewport(scale);\n canvas.height = viewport.height;\n canvas.width = viewport.width;\n var context = canvas.getContext(\"2d\");\n var renderContext = {\n canvasContext: context,\n viewport: viewport\n };\n page.render(renderContext)\n .then(function () {\n if (isLandscape) {\n return rotateCanvas(canvas);\n } else {\n return canvas;\n }\n })\n .then(function (canvas) {\n resolve(canvas);\n //TODO reject(Error(\"It broke\"));\n });\n });\n return promise;\n};\n\n\n// returns base64 string as promise\nexport const pageToImageData = function (page, maxWidth = 1653, maxHeight = 2339) {\n return pageToCanvas(page, maxWidth, maxHeight).then(function (canvas) {\n return canvas.toDataURL(\"image/jpeg\");\n });\n};\n\n//takes a url and returns a pdfjs object (as promise)\nexport const urlToPdf = function (url) {\n return pdfjs.getDocument(url);\n};\n\n//converts file (from fileinput) to pdfjs object (as promise)\nexport const fileToPdf = function (file) {\n var fileReader = new FileReader();\n var promise = new Promise(function (resolve, reject) {\n fileReader.onload = function () {\n var typedarray = new Uint8Array(this.result);\n resolve(pdfjs.getDocument(typedarray));\n };\n fileReader.onerror = function (e) {\n reject(e);\n };\n });\n fileReader.readAsArrayBuffer(file);\n return promise;\n};\n\n//returns an array of pages from a pdf as a promise\nexport const pdfToPages = function (pdf) {\n let promises = [];\n for (let i = 1; i <= pdf.numPages; i++) {\n promises.push(pdf.getPage(i));\n }\n return Promise.all(promises);\n};\n\n// returns array of base64 strings as promise\nexport const pdfToImageDataArray = function (pdf, maxWidth = 1653, maxHeight = 2339) {\n return pdfToPages(pdf).then(function (pages) {\n let promises = pages.map(page => pageToImageData(page, maxWidth, maxHeight));\n return Promise.all(promises);\n });\n};\n\nexport const fileToImageDataArray = function (file, maxWidth = 1653, maxHeight = 2339) {\n return fileToPdf(file).then(function (pdf) {\n return pdfToImageDataArray(pdf, maxWidth, maxHeight);\n });\n};\n\nexport const urlToImageDataArray = function (url, maxWidth = 1653, maxHeight = 2339) {\n return urlToPdf(url).then(function (pdf) {\n return pdfToImageDataArray(pdf, maxWidth, maxHeight);\n });\n};\n\n","import React from \"react\";\nimport { fileToImageDataArray as getpdfData } from \"pdf-utils\";\nimport {\n fileToImageData as getImageData,\n resizeImageData,\n imageDataIsLandscape,\n urlToimage,\n rotateImageData\n} from \"image-utils\";\nimport { drawRectangle, writeText } from \"canvas-utils\";\n\nimport format from \"date-fns/format\";\n\nimport { websiteService, pageService } from \"ajax\";\n\nimport { normalize, schema } from \"normalizr\";\nimport axios from \"axios\";\n\nexport const PAGE_LIMIT = 10;\n\nexport function getPaperworkDims() {\n /*\n (P = padding) (S = Safe area) all co-ords worked out from origin (O)\n O -----------------------------------------------------------------\n | S P P P P P P P P P P P P P P P P P P P P P P P P S P P P P P P |\n | S (Font size --------------------------Font size) S --------- P |\n | S P P P P P P P P P P P P P P P P P P P P P P P P S | | P |\n | S S | | P |\n | S [barcode] S | logo | P |\n | S S | | P |\n | S P P P P P P P P P P P P P P P P P P P P P P P P S | | P |\n | S (Font size -------------------------Font size) S _________ P |\n | S P P P P P P P P P P P P P P P P P P P P P P P P S P P P P P P |\n -------------------------------------------------------------------\n */\n let dims = {\n //all in mm\n page: {\n width: 210,\n height: 297\n },\n barcodeMargin: 10, // margin around page that label cannot be placed (in mm)\n barcode: {\n width: 58,\n height: 10\n },\n padding: 0.8,\n safeArea: 2,\n fontSize: 2,\n logoWidth: 15.6 / (220 / 91) // logoHeight / (220/91) = 6.457\n };\n dims.label = {\n width:\n dims.barcode.width + dims.logoWidth + dims.padding + dims.safeArea * 2,\n height: dims.barcode.height + dims.fontSize * 2 + dims.padding * 4\n };\n dims.outerWidth =\n dims.safeArea * 2 + dims.barcode.width + dims.logoWidth + dims.padding;\n dims.outerHeight = dims.padding * 4 + dims.barcode.height + dims.fontSize * 2;\n return dims;\n}\n\n//1169 x 827 = A4 @ 100dpi\n//1754 x 1240 = A4 @ 150dpi\n//2339 x 1653 = A4 @ 200dpi\n//3508 x 2480 = A4 @ 300dpi\n\nconst WIDTH = 1240;\nconst HEIGHT = 1754;\n\nexport function processFile(file) {\n var ext = file.name\n .split(\".\")\n .pop()\n .toLowerCase();\n if (ext === \"pdf\") {\n return getpdfData(file, WIDTH, HEIGHT);\n } else {\n return getImageData(file).then(function(image) {\n return imageDataIsLandscape(image).then(function(landscape) {\n // resize treating height as longest side\n var w = WIDTH;\n var h = HEIGHT;\n if (landscape) {\n [w, h] = [h, w]; //swap if landscape\n }\n\n return resizeImageData(image, w, h)\n .then(function(image) {\n if (landscape) {\n return rotateImageData(image, 90);\n } else {\n return image;\n }\n })\n .then(function(image) {\n return [image]; //wrap in array to match pdf output\n });\n });\n });\n }\n}\n\nexport function processFiles(files) {\n let promises = [...files].map(file => processFile(file));\n return Promise.all(promises).then(function(arrs) {\n // flatten array of arrays\n return arrs.reduce((arr, val) => [...arr, ...val], []);\n });\n}\n\nexport function uploadPaperwork(imageData, pageNo, xPos, yPos) {\n //ensure positive vals\n xPos = xPos < 0 ? 0 : xPos;\n yPos = yPos < 0 ? 0 : yPos;\n\n //convert decimals to 0-255 (byte)\n xPos = Math.round(255 * xPos);\n yPos = Math.round(255 * yPos);\n\n return pageService(\"uploadCustomerPaperwork\", {\n imageData,\n pageNo,\n xPos,\n yPos\n });\n}\n\nexport function uploadAndAssignPaperwork(\n barcode,\n imageData,\n pageNo,\n xPos,\n yPos\n) {\n //ensure positive vals\n xPos = xPos < 0 ? 0 : xPos;\n yPos = yPos < 0 ? 0 : yPos;\n\n //convert decimals to 0-255 (byte)\n xPos = Math.round(255 * xPos);\n yPos = Math.round(255 * yPos);\n\n return pageService(\"uploadAndAssignCustomerPaperwork\", {\n barcode,\n imageData,\n pageNo,\n xPos,\n yPos\n });\n}\n\nexport function deletePaperwork(pwkIds) {\n return websiteService(\"deleteCustomerPaperwork\", { pwkIds });\n}\n\nexport function getPaperworkForRun(runNo) {\n return websiteService(\"getPaperworkForRun\", { runNo: runNo }).then(function(\n data\n ) {\n // convert 0-255 val to decimal\n return data.map(function(pwk) {\n pwk.xPos = pwk.xPos / 255;\n pwk.yPos = pwk.yPos / 255;\n return pwk;\n });\n });\n}\n\n// gets all cons (& images) for a given customer & date\nexport function getConsAndServerImages_cust(despatchDate, customer) {\n return pageService(\"getConsAndPaperwork_cust\", {\n customer,\n despatchDate\n }).then(normalizeConsAndServerImages);\n}\n\n// gets all cons (& images) for \"defaultDepot\" & date (all customer)\nexport function getConsAndServerImages_depot(despatchDate) {\n return pageService(\"getConsAndPaperwork_depot\", { despatchDate }).then(\n normalizeConsAndServerImages\n );\n}\n\nexport function normalizeConsAndServerImages(data) {\n const serverImage = new schema.Entity(\n \"serverImages\",\n {},\n {\n processStrategy: function(value, parent, key) {\n let newVal = Object.assign({}, value); //dont mutate\n //generate url\n newVal.url = getPaperworkURL(newVal.id);\n // convert 0-255 to 0-1\n newVal.xPos = newVal.xPos / 255;\n newVal.yPos = newVal.yPos / 255;\n return newVal;\n }\n }\n );\n const consignment = new schema.Entity(\n \"consignments\",\n {\n serverImages: [serverImage]\n },\n {\n idAttribute: \"barcode\",\n processStrategy: function(value, parent, key) {\n let newVal = Object.assign({}, value); //dont mutate\n // uppercase the postcode\n newVal.postcode = newVal.postcode.toUpperCase();\n // rename paperwork to serverImages\n newVal.serverImages = newVal.paperwork;\n delete newVal.paperwork;\n // add local images property\n newVal.localImages = [];\n return newVal;\n }\n }\n );\n return normalize(data, [consignment]).entities; // just return entities\n}\n\n// takes an array of con objects and sorts by conNo (ignoring case)\nexport function sortConsByConNo(cons) {\n return [...cons].sort(function(a, b) {\n var conNoA = a.conNo.toUpperCase(); // ignore upper and lowercase\n var conNoB = b.conNo.toUpperCase(); // ignore upper and lowercase\n if (conNoA < conNoB) {\n return -1;\n }\n if (conNoA > conNoB) {\n return 1;\n }\n return 0;\n });\n}\n\nexport function getPaperworkSettings() {\n let data = JSON.parse(window.localStorage.getItem(\"paperworkSettings\"));\n return (\n data || {\n defaultXPos: 0.64,\n defaultYPos: 0.04\n }\n );\n}\n\nexport function setPaperworkSettings(data) {\n window.localStorage.setItem(\"paperworkSettings\", JSON.stringify(data));\n}\n\n// any outstanding uploads / processing / uploading\nexport function shouldStopExit(state) {\n let anyLocal = Object.keys(state.localImages).length > 0;\n let anyProcessing =\n state.bulkModeProcessingFiles || state.processingFilesForCons.length > 0;\n let anyUploading = state.uploadingImages.length > 0;\n return anyLocal || anyProcessing || anyUploading;\n}\n\n// given a pwkId, give url to the jpg\nexport const getPaperworkURL = id => `/pwk/${id}.jpg`;\n\nexport async function getOutstandingUploads(dateFrom, dateTo, reqDep, delDep) {\n //gets a list of the outstanding paperwork to be uploaded\n let response = await axios.get(\"/api/paperworkReport\", {\n params: { dateFrom, dateTo, reqDep, delDep }\n });\n return response.data;\n}\n\n// returns array of images mimicing structure - grouped by con & duplicated\nexport function getDuplicatedPaperworkViewers(paperwork) {\n let conNos = paperwork.reduce((arr, { conNo }) => {\n return arr.includes(conNo) ? arr : [...arr, conNo];\n }, []);\n\n let pwk = paperwork.reduce((obj, pwk) => {\n obj[pwk.conNo] = obj[pwk.conNo] ? obj[pwk.conNo] : [];\n obj[pwk.conNo].push(pwk.id);\n return obj;\n }, {});\n\n let pwkImgData = paperwork.reduce((obj, pwk) => {\n let label = {\n x: pwk.xPos,\n y: pwk.yPos,\n conNo: pwk.conNo,\n despatchDate: pwk.despatchDate,\n barcode: pwk.barcode,\n colDep: pwk.colDep,\n delDep: pwk.delDep\n };\n obj[pwk.id] = getPaperworkImageForPrinting(pwk.id, label);\n return obj;\n }, {});\n\n let imgsInOrder = conNos.reduce((arr, conNo) => {\n let imgs = pwk[conNo].map(id => {\n return {\n id,\n imageData: pwkImgData[id],\n customerCopy: false\n };\n });\n let dupImgs = pwk[conNo].map(id => {\n return {\n id,\n imageData: pwkImgData[id],\n customerCopy: true\n };\n });\n return [...arr, ...imgs, ...dupImgs];\n }, []);\n\n let promises = imgsInOrder.map(x => x.imageData);\n return Promise.all(promises).then(imgs => {\n return imgs.map((imgData, i) => {\n let img = imgsInOrder[i]; // rely on index to get back to imgsInOrder data\n let className = \"paperwork-viewer\";\n if (img.customerCopy) {\n className += \" customer-copy\";\n }\n return (\n
\n \n
\n );\n });\n });\n}\n\nexport function getPaperworkImageForPrinting(paperworkId, label) {\n let barcodeUrl = `/public/barcode.aspx?Barcode=${label.barcode}&size=25`;\n let logoUrl = \"/images/pwkLogo.png\";\n\n let pwkImageProm = urlToimage(getPaperworkURL(paperworkId));\n let barcodeImageProm = urlToimage(barcodeUrl);\n let logoImageProm = urlToimage(logoUrl);\n\n return Promise.all([\n pwkImageProm,\n barcodeImageProm,\n logoImageProm\n ]).then(([img, barcodeImage, logoImage]) => {\n return generatePaperworkImageForPrinting(\n img,\n label,\n barcodeImage,\n logoImage\n );\n });\n}\n\nexport function generatePaperworkImageForPrinting(\n paperworkImage,\n label,\n barcodeImage,\n logoImage\n) {\n //TODO - un-comment\n // if(paperworkImage.naturalWidth > paperworkImage.naturalHeight){\n // throw new Error(\"paperwork image is expected to be portrait\");\n // }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n const ppi = 300;\n const ppmm = ppi * 0.03937007874016; //1 pixel/inch = 0.03937007874016 dot/millimeter\n\n const paperworkDims = getPaperworkDims();\n\n let targetWidth = paperworkDims.page.width * ppmm;\n let targetHeight = paperworkDims.page.height * ppmm;\n\n let scaleW = targetWidth / paperworkImage.naturalWidth;\n let scaleH = targetHeight / paperworkImage.naturalHeight;\n\n //choose smallest scale (to fit)\n let scale = scaleW > scaleH ? scaleH : scaleW;\n\n // work out pixel values for pwk\n const width = paperworkImage.naturalWidth * scale;\n const height = paperworkImage.naturalHeight * scale;\n\n //resize canvas\n canvas.width = width;\n canvas.height = height;\n\n //TODO - remove\n const isLandscape =\n paperworkImage.naturalWidth > paperworkImage.naturalHeight;\n if (isLandscape) {\n canvas.width = height;\n canvas.height = width;\n ctx.save();\n ctx.translate(0, width);\n ctx.rotate(-90 * (Math.PI / 180));\n }\n\n //draw main image\n ctx.drawImage(paperworkImage, 0, 0, width, height);\n\n //TODO - remove\n if (isLandscape) {\n ctx.restore();\n }\n\n //Work out required label dimensions\n\n //pixel vals of bcode\n let bcodeWidth = paperworkDims.barcode.width * ppmm;\n let bcodeHeight = paperworkDims.barcode.height * ppmm;\n\n //other pixel vals\n let fontSize = paperworkDims.fontSize * ppmm;\n let padding = paperworkDims.padding * ppmm;\n let safeArea = paperworkDims.safeArea * ppmm;\n\n // pixel vals of logo\n let logoWidth = paperworkDims.logoWidth * ppmm;\n let logoHeight = padding * 2 + bcodeHeight + fontSize * 2;\n\n let outerWidth = paperworkDims.outerWidth * ppmm;\n let outerHeight = paperworkDims.outerHeight * ppmm;\n\n //pixel vals of label position (origin)\n let x = width * label.x;\n let y = height * label.y;\n\n const barcodeMarginPx = paperworkDims.barcodeMargin * ppmm;\n\n //dont allow label within margin\n if (x < barcodeMarginPx) {\n x = barcodeMarginPx;\n }\n if (x + outerWidth > width - barcodeMarginPx) {\n x = width - outerWidth - barcodeMarginPx;\n }\n if (y < barcodeMarginPx) {\n y = barcodeMarginPx;\n }\n if (y + outerHeight > height - barcodeMarginPx) {\n y = height - outerHeight - barcodeMarginPx;\n }\n\n //draw white label background & border\n let border = {\n width: 0.1 * ppmm, // 0.1mm\n style: \"gray\"\n };\n drawRectangle(ctx, x, y, outerWidth, outerHeight, \"white\", border);\n\n //barcode\n ctx.drawImage(\n barcodeImage,\n x + safeArea,\n y + padding * 2 + fontSize,\n bcodeWidth,\n bcodeHeight\n );\n\n //logo\n ctx.drawImage(\n logoImage,\n x + bcodeWidth + safeArea * 2,\n y + padding,\n logoWidth,\n logoHeight\n );\n\n // Text\n let tlText = `${label.colDep} (${format(label.despatchDate, \"DD/MM/YY\")})`;\n let trText = `Con No: ${label.conNo}`;\n let blText = label.barcode;\n let brText = label.delDep;\n\n let font = `${fontSize}px sans-serif`;\n let color = \"black\";\n //top Left\n writeText(\n ctx,\n tlText,\n x + safeArea,\n y + padding + fontSize,\n font,\n color,\n \"start\",\n \"alphabetic\"\n );\n //bottom left\n writeText(\n ctx,\n blText,\n x + safeArea,\n y + 3 * padding + fontSize + bcodeHeight,\n font,\n color,\n \"start\",\n \"hanging\"\n );\n //top right\n writeText(\n ctx,\n trText,\n x + bcodeWidth + safeArea,\n y + padding + fontSize,\n font,\n color,\n \"end\",\n \"alphabetic\"\n );\n //bott right\n writeText(\n ctx,\n brText,\n x + bcodeWidth + safeArea,\n y + 3 * padding + fontSize + bcodeHeight,\n font,\n color,\n \"end\",\n \"hanging\"\n );\n\n // render canvas as an image\n return canvas.toDataURL();\n}\n","// @flow\nimport {imageDataToCanvas, resizeCanvas} from \"canvas-utils\";\n\n\nexport const imageDataToimage = function(imageData: string) : Promise {\n return urlToimage(imageData);\n};\n\nexport const urlToimage = function(url: string) : Promise {\n return new Promise(function(resolve, reject){\n var image = new Image();\n image.onload = function() {\n resolve(image);\n };\n image.onerror = function(e){\n reject(e);\n };\n image.src = url;\n });\n};\n\n\nexport const resizeImageData = function(imageData: string, maxWidth: number, maxHeight: number, maintainRatio?: boolean = true) : Promise {\n return imageDataToCanvas(imageData).then((canvas)=>{\n return resizeCanvas(canvas, maxWidth, maxHeight, maintainRatio).toDataURL(\"image/jpeg\");\n });\n};\n\nexport const rotateImageData = function(imageData: string, rotation: number) : Promise {\n return imageDataToCanvas(imageData, rotation).then((canvas)=>{\n return canvas.toDataURL(\"image/jpeg\");\n });\n};\n\nexport const fileToImageData = function(file: File) : Promise {\n var fileReader = new FileReader();\n var promise = new Promise(function(resolve, reject) {\n fileReader.onload = function() {\n resolve(this.result);\n };\n fileReader.onerror = function(e) {\n reject(e);\n };\n });\n fileReader.readAsDataURL(file);\n return promise;\n};\n\n\nexport const imageDataIsLandscape = function(imageData: string) : Promise {\n return imageDataToimage(imageData).then((image) => image.width > image.height);\n};\nexport const imageDataIsPortrait = function(imageData: string) : Promise {\n return imageDataIsLandscape(imageData).then((landscape) => !landscape);\n};\n","import axios from \"axios\";\nimport moment from \"moment\";\n\n\n// raw ajax call based on axios\nexport function ajax(url, data = {}, options = {}){\n\n const defaults = {\n method: \"get\", // get / post etc\n url: url,\n data: data,\n dataOnly: false, //just return the data\n stripD: false, //remove the d wrapper that asp adds\n queryStringForGet: false, //send data as qry strng when using get\n parseAspDates: false, //automaticaly parse asp.net dates (\"/Date(1198908717056)/\")\n };\n\n const settings = Object.assign({}, defaults, options);\n\n // generate query string params for get request\n if(settings.method.toLowerCase() === \"get\" && settings.queryStringForGet){\n settings.params = settings.data;\n settings.paramsSerializer = function(params) {\n // just serialize each param to JSON (unless string else adds extra \"\")\n return Object.keys(params).map(function(key){\n let value = params[key];\n if(typeof value !== \"string\"){\n value = JSON.stringify(value);\n }\n return `${key}=${value}`;\n }).join(\"&\");\n };\n }\n\n settings.transformResponse = [];\n\n // parseAspDates\n if(settings.parseAspDates){\n settings.transformResponse.push(function(data){\n return JSON.parse(data, function (key, value) {\n //check for ASP style date formating\n var regex = /\\/Date\\(.*\\)\\//i;\n if (typeof (value) === \"string\" && regex.test(value)) {\n return moment(value).toDate();\n }\n return value;\n });\n });\n }else{ //otherwise just parse JSON\n settings.transformResponse.push(JSON.parse);\n }\n\n //remove the d wrapper that asp adds\n if(settings.stripD){\n settings.transformResponse.push(data=>data.d);\n }\n\n\n //TODO caching?\n\n return axios(settings).then(function(obj){\n //just return the data\n return settings.dataOnly ? obj.data : obj;\n });\n}\n\n\nexport function websiteService(func, data = {}, options = {}){\n const defaults = {\n method: \"get\",\n queryStringForGet: true,\n parseAspDates: true,\n stripD: true,\n dataOnly: true\n };\n const settings = Object.assign({}, defaults, options);\n const url = `/WebsiteService.svc/${func}`;\n return ajax(url, data, settings);\n}\n\nexport function pageService(func, data = {}, options = {}){\n const defaults = {\n method: \"post\",\n page: window.location.pathname, //can be changed to target another page\n parseAspDates: true,\n stripD: true,\n dataOnly: true\n };\n const settings = Object.assign({}, defaults, options);\n const url = `${settings.page}/${func}`;\n return ajax(url, data, settings);\n}\n\n\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nimport FaCheckCircle from \"react-icons/lib/fa/check-circle\";\nimport FaAsterisk from \"react-icons/lib/fa/asterisk\";\nimport FaSpinner from \"react-icons/lib/fa/spinner\";\nimport FaTimesCircle from \"react-icons/lib/fa/times-circle\";\nimport FaExclamation from \"react-icons/lib/fa/exclamation-circle\";\nimport FaInfoCircle from \"react-icons/lib/fa/info-circle\";\n\nimport \"icon.css\";\nconst light_blue = \"#007dbb\";\nconst dark_blue = \"#00447c\";\nconst red = \"#d13239\";\nconst gray = \"#6b6c6b\";\nconst green = \"#449d44\";\n\n//As selected by Icon.props.type. If no classNames are needed, set classNames to [].\nlet iconProps = {\n tick: {\n classNames: [],\n color: green,\n Icon: FaCheckCircle\n },\n spinner: {\n classNames: [\"fa-spin\"],\n color: dark_blue,\n Icon: FaSpinner\n },\n exclamation: {\n classNames: [],\n color: red,\n Icon: FaExclamation\n },\n asterisk: {\n classNames: [],\n color: gray,\n Icon: FaAsterisk\n },\n cross: {\n classNames: [],\n color: red,\n Icon: FaTimesCircle\n },\n info: {\n classNames: [],\n color: light_blue,\n Icon: FaInfoCircle\n }\n};\n\nlet sharedPropTypes = {\n size: PropTypes.oneOf([\"large\", \"normal\", \"small\"]),\n className: PropTypes.string\n};\n\nlet sharedDefaultProps = {\n size: \"normal\"\n};\n\nfunction Icon(props = {}) {\n let OutputIcon = iconProps[props.type].Icon;\n let iconClassNames = [\n \"upn-component-icon\",\n `upn-component-icon--${props.size}`,\n ...iconProps[props.type].classNames\n ];\n if (props.className !== undefined) iconClassNames.push(props.className);\n return (\n \n );\n}\n\n//Icons props are 'type' and the props in sharedPropTypes. Each option of type.oneOf must match a property of iconProps.\nIcon.propTypes = {\n ...sharedPropTypes,\n type: PropTypes.oneOf([\n \"tick\",\n \"spinner\",\n \"exclamation\",\n \"asterisk\",\n \"cross\",\n \"info\"\n ]).isRequired\n};\n\nIcon.defaultProps = sharedDefaultProps;\n\nexport { Icon };\n\nfunction Tick(props = {}) {\n return ;\n}\n\nTick.propTypes = sharedPropTypes;\nTick.defaultProps = sharedDefaultProps;\n\nexport { Tick };\n\nfunction Asterisk(props = {}) {\n return ;\n}\n\nAsterisk.propTypes = sharedPropTypes;\nAsterisk.defaultProps = sharedDefaultProps;\n\nexport { Asterisk };\n\nfunction Spinner(props = {}) {\n return ;\n}\n\nSpinner.propTypes = sharedPropTypes;\nSpinner.defaultProps = sharedDefaultProps;\n\nexport { Spinner };\n\nfunction Cross(props = {}) {\n return ;\n}\n\nCross.propTypes = sharedPropTypes;\nCross.defaultProps = sharedDefaultProps;\n\nexport { Cross };\n\nfunction Exclamation(props = {}) {\n return (\n \n );\n}\n\nExclamation.propTypes = sharedPropTypes;\nExclamation.defaultProps = sharedDefaultProps;\n\nexport { Exclamation };\n","import React from \"react\";\nimport CreateReactClass from \"create-react-class\";\nimport PropTypes from \"prop-types\";\n\nimport ReactSelect from \"react-select\";\n\nimport _ from \"lodash\";\n\nlet Select = CreateReactClass({\n propTypes: {\n className: PropTypes.string,\n placeholder: PropTypes.string,\n options: PropTypes.arrayOf(PropTypes.object), // [{value, label}, ...]\n selected: PropTypes.any, // selected value\n onChange: PropTypes.func, // => (value)\n valueKey: PropTypes.string, //the option property to use for the value\n labelKey: PropTypes.string, //the option property to use for the label\n sort: PropTypes.func, //comparator function for sorting\n },\n getDefaultProps: function () {\n return {\n placeholder: \"Please select...\",\n options: [{}],\n valueKey: \"value\",\n labelKey: \"label\",\n sort: function (optionA, optionB) {\n var labelA = optionA[this.props.labelKey].toUpperCase(); // ignore case\n var labelB = optionB[this.props.labelKey].toUpperCase(); // ignore case\n if (labelA < labelB) return -1;\n if (labelA > labelB) return 1;\n return 0;\n }\n };\n },\n handleChange: function (option) {\n if (option == null) { //undef or null\n this.props.onChange && this.props.onChange(null);\n } else {\n this.props.onChange && this.props.onChange(option.value);\n }\n },\n render: function () {\n // sort options\n let options = this.props.options.sort(this.props.sort.bind(this));\n // map value/label keys\n options = options.map(option => ({\n value: option[this.props.valueKey],\n label: option[this.props.labelKey],\n }));\n // find the selected object by value\n let selected = _.find(options, { value: this.props.selected });\n return ;\n }\n\n});\n\nexport default Select;\n","\nimport { imageDataToimage } from \"image-utils\";\n\nexport const createCanvas = function (width = 210, height = 297) {\n var canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n};\n\nexport const imageToCanvas = function (image, rotation = 0, background = \"white\") {\n var width = image.naturalWidth;\n var height = image.naturalHeight;\n\n let translateX = 0;\n let translateY = 0;\n\n if (rotation === 90) {\n [width, height] = [height, width]; //swap\n translateX = width;\n } else if (rotation === 180) {\n translateX = width;\n translateY = height;\n } else if (rotation === 270) {\n [width, height] = [height, width]; //swap\n translateY = height;\n } else if (rotation !== 0) {\n throw new Error(\"rotation only accepts 90 / 180 / 270\");\n }\n\n let canvas = createCanvas(width, height);\n let context = canvas.getContext(\"2d\");\n if (background) {\n context.fillStyle = background; // white background\n context.fillRect(0, 0, width, height);\n }\n if (rotation !== 0) {\n context.translate(translateX, translateY);\n context.rotate(rotation * Math.PI / 180);\n }\n\n context.drawImage(image, 0, 0);\n\n return canvas;\n};\n\nexport const rotateCanvas = function (canvas, rotation = 90) {\n\n var width = canvas.width;\n var height = canvas.height;\n\n let translateX = 0;\n let translateY = 0;\n\n if (rotation === 90) {\n [width, height] = [height, width]; //swap\n translateX = width;\n } else if (rotation === 180) {\n translateX = width;\n translateY = height;\n } else if (rotation === 270) {\n [width, height] = [height, width]; //swap\n translateY = height;\n } else if (rotation !== 0) {\n throw new Error(\"rotation only accepts 90 / 180 / 270\");\n }\n\n let newCanvas = createCanvas(width, height);\n let context = newCanvas.getContext(\"2d\");\n\n if (rotation !== 0) {\n context.translate(translateX, translateY);\n context.rotate(rotation * Math.PI / 180);\n }\n\n context.drawImage(canvas, 0, 0);\n\n return newCanvas;\n};\n\nexport const imageDataToCanvas = function (imageData, rotation = 0, background = \"white\") {\n return imageDataToimage(imageData).then(function (image) {\n return imageToCanvas(image, rotation, background);\n });\n};\n\nexport const resizeCanvas = function (canvas, maxWidth, maxHeight, maintainRatio = true) {\n var width, height;\n if (maintainRatio) {\n var scale; // scale to fit a max dimensions (fill width or height)\n if ((canvas.width / canvas.height) < (maxWidth / maxHeight)) {\n scale = maxHeight / canvas.height;\n } else {\n scale = maxWidth / canvas.width;\n }\n width = canvas.width * scale;\n height = canvas.height * scale;\n } else {\n width = maxWidth;\n height = maxHeight;\n }\n //img can be canvas or image\n var resize = function (img, width, height) {\n var _canvas, ctx;\n _canvas = document.createElement(\"canvas\");\n ctx = _canvas.getContext(\"2d\");\n _canvas.width = width;\n _canvas.height = height;\n ctx.drawImage(img, 0, 0, width, height);\n return _canvas;\n };\n //keep downsizing by half where possible for better quality\n while (canvas.width / 2 > width) {\n canvas = resize(canvas, canvas.width / 2, canvas.height / 2);\n }\n //keep upsizing by 2 where possible for better quality\n while (canvas.width * 2 < width) {\n canvas = resize(canvas, canvas.width * 2, canvas.height * 2);\n }\n //resize to exact dims\n canvas = resize(canvas, width, height);\n return canvas;\n};\n\nexport const writeText = function (ctx, text, x, y, font = \"10px sans-serif\", color = \"black\", align = \"start\", baseline = \"alphabetic\") {\n ctx.save();\n ctx.fillStyle = color;\n ctx.font = font;\n ctx.textAlign = align;\n ctx.textBaseline = baseline;\n ctx.fillText(text, x, y);\n ctx.restore();\n};\n\nexport const drawRectangle = function (ctx, x, y, width, height, fillStyle = \"blue\", border = {}, shadow = {}) {\n\n //(off by default)\n let borderDefaults = {\n width: 0, //lineWidth\n style: \"black\", //strokeStyle\n corners: \"round\", //lineJoin\n };\n\n border = Object.assign({}, borderDefaults, border);\n\n //(off by default)\n let shadowDefaults = {\n color: \"transparent\", //shadowColor\n blur: 10, //shadowBlur\n offsetX: 5, //shadowOffsetX\n offsetY: 5, //shadowOffsetY\n };\n\n shadow = Object.assign({}, shadowDefaults, shadow);\n\n ctx.save();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur;\n ctx.shadowOffsetX = shadow.offsetX;\n ctx.shadowOffsetY = shadow.offsetY;\n ctx.lineWidth = border.width;\n ctx.strokeStyle = border.style;\n ctx.lineJoin = border.corners;\n ctx.fillStyle = fillStyle;\n ctx.fillRect(x, y, width, height);\n ctx.shadowColor = \"transparent\"; //no shadow for border\n ctx.strokeRect(x, y, width, height);\n ctx.restore();\n\n};\n\nexport const drawCircle = function (ctx, x, y, radius, fillStyle = \"blue\", border = {}, shadow = {}) {\n\n //(off by default)\n let borderDefaults = {\n width: 0, //lineWidth\n style: \"black\", //strokeStyle\n corners: \"round\", //lineJoin\n };\n\n border = Object.assign({}, borderDefaults, border);\n\n //(off by default)\n let shadowDefaults = {\n color: \"transparent\", //shadowColor\n blur: 10, //shadowBlur\n offsetX: 5, //shadowOffsetX\n offsetY: 5, //shadowOffsetY\n };\n\n shadow = Object.assign({}, shadowDefaults, shadow);\n\n ctx.save();\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur;\n ctx.shadowOffsetX = shadow.offsetX;\n ctx.shadowOffsetY = shadow.offsetY;\n ctx.lineWidth = border.width;\n ctx.strokeStyle = border.style;\n ctx.lineJoin = border.corners;\n ctx.fillStyle = fillStyle;\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fill();\n\n ctx.shadowColor = \"transparent\"; //no shadow for border\n ctx.stroke();\n\n ctx.restore();\n\n};\n\nexport const drawImageAsCircle = function (ctx, x, y, radius, image, imageOptions = {}, border, shadow) {\n\n let defaultImageOptions = {\n // coords to start drawing from source image (asif square)\n x: 0,\n y: 0,\n // how much of the source image to be used\n width: radius * 2,\n height: radius * 2,\n };\n\n imageOptions = Object.assign({}, defaultImageOptions, imageOptions);\n\n // draw shadow\n drawCircle(ctx, x, y, radius, \"white\", undefined, shadow);\n\n ctx.save();\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.clip();\n\n //draw image\n ctx.drawImage(image, imageOptions.x, imageOptions.y, imageOptions.width, imageOptions.height, x - radius, y - radius, radius * 2, radius * 2);\n\n ctx.beginPath();\n ctx.arc(x - radius, y - radius, radius, 0, Math.PI * 2, true);\n ctx.clip();\n ctx.closePath();\n\n ctx.restore();\n\n // draw border (hides rough edges)\n drawCircle(ctx, x, y, radius, \"transparent\", border);\n\n\n};\n\n\n","export default function guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" +\n s4() + \"-\" + s4() + s4() + s4();\n}\n"],"sourceRoot":""}