@fto-consult/common
Version:
Un ensemble de bibliothèques et d'utilistaires communs pour le développement d'applications javascript
170 lines (168 loc) • 9.69 kB
JavaScript
import {defaultObj,isNonNullString,defaultStr} from "$cutils";
import Preloader from "$preloader";
import { createPageHeader,createSignatories,textToObject,printTags,getPrintedDate,getPageSize,prepareOptions} from "./utils";
/*** cette fonction prend en paramètre un tableau de donnés ou un objet à imprimer
* @param data {ArrayOf[object]|| object} les/la données à imprimer.
* lorsque data est un tableau, alors il s'agit de l'impression cumulée de plusieurs document
* lorsque data est un objet, alors il s'agit de l'impression d'une données de ventes
@param {Array|Object} data : tableau d'objet de données, ou objet document à igenerateQRCodemprimer
* @param arg {object
* print : La méthode de rappel appelée pour l'impression d'un document
showPreloader : {function}, la fonction permettant d'afficher le preloader
hidePreloader : {function}, la fonction permettant de masquer le preloader
getSettings {()=><Promise<{
duplicateDocOnPage : {boolean}, si chaque document sera dupliqué sur deux pages
pageMarginAfterEachDoc {number[2]}, le nombre de ligne à ajouter comme marge après chaque document, ceci est valide uniquement lorsque pageBreakBeforeEachDoc est à false
pageBreakBeforeEachDoc {boolean}, s'il y aura un break de page après chaque document
printTitle {string}, le titre que portera le document imprimé
title {string}, le titre du document imprimé
generateQRCode {boolean}, si le qrCode sera inclutd dans le résultat
qrCodeAlignment {string(left|right|top|bottom)}, l'alignement du qrCode
footerNote {mixted}, la note de pied de page à afficher après chaque document
footerNoteFontSize {number}, la taille de la police de la note de pied de page
displayPrintedDate {boolean}, si la date de tirage sera affichée
printedDateFontSize {number}, la taille de la police de la date d'impression
tags {Array<string>}, les étiquettes à imprimer sur le document
printSignatoriesImages : {boolean}, si les signatures images seront affichées
signatories {Array<{
image {dataURL}, l'image au format data url,
label|text|code {string}, le texte à afficher avant la signature
}>}
footerCopyRight : Le contenu de pied de page
footerCopyRightColor {string}, la couleur du footerCopyRight
}>>}, la fonction permettant de récupérer les paramètres lié à l'impression du document
* ...rest : les options d'impression du document
* } : les options d'impression
*
*/
export default function (data,options){
let {print,getSettings,showPreloader,hidePreloader, ...printOptions} = prepareOptions(options);
return new Promise((resolve,reject)=>{
print = typeof print =='function'? print : (args)=>{
return Promise.resolve(args);
};
getSettings = typeof getSettings == 'function' ? getSettings : (opts)=>opts;
if(!Array.isArray(data)){
data = [defaultObj(data)];
}
let allData = data;
const multiple = allData.length > 1;
if(!multiple){
data = defaultObj(data[0]);
}
return Promise.resolve(getSettings({...printOptions,multiple,allData,data})).then(({pageBreakBeforeEachDoc,pageMarginAfterEachDoc,data:cData,printTitle,generateQRCode,footerNote,title,duplicateDocOnPage,qrCodeAlignment,tags,signatories,...rest})=>{
let restFileName = defaultStr(rest.fileName);
pageMarginAfterEachDoc = typeof pageMarginAfterEachDoc =='number'? Math.ceil(pageMarginAfterEachDoc) : 2;
let pageMarginAf = "";
for(let i=0;i<pageMarginAfterEachDoc;i++){
pageMarginAf+="\n";
}
if(isNonNullString(footerNote)){
footerNote = {text:textToObject(footerNote,{fontSize:typeof(footerNoteFontSize) =='number'? footerNoteFontSize: 11})};
} else if(!Object.size(footerNote,true)){
footerNote = null;
}
printOptions = {...printOptions,showPreloader,hidePreloader,duplicateDocOnPage,...rest};
const pageSizes = getPageSize(printOptions);
const pageHeader = createPageHeader(options);
if(!qrCodeAlignment || !["left","center","right"].includes(qrCodeAlignment)){
qrCodeAlignment = "left";
}
let countD = 0;
showPreloader("Impression en cours ...");
const promises = [];
const allContents = [];
if(duplicateDocOnPage){
const ds = [];
allData.map((data)=>{
if(isObj(data) && Object.size(data,true)){
ds.push(data);
ds.push(data);
}
});
allData = data = ds;
}
for(let i in allData){
if(isObj(allData[i]) && Object.size(allData[i],true)){
countD++
const p = Promise.resolve(print({...rest,...pageSizes,multiple:!!(multiple||duplicateDocOnPage),data:allData[i],printTitle:allData[i].code+"-"+(allData.length-1)+"documents"}));
promises.push(p);
}
}
let counter = 0;
const printedDateStr = getPrintedDate(printOptions);
return Promise.all(promises).then((results)=>{
for(let i in results){
const result = results[i];
let qrCode = null//generate(results[i].data);
//qrCode.alignment = qrCodeAlignment;
if(isValidPrintableContent(result)){
const {content} = result;
let {footerNote:resultFooter} = result;
counter ++;
const pHeader = result.pageHeader ? createPageHeader({...printOptions,...result}) : null;
if(pHeader && Object.size(pHeader,true)){
content.unshift(pHeader);
} else if(pageHeader && Object.size(pageHeader,true)){
content.unshift(pageHeader);
}
if(resultFooter){
if(isNonNullString(resultFooter)){
resultFooter = {text:textToObject(resultFooter,{fontSize:typeof(footerNoteFontSize) =='number'? footerNoteFontSize: 11})};
} else if(!Object.size(resultFooter,true)){
resultFooter = null;
}
}
if(resultFooter){
content.push(resultFooter);
} else if(footerNote){
content.push(footerNote);
}
const tagsA = Array.isArray(result.tags)? result.tags : tags;
if(Array.isArray(tagsA) && tagsA.length){
const pTag = printTags(tagsA,printOptions);
if(pTag){
content.push(pTag);
}
}
let sign = createSignatories(Array.isArray(result.signatories)? result.signatories : signatories,printOptions);
if(sign){
content.push(sign);
}
if(generateQRCode && isNonNullString(qrCode.qr)){
content.push(qrCode);
}
if(printedDateStr){
content.push(printedDateStr);
}
if(!pageBreakBeforeEachDoc){
if(counter < results.length){
content.push({text:pageMarginAf});
}
} else if(counter > 1){
//saut de page suite à une nouveau pd
allContents.push({text:'',pageBreak: 'before'});
}
if(isNonNullString(result.fileName)){
restFileName = `${isNonNullString(restFileName)? (restFileName+"-"):''}${result.fileName}`;
}
allContents.push(content);
}
}
const rFileName = defaultStr(restFileName,options.fileName);
const fileName = rFileName + (countD > 1 ? ((countD>0?`${rFileName?"-":""}${countD}-documents`:"")):"")
hidePreloader();
resolve({...printOptions,content:allContents,fileName,printTitle:defaultStr(printTitle,fileName)})
}).catch((e)=>{
reject(e);
hidePreloader();
console.log(e,' printing all database data')
});
})
})
};
export const isValidPrintableContent = (printContent)=>{
if(!isObj(printContent)) return false;
const {content} = printContent;
return !!(Array.isArray(content));
}