админ в состоянии покоя: ввести изменение формата для ввода фильтра

У меня проблема, над которой я работал несколько дней, с моим администратором на реализации отдыха. У нас есть запрос, чтобы входные данные фильтра вели себя скорее как «содержит», чем «равно».

Мой API поддерживает подобный поиск при GET, передавая символы% с вашим вводом (например, / app? Foo =% 25bar% ​​25 возвращает приложения, где foo похоже на% bar%)

Находясь в идеальном мире, я мог бы посоветовать своим пользователям указать% s в полях TextInput фильтра, но огромные массы не могут быть обеспокоены вставкой специальных символов.

Итак, мой вопрос: где я могу ввести что-то, чтобы обернуть символы подстановки вокруг ввода, вводимого в объекты в моем объекте?

Я попытался повторно реализовать TextInput и обновить input.value в OnChange, render и т.д., но restClient все еще использует предварительно измененное входное значение.

Heres my crack at a custom inputComponent

class ContainsTextProps {
    public addField?: PropTypes.bool.isRequired = true;
    public elStyle?: PropTypes.object;
    public input?: PropTypes.object;
    public isRequired?: PropTypes.bool;
    public label?: PropTypes.string;
    public meta?: PropTypes.object;
    public name?: PropTypes.string;
    public options?: PropTypes.object = {};
    public resource?: PropTypes.string;
    public source?: PropTypes.string;
    public type?: PropTypes.string = 'text';
    public onBlur?: PropTypes.func = () => {};
    public onChange?: PropTypes.func = () => {};
    public onFocus?: PropTypes.func = () => {};
}
class ContainsTextInputInternal extends React.Component<ContainsTextProps, {}> {
    constructor(props) {
        super(props);
        this.handleBlur = this.handleBlur.bind(this);
        this.handleFocus = this.handleFocus.bind(this);
        this.handleChange = this.handleChange.bind(this);
    }

    public handleBlur = (eventOrValue) => {
        // this.props.onBlur(eventOrValue);
        this.props.input.onBlur(eventOrValue);
    }

    public handleFocus = (event) => {
        // this.props.onFocus(event);
        this.props.input.onFocus(event);
    }

    public handleChange = (eventOrValue, newvalue) => {
        // this.props.onChange(eventOrValue);
        this.props.input.onChange(eventOrValue, newvalue);
    }


    public render() {
        const {
            elStyle,
            input,
            label,
            meta: { touched, error },
            options,
            type,
        } = this.props;

        if (input && input.value && input.value.length > 0 && input.value.indexOf('%') < 0) {
            input.value = `%${input.value}%`;
        }

        return (
            <TextField
                {...input}
                onBlur={this.handleBlur}
                onFocus={this.handleFocus}
                onChange={this.handleChange}
                type={type}
                // floatingLabelText={<FieldTitle label={label} source={source} resource={resource} isRequired={isRequired} />}
                floatingLabelText={label}
                errorText={touched && error}
                style={elStyle}
                value={input.value}
                {...options}
            />
        );
    }
}

export const ContainsTextInput = pure(ContainsTextInputInternal);


person Tyler S.    schedule 29.09.2017    source источник
comment
вы можете опубликовать свой собственный TextInput?   -  person Gildas Garcia    schedule 29.09.2017
comment
Добро пожаловать в Stack Overflow! Найдите время, чтобы прочитать страницу справки, особенно разделы Контрольный список вопросов о переполнении стека. Вы также можете узнать о минимальных, полных и проверяемых примерах.   -  person Guenther    schedule 29.09.2017
comment
Обновил вопрос примером   -  person Tyler S.    schedule 29.09.2017
comment
и, чтобы действительно избавиться от моего вопроса, мне не нужна была помощь в том, чтобы мой пользовательский компонент делал то, что мне нужно, мне нужно было какое-то направление в том, как я должен пытаться выполнить то, что я пытаюсь сделать.   -  person Tyler S.    schedule 29.09.2017


Ответы (1)


Что вам нужно, так это настраиваемый клиент REST, который обнаруживает запрос и вводит специальные символы во входные данные.

https://marmelab.com/admin-on-rest/RestClients.html#writing-your-own-rest-client.

Это должно вас начать. Если у вас есть только 1 особый случай, когда вам нужно только ввести специальные символы, вы также можете использовать оболочку REST.

https://marmelab.com/admin-on-rest/RestClients.html#decorating-your-rest-client-example-of-file-upload

person kunal pareek    schedule 02.10.2017
comment
Спасибо, я пытался избежать изменения моего запроса REST, но думаю, что остановился на этом подходе. Я собираюсь добавить опору filter = {defaultToContains = true} ко всем моим объектам List, которые должны вести себя таким образом, чтобы, по крайней мере, я мог сохранить свое текущее базовое поведение. Спасибо всем за помощь! - person Tyler S.; 02.10.2017
comment
Ваш ответ привел меня в правильное русло. Я только что добавил постоянный фильтр filter={{ __contains: true }} в свой компонент List. В моем клиенте REST я обнаруживаю __contains, а также префикс и суффикс каждого значения со звездочкой * (если их еще не было). Вы можете развить это решение, передав массив имен полей вместо true в __contains и разрешив клиенту REST применять только звездочки к этим полям. - person Christiaan Westerbeek; 04.07.2018