parent
9d3223090f
commit
924177ecc2
23 changed files with 923 additions and 69 deletions
@ -0,0 +1,51 @@ |
||||
import React from "react"; |
||||
import TextField from "@material-ui/core/TextField"; |
||||
import { makeStyles } from "@material-ui/core/styles"; |
||||
|
||||
export default function FormPropsTextFields(props) { |
||||
const useStyles = makeStyles((theme) => ({ |
||||
root: { |
||||
"& .MuiTextField-root": { |
||||
width: "100%", |
||||
position: "relative", |
||||
marginRight: 10, |
||||
"& input": { |
||||
textAlign: props.align, |
||||
direction: props.align === "right" ? "rtl" : "ltr", |
||||
}, |
||||
fontFamily: "numeralLight", |
||||
}, |
||||
}, |
||||
})); |
||||
|
||||
const classes = useStyles(); |
||||
const { defaultValue, maxLength, inputMode, onInput, variant, onChange } = |
||||
props; |
||||
return ( |
||||
<form className={classes.root} noValidate autoComplete="off"> |
||||
<div> |
||||
<TextField |
||||
id="outlined-basic" |
||||
name={props.name} |
||||
label={props.label} |
||||
variant={variant || "outlined"} |
||||
onChange={(e) => onChange(e.target.name, e.target.value)} |
||||
defaultValue={defaultValue[props.name] || ""} |
||||
inputProps={{ maxLength }} |
||||
onInput={ |
||||
onInput |
||||
? (e) => (e.target.value = onInput(e.target.value)) |
||||
: () => {} |
||||
} |
||||
/> |
||||
</div> |
||||
</form> |
||||
); |
||||
} |
||||
|
||||
FormPropsTextFields.defaultProps = { |
||||
align: "right", |
||||
maxLength: "", |
||||
inputMode: "numeric", |
||||
defaultValue: "", |
||||
}; |
@ -0,0 +1,18 @@ |
||||
interface list { |
||||
type : "public/blogList" |
||||
data : any |
||||
} |
||||
|
||||
interface error{ |
||||
type : "blog/error" |
||||
data : undefined |
||||
} |
||||
|
||||
interface loading{ |
||||
type : "blog/loading" |
||||
data : undefined |
||||
} |
||||
|
||||
type BlogAction = list | loading | error; |
||||
|
||||
export default BlogAction; |
@ -0,0 +1,24 @@ |
||||
interface list { |
||||
type : "book/list" |
||||
data : any |
||||
} |
||||
|
||||
interface info{ |
||||
type : "book/info" |
||||
data : any |
||||
} |
||||
|
||||
interface error{ |
||||
type : "book/error" |
||||
data : undefined |
||||
} |
||||
|
||||
interface loading{ |
||||
type : "book/loading" |
||||
data : undefined |
||||
} |
||||
|
||||
|
||||
type BookAction = list | info | loading | error; |
||||
|
||||
export default BookAction; |
@ -1,3 +1,7 @@ |
||||
// @create-index
|
||||
export type { default as PublicAction } from "./public"; |
||||
export type { default as UserAction } from "./user"; |
||||
export type { default as BookAction } from "./book"; |
||||
export type { default as BlogAction } from "./blog"; |
||||
|
||||
|
||||
|
@ -0,0 +1,28 @@ |
||||
import proxy from "../proxy"; |
||||
import { Dispatch } from "redux"; |
||||
const blog = { |
||||
list: |
||||
(data = {}) => |
||||
async (dispatch : Dispatch) => |
||||
await proxy.get("public/blogList", data, { dispatch }), |
||||
// update:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch : Dispatch) => {
|
||||
// await proxy.put("blog/update", data);
|
||||
// await proxy.get("blog/list", data2, { dispatch });
|
||||
// },
|
||||
// add:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch : Dispatch) => {
|
||||
// await proxy.post("blog/add", data);
|
||||
// await proxy.get("blog/list", data2, { dispatch });
|
||||
// },
|
||||
// del:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch : Dispatch) => {
|
||||
// await proxy.delete("blog/delete", data);
|
||||
// await proxy.get("blog/list", data2, { dispatch });
|
||||
// },
|
||||
}; |
||||
|
||||
export default blog; |
@ -0,0 +1,38 @@ |
||||
import proxy from "../proxy"; |
||||
import { Dispatch } from "redux"; |
||||
const book = { |
||||
list: |
||||
(data = {}) => |
||||
async (dispatch : Dispatch) => |
||||
await proxy.get("book/list", data, { dispatch }), |
||||
info: |
||||
(data = {}) => |
||||
async (dispatch : Dispatch) => |
||||
await proxy.get("book/info", data, { dispatch }), |
||||
// update:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch : Dispatch) => {
|
||||
// await proxy.put("book/update", data);
|
||||
// await proxy.get("book/list", data2, { dispatch });
|
||||
// },
|
||||
// add:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch) => {
|
||||
// await proxy.post("book/add", data);
|
||||
// await proxy.get("book/list", data2, { dispatch });
|
||||
// },
|
||||
// del:
|
||||
// (data = {}, data2 = {}) =>
|
||||
// async (dispatch) => {
|
||||
// await proxy.delete("book/delete", data);
|
||||
// await proxy.get("book/list", data2, { dispatch });
|
||||
// },
|
||||
// searchBook: (data) => async (dispatch) => {
|
||||
// dispatch({ type: "book/search", data: data });
|
||||
// },
|
||||
// filterBook: (data) => async (dispatch) => {
|
||||
// dispatch({ type: "book/filter", data: data });
|
||||
// },
|
||||
}; |
||||
|
||||
export default book; |
@ -1,4 +1,8 @@ |
||||
// @create-index
|
||||
export { default as publicApi } from "./public"; |
||||
export { default as user } from "./user"; |
||||
export { default as book } from "./book"; |
||||
export { default as blog } from "./blog"; |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,29 @@ |
||||
import { toast } from "react-toastify"; |
||||
import {BlogAction} from '../actions-type'; |
||||
|
||||
const initialState = { |
||||
loading: false, |
||||
error: null, |
||||
list: [], |
||||
}; |
||||
export default function blog(state = initialState, action : BlogAction) { |
||||
let { type, data } = action; |
||||
switch (type) { |
||||
case "public/blogList": |
||||
return { ...state, loading: false, list: data, error: null }; |
||||
// case "blog/update":
|
||||
// return { ...state, loading: false, error: null };
|
||||
// case "blog/add":
|
||||
// return { ...state, loading: false, error: null };
|
||||
// case "blog/delete":
|
||||
// return { ...state, loading: false, error: null };
|
||||
/////////////
|
||||
case "blog/loading": |
||||
return { ...state, loading: true }; |
||||
case "blog/error": |
||||
toast.error(data.message); |
||||
return { ...state, loading: false, error: data.message }; |
||||
default: |
||||
return state; |
||||
} |
||||
} |
@ -0,0 +1,129 @@ |
||||
import { toast } from "react-toastify"; |
||||
import { BookAction } from "../actions-type"; |
||||
|
||||
const initialState = { |
||||
loading: false, |
||||
error: null, |
||||
list: [], |
||||
info: null, |
||||
searchResult: [], |
||||
filterResult: [], |
||||
subjects: [], |
||||
levels: [], |
||||
sortFilters: ["مرتب سازی", "محبوب ترین", "جدیدترین"], |
||||
}; |
||||
|
||||
const grades = [ |
||||
"پیش دبستان", |
||||
"اول", |
||||
"دوم", |
||||
"سوم", |
||||
"چهارم", |
||||
"پنجم", |
||||
"ششم", |
||||
"هفتم", |
||||
"هشتم", |
||||
"نهم", |
||||
"دهم", |
||||
"یازدهم", |
||||
"دوازدهم", |
||||
]; |
||||
|
||||
export default function book(state = initialState, action : BookAction) { |
||||
let { type, data } = action; |
||||
switch (type) { |
||||
case "book/list": |
||||
let itemsSubject = (Array.isArray(data) ? data : []).map( |
||||
(item, index) => item.name |
||||
); |
||||
if (window.innerWidth < 1000) { |
||||
itemsSubject.unshift("نام کتاب"); |
||||
} |
||||
let itemsLevel = (Array.isArray(data) ? data : []) |
||||
.map((item) => item.gradeId * 1) |
||||
.sort((a, b) => a - b) |
||||
.map((e) => grades[e]); |
||||
if (window.innerWidth < 1000) { |
||||
itemsLevel.unshift("پایه تحصیلی"); |
||||
} |
||||
return { |
||||
...state, |
||||
loading: false, |
||||
list: data, |
||||
subjects: Array.from(new Set(itemsSubject)), |
||||
levels: Array.from(new Set(itemsLevel)), |
||||
filterResult: data, |
||||
error: null, |
||||
}; |
||||
case "book/info": |
||||
return { ...state, loading: false, info: data, error: null }; |
||||
// case "book/update":
|
||||
// return { ...state, loading: false, error: null };
|
||||
// case "book/add":
|
||||
// return { ...state, loading: false, error: null };
|
||||
// case "book/delete":
|
||||
// return { ...state, loading: false, error: null };
|
||||
// case "book/search":
|
||||
// return { ...state };
|
||||
// case "book/filter":
|
||||
// const realList = state.list;
|
||||
// const level = data.level;
|
||||
// const subject = data.subject;
|
||||
// const sort = data.sort;
|
||||
// const search = data.search;
|
||||
// if (level.length > 0 || subject.length > 0 || sort || search) {
|
||||
// localStorage.setItem("filter", "ON");
|
||||
// }
|
||||
// let finalSort;
|
||||
// let byLevelFilter = [];
|
||||
// if (level.length > 0) {
|
||||
// level.map((item1) => {
|
||||
// for (let i = 0; i < realList.length; i++) {
|
||||
// if (grades[realList[i].gradeId] === item1) {
|
||||
// byLevelFilter.push(realList[i]);
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// byLevelFilter = realList;
|
||||
// }
|
||||
|
||||
// let bySubjectFilter = [];
|
||||
// if (subject.length > 0) {
|
||||
// subject.map((item1) => {
|
||||
// for (let i = 0; i < byLevelFilter.length; i++) {
|
||||
// if (byLevelFilter[i].name === item1) {
|
||||
// bySubjectFilter.push(byLevelFilter[i]);
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// bySubjectFilter = byLevelFilter;
|
||||
// }
|
||||
|
||||
// const bySearchFilter = search
|
||||
// ? bySubjectFilter.filter((item1) => item1.name.indexOf(search) !== -1)
|
||||
// : bySubjectFilter;
|
||||
|
||||
// if (sort === "گران ترین") {
|
||||
// finalSort = bySearchFilter.sort((item1, item2) => {
|
||||
// return item1.product[0].price - item2.product[0].price;
|
||||
// });
|
||||
// } else {
|
||||
// finalSort = bySearchFilter;
|
||||
// }
|
||||
// return {
|
||||
// ...state,
|
||||
// loading: false,
|
||||
// error: null,
|
||||
// filterResult: finalSort,
|
||||
// };
|
||||
case "book/loading": |
||||
return { ...state, loading: true }; |
||||
case "book/error": |
||||
toast.error(data.message); |
||||
return { ...state, loading: false, error: data.message }; |
||||
default: |
||||
return state; |
||||
} |
||||
} |
@ -1,3 +1,7 @@ |
||||
// @create-index
|
||||
export { default as publicApi } from "./public"; |
||||
export { default as user } from "./user"; |
||||
export { default as book } from "./book"; |
||||
export { default as blog } from "./blog"; |
||||
|
||||
|
||||
|
@ -0,0 +1,280 @@ |
||||
.login { |
||||
width: 100%; |
||||
height: 100vh; |
||||
position: relative; |
||||
font-family: numeralLight; |
||||
&__options{ |
||||
color: #B5B5B5; |
||||
a { |
||||
color: #84de56; |
||||
} |
||||
} |
||||
img { |
||||
transform: rotate(-90deg); |
||||
} |
||||
.MuiButtonBase-root{ |
||||
padding: 0px !important; |
||||
} |
||||
background: linear-gradient( |
||||
135deg, |
||||
hsla(0, 0%, 31%, 1) 0%, |
||||
hsla(0, 0%, 0%, 1) 100% |
||||
); |
||||
background: -moz-linear-gradient( |
||||
135deg, |
||||
hsla(0, 0%, 31%, 1) 0%, |
||||
hsla(0, 0%, 0%, 1) 100% |
||||
); |
||||
background: -webkit-linear-gradient( |
||||
135deg, |
||||
hsla(0, 0%, 31%, 1) 0%, |
||||
hsla(0, 0%, 0%, 1) 100% |
||||
); |
||||
.footer { |
||||
position: fixed; |
||||
bottom: 0px; |
||||
left: 0px; |
||||
} |
||||
} |
||||
|
||||
@media screen and (min-width: 1441px) { |
||||
.login { |
||||
section { |
||||
width: 410px; |
||||
b { |
||||
color: white; |
||||
font-size: 20px; |
||||
margin-bottom: 30px; |
||||
font-weight: 500; |
||||
p { |
||||
font-size: 16px; |
||||
} |
||||
} |
||||
|
||||
button { |
||||
margin-top: 25px; |
||||
background-color: #84de56; |
||||
color: white; |
||||
font-size: 20px; |
||||
padding: 10px 0px; |
||||
border: 0px; |
||||
border-radius: 10px; |
||||
} |
||||
} |
||||
&__info { |
||||
width: 350px; |
||||
margin: 40px auto 0px; |
||||
text-align: center; |
||||
color: white; |
||||
font-size: 14px; |
||||
a { |
||||
color: #84de56; |
||||
} |
||||
} |
||||
&__back { |
||||
margin-bottom: 60px; |
||||
a { |
||||
color: white; |
||||
font-size: 13px; |
||||
} |
||||
} |
||||
&__options{ |
||||
div{ |
||||
font-size: 13px; |
||||
} |
||||
a{ |
||||
font-size: 15px; |
||||
} |
||||
} |
||||
.MuiFormControl-root { |
||||
width: 100%; |
||||
margin: 10px auto !important; |
||||
.MuiSelect-iconOutlined { |
||||
display: none; |
||||
} |
||||
.MuiSelect-outlined.MuiSelect-outlined { |
||||
padding-right: 15px; |
||||
} |
||||
color: #797979 !important; |
||||
} |
||||
.MuiOutlinedInput-notchedOutline { |
||||
top: 0px !important; |
||||
} |
||||
.MuiOutlinedInput-notchedOutline { |
||||
border-color: #666666 !important; |
||||
border-width: 1px !important; |
||||
color: green !important; |
||||
border-radius: 10px !important; |
||||
} |
||||
|
||||
.MuiOutlinedInput-input { |
||||
padding: 15px 14px !important; |
||||
font-family: numeralLight; |
||||
font-size: 20px; |
||||
&:focus{ |
||||
border: 0.2px solid #84de56 !important; |
||||
border-radius: 10px; |
||||
transform : translateY(0.5px); |
||||
} |
||||
} |
||||
.MuiInputLabel-outlined { |
||||
font-family: numeralLight !important; |
||||
display: inline !important; |
||||
position: absolute; |
||||
text-align: right !important; |
||||
right: 15px; |
||||
top: 22px; |
||||
padding: 0px !important; |
||||
transform: translate(0px, 0px) scale(1) !important; |
||||
} |
||||
.MuiInputLabel-shrink { |
||||
text-align: center !important; |
||||
display: inline; |
||||
position: absolute; |
||||
right: 0px; |
||||
top: -8px; |
||||
transform: translate(0px, 0px) scale(0.85) !important; |
||||
padding: 0px 10px !important; |
||||
} |
||||
|
||||
label { |
||||
background-color: #2F2F2F; |
||||
width: fit-content; |
||||
text-align: center; |
||||
color: #B5B5B5 !important; |
||||
letter-spacing: -1px; |
||||
font-size: 16px; |
||||
} |
||||
.Mui-focused { |
||||
color: rgba(0, 0, 0, 1) !important; |
||||
border-color: #84de56 !important; |
||||
// background-color: white; |
||||
color: #84de56 !important; |
||||
} |
||||
|
||||
.MuiInputBase-input { |
||||
height: auto !important; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@media screen and (min-width: 1008px) and (max-width: 1440px) { |
||||
.login { |
||||
section { |
||||
width: 350px; |
||||
transform: scale(0.9); |
||||
b { |
||||
color: white; |
||||
font-size: calc(100vw / 80); |
||||
margin-bottom: 30px; |
||||
font-weight: 500; |
||||
} |
||||
|
||||
button { |
||||
margin-top: 25px; |
||||
background-color: #84de56; |
||||
color: white; |
||||
font-size: calc(100vw / 80); |
||||
padding: 10px 0px; |
||||
border: 0px; |
||||
border-radius: 10px; |
||||
} |
||||
} |
||||
&__info { |
||||
width: 300px; |
||||
margin: 40px auto 0px; |
||||
text-align: center; |
||||
color: white; |
||||
font-size: calc(100vw / 110); |
||||
a { |
||||
color: #84de56; |
||||
} |
||||
} |
||||
&__back { |
||||
margin-bottom: 40px; |
||||
a { |
||||
color: white; |
||||
font-size: calc(100vw / 110); |
||||
} |
||||
} |
||||
&__options{ |
||||
div{ |
||||
font-size: calc(100vw / 110); |
||||
} |
||||
a{ |
||||
font-size: calc(100vw / 110); |
||||
} |
||||
} |
||||
.MuiFormControl-root { |
||||
width: 100%; |
||||
margin: 10px auto !important; |
||||
.MuiSelect-iconOutlined { |
||||
display: none; |
||||
} |
||||
.MuiSelect-outlined.MuiSelect-outlined { |
||||
padding-right: 15px; |
||||
} |
||||
color: #797979 !important; |
||||
} |
||||
.MuiOutlinedInput-notchedOutline { |
||||
top: 0px !important; |
||||
} |
||||
.MuiOutlinedInput-notchedOutline { |
||||
border-color: #666666 !important; |
||||
border-width: 1px !important; |
||||
color: green !important; |
||||
border-radius: 10px !important; |
||||
} |
||||
|
||||
.MuiOutlinedInput-input { |
||||
padding: 10px 14px !important; |
||||
font-family: numeralLight; |
||||
font-size: calc(100vw / 80); |
||||
&:focus{ |
||||
border: 0.2px solid #84de56 !important; |
||||
border-radius: 10px; |
||||
transform : translateY(0px); |
||||
z-index: 100; |
||||
} |
||||
} |
||||
.MuiInputLabel-outlined { |
||||
font-family: numeralLight !important; |
||||
display: inline !important; |
||||
position: absolute; |
||||
text-align: right !important; |
||||
right: 15px; |
||||
top: calc(50%); |
||||
padding: 0px !important; |
||||
transform: translate(0px, -50%) scale(1) !important; |
||||
} |
||||
.MuiInputLabel-shrink { |
||||
text-align: center !important; |
||||
display: inline; |
||||
position: absolute; |
||||
right: 0px; |
||||
top: -8px; |
||||
transform: translate(0px, 0px) scale(0.85) !important; |
||||
padding: 0px 10px !important; |
||||
} |
||||
|
||||
label { |
||||
background-color: #2F2F2F; |
||||
width: fit-content; |
||||
text-align: center; |
||||
color: #B5B5B5 !important; |
||||
letter-spacing: -1px; |
||||
font-size: calc(100vw / 100); |
||||
z-index: 110; |
||||
} |
||||
.Mui-focused { |
||||
color: rgba(0, 0, 0, 1) !important; |
||||
border-color: #84de56 !important; |
||||
// background-color: white; |
||||
color: #84de56 !important; |
||||
} |
||||
|
||||
.MuiInputBase-input { |
||||
height: auto !important; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue