Merge pull request #35 from nakazawakan/feature_c_acc

Feature c acc
このコミットが含まれているのは:
I love Github 2021-10-08 21:54:57 -07:00 committed by GitHub
コミット 6d58bc7d0a
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 4AEE18F83AFDEB23
23個のファイルの変更929行の追加139行の削除

ファイルの表示

@ -11268,10 +11268,22 @@ input[type=date].hide-calender::-webkit-inner-spin-button, input[type=date].hide
font-size: 20px !important;
}
.ft-25 {
font-size: 25px !important;
}
.ft-30 {
font-size: 30px !important;
}
.ft-35 {
font-size: 35px !important;
}
.ft-40 {
font-size: 40px !important;
}
@media (max-width: 991.98px) {
.ft-md-12 {
font-size: 12px !important;
@ -12045,7 +12057,6 @@ a {
}
}
.input-default {
border-radius: 18px !important;
height: 50px;
font-size: 18px;
}
@ -12080,3 +12091,8 @@ a {
.btn-shadow {
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.3) !important;
}
.btn-disabled {
background-color: #eaeff2;
color: #6f7372;
}

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@ -1,19 +1,21 @@
import React, { Component } from 'react';
import Login from './login';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Meeting from './meeting';
import Side from './side';
export default class AdminApp extends Component {
render() {
return (
<main className="l-container meeting-consent">
<BrowserRouter>
<Switch>
<Route exact path='/login/admin' component={Login} />
<Route exact path='/admin/meeting' component={Meeting} />
</Switch>
<Side />
</BrowserRouter>
</main>
);
}
}

ファイルの表示

@ -1,11 +1,12 @@
import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import { Button } from '@material-ui/core';
import axios from 'axios';
import { CircularProgress } from '@material-ui/core';
const Login = () => {
const AdminLogin = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
@ -40,7 +41,7 @@ const Login = () => {
return (
<form onSubmit={handleSubmit} noValidate>
<p className="text-center font-weight-bold ft-20 pb-40-px">管理者ログイン</p>
<h1 className="text-center font-weight-bold ft-25 pb-40-px">管理者ログイン</h1>
{
_400error.length != 0 &&
<span className="l-alert__text--error ft-16 ft-md-14">{_400error}</span>
@ -79,4 +80,10 @@ const Login = () => {
}
export default Login;
// ----------------------------------------------------------------------
if(document.getElementById('admin-login')){
ReactDOM.render(
<AdminLogin />,
document.getElementById('admin-login')
)
}

124
backend/resources/js/admin/meeting/index.jsx ノーマルファイル
ファイルの表示

@ -0,0 +1,124 @@
import React, { useEffect, useState } from 'react';
import { CircularProgress } from '@material-ui/core';
import moment from 'moment';
import axios from 'axios';
import { useHistory } from 'react-router-dom'
import Notification from '../../component/notification';
const Meeting = () => {
const history = useHistory();
const [keyword, setKeyword] = useState('')
const [loading, setLoading] = useState(true);
const [finish, setFinish] = useState(false);
const [completeOfFather, setCompleteOfFather ] = useState(null);
const [inCompleteOfFather, setInCompleteOfFather ] = useState(null);
useEffect(() => {
axios.get('/api/meetings/listOfCompleteOfFather', {params: { father_id: 1 }}).then((response) => {
if(response.data.status_code==200){
console.log(response.data.params);
} else if(response.data.status_code==400){
//TODO
}
setCompleteOfFather(response.data.params);
});
}, []);
useEffect(() => {
axios.get('/api/meetings/listOfIncompleteOfFather', {params: { father_id: 1 }}).then((response) => {
if(response.data.status_code==200){
console.log(response.data.params);
setInCompleteOfFather(response.data.params);
setLoading(false);
} else if(response.data.status_code==400){
//TODO
}
});
}, []);
return (
<div className="l-content">
<div className="l-content__ttl">
<div className="l-content__ttl__left">
<h2>ミーティング一覧</h2>
</div>
<Notification/>
</div>
<div className="l-content-wrap">
<div className="meeting-tab-container">
<div className="meeting-tab-wrap">
<div className="meeting-head">
<form action="" className="meeting-form">
<label className="control-label" htmlFor="keyword">キーワード</label>
<input type="search" name="keyword" className="input-default input-keyword input-w380" id="keyword" value={keyword} onChange={e=> setKeyword(e.target.value)}/>
<i className="icon icon-search"></i>
</form>
</div>
<div className="meeting-content">
<div className={ `meeting-content-wrap ${!finish ? "is-active" : ""}` } id="item01">
{ !loading ? inCompleteOfFather?.map((item, i) => {
return (
<div className="meeting-item" key={i}>
<a
className="meeting-link"
onClick={e => {
e.preventDefault();
history.push({
pathname: `/p-account/meeting/detail/${item.id}`,
state: {}
});
}} >
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
<time dateTime="2021-07-30" className="meeting-time">
<span className="meeting-date">{ moment(item.updated_at).format('YYYY/MM/DD') || '' }</span>
</time>
<div className="meeting-member">
<div className="meeting-member-wrap">
<div data-url="login.html" className="meeting-member-link">
<ul className="meeting-member-count">
<li className="numerator">3</li>
<li className="denominator">4</li>
</ul>
<ul className="meeting-member-list" role="list">
<li className="meeting-member__item" role="listitem">
<div className="avatar">
<img alt="name" className="avatar-img" src="../assets/img/avatar/avatar-sample01@2x.png" />
</div>
</li>
<li className="meeting-member__item" role="listitem">
<div className="avatar">
<img alt="name" className="avatar-img" src="../assets/img/avatar/avatar-sample02@2x.png" />
</div>
</li>
<li className="meeting-member__item" role="listitem">
<div className="avatar">
<img alt="name" className="avatar-img" src="../assets/img/avatar/avatar-sample03@2x.png" />
</div>
</li>
</ul>
</div>
</div>
</div>
</a>
</div>
);
}) : <CircularProgress /> }
</div>
</div>
</div>
</div>
</div>
</div>
)
}
export default Meeting;

58
backend/resources/js/admin/side.jsx ノーマルファイル
ファイルの表示

@ -0,0 +1,58 @@
import React, { useEffect, useState } from 'react';
import { Link } from 'react-router-dom'
export default function Side() {
const [selected, setSelected] = useState('');
return (
<div className="l-side">
<div className="l-side-logo">
<a href=""><img src="/assets/img/common/logo.svg" alt="ロゴ" /></a>
</div>
<nav className="mypage-nav">
<ul className="mypage-nav-list">
<li
className={`mypage-nav-list__item -meeting ${(selected == 'meeting' || (selected == '' && document.getElementById('admin_router').value == 'meeting')) && "nav-active"}`}
onClick={e => {
e.preventDefault();
setSelected('meeting');
}}>
<Link className='mypage-nav-list__link' to='/admin/meeting'>
<i className="icon meeting"></i>
<span>ミーティング</span>
</Link>
</li>
<li className={`mypage-nav-list__item -childinfo ${ (selected == 'child' || (selected == '' && document.getElementById('admin_router').value == 'child')) && "nav-active"}`}
onClick={e => {
e.preventDefault();
setSelected('parent');
}}>
<Link className='mypage-nav-list__link' to='/admin/child'>
<i className="icon parents"></i>
<span>子情報</span>
</Link>
</li>
<li className={`mypage-nav-list__item -parentinfo ${ (selected == 'parent' || (selected == '' && document.getElementById('admin_router').value == 'parent')) && "nav-active"}`}
onClick={e => {
e.preventDefault();
setSelected('parent');
}}>
<Link className='mypage-nav-list__link' to='/admin/parent'>
<i className="icon parents"></i>
<span>親情報</span>
</Link>
</li>
<li className="mypage-nav-list__item -logout">
<a href="" className="mypage-nav-list__link">
<i className="icon log-out"></i><span>ログアウト</span>
</a>
</li>
</ul>
</nav>
</div>
);
}

ファイルの表示

@ -9,3 +9,4 @@ require('./pages/pages');
require('./child');
require('./child/auth');
require('./admin');
require('./admin/login');

ファイルの表示

@ -10,6 +10,7 @@ import IconButton from "@material-ui/core/IconButton";
const SignUp = () => {
const [first_name, setFirstName] = useState('');
const [last_name, setLastName] = useState('');
const [identify, setIdentify] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [company, setCompany] = useState('');
@ -18,6 +19,7 @@ const SignUp = () => {
const [errors, setErrors] = useState({
first_name:'',
last_name:'',
identify:'',
email:'',
password:'',
image:'',
@ -34,6 +36,7 @@ const SignUp = () => {
const formdata = new FormData();
formdata.append('first_name', first_name);
formdata.append('last_name', last_name);
formdata.append('identify', identify);
formdata.append('email', email);
formdata.append('password', password);
formdata.append('company', company);
@ -79,6 +82,9 @@ const SignUp = () => {
if(last_name.length == 0){ formIsValid = false; errors['last_name'] = 'Required'; }
else errors['last_name'] = '';
if(identify.length == 0){ formIsValid = false; errors['identify'] = 'Required'; }
else errors['identify'] = '';
if(password.length < 8){ formIsValid = false; errors['password'] = 'Required'; }
else errors['password'] = '';
@ -154,6 +160,17 @@ const SignUp = () => {
}
</div>
<div className="edit-set">
<label htmlFor="identify" className="control-label ft-12"> ID </label>
<input type="text" name="identify" id="identify" className={`input-default input-nameSei ${ errors['identify'].length != 0 && "is-invalid c-input__target" }`} value={identify} onChange={e=>setIdentify(e.target.value)}/>
{
errors['identify'].length != 0 &&
<span className="l-alert__text--error ft-16 ft-md-14">
{errors['identify']}
</span>
}
</div>
<div className="edit-set">
<label htmlFor="email" className="control-label ft-12"> メールアドレス </label>
<input type="email" name="email" id="email" className = {`input-default input-nameSei ${ errors['email'].length != 0 && "is-invalid c-input__target" }`} value={email} onChange={e=>setEmail(e.target.value)}/>

ファイルの表示

@ -111,9 +111,14 @@ const MeetingDetail = (props) => {
</div>
<div className="p-article__pdf">
<div className="p-article__pdf__btn mr-2">
<a href="/assets/img/dummy/sample.pdf" className="btn-default btn-disabled btn-pdf btn-r8 btn-h60 h-xs-45-px" target="_blank">
<span>PDFを確認する</span>
</a>
</div>
<div className="p-article__pdf__btn mr-0">
<a href="/assets/img/dummy/sample.pdf" className="btn-default btn-yellow btn-pdf btn-r8 btn-h60 h-xs-45-px" target="_blank">
<span>PDFを確認する</span>
<span>メモを確認する</span>
</a>
</div>
</div>

ファイルの表示

@ -13,6 +13,7 @@ const ProfileEdit = () => {
const [first_name, setFirstName] = useState('');
const [last_name, setLastName] = useState('');
const [identify, setIdentify] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [company, setCompany] = useState('');
@ -21,6 +22,7 @@ const ProfileEdit = () => {
const [errors, setErrors] = useState({
first_name:'',
last_name:'',
identify:'',
email:'',
password:'',
image:'',
@ -54,6 +56,9 @@ const ProfileEdit = () => {
if(first_name.length == 0){ formIsValid = false; errors['first_name'] = 'Required'; }
else errors['first_name'] = '';
if(identify.length == 0){ formIsValid = false; errors['identify'] = 'Required'; }
else errors['identify'] = '';
if(last_name.length == 0){ formIsValid = false; errors['last_name'] = 'Required'; }
else errors['last_name'] = '';
@ -77,11 +82,12 @@ const ProfileEdit = () => {
const formdata = new FormData();
formdata.append('first_name', first_name);
formdata.append('last_name', last_name);
formdata.append('identify', identify);
formdata.append('email', email);
formdata.append('password', password);
formdata.append('company', company);
formdata.append('image', image);
// axios.post('/api/children/updateProfile/{child_id}', formdata)
// axios.post('/api/children/updateProfile/{identify}', formdata)
// .then(response => {
// if(response.data.status_code==200){
// setSubmitStatus('success);
@ -133,6 +139,17 @@ const ProfileEdit = () => {
}
</div>
<div className="edit-set">
<label htmlFor="identify" className="control-label ft-12"> ID </label>
<input type="text" name="identify" id="identify" className={`input-default input-nameSei ${ errors['identify'].length != 0 && "is-invalid c-input__target" }`} value={identify} onChange={e=>setIdentify(e.target.value)}/>
{
errors['identify'].length != 0 &&
<span className="l-alert__text--error ft-16 ft-md-14">
{errors['identify']}
</span>
}
</div>
<div className="edit-set">
<label htmlFor="email" className="control-label ft-12"> メールアドレス </label>
<input type="email" name="email" id="email" className = {`input-default input-nameSei ${ errors['email'].length != 0 && "is-invalid c-input__target" }`} value={email} onChange={e=>setEmail(e.target.value)}/>

ファイルの表示

@ -13,6 +13,7 @@ const Profile = () => {
const profile = {
id: 1,
name: '田中 達也',
username:'chankan',
tel:'08012927104',
email:'chankan07@gmail.com',
company:'株式会社ZOTMAN',
@ -87,6 +88,12 @@ const Profile = () => {
</div>
<p className="profile-name ft-xs-14">{profile.name}</p>
<div className="profile-info ft-xs-14">
<div className="profile-info__item">
<p className="profile-info__icon">
<img src="/assets/img/icon/mail.svg" alt="メール"/>
</p>
<p className="txt">{profile.username}</p>
</div>
<div className="profile-info__item">
<p className="profile-info__icon">
<img src="/assets/img/icon/mail.svg" alt="メール"/>
@ -108,14 +115,30 @@ const Profile = () => {
</div>
<div className="p-profile-btn">
<a href={`/c-account/profile/edit/${profile.id}`} className="btn-default btn-yellow btn-profile btn-r8 btn-h52 h-xs-45-px">
<a className="btn-default btn-yellow btn-profile btn-r8 btn-h52 h-xs-45-px"
onClick={e => {
e.preventDefault();
history.push({
pathname: `/c-account/profile/edit/${profile.id}`,
state: {}
});
}}
>
<span className="ft-xs-14">プロフィールを変更する</span>
</a>
</div>
<div className="p-profile-btn">
<a href={`/c-account/profile/password-edit/${profile.id}`} className="btn-default btn-yellow btn-password btn-r8 btn-h52 h-xs-45-px">
<span className="ft-xs-14">パスワードを変更する</span>
<a className="btn-default btn-yellow btn-password btn-r8 btn-h52 h-xs-45-px"
onClick={e => {
e.preventDefault();
history.push({
pathname: `/c-account/profile/password-edit/${profile.id}`,
state: {}
});
}}
>
<span className="ft-xs-14">パスワードを変更する</span>
</a>
</div>
@ -126,7 +149,14 @@ const Profile = () => {
</div>
<div className="p-profile-txtLink">
<a href="/c-account/profile/withdrawal">
<a onClick={e => {
e.preventDefault();
history.push({
pathname: `/c-account/profile/withdrawal`,
state: {}
});
}}
>
<span className="ft-xs-14">退会する</span>
</a>
</div>

ファイルの表示

@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
import ReactDOM from 'react-dom';
import { useHistory } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import axios from 'axios';
@ -109,7 +109,7 @@ const ProfilePasswordEdit = () => {
</div>
<div className="mt-5">
<LoadingButton type="submit" fullWidth className="p-4 rounded-20 ft-15 font-weight-bold text-black bg-color-2">
<LoadingButton type="submit" fullWidth className="p-4 rounded-20 ft-15 ft-xs-13 font-weight-bold text-black bg-color-2">
<span>パスワードを更新</span>
</LoadingButton>
</div>

ファイルの表示

@ -41,7 +41,7 @@ const ProfileWithdrawal = () => {
<p>本当に退会してもよろしいでしょうか</p>
</div>
<button type="submit" className="btn-edit btn-default btn-h70 btn-r14 btn-yellow ft-xs-15">退会する</button>
<button type="submit" className="btn-edit btn-default btn-h70 btn-r20 btn-yellow ft-xs-15">退会する</button>
</form>
</div>

ファイルの表示

@ -59,7 +59,7 @@ const Search = () => {
const history = useHistory();
const [keyword, setKeyword] = useState('')
const [keyword, setKeyword] = useState('');
const [tab_status, setTabStatus] = useState(false);
// const [meeting_list, setMettingList] = useState([]);

ファイルの表示

@ -42,15 +42,16 @@ export default function Side() {
<span>親情報</span>
</Link>
</li>
<li className={`mypage-nav-list__item -profile ${ (selected == 'profile' || (selected == '' && document.getElementById('c_router').value == 'profile')) && "nav-active"}`}
onClick={e => {
e.preventDefault();
setSelected('profile');
}}>
<Link className='user-icon mypage-nav-list__link ' to='/c-account/profile'>
<Link className='user-icon mypage-nav-list__link' to='/c-account/profile'>
<figure>
<div className="prof-wrap">
<img src="/assets/img/avatar/avatar-sample01@2x.png" alt="" />
<img src="/assets/img/avatar/avatar-sample01@2x.png" alt=""/>
</div>
</figure>
<span>プロフィール</span>

ファイルの表示

@ -12,6 +12,9 @@ const WithdrawalComplete = () => {
退会完了しました<br/>
今後とも危機管理をよろしくお願いいたします
</div>
<div class="text-center">
<a class="ft-xs-13">トップページへ戻る</a>
</div>
</div>
</div>
</div>

ファイルの表示

@ -9,8 +9,10 @@
.ft-18{ font-size: 18px !important; }
.ft-19{ font-size: 19px !important; }
.ft-20{ font-size: 20px !important; }
.ft-25{ font-size: 25px !important; }
.ft-30{ font-size: 30px !important; }
.ft-35{ font-size: 35px !important; }
.ft-40{ font-size: 40px !important; }
.ft-md-12{ @include media-breakpoint-down(md){ font-size: 12px !important; } }

ファイルの表示

@ -100,7 +100,7 @@ a{
.input-default{
border-radius: 18px !important;
// border-radius: 18px !important;
height: 50px;
font-size: 18px;
}
@ -134,3 +134,8 @@ a{
.btn-shadow{
box-shadow: 0 1px 8px rgb(0 0 0 / 30%) !important;
}
.btn-disabled{
background-color: #eaeff2;
color: #6f7372;
}

ファイルの表示

@ -0,0 +1,25 @@
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title')</title>
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel = "stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<link rel="stylesheet" href="{{ asset('assets/css/style.css') }}" />
</head>
<body>
@yield('content')
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="{{ asset('js/app.js') }}"></script>
@stack('js')
</html>

ファイルの表示

@ -3,5 +3,5 @@
@section('title', '管理者ログイン')
@section('content')
<div id="admin-app"></div>
<div id="admin-login"></div>
@endsection

ファイルの表示

@ -0,0 +1,8 @@
@extends('admin.layout')
@section('title', 'ミーティング一覧')
@section('content')
<div id="admin-app"></div>
<input type="hidden" id="admin_router" value="meeting" />
@endsection

ファイルの表示

@ -48,6 +48,9 @@
退会完了しました。<br/>
今後とも、危機管理をよろしくお願いいたします。
</div>
<div class="text-center">
<a class="ft-xs-13">トップページへ戻る</a>
</div>
</div>
</div>
</div>

ファイルの表示

@ -49,3 +49,4 @@ Route::get('/withdrawal/complete', function () { return view
//--------------------------Admin Account----------------------------------------//
Route::get('/login/admin', function () { return view('admin.login.index'); });
Route::get('/admin/meeting', function () { return view('admin.meeting.index'); });