@fto-consult/expo-ui 6.64.17 → 6.64.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/print/utils.js
DELETED
@@ -1,1840 +0,0 @@
|
|
1
|
-
import createPDF from "./createPDF";
|
2
|
-
import {defaultObj,isFunction,sanitizeFileName,defaultNumber,sprintf,defaultVal,arrayValueExists,isObj,defaultFunc,isNonNullString,defaultStr,defaultArray} from "$cutils";
|
3
|
-
import notify from "$cnotify";
|
4
|
-
import appConfig from "$capp/config";
|
5
|
-
import APP from "$capp/instance";
|
6
|
-
import toPdfMakeObj from "./toPdfMakeObj";
|
7
|
-
|
8
|
-
//let {generate} = require("./qrCode");
|
9
|
-
let signatoriesItems = undefined;
|
10
|
-
let subTotalFillColor = "#FDE9D9";
|
11
|
-
let subTotalTitleFillColor = "#fcd9bb"//"#FCD5B4";
|
12
|
-
let totalPrintTableTextColor = "red";
|
13
|
-
let tableHeaderPrintFillColor = "#cccccc";
|
14
|
-
let MAX_CREATED_SIGNATURE_PRINT_SIZE = 50;
|
15
|
-
|
16
|
-
export * as pdfSettings from "./";
|
17
|
-
|
18
|
-
import Colors from "$theme";
|
19
|
-
|
20
|
-
export * from "./pdf";
|
21
|
-
|
22
|
-
export const isValidPrintableContent = (args)=>{
|
23
|
-
return (isObj(args) && isObj(args.docDefinition) && args.content && isObj(args.options));
|
24
|
-
}
|
25
|
-
export const createPDFFile = (args) =>{
|
26
|
-
return new Promise((resolve,reject)=>{
|
27
|
-
args.data = defaultObj(args.data);
|
28
|
-
args.fileName = defaultStr(args.fileName);
|
29
|
-
let {fileName,title,data,content,showPreloader,hidePreloader,multiple,docDefinition,options} =args;
|
30
|
-
options = defaultObj(options);
|
31
|
-
showPreloader = typeof showPreloader =='function' ? showPreloader : x=>true;
|
32
|
-
hidePreloader = typeof hidePreloader =='function' ? hidePreloader : x=> false;
|
33
|
-
const error = (e)=>{
|
34
|
-
let message = "";
|
35
|
-
if(isObj(e)){
|
36
|
-
message = defaultStr(e.msg,e.message);
|
37
|
-
}
|
38
|
-
notify.error("Une erreur est survenue pendant l'impression du fichier au format pdf\n"+message);
|
39
|
-
reject(e);
|
40
|
-
};
|
41
|
-
if(isValidPrintableContent(args)){
|
42
|
-
let pdf = null;
|
43
|
-
docDefinition.watermark = { text: defaultStr(docDefinition.watermark,options.watermark),fontSize:80, color: 'blue', opacity: 0.1, bold: false, italics: false,...defaultObj(options.watermark)}
|
44
|
-
if(!isNonNullString(docDefinition.watermark.text)){
|
45
|
-
delete docDefinition.watermark;
|
46
|
-
}
|
47
|
-
let printTitle = defaultStr(options.printTitle,options.docTitle,options.title);
|
48
|
-
docDefinition.info = defaultObj(docDefinition.info);
|
49
|
-
docDefinition.info.title = defaultStr(docDefinition.info.title,printTitle,fileName);
|
50
|
-
docDefinition.info.author = APP.getName();
|
51
|
-
docDefinition.info.creator = APP.getName();
|
52
|
-
docDefinition.info.producer = APP.getName();
|
53
|
-
try {
|
54
|
-
showPreloader("création du contenu...")
|
55
|
-
pdf = createPDF({
|
56
|
-
...getPrintPageSettings(options),
|
57
|
-
content,
|
58
|
-
...docDefinition,
|
59
|
-
});
|
60
|
-
title = defaultStr(typeof title =='function'? title(args):multiple?fileName:'',printTitle,options.printTitle,options.docTitle,options.title,title)
|
61
|
-
fileName = sanitizeFileName(defaultStr(fileName,title)).trim().rtrim(".pdf")+".pdf"
|
62
|
-
if(pdf){
|
63
|
-
pdf.getDataUrl((dataUrl) => {
|
64
|
-
resolve({dataURL:dataUrl,dataUrl,pdf,data})
|
65
|
-
});
|
66
|
-
} else {
|
67
|
-
error({status:false,data,message:'Impossible de générer le pdf'})
|
68
|
-
}
|
69
|
-
} catch(e){
|
70
|
-
console.log("creating pdf file in printing document ",e,data);
|
71
|
-
error({status:false,data,msg:'Error lors de la création du fichier pdf ',data})
|
72
|
-
return e;
|
73
|
-
}
|
74
|
-
} else {
|
75
|
-
error({status:false,data,msg : "Impossible d'imprimer le document car le contenu du fichier est invalide"});
|
76
|
-
}
|
77
|
-
})
|
78
|
-
};
|
79
|
-
|
80
|
-
|
81
|
-
export const getPrintPageSettings = (opts)=>{
|
82
|
-
opts = defaultObj(opts);
|
83
|
-
let title = defaultStr(opts.printTitle,opts.docTitle,opts.title)
|
84
|
-
let defaultFont = "Roboto";
|
85
|
-
const fts = Object.keys(createPDF.fonts);
|
86
|
-
if(!arrayValueExists(fts,defaultFont)){
|
87
|
-
defaultFont = fts[0];
|
88
|
-
}
|
89
|
-
return {
|
90
|
-
...defaultObj(getPageSize(opts)),
|
91
|
-
pageMargins: getPageMargins(opts),
|
92
|
-
footer: getFooter(opts),
|
93
|
-
info : {
|
94
|
-
title,//- the title of the document
|
95
|
-
author : APP.getName(),//the name of the author
|
96
|
-
subject :tile,//- the subject of the document
|
97
|
-
keywords :APP.getName()+","+defaultStr(opts.keywords),//- keywords associated with the document
|
98
|
-
creator : APP.getName(),//- the creator of the document (default is ‘pdfmake’)
|
99
|
-
producer : APP.getName()//- the producer of the document (default is ‘pdfmake’)
|
100
|
-
},
|
101
|
-
defaultStyle: {
|
102
|
-
...defaultObj(opts.defaultStyle),
|
103
|
-
font: typeof defaultFont !== "undefined" ? defaultFont : undefined,
|
104
|
-
color : Colors.isValid(opts.defaultFontColor)? opts.defaultFontColor : undefined,
|
105
|
-
}
|
106
|
-
}
|
107
|
-
}
|
108
|
-
export const getPageSize = (options,force)=>{
|
109
|
-
options = defaultObj(options);
|
110
|
-
let {pageFormat,pageSize,pageHeight,pageWidth,pageOrientation,formatName} = options;
|
111
|
-
pageFormat = defaultStr(pageFormat,formatName)
|
112
|
-
if(!isNonNullString(pageFormat) || !pdfSettings.pageFormats[pageFormat]){
|
113
|
-
pageFormat = pdfSettings.defaultPageFormat;
|
114
|
-
}
|
115
|
-
pageSize = defaultStr(pageSize,pageFormat);
|
116
|
-
pageOrientation = defaultStr(pageOrientation,pdfSettings.defaultPageOrientation);
|
117
|
-
if(!arrayValueExists(['landscape','portrait'],pageOrientation)){
|
118
|
-
pageOrientation = 'portrait';
|
119
|
-
}
|
120
|
-
pageWidth = defaultNumber(pageWidth);
|
121
|
-
pageHeight = defaultNumber(pageHeight);
|
122
|
-
const oPageSize = pageOrientation == 'landscape'? 1 : 0;
|
123
|
-
if(pageWidth != 0 || pageHeight != 0 || force){
|
124
|
-
if(pageSize && isObj(pdfSettings.pagesSizes[pageSize]) && isArray(pdfSettings.pagesSizes[pageSize].pt)){
|
125
|
-
if(pageWidth <= 0){
|
126
|
-
pageWidth = pdfSettings.pagesSizes[pageSize].pt[oPageSize]
|
127
|
-
}
|
128
|
-
if(pageHeight <= 0){
|
129
|
-
pageHeight = pdfSettings.pagesSizes[pageSize].pt[oPageSize]
|
130
|
-
}
|
131
|
-
}
|
132
|
-
}
|
133
|
-
if( pageWidth > 0 && pageHeight>0){
|
134
|
-
pageSize = {
|
135
|
-
width : pageWidth,
|
136
|
-
height: pageHeight
|
137
|
-
}
|
138
|
-
pageOrientation = undefined;
|
139
|
-
}
|
140
|
-
return {pageSize,pageFormat,pageOrientation}
|
141
|
-
}
|
142
|
-
export const getPageMargins = (options)=>{
|
143
|
-
options = defaultObj(options);
|
144
|
-
const ret = [20,20,20,30];
|
145
|
-
const margins = ['left','top','right','bottom']
|
146
|
-
for(let i in margins){
|
147
|
-
const m = margins[i]+"Margin";
|
148
|
-
if(isNumber(options[m])){
|
149
|
-
ret [i]=options[m]
|
150
|
-
}
|
151
|
-
if(i == 3){
|
152
|
-
ret[i] = Math.max(ret[i],30)
|
153
|
-
}
|
154
|
-
}
|
155
|
-
return ret;
|
156
|
-
}
|
157
|
-
export const getFooter = (opts)=>{
|
158
|
-
opts = defaultObj(opts);
|
159
|
-
const margin = [10,0,10,10];
|
160
|
-
let footerCopyRight = opts.footerCopyRight === false ? "" : defaultStr(opts.footerCopyRight,undefined)
|
161
|
-
if((footerCopyRight)){
|
162
|
-
footerCopyRight = {
|
163
|
-
text : toPdfMakeObj(footerCopyRight),
|
164
|
-
alignment : "center",
|
165
|
-
fontSize:10,
|
166
|
-
margin,
|
167
|
-
color : Colors.isValid(opts.footerCopyRightColor)? opts.footerCopyRightColor : undefined
|
168
|
-
}
|
169
|
-
}
|
170
|
-
|
171
|
-
let devWebsite = isValidUrl(APP.getDevWebsite()) && APP.getDevWebsite() || undefined;
|
172
|
-
return function(currentPage, pageCount, pageSize) {
|
173
|
-
showPreloader("page "+pageCount.formatNumber()+"/"+defaultNumber(pageCount).formatNumber());
|
174
|
-
currentPage = isNumber(currentPage)? currentPage.formatNumber().toString() : currentPage.toString();
|
175
|
-
pageCount = pageCount > 2 ? {
|
176
|
-
fontSize: 9,
|
177
|
-
width : "140",
|
178
|
-
text:[
|
179
|
-
{
|
180
|
-
text : ' Page '+currentPage + '/' + pageCount.formatNumber(),
|
181
|
-
bold : true,
|
182
|
-
},
|
183
|
-
{
|
184
|
-
text: ['\n[ powered by ',{text:APP.getName(),link:devWebsite,color:'red'}," ]"],
|
185
|
-
fontSize : 9,
|
186
|
-
italics : true,
|
187
|
-
link : devWebsite
|
188
|
-
}
|
189
|
-
],
|
190
|
-
margin : [5,0,20,0],
|
191
|
-
alignment: 'right'
|
192
|
-
} : null;
|
193
|
-
if(isObj(footerCopyRight) && footerCopyRight.text && pageCount){
|
194
|
-
footerCopyRight.alignment = "left";
|
195
|
-
footerCopyRight.width = "*"
|
196
|
-
}
|
197
|
-
const content = pageCount ? [
|
198
|
-
{
|
199
|
-
columns: [
|
200
|
-
footerCopyRight,
|
201
|
-
pageCount
|
202
|
-
],
|
203
|
-
columnGap: 10,
|
204
|
-
margin
|
205
|
-
}
|
206
|
-
] : footerCopyRight? [footerCopyRight] : undefined;
|
207
|
-
return content;
|
208
|
-
}
|
209
|
-
}
|
210
|
-
|
211
|
-
export const getTableHeaderFillColor = ()=>{
|
212
|
-
const tbFillColor = appConfig.get("tableHeaderPrintFillColor");
|
213
|
-
if(Colors.isValidColor(tbFillColor)){
|
214
|
-
tableHeaderPrintFillColor = tbFillColor;
|
215
|
-
}
|
216
|
-
return tableHeaderPrintFillColor;
|
217
|
-
}
|
218
|
-
export const getSubTotalFillColor = ()=>{
|
219
|
-
const sColor = appConfig.get("subTotalPrintTableColor");
|
220
|
-
if(Colors.isValidColor(sColor)){
|
221
|
-
subTotalFillColor = sColor;
|
222
|
-
}
|
223
|
-
return subTotalFillColor;
|
224
|
-
}
|
225
|
-
export const getSubTotalTitleFillColor = ()=>{
|
226
|
-
const stColor = appConfig.get("subTotalTitlePrintTableColor");
|
227
|
-
if(Colors.isValidColor(stColor)){
|
228
|
-
subTotalTitleFillColor = stColor;
|
229
|
-
}
|
230
|
-
return subTotalTitleFillColor;
|
231
|
-
}
|
232
|
-
export const getTotalPrintTableTextColor = ()=>{
|
233
|
-
const tPColor = appConfig.get("totalPrintTableTextColor");
|
234
|
-
if(Colors.isValidColor(tPColor)){
|
235
|
-
totalPrintTableTextColor = tPColor;
|
236
|
-
}
|
237
|
-
return totalPrintTableTextColor;
|
238
|
-
}
|
239
|
-
/**** retourne l'espace entre les colonnes des entêtes du document, espace entre la colonnes du tiers et celle de la société */
|
240
|
-
export const getHeaderColumnGap = ()=>{
|
241
|
-
return 10;
|
242
|
-
}
|
243
|
-
export const getCompanyHeader = (options)=>{
|
244
|
-
options = defaultObj(options);
|
245
|
-
const fontSize = defaultNumber(options.fontSize,11);
|
246
|
-
let bold = true;
|
247
|
-
let headerColumn = []
|
248
|
-
let displayLogo = defaultVal(options.displayLogo ,true)? true : false;
|
249
|
-
const displaySocialReason = defaultVal(options.displaySocialReason,true)?true : false;
|
250
|
-
const displayEmailOnHeader = defaultVal(options.displayEmailOnHeader,false),
|
251
|
-
displayFaxOnHeader = defaultVal(options.displayFaxOnHeader,false),
|
252
|
-
ignoreCompanyLogoOnPrinting = false;
|
253
|
-
const logo = displayLogo && !ignoreCompanyLogoOnPrinting && isDataURL(logo)? logo : undefined;
|
254
|
-
if(logo){
|
255
|
-
headerColumn.push({
|
256
|
-
image : logo
|
257
|
-
})
|
258
|
-
}
|
259
|
-
if(displaySocialReason && isNonNullString(options.companyName)){
|
260
|
-
headerColumn.push({text:options.companyName+"\n",fontSize:13,bold})
|
261
|
-
}
|
262
|
-
if(displaySocialReason && isNonNullString(options.socialReason)){
|
263
|
-
headerColumn.push({
|
264
|
-
text : options.socialReason+"\n",
|
265
|
-
fontSize,
|
266
|
-
bold:!bold
|
267
|
-
})
|
268
|
-
}
|
269
|
-
if(options.displayIdentifier){
|
270
|
-
if(isNonNullString(options.companyIdentifier)){
|
271
|
-
headerColumn.push({
|
272
|
-
text : options.companyIdentifier+((isNonNullString(options.sellerId)? ((", "+options.sellerId)):"")),
|
273
|
-
fontSize,
|
274
|
-
bold
|
275
|
-
})
|
276
|
-
}
|
277
|
-
}
|
278
|
-
options.displayAddress = defaultVal(options.displayAddress,true);
|
279
|
-
//afficher les informations sur l'addresse de la company
|
280
|
-
if(displaySocialReason && options.displayAddress){
|
281
|
-
let address = "";
|
282
|
-
if(isNonNullString(options.companyCity)){
|
283
|
-
address+= options.companyCity;
|
284
|
-
}
|
285
|
-
if(isNonNullString(options.companyAddress)){
|
286
|
-
address +=(isNonNullString(address)?", ":"")+options.companyAddress;
|
287
|
-
}
|
288
|
-
if(isNonNullString(address)){
|
289
|
-
headerColumn.push({
|
290
|
-
text : ('Situé à '+address).toUpperCase(),
|
291
|
-
fontSize,
|
292
|
-
bold:!bold
|
293
|
-
})
|
294
|
-
}
|
295
|
-
}
|
296
|
-
let phone = defaultStr(options.companyPhone,options.companyTelephone);
|
297
|
-
if(displaySocialReason){
|
298
|
-
if(isNonNullString(options.companyMobile1)){
|
299
|
-
phone += (isNonNullString(phone)?"/":"")+options.companyMobile1
|
300
|
-
}
|
301
|
-
if(isNonNullString(options.companyMobile2)){
|
302
|
-
phone += (isNonNullString(phone)?"/":"")+options.companyMobile2;
|
303
|
-
}
|
304
|
-
if(isNonNullString(phone)){
|
305
|
-
headerColumn.push({
|
306
|
-
text : "TEL : "+phone,
|
307
|
-
fontSize,
|
308
|
-
bold
|
309
|
-
})
|
310
|
-
}
|
311
|
-
if(displayFaxOnHeader && isNonNullString(COMPANY.fax)){
|
312
|
-
headerColumn.push({
|
313
|
-
text : "FAX : "+COMPANY.fax,
|
314
|
-
fontSize,
|
315
|
-
bold
|
316
|
-
})
|
317
|
-
}
|
318
|
-
if(options.displayPostBox && isNonNullString(COMPANY.postBox)){
|
319
|
-
headerColumn.push({
|
320
|
-
text : "BP : "+COMPANY.postBox,
|
321
|
-
fontSize,
|
322
|
-
bold
|
323
|
-
})
|
324
|
-
}
|
325
|
-
if(displayEmailOnHeader && isNonNullString(COMPANY.email)){
|
326
|
-
headerColumn.push({
|
327
|
-
text : "EMAIL : "+COMPANY.email,
|
328
|
-
fontSize,
|
329
|
-
bold
|
330
|
-
})
|
331
|
-
}
|
332
|
-
}
|
333
|
-
return headerColumn;
|
334
|
-
}
|
335
|
-
export const getThirdPartyHeader = (options)=>{
|
336
|
-
options = defaultObj(options);
|
337
|
-
let {thirdParty} = options;
|
338
|
-
const thirdPartyContent = []
|
339
|
-
thirdParty = defaultObj(thirdParty);
|
340
|
-
if(isNonNullString(thirdParty.code) && isNonNullString(thirdParty.label)){
|
341
|
-
thirdPartyContent.push({
|
342
|
-
text : "["+defaultStr(thirdParty.code)+"] "+defaultStr(thirdParty.label),
|
343
|
-
bold:true
|
344
|
-
})
|
345
|
-
}
|
346
|
-
if(options.displayThirdPartiesIdentifier){
|
347
|
-
if(isNonNullString(thirdParty.identifier)){
|
348
|
-
thirdPartyContent.push({
|
349
|
-
text : thirdParty.identifier+((isNonNullString(thirdParty.sellerId)? ((", "+thirdParty.sellerId)):"")),
|
350
|
-
bold:true
|
351
|
-
})
|
352
|
-
}
|
353
|
-
}
|
354
|
-
let tpPhone = "";
|
355
|
-
if(isNonNullString(thirdParty.phone)){
|
356
|
-
tpPhone = thirdParty.phone;
|
357
|
-
}
|
358
|
-
if(isNonNullString(thirdParty.mobile1)){
|
359
|
-
tpPhone += (isNonNullString(tpPhone)?("/"):"")+thirdParty.mobile1;
|
360
|
-
}
|
361
|
-
if(isNonNullString(thirdParty.mobile2)){
|
362
|
-
tpPhone += (isNonNullString(tpPhone)?("/"):"")+thirdParty.mobile2;
|
363
|
-
}
|
364
|
-
if(isNonNullString(tpPhone)){
|
365
|
-
thirdPartyContent.push({
|
366
|
-
text : tpPhone,
|
367
|
-
bold : true
|
368
|
-
})
|
369
|
-
}
|
370
|
-
if(isNonNullString(thirdParty.fax)){
|
371
|
-
thirdPartyContent.push({
|
372
|
-
text : "FAX : "+thirdParty.fax,
|
373
|
-
bold : true
|
374
|
-
})
|
375
|
-
}
|
376
|
-
|
377
|
-
if(isNonNullString(thirdParty.address)){
|
378
|
-
thirdPartyContent.push({
|
379
|
-
text : thirdParty.address
|
380
|
-
})
|
381
|
-
}
|
382
|
-
return {thirdParty,content:thirdPartyContent};
|
383
|
-
}
|
384
|
-
|
385
|
-
/*** retourne les options des champs à exporter
|
386
|
-
* @param {object}
|
387
|
-
* {
|
388
|
-
* fieldsToExport : //les items de la liste des champs à exporter
|
389
|
-
* groupableFields{arrayOrObject} : //la liste des champs pouvant être groupés dans la selection
|
390
|
-
* groupable | groupBy : //si les champs de type decimal pouvont être groupé
|
391
|
-
* }
|
392
|
-
*
|
393
|
-
*/
|
394
|
-
export const getFieldsToExportSettings = (args)=>{
|
395
|
-
let {groupable,fieldsToExport,groupableFields,groupBy,fields} = defaultObj(args);
|
396
|
-
fields = isObjOrArray(fieldsToExport)? fieldsToExport : fields;
|
397
|
-
groupBy = defaultVal(groupBy,groupable);
|
398
|
-
if(groupBy !== false){
|
399
|
-
groupBy = true;
|
400
|
-
let _hasGroupedFields = false;
|
401
|
-
groupableFields = isObjOrArray(groupableFields)? groupableFields : undefined;
|
402
|
-
if(!groupableFields){
|
403
|
-
groupableFields = [];
|
404
|
-
Object.map(fields,(field,i)=>{
|
405
|
-
if(isObj(field)){
|
406
|
-
field.code = defaultStr(field.code,i);
|
407
|
-
let type = defaultStr(field.type,'text').toLowerCase();
|
408
|
-
let canP = false;
|
409
|
-
if(type.contains("select")){
|
410
|
-
if(!field.multiple) {
|
411
|
-
canP = true;
|
412
|
-
}
|
413
|
-
} else canP = true;
|
414
|
-
if(canP){
|
415
|
-
groupableFields.push(field);
|
416
|
-
_hasGroupedFields = true;
|
417
|
-
}
|
418
|
-
}
|
419
|
-
})
|
420
|
-
}
|
421
|
-
groupBy = _hasGroupedFields || isObjOrArray(groupableFields)? true : false;
|
422
|
-
if(!_hasGroupedFields && Object.size(groupableFields)<=0){
|
423
|
-
groupBy = false;
|
424
|
-
}
|
425
|
-
}
|
426
|
-
let ret = {}
|
427
|
-
let itemValue = ({item,index})=> isNonNullString(item)? item : isObj(item)? (defaultStr(item.code,index)):index,
|
428
|
-
renderItem = ({item,index})=>isNonNullString(item)? item : isObj(item)? (defaultStr(item.label,item.text)):index;
|
429
|
-
if(isObjOrArray(fields) && Object.size(fields)>0){
|
430
|
-
ret.fieldsToExport = {
|
431
|
-
text : 'Champs à exporter',
|
432
|
-
type : 'select',
|
433
|
-
items : fields,
|
434
|
-
itemValue,
|
435
|
-
renderItem,
|
436
|
-
required : true,
|
437
|
-
multiple : true,
|
438
|
-
}
|
439
|
-
ret.doesNotDisplayTotalLine = {
|
440
|
-
text : "Ne pas afficher la ligne total",
|
441
|
-
type :'switch',
|
442
|
-
defaultValue : 0
|
443
|
-
}
|
444
|
-
}
|
445
|
-
if(groupBy){
|
446
|
-
ret.groupByField = {
|
447
|
-
text : 'Totaux Groupés par',
|
448
|
-
title : 'Sélectionner le champ à partir duquel vous désirez grouper les totaux des champs de type numbre',
|
449
|
-
type : 'select',
|
450
|
-
multiple : false,
|
451
|
-
items : groupableFields,
|
452
|
-
itemValue,
|
453
|
-
renderItem
|
454
|
-
}
|
455
|
-
ret.groupByFieldDivider = {
|
456
|
-
text : 'Sous totaux Groupés par',
|
457
|
-
title : 'Sélectionner le champ à partir duquel les sous totaux seront groupés',
|
458
|
-
type : 'select',
|
459
|
-
multiple : false,
|
460
|
-
items : groupableFields,
|
461
|
-
renderItem
|
462
|
-
}
|
463
|
-
ret.sortFieldBy = {
|
464
|
-
text : 'Tableau trié par',
|
465
|
-
title : 'Sélectionner le champ à partir duquel vous désirez trier le tableau',
|
466
|
-
type : 'select',
|
467
|
-
multiple : false,
|
468
|
-
items : groupableFields,
|
469
|
-
renderItem
|
470
|
-
}
|
471
|
-
ret.displayOnlyTotals = {
|
472
|
-
type : 'switch',
|
473
|
-
text : 'Afficher uniquement les totaux',
|
474
|
-
defaultValue : 0,
|
475
|
-
}
|
476
|
-
}
|
477
|
-
return ret;
|
478
|
-
}
|
479
|
-
|
480
|
-
/*** crée un contenu de type tableau :
|
481
|
-
* @param {object} de la forme :
|
482
|
-
* {
|
483
|
-
* data {Array|Object} : l'ensemble des données à utiliser pour la création du tableau
|
484
|
-
* fields {Object} : la liste des champs à utiliser pour la création du tableau
|
485
|
-
* header {func}, la fonction prenant en paramètre un champ puis retournant une chaine de caractère à utiliser comme entête du tableau
|
486
|
-
* fieldsToExport {Array} : la liste des code des champs à exporter parmis les champs fields
|
487
|
-
* headerRows {number>=1} : Le nombre d'entêtes de lignes à repêter pour le tableau,
|
488
|
-
* labelFields {array, default[label]} : La liste des codes champs de type label, ie les champs dont la longueur sera définit à *
|
489
|
-
* groupByField {string} : le code du champ par lequel les données seront groupées
|
490
|
-
* total|displayTotal {bool}, ///si les totaux des colonnes du tableau seront affichés
|
491
|
-
* groupByFieldTitle{string|func} //titre de la colonne de groupage
|
492
|
-
* mutator : ({data})=> data , la fonction utilisée pour éventuellement muter le data avant calcul des valeurs
|
493
|
-
* }
|
494
|
-
* @return {null|array}, si la valeur de retour est un tableau , alors elle est de la forme :
|
495
|
-
* 0 => {
|
496
|
-
table : {
|
497
|
-
body : bodyContent,
|
498
|
-
widths : widths,
|
499
|
-
headerRows,
|
500
|
-
},
|
501
|
-
width:"auto",
|
502
|
-
margin : [0,10,0,0]
|
503
|
-
},
|
504
|
-
1 => {
|
505
|
-
titre de la colonne groupe
|
506
|
-
},
|
507
|
-
2 => {
|
508
|
-
....colonnne de groupage
|
509
|
-
}
|
510
|
-
*/
|
511
|
-
export const createTable = (args)=>{
|
512
|
-
let {data,tableMargin,rowsFormatted,fieldsToExport,mutator,labelFields,total,displayTotal,sortFieldBy,groupByField,groupByFieldDivider,groupByFieldTitle,fields,header,headerRows,displayOnlyTotals,doesNotDisplayTotalLine,headerOptions} = defaultObj(args);
|
513
|
-
let bodyContent = [];
|
514
|
-
fields = defaultObj(fields);
|
515
|
-
groupByFieldDivider = defaultStr(groupByFieldDivider);
|
516
|
-
fieldsToExport = defaultArray(fieldsToExport);
|
517
|
-
labelFields = defaultArray(labelFields);
|
518
|
-
if(labelFields.length ==0) labelFields = ['label'];
|
519
|
-
header = defaultFunc(header,({code,label,text})=>text);
|
520
|
-
if(fieldsToExport.length ==0 ){
|
521
|
-
Object.map(fields,(f,code)=>{
|
522
|
-
if(isObj(f)){
|
523
|
-
fieldsToExport.push(code);
|
524
|
-
}
|
525
|
-
})
|
526
|
-
}
|
527
|
-
let widths = []
|
528
|
-
let tHeadersCode = [];
|
529
|
-
let hasFLabelField = false;
|
530
|
-
subTotalFillColor = getSubTotalFillColor();
|
531
|
-
subTotalTitleFillColor = getSubTotalTitleFillColor();
|
532
|
-
total = defaultVal(doesNotDisplayTotalLine !== undefined? !doesNotDisplayTotalLine : undefined,total,displayTotal,true);
|
533
|
-
bodyContent.push(createTableHeader(fieldsToExport.map((code,i)=>{
|
534
|
-
if(!isNonNullString(code)) return undefined;
|
535
|
-
let f = fields[code];
|
536
|
-
if(isObj(f)){
|
537
|
-
f.label = f.text = defaultStr(f.label,f.text)
|
538
|
-
let r = header(f);
|
539
|
-
if(isNonNullString(r)){
|
540
|
-
if(!hasFLabelField && arrayValueExists(labelFields,code)){
|
541
|
-
widths.push("*");
|
542
|
-
hasFLabelField = true;
|
543
|
-
} else {
|
544
|
-
widths.push("auto");
|
545
|
-
}
|
546
|
-
tHeadersCode.push(code);
|
547
|
-
return r;
|
548
|
-
}
|
549
|
-
}
|
550
|
-
return undefined;
|
551
|
-
}),headerOptions));
|
552
|
-
if(tHeadersCode.length <=0){
|
553
|
-
///aucune entête à exporter
|
554
|
-
return undefined;
|
555
|
-
}
|
556
|
-
headerRows = Math.max(defaultNumber(headerRows),1);
|
557
|
-
if(!hasFLabelField && widths.length > 0){
|
558
|
-
widths[widths.length-1] = "*";
|
559
|
-
}
|
560
|
-
let totalFooter = {}, totalFooterLength = 0,totalSubFooters={},previousGroupByFieldDiverValue = undefined,currentGroupByFieldDiverValue = "";
|
561
|
-
let groupBy = {};
|
562
|
-
let canGroupData = isNonNullString(groupByField)? true : false;
|
563
|
-
let groupByFieldText = groupByField;
|
564
|
-
if(canGroupData && isObj(fields[groupByField])){
|
565
|
-
let gb = fields[groupByField];
|
566
|
-
groupByFieldText = defaultStr(gb.label,gb.text,groupByField);
|
567
|
-
}
|
568
|
-
mutator = defaultFunc(mutator,({data})=>data);
|
569
|
-
let groupByFields = {},groupByFieldsFormats = {};
|
570
|
-
|
571
|
-
let groupByFieldDividerValue = "";
|
572
|
-
let groupByFieldDividerObj = groupByFieldDivider ? defaultObj(fields[groupByFieldDivider]) : {};
|
573
|
-
if(!groupByFieldDividerObj.label && !groupByFieldDividerObj.text) groupByFieldDivider = undefined;
|
574
|
-
let groupByFieldDividerLabel = defaultStr(groupByFieldDividerObj.text,groupByFieldDividerObj.label,groupByFieldDivider);
|
575
|
-
let groupByFieldDividerTexto = " ["+groupByFieldDividerLabel.toUpperCase()+"]";
|
576
|
-
let returnArray = isArray(data)? true : false;
|
577
|
-
let getItem = (item,fieldName,extra)=>{
|
578
|
-
let field = fields[fieldName];
|
579
|
-
return formatField({...defaultObj(extra),rowsFormatted,format:"EXCEL",field,columnField:fieldName,rowData:item});
|
580
|
-
}
|
581
|
-
if(sortFieldBy && typeof sortFieldBy =='string'){
|
582
|
-
data = sortBy(data,{column:sortFieldBy,returnArray,getItem});
|
583
|
-
}
|
584
|
-
if((groupByFieldDivider && groupByFieldDivider !== sortFieldBy)){
|
585
|
-
data = sortBy(data,{column:groupByFieldDivider,returnArray,getItem});
|
586
|
-
}
|
587
|
-
let totalSubFootersTmp = {};
|
588
|
-
let allData = data;
|
589
|
-
let mustBreakSubFooter = false;
|
590
|
-
let hasSubFooters;
|
591
|
-
let subTotalFontSize = 14;
|
592
|
-
Object.map(allData,(data)=>{
|
593
|
-
if(!isObj(data)) return null;
|
594
|
-
let ret = [];
|
595
|
-
//totalSubFootersTmp = {}
|
596
|
-
mustBreakSubFooter = false;
|
597
|
-
data = mutator({data,context:this,groupBy,groupByField,fieldsToExport:tHeadersCode});
|
598
|
-
if(groupByFieldDivider){
|
599
|
-
groupByFieldDividerValue = getItem(data,groupByFieldDivider,{formatResult:true});
|
600
|
-
}
|
601
|
-
if(total && groupByFieldDividerValue){
|
602
|
-
if(previousGroupByFieldDiverValue !== groupByFieldDividerValue){
|
603
|
-
totalSubFootersTmp = totalSubFooters;
|
604
|
-
hasSubFooters = true;
|
605
|
-
totalSubFooters = {}
|
606
|
-
mustBreakSubFooter = true;
|
607
|
-
}
|
608
|
-
currentGroupByFieldDiverValue = previousGroupByFieldDiverValue;
|
609
|
-
previousGroupByFieldDiverValue = groupByFieldDividerValue;
|
610
|
-
}
|
611
|
-
|
612
|
-
tHeadersCode.map((f,i)=>{
|
613
|
-
let field = fields[f];
|
614
|
-
let type = defaultStr(field.type).toLowerCase().trim();
|
615
|
-
let fFormat = defaultStr(field.format).toLowerCase();
|
616
|
-
if(fFormat =="money" || fFormat =="number"){
|
617
|
-
type = "number";
|
618
|
-
}
|
619
|
-
if(type == 'decimal'){
|
620
|
-
type = "number";
|
621
|
-
}
|
622
|
-
let v = getItem(data,f);
|
623
|
-
switch(type){
|
624
|
-
case 'number':
|
625
|
-
v = defaultNumber(v)
|
626
|
-
if(total) {
|
627
|
-
totalFooterLength++;
|
628
|
-
if(groupByFieldDividerValue){
|
629
|
-
if(mustBreakSubFooter){
|
630
|
-
totalSubFooters [f] = v;
|
631
|
-
} else {
|
632
|
-
totalSubFooters[f] +=v;
|
633
|
-
}
|
634
|
-
}
|
635
|
-
totalFooter[f]= defaultNumber(totalFooter[f])+v;
|
636
|
-
}
|
637
|
-
let gbFieldC = getItem(data,groupByField,{formatResult:true});
|
638
|
-
if(canGroupData && gbFieldC){
|
639
|
-
groupByFields[f]= defaultStr(field.label,field.text);
|
640
|
-
groupByFieldsFormats[f] = fFormat;
|
641
|
-
groupBy[gbFieldC] = defaultObj(groupBy[gbFieldC]);
|
642
|
-
groupBy[gbFieldC][f]= defaultNumber(groupBy[gbFieldC][f])
|
643
|
-
groupBy[gbFieldC][f] +=v;
|
644
|
-
}
|
645
|
-
if(fFormat === 'money'){
|
646
|
-
v = v.formatMoney()
|
647
|
-
} else {
|
648
|
-
v = v.formatNumber();
|
649
|
-
}
|
650
|
-
break;
|
651
|
-
case 'select':
|
652
|
-
if(isObjOrArray(field.items)){
|
653
|
-
for(let i in field.items){
|
654
|
-
if(field.items[i] && field.items[i].code == v){
|
655
|
-
v = defaultStr(field.items[i].label,field.items[i].text,v);
|
656
|
-
break;
|
657
|
-
}
|
658
|
-
}
|
659
|
-
}
|
660
|
-
break;
|
661
|
-
case 'switch':
|
662
|
-
v = defaultVal(v,field.defaultValue);
|
663
|
-
if(v == field.checkedValue){
|
664
|
-
v = defaultStr(field.checkedLabel,field.checkedTooltip,v);
|
665
|
-
} else if(v === field.uncheckedValue){
|
666
|
-
v = defaultStr(field.uncheckedLabel,field.uncheckedTooltip,v);
|
667
|
-
}
|
668
|
-
break;
|
669
|
-
case 'date':
|
670
|
-
v = defaultStr(APP.date.parse2Format(v),v);
|
671
|
-
break;
|
672
|
-
default :
|
673
|
-
break;
|
674
|
-
}
|
675
|
-
if(total && !isDecimal(totalFooter[f])){
|
676
|
-
totalFooter[f] ="";
|
677
|
-
if(groupByFieldDividerValue){
|
678
|
-
totalSubFooters[f] = "";
|
679
|
-
}
|
680
|
-
}
|
681
|
-
ret.push(defaultStr(v));
|
682
|
-
})
|
683
|
-
if(!displayOnlyTotals){
|
684
|
-
if(totalFooterLength && mustBreakSubFooter){
|
685
|
-
let tmp = [];
|
686
|
-
Object.map(totalSubFootersTmp,(t,i)=>{
|
687
|
-
if(isDecimal(t)){
|
688
|
-
if(defaultStr(fields[i].format).toLowerCase() === 'money'){
|
689
|
-
totalSubFootersTmp[i] = t.formatMoney();
|
690
|
-
} else totalSubFootersTmp[i] = t.formatNumber();
|
691
|
-
}
|
692
|
-
tmp.push({
|
693
|
-
text : totalSubFootersTmp[i],
|
694
|
-
fontSize:subTotalFontSize,
|
695
|
-
bold:true,
|
696
|
-
//fillColor : "#F5C6CB",
|
697
|
-
fillColor : subTotalFillColor,
|
698
|
-
//color : 'red',
|
699
|
-
alignment : 'center',
|
700
|
-
})
|
701
|
-
})
|
702
|
-
if(tmp.length && currentGroupByFieldDiverValue){
|
703
|
-
let tpt = [{
|
704
|
-
text : "TOTAL ["+currentGroupByFieldDiverValue.toUpperCase()+"]"+groupByFieldDividerTexto,
|
705
|
-
fontSize:subTotalFontSize,
|
706
|
-
colSpan : tmp.length,
|
707
|
-
fillColor : subTotalTitleFillColor,
|
708
|
-
alignment : 'center',
|
709
|
-
}]
|
710
|
-
for(let i =1;i <tmp.length;i++){
|
711
|
-
tpt.push({text:''});
|
712
|
-
}
|
713
|
-
bodyContent.push(tpt);
|
714
|
-
bodyContent.push(tmp)
|
715
|
-
}
|
716
|
-
}
|
717
|
-
bodyContent.push(ret);
|
718
|
-
}
|
719
|
-
})
|
720
|
-
let footer = [];
|
721
|
-
if(totalFooterLength){
|
722
|
-
if(hasSubFooters){
|
723
|
-
let tmp = [];
|
724
|
-
totalSubFootersTmp = totalSubFooters;
|
725
|
-
Object.map(totalSubFootersTmp,(t,i)=>{
|
726
|
-
if(isDecimal(t)){
|
727
|
-
if(defaultStr(fields[i].format).toLowerCase() === 'money'){
|
728
|
-
totalSubFootersTmp[i] = t.formatMoney();
|
729
|
-
} else totalSubFootersTmp[i] = t.formatNumber();
|
730
|
-
}
|
731
|
-
tmp.push({
|
732
|
-
text : totalSubFootersTmp[i],
|
733
|
-
fontSize:subTotalFontSize,
|
734
|
-
bold:true,
|
735
|
-
//fillColor : "#F5C6CB",
|
736
|
-
fillColor : subTotalFillColor,
|
737
|
-
//color : 'red',
|
738
|
-
alignment : 'center',
|
739
|
-
})
|
740
|
-
})
|
741
|
-
if(tmp.length && previousGroupByFieldDiverValue){
|
742
|
-
let tpt = [{
|
743
|
-
text : "TOTAL ["+previousGroupByFieldDiverValue.toUpperCase()+"]"+groupByFieldDividerTexto,
|
744
|
-
fontSize:subTotalFontSize,
|
745
|
-
colSpan : tmp.length,
|
746
|
-
fillColor : subTotalTitleFillColor,
|
747
|
-
alignment : 'center',
|
748
|
-
}]
|
749
|
-
for(let i =1;i <tmp.length;i++){
|
750
|
-
tpt.push({text:''});
|
751
|
-
}
|
752
|
-
bodyContent.push(tpt)
|
753
|
-
bodyContent.push(tmp)
|
754
|
-
}
|
755
|
-
}
|
756
|
-
Object.map(totalFooter,(t,i)=>{
|
757
|
-
if(isDecimal(t)){
|
758
|
-
if(defaultStr(fields[i].format).toLowerCase() === 'money'){
|
759
|
-
totalFooter[i] = t.formatMoney();
|
760
|
-
} else totalFooter[i] = t.formatNumber();
|
761
|
-
}
|
762
|
-
footer.push({
|
763
|
-
text : totalFooter[i],
|
764
|
-
fontSize:15,
|
765
|
-
bold:true,
|
766
|
-
fillColor : getTableHeaderFillColor(),
|
767
|
-
color : Colors.getContrast(getTableHeaderFillColor()),
|
768
|
-
//color : 'red',
|
769
|
-
alignment : 'center',
|
770
|
-
})
|
771
|
-
})
|
772
|
-
}
|
773
|
-
if(footer.length > 0) bodyContent.push(footer);
|
774
|
-
let sizeFields = Object.size(groupByFields);
|
775
|
-
let size = Object.size(groupBy);
|
776
|
-
let groupedTable = [],groupedTableWidths=[];
|
777
|
-
let canRenderFooter = false;
|
778
|
-
let groupByFieldTextBackup = groupByFieldText;
|
779
|
-
if(isFunction(groupByFieldTitle)){
|
780
|
-
groupByFieldText = groupByFieldTitle({text:groupByFieldText,label:groupByFieldText,data,groupBy})
|
781
|
-
} else {
|
782
|
-
groupByFieldText = ('Totaux [ ').toUpperCase()+groupByFieldText+" ]"
|
783
|
-
}
|
784
|
-
let totalCounter = size;
|
785
|
-
if(size>0 && sizeFields > 0){
|
786
|
-
let fontSize = 14
|
787
|
-
///les entêtes sont en colonnes et les valeurs en lignes
|
788
|
-
let gHeader = [];
|
789
|
-
let gbValue = (v,format)=>{
|
790
|
-
if(format == 'money'){
|
791
|
-
return v.formatMoney()
|
792
|
-
}
|
793
|
-
return v.formatNumber();
|
794
|
-
}
|
795
|
-
if((size < sizeFields ) && ( sizeFields > 5 || size <= tHeadersCode.length)){
|
796
|
-
/*** on transpose dès que le nombre d'éléments de totalisation est supérieur au nombre d'éléments d'entêtes de totaux et en même temps inférieur au nombre total d'éléments d'entêtes du tableau principal */
|
797
|
-
totalCounter = 0;
|
798
|
-
gHeader = createTableHeader(groupBy,({value,index})=>{
|
799
|
-
return index;
|
800
|
-
});
|
801
|
-
gHeader.unshift({text:'',fillColor:getTableHeaderFillColor()});
|
802
|
-
groupedTable.push(gHeader);
|
803
|
-
Object.map(groupByFields,(fText,f)=>{
|
804
|
-
let ret = [{text:fText,bold:true,fontSize}]
|
805
|
-
let canCount = totalCounter > 0 ? false : true;
|
806
|
-
Object.map(groupBy,(g)=>{
|
807
|
-
if(canCount) totalCounter+=1;
|
808
|
-
let v = gbValue(g[f],groupByFieldsFormats[f]);
|
809
|
-
ret.push({text:v,color:getTotalPrintTableTextColor(),alignment:'center',fontSize,bold:true})
|
810
|
-
})
|
811
|
-
groupedTable.push(ret);
|
812
|
-
});
|
813
|
-
} else {
|
814
|
-
gHeader.push(groupByFieldTextBackup)
|
815
|
-
Object.map(groupByFields,(f,v)=>{
|
816
|
-
gHeader.push(f);
|
817
|
-
})
|
818
|
-
gHeader = createTableHeader(gHeader,{alignment:'left'});
|
819
|
-
groupedTable.push(gHeader);
|
820
|
-
Object.map(groupBy,(g,i)=>{
|
821
|
-
let ret = [{text:i,bold:true,fontSize}]
|
822
|
-
Object.map(groupByFields,(text,f)=>{
|
823
|
-
let v = gbValue(g[f],groupByFieldsFormats[f]);
|
824
|
-
ret.push({text:v,color:getTotalPrintTableTextColor(),fontSize:fontSize,bold:true,alignment:'center'})
|
825
|
-
})
|
826
|
-
groupedTable.push(ret);
|
827
|
-
});
|
828
|
-
}
|
829
|
-
canRenderFooter = true;
|
830
|
-
for(let i =0;i<gHeader.length;i++){
|
831
|
-
groupedTableWidths.push("*");
|
832
|
-
}
|
833
|
-
}
|
834
|
-
if(tableMargin === false){
|
835
|
-
tableMargin = undefined;
|
836
|
-
} else if(isArray(tableMargin) && (tableMargin.length == 2 || tableMargin.length ==4)){
|
837
|
-
tableMargin.map(v=>{
|
838
|
-
if(!isDecimal(v)) tableMargin = undefined;
|
839
|
-
})
|
840
|
-
} else tableMargin = [0,10,0,5];
|
841
|
-
let ret = [!displayOnlyTotals? {
|
842
|
-
table : {
|
843
|
-
body : bodyContent,
|
844
|
-
widths : widths,
|
845
|
-
headerRows : 1,
|
846
|
-
},
|
847
|
-
width:"auto",
|
848
|
-
margin : tableMargin,
|
849
|
-
}: null]
|
850
|
-
if(canRenderFooter){
|
851
|
-
ret.push({
|
852
|
-
text: groupByFieldText+" ["+totalCounter.formatNumber()+"]",
|
853
|
-
margin : [0,0,0,5],
|
854
|
-
fontSize:15,
|
855
|
-
color : getTotalPrintTableTextColor(),
|
856
|
-
alignment : 'right',
|
857
|
-
bold:true
|
858
|
-
})
|
859
|
-
ret.push({
|
860
|
-
columns : [
|
861
|
-
{width : '*', text : ''},
|
862
|
-
{
|
863
|
-
width : 'auto',
|
864
|
-
table : {
|
865
|
-
body: groupedTable,
|
866
|
-
headerRows : 1,
|
867
|
-
widths : groupedTableWidths
|
868
|
-
},
|
869
|
-
margin : [0,0,0,5]
|
870
|
-
}
|
871
|
-
]
|
872
|
-
});
|
873
|
-
}
|
874
|
-
return ret;
|
875
|
-
}
|
876
|
-
let printTB = {
|
877
|
-
,
|
878
|
-
/**** permet de créer l'entête de la page à générer comme pdf
|
879
|
-
* @param : Object {
|
880
|
-
* ///PropType.array, le contenu à concaténer auprès du companyHeader
|
881
|
-
* ///tableau contenant le header à afficher côte à cote ou de manière repartie au companyHeader
|
882
|
-
* pageHeader : [
|
883
|
-
*
|
884
|
-
* ]
|
885
|
-
* }
|
886
|
-
*
|
887
|
-
*/
|
888
|
-
createPageHeader : (options)=>{
|
889
|
-
options = defaultObj(options);
|
890
|
-
let companyHeader = getCompanyHeader(options);
|
891
|
-
let hasCompany = companyHeader && companyHeader.length> 0;
|
892
|
-
let dynamicPageHeaderWidth = defaultVal(options.dynamicPageHeaderWidth,1);
|
893
|
-
let pageHeader = defaultArray(options.pageHeader);
|
894
|
-
let columnGap = getHeaderColumnGap();
|
895
|
-
let hasLogo = hasCompany && isObj(companyHeader[0]) && companyHeader[0].image ? true : false;
|
896
|
-
if(!pageHeader.length){
|
897
|
-
pageHeader = undefined;
|
898
|
-
}
|
899
|
-
let margin = [ 0, 0, 0, 8 ]
|
900
|
-
let ret = {
|
901
|
-
margin
|
902
|
-
}
|
903
|
-
let hasColumns = false;
|
904
|
-
if(dynamicPageHeaderWidth){
|
905
|
-
pageHeader = pageHeader || [];
|
906
|
-
companyHeader = companyHeader || []
|
907
|
-
//le logo seule prend quatre lignes
|
908
|
-
let companyHeaderLength = hasCompany ? (hasLogo? (companyHeader.length+4):companyHeader.length) : 0;
|
909
|
-
let diff = pageHeader.length - companyHeaderLength;
|
910
|
-
if(diff > 1){
|
911
|
-
let div = Math.floor(diff/2);
|
912
|
-
for(let i = div; i >= 1;i--){
|
913
|
-
if(i >= pageHeader.length) continue;
|
914
|
-
companyHeader.push(pageHeader[pageHeader.length-i]);
|
915
|
-
delete pageHeader[pageHeader.length-i];
|
916
|
-
}
|
917
|
-
} else if(companyHeader.length > pageHeader.length){
|
918
|
-
let div = Math.floor((companyHeader.length-pageHeader.length)/2);
|
919
|
-
div += hasLogo?2:0;
|
920
|
-
for(let i = div; i >= 1;i--){
|
921
|
-
if(i >= companyHeader.length) continue;
|
922
|
-
pageHeader.push(companyHeader[companyHeader.length-i]);
|
923
|
-
delete companyHeader[companyHeader.length-i];
|
924
|
-
}
|
925
|
-
}
|
926
|
-
hasCompany = companyHeader.length;
|
927
|
-
pageHeader = pageHeader.length ? pageHeader : undefined;
|
928
|
-
}
|
929
|
-
let pageHeaderContent = [];
|
930
|
-
if(hasCompany){
|
931
|
-
if(pageHeader){
|
932
|
-
pageHeaderContent.push(companyHeader);
|
933
|
-
pageHeaderContent.push(pageHeader);
|
934
|
-
hasColumns = true;
|
935
|
-
} else pageHeaderContent = companyHeader;
|
936
|
-
} else if(pageHeader){
|
937
|
-
pageHeaderContent = pageHeader;
|
938
|
-
}
|
939
|
-
if(hasColumns){
|
940
|
-
ret.columns = pageHeaderContent;
|
941
|
-
ret.columnGap = columnGap;
|
942
|
-
} else {
|
943
|
-
if(isArray(pageHeaderContent)){
|
944
|
-
ret = pageHeaderContent;
|
945
|
-
ret.push({text:'',margin})
|
946
|
-
} else {
|
947
|
-
ret = {text:pageHeaderContent,margin}
|
948
|
-
}
|
949
|
-
}
|
950
|
-
return ret;
|
951
|
-
},
|
952
|
-
/**** retourne la liste des paramètres utiles pour la création d'un tableau à imprimer
|
953
|
-
* @param {
|
954
|
-
* table, tableName : le nom de la table dans la base de données, si null ou innexistant, retourne null
|
955
|
-
* getPrintSettings : fonction permettant de récupérer les parmètres d'impression de la table à exporter
|
956
|
-
* }
|
957
|
-
*/
|
958
|
-
getSettingsForPrintTableData : (opts)=>{
|
959
|
-
if(isNonNullString(opts)){
|
960
|
-
opts = {table:opts};
|
961
|
-
}
|
962
|
-
opts = defaultObj(opts);
|
963
|
-
let {table,tableName} = opts;
|
964
|
-
tableName = defaultStr(table,tableName).trim();
|
965
|
-
if(!tableName) return null;
|
966
|
-
const {constants} = require("$database");
|
967
|
-
table = defaultObj(constants.TABLES[tableName] || constants.TABLES[tableName.toUpperCase()]);
|
968
|
-
let {notify} = require("$components/Dialog")
|
969
|
-
if(isObj(table) && isObj(table.export) && isObj(table.export.EXCEL)){
|
970
|
-
let exportFields = isFunction(table.export.getFields) ? table.export.getFields() : table.fields;
|
971
|
-
let _formatRow = require("$database/exporter/formatRow");
|
972
|
-
let formatRow = defaultFunc(table.export.EXCEL.row,_formatRow)
|
973
|
-
if(opts.defaultFields){
|
974
|
-
Object.map(require("$database/defaultFields"),(field,i)=>{
|
975
|
-
if(!isObj(exportFields[i])){
|
976
|
-
exportFields[i] = {...field};
|
977
|
-
}
|
978
|
-
});
|
979
|
-
}
|
980
|
-
let tableLabel = defaultStr(table.label,table.text)
|
981
|
-
return {
|
982
|
-
exportFields,
|
983
|
-
tableLabel,
|
984
|
-
tableObj : table,
|
985
|
-
createTable : ({data,printInExcelDocument,fieldsToExport,fileName,filename,...options}) =>{
|
986
|
-
options = defaultObj(options)
|
987
|
-
let allData = [],printingData = [];
|
988
|
-
if(printInExcelDocument){
|
989
|
-
showPreloader("préparation des données excel....");
|
990
|
-
}
|
991
|
-
Object.map(data,(doc)=>{
|
992
|
-
let d = formatRow({
|
993
|
-
allData,
|
994
|
-
options,
|
995
|
-
data : doc,
|
996
|
-
rowData : doc,
|
997
|
-
formatRow : _formatRow,
|
998
|
-
exportFields : fieldsToExport,
|
999
|
-
table:tableName.toUpperCase(),
|
1000
|
-
format :"EXCEL",
|
1001
|
-
fields : exportFields,
|
1002
|
-
});
|
1003
|
-
if(isObj(d)){
|
1004
|
-
printingData.push(d);
|
1005
|
-
}
|
1006
|
-
})
|
1007
|
-
data = allData.length ? allData : printingData;
|
1008
|
-
if(printInExcelDocument){
|
1009
|
-
showPreloader("préparation du fichier excel....");
|
1010
|
-
let sheetName = sanitizeSheetName(tableLabel);
|
1011
|
-
if(!sheetName){
|
1012
|
-
hidePreloader();
|
1013
|
-
return notify.error("Vous devez renseigner le nom de la feuille excel dans laquelle exporter les donnédes");
|
1014
|
-
}
|
1015
|
-
fileName = defaultStr(fileName,filename,"export des "+sheetName+" au "+new Date().format('dd-mm-yyyy HHMM'))
|
1016
|
-
if(!data.length){
|
1017
|
-
hidePreloader();
|
1018
|
-
return notify.warning("Aucune données à exporter dans le fichier excel");
|
1019
|
-
}
|
1020
|
-
let XLSX = require("xlsx");
|
1021
|
-
let wb = XLSX.utils.book_new();
|
1022
|
-
XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(data,{dateNF: 'dd/MM/yyyy'}), sheetName);
|
1023
|
-
fileName = fileName.sanitizeFileName().rtrim(".xlsx")+".xlsx";
|
1024
|
-
showPreloader("impression du classeur excel...")
|
1025
|
-
return APP.FILE.saveExcel({fileName,workbook:wb}).catch((e)=>{
|
1026
|
-
console.log(e,' printing list data on exporting to excel')
|
1027
|
-
}).finally(hidePreloader);
|
1028
|
-
} else {
|
1029
|
-
if(!data.length) return undefined;
|
1030
|
-
return createTable({
|
1031
|
-
labelFields:table.export.EXCEL.labelFields,
|
1032
|
-
fields : exportFields,
|
1033
|
-
fieldsToExport,
|
1034
|
-
rowsFormatted : true,
|
1035
|
-
groupBy : table.export.EXCEL.groupBy,
|
1036
|
-
...options,
|
1037
|
-
data,
|
1038
|
-
})
|
1039
|
-
}
|
1040
|
-
},
|
1041
|
-
getPrintSettings : ({printTB})=>{
|
1042
|
-
let extra = getFieldsToExportSettings({
|
1043
|
-
fields : exportFields,
|
1044
|
-
});
|
1045
|
-
extra.printInExcelDocument = {
|
1046
|
-
type : 'switch',
|
1047
|
-
text : 'Imprimer dans un classeur excel',
|
1048
|
-
defaultValue : 0,
|
1049
|
-
}
|
1050
|
-
Object.map(table.export.settings,(ex,i)=>{
|
1051
|
-
extra[i] = ex;
|
1052
|
-
})
|
1053
|
-
return {extra,sessionName:'export-list-data-'+tableName,...opts};
|
1054
|
-
}
|
1055
|
-
}
|
1056
|
-
} else return null;
|
1057
|
-
},
|
1058
|
-
/*permet de créer l'entête des données de type tableau
|
1059
|
-
@param : l'entte du tableau à créer
|
1060
|
-
@param : les options supplémentaires
|
1061
|
-
*/
|
1062
|
-
createTableHeader : (tableHeader,options)=>{
|
1063
|
-
if(!isObjOrArray(tableHeader)) return [];
|
1064
|
-
if(isFunction(options)){
|
1065
|
-
options = {render:options};
|
1066
|
-
}
|
1067
|
-
options = defaultObj(options);
|
1068
|
-
let {renderItem,render,...rest} = options;
|
1069
|
-
renderItem = isFunction(renderItem)? renderItem : isFunction(render)? render : undefined;
|
1070
|
-
rest = defaultObj(rest)
|
1071
|
-
let tH = [];
|
1072
|
-
Object.map(tableHeader,(e,index)=>{
|
1073
|
-
if(isFunction(renderItem)){
|
1074
|
-
if(isObj(e)){
|
1075
|
-
e = renderItem({...e,index})
|
1076
|
-
} else {
|
1077
|
-
e = renderItem({value:e,index})
|
1078
|
-
}
|
1079
|
-
}
|
1080
|
-
if(isNonNullString(e)){
|
1081
|
-
tH.push(
|
1082
|
-
{
|
1083
|
-
text : e.toUpperCase(),
|
1084
|
-
fillColor : getTableHeaderFillColor(),
|
1085
|
-
color : Colors.getContrast(getTableHeaderFillColor()),
|
1086
|
-
bold : true,
|
1087
|
-
...rest
|
1088
|
-
}
|
1089
|
-
)
|
1090
|
-
}
|
1091
|
-
})
|
1092
|
-
return tH;
|
1093
|
-
},
|
1094
|
-
/**
|
1095
|
-
*
|
1096
|
-
* @param {If pageBreakBefore returns true, a page break will be added before the currentNode. Current node has the following information attached:} currentNode
|
1097
|
-
* @param {*} followingNodesOnPage
|
1098
|
-
* @param {*} nodesOnNextPage
|
1099
|
-
* @param {*} previousNodesOnPage
|
1100
|
-
*/
|
1101
|
-
pageBreakBefore: (options)=>{
|
1102
|
-
if(isFunction(options)){
|
1103
|
-
options = {pageBreakBefore:options};
|
1104
|
-
}
|
1105
|
-
options = defaultObj(options);
|
1106
|
-
let pageBreakBefore = defaultFunc(options.pageBreakBefore);
|
1107
|
-
return function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
|
1108
|
-
if(isObj(currentNode.startPosition) && isNonNullString(currentNode.text)){
|
1109
|
-
return pageBreakBefore({
|
1110
|
-
...currentNode.startPosition,
|
1111
|
-
currentNode,
|
1112
|
-
followingNodesOnPage, nodesOnNextPage, previousNodesOnPage,
|
1113
|
-
text : currentNode.text,
|
1114
|
-
top : defaultNumber(currentNode.startPosition.top),
|
1115
|
-
pageWidth : currentNode.startPosition.pageInnerWidth,
|
1116
|
-
left : currentNode.startPosition.left,
|
1117
|
-
pageHeight : currentNode.startPosition.pageInnerHeight
|
1118
|
-
})
|
1119
|
-
}
|
1120
|
-
return currentNode.headlineLevel === 1 && followingNodesOnPage.length === 0;
|
1121
|
-
}
|
1122
|
-
},
|
1123
|
-
/**** permet d'évaluer le contenu du pied de page
|
1124
|
-
* @param {
|
1125
|
-
* footerCopyRight : Le contenu de pied de page
|
1126
|
-
* }
|
1127
|
-
*/
|
1128
|
-
footer,
|
1129
|
-
canTogglePrintDate : ()=> Auth.isTableDataAllowed({table:'data',action:'toggleprintdate'}),
|
1130
|
-
getPrintedDate : (opts)=>{
|
1131
|
-
opts = defaultObj(opts);
|
1132
|
-
let displayPrintedDate = !canTogglePrintDate()? true : defaultVal(opts.displayPrintedDate,true);
|
1133
|
-
if(!displayPrintedDate){
|
1134
|
-
return null;
|
1135
|
-
}
|
1136
|
-
return [
|
1137
|
-
{
|
1138
|
-
text : [('Date de tirage : '+new Date().toFormat(APP.date.defaultDateTimeFormat)+", par : ").toUpperCase(),{text:Auth.getLoggedUserCode(),bold:true}],
|
1139
|
-
italics: true,
|
1140
|
-
fontSize : 11,
|
1141
|
-
margin : [0,3,0,0]
|
1142
|
-
} //: {}
|
1143
|
-
]
|
1144
|
-
},
|
1145
|
-
printingTags : (printingTags,arg)=>{
|
1146
|
-
arg = defaultObj(arg);
|
1147
|
-
let columns = []
|
1148
|
-
Object.map(printingTags,(s,i)=>{
|
1149
|
-
if(isNonNullString(s)){
|
1150
|
-
columns.push(
|
1151
|
-
isDOMElement() ? {
|
1152
|
-
image : outlineText(s)
|
1153
|
-
} : {
|
1154
|
-
text : s
|
1155
|
-
}
|
1156
|
-
)
|
1157
|
-
}
|
1158
|
-
return '';
|
1159
|
-
})
|
1160
|
-
if(columns.length <= 0) return null;
|
1161
|
-
return {
|
1162
|
-
columns,
|
1163
|
-
alignment : 'center',
|
1164
|
-
}
|
1165
|
-
},
|
1166
|
-
/***affiche le contenu rendu des ginataires du document
|
1167
|
-
* @param : tableau portant la liste des signataires du document
|
1168
|
-
*/
|
1169
|
-
signatories : (signatories,arg,settings)=>{
|
1170
|
-
arg = defaultObj(arg);
|
1171
|
-
settings = defaultObj(settings);
|
1172
|
-
let marginNumber = isDecimal(arg.signatoriesMargin)? arg.signatoriesMargin : 3;
|
1173
|
-
let opts = {
|
1174
|
-
margin : [0,5,0,0]
|
1175
|
-
}
|
1176
|
-
let canPrintSignatoriesImages = arg.printSignatoriesImages;
|
1177
|
-
marginNumber = Math.floor(marginNumber);
|
1178
|
-
let columns = []
|
1179
|
-
signatoriesItems = defaultObj(signatoriesItems);
|
1180
|
-
let _signatories = [];
|
1181
|
-
Object.map(signatories,(s,i)=>{
|
1182
|
-
if(isNonNullString(s)){
|
1183
|
-
let item = {label:s,order:0};
|
1184
|
-
if(isObj(signatoriesItems[s])){
|
1185
|
-
item = signatoriesItems[s];
|
1186
|
-
}
|
1187
|
-
item.order = defaultNumber(item.order);
|
1188
|
-
_signatories.push(item);
|
1189
|
-
}
|
1190
|
-
})
|
1191
|
-
_signatories = sortBy(_signatories,{
|
1192
|
-
column : 'order',
|
1193
|
-
dir : 'asc',
|
1194
|
-
returnArray : true,
|
1195
|
-
});
|
1196
|
-
_signatories.map((s,i)=>{
|
1197
|
-
let image = s.image;
|
1198
|
-
let sOptions = defaultObj(s.signatureOptions);
|
1199
|
-
let users = defaultArray(s.users);
|
1200
|
-
let style = {fontSize:14};
|
1201
|
-
s.fontStyle = defaultStr(s.fontStyle,'italics+bold').toLowerCase();
|
1202
|
-
if(s.fontStyle.contains("italics")){
|
1203
|
-
style.italics = true;
|
1204
|
-
}
|
1205
|
-
if(s.fontStyle.contains("bold")){
|
1206
|
-
style.bold = true;
|
1207
|
-
}
|
1208
|
-
s = defaultStr(s.label,s.code);
|
1209
|
-
if(isNonNullString(s)){
|
1210
|
-
let text = {text:s,...style};
|
1211
|
-
let canUPrint = users.length ? arrayValueExists(users,Auth.getLoggedUserCode()) : true;
|
1212
|
-
if(canPrintSignatoriesImages && isDataURL(image) && canUPrint){
|
1213
|
-
let signature = {image,alignment:'center',margin:[0,0,0,0]};
|
1214
|
-
let maxSignatureDim = defaultNumber(arg.maxCreatedSignaturePrintSize,MAX_CREATED_SIGNATURE_PRINT_SIZE)
|
1215
|
-
let width = Math.abs(defaultNumber(sOptions.width)),
|
1216
|
-
height = Math.abs(defaultNumber(sOptions.height));
|
1217
|
-
if(width && height){
|
1218
|
-
width = Math.min(width,maxSignatureDim);
|
1219
|
-
height = Math.min(height,maxSignatureDim);
|
1220
|
-
} else if(width){
|
1221
|
-
width = height = Math.min(width,maxSignatureDim)
|
1222
|
-
} else if(height){
|
1223
|
-
height = width = Math.min(height,maxSignatureDim);
|
1224
|
-
} else {
|
1225
|
-
width = height = maxSignatureDim
|
1226
|
-
}
|
1227
|
-
signature.fit = [width,height];
|
1228
|
-
text = [text,signature]
|
1229
|
-
}
|
1230
|
-
columns.push(text);
|
1231
|
-
}
|
1232
|
-
return '';
|
1233
|
-
})
|
1234
|
-
if(columns.length > 0){
|
1235
|
-
let percent = (100/columns.length)
|
1236
|
-
for(let i in columns){
|
1237
|
-
columns[i].width = percent+"%";
|
1238
|
-
}
|
1239
|
-
let t = '';
|
1240
|
-
for(let i=0; i< marginNumber-1;i++){
|
1241
|
-
t+="\n";
|
1242
|
-
}
|
1243
|
-
if(t){
|
1244
|
-
columns.push({text:t})
|
1245
|
-
}
|
1246
|
-
} else {
|
1247
|
-
if(settings.duplicateDocOnPage){
|
1248
|
-
let t = '';
|
1249
|
-
for(let i=0; i< marginNumber-1;i++){
|
1250
|
-
t+="\n";
|
1251
|
-
}
|
1252
|
-
if(t){
|
1253
|
-
columns.push({text:t})
|
1254
|
-
}
|
1255
|
-
}
|
1256
|
-
delete opts.margin;
|
1257
|
-
return columns;
|
1258
|
-
}
|
1259
|
-
return {
|
1260
|
-
columns,
|
1261
|
-
alignment : 'center',
|
1262
|
-
...opts
|
1263
|
-
}
|
1264
|
-
},
|
1265
|
-
/*** cette fonction prend en paramètre un tableau de donnés ou un objet à imprimer
|
1266
|
-
* @param data {ArrayOf[object]|| object} les/la données à imprimer.
|
1267
|
-
* lorsque data est un tableau, alors il s'agit de l'impression cumulée de plusieurs document
|
1268
|
-
* lorsque data est un objet, alors il s'agit de l'impression d'une données de ventes
|
1269
|
-
* @param arg {object
|
1270
|
-
* data : tableau d'objet de données, ou objet document à imprimer
|
1271
|
-
* print : La méthode de rappel appelée pour l'impression d'un document
|
1272
|
-
* ...rest : les options d'impression du document
|
1273
|
-
* } : les options d'impression
|
1274
|
-
*
|
1275
|
-
*/
|
1276
|
-
print : function (arg){
|
1277
|
-
return new Promise((resolve,reject)=>{
|
1278
|
-
let {data,print,getSettings, ...rest} = defaultObj(arg);
|
1279
|
-
print = defaultFunc(print,(args)=>{
|
1280
|
-
resolve(args);
|
1281
|
-
});
|
1282
|
-
getSettings = defaultFunc(print.getSettings,getSettings,getSettings)
|
1283
|
-
rest = defaultObj(rest);
|
1284
|
-
let printTitle = defaultStr(rest.printTitle,rest.docTitle,rest.title);
|
1285
|
-
delete rest.onSuccess;
|
1286
|
-
let multiple = false;
|
1287
|
-
if(isArray(data)){
|
1288
|
-
multiple = data.length > 1? true : false;
|
1289
|
-
if(multiple === false){
|
1290
|
-
data = data[0];
|
1291
|
-
}
|
1292
|
-
}
|
1293
|
-
if(!multiple){
|
1294
|
-
data = defaultObj(data);
|
1295
|
-
}
|
1296
|
-
let allData = data;
|
1297
|
-
getSettings({...rest,data,multiple,success:(settingsArgs)=>{
|
1298
|
-
if(settingsArgs.printInExcelDocument){
|
1299
|
-
hidePreloader();
|
1300
|
-
settingsArgs.format = "excel";
|
1301
|
-
settingsArgs.printTB = printTB;
|
1302
|
-
settingsArgs.data = settingsArgs.allData = data;
|
1303
|
-
return print(settingsArgs)
|
1304
|
-
}
|
1305
|
-
let {pageBreakBeforeEachDoc,...rest} = settingsArgs;
|
1306
|
-
rest = defaultObj(rest)
|
1307
|
-
delete rest.data;
|
1308
|
-
let duplicateDocOnPage = rest.duplicateDocOnPage;
|
1309
|
-
if(duplicateDocOnPage){
|
1310
|
-
let ds = [];
|
1311
|
-
if(multiple){
|
1312
|
-
for(let i in allData){
|
1313
|
-
if(isDocUpdate(allData[i])){
|
1314
|
-
ds.push(allData[i]);
|
1315
|
-
ds.push(allData[i]);
|
1316
|
-
}
|
1317
|
-
}
|
1318
|
-
} else ds = [data,data];
|
1319
|
-
allData = ds;
|
1320
|
-
multiple = true;
|
1321
|
-
}
|
1322
|
-
printTitle = defaultStr(printTitle,rest.printTitle,rest.docTitle);
|
1323
|
-
let printingFooterNote = rest.printingFooterNote ? rest.printingFooterNote : undefined;
|
1324
|
-
if(printingFooterNote){
|
1325
|
-
printingFooterNote = require("./toPdfMakeObj")(APP.sprintf(printingFooterNote));
|
1326
|
-
printingFooterNote = {
|
1327
|
-
text : printingFooterNote,
|
1328
|
-
fontSize: isNumber(rest.printingFooterNoteFontSize)? rest.printingFooterNoteFontSize: 11,
|
1329
|
-
//italics : true
|
1330
|
-
}
|
1331
|
-
if(Colors.isValidColor(rest.printingFooterNoteTextColor)){
|
1332
|
-
printingFooterNote.color = rest.printingFooterNoteTextColor;
|
1333
|
-
}
|
1334
|
-
}
|
1335
|
-
let includeQRCode = rest.qrCodeInResult;
|
1336
|
-
let qrCodeAlignment = defaultStr(rest.qrCodeAlignment).toLowerCase();
|
1337
|
-
if(!arrayValueExists(["left","center","right"],qrCodeAlignment)){
|
1338
|
-
qrCodeAlignment = "left";
|
1339
|
-
}
|
1340
|
-
let fileName = "";
|
1341
|
-
let countD = 0;
|
1342
|
-
if(multiple){
|
1343
|
-
showPreloader("Impression en cours ...");
|
1344
|
-
let promises = [];
|
1345
|
-
let allContents = [];
|
1346
|
-
let pageBreakBefores = []
|
1347
|
-
let backgrounds = undefined;
|
1348
|
-
let allDocDef = {}
|
1349
|
-
for(let i in allData){
|
1350
|
-
if(isDocUpdate(allData[i])){
|
1351
|
-
let p = print({...rest,multiple,data:allData[i],printTitle:allData[i].code+"-"+(allData.length-1)+"documents"});
|
1352
|
-
if(isPromise(p)){
|
1353
|
-
fileName = defaultStr(fileName,allData[i].code)
|
1354
|
-
countD++
|
1355
|
-
promises.push(p.then((r)=>{
|
1356
|
-
return {result:r,data:allData[i]}
|
1357
|
-
}));
|
1358
|
-
} else if(isValidPrintableContent(p)){
|
1359
|
-
fileName = defaultStr(fileName,allData[i].code)
|
1360
|
-
countD++
|
1361
|
-
promises.push(Promise.resolve({result:p,data:allData[i]}));
|
1362
|
-
}
|
1363
|
-
}
|
1364
|
-
}
|
1365
|
-
let counter = 0;
|
1366
|
-
return Promise.all(promises).then((results)=>{
|
1367
|
-
for(let i in results){
|
1368
|
-
let result = results[i].result;
|
1369
|
-
let qrCode = generate(results[i].data);
|
1370
|
-
qrCode.alignment = qrCodeAlignment;
|
1371
|
-
if(isValidPrintableContent(result)){
|
1372
|
-
let {docDefinition,content,options}= result;
|
1373
|
-
counter ++;
|
1374
|
-
if(isArray(result.content)){
|
1375
|
-
if(printingFooterNote){
|
1376
|
-
result.content.push(printingFooterNote);
|
1377
|
-
}
|
1378
|
-
let printedDateStr = getPrintedDate(settingsArgs);
|
1379
|
-
if(printedDateStr){
|
1380
|
-
result.content.push(printedDateStr);
|
1381
|
-
}
|
1382
|
-
let printingTags = printingTags(settingsArgs.printingTags,settingsArgs);
|
1383
|
-
if(printingTags){
|
1384
|
-
result.content.push(printingTags);
|
1385
|
-
}
|
1386
|
-
let sign = signatories(settingsArgs.signatories,settingsArgs,{duplicateDocOnPage});
|
1387
|
-
if(sign){
|
1388
|
-
result.content.push(sign);
|
1389
|
-
}
|
1390
|
-
|
1391
|
-
|
1392
|
-
if(includeQRCode && isNonNullString(qrCode.qr)){
|
1393
|
-
result.content.push(qrCode);
|
1394
|
-
}
|
1395
|
-
}
|
1396
|
-
/*if(duplicateDocOnPage && counter%2 == 1){
|
1397
|
-
result.content.push({text:DUPLICATE_TEXT_CONTENT, color:"white",id:DUPLICATE_TEXT_CONTENT+"-"+counter})
|
1398
|
-
}*/
|
1399
|
-
if(counter > 1 && pageBreakBeforeEachDoc){
|
1400
|
-
//saut de page suite à une nouveau pd
|
1401
|
-
allContents.push({text:'',pageBreak: 'before'});
|
1402
|
-
} else if(counter > 1){
|
1403
|
-
allContents.push({text:'\n\n'});
|
1404
|
-
}
|
1405
|
-
allContents.push(result.content);
|
1406
|
-
if(isFunction(docDefinition.pageBreakBefore)){
|
1407
|
-
pageBreakBefores.push(docDefinition.pageBreakBefore.bind({},options));
|
1408
|
-
}
|
1409
|
-
if(typeof backgrounds !== 'function'){
|
1410
|
-
backgrounds = isFunction(docDefinition.background)? docDefinition.background : result.background;
|
1411
|
-
}
|
1412
|
-
APP.extend (allDocDef,docDefinition);
|
1413
|
-
}
|
1414
|
-
}
|
1415
|
-
allDocDef.pageBreakBefore = pageBreakBefore((args)=>{
|
1416
|
-
for( let i in pageBreakBefores){
|
1417
|
-
if(pageBreakBefores[i]() === true) return true;
|
1418
|
-
}
|
1419
|
-
return false;
|
1420
|
-
});
|
1421
|
-
if(isFunction(backgrounds)){
|
1422
|
-
allDocDef.background = (currentPage, pageSize)=>{
|
1423
|
-
return backgrounds({pageSize,currentPage,multiple,counter,pageBreak:pageBreakBeforeEachDoc,allData,settings:settingsArgs});
|
1424
|
-
};
|
1425
|
-
}
|
1426
|
-
let docDef = {data,printTitle,content:allContents,docDefinition:allDocDef,options:rest}
|
1427
|
-
delete docDef.success;delete docDef.resolve; delete docDef.error; delete docDef.reject;
|
1428
|
-
docDef.success = ((args)=>{
|
1429
|
-
resolve(args);
|
1430
|
-
hidePreloader();
|
1431
|
-
});
|
1432
|
-
docDef.error = ((e)=>{
|
1433
|
-
reject(e);
|
1434
|
-
hidePreloader();
|
1435
|
-
});
|
1436
|
-
docDef.multiple = multiple;
|
1437
|
-
fileName+= (countD-1>0? ("-et-"+(countD-1)+"-documents"):"");
|
1438
|
-
docDef.fileName = defaultStr(docDef.fileName,rest.fileName,fileName);
|
1439
|
-
docDef.printTitle = defaultStr(docDef.printTitle,fileName)
|
1440
|
-
createPDFFile (docDef)
|
1441
|
-
}).catch((e)=>{
|
1442
|
-
resolve({status:false,error:e});
|
1443
|
-
hidePreloader();
|
1444
|
-
console.log(e,' printing all database data')
|
1445
|
-
});
|
1446
|
-
}
|
1447
|
-
allData = [data];
|
1448
|
-
let p = print({...rest,multiple,data,allData})
|
1449
|
-
if(isValidPrintableContent(p)){
|
1450
|
-
p = Promise.resolve(p);
|
1451
|
-
}
|
1452
|
-
if(isPromise(p)){
|
1453
|
-
showPreloader("Impression en cours ...");
|
1454
|
-
p.then((args)=>{
|
1455
|
-
let printedDateStr = getPrintedDate(settingsArgs);
|
1456
|
-
let docDef = {...args,data,printTitle};
|
1457
|
-
docDef.docDefinition = defaultObj(docDef.docDefinition);
|
1458
|
-
let {background} = docDef;
|
1459
|
-
args = defaultObj(args);
|
1460
|
-
background = isFunction(background)? background : args.background;
|
1461
|
-
docDef.fileName = defaultStr(docDef.fileName,rest.fileName,data.code);
|
1462
|
-
delete docDef.success;delete docDef.resolve; delete docDef.error; delete docDef.reject;
|
1463
|
-
if(isArray(docDef.content)){
|
1464
|
-
if(printingFooterNote){
|
1465
|
-
docDef.content.push(printingFooterNote);
|
1466
|
-
}
|
1467
|
-
if(printedDateStr){
|
1468
|
-
docDef.content.push(printedDateStr);
|
1469
|
-
}
|
1470
|
-
let printingTags = printingTags(settingsArgs.printingTags,settingsArgs);
|
1471
|
-
if(printingTags){
|
1472
|
-
docDef.content.push(printingTags);
|
1473
|
-
}
|
1474
|
-
let sign = signatories(settingsArgs.signatories,settingsArgs,{duplicateDocOnPage});
|
1475
|
-
if(sign){
|
1476
|
-
docDef.content.push(sign);
|
1477
|
-
}
|
1478
|
-
|
1479
|
-
if(includeQRCode){
|
1480
|
-
let qrCode = generate(data);
|
1481
|
-
qrCode.alignment = qrCodeAlignment;
|
1482
|
-
if(qrCode.qr) docDef.content.push(qrCode);
|
1483
|
-
}
|
1484
|
-
}
|
1485
|
-
if(isFunction(background)){
|
1486
|
-
/**** les paramètres d'impression de l'arrière plan :
|
1487
|
-
* pageSize : {width,heigh}, la taille de la page courante
|
1488
|
-
* currentPage : le numéro de la page courante
|
1489
|
-
* settings : les paramètres d'impression
|
1490
|
-
* counte : //le nombre de documents à imprimer
|
1491
|
-
* multiple : //s'il s'agit d'une impression multiple
|
1492
|
-
*/
|
1493
|
-
docDef.docDefinition.background = (currentPage, pageSize)=>{
|
1494
|
-
return background({pageSize,currentPage,multiple,counter:1,pageBreak:true,allData,settings:settingsArgs});
|
1495
|
-
};
|
1496
|
-
}
|
1497
|
-
docDef.success = ((args)=>{
|
1498
|
-
resolve(args);
|
1499
|
-
hidePreloader();
|
1500
|
-
});
|
1501
|
-
docDef.error = ((e)=>{
|
1502
|
-
reject(e);
|
1503
|
-
hidePreloader();
|
1504
|
-
});
|
1505
|
-
|
1506
|
-
createPDFFile(docDef)
|
1507
|
-
}).catch((e)=>{
|
1508
|
-
console.log(e,' printing document error ',data)
|
1509
|
-
resolve({status:false,error:e,data});
|
1510
|
-
hidePreloader();
|
1511
|
-
})
|
1512
|
-
} else {
|
1513
|
-
hidePreloader();
|
1514
|
-
console.warn("Impossible d'exécuter le fonction print, car la méthode print passé en paramètre ne retourne pas une promesse")
|
1515
|
-
Promise.resolve({status:false,msg, data })
|
1516
|
-
}
|
1517
|
-
},printTB},{printTB})
|
1518
|
-
})
|
1519
|
-
},
|
1520
|
-
/**** vérifie si le document imprimé est valide*/
|
1521
|
-
isValidPrintedDoc : ()=>{
|
1522
|
-
|
1523
|
-
},
|
1524
|
-
getSettings : ({success,data,formatName,sessionName,ignore,error,multiple,extra,title,sessionData,...options})=>{
|
1525
|
-
extra = defaultObj(extra);
|
1526
|
-
sessionName = defaultStr(sessionName,"print-settings")+"-print-pages";
|
1527
|
-
let defaultData = defaultObj($session.get(sessionName));
|
1528
|
-
APP.extend(defaultData,sessionData);
|
1529
|
-
options = defaultObj(options);
|
1530
|
-
title = defaultStr(title,"Options d'impressions")
|
1531
|
-
let {FormPage,FormDialog} = require("$wcomponents/Form");
|
1532
|
-
data = defaultObj(data);
|
1533
|
-
delete defaultData.printInExcelDocument;///on réinitialise l'impression dans un document excel
|
1534
|
-
let canPrintSignatoriesImages = Auth.isAllowed("structdata/signatories/printimage");
|
1535
|
-
let Image = require("$wcomponents/Image")
|
1536
|
-
extra.watermark = {
|
1537
|
-
text : 'Texte de filigrane',
|
1538
|
-
defaultValue : defaultStr(APP.getCompany("name"),APP.getName())
|
1539
|
-
}
|
1540
|
-
extra.signatories = {
|
1541
|
-
type : 'selectstructdata',
|
1542
|
-
table : 'signatories',
|
1543
|
-
text : 'Signataires',
|
1544
|
-
multiple : true,
|
1545
|
-
disabled : Auth.isStructDataAllowed({table:'signatories',action:'read'})? false : true,
|
1546
|
-
dynamicRenderContent : true,
|
1547
|
-
renderItem : !canPrintSignatoriesImages ? undefined : ({item,context}) =>{
|
1548
|
-
return <Button iconEl={
|
1549
|
-
<Image src={item.image} round = {false} className="printing-image-signatory"
|
1550
|
-
onChange = {(opts)=>{
|
1551
|
-
if(isObj(opts)){
|
1552
|
-
item.image = opts.dataURL;
|
1553
|
-
item.hasCreated = true;
|
1554
|
-
item.signatureOptions = opts;
|
1555
|
-
if(context){
|
1556
|
-
context.refresh();
|
1557
|
-
}
|
1558
|
-
}
|
1559
|
-
}}
|
1560
|
-
drawProps = {{trim:true}}
|
1561
|
-
drawText = "Signer"
|
1562
|
-
/>
|
1563
|
-
}
|
1564
|
-
iconBefore = {false}
|
1565
|
-
className="printing-image-signatory-btn"
|
1566
|
-
>
|
1567
|
-
{item.label}
|
1568
|
-
</Button>
|
1569
|
-
},
|
1570
|
-
itemValue : ({item,items})=> {
|
1571
|
-
signatoriesItems = items;
|
1572
|
-
return item.code;
|
1573
|
-
},
|
1574
|
-
}
|
1575
|
-
if(!canPrintSignatoriesImages){
|
1576
|
-
defaultData.printSignatoriesImages = 0;
|
1577
|
-
} else {
|
1578
|
-
extra.printSignatoriesImages = {
|
1579
|
-
type : 'switch',
|
1580
|
-
text : 'Affich images de signatures préenregistrées',
|
1581
|
-
disabled : canPrintSignatoriesImages ? false : true,
|
1582
|
-
defaultValue : 0,
|
1583
|
-
}
|
1584
|
-
extra.maxCreatedSignaturePrintSize = {
|
1585
|
-
type :"number",
|
1586
|
-
text : "Taille maximale de la signature image",
|
1587
|
-
defaultValue : MAX_CREATED_SIGNATURE_PRINT_SIZE
|
1588
|
-
}
|
1589
|
-
}
|
1590
|
-
extra. signatoriesMargin = {
|
1591
|
-
type : 'number',
|
1592
|
-
validType : 'number',
|
1593
|
-
text : 'Nbrs sauts de lignes après signataires',
|
1594
|
-
tooltip : 'Entrez le nombre de sauts de lignes à laisser sur la page après la ligne des signataires',
|
1595
|
-
defaultValue : 3,
|
1596
|
-
};
|
1597
|
-
if(Auth.isStructDataAllowed({table:'printing_tags',action:'read'})){
|
1598
|
-
extra.printingTags = {
|
1599
|
-
type : 'selectstructdata',
|
1600
|
-
table : 'printing_tags',
|
1601
|
-
text : 'Etiquettes',
|
1602
|
-
multiple : true,
|
1603
|
-
}
|
1604
|
-
}
|
1605
|
-
extra.displayEmailOnHeader = {
|
1606
|
-
text : 'Afficher l\'Email société en entête',
|
1607
|
-
type : 'switch',
|
1608
|
-
defaultValue : 0,
|
1609
|
-
}
|
1610
|
-
extra.displayFaxOnHeader = {
|
1611
|
-
text : 'Afficher le fax société en entête',
|
1612
|
-
type : 'switch',
|
1613
|
-
defaultValue : 0,
|
1614
|
-
}
|
1615
|
-
extra.dynamicPageHeaderWidth = {
|
1616
|
-
text : 'Optimiser l\'affichage de l\'entête du document',
|
1617
|
-
type : 'switch',
|
1618
|
-
defaultValue : 0,
|
1619
|
-
}
|
1620
|
-
if(canTogglePrintDate()){
|
1621
|
-
extra.displayPrintedDate = {
|
1622
|
-
text : 'Afficher la date de tirage',
|
1623
|
-
defaultValue : 1,
|
1624
|
-
type : 'switch',
|
1625
|
-
}
|
1626
|
-
/*extra.customPrintDate = {
|
1627
|
-
text : "Date de tirage personnalisée",
|
1628
|
-
format : 'hashtag',
|
1629
|
-
defaultValue : ""
|
1630
|
-
}
|
1631
|
-
delete defaultData.customPrintDate;*/
|
1632
|
-
} else delete extra.displayPrintedDate;
|
1633
|
-
extra.defaultFontColor = {
|
1634
|
-
type : 'color',
|
1635
|
-
text : 'Couleur de texte par défaut',
|
1636
|
-
defaultValue : "#000000"
|
1637
|
-
}
|
1638
|
-
extra.printingFooterNote = {
|
1639
|
-
text : 'Note de bas de page',
|
1640
|
-
format : 'hashtag'
|
1641
|
-
}
|
1642
|
-
extra.printingFooterNoteFontSize = {
|
1643
|
-
type : 'number',
|
1644
|
-
text : 'Taille police note de bas de page',
|
1645
|
-
defaultValue : 11,
|
1646
|
-
}
|
1647
|
-
extra.printingFooterNoteTextColor = {
|
1648
|
-
type : 'color',
|
1649
|
-
text : 'Couleur texte note de bas de page',
|
1650
|
-
defaultValue : "#000000"
|
1651
|
-
}
|
1652
|
-
extra.footerCopyRight = {
|
1653
|
-
text : 'Pied de page',
|
1654
|
-
format : 'hashtag'
|
1655
|
-
}
|
1656
|
-
extra.footerCopyRightColor = {
|
1657
|
-
type : 'color',
|
1658
|
-
text : 'Couleur texte de pied de page',
|
1659
|
-
defaultValue : "#000000"
|
1660
|
-
}
|
1661
|
-
extra.qrCodeInResult = {
|
1662
|
-
type : 'switch',
|
1663
|
-
label : 'QR Code',
|
1664
|
-
checkedTooltip : 'Un QR sera inséré au base de page du fichier',
|
1665
|
-
defaultValue : 0,
|
1666
|
-
} ;
|
1667
|
-
extra.qrCodeAlignment = {
|
1668
|
-
type : 'select',
|
1669
|
-
text : 'Positionner le QRCode',
|
1670
|
-
selected : 'left',
|
1671
|
-
multiple : false,
|
1672
|
-
items : [{code:'left',label:'A gauche'},{code:'center',label:'Au centre'},{code:'right',label:'A droite'}]
|
1673
|
-
}
|
1674
|
-
extra.allowFilePreview = {
|
1675
|
-
type :"switch",
|
1676
|
-
text : 'Prévisualiser le document imprimé',
|
1677
|
-
defaultValue : 1,
|
1678
|
-
}
|
1679
|
-
return new Promise((resolve,reject)=>{
|
1680
|
-
if(ignore === true && isNonNullString(formatName) && isObj(printingPageFormats) && isObj(printingPageFormats[data.formatName])){
|
1681
|
-
let args = {...options,formatName,...printingPageFormats[data.formatName]}
|
1682
|
-
if(isFunction(success)){
|
1683
|
-
success(args)
|
1684
|
-
} else {
|
1685
|
-
resolve(args);
|
1686
|
-
}
|
1687
|
-
return args;
|
1688
|
-
}
|
1689
|
-
let onError = (args)=>{
|
1690
|
-
if(isFunction(error)){
|
1691
|
-
error(args);
|
1692
|
-
} else {
|
1693
|
-
reject({status:false,msg:'impression annulée',options:args})
|
1694
|
-
}
|
1695
|
-
}, onSuccess = (args)=>{
|
1696
|
-
showPreloader("Impression en cours ...");
|
1697
|
-
setTimeout(()=>{
|
1698
|
-
let {data} = args;
|
1699
|
-
$session.set(sessionName,data);
|
1700
|
-
let printSetting = {}
|
1701
|
-
if(isObj(printingPageFormats) && isObj(printingPageFormats[data.formatName])){
|
1702
|
-
printSetting = printingPageFormats[data.formatName];
|
1703
|
-
}
|
1704
|
-
args = {...printSetting,...data}
|
1705
|
-
if(isFunction(success)){
|
1706
|
-
success(args)
|
1707
|
-
} else {
|
1708
|
-
resolve(args);
|
1709
|
-
}
|
1710
|
-
},10);
|
1711
|
-
return true;
|
1712
|
-
}
|
1713
|
-
let restP = {
|
1714
|
-
fullPage:APP.isMobileOrTabletMedia()|| isCapacitor(true),
|
1715
|
-
};
|
1716
|
-
let Component = restP.fullPage ? FormPage : FormDialog;
|
1717
|
-
if(!restP.fullPage){
|
1718
|
-
restP.no = {
|
1719
|
-
text : 'Annuler',
|
1720
|
-
icon : 'cancel',
|
1721
|
-
};
|
1722
|
-
restP.ok = {
|
1723
|
-
text : 'Imprimer',
|
1724
|
-
icon : 'mdi-printer',
|
1725
|
-
}
|
1726
|
-
restP.onSuccess = onSuccess;
|
1727
|
-
restP.onError = onError;
|
1728
|
-
} else {
|
1729
|
-
restP.closeAfterSave =true;
|
1730
|
-
restP.dialogProps = {
|
1731
|
-
onClose : (args)=>{
|
1732
|
-
if(args && args.closed){
|
1733
|
-
onError();
|
1734
|
-
}
|
1735
|
-
}
|
1736
|
-
}
|
1737
|
-
restP.actions = {
|
1738
|
-
ok : {
|
1739
|
-
text : 'Imprimer',
|
1740
|
-
icon : 'mdi-printer',
|
1741
|
-
onClick : (data)=>{
|
1742
|
-
return onSuccess({data});
|
1743
|
-
}
|
1744
|
-
},
|
1745
|
-
}
|
1746
|
-
}
|
1747
|
-
let isMasterAdmin = Auth.isMasterAdmin()
|
1748
|
-
let uCode = Auth.getLoggedUserCode()
|
1749
|
-
let pageBreakBeforeEachDocIsDisabled = multiple ? false : true;
|
1750
|
-
mountDialog(<Component
|
1751
|
-
visible
|
1752
|
-
title = {title}
|
1753
|
-
key = {_uniqid("print-doc"+defaultStr(data.table))}
|
1754
|
-
data = {defaultData}
|
1755
|
-
{...restP}
|
1756
|
-
fields = {{
|
1757
|
-
formatName : {
|
1758
|
-
text : "Format d'impression",
|
1759
|
-
multiple : false,
|
1760
|
-
type : 'selectstructdata',
|
1761
|
-
defaultValue : 'A4',
|
1762
|
-
table : "print_formats",
|
1763
|
-
sortableFields : {code:'Code',label:'Intitulé'},
|
1764
|
-
filter : ({item})=>{
|
1765
|
-
if(isObj(item) && isNonNullString(item.code)){
|
1766
|
-
if(isMasterAdmin) return true
|
1767
|
-
return isArray(item.users) && item.users.length ? arrayValueExists(item.users,uCode) : true
|
1768
|
-
}
|
1769
|
-
return false;
|
1770
|
-
},
|
1771
|
-
onFetchItems : ({items})=>{
|
1772
|
-
printingPageFormats = items;
|
1773
|
-
},
|
1774
|
-
onValidate : ({item,context})=>{
|
1775
|
-
if(item && context && context.getField){
|
1776
|
-
let sFields = context.getField("signatories");
|
1777
|
-
var selected = defaultArray(item.signatories);
|
1778
|
-
if(isFunction(sFields.selectValue)){
|
1779
|
-
sFields.selectValue(selected,true);
|
1780
|
-
}
|
1781
|
-
let signatoriesMargin = context.getField("signatoriesMargin");
|
1782
|
-
if(signatoriesMargin){
|
1783
|
-
signatoriesMargin.setValue(item.signatoriesMargin);
|
1784
|
-
}
|
1785
|
-
/*if(isNonNullString(item.footerNote)){
|
1786
|
-
let printingFooterNote = context.getField("printingFooterNote");
|
1787
|
-
if(printingFooterNote){
|
1788
|
-
printingFooterNote.setValue(item.footerNote)
|
1789
|
-
}
|
1790
|
-
}*/
|
1791
|
-
if(isNonNullString(item.footerCopyRight)){
|
1792
|
-
let fCopyRight = context.getField("footerCopyRight");
|
1793
|
-
if(fCopyRight){
|
1794
|
-
fCopyRight.setValue(item.footerCopyRight)
|
1795
|
-
}
|
1796
|
-
}
|
1797
|
-
}
|
1798
|
-
},
|
1799
|
-
itemValue : ({item})=>{
|
1800
|
-
return item.code;
|
1801
|
-
},
|
1802
|
-
required : true,
|
1803
|
-
},
|
1804
|
-
duplicateDocOnPage : {
|
1805
|
-
text :'Dupliquer le(s) document(s)',
|
1806
|
-
type : 'switch',
|
1807
|
-
defaultValue : 0,
|
1808
|
-
onValidate : multiple ? undefined : ({value,context}) =>{
|
1809
|
-
if(context){
|
1810
|
-
let pageBreakBeforeEachDoc = context.getField("pageBreakBeforeEachDoc");
|
1811
|
-
if(pageBreakBeforeEachDoc){
|
1812
|
-
if(value){
|
1813
|
-
pageBreakBeforeEachDoc.enable();
|
1814
|
-
pageBreakBeforeEachDocIsDisabled = false;
|
1815
|
-
} else {
|
1816
|
-
pageBreakBeforeEachDoc.disable();
|
1817
|
-
pageBreakBeforeEachDocIsDisabled = true;
|
1818
|
-
}
|
1819
|
-
}
|
1820
|
-
}
|
1821
|
-
}
|
1822
|
-
},
|
1823
|
-
pageBreakBeforeEachDoc : {
|
1824
|
-
text :'Saut de page par document',
|
1825
|
-
type : 'switch',
|
1826
|
-
defaultValue : 1,
|
1827
|
-
checkedTooltip : 'Insérer un saut de page avant chaque nouveau document',
|
1828
|
-
uncheckedTooltip : 'Ne pas insérer un saut de page avant chaque nouveau document',
|
1829
|
-
getValidValue : ({context,data}) => {
|
1830
|
-
let v = pageBreakBeforeEachDocIsDisabled ? 0 : context.getValue();
|
1831
|
-
data.pageBreakBeforeEachDoc = v;
|
1832
|
-
return v;
|
1833
|
-
}
|
1834
|
-
},
|
1835
|
-
...extra,
|
1836
|
-
}}
|
1837
|
-
/>,"print-sales-docs")
|
1838
|
-
})
|
1839
|
-
}
|
1840
|
-
}
|