@fto-consult/expo-ui 8.59.0 → 8.61.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fto-consult/expo-ui",
3
- "version": "8.59.0",
3
+ "version": "8.61.0",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "react-native-paper-doc": "https://github.com/callstack/react-native-paper/tree/main/docs/docs/guides",
6
6
  "scripts": {
@@ -87,7 +87,7 @@
87
87
  "react-native-paper": "^5.12.3",
88
88
  "react-native-paper-dates": "^0.22.3",
89
89
  "react-native-web": "^0.19.10",
90
- "react-virtuoso": "^4.7.4",
90
+ "react-virtuoso": "^4.7.7",
91
91
  "readable-stream": "^4.5.2",
92
92
  "sanitize-filename": "^1.6.3",
93
93
  "tippy.js": "^6.3.7",
@@ -153,7 +153,6 @@ const FAB = React.forwardRef(
153
153
  ) : null}
154
154
  {label ? (
155
155
  <Text
156
- variant="labelLarge"
157
156
  selectable={false}
158
157
  testID={`${testID}-text`}
159
158
  style={[
@@ -0,0 +1,23 @@
1
+ export default function getSelectedFieldValue ({field,value}){
2
+ let hasF = false;
3
+ let itemCodes = "";
4
+ let vStr = defaultStr(value).toLowerCase().removeSpecialChars().trim();
5
+ value = defaultStr(value,typeof value =="number"? String(value) : value);
6
+ value = value.trim();
7
+ Object.map(field.items,(item,j)=>{
8
+ if(!isObj(item)) return;
9
+ let itemCode = defaultStr(item.code).trim();
10
+ if(!itemCode) return;
11
+ let rLabel = defaultStr(item.label,item.text,itemCode);
12
+ let label = rLabel.removeSpecialChars();
13
+ itemCodes+=(itemCodes?", ":"")+((label?(label+(field.multiple?(" et/ou "):" ou ")):"")+itemCode);
14
+ label = label.toLowerCase().trim();
15
+ if(itemCode == value || (itemCode.toLowerCase().trim() == vStr || label == vStr)){
16
+ hasF = true;
17
+ value = itemCode;
18
+ return;
19
+ }
20
+ })
21
+ value = hasF ? value : false;
22
+ return {value,itemCodes};
23
+ }
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ run : require("./run"),
3
+ validate : require("./validate")
4
+ }
@@ -0,0 +1,81 @@
1
+ import {isNonNullString,defaultStr} from "$cutils";
2
+ export default function parseCSV( strData, strDelimiter ){
3
+ // Create an array to hold our data. Give the array
4
+ // a default empty first row.
5
+ let arrData = [[]];
6
+ if(!isNonNullString(strData)) return arrData;
7
+ // Check to see if the delimiter is defined. If not,
8
+ // then default to comma.
9
+ strDelimiter = defaultStr(strDelimiter,",");
10
+
11
+ // Create a regular expression to parse the CSV values.
12
+ var objPattern = new RegExp(
13
+ (
14
+ // Delimiters.
15
+ "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
16
+
17
+ // Quoted fields.
18
+ "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
19
+
20
+ // Standard fields.
21
+ "([^\"\\" + strDelimiter + "\\r\\n]*))"
22
+ ),
23
+ "gi"
24
+ );
25
+
26
+ // Create an array to hold our individual pattern
27
+ // matching groups.
28
+ var arrMatches = null;
29
+
30
+
31
+ // Keep looping over the regular expression matches
32
+ // until we can no longer find a match.
33
+ while (arrMatches = objPattern.exec( strData )){
34
+
35
+ // Get the delimiter that was found.
36
+ var strMatchedDelimiter = arrMatches[ 1 ];
37
+
38
+ // Check to see if the given delimiter has a length
39
+ // (is not the start of string) and if it matches
40
+ // field delimiter. If id does not, then we know
41
+ // that this delimiter is a row delimiter.
42
+ if (
43
+ strMatchedDelimiter.length &&
44
+ (strMatchedDelimiter != strDelimiter)
45
+ ){
46
+
47
+ // Since we have reached a new row of data,
48
+ // add an empty row to our data array.
49
+ arrData.push( [] );
50
+
51
+ }
52
+
53
+
54
+ // Now that we have our delimiter out of the way,
55
+ // let's check to see which kind of value we
56
+ // captured (quoted or unquoted).
57
+ if (arrMatches[ 2 ]){
58
+
59
+ // We found a quoted value. When we capture
60
+ // this value, unescape any double quotes.
61
+ var strMatchedValue = arrMatches[ 2 ].replace(
62
+ new RegExp( "\"\"", "g" ),
63
+ "\""
64
+ );
65
+
66
+ } else {
67
+
68
+ // We found a non-quoted value.
69
+ var strMatchedValue = arrMatches[ 3 ];
70
+
71
+ }
72
+
73
+
74
+ // Now that we have our value string, let's add
75
+ // it to the data array.
76
+ arrData[ arrData.length - 1 ].push( strMatchedValue );
77
+ }
78
+
79
+ // Return the parsed data.
80
+ return arrData;
81
+ }
@@ -0,0 +1,400 @@
1
+ module.exports = (args,options)=>{
2
+ let sellersTables = APP.DATA_FILE_MANAGER.getSellersTables ();
3
+ options = defaultObj(options);
4
+ let importer = defaultObj(options.importer);
5
+ let {content,name,fileName,success,error} = defaultObj(args);
6
+ let {getDB,constants} = require("$database");
7
+ let validate = require("./validate")
8
+ let {notify} = require("$components/Dialog")
9
+ let parser = require("papaparse");
10
+ fileName = defaultStr(fileName,name);
11
+ let extraData = require("$database/data/tables/extra");
12
+ let fFields = isFunction(importer.getFields)? importer.getFields("import") : {};
13
+ let handleErrors = (errors)=>{
14
+ if(isArray(errors) && errors.length > 0){
15
+ let err = "";
16
+ let fileName = "";
17
+ let cF = 0;
18
+ let length = 0;
19
+ errors.map((e,i)=>{
20
+ if(isObj(e)){
21
+ err += "Ligne : "+e.index
22
+ + ", Table : "+defaultStr(e.tableText,e.table)
23
+ +", Fichier : "+defaultStr(e.dbId)
24
+ +", msg : "+e.msg
25
+ +"\r\n"
26
+ if(cF < 3 && isNonNullString(e.tableText) && !fileName.contains(e.tableText)){
27
+ fileName +=(fileName? ", ":"")+e.tableText;
28
+ }
29
+ }
30
+ cF++;
31
+ length++;
32
+ });
33
+ if(length > 0){
34
+ let s = length > 1 ? "s":"";
35
+ let errL = (length > 9? "":"0")+length.formatNumber();
36
+ fileName = sanitizeFileName(("Erreur"+s+" import-"+fileName+" au &dateheure&"))+".txt";
37
+ APP.FILE.saveText({
38
+ content : err,
39
+ fileName,
40
+ //mimeType : "text/csv",
41
+ directory : APP.getId()+"/imports/erreurs/"
42
+ }).then(({path})=>{
43
+ notify.warning({
44
+ message : "Opération d'import terminée avec "+errL+" erreur"+s+". Retrouvez le rapport dans le fichier "+(isNonNullString(path)? path:fileName)
45
+ ,timeout : 8000
46
+ });
47
+ }).catch((e)=>{
48
+ console.log(e,' saving import error');
49
+ })
50
+ }
51
+ }
52
+ }
53
+ return new Promise((resolve,reject)=>{
54
+ let json = content;
55
+ let TABLES = constants.TABLES;
56
+ let STRUCT_DATA_TABLES = constants.STRUCT_DATA_TABLES;
57
+ let errors = [];
58
+ let breakLoop = undefined;
59
+ let footer = false ? [{
60
+ text :'Annuler',
61
+ icon : 'cancel',
62
+ onClick : ()=>{
63
+ breakLoop = true;
64
+ hidePreloader();
65
+ let msg = "Opération annulée";
66
+ notify.error(msg);
67
+ throw (msg);
68
+ }
69
+ }] : undefined;
70
+ let errorF = (e)=>{
71
+ hidePreloader();
72
+ resolve({status:false,errors});
73
+ handleErrors(errors);
74
+ if(isFunction(error)){
75
+ error(e,errors);
76
+ return;
77
+ }
78
+ if(isNonNullString(e)){
79
+ notify.error(e);
80
+ }
81
+ };
82
+ let successF = (d)=>{
83
+ d = {result:d,errors};
84
+ hidePreloader();
85
+ handleErrors(errors);
86
+ if(isFunction(success)){
87
+ success(d);
88
+ return;
89
+ }
90
+ resolve(d);
91
+ }
92
+ if(!content) {
93
+ errorF(null);
94
+ return;
95
+ }
96
+ let dbs = {};
97
+ let preloader = "import fichier "+fileName;
98
+ showPreloader(preloader);
99
+ let docs = [];
100
+ let isCSV = false;
101
+ if(!isJSON(json)) {
102
+ let parsedData = parser.parse(json,{delimiter:defaultStr(importer.delimiter)});
103
+ if(isObj(parsedData)){
104
+ if(isArray(parsedData.errors) && parsedData.errors.length > 0){
105
+ let err = parsedData.errors[0];
106
+ let _msg = "";
107
+ if(isObj(err) && isNonNullString(err.message)){
108
+ _msg += ", message : "+err.message;
109
+ }
110
+ return errorF("Impossible d'importer le fichier "+fileName+" car celui-ci contient "+parsedData.errors.length.formatNumber()+" erreur(s)"+_msg);
111
+ } else if(isArray(parsedData.data) && isArray(importer.fields) && isNonNullString(importer.table) && isNonNullString(importer.dbId)){
112
+ let meta = parsedData.meta;
113
+ if(isObj(meta) && isNonNullString(meta.delimiter)){
114
+ let delimiter= meta.delimiter;
115
+ let arr = [];
116
+ let k = defaultNumber(importer.ignoreFirstLigne,1)? 1 : 0;
117
+ let length = parsedData.data.length;
118
+ while(k < length){
119
+ let d = parsedData.data[k];
120
+ let _d = {};
121
+ let p = false;
122
+ if(isArray(d) && d.length > 1){
123
+ importer.fields.map((f,index)=>{
124
+ _d[f] = d[index];
125
+ if(isObj(fFields[f])){
126
+ let ff = fFields[f];
127
+ if(isNonNullString(ff.piece)){
128
+ _d.piece = ff.piece;
129
+ }
130
+ }
131
+ if(!p && _d[f] !== undefined && isNonNullString(_d[f])){
132
+ p = true;
133
+ }
134
+ })
135
+ _d.table = importer.table;
136
+ _d.dbId = importer.dbId;
137
+ }
138
+ if(p){
139
+ let tableText = defaultStr(importer.label,_d.table)
140
+ let msg = validate({data:_d,index:k,requiredFields:defaultArray(importer.fields),fields:fFields,table:_d.table,tableText});
141
+ if(isNonNullString(msg)){
142
+ errors.push({dbId:importer.dbId,index:k,msg,status:false,table:_d.table,tableText});
143
+ p = false;
144
+ } else p = !msg ? false : true;
145
+ }
146
+ if(p) arr.push(_d);
147
+ k++;
148
+ }
149
+ isCSV = true;
150
+
151
+ if(isFunction(importer.prepareData)){
152
+ json = defaultArray(importer.prepareData({docs:arr,fields:fFields,delimiter,rawDocs:parsedData.data,delimiter,table:importer.table,dbId:importer.dbId,dbName:importer.dbId}))
153
+ } else json = arr;
154
+ }
155
+ }
156
+ } else {
157
+ errorF("Le fichier "+fileName+" est un fichier de données json invalide");
158
+ return;
159
+ }
160
+ } else {
161
+ isCSV = false;
162
+ json = parseJSON(json);
163
+ if(isObj(json) && defaultStr(json.origin).toLowerCase() =="shared" && isNonNullString(json.provider) && isNonNullString(json.dataType)){
164
+ return require("../share/import")({success:successF,error:errorF,json});
165
+ }
166
+ }
167
+ if(isArray(json)){
168
+ json = {rows : json};
169
+ } else if(!isObj(json)) {
170
+ errorF("fichier json invalide : ")
171
+ return;
172
+ }
173
+ let isStructData = arrayValueExists(["struct_data",'structdata'],defaultStr(json.type).toLowerCase());
174
+ if(isStructData ){
175
+ if(isObj(json.rows) && Object.size(json.rows) > 0){
176
+ docs = json.rows;
177
+ } else if(isObj(json.docs) && Object.size(json.docs) > 0){
178
+ docs = json.docs;
179
+ }
180
+ let count = 0;
181
+ if(isObj(docs)){
182
+ let {commonDB} = require("$database");
183
+ let promises = [];
184
+ for(let i in docs){
185
+ let table = i.toUpperCase();
186
+ if(table in STRUCT_DATA_TABLES && isObj(docs[i])){
187
+ for(let k in docs[i]){
188
+ let d = docs[i][k];
189
+ if(isObj(d) && isNonNullString(d.code)){
190
+ promises.push(commonDB.upsertStructData(table,d).then(()=>{
191
+ count++;
192
+ }));
193
+ }
194
+ }
195
+ }
196
+ }
197
+ Promise.all(promises).then(()=>{
198
+ if(count > 0){
199
+ notify.success(count+" Données de structures modifiées ");
200
+ }
201
+ })
202
+ }
203
+ ///l'import des données de structure se fait autrement
204
+ return successF();
205
+ } else {
206
+ if(isArray(json.rows) && json.rows.length > 0){
207
+ docs = json.rows;
208
+ } else if(isArray(json.docs) && json.docs.length > 0){
209
+ docs = json.docs;
210
+ }
211
+ if(docs.length <= 0) {
212
+ successF()
213
+ return;
214
+ }
215
+ }
216
+ let allDBS = APP.DATA_FILE_MANAGER.getAll();
217
+ showPreloader({content:preloader+" ...",footer});
218
+
219
+ let doc = null;
220
+ for(let j in docs){
221
+ if(!isObj(docs[j])) continue;
222
+ if(breakLoop) break;
223
+ doc = null;
224
+ if(isObj(docs[j])){
225
+ doc = docs[j];
226
+ if(isObj(docs[j].doc) && (isNonNullString(docs[j].doc._id) || isNonNullString(docs[j].doc._rev))){
227
+ doc = docs[j].doc;
228
+ }
229
+ }
230
+ if(!doc) continue;
231
+ let dbId = APP.DATA_FILE_MANAGER.sanitizeName(defaultStr(doc.dbId,json.dbName));
232
+ let dF = allDBS[dbId];
233
+ if(!isNonNullString(dbId) || !dF) {
234
+ errors.push({status:false,dbId,index:j,msg:"Impossible de faire une importation dans le "+APP.DATA_FILE_MANAGER.dataFileText+" "+dbId+" car celui-ci est innexistant",table:doc.table,tableText:doc.table})
235
+ continue;
236
+ }
237
+ let table = defaultStr(doc.table).toUpperCase();
238
+ if(!arrayValueExists(extraData.ids,doc._id) && !extraData.tables[table]){
239
+ if(!table) {
240
+ errors.push({dbId,index:j,msg:'le champ table est invalide pour la données',status:false,table});
241
+ continue;
242
+ }
243
+ let isDocStructData = dbId.trim() =='struct_data' ? true : false;
244
+ let tb = isDocStructData ? STRUCT_DATA_TABLES[table] : TABLES[table];
245
+ if(!isObj(tb)){
246
+ continue;
247
+ }
248
+ let dbType = defaultStr(dF.type,"seller").toLowerCase();
249
+ let fields = tb.fields;
250
+ if(isDocStructData){
251
+ dbType = "common";
252
+ fields = APP.extend(true,{},{
253
+ code : {
254
+ required : true,
255
+ label: 'Code',
256
+ },label:{
257
+ type : 'text',
258
+ label : 'Libelé',
259
+ required : true,
260
+ }
261
+ },fields);
262
+ }
263
+ if(!isObj(fields)){
264
+ continue;
265
+ }
266
+ if(APP.DATA_FILE_MANAGER.isCommon(tb.dbName)){
267
+ dbType = "common"
268
+ }
269
+ let tableText = defaultStr(tb.label,tb.text,table);
270
+ let _msg = undefined;
271
+ if(dbType == 'common'){
272
+ if(isDocStructData){
273
+ if(dbId !== 'struct_data'){
274
+ _msg = "Impossible d'insérer les données de structure dans le fichier "+dbId;
275
+ }
276
+ } else if(!APP.DATA_FILE_MANAGER.isCommon(dbId)) {
277
+ _msg = "Impossible d'insérer ce type de données dans le "+APP.DATA_FILE_MANAGER.dataFileText+" communes";
278
+ }
279
+ } else if(dbType =='project' && dbId !=='project'){
280
+ _msg = "Impossible d'insérer ce type de données dans le "+APP.DATA_FILE_MANAGER.dataFileText+" des projets";
281
+ } else {
282
+ if((dbType ==='seller' || dbType =='pos') && !arrayValueExists(sellersTables,table)){
283
+ _msg = "Impossible d'enregistrer ce type de données dans un "+APP.DATA_FILE_MANAGER.dataFileText+" commercial";
284
+ }
285
+ }
286
+ if(_msg){
287
+ errors.push({dbId,index:j,msg:_msg,status:false,table,tableText});
288
+ continue;
289
+ }
290
+ if(!doc["has-validate-content-imp"]){
291
+ let vArgs = {data:doc,index:j,fields,requiredFields:defaultArray(tb.import && tb.import.requiredFields? tb.import.requiredFields:[]),table,tableText};
292
+ let msg = validate(vArgs);
293
+ if(isNonNullString(msg)){
294
+ errors.push({dbId,index:j,msg,status:false,table,tableText});
295
+ continue;
296
+ } else if(!msg) continue;
297
+ }
298
+ delete doc["has-validate-content-imp"];
299
+ doc.table = table;
300
+ doc.dbId = dbId;
301
+ }
302
+ doc.dbId = dbId;
303
+ dbs[dbId] = defaultArray(dbs[dbId]);
304
+ dbs[dbId].push(doc);
305
+ }
306
+ if(Object.size(dbs) <= 0){
307
+ return successF();
308
+ }
309
+ let count = 0;
310
+ ///les données sont insérées par base de données;
311
+ for(let dbName in dbs){
312
+ count++;
313
+ if(breakLoop) break;
314
+ getDB(dbName).then(({db})=>{
315
+ let _docs = dbs[dbName];
316
+ let dLen = _docs.length;
317
+ let sLen = dLen.formatNumber()
318
+ let preloadP = preloader+"["+dbName+"]";
319
+ showPreloader({content:preloadP+"...",footer});
320
+ let promises = [];
321
+ let length = 0;
322
+ let c = 0;
323
+ for(let j in _docs){
324
+ let doc = _docs[j];
325
+ doc.table = defaultStr(doc.table).toUpperCase();
326
+ let table = doc.table;
327
+ let isDocStructData = doc.dbId.trim() =='struct_data' ? true : false;
328
+ let tb = isDocStructData ? STRUCT_DATA_TABLES[table] : TABLES[table] || {};
329
+ let tableText = defaultStr(tb.label,tb.text,table);
330
+ let mutator = isCSV ? (isFunction(importer.mutator)? importer.mutator:undefined) : isObj(tb.import) && isFunction(tb.import.mutator)? tb.import.mutator : undefined;
331
+ let dbId = doc.dbId;
332
+ if(mutator){
333
+ doc = mutator({doc,db,dbId,table,tableText});
334
+ }
335
+ if(isNonNullString(doc)){
336
+ errors.push({dbId,index:j,msg:doc,status:false,table,tableText});
337
+ continue;
338
+ } else if(!isObj(doc) || !isNonNullString(doc.table)){
339
+ errors.push({dbId,index:j,msg:"Document non valide, car la table de données est manquante",status:false,table,tableText});
340
+ continue;
341
+ }
342
+ doc._id = db.uniqid({data:doc}).id;
343
+ /**** la fonction de muter la données au moment de la mise à jour */
344
+ let upsertMutator = isCSV ? (isFunction(importer.upsertMutator)? importer.upsertMutator:undefined) : isObj(tb.import) && isFunction(tb.import.upsertMutator)? tb.import.upsertMutator : undefined;
345
+ promises.push(
346
+ db.upsert(
347
+ doc._id,
348
+ (_doc)=>{
349
+ let ret = isCSV? APP.extend({},_doc,doc):APP.extend(true,{},_doc,doc);
350
+ if(upsertMutator){
351
+ return upsertMutator({doc:ret,old:_doc,new:doc,db,dbId:doc.dbId,table,tableText});
352
+ }
353
+ return ret;
354
+ },{updatedBy:false,updatedHour:false,updatedDate:false}
355
+ ).then((u)=>{
356
+ c++;
357
+ showPreloader({
358
+ content : preloadP+", "+(c.formatNumber()+" sur "+sLen+" traités, "+(Math.floor(c*100/dLen)+"%")),
359
+ footer
360
+ }
361
+ )
362
+ return u;
363
+ }).catch((e)=>{
364
+ c++;
365
+ return e;
366
+ })
367
+ );
368
+ length++;
369
+ }
370
+ Promise.all(promises).then((a)=>{
371
+ successF(a);
372
+ showPreloader(preloader+", 100% traités");
373
+ let dF = APP.DATA_FILE_MANAGER.get(dbName);
374
+ if(dF){
375
+ dbName = dF.label;
376
+ }
377
+ let dbPref = " le "+APP.DATA_FILE_MANAGER.dataFileText+" ["+dbName+"]";
378
+ if(promises.length>0){
379
+ notify.success(promises.length+" modification(s) effectuée(s) dans "+dbPref);
380
+ } else {
381
+ notify.success("Auccune modification apportée au "+dbPref);
382
+ }
383
+ setTimeout(()=>{
384
+ hidePreloader();
385
+ },1000);
386
+ }).catch((e)=>{
387
+ if(length >= _docs.length){
388
+ hidePreloader();
389
+ errorF(e);
390
+ }
391
+ })
392
+ }).catch((e)=>{
393
+ if(count >= Object.size(dbs)){
394
+ hidePreloader();
395
+ errorF(e);
396
+ }
397
+ })
398
+ }
399
+ })
400
+ }
@@ -0,0 +1,137 @@
1
+ import getSelectFieldValue from "./getSelectFieldValue";
2
+ import appConfig from "$capp/config";
3
+
4
+ export default function validate(args){
5
+ let {data,requiredFields,index,fields,table,tableText}= defaultObj(args)
6
+ data = defaultObj(data);
7
+ requiredFields = defaultArray(requiredFields);
8
+ if(!isObj(fields)) return "champs de validation incorects";
9
+ for(let i in fields){
10
+ let field = fields[i];
11
+ if(!isObj(field)) continue;
12
+ let code = defaultStr(i,field.code);
13
+ let label = defaultStr(field.label,field.text,i);
14
+ let v = data[code];
15
+ let isFieldSelected = arrayValueExists(requiredFields,code);
16
+ let type = defaultStr(field.type,'text').toLowerCase().trim();
17
+ let validType = defaultStr(field.validType).toLowerCase();
18
+ let lSuffix = isNonNullString(tableText)? ("["+tableText+"]"):"";
19
+ let labelStr = (isNonNullString(v) || isNumber(v) ? (" la valeur <"+v+"> du champ ") : "le champ ")+label+lSuffix+"";
20
+ labelStr += (index)? (", ligne "+index):""
21
+ let isIdField = type == 'id' || type =="piece";
22
+
23
+ /**** les donées passés en paramètre de type tableau */
24
+ if(type.contains("select")){
25
+ if(field.multiple){
26
+ v = isArray(v)? v : (v?(v+""):"").split(",");
27
+ } else v = defaultStr(v);
28
+ let itemCodes = "";
29
+ let itemsL = Object.size((isObjOrArray(field.items)? field.items : [])) > 0 ? true : false;
30
+ let hasF = true;
31
+ let isSelectTableData = type == "selecttabledata";
32
+ if(isArray(v)){
33
+ let arr = [];
34
+ v.map((value)=>{
35
+ if(itemsL){
36
+ let _v = getSelectFieldValue({field,value});
37
+ itemCodes = defaultStr(itemCodes,_v.itemCodes);
38
+ if(_v.value !== false){
39
+ arr.push(_v.value);
40
+ }
41
+ } else if(isNonNullString(value)) {
42
+ arr.push(isSelectTableData? value.toUpperCase():value)
43
+ }
44
+ });
45
+ hasF = arr.length > 0 ? true : false;
46
+ v = arr;
47
+ } else {
48
+ if(itemsL){
49
+ let _v = getSelectFieldValue({field,value:v});
50
+ itemCodes = _v.itemCodes;
51
+ hasF = _v.value !== false? true : false;
52
+ if(hasF){
53
+ v = _v.value;
54
+ }
55
+ }
56
+ if(isSelectTableData && hasF){
57
+ v = v.toUpperCase();
58
+ }
59
+ //eif(isFieldSelected) console.log(hasF, code,_v,' is value');
60
+ }
61
+ if(isFieldSelected && !hasF && itemCodes){
62
+ return labelStr+" doit figurer parmi la liste : ["+itemCodes+"]";
63
+ }
64
+ }
65
+
66
+ if((isIdField || validType.contains("required") || field.required)){
67
+ if(isIdField && isNonNullString(data.table)){
68
+ } else if(v == undefined || v == null || v =='' || (isArray(v) && v.length <= 0)) {
69
+ return labelStr+" est requis";
70
+ }
71
+ }
72
+ if(isIdField && isNonNullString(v)){
73
+ v = v.trim();
74
+ if(!isValidDataFileName(v.replaceAll("/",""))) return labelStr+" a une valeur invalide";
75
+ }
76
+ if(type =="datafile" && v && !APP.DATA_FILE_MANAGER.get(v)){
77
+ return labelStr+ ", le "+APP.DATA_FILE_MANAGER.dataFileText+" "+defaultStr(v) +" est innexistant"
78
+ }
79
+ if((type =="number" || type=="decimal" || validType.contains("number") || validType.contains("decimal"))){
80
+ if(!isNumber(v)){
81
+ v = parseDecimal(v);
82
+ if(!isNumber(v) && isFieldSelected){
83
+ return labelStr+" doit être un nombre";
84
+ } else {
85
+ v = defaultDecimal(v);
86
+ }
87
+ }
88
+ }
89
+
90
+ if(type =='email' && v && !isValidEmail(v,false)){
91
+ return labelStr+" doit être un email valide";
92
+ }
93
+ if(type == 'date' && v){
94
+ let date = APP.date.toDateObj(v,true);
95
+ if(!date || !date.date){
96
+ return labelStr+" doit être une date valide au format yyyy-mm-dd";
97
+ }
98
+ }
99
+ if(type == 'time' && v && !APP.date.isValidSQLTime(v)){
100
+ return labelStr+" doit être une heure valide au format hh:mm:ss";
101
+ }
102
+
103
+ let strValid = labelStr+" doit être une chaine de caractère non nulle ";
104
+ if(isNumber(field.length) && isNonNullString(v) && v.length != field.length){
105
+ return strValid+" de "+field.length + " caractères";
106
+ }
107
+ if(isNumber(field.minLength) && isNonNullString(v) && v.length < field.minLength){
108
+ return strValid+" de "+field.minLength+" caractères minimum";
109
+ }
110
+ if(isNumber(field.maxLength) && isNonNullString(v) && v.length > field.maxLength){
111
+ return strValid+" de "+field.maxLength+" caractères maximum";
112
+ }
113
+ if(type =='switch'){
114
+ let checkedLabel = defaultStr(field.checkedLabel,code =='archived'?'Archivé':'Désactivé').toLowerCase().trim(),
115
+ uncheckedLabel = defaultStr(field.uncheckedLabel,code =='archived'?'Non archivé':'Activé').toLowerCase().trim(),
116
+ checkedValue = defaultVal(field.checkedValue,1),uncheckedValue = defaultVal(field.uncheckedValue,0)
117
+ v = (defaultVal(v,field.defaultValue,"")+"").toLowerCase().trim();
118
+ if(v == checkedValue+""){
119
+ v = checkedValue;
120
+ } else if(v == uncheckedValue+""){
121
+ v = uncheckedValue;
122
+ } else if(v == checkedLabel){
123
+ v = checkedValue;
124
+ } else if(v == uncheckedLabel){
125
+ v = uncheckedValue;
126
+ }
127
+ if(!arrayValueExists([checkedValue,uncheckedValue],v)){
128
+ return labelStr+" doit l'une des valeur : "+checkedLabel+"/"+uncheckedLabel+"/"+checkedValue+"/"+uncheckedValue;
129
+ }
130
+ }
131
+ if(isFieldSelected && v !== undefined){
132
+ data[code] = v;
133
+ }
134
+ }
135
+ data["has-validate-content-imp"] = true;
136
+ return true;
137
+ }
@@ -1,7 +1,7 @@
1
1
  module.exports = {
2
2
  "@fto-consult/expo-ui": {
3
3
  "name": "@fto-consult/expo-ui",
4
- "version": "8.59.0",
4
+ "version": "8.60.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/borispipo/expo-ui.git"
@@ -136,7 +136,7 @@ module.exports = {
136
136
  "license": "MIT"
137
137
  },
138
138
  "react-virtuoso": {
139
- "version": "4.7.4",
139
+ "version": "4.7.7",
140
140
  "url": "https://virtuoso.dev/",
141
141
  "license": "MIT"
142
142
  },