UNPKG

mui-spfx-controls

Version:
167 lines 11.6 kB
import { __assign, __awaiter, __generator } from "tslib"; import { Close, Save } from '@mui/icons-material'; import { Button, ButtonGroup, Card, CardActions, CardContent, CardHeader, Checkbox, CircularProgress, FormControlLabel, Grid, MenuItem, TextField, Typography, } from '@mui/material'; import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { Logger } from '@pnp/logging'; import * as React from 'react'; import { forwardRef, useEffect, useState } from 'react'; import { ListService } from '../../services/ListService'; import { PeoplePicker } from '../PeoplePicker/PeoplePicker'; export var ListForm = forwardRef(function (_a, ref) { var context = _a.context, list = _a.list, fields = _a.fields, label = _a.label, paperVariant = _a.paperVariant, paperElevation = _a.paperElevation, inputVariant = _a.inputVariant, inputSize = _a.inputSize, fieldSpacing = _a.fieldSpacing, responsive = _a.responsive, onSave = _a.onSave, onCancel = _a.onCancel; var listService = new ListService(context, list); var _b = useState([]), filteredFields = _b[0], setFilteredFields = _b[1]; var _c = useState({}), formData = _c[0], setFormData = _c[1]; var _d = useState(false), loading = _d[0], setLoading = _d[1]; useEffect(function () { if (list) { var fetchFields = function () { return __awaiter(void 0, void 0, void 0, function () { var response, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, 3, 4]); setLoading(true); return [4 /*yield*/, listService.getListFields(fields)]; case 1: response = _a.sent(); setFilteredFields(response); return [3 /*break*/, 4]; case 2: error_1 = _a.sent(); Logger.error(error_1); return [3 /*break*/, 4]; case 3: setLoading(false); return [7 /*endfinally*/]; case 4: return [2 /*return*/]; } }); }); }; fetchFields(); } }, [list, fields]); var handleFieldTypes = function () { if (loading) { if (list === '' || list === undefined || list === null) { return (React.createElement(Grid, { display: "flex", width: "100%", justifyContent: "center", p: 1 }, React.createElement(Typography, { color: "primary", variant: "h5", fontWeight: "bold", component: "span" }, "Select a list to continue"))); } else { return (React.createElement(Grid, { display: "flex", width: "100%", justifyContent: "center" }, React.createElement(CircularProgress, null))); } } else { return filteredFields.map(function (field, index) { var _a, _b; var commonProps = { key: "grid-".concat(field.Id, "-").concat(index), size: responsive ? responsive[field.TypeAsString].size : { xs: 12 }, }; switch (field.TypeAsString) { case 'Text': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(TextField, { label: field.Title, name: field.InternalName, required: field.Required, variant: inputVariant, size: inputSize, fullWidth: true, disabled: field.ReadOnlyField, onChange: function (event) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = event.target.value, _a))); } }))); case 'User': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(PeoplePicker, { context: context, label: field.Title, name: field.InternalName, required: field.Required, multiple: false, variant: inputVariant, size: inputSize, fullWidth: true, disabled: field.ReadOnlyField, onChange: function (value) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = value, _a))); } }))); case 'UserMulti': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(PeoplePicker, { context: context, label: field.Title, name: field.InternalName, required: field.Required, multiple: true, variant: inputVariant, size: inputSize, fullWidth: true, disabled: field.ReadOnlyField, onChange: function (value) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = value, _a))); } }))); case 'Choice': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(TextField, { label: field.Title, name: field.InternalName, required: field.Required, variant: inputVariant, size: inputSize, disabled: field.ReadOnlyField, select: true, fullWidth: true, onChange: function (event) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = event.target.value, _a))); } }, (_a = field.Choices) === null || _a === void 0 ? void 0 : _a.map(function (choice, index) { return (React.createElement(MenuItem, { key: "".concat(choice, "-").concat(index), value: choice }, choice)); })))); case 'MultiChoice': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(TextField, { label: field.Title, name: field.InternalName, required: field.Required, variant: inputVariant, size: inputSize, defaultValue: [], select: true, fullWidth: true, disabled: field.ReadOnlyField, onChange: function (event) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = event.target.value, _a))); }, slotProps: { select: { multiple: true, }, input: { readOnly: field.ReadOnlyField, }, } }, (_b = field.Choices) === null || _b === void 0 ? void 0 : _b.map(function (choice, index) { return (React.createElement(MenuItem, { key: "".concat(choice, "-").concat(index), value: choice }, choice)); })))); case 'DateTime': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(DateTimePicker, { label: field.Title, name: field.InternalName, disabled: field.ReadOnlyField, onChange: function (value) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = value ? value.toISOString() : "", _a))); }, slotProps: { textField: { fullWidth: true, variant: inputVariant, required: field.Required, size: inputSize, }, } }))); case 'Boolean': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(FormControlLabel, { required: field.Required, name: field.InternalName, disabled: field.ReadOnlyField, onChange: function (event, checked) { var _a; return setFormData(__assign(__assign({}, formData), (_a = {}, _a[field.InternalName] = checked, _a))); }, control: React.createElement(Checkbox, { size: inputSize }), label: field.Title }))); case 'Lookup': return (React.createElement(Grid, __assign({}, commonProps), React.createElement("p", null, field.LookupList))); case 'Counter': return (React.createElement(Grid, __assign({}, commonProps), React.createElement(Card, { sx: { backgroundColor: 'primary.main', color: 'common.white', } }, React.createElement(CardHeader, { title: "Counter Type, Title - ".concat(field.Title), slotProps: { typography: { variant: 'h6' } } })))); default: return (React.createElement(Grid, __assign({}, commonProps), React.createElement(Card, { sx: { backgroundColor: 'error.main', color: 'common.white', } }, React.createElement(CardHeader, { title: "Yet to be implemented!" })))); } }); } }; var handleSave = function () { if (onSave) { onSave(formData); } }; var handleClose = function () { if (onCancel) { onCancel(); } }; var calculatedPaperElevation = isNaN(Number(paperElevation)) ? 2 : paperElevation; return (React.createElement(LocalizationProvider, { dateAdapter: AdapterDayjs }, React.createElement(Card, { ref: ref, "data-testid": "mui-spfx-listform", variant: paperVariant !== null && paperVariant !== void 0 ? paperVariant : 'outlined', elevation: paperVariant === 'elevation' ? calculatedPaperElevation : 0, sx: { p: 2 } }, label ? React.createElement(CardHeader, { title: label }) : null, React.createElement(CardContent, null, React.createElement(Grid, { container: true, spacing: isNaN(Number(fieldSpacing)) ? 2 : Number(fieldSpacing) }, handleFieldTypes())), React.createElement(CardActions, null, React.createElement(ButtonGroup, null, React.createElement(Button, { startIcon: React.createElement(Save, null), color: "success", onClick: handleSave }, "Save"), React.createElement(Button, { startIcon: React.createElement(Close, null), type: "reset", color: "error", onClick: handleClose }, "Cancel")))))); }); export default ListForm; //# sourceMappingURL=ListForm.js.map