From 86d4114ab61f9cb00c1d01f91e81e9a38c6ba2f6 Mon Sep 17 00:00:00 2001 From: opensource-tnbt Date: Thu, 10 Sep 2020 12:23:34 +0530 Subject: SDV: Platform Description Implementation. This patch includes PDF Template and a tool to create PDF. Signed-off-by: Sridhar K. N. Rao Change-Id: Ib702ff42352d584cb9146ff1959258c558e06615 --- sdv/pdf/site/scripts/actions.js | 24 +++++++ sdv/pdf/site/scripts/createfile.js | 13 ++++ sdv/pdf/site/scripts/mergeDeep.js | 31 ++++++++++ sdv/pdf/site/scripts/readFromHTML.js | 57 +++++++++++++++++ sdv/pdf/site/scripts/writeToHTML.js | 117 +++++++++++++++++++++++++++++++++++ 5 files changed, 242 insertions(+) create mode 100644 sdv/pdf/site/scripts/actions.js create mode 100644 sdv/pdf/site/scripts/createfile.js create mode 100644 sdv/pdf/site/scripts/mergeDeep.js create mode 100644 sdv/pdf/site/scripts/readFromHTML.js create mode 100644 sdv/pdf/site/scripts/writeToHTML.js (limited to 'sdv/pdf/site/scripts') diff --git a/sdv/pdf/site/scripts/actions.js b/sdv/pdf/site/scripts/actions.js new file mode 100644 index 0000000..464c57f --- /dev/null +++ b/sdv/pdf/site/scripts/actions.js @@ -0,0 +1,24 @@ + +// expand-arrow button +function toggleClass(element, classname){ + element.classList.toggle(classname) +} + +// Add button +function duplicate(button){ + if (button.previousElementSibling.hasAttribute('name') && + button.previousElementSibling.getAttribute('name') != null) + { + newdiv = button.previousElementSibling.cloneNode(true); + if (!newdiv.lastElementChild.classList.contains('del-button')){ + del ='
' + newdiv.innerHTML += del; + } + button.parentNode.insertBefore(newdiv, button) + } +} + +// Delete Button +function remove(button){ + button.parentNode.parentNode.removeChild(button.parentNode); +} \ No newline at end of file diff --git a/sdv/pdf/site/scripts/createfile.js b/sdv/pdf/site/scripts/createfile.js new file mode 100644 index 0000000..2e13f2f --- /dev/null +++ b/sdv/pdf/site/scripts/createfile.js @@ -0,0 +1,13 @@ +/** + * This function creates a Json file to support client-side file download + */ + +function createjson() { + element=document.getElementById('pdfform') + data = objectifyDiv(element); + jsonstr = JSON.stringify(data); + var data = new Blob([jsonstr], {type: 'application/json'}); + var url = window.URL.createObjectURL(data); + document.getElementById('download_link').href = url; + console.log(jsonstr); +} diff --git a/sdv/pdf/site/scripts/mergeDeep.js b/sdv/pdf/site/scripts/mergeDeep.js new file mode 100644 index 0000000..ebede4e --- /dev/null +++ b/sdv/pdf/site/scripts/mergeDeep.js @@ -0,0 +1,31 @@ + +/** +* Performs a deep merge of objects and returns new object. Does not modify +* objects (immutable) and merges arrays via concatenation. +* +* @param {...object} objects - Objects to merge +* @returns {object} New object with merged key/values +*/ +function mergeDeep(...objects) { + const isObject = obj => obj && typeof obj === 'object'; + + return objects.reduce((prev, obj) => { + Object.keys(obj).forEach(key => { + const pVal = prev[key]; + const oVal = obj[key]; + + if (Array.isArray(pVal) && Array.isArray(oVal)) { + prev[key] = pVal.concat(...oVal); + } + else if (isObject(pVal) && isObject(oVal)) { + prev[key] = mergeDeep(pVal, oVal); + } + else { + prev[key] = oVal; + } + }); + + return prev; + }, {}); +} + diff --git a/sdv/pdf/site/scripts/readFromHTML.js b/sdv/pdf/site/scripts/readFromHTML.js new file mode 100644 index 0000000..3255e79 --- /dev/null +++ b/sdv/pdf/site/scripts/readFromHTML.js @@ -0,0 +1,57 @@ + +/** +* Reads HTML contents into javascript object +* +* +* @param {element} element to read, can be input or div element +* @returns {object} New object with values read +*/ +function objectifyDiv(element){ + var obj = {}; + var el = element.childNodes; + for(var i in el){ + + if(el[i] instanceof HTMLInputElement && el[i].hasAttribute('name')) { + + if(el[i].type == 'text') + obj = mergeDeep(obj, objectify(el[i].name, el[i].value)); + + } + if(el[i] instanceof HTMLSelectElement && el[i].hasAttribute('name')){ + obj = mergeDeep(obj, objectify(el[i].name, el[i].value)); + } + if(el[i] instanceof HTMLDivElement){ + + if(el[i].classList.contains('arr')){ + var key = el[i].getAttribute('name'); + var value = objectifyDiv(el[i]); + if(obj[key] == undefined) + obj[key] =[]; + obj[key].push(value[key]); + } + else + obj = mergeDeep(obj, objectifyDiv(el[i])); + + } + } + + if(element.hasAttribute('name')){ + var newobj = {}; + newobj[element.getAttribute('name')] = obj; + return newobj; + } + return obj; +} + + + +function objectify(key, value){ + var obj = {}; + var keys = key.split('.'); + for(var i = keys.length-1; i >= 0; i--){ + obj[keys[i]] = value; + value = obj; + obj = {}; + } + return value; +} diff --git a/sdv/pdf/site/scripts/writeToHTML.js b/sdv/pdf/site/scripts/writeToHTML.js new file mode 100644 index 0000000..8eb8c29 --- /dev/null +++ b/sdv/pdf/site/scripts/writeToHTML.js @@ -0,0 +1,117 @@ + +/** +* Processes target HTML element and fill with values passed in +* javascript object +* +* @param {element} element to update with values +* @param {obj} Object from which values will be read +*/ + function writeToHTML(element, obj){ + + var el = element.childNodes; + for(var i in el) + { + + if(el[i] instanceof HTMLInputElement && el[i].hasAttribute('name')){ + + if(el[i].type == 'text') + el[i].value = getValue(obj, el[i].name); + + } + if(el[i] instanceof HTMLSelectElement && el[i].hasAttribute('name')){ + + var option = getValue(obj, el[i].name); + var defaultValue = el[i].value; + el[i].value = option; + if ( el[i].value != option){ + el[i].focus(); + alert(option + " is an invalid value! Setting to default"); + el[i].value = defaultValue; + } + + } + if(el[i] instanceof HTMLDivElement){ + + if(el[i].hasAttribute('name')) + { + if(el[i].classList.contains('arr')){ + + name = el[i].getAttribute('name'); + values = getValue(obj, name); + + // Sync number of Arr div with name inside element with number of values + syncArr(element, name, values.length); + + // Update value inside all divs + var i = 0; + for(var div of element.getElementsByClassName('arr')) + if(div.getAttribute("name") == name) + writeToHTML(div , values[i++]); + + } //else-if single div + else + writeToHTML(el[i], getValue(obj, el[i].getAttribute('name'))); + + }//else-if blank div without attribute name, then simply pass values to next child + else + writeToHTML(el[i], obj); + } + + } + } + + // Reads value from obj with string 'key1.key2.key3' convention + function getValue(obj, str) { + str = str.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties + str = str.replace(/^\./, ''); // strip a leading dot + var a = str.split('.'); + for (var i = 0; i < a.length; ++i) { + var key = a[i]; + if (key in obj) { + obj = obj[key]; + } else { + alert('Invalid PDF file! Key '+key+ ' not Found'); + return ""; + } + } + return obj; + } + +function syncArr(el, name, length){ + + // count number of arr-div with name present inside el + var count = 0; + var cp = null; + for(var div of el.getElementsByClassName('arr')){ + if(div.getAttribute("name") == name){ + count++; + cp = div; + } + } + + // balance loop + while(count - length){ + if((count - length) < 0) + { // add more div + newdiv = cp.cloneNode(true); + if (!newdiv.lastElementChild.classList.contains('del-button')){ + del ='
' + newdiv.innerHTML += del; + } + cp.after(newdiv); + count++; + } + else + { // remove div + for(var div of el.getElementsByClassName('arr')) + if(div.getAttribute("name") == name) + if (div.lastElementChild.classList.contains('del-button')){ + div.parentNode.removeChild(div); + count--; + if((count - length)==0) + break; + } + } + } + +} -- cgit 1.2.3-korg