@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 +1 -1
- package/src/components/Datagrid/SWRDatagrid.js +1 -1
- package/src/components/Filter/index.js +3 -0
- package/src/components/Form/Fields/SelectTableData/Component.js +12 -1
- package/src/context/Provider.js +2 -2
- package/src/context/utils.js +1 -1
- package/src/navigation/Stack.js +4 -2
- package/src/navigation/index.js +25 -19
- package/src/screens/index.js +5 -12
package/package.json
CHANGED
@@ -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 :
|
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}
|
package/src/context/Provider.js
CHANGED
@@ -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
|
}
|
package/src/context/utils.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
|
2
|
-
export const SWR_REFRESH_TIMEOUT =
|
2
|
+
export const SWR_REFRESH_TIMEOUT = 2500*60;
|
package/src/navigation/Stack.js
CHANGED
@@ -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};
|
package/src/navigation/index.js
CHANGED
@@ -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
|
-
|
22
|
+
const cardStyleInterpolator = isAndroid() ? CardStyleInterpolators.forFadeFromBottomAndroid : CardStyleInterpolators.forHorizontalIOS;
|
22
23
|
const {navigation:{screens,screenOptions}} = useContext();
|
23
|
-
const allScreens = initScreens({Factory:Stack,screens,ModalFactory:Stack
|
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
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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={
|
54
|
+
screenOptions={getScreenOptions}
|
50
55
|
>
|
51
|
-
{<Stack.Group
|
56
|
+
{<Stack.Group>
|
52
57
|
{drawerScreens}
|
53
58
|
</Stack.Group>}
|
54
59
|
<Stack.Group
|
55
60
|
key = {"MODAL-DRAWERS-SCREENS"}
|
56
|
-
screenOptions={{
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
+
screenOptions={function(options){
|
62
|
+
return getScreenOptions(options,{
|
63
|
+
presentation :"transparentModal",
|
64
|
+
cardStyle,
|
65
|
+
animationEnabled : true,
|
66
|
+
})
|
61
67
|
}}
|
62
68
|
>
|
63
69
|
{stackScreens}
|
package/src/screens/index.js
CHANGED
@@ -7,7 +7,7 @@ export * from "./mainScreens";
|
|
7
7
|
|
8
8
|
export * from "./utils";
|
9
9
|
|
10
|
-
export const handleScreen = ({Screen,Factory,ModalFactory,result,
|
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,
|
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
|
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
|
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,
|
112
|
+
handleScreen({Screen,result,Factory,ModalFactory,index})
|
120
113
|
});
|
121
114
|
return result;
|
122
115
|
}
|