UNPKG

@fto-consult/expo-ui

Version:

Bibliothèque de composants UI Expo,react-native

181 lines (177 loc) 7.39 kB
import showConfirm from "$ecomponents/Dialog/confirm"; import notify from "$notify"; import {defaultArray,arrayValueExists,defaultStr,uniqid} from "$cutils"; import userDbName from "$database/tables/users/dbName"; import Auth from "$cauth"; import getData from "$database/getData"; import getDB from "$database/getDB"; import Icon from "$ecomponents/Icon"; import React from "$react"; import Label from "$ecomponents/Label"; import {open as showPreloader,close as hidePreloader} from "$preloader"; import Expandable from "$ecomponents/Expandable"; import theme from "$theme"; import View from "$ecomponents/View"; import Link from "$ecomponents/Link"; import Button from "$ecomponents/Button"; const tableName = Auth.permProfilesTableName.toUpperCase(); const PermProfile = React.forwardRef((props,ref)=>{ const formName = React.useRef(defaultStr(props.formName,uniqid("perm-profile-name"))).current; const user = defaultObj(props.user); const permDataRef = React.useRef({}); const dialogProviderRef = React.useRef(null); const {isMasterAdmin,text,label,editProfileRouteName} = props; const [state,setState] = React.useState({ profiles : {}, selected : defaultArray(user.permProfiles), loading : true, canAssignPerms : Auth.isTableDataAllowed({table:'users',action:'assignPerms'}), canViewPerms : Auth.isTableDataAllowed({table:'users',action:'readPerms'}) }); const {canAssignPerms,canViewPerms,selected} = state; const reload = ()=>{ getData(userDbName+"["+tableName+"]").then((profiles)=>{ setState({...state,profiles,loading:false}) }).catch((e)=>{ setState({...state,loading:false}) }) } const assignProfile = (profile,select)=>{ if(isMasterAdmin) return null; const {selected} = state; profile = defaultObj(profile); const sel = []; const allP = {}; if(selected.length <= 0){ if(select){ sel.push(profile.code); } } else { for(let i in selected){ const val = selected[i]; if(selected[i] == profile.code){ if(select && !allP[profile.code]){ sel.push(profile.code); allP[profile.code] = true; } } else if(!allP[val]) { sel.push(val); allP[val] = true; } } if(select && !allP[profile.code]){ sel.push(profile.code); } } setState({...state,selected:sel}); if(props.onChange){ props.onChange({context:{},...state,selected:sel}); } } const onChange = ({data})=>{ permDataRef.current = data; } const onSaveProfile = ({data,goBack})=>{ const d = {...data,table:tableName,perms:permDataRef.current}; if(!isNonNullString(d._id)) return; showPreloader() getDB(userDbName).then(({db})=>{ db.upsert(d._id,()=>{ return d; }).then((up)=>{ let d = up.newDoc; notify.success("Le profil ["+d.code+"] a été inséré/modifié avec succès"); reload(); if(goBack){ goBack(true); } hidePreloader(); }).catch((e)=>{ console.log(e," upserting profile group"); hidePreloader(); }); }) } const removeProfile = (profile)=>{ if(!isObj(profile) || !isNonNullString(profile.code) || !isNonNullString(profile._id)){ return; } showConfirm({ title:'Suppr profil['+profile.code+"]", msg : 'Voulez vous vraiment supprimer le profil <<'+profile.code+">>", onSuccess : ()=>{ getDB(userDbName).then(({db})=>{ showPreloader('Suppression du profil '+defaultStr(profile.code)+"..."); db.get(profile._id).then((doc)=>{ db.remove(doc).then((e)=>{ hidePreloader(); notify.success("Le profil ["+profile.code+"] a été supprimé avec succès"); reload(); }); }).catch((e)=>{ console.log(e,' is removing doc profile') hidePreloader(); }) }) } }) } React.useEffect(()=>{ if(!canAssignPerms && !canViewPerms) return; reload(); return ()=>{ } },[]) if(!canAssignPerms && !canViewPerms) return null; const profiles = []; Object.map(state.profiles,(profile,index)=>{ if(!isObj(profile) || !isNonNullString(profile.code)){ return null; } const isAssigned = isMasterAdmin? true : arrayValueExists(selected,profile.code); profiles.push(<View key={index} style={[theme.styles.row,{justifyContent:'space-between'}]}> <Label>{profile.code}</Label> <View style={[theme.styles.row]}> <Icon primary title={isAssigned?'Profil de permission ['+profile.code+'] assigné à l\'utilisateur':'Profil de permission ['+profile.code+'] non assigné à l\'utilisateur '+String(Auth.getLoginId(user))} name={isAssigned?'checkbox-marked':'checkbox-blank-outline'} onPress={()=>{ assignProfile(profile,isAssigned?false:true) }} /> {canAssignPerms ? <Link Component = {Icon} title={"Modifier le profil ["+profile.code+"]"} name={"file-document-edit"} success routeParams = {{data:profile,formName,onChange,onSave:onSaveProfile}} routeName = {editProfileRouteName} />:null} {canAssignPerms ? <Icon title={"Supprimer le profil ["+profile.code+"]"} name={"delete"} error onPress={(e)=>{ React.stopEventPropagation(e); removeProfile(profile); }} /> : null} </View> </View>) }) return <Expandable title={defaultStr(label,text)+" ("+profiles.length.formatNumber()+")"} style={[theme.styles.p1]}> <Link primary Component = {Button} routeName = {editProfileRouteName} routeParams = {{formName,onChange,onSave:onSaveProfile}} icon={"text-box-plus-outline"} mode = "contained" > Ajouter un profil </Link> <View style={[theme.styles.w100]}> {profiles} </View> </Expandable> }); PermProfile.tableName = PermProfile.table = tableName; PermProfile.dbName = userDbName; export default PermProfile;