@fto-consult/expo-ui 2.36.4 → 2.36.5

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": "2.36.4",
3
+ "version": "2.36.5",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -9,10 +9,8 @@ import Tooltip from "$ecomponents/Tooltip";
9
9
  import setQueryLimit from "./setQueryLimit";
10
10
  import {showConfirm} from "$ecomponents/Dialog";
11
11
  import Label from "$ecomponents/Label";
12
- import Image from "$ecomponents/Image";
13
12
  import Icon,{COPY_ICON} from "$ecomponents/Icon";
14
13
  import filterUtils from "$cfilters";
15
- import Hashtag from "$ecomponents/Hashtag";
16
14
  import {sortBy,isDecimal,defaultVal,extendObj,isObjOrArray,isObj,defaultNumber,defaultStr,isFunction,defaultBool,defaultArray,defaultObj,isNonNullString,defaultDecimal} from "$utils";
17
15
  import {Datagrid as DatagridContentLoader} from "$ecomponents/ContentLoader";
18
16
  import React from "$react";
@@ -25,15 +23,11 @@ import Preloader from "$ecomponents/Preloader";
25
23
  import Checkbox from "../Checkbox";
26
24
  import { TouchableRipple } from "react-native-paper";
27
25
  import { evalSingleValue,Footer,getFooterColumnValue,isValidAggregator,extendAggreagatorFunctions} from "../Footer";
28
- import i18n from "$i18n";
29
26
  import { makePhoneCall,canMakePhoneCall as canMakeCall} from "$makePhoneCall";
30
27
  import copyToClipboard from "$capp/clipboard";
31
28
  import { Pressable } from "react-native";
32
- import TableLink from "$TableLink";
33
- import appConfig from "$capp/config";
34
29
  import stableHash from "stable-hash";
35
30
  import DatagridProgressBar from "./ProgressBar";
36
- import {Flag} from "$ecomponents/Countries"
37
31
  import View from "$ecomponents/View";
38
32
  import {Menu} from "$ecomponents/BottomSheet";
39
33
  import {styles as tableStyles} from "$ecomponents/Table";
@@ -42,6 +36,7 @@ import Chart,{getMaxSupportedSeriesSize} from "$ecomponents/Chart";
42
36
  import notify from "$cnotify";
43
37
  import FileSystem from "$file-system";
44
38
  import sprintf from "$cutils/sprintf";
39
+ import { renderRowCell,formatValue } from "./utils";
45
40
 
46
41
  export const TIMEOUT = 100;
47
42
 
@@ -1417,11 +1412,7 @@ export default class CommonDatagridComponent extends AppComponent {
1417
1412
  },TIMEOUT);
1418
1413
  }
1419
1414
  formatValue(value,format){
1420
- if(typeof value !='number') return value;
1421
- if(format && typeof format =='string' && format.toLowerCase() =='money'){
1422
- return this.state.abreviateValues? value.abreviate2FormatMoney() : value.formatMoney();
1423
- }
1424
- return this.state.abreviateValues ? value.abreviate() : value.formatNumber();
1415
+ return formatValue(value,format,this.state.abreviateValues);
1425
1416
  }
1426
1417
  renderAggregatorFunctionsMenu(){
1427
1418
  const m = this.getAggregatorFunctionsMenuItems(false,false);
@@ -3165,44 +3156,8 @@ export default class CommonDatagridComponent extends AppComponent {
3165
3156
  key = {props.rowKey}
3166
3157
  />
3167
3158
  }
3168
- renderSelectFieldCell({rowData,columnDef,columnField}){
3169
- let v1 = rowData[columnField],_render = v1;
3170
- if(isObjOrArray(columnDef.items)){
3171
- if(columnDef.multiple){
3172
- v1 = Object.toArray(v1);
3173
- _render = "";
3174
- v1.map((v)=>{
3175
- for(let i in columnDef.items){
3176
- let it = columnDef.items[i];
3177
- if(isObj(it) && defaultVal(it.code,i) == v){
3178
- _render+=(_render?arrayValueSeparator:"")+defaultStr(it.label,it.text,v);
3179
- } else if(isNonNullString(it) && i == v){
3180
- _render+=(_render?arrayValueSeparator:"")+it;
3181
- }
3182
- }
3183
- })
3184
- if(!_render){
3185
- return v1.join(arrayValueSeparator);
3186
- }
3187
- return _render;
3188
- } else {
3189
- for(let i in columnDef.items){
3190
- let it = columnDef.items[i];
3191
- if(isObj(it) && defaultVal(it.code,i) == v1){
3192
- return defaultStr(it.label,it.text,v1);
3193
- } else if(isNonNullString(it) && i == v1){
3194
- return it;
3195
- }
3196
- }
3197
- if(_render === undefined || _render === null) return v1;
3198
- if(isArray(_render)){
3199
- return _render.join(arrayValueSeparator)
3200
- } else if(isObj(_render)){
3201
- return "";
3202
- }
3203
- }
3204
- }
3205
- return _render
3159
+ renderSelectFieldCell(args){
3160
+ return this.renderSelectFieldCell(args);
3206
3161
  }
3207
3162
  /*** retourne le rendu d'une cellule de la ligne du tableau
3208
3163
  @parm, rowData, object, la ligne à afficher le rendu du contenu
@@ -3217,157 +3172,34 @@ export default class CommonDatagridComponent extends AppComponent {
3217
3172
  différent du td d'un table et ne doit pas être un TableColumn de md
3218
3173
  */
3219
3174
  renderRowCell (arg){
3220
- let {rowData,renderRowCell:customRenderRowCell,isSectionListHeader,rowKey,handleSelectableColumn,rowIndex,index,rowCounterIndex,columnDef,columnField} = arg;
3175
+ let {rowData,rowKey,rowIndex,handleSelectableColumn,rowCounterIndex,renderRowCell:customRenderRowCell,isSectionListHeader,columnDef,columnField} = arg;
3221
3176
  const renderText = isSectionListHeader === true || customRenderRowCell === false ? true : false;
3222
- rowIndex = isDecimal(rowIndex)? rowIndex : isDecimal(index)? index : undefined;
3223
- rowCounterIndex = isDecimal(rowCounterIndex) ? rowCounterIndex : isDecimal(rowIndex)? rowIndex+1 : defaultDecimal(rowCounterIndex);
3224
- const abreviate = this.state.abreviateValues;
3225
3177
  if(!isObj(rowData)) return renderText ? null : {render:null,extra:{}};
3226
- let _render = null;
3227
- columnDef = defaultObj(columnDef);
3228
- let _type = defaultStr(columnDef.jsType,columnDef.type).trim().toLowerCase();
3229
- if(this.isSelectableColumn(columnDef,columnField)){
3230
- if(renderText) return null;
3231
- rowKey = rowKey ? rowKey : this.getRowKey(rowData,rowIndex);
3232
- return {render :handleSelectableColumn === false ? null : this.renderSelectableCheckboxCell({
3233
- ...arg,
3234
- rowKey,
3235
- rowData,
3236
- checked : this.isRowSelected(rowKey,rowIndex),
3237
- rowsRefs : this.selectedRowsRefs,
3238
- onChange : ({checked})=>{
3239
- this.handleRowToggle({row:rowData,rowData,rowIndex,rowKey,selected:checked})
3240
- }
3241
- }),style:{},extra:{style:{}}};
3242
- } else if((columnField == this.getIndexColumnName())){
3178
+ rowIndex = isDecimal(rowIndex)? rowIndex : isDecimal(index)? index : undefined;
3179
+ rowCounterIndex = isDecimal(rowCounterIndex) ? rowCounterIndex : isDecimal(rowIndex)? rowIndex+1 : defaultDecimal(rowCounterIndex);
3180
+ if(this.isSelectableColumn(columnDef,columnField)){
3243
3181
  if(renderText) return null;
3182
+ rowKey = rowKey ? rowKey : this.getRowKey(rowData,rowIndex);
3183
+ return {render :handleSelectableColumn === false ? null : this.renderSelectableCheckboxCell({
3184
+ ...arg,
3185
+ rowKey,
3186
+ rowData,
3187
+ checked : this.isRowSelected(rowKey,rowIndex),
3188
+ rowsRefs : this.selectedRowsRefs,
3189
+ onChange : ({checked})=>{
3190
+ this.handleRowToggle({row:rowData,rowData,rowIndex,rowKey,selected:checked})
3191
+ }
3192
+ }),style:{},extra:{style:{}}};
3193
+ } else if((columnField == this.getIndexColumnName())){
3194
+ if(renderText) return null;
3244
3195
  return {render : rowCounterIndex.formatNumber(),style:{},extra:{}};
3245
- }
3246
- let renderProps = undefined;
3247
- if(isObj(columnDef.datagrid)){
3248
- renderProps = columnDef.datagrid.renderProps;
3249
- }
3250
- const style = Object.assign({},StyleSheet.flatten(columnDef.style));
3251
- if(!renderText && columnDef.visible === false){
3252
- style.display = "none";
3253
- }
3254
- let extra = {style},renderArgs = arg;
3255
-
3256
- renderArgs.extra = extra;
3257
- renderArgs.item = rowData;
3258
- const defaultValue = renderArgs.defaultValue = renderArgs.value = rowData[columnField];
3259
- let key = this.getRowKey(rowData,rowIndex)+"-"+columnField,isTagRender = defaultStr(columnDef.table).toLowerCase().contains("tags");
3260
- if(isObj(columnDef.datagrid) && isFunction(columnDef.datagrid.render)){
3261
- _render = columnDef.datagrid.render.call(this,renderArgs);
3262
- } else if(isFunction(columnDef.multiplicater)){
3263
- _render = defaultDecimal(columnDef.multiplicater({...renderArgs,value:rowData[columnField]}),rowData[columnField]);
3264
- } else {
3265
- _render = defaultValue;
3266
- if(!renderText && defaultStr(columnDef.format).toLowerCase() === 'hashtag'){
3267
- _render = <Hashtag>{_render}</Hashtag>
3268
- } else if(typeof columnDef.render === "function"){
3269
- _render = columnDef.render.call(this,renderArgs);
3270
- } else if(arrayValueExists( _type,["date","datetime","time"])){
3271
- let _dd =DateLib.parse(rowData[columnField],_type === 'time'?DateLib.isoTimeFormat:DateLib.SQLDateFormat);
3272
- if(DateLib.isDateObj(_dd)){
3273
- _render = DateLib.format(_dd,defaultStr(columnDef.format,(_type === 'time'?DateLib.defaultTimeFormat:DateLib.masks.defaultDate)));
3274
- }
3275
- if(!_render) _render = rowData[columnField]
3276
- } else if(arrayValueExists(_type,['switch','checkbox'])){
3277
- let {checkedLabel,checkedTooltip,uncheckedTooltip,checkedValue,uncheckedLabel,uncheckedValue} = columnDef;
3278
- checkedLabel = defaultStr(checkedLabel,'Oui')
3279
- uncheckedLabel = defaultStr(uncheckedLabel,'Non')
3280
- checkedValue = defaultVal(checkedValue,1); uncheckedValue = defaultVal(uncheckedValue,0)
3281
- let val = defaultVal(rowData[columnField],columnDef.defaultValue,columnDef.value)
3282
- if(val === checkedValue){
3283
- _render = checkedLabel;
3284
- } else _render = uncheckedLabel;
3285
- }
3286
- else if(!renderText && (_type =='select_country' || _type =='selectcountry')){
3287
- _render = <Flag withCode {...columnDef} length={undefined} width={undefined} height={undefined} code={defaultValue}/>
3288
- }
3289
- ///le lien vers le table data se fait via la colonne ayant la propriété foreignKeyTable de type chaine de caractère non nulle
3290
- else if(!renderText && (isNonNullString(columnDef.foreignKeyTable) || columnDef.primaryKey === true || arrayValueExists(['id','piece'],_type))){
3291
- const id = rowData[columnField]?.toString();
3292
- if(isNonNullString(id)){
3293
- _render = <TableLink
3294
- id = {id}
3295
- foreignKeyTable = {defaultStr(columnDef.foreignKeyTable,columnDef.table,columnDef.tableName)}
3296
- foreignKeyColumn = {defaultStr(columnDef.foreignKeyColumn,columnDef.field)}
3297
- {...columnDef}
3298
- data = {rowData}
3299
- columnField = {columnField}
3300
- >
3301
- {this.renderSelectFieldCell({columnDef,columnField,rowData})}
3302
- </TableLink>
3303
- }
3304
- } else if((_type.contains('select'))){
3305
- _render= this.renderSelectFieldCell({columnDef,columnField,rowData,data:rowData})
3306
- } else if(_type == 'image'){
3307
- if(renderText) return null;
3308
- columnDef = defaultObj(columnDef)
3309
- columnDef = {...columnDef,...defaultObj(columnDef.datagrid)};
3310
- columnDef.size = defaultDecimal(columnDef.size,50);
3311
- columnDef.editable = defaultBool(columnDef.editable,false)
3312
- columnDef.rounded = defaultBool(columnDef.rounded,columnDef.round,true);
3313
- columnDef.src = rowData[columnField];
3314
- _render = <Image {...columnDef}/>
3315
- }
3316
- if(_render === undefined || _render ===null){
3317
- _render = rowData[columnField];
3318
- }
3319
- if(columnDef.type =="password" && isNonNullString(_render)){
3320
- let l = Math.max(_render.length,20);
3321
- _render = "";
3322
- for(let i=0;i<l;i++){
3323
- _render+=".";
3324
- }
3325
- }
3326
- if(isArray(_render)){
3327
- if(isTagRender){
3328
- let nV = "";
3329
- _render.map((v1)=>{
3330
- nV +=(nV?arrayValueSeparator:"")+i18n.lang(v1,v1);
3331
- })
3332
- _render = nV;
3333
- } else {
3334
- _render = _render.join(arrayValueSeparator);
3335
- }
3336
- }
3337
- }
3338
- if(_render ===undefined){
3339
- _render = rowData[columnField];
3340
- }
3341
- if(isArray(_render)){
3342
- _render = _render.join(arrayValueSeparator);
3343
- } else if(!React.isValidElement(_render) && isPlainObj(_render)){
3344
- let __r = "";
3345
- for(let i in _render){
3346
- __r+= (isObj(_render[i]) && _render[i]? (_render[i].code? _render[i].code:defaultStr(_render[i].label)):(_render[i]))
3347
- }
3348
- _render = __r;
3349
- }
3350
- if(isFunction(renderProps)){
3351
- renderProps = renderProps.call(this,renderArgs);
3352
- }
3353
- _render = this.formatValue(_render,columnDef.format);
3354
- if(!renderText && _render && isObj(renderProps)){
3355
- let Component = defaultVal(renderProps.Component,Label);
3356
- delete renderProps.Component;
3357
- _render = <Component {...renderProps}>{_render}</Component>
3358
- }
3359
- if(typeof _render =='boolean'){
3360
- _render = _render ? "Oui" : "Non";
3361
- }
3362
- if(renderText){
3363
- return React.getTextContent(_render);
3364
- }
3365
- if((typeof _render ==='string' || typeof _render =='number')){
3366
- _render = <Label selectable>{_render}</Label>
3367
- }
3368
-
3369
- _render = React.isValidElement(_render)|| Array.isArray(_render)?_render:null;
3370
- return {render:_render,style,extra,key};
3196
+ }
3197
+ return renderRowCell({
3198
+ ...arg,
3199
+ context : this,
3200
+ getRowKey : this.getRowKey.bind(this),
3201
+ abreviateValues : this.state.abreviateValues,
3202
+ })
3371
3203
  }
3372
3204
  static LinesProgressBar (props){
3373
3205
  return <DatagridContentLoader {...props}/>
@@ -4,4 +4,5 @@ export {default as TableData} from "./TableData";
4
4
 
5
5
  export {default as factory} from "./factory";
6
6
 
7
- export {default as session} from "./session";
7
+ export {default as session} from "./session";
8
+ export * from "./utils";
@@ -0,0 +1,188 @@
1
+ // Copyright 2023 @fto-consult/Boris Fouomene. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+ import {isNonNullString,isArray,isObjOrArray,defaultStr,defaultArray,defaultObj,isObj} from "$utils";
5
+ import Hashtag from "$ecomponents/Hashtag";
6
+ import DateLib from "$date";
7
+ import Image from "$ecomponents/Image";
8
+ import React from "$react";
9
+ import Label from "$ecomponents/Label";
10
+ import TableLink from "$TableLink";
11
+ import {Flag} from "$ecomponents/Countries";
12
+ import { StyleSheet } from "react-native";
13
+
14
+ export const renderRowCell = (arg)=>{
15
+ let {rowData,getRowKey,context,renderRowCell:customRenderRowCell,abreviateValues,isSectionListHeader,rowIndex,index,rowCounterIndex,columnDef,columnField} = arg;
16
+ context = context || this;
17
+ const renderText = isSectionListHeader === true || customRenderRowCell === false ? true : false;
18
+ rowIndex = isDecimal(rowIndex)? rowIndex : isDecimal(index)? index : undefined;
19
+ rowCounterIndex = isDecimal(rowCounterIndex) ? rowCounterIndex : isDecimal(rowIndex)? rowIndex+1 : defaultDecimal(rowCounterIndex);
20
+ if(!isObj(rowData)) return renderText ? null : {render:null,extra:{}};
21
+ let _render = null;
22
+ getRowKey = typeof getRowKey =='function'? getRowKey : React.getKey;
23
+ columnDef = defaultObj(columnDef);
24
+ let _type = defaultStr(columnDef.jsType,columnDef.type).trim().toLowerCase().replaceAll("_","");
25
+ let renderProps = undefined;
26
+ if(isObj(columnDef.datagrid)){
27
+ renderProps = columnDef.datagrid.renderProps;
28
+ }
29
+ const style = Object.assign({},StyleSheet.flatten(columnDef.style));
30
+ if(!renderText && columnDef.visible === false){
31
+ style.display = "none";
32
+ }
33
+ const extra = {style},renderArgs = arg;
34
+ renderArgs.extra = extra;
35
+ renderArgs.item = rowData;
36
+ const defaultValue = renderArgs.defaultValue = renderArgs.value = rowData[columnField];
37
+ let key = getRowKey.call(context,rowData,rowIndex)+"-"+columnField;
38
+ if(isObj(columnDef.datagrid) && isFunction(columnDef.datagrid.render)){
39
+ _render = columnDef.datagrid.render.call(context,renderArgs);
40
+ } else if(isFunction(columnDef.multiplicater)){
41
+ _render = defaultDecimal(columnDef.multiplicater({...renderArgs,value:rowData[columnField]}),rowData[columnField]);
42
+ } else {
43
+ _render = defaultValue;
44
+ if(!renderText && defaultStr(columnDef.format).toLowerCase() === 'hashtag'){
45
+ _render = <Hashtag>{_render}</Hashtag>
46
+ } else if(typeof columnDef.render === "function"){
47
+ _render = columnDef.render.call(context,renderArgs);
48
+ } else if(arrayValueExists( _type,["date","datetime","time"])){
49
+ let _dd =DateLib.parse(rowData[columnField],_type === 'time'?DateLib.isoTimeFormat:DateLib.SQLDateFormat);
50
+ if(DateLib.isDateObj(_dd)){
51
+ _render = DateLib.format(_dd,defaultStr(columnDef.format,(_type === 'time'?DateLib.defaultTimeFormat:DateLib.masks.defaultDate)));
52
+ }
53
+ if(!_render) _render = rowData[columnField]
54
+ } else if(arrayValueExists(_type,['switch','checkbox'])){
55
+ let {checkedLabel,checkedValue,uncheckedLabel,uncheckedValue} = columnDef;
56
+ checkedLabel = defaultStr(checkedLabel,'Oui')
57
+ uncheckedLabel = defaultStr(uncheckedLabel,'Non')
58
+ checkedValue = defaultVal(checkedValue,1); uncheckedValue = defaultVal(uncheckedValue,0)
59
+ let val = defaultVal(rowData[columnField],columnDef.defaultValue,columnDef.value)
60
+ if(val === checkedValue){
61
+ _render = checkedLabel;
62
+ } else _render = uncheckedLabel;
63
+ }
64
+ else if(!renderText && (_type =='selectcountry')){
65
+ _render = <Flag withCode {...columnDef} length={undefined} width={undefined} height={undefined} code={defaultValue}/>
66
+ }
67
+ ///le lien vers le table data se fait via la colonne ayant la propriété foreignKeyTable de type chaine de caractère non nulle
68
+ else if(!renderText && (isNonNullString(columnDef.foreignKeyTable) || columnDef.primaryKey === true || arrayValueExists(['id','piece'],_type))){
69
+ const id = rowData[columnField]?.toString();
70
+ if(isNonNullString(id)){
71
+ _render = <TableLink
72
+ id = {id}
73
+ foreignKeyTable = {defaultStr(columnDef.foreignKeyTable,columnDef.table,columnDef.tableName)}
74
+ foreignKeyColumn = {defaultStr(columnDef.foreignKeyColumn,columnDef.field)}
75
+ {...columnDef}
76
+ data = {rowData}
77
+ columnField = {columnField}
78
+ >
79
+ {renderSelectFieldCell({columnDef,columnField,rowData})}
80
+ </TableLink>
81
+ }
82
+ } else if((_type.contains('select'))){
83
+ _render= renderSelectFieldCell({columnDef,columnField,rowData,data:rowData})
84
+ } else if(_type == 'image'){
85
+ if(renderText) return null;
86
+ columnDef = defaultObj(columnDef)
87
+ columnDef = {...columnDef,...defaultObj(columnDef.datagrid)};
88
+ columnDef.size = defaultDecimal(columnDef.size,50);
89
+ columnDef.editable = defaultBool(columnDef.editable,false)
90
+ columnDef.rounded = defaultBool(columnDef.rounded,columnDef.round,true);
91
+ columnDef.src = rowData[columnField];
92
+ _render = <Image {...columnDef}/>
93
+ }
94
+ if(_render === undefined || _render ===null){
95
+ _render = rowData[columnField];
96
+ }
97
+ if(columnDef.type =="password" && isNonNullString(_render)){
98
+ let l = Math.max(_render.length,20);
99
+ _render = "";
100
+ for(let i=0;i<l;i++){
101
+ _render+=".";
102
+ }
103
+ }
104
+ if(isArray(_render)){
105
+ _render = _render.join(arrayValueSeparator);
106
+ }
107
+ }
108
+ if(_render ===undefined){
109
+ _render = rowData[columnField];
110
+ }
111
+ if(isArray(_render)){
112
+ _render = _render.join(arrayValueSeparator);
113
+ } else if(!React.isValidElement(_render) && isPlainObj(_render)){
114
+ let __r = "";
115
+ for(let i in _render){
116
+ __r+= (isObj(_render[i]) && _render[i]? (_render[i].code? _render[i].code:defaultStr(_render[i].label)):(_render[i]))
117
+ }
118
+ _render = __r;
119
+ }
120
+ if(isFunction(renderProps)){
121
+ renderProps = renderProps.call(context,renderArgs);
122
+ }
123
+ _render = formatValue(_render,columnDef.format,abreviateValues);
124
+ if(!renderText && _render && isObj(renderProps)){
125
+ let Component = defaultVal(renderProps.Component,Label);
126
+ delete renderProps.Component;
127
+ _render = <Component {...renderProps}>{_render}</Component>
128
+ }
129
+ if(typeof _render =='boolean'){
130
+ _render = _render ? "Oui" : "Non";
131
+ }
132
+ if(renderText){
133
+ return React.getTextContent(_render);
134
+ }
135
+ if((typeof _render ==='string' || typeof _render =='number')){
136
+ _render = <Label selectable>{_render}</Label>
137
+ }
138
+ _render = React.isValidElement(_render)|| Array.isArray(_render)?_render:null;
139
+ return {render:_render,style,extra,key};
140
+ }
141
+
142
+ export const renderSelectFieldCell= ({rowData,columnDef,columnField})=>{
143
+ let v1 = rowData[columnField],_render = v1;
144
+ if(isObjOrArray(columnDef.items)){
145
+ if(columnDef.multiple){
146
+ v1 = Object.toArray(v1);
147
+ _render = "";
148
+ v1.map((v)=>{
149
+ for(let i in columnDef.items){
150
+ let it = columnDef.items[i];
151
+ if(isObj(it) && defaultVal(it.code,i) == v){
152
+ _render+=(_render?arrayValueSeparator:"")+defaultStr(it.label,it.text,v);
153
+ } else if(isNonNullString(it) && i == v){
154
+ _render+=(_render?arrayValueSeparator:"")+it;
155
+ }
156
+ }
157
+ })
158
+ if(!_render){
159
+ return v1.join(arrayValueSeparator);
160
+ }
161
+ return _render;
162
+ } else {
163
+ for(let i in columnDef.items){
164
+ let it = columnDef.items[i];
165
+ if(isObj(it) && defaultVal(it.code,i) == v1){
166
+ return defaultStr(it.label,it.text,v1);
167
+ } else if(isNonNullString(it) && i == v1){
168
+ return it;
169
+ }
170
+ }
171
+ if(_render === undefined || _render === null) return v1;
172
+ if(isArray(_render)){
173
+ return _render.join(arrayValueSeparator)
174
+ } else if(isObj(_render)){
175
+ return "";
176
+ }
177
+ }
178
+ }
179
+ return _render
180
+ }
181
+
182
+ export const formatValue = (value,format,abreviateValues)=>{
183
+ if(typeof value !='number') return value;
184
+ if(format && typeof format =='string' && format.toLowerCase() =='money'){
185
+ return abreviateValues? value.abreviate2FormatMoney() : value.formatMoney();
186
+ }
187
+ return abreviateValues ? value.abreviate() : value.formatNumber();
188
+ }
@@ -996,7 +996,7 @@ class DropdownComponent extends AppComponent {
996
996
  contentStyle = {[{paddingVertical:0},restProps.contentStyle]}
997
997
  anchor={anchor}
998
998
  {...dialogProps}
999
- title = {defaultStr(dialogProps.title,label,text)+"[ "+self.state.data.length.formatNumber()+" ]"}
999
+ title = {defaultStr(dialogProps.title,label,text)+" [ "+self.state.data.length.formatNumber()+" ]"}
1000
1000
  subtitle = {selectedText}
1001
1001
  style = {[restProps.style]}
1002
1002
  contentProps = {{style:{flex:1}}}
@@ -513,6 +513,10 @@ export default class Filter extends AppComponent {
513
513
  isLoading = !!isLoading;
514
514
  rest.pointerEvents = !isLoading ? "auto" : "none";
515
515
  if(withLabel ===false){
516
+ if(type.contains("select")){
517
+ rest.dialogProps = defaultObj(rest.dialogProps);
518
+ rest.dialogProps.title = defaultStr(rest.dialogProps.title,label);
519
+ }
516
520
  delete rest.label;
517
521
  delete rest.text;
518
522
  delete rest.title;
@@ -2,7 +2,6 @@ import Field from "./Field";
2
2
  import Dropdown from "$ecomponents/Dropdown";
3
3
  import PropTypes from "prop-types";
4
4
  import {isObj} from "$utils";
5
- import appConfig from "$capp/config";
6
5
 
7
6
  export default class FormSelectField extends Field{
8
7
  constructor(props) {
@@ -110,16 +109,11 @@ export default class FormSelectField extends Field{
110
109
  _render (componentProps){
111
110
  let {
112
111
  getInstance,
113
- _defaultValue,
114
112
  ...props
115
113
  } = componentProps;
116
114
  delete props.format;
117
115
  delete props.import;
118
116
  delete props.exports;
119
- const isCountry = this.type.contains('country');
120
- if( isCountry && props.multiple !== true){
121
- props.defaultValue = defaultStr(props.defaultValue,appConfig.countryCode,appConfig.get("countryCode","country"));
122
- }
123
117
  return <Dropdown
124
118
  {...props}
125
119
  ref = {(el)=>{
@@ -195,7 +195,13 @@ const TableDataSelectField = React.forwardRef((_props,ref)=>{
195
195
  return (itemLabel !== itemCode ? ((isNonNullString(itemCode)?("["+itemCode+"] "):"")+itemLabel):itemLabel);
196
196
  }
197
197
  const dialogProps = defaultObj(props.dialogProps);
198
- dialogProps.title = defaultStr(dialogProps.title,fKeyTable.text,fKeyTable.label)
198
+ let ttitle = defaultStr(dialogProps.title);
199
+ if(!ttitle){
200
+ const txt = defaultStr(props.label,props.text);
201
+ const tt = defaultStr(fKeyTable.text,fKeyTable.label);
202
+ ttitle = txt && tt ? "{0} [1]".sprintf(txt,tt) : tt || txt;
203
+ }
204
+ dialogProps.title = ttitle;
199
205
  return <Dropdown
200
206
  {...props}
201
207
  isFilter = {isFilter}
@@ -71,20 +71,24 @@ export const getFilterComponentProps = (_props)=>{
71
71
  type = defaultStr(jsType,type,'text').toLowerCase().replaceAll("_","").replaceAll("-","").trim();
72
72
  const sanitizedType = type.replaceAll("_","").toLowerCase().trim();
73
73
  props = defaultObj(props);
74
+ props.label = defaultStr(label,text);
74
75
  if(type.startsWith("select")){
75
76
  props.inputProps = Object.assign({},props.inputProps);
76
77
  props.inputProps.placeholder = defaultStr(props.inputProps.placeholder,i18n.lang("search.."))
77
- props.label = label;
78
78
  component = Fields.SelectField;
79
79
  if(type =='select_country' || type =='selectcountry'){
80
80
  component = Fields.SelectCountry;
81
81
  } else if(type =='select_tabledata' || type =='selecttabledata'){
82
82
  component = Fields.SelectTableData;
83
+ } else if(React.isComponent(componentTypes[type])){
84
+ component = componentTypes[type];
85
+ } else if(React.isComponent(componentTypes[sanitizedType])){
86
+ component = componentTypes[sanitizedType];
83
87
  }
84
88
  type = "select";
85
89
  } else if(type == 'switch' || type =='radio' || type ==='checkbox') {
86
90
  type = 'select';
87
- let {checkedLabel,checkedTooltip,uncheckedTooltip,checkedValue,uncheckedLabel,uncheckedValue,label,text,...pR} = props;
91
+ let {checkedLabel,checkedTooltip,uncheckedTooltip,checkedValue,uncheckedLabel,uncheckedValue,...pR} = props;
88
92
  checkedLabel = defaultVal(checkedLabel,'Non')
89
93
  uncheckedLabel = defaultVal(uncheckedLabel,'Oui')
90
94
  checkedValue = defaultVal(checkedValue,1); uncheckedValue = defaultVal(uncheckedValue,0)
@@ -101,7 +105,6 @@ export const getFilterComponentProps = (_props)=>{
101
105
  component = componentTypes[type];
102
106
  } else if(isNonNullString(props.foreignKeyColumn) && isNonNullString(props.foreignKeyTable)) {
103
107
  component = Fields.SelectTableData;
104
- props.multiple = true;
105
108
  type = "select";
106
109
  }else {
107
110
  if(React.isComponent(componentTypes[sanitizedType])){
@@ -109,8 +112,7 @@ export const getFilterComponentProps = (_props)=>{
109
112
  }
110
113
  delete props.dbName;
111
114
  delete props.tableName;
112
- props.label = label;
113
- delete props.fieldName;
115
+ delete props.fieldName;
114
116
  }
115
117
  type = type || "text"
116
118
  if(type =='select'){