Skip to content
Snippets Groups Projects
App.tsx 6.9 KiB
Newer Older
import * as React from "react";
import {
  Admin,
  Create,
  CreateProps,
  Filter,
  FilterProps,
  SearchInput,
  Edit,
  SimpleForm,
  TextInput,
  NumberInput,
  ReferenceInput,
  AutocompleteInput,
  Show,
  SimpleShowLayout,
Frank Bessou's avatar
Frank Bessou committed
  DataProvider,
  ReferenceArrayField,
  AutocompleteArrayInput,
  ReferenceArrayInput,
  FunctionField,
  SingleFieldList,
import { client } from "@logilab/cwclientlibjs";
Frank Bessou's avatar
Frank Bessou committed
import { createDataProvider } from "ra-cubicweb/dist";
import Chip from "@material-ui/core/Chip";
Frank Bessou's avatar
Frank Bessou committed
import { schema } from "./schema";
import { formHelpers } from "./formHelpers";
Frank Bessou's avatar
Frank Bessou committed
const MuseumShow = (props: ShowProps) => (
  <Show {...props}>
    <SimpleShowLayout>
      <TextField source="id" />
      <TextField source="name" />
      <TextField source="postal_address" />
      <ReferenceField label="City" link="show" reference="City" source="is_in">
        <TextField source="name" />
      </ReferenceField>
      <ReferenceArrayField
        label="Director"
        reference="Person"
        source="director"
      >
        <SingleFieldList>
          <FunctionField<{ id: string; name: string }>
            render={(person) => person && <Chip label={`${person.name}`} />}
          />
        </SingleFieldList>
      </ReferenceArrayField>
      <NumberField source="longitude" />
      <NumberField source="latitude" />
    </SimpleShowLayout>
  </Show>
);

const MuseumEdit = (props: EditProps) => {
  const inputProps = formHelpers["Museum"].getInputProps;
  return (
    <Edit {...props}>
      <SimpleForm>
        <NumberField source="id" />
        <TextInput {...inputProps("name")} />
        <NumberInput {...inputProps("latitude")} />
        <NumberInput {...inputProps("longitude")} />
        <TextInput {...inputProps("postal_address")} />
      </SimpleForm>
    </Edit>
  );
};
const MuseumCreate = (props: CreateProps) => {
  const inputProps = formHelpers["Museum"].getInputProps;
  return (
    <Create {...props}>
      <SimpleForm>
        <TextInput {...inputProps("name")} />
        <NumberInput {...inputProps("latitude")} />
        <NumberInput {...inputProps("longitude")} />
        <TextInput {...inputProps("postal_address")} />
        <ReferenceInput
          label="City"
          source="is_in"
          reference="City"
          sort={{ field: "name", order: "ASC" }}
          filterToQuery={(text: string) => ({ name: text })}
        >
          <AutocompleteInput optionText="name" />
        </ReferenceInput>
        <ReferenceArrayInput
          label="Director"
          source="director"
          reference="Person"
          sort={{ field: "name", order: "ASC" }}
          filterToQuery={(text: string) => ({ name: text })}
        >
          <AutocompleteArrayInput optionText="name" />
        </ReferenceArrayInput>
const MuseumFilter = (props: Omit<FilterProps, "children">) => (
  <Filter {...props}>
    <SearchInput source="name" alwaysOn />
  </Filter>
);

Frank Bessou's avatar
Frank Bessou committed
const MuseumList = (props: ListProps) => (
  <List {...props} filters={<MuseumFilter />}>
    <Datagrid rowClick="show">
      <NumberField source="id" />
Frank Bessou's avatar
Frank Bessou committed
      <TextField source="name" />
      <NumberField source="latitude" />
      <NumberField source="longitude" />
      <TextField source="postal_address" />
Frank Bessou's avatar
Frank Bessou committed
const CityList = (props: ListProps) => (
  <List {...props}>
    <Datagrid rowClick="show">
      <TextField source="id" />
      <TextField source="name" />
      <NumberField source="zip_code" />
      <TextField source="country" />
Frank Bessou's avatar
Frank Bessou committed
const CityEdit = (props: ListProps) => {
  const inputProps = formHelpers["City"].getInputProps;
  return (
    <Edit {...props}>
      <SimpleForm>
        <TextInput {...inputProps("name")} />
        <NumberInput {...inputProps("zip_code")} />
        <TextInput {...inputProps("country")} />
      </SimpleForm>
    </Edit>
  );
};

const CityCreate = (props: ListProps) => {
  const inputProps = formHelpers["City"].getInputProps;
  return (
    <Create {...props}>
      <SimpleForm>
        <TextInput {...inputProps("name")} />
        <NumberInput {...inputProps("zip_code")} />
        <TextInput {...inputProps("country")} />
      </SimpleForm>
    </Create>
  );
};

Frank Bessou's avatar
Frank Bessou committed
const CityShow = (props: ShowProps) => (
  <Show {...props}>
    <SimpleShowLayout>
      <TextField source="id" />
      <TextField source="name" />
      <NumberField source="zip_code" />
      <TextField source="country" />
Frank Bessou's avatar
Frank Bessou committed
      <ReferenceArrayField
        label="Museum"
        reference="Museum"
        source="reverse_is_in"
      >
        <Datagrid rowClick="show">
Frank Bessou's avatar
Frank Bessou committed
          <TextField source="name" />
        </Datagrid>
      </ReferenceArrayField>
const PersonList = (props: ListProps) => (
  <List {...props}>
    <Datagrid rowClick="show">
      <TextField source="id" />
      <TextField source="name" />
      <TextField source="email" />
    </Datagrid>
  </List>
);

const PersonEdit = (props: ListProps) => {
  const inputProps = formHelpers["Person"].getInputProps;
  return (
    <Edit {...props}>
      <SimpleForm>
        <TextInput {...inputProps("name")} />
        <TextInput {...inputProps("email")} />
      </SimpleForm>
    </Edit>
  );
};

const PersonCreate = (props: ListProps) => {
  const inputProps = formHelpers["Person"].getInputProps;
  return (
    <Create {...props}>
      <SimpleForm>
        <TextInput {...inputProps("name")} />
        <TextInput {...inputProps("email")} />
      </SimpleForm>
    </Create>
  );
};

const PersonShow = (props: ShowProps) => (
  <Show {...props}>
    <SimpleShowLayout>
      <TextField source="id" />
      <TextField source="name" />
      <TextField source="email" />
      <ReferenceArrayField
        label="Museum"
        reference="Museum"
        source="reverse_director"
      >
        <Datagrid rowClick="show">
          <TextField source="name" />
        </Datagrid>
      </ReferenceArrayField>
    </SimpleShowLayout>
  </Show>
);

const httpClient = new client.CwSimpleHttpClient("http://localhost:8080", true);
const rqlClient = new client.CwRqlClient(httpClient);

const dataProvider = createDataProvider(rqlClient, schema);
Frank Bessou's avatar
Frank Bessou committed

const App = (): JSX.Element => (
Frank Bessou's avatar
Frank Bessou committed
  <Admin dataProvider={dataProvider as DataProvider}>
    {
      // authProvider={authProvider}
      // use cwclientlibjs to get list of CWETypes
      // and add one <Resource  per type
    }
Frank Bessou's avatar
Frank Bessou committed
    <Resource
      name="Museum"
      list={MuseumList}
Frank Bessou's avatar
Frank Bessou committed
      edit={MuseumEdit}
      create={MuseumCreate}
Frank Bessou's avatar
Frank Bessou committed
    />
Frank Bessou's avatar
Frank Bessou committed
    <Resource
      name="City"
      list={CityList}
      show={CityShow}
      edit={CityEdit}
      create={CityCreate}
    />
    <Resource
      name="Person"
      list={PersonList}
      show={PersonShow}
      edit={PersonEdit}
      create={PersonCreate}
    />