filter-material-ui
Version:
A material-ui component which allows to edit a user defined set of fields representing a filter and display it as a text or a form
134 lines (133 loc) • 6.14 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var material_1 = require("@mui/material");
var lodash_1 = require("lodash");
var react_1 = __importStar(require("react"));
var ApplyButton_1 = __importDefault(require("./ApplyButton"));
var CancelButton_1 = __importDefault(require("./CancelButton"));
var ColorsSelect_1 = __importDefault(require("./ColorsSelect"));
var FilterMaterialUi_1 = require("./FilterMaterialUi");
var InputField_1 = __importDefault(require("./InputField"));
var MultipleSelect_1 = __importDefault(require("./MultipleSelect"));
var SingleSelect_1 = __importDefault(require("./SingleSelect"));
var styles = {
button: {
margin: 10,
},
buttons: {
textAlign: 'center',
},
container: {
width: '100%',
},
grid: {
alignItems: 'flex-end',
},
item: {
padding: 10,
},
};
function FormFilter(props) {
var fields = props.fields, id = props.id, onCancel = props.onCancel, onChange = props.onChange;
var _a = (0, react_1.useState)(props.data || {}), data = _a[0], setData = _a[1];
var handleChange = (0, react_1.useCallback)(function (field, value) {
return setData(function (prevData) {
var _a;
return (__assign(__assign({}, prevData), (_a = {}, _a[field] = value, _a)));
});
}, []);
var renderFieldByType = (0, react_1.useCallback)(function (field) {
var label = field.label, name = field.name, options = field.options, text = field.text;
var noOptionsAvailable = text.noOptionsAvailable, noOptionsMatchFilter = text.noOptionsMatchFilter;
var value = data[name];
switch (field.type) {
case FilterMaterialUi_1.TYPE.INPUT:
return react_1.default.createElement(InputField_1.default, { label: label, name: name, onChange: handleChange, value: value });
case FilterMaterialUi_1.TYPE.COLORS_SELECT:
return (react_1.default.createElement(ColorsSelect_1.default, { label: label, name: name, noOptionsAvailable: noOptionsAvailable, noOptionsMatchFilter: noOptionsMatchFilter, onChange: handleChange, options: options || [], values: value }));
case FilterMaterialUi_1.TYPE.MULTIPLE_SELECT:
return (react_1.default.createElement(MultipleSelect_1.default, { label: label, name: name, noOptionsAvailable: noOptionsAvailable, noOptionsMatchFilter: noOptionsMatchFilter, onChange: handleChange, options: options || [], values: value }));
case FilterMaterialUi_1.TYPE.SINGLE_SELECT:
return (react_1.default.createElement(SingleSelect_1.default, { label: label, name: name, noOptionsAvailable: noOptionsAvailable, noOptionsMatchFilter: noOptionsMatchFilter, onChange: handleChange, options: options || [], value: value }));
default:
return react_1.default.createElement("div", null, field.type);
}
}, [data]);
var renderField = (0, react_1.useCallback)(function (field) {
var _a = getColWidth((0, lodash_1.size)(fields)), md = _a.md, sm = _a.sm, xs = _a.xs;
return (react_1.default.createElement(material_1.Grid, { item: true, key: field.name, md: md, sm: sm, style: styles.item, xs: xs }, renderFieldByType(field)));
}, [fields]);
var renderedFields = (0, react_1.useMemo)(function () { return fields.map(renderField); }, [fields]);
var handleApply = (0, react_1.useCallback)(function () { return onChange(data); }, [data]);
return (react_1.default.createElement("div", { id: id, style: styles.container },
react_1.default.createElement(material_1.Grid, { container: true, style: styles.grid }, renderedFields),
react_1.default.createElement("div", { style: styles.buttons },
react_1.default.createElement(CancelButton_1.default, { onCancel: onCancel, style: styles.button }),
react_1.default.createElement(ApplyButton_1.default, { onApply: handleApply, style: styles.button }))));
}
function getColWidth(numFields) {
switch (numFields) {
case 1:
return {
md: 12,
sm: 12,
xs: 12,
};
case 2:
return {
md: 6,
sm: 6,
xs: 12,
};
case 3:
return {
md: 4,
sm: 6,
xs: 12,
};
default:
return {
md: 3,
sm: 6,
xs: 12,
};
}
}
exports.default = FormFilter;