@performant-software/semantic-components 0.6.2-beta.2 → 0.6.2-beta.3
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/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/main.css +0 -9
- package/package.json +2 -2
- package/src/i18n/en.json +0 -57
- package/src/index.js +3 -11
- package/types/index.js.flow +3 -11
- package/src/components/ReferenceCodeDropdown.css +0 -0
- package/src/components/ReferenceCodeDropdown.js +0 -146
- package/src/components/ReferenceCodeFormDropdown.js +0 -76
- package/src/components/ReferenceCodeFormLabel.css +0 -3
- package/src/components/ReferenceCodeFormLabel.js +0 -53
- package/src/components/ReferenceCodeModal.css +0 -0
- package/src/components/ReferenceCodeModal.js +0 -39
- package/src/components/ReferenceTableModal.css +0 -0
- package/src/components/ReferenceTableModal.js +0 -74
- package/src/components/ReferenceTablesList.css +0 -0
- package/src/components/ReferenceTablesList.js +0 -44
- package/src/components/UserDefinedFieldModal.js +0 -114
- package/src/components/UserDefinedFieldOptions.css +0 -4
- package/src/components/UserDefinedFieldOptions.js +0 -112
- package/src/components/UserDefinedFieldsEmbeddedList.js +0 -45
- package/src/components/UserDefinedFieldsForm.js +0 -209
- package/src/components/UserDefinedFieldsList.js +0 -41
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { UserDefinedFieldsService } from '@performant-software/shared-components';
|
|
4
|
-
import React, {
|
|
5
|
-
useCallback,
|
|
6
|
-
useEffect,
|
|
7
|
-
useState,
|
|
8
|
-
type ComponentType
|
|
9
|
-
} from 'react';
|
|
10
|
-
import { Form, Modal } from 'semantic-ui-react';
|
|
11
|
-
import _ from 'underscore';
|
|
12
|
-
import i18n from '../i18n/i18n';
|
|
13
|
-
import UserDefinedFieldOptions from './UserDefinedFieldOptions';
|
|
14
|
-
|
|
15
|
-
const DataTypes = {
|
|
16
|
-
select: 'Select'
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const UserDefinedFieldModal: ComponentType<any> = (props) => {
|
|
20
|
-
const [dataTypeOptions, setDataTypeOptions] = useState([]);
|
|
21
|
-
const [tableOptions, setTableOptions] = useState([]);
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Transforms the passed array of items into a Semantic UI option object.
|
|
25
|
-
*
|
|
26
|
-
* @type {function(*): *}
|
|
27
|
-
*/
|
|
28
|
-
const transformOptions = useCallback((items) => (
|
|
29
|
-
_.map(items, (item) => ({ key: item, value: item, text: item }))
|
|
30
|
-
), []);
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Fetch the available tables and data types.
|
|
34
|
-
*/
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
UserDefinedFieldsService
|
|
37
|
-
.fetchTables()
|
|
38
|
-
.then(({ data }) => setTableOptions(transformOptions(data.tables)));
|
|
39
|
-
|
|
40
|
-
UserDefinedFieldsService
|
|
41
|
-
.fetchDataTypes()
|
|
42
|
-
.then(({ data }) => setDataTypeOptions(transformOptions(data.data_types)));
|
|
43
|
-
}, []);
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<Modal
|
|
47
|
-
as={Form}
|
|
48
|
-
centered={false}
|
|
49
|
-
open
|
|
50
|
-
>
|
|
51
|
-
<Modal.Header
|
|
52
|
-
content={props.item.id
|
|
53
|
-
? i18n.t('UserDefinedFieldModal.title.edit')
|
|
54
|
-
: i18n.t('UserDefinedFieldModal.title.add')}
|
|
55
|
-
/>
|
|
56
|
-
<Modal.Content>
|
|
57
|
-
<Form.Dropdown
|
|
58
|
-
clearable
|
|
59
|
-
error={props.isError('table_name')}
|
|
60
|
-
label={i18n.t('UserDefinedFieldModal.labels.table')}
|
|
61
|
-
onChange={props.onTextInputChange.bind(this, 'table_name')}
|
|
62
|
-
options={tableOptions}
|
|
63
|
-
required={props.isRequired('table_name')}
|
|
64
|
-
selection
|
|
65
|
-
selectOnBlur={false}
|
|
66
|
-
value={props.item.table_name || ''}
|
|
67
|
-
/>
|
|
68
|
-
<Form.Input
|
|
69
|
-
error={props.isError('column_name')}
|
|
70
|
-
label={i18n.t('UserDefinedFieldModal.labels.name')}
|
|
71
|
-
onChange={props.onTextInputChange.bind(this, 'column_name')}
|
|
72
|
-
required={props.isRequired('column_name')}
|
|
73
|
-
value={props.item.column_name || ''}
|
|
74
|
-
/>
|
|
75
|
-
<Form.Dropdown
|
|
76
|
-
clearable
|
|
77
|
-
error={props.isError('data_type')}
|
|
78
|
-
label={i18n.t('UserDefinedFieldModal.labels.dataType')}
|
|
79
|
-
onChange={props.onTextInputChange.bind(this, 'data_type')}
|
|
80
|
-
options={dataTypeOptions}
|
|
81
|
-
required={props.isRequired('data_type')}
|
|
82
|
-
selection
|
|
83
|
-
selectOnBlur={false}
|
|
84
|
-
value={props.item.data_type || ''}
|
|
85
|
-
/>
|
|
86
|
-
<Form.Group>
|
|
87
|
-
<Form.Checkbox
|
|
88
|
-
error={props.isError('required')}
|
|
89
|
-
checked={props.item.required}
|
|
90
|
-
label={i18n.t('UserDefinedFieldModal.labels.required')}
|
|
91
|
-
onChange={props.onCheckboxInputChange.bind(this, 'required')}
|
|
92
|
-
/>
|
|
93
|
-
{ props.item.data_type === DataTypes.select && (
|
|
94
|
-
<Form.Checkbox
|
|
95
|
-
error={props.isError('allow_multiple')}
|
|
96
|
-
checked={props.item.allow_multiple}
|
|
97
|
-
label={i18n.t('UserDefinedFieldModal.labels.allowMultiple')}
|
|
98
|
-
onChange={props.onCheckboxInputChange.bind(this, 'allow_multiple')}
|
|
99
|
-
/>
|
|
100
|
-
)}
|
|
101
|
-
</Form.Group>
|
|
102
|
-
{ props.item.data_type === DataTypes.select && (
|
|
103
|
-
<UserDefinedFieldOptions
|
|
104
|
-
options={props.item.options}
|
|
105
|
-
onChange={(options) => props.onSetState({ options })}
|
|
106
|
-
/>
|
|
107
|
-
)}
|
|
108
|
-
</Modal.Content>
|
|
109
|
-
{ props.children }
|
|
110
|
-
</Modal>
|
|
111
|
-
);
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export default UserDefinedFieldModal;
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import React, {
|
|
4
|
-
useCallback,
|
|
5
|
-
useEffect,
|
|
6
|
-
useState,
|
|
7
|
-
type ComponentType
|
|
8
|
-
} from 'react';
|
|
9
|
-
import { Button, Input, Label } from 'semantic-ui-react';
|
|
10
|
-
import _ from 'underscore';
|
|
11
|
-
import './UserDefinedFieldOptions.css';
|
|
12
|
-
|
|
13
|
-
type Props = {
|
|
14
|
-
options: Array<string>,
|
|
15
|
-
onChange: (options: Array<string>) => void
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const UserDefinedFieldOptions: ComponentType<any> = (props: Props) => {
|
|
19
|
-
const [options, setOptions] = useState(_.map(props.options, (option) => ({ value: option })));
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Adds a new option to the list.
|
|
23
|
-
*
|
|
24
|
-
* @type {(function(): void)|*}
|
|
25
|
-
*/
|
|
26
|
-
const onAddOption = useCallback(() => {
|
|
27
|
-
setOptions((prevOptions) => [...prevOptions, { new: true }]);
|
|
28
|
-
}, []);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Deletes the option at the passed index from the list.
|
|
32
|
-
*
|
|
33
|
-
* @type {(function(*): void)|*}
|
|
34
|
-
*/
|
|
35
|
-
const onDeleteOption = useCallback((findIndex) => {
|
|
36
|
-
setOptions((prevOptions) => _.filter(prevOptions, (option, index) => index !== findIndex));
|
|
37
|
-
}, []);
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Removes the "new" indicator from the option at the passed index.
|
|
41
|
-
*
|
|
42
|
-
* @type {(function(*): void)|*}
|
|
43
|
-
*/
|
|
44
|
-
const onSaveOption = useCallback((findIndex) => {
|
|
45
|
-
setOptions((prevOptions) => _.map(
|
|
46
|
-
prevOptions,
|
|
47
|
-
(option, index) => (findIndex !== index ? option : ({ ...option, new: false }))
|
|
48
|
-
));
|
|
49
|
-
}, [options]);
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Updates the value of the option at the passed index.
|
|
53
|
-
*
|
|
54
|
-
* @type {(function(*, *, {value: *}): void)|*}
|
|
55
|
-
*/
|
|
56
|
-
const onUpdateOption = useCallback((findIndex, e, { value }) => {
|
|
57
|
-
setOptions((prevOptions) => _.map(
|
|
58
|
-
prevOptions,
|
|
59
|
-
(option, index) => (index !== findIndex ? option : ({ ...option, value }))
|
|
60
|
-
));
|
|
61
|
-
}, []);
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Calls the onChange prop when the list of options changes.
|
|
65
|
-
*/
|
|
66
|
-
useEffect(() => {
|
|
67
|
-
const savedOptions = _.filter(options, (option) => !option.new);
|
|
68
|
-
props.onChange(_.pluck(savedOptions, 'value'));
|
|
69
|
-
}, [options]);
|
|
70
|
-
|
|
71
|
-
return (
|
|
72
|
-
<div
|
|
73
|
-
className='user-defined-field-options'
|
|
74
|
-
>
|
|
75
|
-
<Button
|
|
76
|
-
basic
|
|
77
|
-
icon='plus'
|
|
78
|
-
onClick={onAddOption}
|
|
79
|
-
type='button'
|
|
80
|
-
/>
|
|
81
|
-
{ _.map(options, (option, index) => (
|
|
82
|
-
<>
|
|
83
|
-
{ option.new && (
|
|
84
|
-
<Label>
|
|
85
|
-
<Input
|
|
86
|
-
autoFocus
|
|
87
|
-
onChange={onUpdateOption.bind(this, index)}
|
|
88
|
-
value={option.value}
|
|
89
|
-
/>
|
|
90
|
-
<Button
|
|
91
|
-
basic
|
|
92
|
-
color='green'
|
|
93
|
-
icon='checkmark'
|
|
94
|
-
onClick={onSaveOption.bind(this, index)}
|
|
95
|
-
type='button'
|
|
96
|
-
size='tiny'
|
|
97
|
-
/>
|
|
98
|
-
</Label>
|
|
99
|
-
)}
|
|
100
|
-
{ !option.new && (
|
|
101
|
-
<Label
|
|
102
|
-
content={option.value}
|
|
103
|
-
onRemove={onDeleteOption.bind(this, index)}
|
|
104
|
-
/>
|
|
105
|
-
)}
|
|
106
|
-
</>
|
|
107
|
-
))}
|
|
108
|
-
</div>
|
|
109
|
-
);
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export default UserDefinedFieldOptions;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import i18n from '../i18n/i18n';
|
|
5
|
-
import BooleanIcon from './BooleanIcon';
|
|
6
|
-
import EmbeddedList from './EmbeddedList';
|
|
7
|
-
import UserDefinedFieldModal from './UserDefinedFieldModal';
|
|
8
|
-
|
|
9
|
-
type Props = {
|
|
10
|
-
items: Array<any>,
|
|
11
|
-
onDelete: (item: any) => Promise<any>,
|
|
12
|
-
onSave: (item: any) => Promise<any>
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
const UserDefinedFieldsEmbeddedList = (props: Props) => (
|
|
16
|
-
<EmbeddedList
|
|
17
|
-
actions={[{
|
|
18
|
-
name: 'edit'
|
|
19
|
-
}, {
|
|
20
|
-
name: 'delete'
|
|
21
|
-
}]}
|
|
22
|
-
columns={[{
|
|
23
|
-
name: 'table_name',
|
|
24
|
-
label: i18n.t('UserDefinedFieldsEmbeddedList.columns.table')
|
|
25
|
-
}, {
|
|
26
|
-
name: 'column_name',
|
|
27
|
-
label: i18n.t('UserDefinedFieldsEmbeddedList.columns.name')
|
|
28
|
-
}, {
|
|
29
|
-
name: 'data_type',
|
|
30
|
-
label: i18n.t('UserDefinedFieldsEmbeddedList.columns.dataType')
|
|
31
|
-
}, {
|
|
32
|
-
name: 'required',
|
|
33
|
-
label: i18n.t('UserDefinedFieldsEmbeddedList.columns.required'),
|
|
34
|
-
render: (udf) => <BooleanIcon value={udf.required} />
|
|
35
|
-
}]}
|
|
36
|
-
items={props.items}
|
|
37
|
-
modal={{
|
|
38
|
-
component: UserDefinedFieldModal
|
|
39
|
-
}}
|
|
40
|
-
onDelete={props.onDelete}
|
|
41
|
-
onSave={props.onSave}
|
|
42
|
-
/>
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
export default UserDefinedFieldsEmbeddedList;
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { RichTextArea, UserDefinedFieldsService } from '@performant-software/shared-components';
|
|
4
|
-
import React, {
|
|
5
|
-
useCallback,
|
|
6
|
-
useEffect,
|
|
7
|
-
useMemo,
|
|
8
|
-
useState,
|
|
9
|
-
type ComponentType
|
|
10
|
-
} from 'react';
|
|
11
|
-
import { Form } from 'semantic-ui-react';
|
|
12
|
-
import _ from 'underscore';
|
|
13
|
-
import DatePicker from './DatePicker';
|
|
14
|
-
|
|
15
|
-
type Props = {
|
|
16
|
-
defineableId?: number,
|
|
17
|
-
defineableType?: string,
|
|
18
|
-
isError: (key: string) => boolean,
|
|
19
|
-
item: any,
|
|
20
|
-
onChange: (obj: any) => void,
|
|
21
|
-
onClearValidationError: (...keys: Array<string>) => void
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const DataTypes = {
|
|
25
|
-
boolean: 'Boolean',
|
|
26
|
-
date: 'Date',
|
|
27
|
-
number: 'Number',
|
|
28
|
-
richText: 'RichText',
|
|
29
|
-
select: 'Select',
|
|
30
|
-
string: 'String',
|
|
31
|
-
text: 'Text'
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const UserDefinedFieldsForm: ComponentType<any> = (props: Props) => {
|
|
35
|
-
const [fields, setFields] = useState([]);
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Sets the parsed value by parsing the JSON stored in the "user_defined" prop of the item.
|
|
39
|
-
*
|
|
40
|
-
* @type {unknown}
|
|
41
|
-
*/
|
|
42
|
-
const parsedValue = useMemo(() => {
|
|
43
|
-
let value = {};
|
|
44
|
-
|
|
45
|
-
if (_.isString(props.item.user_defined)) {
|
|
46
|
-
value = JSON.parse(props.item.user_defined);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return value;
|
|
50
|
-
}, [props.item.user_defined]);
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Returns the key for the passed field.
|
|
54
|
-
*
|
|
55
|
-
* @type {function(*): string}
|
|
56
|
-
*/
|
|
57
|
-
const getFieldKey = useCallback((field) => `user_defined[${field.column_name}]`, []);
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Returns true if an error exists on the state for the passed field.
|
|
61
|
-
*
|
|
62
|
-
* @type {function(*): *}
|
|
63
|
-
*/
|
|
64
|
-
const isError = useCallback((field) => props.isError(getFieldKey(field)), [getFieldKey, props.isError]);
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Changes the value for the passed item.
|
|
68
|
-
*
|
|
69
|
-
* @type {(function(*, *): void)|*}
|
|
70
|
-
*/
|
|
71
|
-
const onChange = useCallback((field, value) => {
|
|
72
|
-
props.onChange(JSON.stringify({ ...parsedValue, [field.column_name]: value }));
|
|
73
|
-
|
|
74
|
-
// Clear the validation error if one exists
|
|
75
|
-
if (props.onClearValidationError) {
|
|
76
|
-
props.onClearValidationError(getFieldKey(field));
|
|
77
|
-
}
|
|
78
|
-
}, [getFieldKey, parsedValue, props.onChange, props.onClearValidationError]);
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Renders the passed item.
|
|
82
|
-
*
|
|
83
|
-
* @type {function(*): *}
|
|
84
|
-
*/
|
|
85
|
-
const renderItem = useCallback((field) => {
|
|
86
|
-
let rendered;
|
|
87
|
-
|
|
88
|
-
const fieldValue = parsedValue && parsedValue[field.column_name];
|
|
89
|
-
|
|
90
|
-
if (field.data_type === DataTypes.string) {
|
|
91
|
-
rendered = (
|
|
92
|
-
<Form.Input
|
|
93
|
-
error={isError(field)}
|
|
94
|
-
label={field.column_name}
|
|
95
|
-
required={field.required}
|
|
96
|
-
onChange={(e, { value }) => onChange(field, value)}
|
|
97
|
-
value={fieldValue}
|
|
98
|
-
/>
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (field.data_type === DataTypes.number) {
|
|
103
|
-
rendered = (
|
|
104
|
-
<Form.Input
|
|
105
|
-
error={isError(field)}
|
|
106
|
-
label={field.column_name}
|
|
107
|
-
required={field.required}
|
|
108
|
-
onChange={(e, { value }) => onChange(field, value)}
|
|
109
|
-
value={fieldValue}
|
|
110
|
-
type='number'
|
|
111
|
-
/>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (field.data_type === DataTypes.select) {
|
|
116
|
-
rendered = (
|
|
117
|
-
<Form.Dropdown
|
|
118
|
-
clearable
|
|
119
|
-
error={isError(field)}
|
|
120
|
-
label={field.column_name}
|
|
121
|
-
multiple={field.allow_multiple}
|
|
122
|
-
required={field.required}
|
|
123
|
-
options={_.map(field.options, (option) => ({ key: option, value: option, text: option }))}
|
|
124
|
-
onChange={(e, { value }) => onChange(field, value)}
|
|
125
|
-
selectOnBlur={false}
|
|
126
|
-
selection
|
|
127
|
-
value={fieldValue}
|
|
128
|
-
/>
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (field.data_type === DataTypes.text) {
|
|
133
|
-
rendered = (
|
|
134
|
-
<Form.TextArea
|
|
135
|
-
error={isError(field)}
|
|
136
|
-
label={field.column_name}
|
|
137
|
-
required={field.required}
|
|
138
|
-
onChange={(e, { value }) => onChange(field, value)}
|
|
139
|
-
value={fieldValue}
|
|
140
|
-
/>
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (field.data_type === DataTypes.date) {
|
|
145
|
-
rendered = (
|
|
146
|
-
<Form.Input
|
|
147
|
-
error={isError(field)}
|
|
148
|
-
label={field.column_name}
|
|
149
|
-
required={field.required}
|
|
150
|
-
>
|
|
151
|
-
<DatePicker
|
|
152
|
-
onChange={(date) => onChange(field, date && date.toString())}
|
|
153
|
-
value={fieldValue && new Date(fieldValue)}
|
|
154
|
-
/>
|
|
155
|
-
</Form.Input>
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (field.data_type === DataTypes.boolean) {
|
|
160
|
-
rendered = (
|
|
161
|
-
<Form.Checkbox
|
|
162
|
-
checked={!!fieldValue}
|
|
163
|
-
error={isError(field)}
|
|
164
|
-
label={field.column_name}
|
|
165
|
-
onChange={(e, { checked }) => onChange(field, checked)}
|
|
166
|
-
/>
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (field.data_type === DataTypes.richText) {
|
|
171
|
-
rendered = (
|
|
172
|
-
<Form.Input
|
|
173
|
-
error={isError(field)}
|
|
174
|
-
label={field.column_name}
|
|
175
|
-
required={field.required}
|
|
176
|
-
>
|
|
177
|
-
<RichTextArea
|
|
178
|
-
onChange={(value) => onChange(field, value)}
|
|
179
|
-
value={fieldValue}
|
|
180
|
-
/>
|
|
181
|
-
</Form.Input>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return rendered;
|
|
186
|
-
}, [parsedValue, isError, onChange]);
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Fetches the user defined fields when the component mounts.
|
|
190
|
-
*/
|
|
191
|
-
useEffect(() => {
|
|
192
|
-
const params = {
|
|
193
|
-
defineable_id: props.defineableId,
|
|
194
|
-
defineable_type: props.defineableType
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
UserDefinedFieldsService
|
|
198
|
-
.fetchAll(params)
|
|
199
|
-
.then(({ data }) => setFields(data.user_defined_fields));
|
|
200
|
-
}, []);
|
|
201
|
-
|
|
202
|
-
return (
|
|
203
|
-
<>
|
|
204
|
-
{ _.map(fields, renderItem.bind(this)) }
|
|
205
|
-
</>
|
|
206
|
-
);
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
export default UserDefinedFieldsForm;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import { UserDefinedFieldsService } from '@performant-software/shared-components';
|
|
4
|
-
import React, { type ComponentType } from 'react';
|
|
5
|
-
import i18n from '../i18n/i18n';
|
|
6
|
-
import BooleanIcon from './BooleanIcon';
|
|
7
|
-
import ListTable from './ListTable';
|
|
8
|
-
import UserDefinedFieldModal from './UserDefinedFieldModal';
|
|
9
|
-
|
|
10
|
-
const UserDefinedFieldsList: ComponentType<any> = () => (
|
|
11
|
-
<ListTable
|
|
12
|
-
actions={[{
|
|
13
|
-
name: 'edit'
|
|
14
|
-
}, {
|
|
15
|
-
name: 'delete'
|
|
16
|
-
}]}
|
|
17
|
-
columns={[{
|
|
18
|
-
name: 'table_name',
|
|
19
|
-
label: i18n.t('UserDefinedFieldsList.columns.table')
|
|
20
|
-
}, {
|
|
21
|
-
name: 'column_name',
|
|
22
|
-
label: i18n.t('UserDefinedFieldsList.columns.name')
|
|
23
|
-
}, {
|
|
24
|
-
name: 'data_type',
|
|
25
|
-
label: i18n.t('UserDefinedFieldsList.columns.dataType')
|
|
26
|
-
}, {
|
|
27
|
-
name: 'required',
|
|
28
|
-
label: i18n.t('UserDefinedFieldsList.columns.required'),
|
|
29
|
-
render: (udf) => <BooleanIcon value={udf.required} />
|
|
30
|
-
}]}
|
|
31
|
-
collectionName='user_defined_fields'
|
|
32
|
-
modal={{
|
|
33
|
-
component: UserDefinedFieldModal
|
|
34
|
-
}}
|
|
35
|
-
onLoad={(params) => UserDefinedFieldsService.fetchAll(params)}
|
|
36
|
-
onSave={(udf) => UserDefinedFieldsService.save(udf)}
|
|
37
|
-
onDelete={(udf) => UserDefinedFieldsService.delete(udf)}
|
|
38
|
-
/>
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
export default UserDefinedFieldsList;
|