@fto-consult/expo-ui 6.85.4 → 6.86.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": "6.85.4",
3
+ "version": "6.86.0",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "main": "main",
6
6
  "scripts": {
@@ -409,7 +409,7 @@ const SWRDatagridComponent = React.forwardRef((props,ref)=>{
409
409
  pageRef.current = firstPage;
410
410
  }
411
411
  if(typeof beforeFetchData =="function" && beforeFetchData(args)==false) return;
412
- doRefresh(typeof renderProgressBar =='boolean'? renderProgressBar : force);
412
+ doRefresh(typeof renderProgressBar =='boolean'? renderProgressBar : showProgressRef.current);
413
413
  return false;
414
414
  }}
415
415
  isSWRDatagrid
@@ -191,6 +191,9 @@ export default class Filter extends AppComponent {
191
191
  }
192
192
  return value;
193
193
  }
194
+ isFilterSelect(){
195
+ return defaultStr(this.type,this.props.type).toLowerCase().includes("select");
196
+ }
194
197
  fireValueChanged (forceRun){
195
198
  if(this.willRunManually() && !forceRun) return;
196
199
  let {defaultValue:value,action,ignoreCase,operator} = this.state;
@@ -19,7 +19,7 @@ import DateLib from "$lib/date";
19
19
  * foreignKeyTable : la tableData dans laquelle effectuer les donées de la requêtes
20
20
  * foreignKeyLabel : Le libélé dans la table étrangère
21
21
  */
22
- const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabelRenderers,isStructData,getForeignKeyTable:cGetForeignKeyTable,prepareFilters:cPrepareFilters,bindUpsert2RemoveEvents,onAdd,showAdd:customShowAdd,canShowAdd,foreignKeyTable,fetchItemsPath,foreignKeyLabel,foreignKeyLabelIndex,dropdownActions,fields,fetchItems:customFetchItem,parseMangoQueries,mutateFetchedItems,onFetchItems,isFilter,isUpdate,isDocEditing,items,onAddProps,fetchOptions,...props},ref)=>{
22
+ const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabelRenderers,onChange,isStructData,getForeignKeyTable:cGetForeignKeyTable,prepareFilters:cPrepareFilters,bindUpsert2RemoveEvents,onAdd,showAdd:customShowAdd,canShowAdd,foreignKeyTable,fetchItemsPath,foreignKeyLabel,foreignKeyLabelIndex,dropdownActions,fields,fetchItems:customFetchItem,parseMangoQueries,mutateFetchedItems,onFetchItems,isFilter,isUpdate,isDocEditing,items,onAddProps,fetchOptions,...props},ref)=>{
23
23
  props.data = defaultObj(props.data);
24
24
  const type = defaultStr(props.type)?.toLowerCase();
25
25
  isStructData = isStructData || type?.replaceAll("-","").replaceAll("_","").trim().contains("structdata");
@@ -90,6 +90,7 @@ const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabel
90
90
  delete fetchOptions.fields;
91
91
  }
92
92
  const foreignKeyColumnValue = props.defaultValue;
93
+ const defaultValueRef = React.useRef(props.multiple ? Object.toArray(foreignKeyColumnValue) : foreignKeyColumnValue);
93
94
  let isDisabled = defaultBool(props.disabled,props.readOnly,false);
94
95
  if(!isDisabled && props.readOnly === true){
95
96
  isDisabled = true;
@@ -111,6 +112,7 @@ const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabel
111
112
  fetchOptions.selector.$and.push({[foreignKeyColumn] : foreignKeyColumnValue})
112
113
  }
113
114
  }
115
+ const hasRefreshedRef = React.useRef(false);
114
116
  React.useEffect(()=>{
115
117
  context.refresh();
116
118
  if(bindUpsert2RemoveEvents !== false){
@@ -190,6 +192,7 @@ const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabel
190
192
  if(onFetchItems){
191
193
  onFetchItems({data:items,items,context,props});
192
194
  }
195
+ hasRefreshedRef.current = true;
193
196
  }).catch((e)=>{
194
197
  console.log(e," fetching list of data select table data ",foreignKeyColumn,foreignKeyTable)
195
198
  }).finally((e)=>{
@@ -281,6 +284,14 @@ const TableDataSelectField = React.forwardRef(({foreignKeyColumn,foreignKeyLabel
281
284
  showAdd = {showAdd}
282
285
  isLoading = {isLoading}
283
286
  dialogProps = {dialogProps}
287
+ onChange = {(...args)=>{
288
+ if(isFilter){
289
+ if(!hasRefreshedRef.current) return;
290
+ if(JSON.stringify(defaultValueRef.current) === JSON.stringify(args[0]?.value)) return;
291
+ defaultValueRef.current = args[0]?.value;
292
+ }
293
+ if(onChange) return onChange(...args);
294
+ }}
284
295
  ref = {ref}
285
296
  defaultValue = {foreignKeyColumnValue}
286
297
  dropdownActions = {dropdownActions}
@@ -72,7 +72,7 @@ Object.map(Utils,(v,i)=>{
72
72
 
73
73
  navigation : {
74
74
  screens : {Array}, les écrans de navigation,
75
- screenOptions : {object}, les options du composant Stack.Navigator, voir https://reactnavigation.org/docs/native-stack-navigator/
75
+ screenOptions : {object|function}, les options du composant Stack.Navigator, voir https://reactnavigation.org/docs/native-stack-navigator/
76
76
  drawerItems : {object|array|function}, la fonction permettant d'obtenir les items du drawer principal de l'application, Chaque item du drawer doit avoir la chaine drawerSection, chaine de caractère determinant le code de la section dans lequel l'afficher
77
77
  drawerSections : {object : {
78
78
  [key{string}]:{string}} |
@@ -165,7 +165,7 @@ const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,a
165
165
  APP.off(APP.EVENTS.GO_ONLINE,callback);
166
166
  }
167
167
  }
168
- },swrConfig);
168
+ },swrConfig,{refreshTimeout:swrRefreshTimeout});
169
169
  if(parseMangoQueries !== undefined){
170
170
  appConfig.set("parseMangoQueries",parseMangoQueries);
171
171
  }
@@ -1,2 +1,2 @@
1
1
 
2
- export const SWR_REFRESH_TIMEOUT = 5000*60;
2
+ export const SWR_REFRESH_TIMEOUT = 2500*60;
@@ -1,7 +1,9 @@
1
1
  //import { createNativeStackNavigator } from '@react-navigation/native-stack';
2
- import { createStackNavigator } from '@react-navigation/stack';
2
+ import { createStackNavigator,CardStyleInterpolators } from '@react-navigation/stack';
3
3
 
4
4
  export const Stack = createStackNavigator()
5
5
  //export const Stack = createNativeStackNavigator();
6
6
 
7
- export default Stack;
7
+ export default Stack;
8
+
9
+ export {CardStyleInterpolators};
@@ -6,7 +6,8 @@ import DrawerNavigator from "./Drawer";
6
6
  import useContext from "$econtext/hooks";
7
7
  import { MainNavigationProvider } from "./hooks";
8
8
  import {isWeb,isAndroid} from "$cplatform";
9
- import Stack from "./Stack";
9
+ import Stack,{CardStyleInterpolators} from "./Stack";
10
+ import {extendObj,defaultObj} from "$cutils";
10
11
  import theme from "$theme";;
11
12
 
12
13
  export * from "./hooks";
@@ -18,11 +19,9 @@ export * from "./utils";
18
19
  */
19
20
  export default function NavigationComponent (props){
20
21
  let {state,hasGetStarted,isLoading,onGetStart,initialRouteName,...rest} = props;
21
- if(isLoading) return null;
22
+ const cardStyleInterpolator = isAndroid() ? CardStyleInterpolators.forFadeFromBottomAndroid : CardStyleInterpolators.forHorizontalIOS;
22
23
  const {navigation:{screens,screenOptions}} = useContext();
23
- const allScreens = initScreens({Factory:Stack,screens,ModalFactory:Stack,filter:({name})=>{
24
- return true;
25
- }});
24
+ const allScreens = initScreens({Factory:Stack,screens,ModalFactory:Stack});
26
25
  initialRouteName = sanitizeName(initialRouteName);
27
26
  const drawerScreens = handleContent({screens:allScreens,onGetStart,hasGetStarted,initialRouteName,state,Factory:Stack});
28
27
  const stackScreens = handleContent({screens:allScreens.modals,onGetStart,hasGetStarted,initialRouteName,state,Factory:Stack});
@@ -30,13 +29,19 @@ export default function NavigationComponent (props){
30
29
  console.error("apps will stuck on splash screen because any valid screen has been found on screens ",allScreens);
31
30
  }
32
31
  setInitialRouteName(initialRouteName);
33
- const opts = {
34
- headerShown : false,
35
- header : ()=> null,
36
- headerStyle: { backgroundColor: theme.colors.primary},
37
- presentation : isAndroid() || isWeb()? "modal":"default",
38
- animationEnabled : !isWeb(),
39
- ...Object.assign({},screenOptions)
32
+ const getScreenOptions = (options,opt2)=>{
33
+ const sOptions = defaultObj(typeof screenOptions =='function'? screenOptions(options) : screenOptions);
34
+ const {navigation} = options;
35
+ return extendObj(true,{},{
36
+ headerShown : false,
37
+ header : ()=> null,
38
+ headerStyle: { backgroundColor: theme.colors.primary},
39
+ presentation : isAndroid() || isWeb()? "modal":"default",
40
+ animationEnabled : !isWeb(),
41
+ detachPreviousScreen: !navigation.isFocused(),
42
+ cardStyleInterpolator,
43
+ ...defaultObj(opt2),
44
+ },sOptions);
40
45
  }
41
46
  const cardStyle = { backgroundColor: 'transparent' };
42
47
  if(isWeb()){
@@ -46,18 +51,19 @@ export default function NavigationComponent (props){
46
51
  <DrawerNavigator {...props}>
47
52
  {<Stack.Navigator
48
53
  initialRouteName={initialRouteName}
49
- screenOptions={opts}
54
+ screenOptions={getScreenOptions}
50
55
  >
51
- {<Stack.Group screenOptions={{...opts}}>
56
+ {<Stack.Group>
52
57
  {drawerScreens}
53
58
  </Stack.Group>}
54
59
  <Stack.Group
55
60
  key = {"MODAL-DRAWERS-SCREENS"}
56
- screenOptions={{
57
- ...opts,
58
- presentation :"transparentModal",
59
- cardStyle,
60
- animationEnabled : true,
61
+ screenOptions={function(options){
62
+ return getScreenOptions(options,{
63
+ presentation :"transparentModal",
64
+ cardStyle,
65
+ animationEnabled : true,
66
+ })
61
67
  }}
62
68
  >
63
69
  {stackScreens}
@@ -7,7 +7,7 @@ export * from "./mainScreens";
7
7
 
8
8
  export * from "./utils";
9
9
 
10
- export const handleScreen = ({Screen,Factory,ModalFactory,result,filter,index})=>{
10
+ export const handleScreen = ({Screen,Factory,ModalFactory,result,index})=>{
11
11
  result = defaultObj(result);
12
12
  result.screens = defaultObj(result.screens);
13
13
  result.groups = defaultObj(result.groups);
@@ -17,7 +17,7 @@ export const handleScreen = ({Screen,Factory,ModalFactory,result,filter,index})=
17
17
  let screenOptions = undefined;
18
18
  if(Array.isArray(Screen)){
19
19
  Screen.map((S,i)=>{
20
- return handleScreen({Screen:S,Factory,ModalFactory,result,groups,filter,index:i});
20
+ return handleScreen({Screen:S,Factory,ModalFactory,result,groups,index:i});
21
21
  })
22
22
  } else if(typeof Screen ==='object' && React.isComponent(Screen.Component) && isNonNullString(Screen.screenName)){
23
23
  screenName = Screen.screenName;
@@ -37,11 +37,7 @@ export const handleScreen = ({Screen,Factory,ModalFactory,result,filter,index})=
37
37
  if(isNonNullString(screenName)){
38
38
  let name = screenName;
39
39
  const sanitizedName = sanitizeName(screenName);
40
- let extra = filter({Screen,name,sanitizedName}),
41
- authRequired = typeof Screen.authRequired =="boolean"? Screen.authRequired : true;
42
- if(extra ===false){
43
- return null;
44
- }
40
+ let authRequired = typeof Screen.authRequired =="boolean"? Screen.authRequired : true;
45
41
  ///le groupe d'écran par défaut
46
42
  let groupName = Screen.Start ||Screen.start ? GROUP_NAMES.START : authRequired === false ? GROUP_NAMES.PUBLIC : GROUP_NAMES.PRIVATE;
47
43
  if(!GROUP_NAMES[groupName]){
@@ -83,7 +79,6 @@ export const handleScreen = ({Screen,Factory,ModalFactory,result,filter,index})=
83
79
  }
84
80
  options.elevation = typeof options.elevation =='number'? options.elevation : typeof Screen.elevation =='number'? Screen.elevation : undefined;
85
81
  options.back = args.navigation.canGoBack();
86
- options.extra = defaultObj(extra);
87
82
  options.isModal = options.Modal = Screen.isModalScreen;
88
83
  return options;
89
84
  }} component = {ScreenWrapper}/>);
@@ -106,17 +101,15 @@ export const handleScreen = ({Screen,Factory,ModalFactory,result,filter,index})=
106
101
 
107
102
  groups : {} : la liste des différents groupes d'écrans rendus par la méthode
108
103
  */
109
- export default function initScreens ({Factory,ModalFactory,screens,result,filter}){
104
+ export default function initScreens ({Factory,ModalFactory,screens,result}){
110
105
  if(!isArray(screens) || !screens.length){
111
106
  screens = [];
112
107
  }
113
108
  result = defaultObj(result);
114
109
  result.screens = defaultObj(result.screens);
115
110
  result.groups = defaultObj(result.groups);
116
- ///lorsque les écrans sont passés enparamètres, par défaut, le wrapper withTheme n'est pas utilisé
117
- filter = typeof filter =="function" ? filter : x=> true;
118
111
  defaultArray(screens).map((Screen,index)=>{
119
- handleScreen({Screen,result,Factory,ModalFactory,filter,index})
112
+ handleScreen({Screen,result,Factory,ModalFactory,index})
120
113
  });
121
114
  return result;
122
115
  }