@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.
@@ -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
- }