@material-ui/lab#AutocompleteRenderInputParams TypeScript Examples
The following examples show how to use
@material-ui/lab#AutocompleteRenderInputParams.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: MetricAutocomplete.tsx From abacus with GNU General Public License v2.0 | 6 votes |
/**
* An Autocomplete just for Metrics
*/
export default function MetricAutocomplete<
Multiple extends boolean | undefined = undefined,
DisableClearable extends boolean | undefined = undefined,
FreeSolo extends boolean | undefined = undefined,
>(
props: Omit<AutocompleteProps<Metric, Multiple, DisableClearable, FreeSolo>, 'renderInput'> & {
error?: string | false
},
): ReturnType<typeof Autocomplete> {
const processedOptions = props.options
.filter((a) => !a.name.startsWith('archived_'))
.sort((a, b) => a.name.localeCompare(b.name, 'en'))
return (
<Autocomplete<Metric, Multiple, DisableClearable, FreeSolo>
aria-label='Select a metric'
fullWidth
options={processedOptions}
noOptionsText='No metrics found'
getOptionLabel={(metric: Metric) => metric.name}
getOptionSelected={(metricA: Metric, metricB: Metric) => metricA.metricId === metricB.metricId}
renderOption={(option: Metric) => (
<div>
<Typography variant='body1'>
<strong>{option.name}</strong>
</Typography>
<Typography variant='body1'>
<small>{option.description}</small>
</Typography>
</div>
)}
renderInput={(params: AutocompleteRenderInputParams) => (
<TextField
{...params}
placeholder='Select a metric'
error={!!props.error}
helperText={_.isString(props.error) ? props.error : undefined}
required
InputProps={{
...autocompleteInputProps(params, false),
}}
InputLabelProps={{
shrink: true,
}}
/>
)}
{..._.omit(props, ['options', 'error'])}
/>
)
}
Example #2
Source File: SearchFilter.Autocomplete.tsx From backstage with Apache License 2.0 | 5 votes |
AutocompleteFilter = (props: SearchAutocompleteFilterProps) => {
const {
className,
defaultValue,
name,
values: givenValues,
valuesDebounceMs,
label,
filterSelectedOptions,
limitTags,
multiple,
} = props;
const [inputValue, setInputValue] = useState<string>('');
useDefaultFilterValue(name, defaultValue);
const asyncValues =
typeof givenValues === 'function' ? givenValues : undefined;
const defaultValues =
typeof givenValues === 'function' ? undefined : givenValues;
const { value: values, loading } = useAsyncFilterValues(
asyncValues,
inputValue,
defaultValues,
valuesDebounceMs,
);
const { filters, setFilters } = useSearch();
const filterValue =
(filters[name] as string | string[] | undefined) || (multiple ? [] : null);
// Set new filter values on input change.
const handleChange = (
_: ChangeEvent<{}>,
newValue: string | string[] | null,
) => {
setFilters(prevState => {
const { [name]: filter, ...others } = prevState;
if (newValue) {
return { ...others, [name]: newValue };
}
return { ...others };
});
};
// Provide the input field.
const renderInput = (params: AutocompleteRenderInputParams) => (
<TextField
{...params}
name="search"
variant="outlined"
label={label}
fullWidth
/>
);
// Render tags as primary-colored chips.
const renderTags = (
tagValue: string[],
getTagProps: AutocompleteGetTagProps,
) =>
tagValue.map((option: string, index: number) => (
<Chip label={option} color="primary" {...getTagProps({ index })} />
));
return (
<Autocomplete
filterSelectedOptions={filterSelectedOptions}
limitTags={limitTags}
multiple={multiple}
className={className}
id={`${multiple ? 'multi-' : ''}select-filter-${name}--select`}
options={values || []}
loading={loading}
value={filterValue}
onChange={handleChange}
onInputChange={(_, newValue) => setInputValue(newValue)}
renderInput={renderInput}
renderTags={renderTags}
/>
);
}
Example #3
Source File: BasicInfo.tsx From abacus with GNU General Public License v2.0 | 4 votes |
BasicInfo = ({
completionBag: { userCompletionDataSource },
}: {
completionBag: ExperimentFormCompletionBag
}): JSX.Element => {
const classes = useStyles()
const [startDateField] = useField('experiment.startDatetime')
const minStartDate = new Date()
const maxStartDate = dateFns.addMonths(new Date(), MAX_DISTANCE_BETWEEN_NOW_AND_START_DATE_IN_MONTHS)
const minEndDate = startDateField.value && new Date(startDateField.value)
const maxEndDate =
startDateField.value &&
dateFns.addMonths(new Date(startDateField.value), MAX_DISTANCE_BETWEEN_START_AND_END_DATE_IN_MONTHS)
const formatDateForInput = (date: Date) => (date ? formatIsoDate(date) : undefined)
return (
<div className={classes.root}>
<Typography variant='h4' gutterBottom>
Basic Info
</Typography>
<div className={classes.row}>
<Field
component={TextField}
name='experiment.name'
id='experiment.name'
label='Experiment name'
placeholder='experiment_name'
helperText='Use snake_case.'
variant='outlined'
fullWidth
required
InputLabelProps={{
shrink: true,
}}
/>
</div>
<div className={classes.row}>
<Field
component={TextField}
name='experiment.description'
id='experiment.description'
label='Experiment description'
placeholder='Monthly vs. yearly pricing'
helperText='State your hypothesis.'
variant='outlined'
fullWidth
required
multiline
rows={4}
InputLabelProps={{
shrink: true,
}}
/>
</div>
<div className={classes.row}>
<Field
component={TextField}
className={classes.datePicker}
name='experiment.startDatetime'
id='experiment.startDatetime'
label='Start date (UTC)'
type='date'
variant='outlined'
required
InputLabelProps={{
shrink: true,
}}
inputProps={{
min: formatDateForInput(minStartDate),
max: formatDateForInput(maxStartDate),
}}
/>
<span className={classes.through}> through </span>
<Field
component={TextField}
className={classes.datePicker}
name='experiment.endDatetime'
id='experiment.endDatetime'
label='End date (UTC)'
type='date'
variant='outlined'
required
InputLabelProps={{
shrink: true,
}}
inputProps={{
min: formatDateForInput(minEndDate),
max: formatDateForInput(maxEndDate),
}}
/>
</div>
<Alert severity='info'>
The experiment will <strong>start and end automatically</strong> around 00:10 UTC on these dates.
</Alert>
<div className={classes.row}>
<Field
component={AbacusAutocomplete}
name='experiment.ownerLogin'
id='experiment.ownerLogin'
fullWidth
options={userCompletionDataSource.data ?? []}
loading={userCompletionDataSource.isLoading}
noOptionsText='No users found'
renderInput={(params: AutocompleteRenderInputParams) => (
<MuiTextField
{...params}
label='Owner'
placeholder='wp_username'
helperText='Use WordPress.com username.'
variant='outlined'
required
InputProps={{
...autocompleteInputProps(params, userCompletionDataSource.isLoading),
startAdornment: <InputAdornment position='start'>@</InputAdornment>,
}}
InputLabelProps={{
shrink: true,
}}
/>
)}
/>
</div>
</div>
)
}
Example #4
Source File: Metrics.tsx From abacus with GNU General Public License v2.0 | 4 votes |
EventEditor = ({
index,
completionBag: { eventCompletionDataSource },
exposureEvent: { event: name, props: propList },
onRemoveExposureEvent,
}: {
index: number
completionBag: ExperimentFormCompletionBag
exposureEvent: EventNew
onRemoveExposureEvent: () => void
}) => {
const classes = useEventEditorStyles()
const metricClasses = useMetricEditorStyles()
const { isLoading, data: propCompletions } = useDataSource(async () => name && getPropNameCompletions(name), [name])
return (
<TableRow>
<TableCell>
<div className={classes.exposureEventsEventNameCell}>
<Field
component={AbacusAutocomplete}
name={`experiment.exposureEvents[${index}].event`}
className={classes.exposureEventsEventName}
id={`experiment.exposureEvents[${index}].event`}
options={eventCompletionDataSource.data}
loading={eventCompletionDataSource.isLoading}
renderInput={(params: AutocompleteRenderInputParams) => (
<MuiTextField
{...params}
label='Event Name'
placeholder='event_name'
variant='outlined'
InputLabelProps={{
shrink: true,
}}
InputProps={{
...autocompleteInputProps(params, eventCompletionDataSource.isLoading),
'aria-label': 'Event Name',
}}
/>
)}
/>
<IconButton
className={classes.exposureEventsEventRemoveButton}
onClick={onRemoveExposureEvent}
aria-label='Remove exposure event'
>
<Clear />
</IconButton>
</div>
<FieldArray
name={`experiment.exposureEvents[${index}].props`}
render={(arrayHelpers) => {
const onAddExposureEventProperty = () => {
arrayHelpers.push({
key: '',
value: '',
})
}
return (
<div>
<div>
{propList &&
propList.map((_prop: unknown, propIndex: number) => {
const onRemoveExposureEventProperty = () => {
arrayHelpers.remove(propIndex)
}
return (
<div className={classes.exposureEventsEventPropertiesRow} key={propIndex}>
<Field
component={AbacusAutocomplete}
name={`experiment.exposureEvents[${index}].props[${propIndex}].key`}
id={`experiment.exposureEvents[${index}].props[${propIndex}].key`}
options={propCompletions || []}
loading={isLoading}
freeSolo={true}
className={classes.exposureEventsEventPropertiesKeyAutoComplete}
renderInput={(params: AutocompleteRenderInputParams) => (
<MuiTextField
{...params}
className={classes.exposureEventsEventPropertiesKey}
label='Key'
placeholder='key'
variant='outlined'
size='small'
InputProps={{
...autocompleteInputProps(params, isLoading),
'aria-label': 'Property Key',
}}
InputLabelProps={{
shrink: true,
}}
/>
)}
/>
<Field
component={TextField}
name={`experiment.exposureEvents[${index}].props[${propIndex}].value`}
id={`experiment.exposureEvents[${index}].props[${propIndex}].value`}
type='text'
variant='outlined'
placeholder='value'
label='Value'
size='small'
inputProps={{
'aria-label': 'Property Value',
}}
InputLabelProps={{
shrink: true,
}}
/>
<IconButton
className={classes.exposureEventsEventRemoveButton}
onClick={onRemoveExposureEventProperty}
aria-label='Remove exposure event property'
>
<Clear />
</IconButton>
</div>
)
})}
</div>
<div className={metricClasses.addMetric}>
<Add className={metricClasses.addMetricAddSymbol} />
<Button
variant='contained'
onClick={onAddExposureEventProperty}
disableElevation
size='small'
aria-label='Add Property'
>
Add Property
</Button>
</div>
</div>
)
}}
/>
</TableCell>
</TableRow>
)
}