aboutsummaryrefslogtreecommitdiff
path: root/modern/src/settings/ComputedAttributePage.js
blob: 28b0f41e411e19cd8193d550193a5a048e5f31b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import React, { useState } from 'react';
import {
  Accordion,
  AccordionSummary,
  AccordionDetails,
  Typography,
  FormControl,
  InputLabel,
  MenuItem,
  Select,
  TextField,
} from '@mui/material';
import makeStyles from '@mui/styles/makeStyles';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import EditItemView from './components/EditItemView';
import { useTranslation } from '../common/components/LocalizationProvider';
import usePositionAttributes from '../common/attributes/usePositionAttributes';
import SettingsMenu from './components/SettingsMenu';

const useStyles = makeStyles(() => ({
  details: {
    flexDirection: 'column',
  },
}));

const ComputedAttributePage = () => {
  const classes = useStyles();
  const t = useTranslation();

  const positionAttributes = usePositionAttributes(t);

  const [item, setItem] = useState();
  const [key, setKey] = useState();

  const options = Object.entries(positionAttributes).map(([key, value]) => ({
    key,
    name: value.name,
    type: value.type,
  }));

  const handleChange = (event) => {
    const newValue = event.target.value;
    setKey(newValue);
    const positionAttribute = positionAttributes[newValue];
    if (positionAttribute && positionAttribute.type) {
      setItem({ ...item, attribute: newValue, type: positionAttribute.type });
    } else {
      setItem({ ...item, attribute: newValue });
    }
  };

  const validate = () => item && item.description && item.expression;

  return (
    <EditItemView
      endpoint="attributes/computed"
      item={item}
      setItem={setItem}
      validate={validate}
      menu={<SettingsMenu />}
      breadcrumbs={['settingsTitle', 'sharedComputedAttribute']}
    >
      {item && (
        <Accordion defaultExpanded>
          <AccordionSummary expandIcon={<ExpandMoreIcon />}>
            <Typography variant="subtitle1">
              {t('sharedRequired')}
            </Typography>
          </AccordionSummary>
          <AccordionDetails className={classes.details}>
            <TextField
              margin="normal"
              value={item.description || ''}
              onChange={(event) => setItem({ ...item, description: event.target.value })}
              label={t('sharedDescription')}
            />
            <FormControl margin="normal" fullWidth>
              <InputLabel>{t('sharedAttribute')}</InputLabel>
              <Select
                value={item.attribute || ''}
                onChange={handleChange}
              >
                {options.map((option) => (
                  <MenuItem key={option.key} value={option.key}>{option.name}</MenuItem>
                ))}
              </Select>
            </FormControl>
            <TextField
              margin="normal"
              value={item.expression || ''}
              onChange={(event) => setItem({ ...item, expression: event.target.value })}
              label={t('sharedExpression')}
              multiline
              rows={4}
            />
            <FormControl
              margin="normal"
              fullWidth
              disabled={key in positionAttributes}
            >
              <InputLabel>{t('sharedType')}</InputLabel>
              <Select
                value={item.type || ''}
                onChange={(event) => setItem({ ...item, type: event.target.value })}
              >
                <MenuItem value="string">{t('sharedTypeString')}</MenuItem>
                <MenuItem value="number">{t('sharedTypeNumber')}</MenuItem>
                <MenuItem value="boolean">{t('sharedTypeBoolean')}</MenuItem>
              </Select>
            </FormControl>
          </AccordionDetails>
        </Accordion>
      )}
    </EditItemView>
  );
};

export default ComputedAttributePage;