diff --git a/src/resources/apps/index.jsx b/src/resources/apps/index.jsx index 50fd25d30ea986c3b82de987ceb7541ce96d07ef..b2ac088f56204c37a81b0e4a7f4d9c6eb25bf996 100644 --- a/src/resources/apps/index.jsx +++ b/src/resources/apps/index.jsx @@ -1,5 +1,5 @@ import * as React from "react"; -import {FunctionField, WrapperField, Edit, Toolbar, SaveButton, DeleteWithConfirmButton, ReferenceInput, SelectInput, Link, useCreatePath, useNotify, useRedirect, required, FileInput, FileField, TextInput, List, Datagrid, TextField, TopToolbar, Create, SimpleForm, CreateButton, EditButton, ListButton, useRecordContext} from 'react-admin'; +import {AutocompleteInput, FunctionField, WrapperField, Edit, Toolbar, SaveButton, DeleteWithConfirmButton, ReferenceInput, SelectInput, Link, useCreatePath, useNotify, useRedirect, required, FileInput, FileField, TextInput, List, Datagrid, TextField, TopToolbar, Create, SimpleForm, CreateButton, EditButton, ListButton, useRecordContext} from 'react-admin'; import DomainIcon from '@mui/icons-material/Domain' import IconLink from '@mui/icons-material/Link' import PeopleIcon from '@mui/icons-material/People' @@ -8,21 +8,10 @@ import { useTranslate } from "react-admin"; import {useNavigate } from 'react-router-dom'; import Button from '@mui/material/Button'; import {useParams} from "react-router-dom"; -import { useEffect, useState, useContext } from "react"; -import {useFormContext} from 'react-hook-form'; -import { ClassSelectContext, ClassSelectProvider } from "../../utils/contexts"; -import { IconButton, Grid } from '@mui/material'; -import SearchIcon from '@mui/icons-material/Search'; -import CheckIcon from '@mui/icons-material/Check'; -import {Box, Drawer} from '@mui/material'; import {roleChoices, RenderRole} from '../../utils/users' import { idFromURL , backEndURL} from "../../utils/utils"; - - - - const ALActions = ( { selection }) => { const translate = useTranslate(); return ( @@ -249,132 +238,33 @@ export const AppList = (() => { }) - const DisplayAssocFlag = ( {display} ) => { - if (display) { - return <CheckIcon/> - - } else { - return <p></p> - } -} - - const AppAssocEditField = ( {source , label, resource }) => { - - const {setResource, setSource, setOpen, select , setSaveEnable} = useContext(ClassSelectContext); - - const {setValue} = useFormContext(); - const [displayAssocFlag, setDisplayAssocFlag] = useState (false); - - - const handleClick = () => { - - setResource(resource); - setSource(source); - setOpen(true); - }; - - const displayValue = ( value) => { - if (value == null || value === '') { - setDisplayAssocFlag(false); - return ''; - } else { - setDisplayAssocFlag(true); - return value; - } - - } - - useEffect ( () => { - if (select.hasOwnProperty(source)) { - setValue(`${source}`, select[source]["id"]); - - setSaveEnable(true); - } -}, [select]) ; - return ( - <Grid container spacing={2}> - <Grid item xs={12} sm={8}> - <TextInput label={label} source={`${source}`} format={displayValue} disabled={true} validate={required()}/> - </Grid> - <Grid item xs={12} sm={2}> - <DisplayAssocFlag display={displayAssocFlag} /> - </Grid> - <Grid item xs={12} sm={2}> - <IconButton type="button" variant="outlined" onClick={handleClick} sx={ {paddingTop: 2}}> - <SearchIcon/> - </IconButton> - </Grid> - </Grid> - ); - -} - const SelectActions = () => ( - <TopToolbar></TopToolbar> -); - -const UserSelect = () => { - - const {resource, source, open, setOpen, setSourceSelect } = useContext(ClassSelectContext); +export const AppUserCreate = () => { + const translate = useTranslate(); + const filterToQuery = searchText => ({ _s: `%${searchText}%` }); return ( - <Drawer - open={open} - anchor='right' - onClose= { () => setOpen(false)} - > - - <List disableSyncWithLocation resource={resource} actions={<SelectActions />} exporter={false} sort={{ field: 'name', order:"DESC"}} queryOptions={{ meta:{ }}}> - - <Datagrid - - bulkActionButtons={false} - - rowClick= {(id, resource, record) => { - setSourceSelect(source, { id: record.id, display: record.id}); - setOpen(false); - - } - } - - > - <TextField source ="id" label="arolios.identifier"/> + <Create mutationOptions={{ meta: {} }}> - </Datagrid> + <SimpleForm> - </List> - </Drawer>) -} - -export const AppUserCreate = () => { - const translate = useTranslate(); - return ( - <Box display="flex"> - <ClassSelectProvider> - <Create mutationOptions={{ meta:{ }} }> + <ReferenceInput source='app' reference='apps' sort={{ field: 'name', order: 'ASC' }} perPage={100} queryOptions={{ meta: { getmany_context: 'appassocs' } }}> + <SelectInput label={translate('resources.apps.name', 1)} optionText="name" optionValue="name" validate={required()} /> + </ReferenceInput> - <SimpleForm> + <ReferenceInput reference="users" source="user" sort={{ field: 'identifier', order: "ASC" }} queryOptions={{ meta: { getmany_context: 'appassocs' } }}> + <AutocompleteInput label={translate('resources.users.name', 1)} optionText="identifier" optionValue="identifier" filterToQuery={filterToQuery} validate={required()} /> + </ReferenceInput> - <ReferenceInput source='app' reference='apps' sort={{field: 'name', order: 'ASC'}} perPage={100} queryOptions={{ meta:{ getmany_context: 'appassocs'}} }> - <SelectInput label={translate('resources.apps.name',1)} optionText="name" optionValue="name" validate={required()}/> - </ReferenceInput> - <AppAssocEditField source="user" label={translate('resources.users.name',1)} resource="users"/> - <SelectInput label="arolios.user_role" source="role" validate={required()} choices={roleChoices()}/> - + <SelectInput label="arolios.user_role" source="role" validate={required()} choices={roleChoices()} /> - </SimpleForm> - - - - </Create> - <UserSelect /> - - </ClassSelectProvider> - </Box>) + </SimpleForm> + </Create> + ) } export const AppDomainCreate = (() => { diff --git a/src/resources/instances/index.jsx b/src/resources/instances/index.jsx index d8e59ce92ebd53d57d85a1ad428cc8f2a9464c83..6aed8097c7b1b7c3d7d0b5efa77e4c6fe81d715b 100644 --- a/src/resources/instances/index.jsx +++ b/src/resources/instances/index.jsx @@ -1,10 +1,10 @@ -import {TextField, List, Datagrid, +import { List, Datagrid, ShowButton, EditButton, Loading, Show, Edit, SimpleShowLayout, SimpleForm, Create, TopToolbar, ExportButton, CreateButton, SaveButton, Toolbar, DeleteWithConfirmButton, SearchInput, useTranslate, EmptyClasses} from 'react-admin'; import { useContext} from "react"; import { AssociationMemberEndContext, ClassifierContext } from "../../utils/contexts"; import { useProperties } from "../../utils/properties"; -import { InsertShowField , InsertListField, InsertEditField, concatenateIdFields} from "../../utils/fields" ; +import { InsertShowField , InsertListField, InsertEditField} from "../../utils/fields" ; import { useResourceContext, useResourceDefinition, useRecordContext, useCreatePath, usePermissions} from "react-admin"; import { idFromURL, extractResourceFromPathName} from "../../utils/utils"; import {useParams, useLocation} from "react-router-dom"; diff --git a/src/utils/dataProvider/index.jsx b/src/utils/dataProvider/index.jsx index 4d33df713ff5291f57684e28516a4d846f502d9b..b691612bf817a9dc6b60377f40c3db627c4e09fb 100644 --- a/src/utils/dataProvider/index.jsx +++ b/src/utils/dataProvider/index.jsx @@ -197,7 +197,19 @@ const CustomDataProvider = { const instid =ids[0] ; if (resource === 'apps' || resource === 'domains') { return Promise.resolve ( { data: [ { id: instid }]}); - } else { // no case implemented + } else if (resource === 'users') { + const ids = params.ids; + const instid = ids[0]; + // variant of getOne + + const url = `${apiUrl}/${resource}/${instid}`; + + return httpClient(url).then(({ json }) => ({ + data: [ { id: json['identifier'], ...json} ], + total: 1 + })); + + } else { // no case implemented let url = `${apiUrl}/`; if (prefix) { diff --git a/src/utils/fields/index.jsx b/src/utils/fields/index.jsx index b76ccf719a5bd582d90054638213ee5292723bd2..e29edb06cf79e6d122b564ab53cd16f35a8a6aae 100644 --- a/src/utils/fields/index.jsx +++ b/src/utils/fields/index.jsx @@ -11,7 +11,7 @@ import CheckIcon from '@mui/icons-material/Check'; import IconLink from '@mui/icons-material/Link' import * as MUI from '@mui/material'; import { useContext } from "react"; -import { AssociationMemberEndContext, ClassSelectContext, ClassifierContext } from "../contexts"; +import { AssociationMemberEndContext, ClassifierContext } from "../contexts"; import { useCreatePath} from "react-admin"; import { useNavigate } from 'react-router-dom'; import { useEffect, useState } from "react";