react-antd-admin-panel
Version:
Easy prototyping admin panel using React and Antd
99 lines • 4.74 kB
JavaScript
import React, { useEffect, useState } from "react";
import { AutoComplete as AutocompleteAnt, List, Typography } from "antd";
import { Form } from 'antd';
const Autocomplete = (props) => {
var _a;
let model = props.model;
let access = props.main.$access(model._access);
const [state, setState] = useState({ value: undefined, dataSource: [] });
const [loading, setLoading] = useState(false);
const [disabled, setDisabled] = useState(false);
model._onError = () => { };
model._onComplete = () => onChange({});
model.onHandleClear = () => { };
model.onHandleLoading = (value) => setLoading(value);
model.tsxSetDisabled = (value) => setDisabled(value);
model.tsxClear = () => onClear();
const render = (item) => {
if (!item)
return ({
id: undefined, key: undefined, value: undefined, title: undefined, object: undefined, label: (React.createElement("span", null)),
});
let obj = item.getObject();
return {
id: obj.id,
key: obj.key,
value: obj.title,
title: obj.title,
object: item._object,
label: (React.createElement(List.Item, { style: { paddingLeft: 8, paddingTop: 4, paddingBottom: 0 } },
React.createElement(List.Item.Meta, { title: React.createElement(Typography, null, obj._render ? obj._render(model) : obj.title), description: React.createElement(Typography.Paragraph, { style: { marginBottom: 4 } }, obj.text) }))),
};
};
const onChange = ({ value, object, dataSource }, settings) => {
var _a, _b, _c;
model._defaultObject = { value: value, object: object, dataSource: dataSource !== null && dataSource !== void 0 ? dataSource : model._get._data };
if (model._formula)
model._formula.value(model, model._defaultObject);
if (!(settings === null || settings === void 0 ? void 0 : settings.ignoreOnChange)) {
(_a = model._onChange) === null || _a === void 0 ? void 0 : _a.call(model, model._defaultObject);
}
if (!(settings === null || settings === void 0 ? void 0 : settings.ignoreSetState)) {
setState({
value: value,
dataSource: (_c = (_b = model._defaultObject.dataSource) === null || _b === void 0 ? void 0 : _b.map((r) => render(r))) !== null && _c !== void 0 ? _c : []
});
}
/** Debug purposes */
if (model._useCache && model._key) {
window.localStorage.setItem(`autocomplete:${model._key}`, JSON.stringify(model._defaultObject));
}
};
const onSearch = (value) => {
if (value.length > 2) {
model.refresh(value);
}
};
const onUpdate = () => {
var _a, _b;
setState({
value: state.value,
dataSource: (_b = (_a = model._get._data) === null || _a === void 0 ? void 0 : _a.map((r) => render(r))) !== null && _b !== void 0 ? _b : []
});
};
const onClear = () => {
setState({
value: undefined,
dataSource: []
});
};
const onStart = () => {
if (model._defaultObject) {
let data = model._defaultObject;
if (model._formula)
model._formula.value(model, model._defaultObject);
if (data.dataSource)
data.dataSource = dataSourceAlter(data.dataSource);
setTimeout(() => onChange(data, {
ignoreOnChange: model._ignoreOnChange,
ignoreSetState: model._ignoreSetState,
}), 0);
}
else {
onClear();
}
};
const dataSourceAlter = (data) => {
// TODO: If condition try to remove this, this is called with data as undefined
return model._get._alter(data === null || data === void 0 ? void 0 : data.map((t) => t === null || t === void 0 ? void 0 : t._object));
};
useEffect(() => {
if (model._useCache && model._key)
model.defaultFromCache();
onStart();
}, []);
return (React.createElement(Form.Item, { name: props.model._key, style: (_a = model._styleForm) !== null && _a !== void 0 ? _a : {} },
React.createElement(AutocompleteAnt, { style: { width: '100%' }, searchValue: state.value, options: state.dataSource, disabled: loading || disabled || !access.access, allowClear: true, onSearch: onSearch, onSelect: (value, object) => onChange({ value: value, object: object }), onClear: onClear })));
};
export default Autocomplete;
//# sourceMappingURL=Autocomplete.js.map