@fto-consult/expo-ui 6.65.6 → 6.66.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/App.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import AppEntry from "./src";
2
- import {disableAuth} from "$econtext/hooks";
2
+ import {disableAuth} from "$cauth/perms";
3
3
 
4
4
  export default function MainExpoApp(props){
5
5
  return <AppEntry
@@ -29,13 +29,16 @@ export default function AppMainEntry(){
29
29
  },
30
30
  screenOptions : {},//les options du composant Stack.Navigator de react-navigation, voir https://reactnavigation.org/docs/native-stack-navigator/
31
31
  }}
32
+ auth = {{
33
+ enabled : false,//la gestion de l'authentification est désactivée par défaut
34
+ loginPropsMutator : {},//({object})=><{object}>, la fonction permettant de muter les props du composant Login,
35
+ profileFieldsMutator : (fields)=>fields,//la fonction permettant de muter les champs liés à l'écran de mise à jour d'un profil utilisateur
36
+ }}
32
37
  components = {{
33
38
  /*** logo : ReactNode|ReactElement | ReactComponent | object {
34
39
  image{ReactComponent} :,text {ReactComponent}
35
40
  },*/
36
41
  logo : Logo,//logo component's properties
37
- loginPropsMutator : {},//({object})=><{object}>, la fonction permettant de muter les props du composant Login,
38
- authEnabled : false,//la gestion de l'authentification est désactivée par défaut
39
42
  customFormFields : {},//custom form fields
40
43
  /*** la fonction permettant de muter les props du composant TableLink, permetant de lier les tables entre elles */
41
44
  tableLinkPropsMutator : (props)=>{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fto-consult/expo-ui",
3
- "version": "6.65.6",
3
+ "version": "6.66.0",
4
4
  "description": "Bibliothèque de composants UI Expo,react-native",
5
5
  "main": "main",
6
6
  "scripts": {
@@ -71,7 +71,7 @@
71
71
  "@expo/html-elements": "^0.5.1",
72
72
  "@expo/vector-icons": "^13.0.0",
73
73
  "@faker-js/faker": "^8.0.2",
74
- "@fto-consult/common": "^3.55.5",
74
+ "@fto-consult/common": "^3.55.6",
75
75
  "@pchmn/expo-material3-theme": "^1.3.1",
76
76
  "@react-native-async-storage/async-storage": "1.18.2",
77
77
  "@react-native-community/datetimepicker": "7.2.0",
@@ -63,7 +63,7 @@ const NAVIGATION_PERSISTENCE_KEY = 'NAVIGATION_STATE';
63
63
  */
64
64
  function App({init:initApp,initialRouteName:appInitialRouteName,render}) {
65
65
  AppStateService.init();
66
- const {FontsIconsFilter,beforeExit,preferences:appPreferences,navigation,getStartedRouteName} = useContext();
66
+ const {FontsIconsFilter,beforeExit,preferences:appPreferences,navigation,getStartedRouteName,auth} = useContext();
67
67
  const {containerProps} = navigation;
68
68
  const [initialState, setInitialState] = React.useState(undefined);
69
69
  const appReadyRef = React.useRef(true);
@@ -271,7 +271,7 @@ function App({init:initApp,initialRouteName:appInitialRouteName,render}) {
271
271
  />
272
272
  </NavigationContainer> : null;
273
273
  const content = isLoaded ? typeof render == 'function'? render({children:child,appConfig,config:appConfig}) : child : null;
274
- return <AuthProvider>
274
+ return <AuthProvider {...auth}>
275
275
  <SafeAreaProvider>
276
276
  <GestureHandlerRootView testID={"RN_MainAppGestureHanleRootView"} style={styles.gesture}>
277
277
  <AppEntryRootView>
package/src/auth/Login.js CHANGED
@@ -27,7 +27,7 @@ const WIDTH = 400;
27
27
 
28
28
  export default function LoginComponent(props){
29
29
  let {formName,step,appBarProps,onSuccess,withPortal,testID} = props;
30
- const {components:{loginPropsMutator}} = useContext();
30
+ const {auth:{loginPropsMutator}} = useContext();
31
31
  const loginTitle = getTitle();
32
32
  testID = defaultStr(testID,"RN_Auth.LoginComponent");
33
33
  formName = React.useRef(uniqid(defaultStr(formName,"login-formname"))).current;
@@ -7,7 +7,7 @@ import {colorsAlias,Colors} from "$theme";
7
7
  import {isObj,isNonNullString,defaultStr,extendObj} from "$cutils";
8
8
  import {getMainScreens} from "$escreens/mainScreens";
9
9
  import {ExpoUIContext} from "./hooks";
10
- import {enableAuth,disableAuth} from "$cauth/session";
10
+ import {enableAuth,disableAuth} from "$cauth/perms";
11
11
  import Login from "$eauth/Login";
12
12
  import {modes} from "$ecomponents/TextField";
13
13
  import {isMobileMedia} from "$cdimensions";
@@ -39,7 +39,6 @@ import {extendFormFields} from "$ecomponents/Form/Fields";
39
39
  ///les props par défaut à passer au composant Datagrid
40
40
  },
41
41
  customFormFields{Object}, //les composant personalisés des forms fields
42
- loginPropsMutator : ({object})=><{object}>, la fonction permettant de muter les props du composant Login,
43
42
  tableLinkPropsMutator : ({object})=><{object}>, la fonction permettant de muter les props du composant TableLink,
44
43
  TableDataScreen | TableDataScreenItem : {ReactComponent}, le composant TableDataScreenItem, à utiliser pour le rendu des écrans
45
44
  TableDataScreenList | TableDataListScreen {ReactComponent}, le composant TableDataList à utiliser pour le rendu des écrans listants les éléments du table data
@@ -56,14 +55,24 @@ import {extendFormFields} from "$ecomponents/Form/Fields";
56
55
  drawerItemsMutator : {function}, la fonction permettant de muter les drawerItems à chaque fois qu'on appelle la fonction de récupératioin des drawerItems
57
56
  containerProps : {object}, les props à passer au composant NavigationContainer de react-navigation
58
57
  },
58
+ auth : {
59
+ profileFieldsMutator : {({object})=><{object}> | {object})}, la fonction permettant de muter les champs à passer à l'écran de mise à jour du profil utilisateur
60
+ loginPropsMutator : ({object})=><{object}>, la fonction permettant de muter les props du composant Login,
61
+ }
59
62
  swrConfig : {object},//les paramètres de configuration de l'objet swr utilisée dans le composant SWRDatagrid
60
63
  realm : {}, //les options de configurations de la base de données realmdb
61
64
  */
62
- const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,components:cComponents,convertFiltersToSQL,getStructData,tablesData,structsData,...props})=>{
65
+ const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,auth:cAuth,components:cComponents,convertFiltersToSQL,getStructData,tablesData,structsData,...props})=>{
63
66
  const {extendAppTheme} = appConfig;
64
67
  const { theme : pTheme } = useMaterial3Theme();
65
68
  navigation = defaultObj(navigation);
66
69
  const {customFormFields,...components} = defaultObj(cComponents);
70
+ const auth = {
71
+ ...Object.assign({},cAuth),
72
+ loginPropsMutator : (props)=>{
73
+ return extendProps(cAuth.loginPropsMutator,props);
74
+ },
75
+ }
67
76
  extendFormFields(customFormFields);
68
77
  structsData = isObj(structsData)? structsData : null;
69
78
  appConfig.tablesData = tablesData;
@@ -78,7 +87,7 @@ const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,c
78
87
  }
79
88
  const colorScheme = useColorScheme();
80
89
  const isColorShemeDark = colorScheme ==="dark";
81
- if(components.authEnabled === false){
90
+ if(auth.enabled === false){
82
91
  disableAuth();
83
92
  } else enableAuth();
84
93
  appConfig.extendAppTheme = (theme,Theme,...rest)=>{
@@ -166,11 +175,9 @@ const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,c
166
175
  handleHelpScreen,
167
176
  navigation,
168
177
  convertFiltersToSQL,
178
+ auth,
169
179
  components : {
170
180
  ...components,
171
- loginPropsMutator : (props)=>{
172
- return extendProps(components.loginPropsMutator,props);
173
- },
174
181
  tableLinkPropsMutator : (props)=>{
175
182
  return extendProps(components.tableLinkPropsMutator,props);
176
183
  },
@@ -33,6 +33,8 @@ export const useAppGetComponent = (componentName)=>{
33
33
 
34
34
  export const useAppComponent = useAppGetComponent;
35
35
 
36
+ export const useGetComponent = useAppComponent;
37
+
36
38
  /*** permet d'attacher un lister sur la modification des props de manière responsive :
37
39
  permet de récupérer la fonction à attacher par défaut au listener DimensionChange, pour la mise à jour automatique de la propriété style
38
40
  * @param mediaQueryUpdateStyleCb{function}, la fonction permettant de mettre à jour les props lorsque la taille de l'écran change
@@ -76,7 +76,6 @@ const useGetItems = (options)=>{
76
76
  if(!tableName || table.showInDrawer === false || !Auth.isTableDataAllowed({table:tableName})){
77
77
  return;
78
78
  }
79
- console.log("is table allowed ",table);
80
79
  if(isNonNullString(table.perm) && !Auth.isAllowedFromStr(table.perm)) return;
81
80
  const section = (table.drawerSection).trim();
82
81
  if(!items[section]){
@@ -7,6 +7,7 @@ import Preloader from "$epreloader";
7
7
  import {SignIn2SignOut} from "$cauth";
8
8
  import React from "$react";
9
9
  import avatarProps from "$eauth/avatarProps";
10
+ import useContext from "$econtext/hooks";
10
11
 
11
12
  import {screenName} from "./utils";
12
13
 
@@ -15,7 +16,8 @@ export default function UserProfileScreen(props){
15
16
  const testID = defaultStr(props.testID,"RN_UserProfile_FormData");
16
17
  const themeRef = React.useRef(defaultObj(user.theme));
17
18
  const hasChangeRef = React.useRef(false);
18
- const authProfileFields = typeof SignIn2SignOut.authProfileFields =='function'?SignIn2SignOut.authProfileFields(props) : SignIn2SignOut.authProfileFields;
19
+ const {auth:{profileFieldsMutator}} = useContext();
20
+ const authProfileFields = typeof profileFieldsMutator =='function'?profileFieldsMutator(props) : profileFieldsMutator;
19
21
  const fields = isObj(authProfileFields)? Object.clone(authProfileFields) : {};
20
22
  const formFields = {
21
23
  avatar : {
@@ -1,8 +0,0 @@
1
- import React from "$react";
2
- import appConfig from "$capp/config";
3
- import {View,Text} from "react-native";
4
- export default function Provider(props){
5
- return <View style={{justifyContent:"center",flex:1,alignItems:"center"}}>
6
- <Text style={{fontSize:16}}>La vie de material</Text>
7
- </View>
8
- }
@@ -1,205 +0,0 @@
1
- import React from "$react";
2
- import appConfig from "$capp/config";
3
- import {MD3LightTheme,MD3DarkTheme} from "react-native-paper";
4
- import { useMaterial3Theme,isDynamicThemeSupported} from '@pchmn/expo-material3-theme';
5
- import { useColorScheme } from 'react-native';
6
- import {colorsAlias,Colors} from "$theme";
7
- import {isObj,isNonNullString,defaultStr,extendObj} from "$cutils";
8
- import {getMainScreens} from "$escreens/mainScreens";
9
- import {ExpoUIContext} from "./hooks";
10
- import Login from "$eauth/Login";
11
- import {modes} from "$ecomponents/TextField";
12
- import {isMobileMedia} from "$cdimensions";
13
- import { prepareScreens } from "./TableData";
14
- import {extendFormFields} from "$ecomponents/Form/Fields";
15
-
16
-
17
- /*****
18
- les utilitaires disponibles à passer au provider :
19
- FontsIconsFilter : (font{object},fontName{string},fontNameLower{string})=><boolean> //porte le nom de la props de appConfig dans lequel définir les filtres à utiliser pour charger l'iconSet désirée pour l'appication
20
- ///fonction de rappel appelée avant d'exit l'application, doit retourner une promesse que lorsque résolue, exit l'application
21
- beforeExit : ()=><Promise>
22
- getTableData : ()=>{object|array}
23
- getStructData : ()=>{object|array}
24
- tablesData : {object:{
25
- table1:{drawerSortOrder:{number,l'ordre d'apparition dans le drawer},showInDrawer:{boolean|{funct<{boolean}>},si l'on affichera la table de données dans le drawers}},
26
- table2:{},
27
- table3:{},...[tableN]:{}}
28
- }, la liste des tables de données
29
- structsData : {object}, la liste des données de structures
30
- handleHelpScreen : {boolean}, //si l'écran d'aide sera pris en compte, l'écran d'aide ainsi que les écrans des termes d'utilisations et autres
31
- convertFiltersToSQL : {boolean}, si les filtres de datagrid ou filtres seront convertis au format SQL
32
- components : {
33
- logo : ReactNode | ReactComponent | object {
34
- image{ReactComponent} :,
35
- text {ReactComponent}
36
- },
37
- datagrid : {
38
- ///les props par défaut à passer au composant Datagrid
39
- },
40
- customFormFields{Object}, //les composant personalisés des forms fields
41
- loginPropsMutator : ({object})=><{object}>, la fonction permettant de muter les props du composant Login,
42
- tableLinkPropsMutator : ({object})=><{object}>, la fonction permettant de muter les props du composant TableLink,
43
- TableDataScreen | TableDataScreenItem : {ReactComponent}, le composant TableDataScreenItem, à utiliser pour le rendu des écrans
44
- TableDataScreenList | TableDataListScreen {ReactComponent}, le composant TableDataList à utiliser pour le rendu des écrans listants les éléments du table data
45
- },
46
- navigation : {
47
- screens : {Array}, les écrans de navigation,
48
- screenOptions : {object}, les options du composant Stack.Navigator, voir https://reactnavigation.org/docs/native-stack-navigator/
49
- 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
50
- drawerSections : {object : {
51
- [key{string}]:{string}} |
52
- [key{string}] : {object { code:{string},label:{Node},order:{number, l'ordre de trie de la section}}}
53
- } //les différentes sections à utiliser pour le rendu du drawer, deux sections par défaut existent :
54
- les sectionis help et dashboard; help pour le rendu des items de la section Aide et Dashboard pour le rendu des items de la section Dashboard/Home
55
- drawerItemsMutator : {function}, la fonction permettant de muter les drawerItems à chaque fois qu'on appelle la fonction de récupératioin des drawerItems
56
- containerProps : {object}, les props à passer au composant NavigationContainer de react-navigation
57
- },
58
- realm : {}, //les options de configurations de la base de données realmdb
59
- */
60
- const Provider = ({children,getTableData,handleHelpScreen,navigation,swrConfig,components:cComponents,convertFiltersToSQL,getStructData,tablesData,structsData,...props})=>{
61
- const {extendAppTheme} = appConfig;
62
- const { theme : pTheme } = useMaterial3Theme();
63
- navigation = defaultObj(navigation);
64
- const {customFormFields,...components} = defaultObj(cComponents);
65
- extendFormFields(customFormFields);
66
- structsData = isObj(structsData)? structsData : null;
67
- appConfig.tablesData = tablesData;
68
- handleHelpScreen = handleHelpScreen === false ? false : true;
69
- appConfig.structsData = appConfig.structsData = isObj(structsData)? structsData : null;
70
- getTableData = appConfig.getTable = appConfig.getTableData = getTableOrStructDataCall(tablesData,getTableData);
71
- getStructData = appConfig.getStructData = getTableOrStructDataCall(structsData,getStructData);
72
- appConfig.LoginComponent = Login;
73
- swrConfig = defaultObj(swrConfig);
74
- if(convertFiltersToSQL !== undefined){
75
- appConfig.set("convertFiltersToSQL",convertFiltersToSQL);
76
- }
77
- const colorScheme = useColorScheme();
78
- const isColorShemeDark = colorScheme ==="dark";
79
- appConfig.extendAppTheme = (theme,Theme,...rest)=>{
80
- if(!isObj(theme)) return;
81
- const isDark = theme.dark || theme.isDark || isDynamicThemeSupported && isColorShemeDark ;
82
- const elevation = defaultObj(theme.elevation,isDark ? pTheme.dark?.elevation : pTheme.light?.elevation)
83
- const newTheme = isDark ? { ...MD3DarkTheme, colors: pTheme.dark } : { ...MD3LightTheme, colors: pTheme.light };
84
- for(let i in newTheme){
85
- if(i !== 'colors' && !(i in theme)){
86
- theme[i] = newTheme[i];
87
- }
88
- }
89
- if(isObj(theme.colors)){
90
- colorsAlias.map((color)=>{
91
- color = color.trim();
92
- const cUpper = color.ucFirst();
93
- //math theme colors to material desgin V3
94
- const textA = `${color}Text`,onColor=`on${cUpper}`//,containerA = `${color}Container`,onColorContainer=`on${cUpper}Container`;
95
- const c = Colors.isValid(theme.colors[onColor])? theme.colors[onColor] : (theme.colors[textA]) || undefined;
96
- if(c){
97
- theme.colors[onColor] = c;
98
- }
99
- });
100
- for(let i in newTheme.colors){
101
- if(!(i in theme.colors)){
102
- theme.colors[i] = newTheme.colors[i];
103
- }
104
- }
105
- }
106
- theme.fonts = newTheme.fonts;
107
- const r = typeof extendAppTheme == 'function'? extendAppTheme(theme,Theme,...rest) : theme;
108
- const _theme = (isObj(r) ? r : theme);
109
- const customCSS = _theme.customCSS;
110
- extendObj(Theme,{
111
- elevations : elevation,
112
- elevation,
113
- colorScheme,
114
- isDynamicThemeSupported,
115
- })
116
- return {
117
- ..._theme,
118
- get customCSS(){
119
- const prevCSS = defaultStr(typeof customCSS ==='function'? customCSS(theme) : customCSS);
120
- return `
121
- #root {
122
- overflow:hidden!important;
123
- width : 100%!important;
124
- height : 100%important;
125
- left : 0!important;
126
- top : 0!important;
127
- }
128
- .virtuoso-table-component,
129
- .virtuoso-table-component th,
130
- .virtuoso-table-component tr,
131
- .virtuoso-table-component td{
132
- border-collapse : collapse!important;
133
- }
134
- ${prevCSS}
135
- `;
136
- },
137
- get textFieldMode (){
138
- /***** possibilité de charger le mode d'affichage par défaut des champs textuels dans le theme de l'application */
139
- if(typeof theme.textFieldMode =='string' && theme.textFieldMode && modes[theme.textFieldMode]){
140
- return modes[theme.textFieldMode];
141
- }
142
- return isMobileMedia()? modes.shadow : modes.flat;
143
- }
144
- }
145
- }
146
- const {screens} = navigation;
147
- navigation.screens = React.useMemo(()=>{
148
- const r = prepareScreens({
149
- tables:tablesData,
150
- screens,
151
- TableDataScreen:components.TableDataScreen || components.TableDataScreenItem,
152
- TableDataScreenList:components.TableDataScreenList||components.TableDataListScreen,
153
- });
154
- return [...r,...getMainScreens(handleHelpScreen)];
155
- },[]);
156
- navigation.containerProps = defaultObj(navigation.containerProps);
157
- const {linking} = navigation;
158
- return <ExpoUIContext.Provider
159
- value={{
160
- ...props,
161
- handleHelpScreen,
162
- navigation,
163
- convertFiltersToSQL,
164
- components : {
165
- ...components,
166
- loginPropsMutator : (props)=>{
167
- return extendProps(components.loginPropsMutator,props);
168
- },
169
- tableLinkPropsMutator : (props)=>{
170
- return extendProps(components.tableLinkPropsMutator,props);
171
- },
172
- datagrid : Object.assign({},components.datagrid),
173
- },
174
- getTableData,
175
- getTable : getTableData,
176
- getStructData,
177
- tablesData,
178
- structsData,
179
- appConfig,
180
- swrConfig,
181
- }}
182
- children={children}
183
- />;
184
- }
185
- const getTableOrStructDataCall = (tablesOrStructDatas,getTableOrStructDataFunc)=>{
186
- return (tableName,...rest)=>{
187
- if(!isNonNullString(tableName)) return null;
188
- tableName = tableName.trim();
189
- const ret2 = typeof getTableOrStructDataFunc ==='function' ? getTableOrStructDataFunc (tableName,...rest) : null;
190
- if(isObj(ret2) && Object.size(ret2,true)) return ret2;
191
- if(!isObj(tablesOrStructDatas)) return null;
192
- const ret = tablesOrStructDatas[tableName] || tablesOrStructDatas[tableName.toLowerCase()] || tablesOrStructDatas[tableName.toUpperCase];
193
- if(isObj(ret)) return ret;
194
- return null;
195
- }
196
- }
197
- const extendProps = (cb,props)=>{
198
- const prs = defaultObj(props);
199
- const o = typeof cb ==='function'? cb(props) : null;
200
- if(isObj(o)){
201
- return {...prs,...o};
202
- }
203
- return prs
204
- }
205
- export default Provider;