@fto-consult/expo-ui 8.49.0 → 8.50.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/bin/create-app/babel.config.js +1 -0
- package/bin/create-app/dependencies.js +3 -3
- package/bin/create-app/src/database/tables/index.js +43 -21
- package/bin/create-app/src/database/tables/users/accordion.js +11 -0
- package/bin/create-app/src/database/tables/users/addIcon.js +1 -0
- package/bin/create-app/src/database/tables/users/datagrid.js +42 -0
- package/bin/create-app/src/database/tables/users/editIcon.js +1 -0
- package/bin/create-app/src/database/tables/users/fields.js +30 -0
- package/bin/create-app/src/database/tables/users/index.js +10 -0
- package/bin/create-app/src/database/tables/users/newElementLabel.js +1 -0
- package/bin/create-app/src/database/tables/users/perms.js +15 -0
- package/bin/create-app/src/database/tables/users/table.js +1 -0
- package/bin/create-app/src/database/tables/users/utils.js +20 -0
- package/bin/create-app/src/layouts/TableData/List.js +47 -0
- package/bin/create-app/src/layouts/TableData/index.js +2 -0
- package/bin/create-app/src/screens/TableData/TableDataListScreen.js +2 -2
- package/bin/create-app/src/screens/TableData/TableDataScreen.js +15 -0
- package/package.json +1 -1
- package/src/components/Button/Status.js +76 -0
- package/src/components/Button/index.js +6 -1
- package/src/screens/Help/openLibraries.js +1 -1
@@ -7,6 +7,7 @@ module.exports = function(api) {
|
|
7
7
|
$components : path.resolve($src,"components"),
|
8
8
|
$navigation : path.resolve($src,"navigation"),
|
9
9
|
$screens : path.resolve($src,"screens"),
|
10
|
+
$layouts : path.resolve($src,"layouts"),
|
10
11
|
$database: path.resolve($src, "database"), //le repertoire dédié au données d'accès à la base de données
|
11
12
|
//...your custom module resolver alias, @see : https://www.npmjs.com/package/babel-plugin-module-resolver
|
12
13
|
}
|
@@ -11,8 +11,8 @@
|
|
11
11
|
"@react-navigation/native-stack": "^6.9.25",
|
12
12
|
"@react-navigation/stack": "^6.3.28",
|
13
13
|
"@shopify/flash-list": "1.6.3",
|
14
|
-
"expo": "^50.0.
|
15
|
-
"expo-camera": "~14.
|
14
|
+
"expo": "^50.0.13",
|
15
|
+
"expo-camera": "~14.1.1",
|
16
16
|
"expo-clipboard": "~5.0.1",
|
17
17
|
"expo-font": "~11.10.3",
|
18
18
|
"expo-image-picker": "~14.7.1",
|
@@ -23,7 +23,7 @@
|
|
23
23
|
"expo-system-ui": "~2.9.3",
|
24
24
|
"expo-web-browser": "~12.8.2",
|
25
25
|
"react": "18.2.0",
|
26
|
-
"react-native": "0.73.
|
26
|
+
"react-native": "0.73.5",
|
27
27
|
"react-native-safe-area-context": "4.8.2",
|
28
28
|
"react-native-screens": "~3.29.0",
|
29
29
|
"react-native-svg": "14.1.0",
|
@@ -1,25 +1,6 @@
|
|
1
1
|
/****
|
2
2
|
la liste des tables de donnéees à exporter, de la forme :
|
3
3
|
[tableName1] : {
|
4
|
-
fields : { //la liste des champs liés à la table de données
|
5
|
-
[field1] : {
|
6
|
-
label | text : <string | ReactComponent>, le texte ou libelé lié au champ
|
7
|
-
type : <string>, le type de field par exemple : text,password, email, switch, checkbox, tel, select, et bien d'autres
|
8
|
-
|
9
|
-
//cette fonction est appelée à chaque fois que les premiers règles de validations ont été conclus lors de la validation du champ. Elle doit retourner soit un boolean, une chaine de caractère, un objet ou une promesse
|
10
|
-
//si une chaine de caractère est retournée, alors la validation du champ considère qu'il s'agit d'une erreur et le message est affiché comme erreur de validation du champ
|
11
|
-
//si un objet est retourné et cet objet contient un champ message | msg de type string, alors le validateur considère qu'il s'agit d'une erreur et le champ en question est affiché comme message de l'erreur
|
12
|
-
//si une promese est retournée, alors la fonction attendra que la promesse soit résolue
|
13
|
-
1. si la promesse resoud une chaine de caractère ou un objet idem au cas précédent, ladite chaine est condisérée comme une erreur
|
14
|
-
2. si la promesse renvoie une erreur, alors le validateur considère comme un échec de validation et le message lié à l'erreur est affiché comme message d'erreur de validation
|
15
|
-
//si false est retournée, alors rien n'est fait et le status de ce champ reste toujours à invalide. il sera donc impossible d'enregistrer le formulaire form data
|
16
|
-
//si true est retourneé, alors la formField est valide
|
17
|
-
onValidatorValid : ({value,context,....rest}) => <boolean | object {} | string | Promise <boolean | object : {} | string>>,
|
18
|
-
|
19
|
-
//Cette fonction est appélée à chaque échec de validation du form field
|
20
|
-
onValidatorNoValid : ({value,context,...rest}) => <any>
|
21
|
-
}
|
22
|
-
},
|
23
4
|
tableName <string>, le nom de la table name
|
24
5
|
label | text <string>, le titre à donner à la table data
|
25
6
|
icon : <string | ReactComponent>, l'icon de la table data,
|
@@ -31,7 +12,7 @@
|
|
31
12
|
drawerSection <string>, //le nom de la section associé au drawer dans lequel figurera le table data
|
32
13
|
print <function ({data,...settings})>=> <Promise<{content:[],...rest}>, //la fonction utile pour l'impression de la tabel de données suivant les recommandation de la libraririe pdfmake
|
33
14
|
printOptions <object>, //les options à passer à la fonction print,
|
34
|
-
|
15
|
+
newElementLabel : <string>, //le texte à utiliser pour le rendu du bouton lorsqu'il s'agit d'un nouvel element de la table data
|
35
16
|
databaseStatistics <function ()=> <boolean> | boolean>, //si la table data figurera dans les Statistiques en BD, validable si le composant DatabaseStatistics est appélé dans l'application
|
36
17
|
|
37
18
|
showInFab <boolean | function()=><boolean>, //spécifie si un bouton lié à la table sera affiché dans le composant Fab
|
@@ -48,10 +29,51 @@
|
|
48
29
|
}
|
49
30
|
}
|
50
31
|
fabProps { boolean<false> | object|function({tableName})}, //si fabProps vaux false ou retourne false, alors le table data ne s'affichera pas dans le composant Fab
|
32
|
+
fields : { //la liste des champs liés à la table de données
|
33
|
+
[field1] : {
|
34
|
+
label | text : <string | ReactComponent>, le texte ou libelé lié au champ
|
35
|
+
type : <string>, le type de field par exemple : text,password, email, switch, checkbox, tel, select, et bien d'autres
|
36
|
+
sortable : <boolean>, //si la colonne sera triable
|
37
|
+
filterable : <boolean> //si la colonne sera filterable
|
38
|
+
form : <boolen> //si la colonne sera affiché et pris en compte dans le formulaire (FormData) lié à l'enregistrement des données de la table data
|
39
|
+
datagrid : <boolean> //si la colonne sera affiché et pris en compte dans le composant Datagrid
|
40
|
+
//cette fonction est appelée à chaque fois que les premiers règles de validations ont été conclus lors de la validation du champ. Elle doit retourner soit un boolean, une chaine de caractère, un objet ou une promesse
|
41
|
+
//si une chaine de caractère est retournée, alors la validation du champ considère qu'il s'agit d'une erreur et le message est affiché comme erreur de validation du champ
|
42
|
+
//si un objet est retourné et cet objet contient un champ message | msg de type string, alors le validateur considère qu'il s'agit d'une erreur et le champ en question est affiché comme message de l'erreur
|
43
|
+
//si une promese est retournée, alors la fonction attendra que la promesse soit résolue
|
44
|
+
1. si la promesse resoud une chaine de caractère ou un objet idem au cas précédent, ladite chaine est condisérée comme une erreur
|
45
|
+
2. si la promesse renvoie une erreur, alors le validateur considère comme un échec de validation et le message lié à l'erreur est affiché comme message d'erreur de validation
|
46
|
+
//si false est retournée, alors rien n'est fait et le status de ce champ reste toujours à invalide. il sera donc impossible d'enregistrer le formulaire form data
|
47
|
+
//si true est retourneé, alors la formField est valide
|
48
|
+
onValidatorValid : ({value,context,....rest}) => <boolean | object {} | string | Promise <boolean | object : {} | string>>,
|
49
|
+
|
50
|
+
//Cette fonction est appélée à chaque échec de validation du form field
|
51
|
+
onValidatorNoValid : ({value,context,...rest}) => <any>
|
52
|
+
|
53
|
+
width : 180, //définit la longueur de la colonne dans le composant datagrid
|
54
|
+
|
55
|
+
//si vous souhaitez personnaliser le rendu de la colonne dans le composant Datagrid
|
56
|
+
datagrid : {
|
57
|
+
render : ({rowData,columnField,columnDef,...rest})=><ReactNode>
|
58
|
+
},
|
59
|
+
visible : <boolean>, //si le champ sera visible (par défaut dans le datagrid) et dans le formulaire d'enregistrement ou modification de la données lié à la table data
|
60
|
+
readOnly : <boolean>, //si le champ sera en lecture seul dans le formulaire d'enregistrement d'une nouvelle données lié à la table data
|
61
|
+
disabled : <boolean>, //si le champ sera désactivé dans le formulaire d'enregistrement/modification de la données liées à la table data
|
62
|
+
readOnlyOnEditing : <boolean>, //si le champ sera en mode lecture seule au moment de la modification de la données liée à la table data
|
63
|
+
visibleOnlyOnCreate : <boolean>, //si le champ est visible dans le formulaire uniquement en cas de création
|
64
|
+
visibleOnlyOnEditing : <boolean>, //si le champ sera visible uniquement au moment de la modification de la données liées à la table data
|
65
|
+
disabledOnEditing : <boolean>, //si le champ est désactivé dans le formulaire lorsqu'il s'agit de la modification de la données liée à la table data
|
66
|
+
|
67
|
+
primaryKey : <boolean>, //si le champ fait partie des clés primaire de la table data. Par défaut, tous les champs de type clé primaire sont en mode lecture seule en cas de modification de la données. il est indispensable pour chaque table de données de toujours spécifier au moins un champ comme clé primaire. tous les champs ayant cette propriétés à true sont utilisés à chaque fois pour évaluer l'identifiant unique lié àla table data mais aussi pour déterminer s'il s'agit d'une mise à jour où pas
|
68
|
+
},
|
69
|
+
....
|
70
|
+
[fieldN] : {....}
|
71
|
+
},
|
72
|
+
|
51
73
|
}
|
52
74
|
*/
|
53
75
|
export default {
|
54
|
-
|
76
|
+
users : require("./users").default,
|
55
77
|
}
|
56
78
|
|
57
79
|
export {default as getTable} from "./getTable";
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import React from "$react";
|
2
|
+
import DateLib from "$clib/date";
|
3
|
+
|
4
|
+
export default function accordion({rowData}){
|
5
|
+
return {
|
6
|
+
content : `${rowData.email}`,
|
7
|
+
title : rowData?.username,
|
8
|
+
avatar : rowData.avatar,
|
9
|
+
right : DateLib.format(rowData.birthdate),
|
10
|
+
}
|
11
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export default 'material-person-add'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import accordion from "./accordion";
|
2
|
+
import table from "./table";
|
3
|
+
import {navigateToTableData} from "$enavigation/utils";
|
4
|
+
import editIcon from "./editIcon";
|
5
|
+
import addIcon from "./addIcon";
|
6
|
+
import newElementLabel from "./newElementLabel";
|
7
|
+
import { generateData } from "./utils";
|
8
|
+
|
9
|
+
export default {
|
10
|
+
fetcher : (url,options)=>{ //la fonction fetcher à passer au composant SWRDatagrid
|
11
|
+
return Promise.resolve(generateData(1000)); //génère 100 utilisateurs à l'aide de la librarire faker
|
12
|
+
},
|
13
|
+
accordionProps : {
|
14
|
+
accordion,
|
15
|
+
bottomSheetTitle : ({rowCounterIndex})=>{
|
16
|
+
return "Détail sur l'utilisateur N° "+rowCounterIndex.formatNumber();
|
17
|
+
},
|
18
|
+
},
|
19
|
+
/*** les actions du datagrid lorsqu'on sélectionne les éléments de la table */
|
20
|
+
selectedRowsActions : ({selectedRows,selectedRowsCount,...rest})=>{
|
21
|
+
return {
|
22
|
+
edit : {
|
23
|
+
text : 'Modifier/Consulter',
|
24
|
+
icon : editIcon,
|
25
|
+
perm : `${table}:update|read`, //cette action n'est affiché si et seulement si l'utilisateur a la permission de modifier la table
|
26
|
+
onPress : ({selectedRows})=>{
|
27
|
+
navigateToTableData(table,{datas:selectedRows});
|
28
|
+
}
|
29
|
+
},
|
30
|
+
}
|
31
|
+
},
|
32
|
+
actions : [
|
33
|
+
{
|
34
|
+
text : newElementLabel,
|
35
|
+
icon : addIcon,
|
36
|
+
perm : `${table}:create`, //cette action n'est affichée si et seulement si l'utilisateur a la permission de créer un élément lié à la table data
|
37
|
+
onPress : ()=>{
|
38
|
+
navigateToTableData(table,{});
|
39
|
+
}
|
40
|
+
}
|
41
|
+
],
|
42
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export default "pencil";
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
export default {
|
3
|
+
userId : {
|
4
|
+
primaryKey : true,
|
5
|
+
text :"Id",
|
6
|
+
type : "id", //il s'agit d'un champ de type id
|
7
|
+
visibleOnlyOnEditing : true, //l'id de sera généré depuis la base de données, donc pas question d'afficher au moment de création de la table data
|
8
|
+
width : 180, //spécifier la longueur de la colonne dans le composant datagrid
|
9
|
+
},
|
10
|
+
username : {
|
11
|
+
text : "Name",
|
12
|
+
width : 220,
|
13
|
+
},
|
14
|
+
amount : {
|
15
|
+
type : "number",
|
16
|
+
label : "Amount",
|
17
|
+
},
|
18
|
+
email : {
|
19
|
+
type : "email",
|
20
|
+
label : 'Email',
|
21
|
+
},
|
22
|
+
avatar : {
|
23
|
+
type : "image",
|
24
|
+
label: 'Avatar',
|
25
|
+
},
|
26
|
+
birthdate : {
|
27
|
+
type : "date",
|
28
|
+
label : "Date",
|
29
|
+
},
|
30
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
export default {
|
2
|
+
table : require("./table").default,
|
3
|
+
icon : 'material-people',
|
4
|
+
title : "Exemple table : Utilisateurs",
|
5
|
+
datagrid : require("./datagrid").default,
|
6
|
+
perms : require("./perms").default,
|
7
|
+
newElementLabel : require("./newElementLabel").default,
|
8
|
+
sortable : false, //la table n'est pas triable
|
9
|
+
filterable : false,//la table n'est pas filterable
|
10
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export default "Nouvel utilisateur";
|
@@ -0,0 +1,15 @@
|
|
1
|
+
export default {
|
2
|
+
delete : false, //il sera impossible d'assigner la permission de suppression à un utilisateur
|
3
|
+
readPerms : {
|
4
|
+
text : "Visualiser permissions",
|
5
|
+
tooltip : "Peut visualiser les permissions des autres utilisateurs"
|
6
|
+
},
|
7
|
+
editPerms : {
|
8
|
+
text : "Modifier permissions",
|
9
|
+
tooltip : "Peut Modifier les permissions des autres utilisateurs"
|
10
|
+
},
|
11
|
+
groupable : {
|
12
|
+
text : "Grouper les données de liste",
|
13
|
+
tooltip : "Peut grouper les données de liste",
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export default "users";
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
2
|
+
export function createRandomUser (){
|
3
|
+
return {
|
4
|
+
userId: faker.string.uuid(),
|
5
|
+
username: faker.internet.userName(),
|
6
|
+
amount : faker.number.int(),
|
7
|
+
email: faker.internet.email(),
|
8
|
+
avatar: faker.image.dataUri({height:50,width:50}),
|
9
|
+
password: faker.internet.password(),
|
10
|
+
birthdate: faker.date.birthdate(),
|
11
|
+
registeredAt: faker.date.past(),
|
12
|
+
};
|
13
|
+
}
|
14
|
+
|
15
|
+
export const generateData = (count)=>{
|
16
|
+
count = typeof count =='number' && count > 5 ? count : 10000;
|
17
|
+
return faker.helpers.multiple(createRandomUser, {
|
18
|
+
count,
|
19
|
+
});
|
20
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import SWRDatagrid from "$ecomponents/Datagrid/SWRDatagrid";
|
2
|
+
import getTable from "$database/tables/getTable";
|
3
|
+
import { defaultStr } from "$cutils";
|
4
|
+
import {forwardRef} from "$react";
|
5
|
+
import fetch from "$capi/fetch";
|
6
|
+
|
7
|
+
const TableDataListLayoutComponent = forwardRef(
|
8
|
+
({ tableName, table,fetcher, ...rest }, ref) => {
|
9
|
+
tableName = defaultStr(tableName, table).trim().toUpperCase();
|
10
|
+
const tableObj = Object.assign({}, getTable(tableName));
|
11
|
+
return ( //le SWRDatagrid est le composant datagrid réicrit à l'aide de la librairie swr : (https://swr.vercel.app/) utile pour effectuer le fetching des données distantes
|
12
|
+
<SWRDatagrid
|
13
|
+
fetchPath = {tableName} //le chemin (path) à passer à la fonction useSWR, @voir : https://swr.vercel.app/
|
14
|
+
fetchPathKey={tableName} //IL s'agit d'une chaine de caractère identifiant de manière unique le chemin fetchPath. Si vous faites appels plusieurs fois à ce composants, rassurez vous à chaque fois que cette clié soit distinct pour chaque appel car sionon les données récupérées depuis la BD seront identiques pour tous les appels du composant
|
15
|
+
sessionName={tableName} //le nom de la session, utile pour persister les paramètres liés au datagrid de la table data
|
16
|
+
filterable={true} //si la table de données est filterable, spécifiez la valeur false, pour que les données ne soit pas filtrable
|
17
|
+
canFetchOnlyVisibleColumns={false} //si uniquement les colonnes visisible seront récupérérs depuis la base de données, via le champ fields des options envoyés à la fonction fetcher
|
18
|
+
parseMangoQueries = {true} //Spécifiez la valeur false, si vous utilisez une base de données qui accepte les requêtes mangoes (Voir https://www.mongodb.com/docs/manual/tutorial/query-documents) et true pour un backend lié à une BD relationnelle
|
19
|
+
{...rProps}
|
20
|
+
{...defaultObj(tableObj.datagrid)} //les props du datagrid lié à la table data
|
21
|
+
exportToExcelIsAllowed={"{0}:exporttoexcel".sprintf(tableName)} //la permission pour l'export des données de la table data au format Excel, vous pouvez définir également une fonction de la forme : ()=><boolean>
|
22
|
+
exportToPDFIsAllowed={"{0}:exporttopdf".sprintf(tableName)} //la permission pour l'export des données au format pdf, vous pouvez également définir une fonction de la forme : ()=><boolean>
|
23
|
+
{...rest}
|
24
|
+
ref={ref}
|
25
|
+
fetcher={(url, opts) => {
|
26
|
+
if(typeof fetcher ==="function"){
|
27
|
+
return fetcher(url,opts);
|
28
|
+
}
|
29
|
+
delete opts.fields;
|
30
|
+
delete opts?.fetchOptions?.fields;
|
31
|
+
console.log(opts.fetchOptions," les options à utiliser pour effectuer le fetch distant des données");
|
32
|
+
console.log(url," l'url de la requête")
|
33
|
+
console.log(opts.fetchOptions?.where," les options de filtres ")
|
34
|
+
//implémenter votre logique de récupération des données distance
|
35
|
+
return fetch(url, opts);
|
36
|
+
}}
|
37
|
+
table={tableObj}
|
38
|
+
/>
|
39
|
+
);
|
40
|
+
}
|
41
|
+
);
|
42
|
+
|
43
|
+
export default TableDataListLayoutComponent;
|
44
|
+
|
45
|
+
TableDataListLayoutComponent.displayName = "TableDataListLayoutComponent";
|
46
|
+
|
47
|
+
TableDataListLayoutComponent.propTypes = {};
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import Screen from "$eScreen";
|
2
|
-
import
|
2
|
+
import {List} from "$layouts/TableData";
|
3
3
|
|
4
4
|
export default function TableDataListScreen (props){
|
5
5
|
return <Screen {...props}>
|
6
|
-
<
|
6
|
+
<List {...props}/>
|
7
7
|
</Screen>
|
8
8
|
}
|
9
9
|
|
@@ -31,6 +31,21 @@ export default class TableDataScreenItem extends TableData{
|
|
31
31
|
upsertToDB({data,tableName,...rest}){
|
32
32
|
return Promise.resolve({data});
|
33
33
|
}
|
34
|
+
prepareComponentProps (...rest){
|
35
|
+
return super.prepareComponentProps(...rest); //pour preparer les props qui seront rendu par le composant
|
36
|
+
}
|
37
|
+
/****
|
38
|
+
la fonction permet de préparer les champs du composant TableData avant qu'ils ne soient envoyés au composant FormData
|
39
|
+
Si cette fonction retourne false, alors le champ en question ne sera pas pris en compte dans le formulaire lors de l'enregistrement des données
|
40
|
+
Cette fonction est très utile pour non seulement filtrer les champs qui peuvent appraitre dans le formulaire, mais aussi modifier dynamiquement le status du champ en fonction des situatioins
|
41
|
+
- le champ isUpdate <boolean>, détermine s'il s'agit d'une mise à jour de la données (data) en cours
|
42
|
+
- le champ name <string>, représente le nom du champ dans le formulaire, la clé du champ dans la props fields du table data
|
43
|
+
- le champ field <object>, représente l'objet field, l'une des valeurs de la propriétés fields du table data
|
44
|
+
- le champ data <object>, représente la donnée du table data en cours de traitement. Lorsque isUpdate est à false, data est un objet non vide et non null
|
45
|
+
*/
|
46
|
+
prepareField({name,field,isUpdate,data,...rest}){
|
47
|
+
return super.prepareField({name,field,isUpdate,data,...rest});
|
48
|
+
}
|
34
49
|
}
|
35
50
|
|
36
51
|
TableDataScreenItem.Modal = true; //spécifiez si cet écran s'affiche en model ou non
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@fto-consult/expo-ui",
|
3
|
-
"version": "8.
|
3
|
+
"version": "8.50.0",
|
4
4
|
"description": "Bibliothèque de composants UI Expo,react-native",
|
5
5
|
"react-native-paper-doc": "https://github.com/callstack/react-native-paper/tree/main/docs/docs/guides",
|
6
6
|
"scripts": {
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import React from "$react";
|
2
|
+
import theme from "$theme";
|
3
|
+
import Label from "$ecomponents/Label";
|
4
|
+
import {defaultObj} from "$cutils";
|
5
|
+
import Icon from "$ecomponents/Icon";
|
6
|
+
import {Pressable,StyleSheet} from "react-native";
|
7
|
+
import PropTypes from "prop-types";
|
8
|
+
|
9
|
+
const ButtonStatusComponent = React.forwardRef(({status,withIcon,color,backgroundColor,label,text,icon,editIconProps,editIcon,iconProps,onPress,editable,testID,left,right,labelProps,...containerProps},ref)=>{
|
10
|
+
labelProps = defaultObj(labelProps);
|
11
|
+
iconProps = defaultObj(iconProps);
|
12
|
+
testID = defaultStr(testID,"RN_ButtonStatusComponent_"+status);
|
13
|
+
const style = defaultObj(StyleSheet.flatten(containerProps.style));
|
14
|
+
color = theme.Colors.isValid(color) ? color : theme.Colors.isValid(style.color)? style.color : undefined;
|
15
|
+
backgroundColor = theme.Colors.isValid(backgroundColor) ? backgroundColor : theme.color.isValid(style.backgroundColor)?style.backgroundColor : undefined;
|
16
|
+
const rP = {style:[color && {color}, backgroundColor && {backgroundColor}]};
|
17
|
+
if(color){
|
18
|
+
rP.color = color;
|
19
|
+
}
|
20
|
+
if(backgroundColor){
|
21
|
+
rP.backgroundColor = backgroundColor;
|
22
|
+
}
|
23
|
+
label = React.isValidElement(label,true) && label || React.isValid(text,true) && text || null;
|
24
|
+
left = typeof left =='function'? left(rP) : left;
|
25
|
+
right = typeof right =='function'? right(rP) : right;
|
26
|
+
const icProps = {color,size:15,...iconProps,style:[theme.styles.noMargin,theme.styles.noPadding,iconProps.style],onPress}
|
27
|
+
return <Pressable ref={ref} onPres={onPress} testID={`${testID}_Container`} {...containerProps} style={[{borderRadius:15,paddingVertical:4,paddingHorizontal:10,alignSelf: 'flex-start'},theme.styles.row,theme.styles.flexWrap,backgroundColor && {backgroundColor},style]}>
|
28
|
+
{React.isValidElement(left)? left : null}
|
29
|
+
{withIcon !== false && React.isValidElement(icon,true) ? <Icon {...icProps} icon={icon} />:null}
|
30
|
+
{label ? <Label testID={`${testID}_Label`} {...labelProps} style={[color && {color},{fontSize:13},labelProps.style]}>{label}</Label> : null}
|
31
|
+
{withIcon !== false && editable && React.isValidElement(editIcon,true) ? <Icon {...icProps} icon={editIcon} {...defaultObj(editIconProps)}/>:null}
|
32
|
+
{React.isValidElement(right)? right : null}
|
33
|
+
</Pressable>
|
34
|
+
});
|
35
|
+
|
36
|
+
ButtonStatusComponent.displayName = "ButtonStatusComponent";
|
37
|
+
|
38
|
+
export default ButtonStatusComponent;
|
39
|
+
|
40
|
+
ButtonStatusComponent.defaultProps = {
|
41
|
+
withIcon : true,
|
42
|
+
editable : false,
|
43
|
+
}
|
44
|
+
|
45
|
+
ButtonStatusComponent.propTypes = {
|
46
|
+
label : PropTypes.oneOfType([ //le libelé à faire figurer sur le status
|
47
|
+
PropTypes.node,
|
48
|
+
PropTypes.element,
|
49
|
+
PropTypes.string,
|
50
|
+
]),
|
51
|
+
text : PropTypes.oneOfType([ //alias à label
|
52
|
+
PropTypes.node,
|
53
|
+
PropTypes.element,
|
54
|
+
PropTypes.string,
|
55
|
+
]),
|
56
|
+
labelProps : PropTypes.object, //les props à passer au composant Label, pour l'affichage du libelé du status
|
57
|
+
withIcon : PropTypes.bool, //si les icones seront affichés
|
58
|
+
color : PropTypes.string, //la couleur du status
|
59
|
+
backgroundColor : PropTypes.string, //la couleur d'arrière plan
|
60
|
+
iconProps : PropTypes.object, //les props à passer aux différents icones du composant
|
61
|
+
onPres : PropTypes.func, //la fonction appelée lorsqu'on clique sur le status
|
62
|
+
editable : PropTypes.bool, //si le status est modifiable, dans ce cas une icone est affiché à droite lorsque le status est editable
|
63
|
+
left : PropTypes.oneOfType([ //l'élément react à rendre à gauche du texte (label)
|
64
|
+
PropTypes.func,
|
65
|
+
PropTypes.node,
|
66
|
+
PropTypes.string,
|
67
|
+
PropTypes.element,
|
68
|
+
]),
|
69
|
+
right : PropTypes.oneOfType([ //l'élément react à rendre à droite du texte (label)
|
70
|
+
PropTypes.func,
|
71
|
+
PropTypes.node,
|
72
|
+
PropTypes.string,
|
73
|
+
PropTypes.element,
|
74
|
+
]),
|
75
|
+
editIconProps : PropTypes.object,//les props de l'iconne edit
|
76
|
+
}
|
@@ -12,6 +12,7 @@ import ActivityIndicator from "$ecomponents/ActivityIndicator";
|
|
12
12
|
import Surface from "$ecomponents/Surface";
|
13
13
|
import Label from "$ecomponents/Label";
|
14
14
|
import {defaultObj,defaultVal,defaultDecimal,defaultStr} from "$cutils";
|
15
|
+
import {default as Status} from "./Status";
|
15
16
|
|
16
17
|
import PropTypes from "prop-types";
|
17
18
|
const white = "white";
|
@@ -466,4 +467,8 @@ ButtonComponent.propTypes = {
|
|
466
467
|
return true;
|
467
468
|
}
|
468
469
|
return false;
|
469
|
-
}
|
470
|
+
}
|
471
|
+
|
472
|
+
ButtonComponent.Status = Status;
|
473
|
+
|
474
|
+
export {Status};
|