mui-spfx-controls
Version:
SPFx component library built with MUI
167 lines • 11.6 kB
JavaScript
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