Files
web2.0-frontend/src/views/admin/AdminCreateCommon.tsx
T
2020-11-25 00:01:07 +02:00

165 lines
2.9 KiB
TypeScript

import React from "react";
import styled from "styled-components";
import Form, { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form";
import { colors }from "@theme/colors";
import { Event } from "@models/Event";
import { Post } from "@models/Feed";
import { SignupForm } from "@models/SignupForm";
import { JobAd } from "@models/JobAd";
const Common = styled.div`
width: 100%;
.rjsf {
max-width: 600px;
}
fieldset {
border: none;
padding: 0;
margin: 1rem 0;
}
option {
padding: 4px 8px;
cursor: pointer;
}
label {
margin-bottom: 0.5rem;
}
input,
select {
padding: 0.3rem 0.5rem;
margin-bottom: 0.5rem;
}
input[type="text"],
textarea {
padding: 0.5rem 0.5rem;
border: none;
overflow: visible;
box-sizing: border-box;
}
input[type="text"],
textarea,
select {
width: 100%;
}
input[type="submit"] {
border: none;
outline: none;
background-color: ${colors.orange2};
padding: 0.5rem 1rem;
color: ${colors.white};
}
legend {
font-weight: bold;
margin: 0.5rem 0;
}
button {
background-color: ${colors.blue1};
color: ${colors.white};
padding: 0.5rem 1rem;
border: none;
outline: none;
cursor: pointer;
}
.checkbox {
label {
display: flex;
input {
margin-right: 0.5rem;
}
}
}
`;
const SuccessMsg = styled.p`
margin-bottom: 0.5rem;
border: 1px solid ${colors.green1};
padding: 8px 16px;
color: ${colors.green1};
display: inline-block;
`;
const ErrorMsg = styled.p`
margin-bottom: 0.5rem;
border: 1px solid ${colors.orange2};
padding: 8px 16px;
color: ${colors.orange2};
display: inline-block;
`;
type FormTypes = Event | SignupForm | Post | JobAd;
type AdminCreateCommonProps = {
title: string;
formData?: FormTypes;
schema: {
[name: string]: any;
};
UISchema: {
[name: string]: any;
};
onChange?: (e: IChangeEvent<FormTypes>, es?: ErrorSchema) => any;
onFocus: (id: string, value: string | number | boolean) => void;
onSubmit: (e: ISubmitEvent<FormTypes>) => any;
statusMessage: string;
error: string;
widgets: {
[name: string]: any;
};
}
const AdminCreateCommon: React.FC<AdminCreateCommonProps> = ({
title,
formData,
schema,
UISchema,
onChange,
onFocus,
onSubmit,
statusMessage,
error,
widgets
}) => {
const onError = (data: any) => {
console.error("error, data:");
console.log(data);
}
return (
<Common>
<h1>{title}</h1>
{statusMessage && (
<SuccessMsg>{statusMessage}</SuccessMsg>
)}
<Form
schema={schema}
uiSchema={UISchema}
formData={formData}
idPrefix="rjsf"
widgets={widgets}
onChange={onChange}
onSubmit={onSubmit}
onError={onError}
onFocus={onFocus} />
{error && (
<ErrorMsg>{error}</ErrorMsg>
)}
</Common>
)
}
export default AdminCreateCommon;