@fto-consult/expo-ui 6.26.7 → 6.26.9
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.config.json +1 -1
- package/package.json +5 -6
- package/src/components/AutoLink/index.js +11 -3
- package/src/components/Datagrid/Accordion/Row.js +3 -1
- package/src/components/Datagrid/Accordion/index.js +5 -2
- package/src/components/Form/Form.js +3 -2
- package/src/components/Table/Header/index.js +2 -2
- package/src/components/Table/index.js +1 -1
- package/src/index.js +41 -31
- package/src/layouts/Screen/ScreenWithoutAuthContainer.js +1 -1
- package/src/screens/Help/About.js +5 -50
- package/src/screens/Help/OpenLibraryScreen.js +128 -0
- package/src/screens/Help/index.js +2 -0
- package/src/screens/Help/openLibraries.js +1 -1
- package/src/components/Portal/index.old.js +0 -4
package/app.config.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fto-consult/expo-ui",
|
|
3
|
-
"version": "6.26.
|
|
3
|
+
"version": "6.26.9",
|
|
4
4
|
"description": "Bibliothèque de composants UI Expo,react-native",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"expo-fix": "npx expo install --fix",
|
|
44
44
|
"delete-node-modules": "rimraf ./**/node_modules",
|
|
45
45
|
"modifier-url-remote-git": "git remote set-url origin 'https://borispipo@github.com/borispipo/smart-eneo.git'",
|
|
46
|
-
"update": "npm i expo @emotion/native@latest @react-native-community/netinfo@latest react-native-big-list@latest apexcharts@latest file-saver@latest fs-extra@latest google-libphonenumber@latest @pchmn/expo-material3-theme@latest @
|
|
46
|
+
"update": "npm i expo @emotion/native@latest @react-native-community/netinfo@latest react-native-big-list@latest apexcharts@latest file-saver@latest fs-extra@latest google-libphonenumber@latest @pchmn/expo-material3-theme@latest @emotion/native@latest @fto-consult/common@latest react-native-blob-util react-native-gesture-handler@latest react-native-iphone-x-helper@latest react-native-mime-types@latest react-native-paper@latest react-native-safe-area-context@latest react-native-paper-dates@latest @react-navigation/native@latest @react-navigation/native-stack@latest react-native-screens@latest react-virtuoso@latest tippy.js@latest websql@latest xlsx@latest && npx expo install --fix"
|
|
47
47
|
},
|
|
48
48
|
"bin": {
|
|
49
49
|
"expo-ui": "./bin/index.js"
|
|
@@ -69,7 +69,6 @@
|
|
|
69
69
|
"@expo/vector-icons": "^13.0.0",
|
|
70
70
|
"@faker-js/faker": "^8.0.2",
|
|
71
71
|
"@fto-consult/common": "^3.29.1",
|
|
72
|
-
"@gorhom/portal": "^1.0.14",
|
|
73
72
|
"@pchmn/expo-material3-theme": "^1.3.1",
|
|
74
73
|
"@react-native-async-storage/async-storage": "1.18.2",
|
|
75
74
|
"@react-native-community/datetimepicker": "7.2.0",
|
|
@@ -79,7 +78,7 @@
|
|
|
79
78
|
"@react-navigation/native-stack": "^6.9.13",
|
|
80
79
|
"@shopify/flash-list": "1.4.3",
|
|
81
80
|
"apexcharts": "^3.41.1",
|
|
82
|
-
"expo": "^49.0.
|
|
81
|
+
"expo": "^49.0.8",
|
|
83
82
|
"expo-camera": "~13.4.2",
|
|
84
83
|
"expo-clipboard": "~4.3.1",
|
|
85
84
|
"expo-font": "~11.4.0",
|
|
@@ -99,13 +98,13 @@
|
|
|
99
98
|
"react": "^18.2.0",
|
|
100
99
|
"react-content-loader": "^6.2.1",
|
|
101
100
|
"react-dom": "^18.2.0",
|
|
102
|
-
"react-native": "0.72.
|
|
101
|
+
"react-native": "0.72.4",
|
|
103
102
|
"react-native-big-list": "^1.6.1",
|
|
104
103
|
"react-native-blob-util": "^0.18.6",
|
|
105
104
|
"react-native-gesture-handler": "^2.12.1",
|
|
106
105
|
"react-native-iphone-x-helper": "^1.3.1",
|
|
107
106
|
"react-native-mime-types": "^2.4.0",
|
|
108
|
-
"react-native-paper": "^5.10.
|
|
107
|
+
"react-native-paper": "^5.10.3",
|
|
109
108
|
"react-native-paper-dates": "^0.18.14",
|
|
110
109
|
"react-native-reanimated": "~3.3.0",
|
|
111
110
|
"react-native-safe-area-context": "4.6.3",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// license that can be found in the LICENSE file.
|
|
4
4
|
|
|
5
5
|
import * as Linking from 'expo-linking';
|
|
6
|
-
import { Pressable } from 'react-native';
|
|
6
|
+
import { Pressable,StyleSheet } from 'react-native';
|
|
7
7
|
import {isValidUrl,isValidEmail,defaultStr,isSms} from "$cutils";
|
|
8
8
|
import PropTypes from "prop-types";
|
|
9
9
|
import Browser from "$ecomponents/Browser";
|
|
@@ -12,12 +12,14 @@ export default function AutolinkComponent({onPress,withBrowser,mailto,email,tel,
|
|
|
12
12
|
url = defaultStr(url,href);
|
|
13
13
|
phone = defaultStr(phone,tel).trim();
|
|
14
14
|
const isPhone = phone ? true : false;
|
|
15
|
-
const isUrl = isValidUrl(url);
|
|
15
|
+
const isUrl = url && isValidUrl(url);
|
|
16
16
|
email = defaultStr(email,mailto);
|
|
17
|
-
const isEmail = isValidEmail(email);
|
|
17
|
+
const isEmail = email && isValidEmail(email);
|
|
18
|
+
const hasContent = isUrl || isEmail || isPhone;
|
|
18
19
|
return <Pressable
|
|
19
20
|
testID={"RN_AutoLinkComponent"}
|
|
20
21
|
{...props}
|
|
22
|
+
style = {[hasContent && styles.textDecorationUnderline,props.style]}
|
|
21
23
|
onPress = {(e)=>{
|
|
22
24
|
if(onPress && onPress(e) === false) return;
|
|
23
25
|
if(isUrl){
|
|
@@ -36,6 +38,12 @@ export default function AutolinkComponent({onPress,withBrowser,mailto,email,tel,
|
|
|
36
38
|
/>
|
|
37
39
|
}
|
|
38
40
|
|
|
41
|
+
|
|
42
|
+
const styles = StyleSheet.create({
|
|
43
|
+
textDecorationUnderline : {
|
|
44
|
+
textDecorationLine:'underline',
|
|
45
|
+
},
|
|
46
|
+
})
|
|
39
47
|
AutolinkComponent.propTypes = {
|
|
40
48
|
onPress : PropTypes.func,
|
|
41
49
|
phone : PropTypes.string,//le numéro à utiliser
|
|
@@ -75,7 +75,7 @@ const DatagridAccordionRow = React.forwardRef((props,ref)=>{
|
|
|
75
75
|
const wrapStyle = React.useMemo(()=>{
|
|
76
76
|
return getRowStyle({row:item,index,selected,numColumns,isAccordion:true,rowIndex:index});
|
|
77
77
|
},[selected,numColumns]);
|
|
78
|
-
const viewWrapperStyle = [];
|
|
78
|
+
const viewWrapperStyle = [selectable !== false && theme.styles.cursorPointer];
|
|
79
79
|
if(selected) {
|
|
80
80
|
const handleAvatarRowToggle = (event)=>{
|
|
81
81
|
React.stopEventPropagation(event);
|
|
@@ -122,6 +122,7 @@ const DatagridAccordionRow = React.forwardRef((props,ref)=>{
|
|
|
122
122
|
rowProps.style,
|
|
123
123
|
numColumns > 1 && styles.multiColumns,
|
|
124
124
|
selected && styles.selected,
|
|
125
|
+
selectable !== false && theme.styles.cursorPointer,
|
|
125
126
|
//style,
|
|
126
127
|
]}
|
|
127
128
|
ref = {React.useMergeRefs(ref,innerRef)}
|
|
@@ -230,6 +231,7 @@ const styles = StyleSheet.create({
|
|
|
230
231
|
alignItems : 'center',
|
|
231
232
|
justifyContent : 'center',
|
|
232
233
|
paddingVertical : 10,
|
|
234
|
+
width : "100%",
|
|
233
235
|
},
|
|
234
236
|
right : {
|
|
235
237
|
marginHorizontal : 0,
|
|
@@ -401,7 +401,7 @@ const DatagridFactory = (Factory)=>{
|
|
|
401
401
|
const hasFootersFields = this.hasFootersFields();
|
|
402
402
|
const datagridHeader = <View testID={testID+"_HeaderContainer"} pointerEvents={pointerEvents} style={[styles.datagridHeader]}>
|
|
403
403
|
<ScrollView testID={testID+"_HeaderScrollView"} horizontal contentContainerStyle={StyleSheet.flatten([styles.contentContainerStyle,styles.minW100])}>
|
|
404
|
-
<View testID={testID+"
|
|
404
|
+
<View testID={testID+"_HeaderContentContainer"} style={[styles.table,styles.pullRight]}>
|
|
405
405
|
{/*this.renderDataSourceSelector()*/}
|
|
406
406
|
<View testID={testID+"_HeaderQueryLimit"} style={[styles.paginationItem]}>
|
|
407
407
|
{this.renderQueryLimit(this.getStateDataSize().formatNumber())}
|
|
@@ -552,6 +552,7 @@ const DatagridFactory = (Factory)=>{
|
|
|
552
552
|
items = {this.state.data}
|
|
553
553
|
isLoading = {isLoading}
|
|
554
554
|
ref = {this.listRef}
|
|
555
|
+
style = {styles.list}
|
|
555
556
|
backToTopRef = {backToTopRef?(e)=>{
|
|
556
557
|
return this.backToTopRef.current;
|
|
557
558
|
}:false}
|
|
@@ -605,13 +606,15 @@ const styles = StyleSheet.create({
|
|
|
605
606
|
alignItems : 'center',
|
|
606
607
|
maxHeight : 60
|
|
607
608
|
},
|
|
609
|
+
list : {
|
|
610
|
+
paddingHorizontal : 5,
|
|
611
|
+
},
|
|
608
612
|
container : {
|
|
609
613
|
position : 'relative',
|
|
610
614
|
flexDirection :'column',
|
|
611
615
|
justifyContent : 'flex-start',
|
|
612
616
|
width : '100%',
|
|
613
617
|
flex : 1,
|
|
614
|
-
paddingHorizontal : isNativeMobile()? 5:1,
|
|
615
618
|
},
|
|
616
619
|
accordionHeader : {
|
|
617
620
|
paddingTop : 0,
|
|
@@ -7,6 +7,7 @@ import KeyboardAvoidingView from "$ecomponents/KeyboardAvoidingView";
|
|
|
7
7
|
import { StyleSheet } from "react-native";
|
|
8
8
|
import APP from "$capp/instance";
|
|
9
9
|
import PropTypes from "prop-types";
|
|
10
|
+
import View from "$ecomponents/View";
|
|
10
11
|
|
|
11
12
|
/**** règles d'utilisation :
|
|
12
13
|
1. les forms doivent toujours avoir un nom : chaine de caractère unique pour l'application et non null
|
|
@@ -105,9 +106,9 @@ export default class FormComponent extends React.AppComponent {
|
|
|
105
106
|
...rest
|
|
106
107
|
} = this.props;
|
|
107
108
|
testID = defaultStr(testID,"RN_FormComponent");
|
|
108
|
-
return <
|
|
109
|
+
return <View {...rest} testID={testID+"_FormKeyboardAvoidingView"} style={[styles.container,rest.style]}>
|
|
109
110
|
{this.props.children}
|
|
110
|
-
</
|
|
111
|
+
</View>
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
const isField = (Component)=>{
|
|
@@ -15,9 +15,9 @@ import styles from "../styles";
|
|
|
15
15
|
import CellWrapper from "./CellWrapper";
|
|
16
16
|
|
|
17
17
|
export default function RowHeaderComponent({isFilter,isFooter,isHeader,className,children:cChildren,...rest}){
|
|
18
|
-
const {showHeaders,visibleColsNames,visibleColsNamesStr,headerContainerProps,footerContainerProps,filtersContainerProps,showFilters,filters,showFooters} = useTable();
|
|
18
|
+
const {showHeaders,visibleColsNames,filterable,visibleColsNamesStr,headerContainerProps,footerContainerProps,filtersContainerProps,showFilters,filters,showFooters} = useTable();
|
|
19
19
|
const canV = showHeaders === false ? false : Array.isArray(children)? !!children.length : true;
|
|
20
|
-
const visible = canV && (isHeader ? true : isFilter ? !!showFilters : isFooter ? !!showFooters: true);
|
|
20
|
+
const visible = canV && (isHeader ? true : isFilter ? !!showFilters && filterable !== false : isFooter ? !!showFooters: true);
|
|
21
21
|
const containerProps = defaultObj( isHeader ? headerContainerProps : isFooter ? footerContainerProps : filtersContainerProps);
|
|
22
22
|
const style = filters ? styles.filters : isFooter ? styles.footer : null;
|
|
23
23
|
const children = React.useMemo(()=>{
|
|
@@ -230,7 +230,7 @@ const TableComponent = React.forwardRef(({containerProps,listContainerStyle,onRe
|
|
|
230
230
|
prepareItems = {false}
|
|
231
231
|
items = {items}
|
|
232
232
|
contentContainerStyle = {[styles.contentContainer,{width:listWidth,minWidth:totalWidths}]}
|
|
233
|
-
style = {[styles.datagrid,{width:listWidth,minWidth:totalWidths}]}
|
|
233
|
+
style = {[styles.datagrid,{width:listWidth,minWidth:totalWidths},props.style]}
|
|
234
234
|
keyExtractor = {keyExtractor}
|
|
235
235
|
onScroll = {getOnScrollCb([absoluteScrollViewRef],(args)=>{
|
|
236
236
|
if(!absoluteScrollViewRef.current) return;
|
package/src/index.js
CHANGED
|
@@ -27,7 +27,6 @@ import DialogProvider from "$ecomponents/Dialog/Provider";
|
|
|
27
27
|
import SimpleSelect from '$ecomponents/SimpleSelect';
|
|
28
28
|
import {Provider as AlertProvider} from '$ecomponents/Dialog/confirm/Alert';
|
|
29
29
|
import { DialogProvider as FormDataDialogProvider } from '$eform/FormData';
|
|
30
|
-
import {Portal } from 'react-native-paper';
|
|
31
30
|
import {PortalProvider,CustomPortal} from '$ecomponents/Portal';
|
|
32
31
|
import ErrorBoundaryProvider from "$ecomponents/ErrorBoundary/Provider";
|
|
33
32
|
import notify, {notificationRef} from "$notify";
|
|
@@ -37,9 +36,11 @@ import { PreferencesContext } from './Preferences';
|
|
|
37
36
|
import ErrorBoundary from "$ecomponents/ErrorBoundary";
|
|
38
37
|
import {updateTheme,defaultTheme} from "$theme";
|
|
39
38
|
import StatusBar from "$ecomponents/StatusBar";
|
|
40
|
-
import {Provider as PaperProvider } from 'react-native-paper';
|
|
39
|
+
import {Provider as PaperProvider,Portal } from 'react-native-paper';
|
|
41
40
|
import FontIcon from "$ecomponents/Icon/Font";
|
|
42
41
|
import useContext from "$econtext/hooks";
|
|
42
|
+
import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
43
|
+
import { StyleSheet } from "react-native";
|
|
43
44
|
export * from "./context";
|
|
44
45
|
|
|
45
46
|
let MAX_BACK_COUNT = 1;
|
|
@@ -273,35 +274,44 @@ function App({init:initApp,initialRouteName:appInitialRouteName,render,onMount})
|
|
|
273
274
|
</NavigationContainer> : null;
|
|
274
275
|
const content = isLoaded ? typeof render == 'function'? render({children:child,appConfig,config:appConfig}) : child : null;
|
|
275
276
|
return <AuthProvider>
|
|
276
|
-
<
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
277
|
+
<GestureHandlerRootView testID={"RN_MainAppGestureHanleRootView"} style={styles.gesture}>
|
|
278
|
+
<PaperProvider
|
|
279
|
+
theme={theme}
|
|
280
|
+
settings={{
|
|
281
|
+
icon: (props) => {
|
|
282
|
+
return <FontIcon {...props}/>
|
|
283
|
+
},
|
|
284
|
+
}}
|
|
285
|
+
>
|
|
286
|
+
<PortalProvider>
|
|
287
|
+
<ErrorBoundaryProvider/>
|
|
288
|
+
<PreloaderProvider/>
|
|
289
|
+
<DialogProvider responsive testID={"RN_MainAppDialogProvider"}/>
|
|
290
|
+
<AlertProvider SimpleSelect={SimpleSelect}/>
|
|
291
|
+
<FormDataDialogProvider/>
|
|
292
|
+
<BottomSheetProvider/>
|
|
293
|
+
<DropdownAlert ref={notificationRef}/>
|
|
294
|
+
<Portal.Host testID="RN_NativePaperPortalHost">
|
|
295
|
+
<ErrorBoundary>
|
|
296
|
+
<StatusBar/>
|
|
297
|
+
<SplashScreen isLoaded={isLoaded}>
|
|
298
|
+
<PreferencesContext.Provider value={preferences}>
|
|
299
|
+
{React.isValidElement(content) && content || child}
|
|
300
|
+
</PreferencesContext.Provider>
|
|
301
|
+
</SplashScreen>
|
|
302
|
+
</ErrorBoundary>
|
|
303
|
+
</Portal.Host>
|
|
304
|
+
</PortalProvider>
|
|
305
|
+
</PaperProvider>
|
|
306
|
+
</GestureHandlerRootView>
|
|
304
307
|
</AuthProvider>;
|
|
305
308
|
}
|
|
306
309
|
|
|
307
|
-
export default App;
|
|
310
|
+
export default App;
|
|
311
|
+
|
|
312
|
+
const styles = StyleSheet.create({
|
|
313
|
+
gesture : {
|
|
314
|
+
flex : 1,
|
|
315
|
+
flexGrow : 1,
|
|
316
|
+
}
|
|
317
|
+
})
|
|
@@ -108,7 +108,7 @@ export default function MainScreenScreenWithoutAuthContainer(props) {
|
|
|
108
108
|
const WrapperProps = modal? {screenName} : {};
|
|
109
109
|
const portalId = uniqid("screeen-container-"+screenName);
|
|
110
110
|
return <Wrapper {...WrapperProps}>
|
|
111
|
-
<View testID={testID+"_ScreenContentContainer"} id={portalId} style={[containerStyle,{backgroundColor},modal && styles.modal,containerProps.style]}
|
|
111
|
+
<View testID={testID+"_ScreenContentContainer"} id={portalId} {...containerProps} style={[containerStyle,{backgroundColor},modal && styles.modal,containerProps.style]} >
|
|
112
112
|
<KeyboardAvoidingView testID={testID} {...keyboardAvoidingViewProps} style={[styles.keyboardAvoidingView,keyboardAvoidingViewProps.style]}>
|
|
113
113
|
{withStatusBar !== false ? <StatusBar/> : null}
|
|
114
114
|
{appBar === false ? null : React.isValidElement(appBar)? state.AppBar : <AppBar
|
|
@@ -5,7 +5,6 @@ import Divider from "$ecomponents/Divider";
|
|
|
5
5
|
import PrivacyPolicyLink from "./PrivacyPolicy/Link";
|
|
6
6
|
import TermsOfUsesLink from "./TermsOfUses/Link";
|
|
7
7
|
import {isNativeDesktop,isAndroid,isIos} from "$platform";
|
|
8
|
-
import Expandable from "$ecomponents/Expandable";
|
|
9
8
|
import React from "$react";
|
|
10
9
|
import Screen from "$screen";
|
|
11
10
|
import getDevicesInfos from "./getDevicesInfos";
|
|
@@ -15,15 +14,10 @@ import {defaultStr} from "$cutils";
|
|
|
15
14
|
import theme from "$theme";
|
|
16
15
|
import APP from "$app";
|
|
17
16
|
import AutoLink from "$ecomponents/AutoLink";
|
|
18
|
-
import Grid from "$ecomponents/Grid";
|
|
19
17
|
import getReleaseText from "./getReleaseText";
|
|
20
18
|
import appConfig from "$capp/config";
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
openLibraries = require("./openLibraries");
|
|
24
|
-
} catch{
|
|
25
|
-
openLibraries = null;
|
|
26
|
-
}
|
|
19
|
+
import OpenLibraries from "./OpenLibraryScreen";
|
|
20
|
+
|
|
27
21
|
export default function HelpScreen(props){
|
|
28
22
|
const deviceInfo = getDevicesInfos();
|
|
29
23
|
let icon = undefined, iconText = undefined;
|
|
@@ -58,9 +52,6 @@ export default function HelpScreen(props){
|
|
|
58
52
|
iconText += " Mac os";
|
|
59
53
|
}
|
|
60
54
|
}
|
|
61
|
-
const gridPadding = 5;
|
|
62
|
-
const gridStyles = [{width:40,padding:gridPadding},{width:'60%',padding:gridPadding},{width:60,padding:gridPadding},{width:60,padding:gridPadding}];
|
|
63
|
-
const borderStyle = {borderColor:theme.colors.divider,borderWidth:1,justifyContent:'space-between'};
|
|
64
55
|
const testID = defaultStr(props.testID,"RN_HelpAboutScreenComponent")
|
|
65
56
|
return <Screen withScrollView title={title} {...props} testID={testID+"_Screen"} contentContainerStyle={[{flex:1},theme.styles.alignItemsCenter,theme.styles.justifyContentCenter]}>
|
|
66
57
|
<View testID={testID+"_Container"} style={[theme.styles.alignItemsCenter,theme.styles.justifyContentCenter,theme.styles.w100,theme.styles.p1]}>
|
|
@@ -87,44 +78,8 @@ export default function HelpScreen(props){
|
|
|
87
78
|
<Label primary textBold style={theme.styles.mv05} >{appConfig.name+", Notes de mise à jour."}</Label>
|
|
88
79
|
</Link>
|
|
89
80
|
</View>
|
|
90
|
-
<View style={theme.styles.w100}>
|
|
91
|
-
|
|
92
|
-
<Expandable
|
|
93
|
-
testID={testID+"_OpenLibraries"}
|
|
94
|
-
title = {"A propos des librairies tiers"}
|
|
95
|
-
titleProps = {{style:theme.styles.ph1}}
|
|
96
|
-
style = {{backgroundColor:'transparent'}}
|
|
97
|
-
>
|
|
98
|
-
<View testID={testID+"_OpenLibraries_Header"} style={[theme.styles.row,theme.styles.flexWrap]}>
|
|
99
|
-
<Label testID={testID+"_OpenLibraries_HeaderLabel"} primary textBold>{appConfig.name+" "}</Label>
|
|
100
|
-
<Label>est bâti sur un ensemble d'outils et librairies open Source</Label>
|
|
101
|
-
</View>
|
|
102
|
-
<View testID={testID+"_OpenLibrariesContent"} style={[theme.styles.w100,theme.styles.pv1]}>
|
|
103
|
-
<Grid.Row style={borderStyle}>
|
|
104
|
-
<Label style={gridStyles[0]} textBold>#</Label>
|
|
105
|
-
<Label style={gridStyles[1]} textBold>Librairie/Outil</Label>
|
|
106
|
-
<Label style={gridStyles[2]} textBold>Version</Label>
|
|
107
|
-
<Label style={gridStyles[3]} textBold>Licence</Label>
|
|
108
|
-
</Grid.Row>
|
|
109
|
-
{Object.mapToArray(openLibraries,(lib,i,_i)=>{
|
|
110
|
-
return <Grid.Row key={i} style={borderStyle}>
|
|
111
|
-
<Label style={gridStyles[0]}>
|
|
112
|
-
{_i.formatNumber()}
|
|
113
|
-
</Label>
|
|
114
|
-
<AutoLink style={gridStyles[1]} url={lib.url}>
|
|
115
|
-
<Label splitText>{i}</Label>
|
|
116
|
-
</AutoLink>
|
|
117
|
-
<AutoLink style={gridStyles[2]}>
|
|
118
|
-
<Label splitText numberOfLines={2}>{defaultStr(lib.version)}</Label>
|
|
119
|
-
</AutoLink>
|
|
120
|
-
<AutoLink url={lib.licenseUrl} style={gridStyles[3]}>
|
|
121
|
-
<Label splitText>{lib.license}</Label>
|
|
122
|
-
</AutoLink>
|
|
123
|
-
</Grid.Row>
|
|
124
|
-
})}
|
|
125
|
-
</View>
|
|
126
|
-
</Expandable>
|
|
127
|
-
</View>: null}
|
|
81
|
+
<View testID={testID+"_OpenLibrariesLinkContainer"} style={[theme.styles.w100,theme.styles.justifyContentCenter,theme.styles.alignItemsCenter]}>
|
|
82
|
+
<OpenLibraries.Link testID={testID+"_OpenLibrariesLink"}/>
|
|
128
83
|
</View>
|
|
129
84
|
</View>
|
|
130
85
|
</Screen>
|
|
@@ -134,6 +89,6 @@ export const title = HelpScreen.title = "A propos";
|
|
|
134
89
|
|
|
135
90
|
export const screenName = HelpScreen.screenName = "Help/About";
|
|
136
91
|
|
|
137
|
-
HelpScreen.
|
|
92
|
+
HelpScreen.authRequired = false;
|
|
138
93
|
|
|
139
94
|
HelpScreen.Modal = true;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import View from "$ecomponents/View";
|
|
2
|
+
import Screen from "$escreen";
|
|
3
|
+
import {defaultStr,defaultObj,isValidUrl} from "$cutils";
|
|
4
|
+
import Label from "$ecomponents/Label";
|
|
5
|
+
import theme from "$theme";
|
|
6
|
+
import Link from "$ecomponents/Link";
|
|
7
|
+
import {StyleSheet} from "react-native";
|
|
8
|
+
import appConfig from "$capp/config";
|
|
9
|
+
import Grid from "$ecomponents/Grid";
|
|
10
|
+
import Table from "$ecomponents/Table";
|
|
11
|
+
import React from "$react";
|
|
12
|
+
import AutoLink from "$ecomponents/AutoLink";
|
|
13
|
+
|
|
14
|
+
const openLibraries = require("./openLibraries");
|
|
15
|
+
|
|
16
|
+
const columns = {
|
|
17
|
+
index : {
|
|
18
|
+
text : "#",
|
|
19
|
+
width : 40,
|
|
20
|
+
},
|
|
21
|
+
library : {
|
|
22
|
+
text : "Librairie/Outil",
|
|
23
|
+
width : 180,
|
|
24
|
+
},
|
|
25
|
+
version : {
|
|
26
|
+
text : "Version",
|
|
27
|
+
width : 60,
|
|
28
|
+
},
|
|
29
|
+
license : {
|
|
30
|
+
text : "Licence",
|
|
31
|
+
width : 80,
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export default function OpenLibrariesScreen({testID,...props}){
|
|
35
|
+
testID = defaultStr(testID,"RN_HealScreenOpenLibraries");
|
|
36
|
+
const gridStyles = [styles.grid0,styles.grid1,styles.grid2,styles.grid3];
|
|
37
|
+
const borderStyle = {borderColor:theme.colors.divider,borderWidth:1,justifyContent:'space-between'};
|
|
38
|
+
const data = React.useMemo(()=>{
|
|
39
|
+
const data = [];
|
|
40
|
+
Object.map(openLibraries,(lib,i,_i)=>{
|
|
41
|
+
const da = {
|
|
42
|
+
...lib,
|
|
43
|
+
index : _i,
|
|
44
|
+
library : i,
|
|
45
|
+
};
|
|
46
|
+
da.url = isValidUrl(da.url)? da.url : da.homepage;
|
|
47
|
+
data.push(da)
|
|
48
|
+
})
|
|
49
|
+
return data;
|
|
50
|
+
},[])
|
|
51
|
+
return <Screen {...props} title={title} containerProps={{style:[theme.styles.justifyContentCenter]}}>
|
|
52
|
+
<View testID={testID+"_OpenLibraries_Header"} style={[theme.styles.row,theme.styles.flexWrap,theme.styles.p1]}>
|
|
53
|
+
<Label testID={testID+"_OpenLibraries_HeaderLabel"} primary textBold>{appConfig.name+" "}</Label>
|
|
54
|
+
<Label>est bâti sur un ensemble d'outils et librairies open Source</Label>
|
|
55
|
+
</View>
|
|
56
|
+
<View testID={testID+"_OpenLibrariesContent"} style={[theme.styles.w100,theme.styles.pv1]}>
|
|
57
|
+
<Table
|
|
58
|
+
sortable = {false}
|
|
59
|
+
columns = {columns}
|
|
60
|
+
data = {data}
|
|
61
|
+
containerProps = {{style:styles.table}}
|
|
62
|
+
renderCell = {({rowData,columnDef,columnField,...rest})=>{
|
|
63
|
+
const value = rowData[columnField];
|
|
64
|
+
switch(columnField){
|
|
65
|
+
case "index":
|
|
66
|
+
return <Label>
|
|
67
|
+
{value.formatNumber()}
|
|
68
|
+
</Label>
|
|
69
|
+
case "library" :
|
|
70
|
+
return <AutoLink url={rowData.url}>
|
|
71
|
+
<Label splitText style={styles.textDecorationUnderline} >{value}</Label>
|
|
72
|
+
</AutoLink>
|
|
73
|
+
case "version" :
|
|
74
|
+
return <Label splitText numberOfLines={2}>{defaultStr(value)}</Label>
|
|
75
|
+
case "licence" :
|
|
76
|
+
return <AutoLink url={rowData.licenseUrl}>
|
|
77
|
+
<Label style={styles.textDecorationUnderline} splitText>{rowData.license}</Label>
|
|
78
|
+
</AutoLink>
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}}
|
|
82
|
+
/>
|
|
83
|
+
</View>
|
|
84
|
+
</Screen>
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export const title = "A propos des librairies tiers";
|
|
88
|
+
|
|
89
|
+
OpenLibrariesScreen.title = title;
|
|
90
|
+
OpenLibrariesScreen.screenName = "Help/OpenLibraries";
|
|
91
|
+
OpenLibrariesScreen.Modal = true;
|
|
92
|
+
OpenLibrariesScreen.authRequired = false;
|
|
93
|
+
|
|
94
|
+
export function OpenLibrariesLink(props){
|
|
95
|
+
const {style,...rest} = props;
|
|
96
|
+
return <Link routeName={OpenLibrariesScreen.screenName}>
|
|
97
|
+
<Label {...defaultObj(rest)} style={[{color:theme.colors.primary},styles.content,style]}>
|
|
98
|
+
{props.children || title}
|
|
99
|
+
</Label>
|
|
100
|
+
</Link>
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const gridPadding = 5;
|
|
104
|
+
|
|
105
|
+
const styles = StyleSheet.create({
|
|
106
|
+
container : {
|
|
107
|
+
paddingHorizontal : 10,
|
|
108
|
+
paddingVertical : 10,
|
|
109
|
+
},
|
|
110
|
+
textDecorationUnderline : {
|
|
111
|
+
textDecorationLine:'underline',
|
|
112
|
+
},
|
|
113
|
+
content : {
|
|
114
|
+
textDecorationLine:'underline',
|
|
115
|
+
fontWeight : 'bold',
|
|
116
|
+
},
|
|
117
|
+
grid0: {width:40,padding:gridPadding},
|
|
118
|
+
grid1 : {width:'60%',padding:gridPadding},
|
|
119
|
+
grid2 : {width:60,padding:gridPadding},
|
|
120
|
+
grid3 : {width:60,padding:gridPadding},
|
|
121
|
+
table : {
|
|
122
|
+
width : "100%"
|
|
123
|
+
},
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
OpenLibrariesScreen.Link = OpenLibrariesLink;
|
|
127
|
+
|
|
128
|
+
export {OpenLibrariesLink as Link};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import TermsOfUses from "./TermsOfUses"
|
|
2
2
|
import PrivacyPolicy from "./PrivacyPolicy";
|
|
3
3
|
import About from "./About";
|
|
4
|
+
import OpenLibrariesScreen from "./OpenLibraryScreen";
|
|
4
5
|
export default [
|
|
5
6
|
TermsOfUses,
|
|
6
7
|
PrivacyPolicy,
|
|
7
8
|
About,
|
|
9
|
+
OpenLibrariesScreen,
|
|
8
10
|
]
|
|
9
11
|
|
|
10
12
|
export {PrivacyPolicy};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = {"@
|
|
1
|
+
module.exports = {"@FTO-CONSULT/EXPO-UI":{"name":"@FTO-CONSULT/EXPO-UI","version":"6.26.8","homepage":"https://github.com/borispipo/expo-ui#readme"}};
|