@fto-consult/expo-ui 2.0.14 → 2.1.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": "2.0.14",
3
+ "version": "2.1.0",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -17,7 +17,6 @@ let windowWidth = Dimensions.get("window").width;
17
17
  const FiltersAccordionComponent = React.forwardRef((props,ref)=>{
18
18
  const {filters,isLoading,filteredColumns,children,filterTitle:customFilterTitle,visible:customVisible,orOperator,andOperator,onToggleFilters,context:customContext,...restProps} = props;
19
19
  const context = defaultObj(customContext);
20
- const filtersValuesRef = React.useRef({});
21
20
  const [state,setState] = React.useState({
22
21
  visible : defaultBool(customVisible,false),
23
22
  visibleColumns : defaultObj(filteredColumns),
@@ -55,8 +54,7 @@ const FiltersAccordionComponent = React.forwardRef((props,ref)=>{
55
54
  }}
56
55
  />)
57
56
  if(!visible) return;
58
- const fOp = defaultObj(filtersValuesRef.current[key]);
59
- let defVal = isObj(filtersValuesRef.current[key]) ? filtersValuesRef.current[key].defaultValue : "";
57
+ let defVal = filter.defaultValue;
60
58
  if(typeof defVal !== 'string' && typeof defVal !=='boolean'){
61
59
  if(Array.isArray(defVal)){
62
60
  defVal = "["+defVal.join(",")+"]";
@@ -69,13 +67,11 @@ const FiltersAccordionComponent = React.forwardRef((props,ref)=>{
69
67
  mainFilterTitle +=(content.length?",":"")+"\n"+defaultStr(filter.label,filter.text,filter.field)+" : "+defVal+""
70
68
  content.push(<Filter
71
69
  {...filter}
72
- {...fOp}
73
70
  dynamicRendered
74
71
  isLoading = {isLoading && filteredRef.current[key] ? true : false}
75
72
  orOperator = {defaultBool(orOperator,filter.orOperator,true)}
76
73
  andOperator = {defaultBool(andOperator,filter.andOperator,true)}
77
74
  onChange = {(arg)=>{
78
- filtersValuesRef.current[key] = getFilterStateValues(arg);
79
75
  const canHandle = canHandleFilter(arg);
80
76
  if(filteredRef.current[key] !== canHandle){
81
77
  if(canHandle){
@@ -90,7 +86,6 @@ const FiltersAccordionComponent = React.forwardRef((props,ref)=>{
90
86
  }
91
87
  }}
92
88
  withBottomSheet
93
- //style = {[styles.filter,filter.style]}
94
89
  containerProps = {{...containerProps}}
95
90
  inputProps = {{containerProps}}
96
91
  />)
@@ -245,7 +245,7 @@ const DatagridFactory = (Factory)=>{
245
245
  getMaxSelectedRows(){
246
246
  return isMobileMedia()? 30 : 50;
247
247
  }
248
- renderFilter(props,headerFilters){
248
+ prepareFilter(props,headerFilters){
249
249
  return headerFilters.push(props);
250
250
  }
251
251
  showFilters(){
@@ -31,6 +31,7 @@ import copyToClipboard from "$capp/clipboard";
31
31
  import { Pressable } from "react-native";
32
32
  import TableLink from "$TableLink";
33
33
  import appConfig from "$capp/config";
34
+ import stableHash from "stable-hash"
34
35
 
35
36
  export const arrayValueSeparator = ", ";
36
37
 
@@ -115,10 +116,10 @@ export default class CommonDatagridComponent extends AppComponent {
115
116
  if(isPlainObject(f)){
116
117
  this.filters[v] = f;
117
118
  this.filters[v].field = defaultStr(f.field,v);
118
- this.filters[v].originalValue = defaultVal(this.filters[v].originalValue,f.defaultValue,f.value)
119
+ this.filters[v].originValue = defaultVal(this.filters[v].originValue,f.defaultValue,f.value)
119
120
  } else {
120
121
  this.filters[v] = {
121
- originalValue : f,
122
+ originValue : f,
122
123
  field : v
123
124
  }
124
125
  }
@@ -845,7 +846,9 @@ export default class CommonDatagridComponent extends AppComponent {
845
846
  if(removeFocus) document.body.click();
846
847
  });
847
848
  }
849
+ prepareFilter(props,filteredColumns){
848
850
 
851
+ }
849
852
  renderFilter(props){
850
853
  return <Filter {...props}/>
851
854
  }
@@ -884,7 +887,7 @@ export default class CommonDatagridComponent extends AppComponent {
884
887
  width,
885
888
  ...restCol
886
889
  } = header;
887
- restCol = defaultObj(restCol);
890
+ restCol = Object.clone(defaultObj(restCol));
888
891
  let colFilter = defaultVal(restCol.filter,true);
889
892
  field = header.field = defaultStr(header.field,field,headerIndex);
890
893
  delete restCol.filter;
@@ -899,7 +902,7 @@ export default class CommonDatagridComponent extends AppComponent {
899
902
  }
900
903
  totalWidths +=width;
901
904
  widths[header.field] = width;
902
- let colProps = {id,key}
905
+ const colProps = {id,key}
903
906
  colProps.key = isNonNullString(key)?key : (header.field||("datagrid-column-header-"+headerIndex))
904
907
  colProps.style = Object.assign({},StyleSheet.flatten(restCol.style));
905
908
  if(!visible){
@@ -937,7 +940,7 @@ export default class CommonDatagridComponent extends AppComponent {
937
940
  const sortedProps = isColumnSorted ? {...sortedColumn} : {};
938
941
  let filterProps = {};
939
942
  if(colFilter){
940
- let fCol = {...defaultObj(this.filters[header.field])}
943
+ const fCol = defaultObj(this.filters[header.field]);
941
944
  this.filters[header.field] = fCol;
942
945
  delete restCol.sortable;
943
946
  filterProps = {
@@ -948,14 +951,14 @@ export default class CommonDatagridComponent extends AppComponent {
948
951
  andOperator : filterAndOperator,
949
952
  searchIconTooltip : 'Filtre',
950
953
  searchIcon : 'filter_list',
951
- defaultValue : fCol.originalValue,
954
+ defaultValue : fCol.originValue,
952
955
  name : header.field,
953
956
  onClearFilter : this.onClearFilter.bind(this),
954
957
  onChange : this.onFilterChange.bind(this),
955
958
  operator : fCol.operator,
956
959
  action : defaultStr(fCol.originAction,fCol.action),
957
960
  };
958
- this.renderFilter(filterProps,headerFilters);
961
+ this.prepareFilter(filterProps,headerFilters);
959
962
  }
960
963
  this.prepareColumn({
961
964
  visible,
@@ -1129,7 +1132,7 @@ export default class CommonDatagridComponent extends AppComponent {
1129
1132
  if(!isObj(f)) return;
1130
1133
  defValue = undefined;
1131
1134
  if(f.type =="select") defValue = [];
1132
- filters[i] = {...f,value:defValue,defaultValue:defValue,originalValue:defValue}
1135
+ filters[i] = {...f,value:defValue,defaultValue:defValue,originValue:defValue}
1133
1136
  })
1134
1137
  this.filters = filters;
1135
1138
  this.refresh(true);
@@ -1155,7 +1158,7 @@ export default class CommonDatagridComponent extends AppComponent {
1155
1158
  field = defaultStr(field,name);
1156
1159
  if(field){
1157
1160
  let v = defaultStr(type).toLowerCase() == "select"? []:undefined
1158
- this.filters[field] = {value:v,defaultValue:v,originalValue:v,originValue:v}
1161
+ this.filters[field] = {value:v,defaultValue:v,originValue:v,originValue:v}
1159
1162
  this.doFilter({value:v,field,force:true})
1160
1163
  }
1161
1164
  }
@@ -1165,11 +1168,20 @@ export default class CommonDatagridComponent extends AppComponent {
1165
1168
  }
1166
1169
  onFilterChange(arg){
1167
1170
  this.filteredValues = defaultObj(this.filteredValues);
1168
- let {field,operator,action,value} = defaultObj(arg);
1171
+ let {field,operator,originAction,action,value} = defaultObj(arg);
1172
+ const filters = this.preparedColumns.filters;
1169
1173
  if(isNonNullString(field) && isNonNullString(operator) && isNonNullString(action)){
1170
1174
  this.filteredValues[field] = {
1171
1175
  operator,action,value,field
1172
1176
  }
1177
+ Object.map(filters,(filter)=>{
1178
+ if(isObj(filter) && filter.field == field){
1179
+ filter.originValue = filter.defaultValue = arg.defaultValue;
1180
+ filter.operator = operator;
1181
+ filter.action = defaultStr(originAction,action);
1182
+ }
1183
+ });
1184
+
1173
1185
  }
1174
1186
  return this.doFilter(arg);
1175
1187
  }
@@ -1369,8 +1381,11 @@ export default class CommonDatagridComponent extends AppComponent {
1369
1381
  }
1370
1382
  },isObj(p) && typeof p.force ==='boolean'?p.force : !this.state.isReady)
1371
1383
  }
1384
+ isTableData(){
1385
+ return false;
1386
+ }
1372
1387
  UNSAFE_componentWillReceiveProps(nextProps){
1373
- if('data' in nextProps && isObjOrArray(nextProps.data)){
1388
+ if(!this.isTableData() && 'data' in nextProps && isObjOrArray(nextProps.data) && nextProps.data != this.state.data && (stableHash(nextProps.data) != stableHash(this.state.data))){
1374
1389
  this.prepareData({data:nextProps.data,force:true},(state)=>{
1375
1390
  this.setState(state)
1376
1391
  });
@@ -2,6 +2,7 @@ import CommonDatagrid from "./Common";
2
2
  import {defaultObj,extendObj,defaultStr,isNonNullString,isFunction,isPromise} from "$utils";
3
3
  import actions from "$actions";
4
4
  import PropTypes from "prop-types";
5
+ import stableHash from "stable-hash";
5
6
 
6
7
  export default class CommonTableDatagrid extends CommonDatagrid{
7
8
  constructor(props){
@@ -13,12 +14,12 @@ export default class CommonTableDatagrid extends CommonDatagrid{
13
14
  } = props;
14
15
  dataSource = CommonDatagrid.getDataSource({...props,dataSource,context:this});
15
16
  tableName = defaultStr(tableName,table).toUpperCase();
17
+ this.prepareFetchData();
16
18
  if(tableName){
17
19
  Object.defineProperties(this,{
18
20
  tableName : {value:tableName,override:false,writable:false}
19
21
  })
20
22
  }
21
- this.INITIAL_STATE.fetchData = defaultVal(this.props.fetchData);
22
23
  let isPv = this.isPivotDatagrid();
23
24
  if(isPv){
24
25
  isPv = this.props.dbSelector !== false;
@@ -34,7 +35,9 @@ export default class CommonTableDatagrid extends CommonDatagrid{
34
35
  }
35
36
  this.state.isLoading = true;
36
37
  }
37
-
38
+ prepareFetchData(fetchData){
39
+ this.INITIAL_STATE.fetchData = defaultVal(fetchData,this.props.fetchData);
40
+ }
38
41
  /*** lorsque la données est modifiée */
39
42
  onUpsertData =(arg) =>{
40
43
  if(!this._isMounted()) return;
@@ -57,7 +60,9 @@ export default class CommonTableDatagrid extends CommonDatagrid{
57
60
  this.clearEvents();
58
61
  this.setSelectedRows();
59
62
  }
60
-
63
+ isTableData(){
64
+ return true;
65
+ }
61
66
  onChangeDataSources(args){
62
67
  let {dataSources,server} = args;
63
68
  this.currentDataSources = dataSources;
@@ -170,7 +170,7 @@ export default class Filter extends AppComponent {
170
170
  if(!isObjOrArray(value) && (isNullOrEmpty(value,true) || value ==='undefined') ){
171
171
  value = undefined;
172
172
  }
173
- let originalValue = value;
173
+ let originValue = value;
174
174
  const type = defaultStr(this.props.type).toLowerCase().trim();
175
175
  value = parseDecimal(value,type);
176
176
  if(action =="$today"){
@@ -215,7 +215,7 @@ export default class Filter extends AppComponent {
215
215
  }
216
216
  }
217
217
  }
218
- this.props.onChange({...this.getStateValues(),value,originValue:originalValue,originalValue,field:this.props.field,action,operator,selector,originAction,context:this});
218
+ this.props.onChange({...this.getStateValues(),value,originValue:originValue,originValue,field:this.props.field,action,operator,selector,originAction,context:this});
219
219
  }
220
220
  }
221
221
  componentDidUpdate (){
@@ -164,6 +164,10 @@ export const matchPouchDBOperator = (operator,value)=>{
164
164
  return {operator:"$lt",value}
165
165
  case "LTE":
166
166
  return {operator:"$lte",value}
167
+ case "IN":
168
+ return {operator:"$in",value}
169
+ case "NOT IN":
170
+ return {operator:"$in",value}
167
171
  }
168
172
  }
169
173
 
@@ -486,6 +490,7 @@ const operatorsMap = {
486
490
  $gte: '>=',
487
491
  $ne: '!=',
488
492
  $in: 'IN',
493
+ $nin : 'NOT IN',
489
494
  $eq: '=',
490
495
  $regex : "LIKE"
491
496
  }
@@ -13,9 +13,9 @@ import {styles as _styles} from "$theme";
13
13
  import Tooltip from "$ecomponents/Tooltip";
14
14
 
15
15
  const TableLinKComponent = React.forwardRef((props,ref)=>{
16
- let {disabled,labelProps,server,containerProps,id,columnDef,tableName,data,testID,Component,routeName,routeParams,component,primary,triggerProps,onPress,children, ...rest} = props;
16
+ let {disabled,labelProps,server,containerProps,id,columnDef,tableName,table:customTable,data,testID,Component,routeName,routeParams,component,primary,triggerProps,onPress,children, ...rest} = props;
17
17
  testID = defaultStr(testID,"RN_TableDataLinkContainer")
18
- tableName = defaultStr(tableName).trim();
18
+ tableName = defaultStr(tableName,customTable).trim();
19
19
  rest = defaultObj(rest);
20
20
  containerProps = defaultObj(containerProps)
21
21
  labelProps = defaultObj(labelProps);