Merge branch 'develop' of github.com:nakazawakan/kikikanri into backend

このコミットが含まれているのは:
守矢諏訪子 2022-01-07 22:34:41 +09:00
コミット c7c60cfbb1
95個のファイルの変更11082行の追加105971行の削除

バイナリ
.DS_Store vendored ノーマルファイル

バイナリファイルは表示されません。

バイナリ
backend/.DS_Store vendored ノーマルファイル

バイナリファイルは表示されません。

ファイルの表示

@ -689,6 +689,7 @@ class MeetingsController extends Controller {
$result->father = new \stdClass();
}
}
else $result->father = Father::select('company')->where('id', (int)$result->father_id)->first();
if (request()->route()->action['as'] != 'mdc') {
$result->children = [];

ファイルの表示

@ -20,11 +20,11 @@ class AdminsTableSeeder extends Seeder
// );
\App\Models\Admin::create([
'email' => '56@zotman.jp',
'password' => Hash::make('password')
'password' => Hash::make('zotman0550')
]);
\App\Models\Admin::create([
'email' => 'chankan77@gmail.com',
'password' => Hash::make('password')
'password' => Hash::make('ofp12345')
]);
}
}

6937
backend/package-lock.json generated

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

ファイルの表示

@ -1,4 +1,9 @@
{
"name": "KIKI",
"author": "Chankan, Technical, Dragon",
"licence": "MIT",
"version": "1.0.0",
"private": false,
"browserslist": {
"production": [
">0.2%",
@ -11,7 +16,6 @@
"last 1 safari version"
]
},
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
@ -31,7 +35,7 @@
"@material-ui/lab": "^5.0.0-alpha.40",
"@material-ui/styles": "^5.0.0-beta.1",
"@mui/icons-material": "^5.2.4",
"@mui/material": "^5.2.6",
"@mui/material": "^5.2.7",
"@react-pdf-viewer/core": "^3.0.0",
"@react-pdf-viewer/default-layout": "^3.0.0",
"clipboard-copy": "^4.0.1",
@ -42,17 +46,18 @@
"pdfjs-dist": "^2.11.338",
"prop-types": "^15.7.2",
"react": "^17.0.2",
"react-cookie": "^4.1.1",
"react-datepicker": "^4.2.1",
"react-dom": "^17.0.2",
"react-infinite-scroll-component": "^6.1.0",
"react-pdf": "^5.4.0",
"react-router": "^5.2.1",
"react-router-dom": "^5.3.0"
"react-router-dom": "^6.2.1",
"react-scripts": "^5.0.0"
},
"devDependencies": {
"@babel/core": "^7.15.5",
"@babel/core": "^7.16.7",
"@babel/eslint-parser": "^7.14.7",
"@babel/preset-react": "^7.0.0",
"@babel/preset-react": "^7.16.7",
"axios": "^0.21.4",
"babel-loader": "^8.2.3",
"babel-preset-es2015-loose": "^8.0.0",
@ -62,7 +67,7 @@
"eslint-config-prettier": "^8.3.0",
"eslint-config-react-app": "^6.0.0",
"eslint-plugin-flowtype": "^5.8.1",
"eslint-plugin-import": "^2.23.4",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-react": "^7.26.1",
@ -73,7 +78,7 @@
"postcss": "^8.3.9",
"prettier": "^2.3.1",
"resolve-url-loader": "^3.1.2",
"sass": "^1.42.1",
"sass": "^1.45.2",
"sass-loader": "^8.0.0"
}
}

バイナリ
backend/public/assets/img/icon/icon-copy.png ノーマルファイル

バイナリファイルは表示されません。

変更後

幅:  |  高さ:  |  サイズ: 671 B

ファイルの表示

@ -14290,6 +14290,9 @@ categories: [project]
.meeting-consent .meeting-item {
padding: 17px 0 22px;
}
.meeting-consent .meeting-item.parent {
padding-right: 45px;
}
@media screen and (min-width: 1068px) {
.meeting-consent .meeting-item {
padding: 19px 0 21px;
@ -17453,6 +17456,32 @@ a {
z-index: 100;
}
.clip-copy {
margin-top: 30px;
margin-bottom: 10px;
border: 1px solid rgba(36, 77, 138, 0.1);
border-radius: 6px;
padding: 12px;
text-align: center;
color: #777777;
font-size: 15px;
font-weight: bold;
background-color: #F5F7F8;
position: relative;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.clip-copy:hover {
background-color: #f0ffff;
}
.clip-copy img {
position: absolute;
width: 18px;
right: 10px;
}
@media screen and (min-width: 1068px) {
.p-meetingAdd-btn {
width: 200px !important;
@ -17546,17 +17575,16 @@ a {
font-size: 16px !important;
}
}
.react-pdf__Page__svg {
margin: auto;
width: 100% !important;
height: 100% !important;
}
.react-pdf__Page__svg svg {
width: 100%;
height: 100%;
object-fit: contain;
}
.react-pdf__Document {
height: 100% !important;
}
input::placeholder {
color: #d4d4d4 !important;
}

107531
backend/public/js/app.js vendored

長すぎる行があるためファイル差分は表示されません

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { useNavigate, Link, useLocation, useParams } from 'react-router-dom';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
@ -7,31 +7,33 @@ import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
import ModalConfirm from '../../component/modal_confirm';
const ChildDetail = (props) => {
const history = useHistory();
const AdminChildDetail = () => {
const [image, setImage] = useState('');
const navigator = useNavigate();
const location = useLocation();
const params = useParams();
const [image, setImage] = useState('');
const [loaded, setLoaded] = useState(false);
const [submit, setSubmit] = useState(false);
const [submit_image, setSubmitImage] = useState(false);
const [child, setChild] = useState(null);
const [_400error, set400Error] = useState('');
const [_422errors, set422Errors] = useState({ image: '' });
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [show_confirm_modal, setShowConfirmModal] = useState(false);
const isMountedRef = useRef(true);
useEffect(async () => {
isMountedRef.current = false;
setLoaded(false);
await axios.get(`/api/admin/children/detail/${props.match.params?.child_id}`)
await axios.get(`/api/admin/children/detail/${params?.child_id}`)
.then(response => {
setLoaded(true);
switch(response.data.status_code){
@ -54,7 +56,7 @@ const ChildDetail = (props) => {
reader.onloadend = () => {
set422Errors({image: ''});
setSubmitImage(true);
axios.put(`/api/admin/children/updateImage/${props.match.params?.child_id}`, {image: reader.result})
axios.put(`/api/admin/children/updateImage/${params?.child_id}`, {image: reader.result})
.then(response => {
setSubmitImage(false);
switch(response.data.status_code){
@ -65,7 +67,7 @@ const ChildDetail = (props) => {
}
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
}
}
});
};
};
@ -73,13 +75,13 @@ const ChildDetail = (props) => {
async function handleAcceptDelete() {
setSubmit(true);
axios.delete(`/api/admin/children/delete/${props.match.params?.child_id}`)
axios.delete(`/api/admin/children/delete/${params?.child_id}`)
.then(response => {
setShowConfirmModal(false);
setSubmit(false);
switch(response.data.status_code){
case 200:{
history.push({pathname: "/admin/child", state: "削除に成功しました!"});
navigator("/admin/child", {state: "削除に成功しました!"});
break;
}
case 400: set400Error("削除に失敗しました。"); break;
@ -87,7 +89,7 @@ const ChildDetail = (props) => {
});
};
return (
<div className="l-content">
@ -105,7 +107,7 @@ const ChildDetail = (props) => {
(!loaded || submit_image) &&
<PageLoader />
}
{
{
loaded && child &&
<div className="profile-content">
<div>
@ -115,14 +117,14 @@ const ChildDetail = (props) => {
<IconButton color="primary" aria-label="upload picture" component="span" className="bg-yellow shadow-sm w-50-px h-50-px">
<PhotoCameraOutlinedIcon style={{width:'25px', height:'25px', color:'black'}}/>
</IconButton>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
</div>
{
_422errors.image &&
<span className="l-alert__text--error ft-16 ft-md-14">
{_422errors.image}
</span>
</span>
}
</div>
<p className="profile-name">{`${child.last_name} ${child.first_name}`}</p>
@ -156,23 +158,23 @@ const ChildDetail = (props) => {
<p className="txt">{child.company ? child.company: '未入力'}</p>
</div>
</div>
<div className="p-profile-btn">
<Link className="btn-default btn-yellow btn-profile btn-r8 btn-h52"
to = {`/admin/child/edit/${props.match.params?.child_id}`}
to = {`/admin/child/edit/${params?.child_id}`}
>
<span className="ft-18 ft-xs-16">プロフィールを変更する</span>
</Link>
</div>
<div className="p-profile-btn">
<Link className="btn-default btn-yellow btn-password btn-r8 btn-h52"
to = {`/admin/child/edit/password/${props.match.params?.child_id}`}
to = {`/admin/child/edit/password/${params?.child_id}`}
>
<span className="ft-18 ft-xs-16">パスワードを変更する</span>
</Link>
</div>
<div className="p-profile-txtLink">
<a className="btn-default btn-password btn-r8 btn-h52"
onClick={()=>setShowConfirmModal(true)}
@ -180,24 +182,24 @@ const ChildDetail = (props) => {
<span className="ft-xs-16">削除する</span>
</a>
</div>
</div>
</div>
}
</div>
</section>
</section>
</div>
</div>
<ModalConfirm
show={show_confirm_modal}
message={"本当に削除しても\nよろしいでしょうか?"}
handleClose={()=>setShowConfirmModal(false)}
handleAccept={handleAcceptDelete}
loading={submit}
<ModalConfirm
show={show_confirm_modal}
message={"本当に削除しても\nよろしいでしょうか?"}
handleClose={()=>setShowConfirmModal(false)}
handleAccept={handleAcceptDelete}
loading={submit}
/>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
</div>
</div>
)
}
export default ChildDetail;
export default AdminChildDetail;

ファイルの表示

@ -1,14 +1,15 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
const ChildEdit = (props) => {
const AdminChildEdit = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const [first_name, setFirstName] = useState('');
const [last_name, setLastName] = useState('');
@ -38,7 +39,7 @@ const ChildEdit = (props) => {
isMountedRef.current = false;
setLoaded(false);
await axios.get(`/api/admin/children/detail/${props.match.params?.child_id}`)
await axios.get(`/api/admin/children/detail/${params?.child_id}`)
.then(response => {
setLoaded(true);
if(response.data.status_code==200)
@ -80,14 +81,13 @@ const ChildEdit = (props) => {
tel: tel,
company: company
};
axios.put(`/api/admin/children/updateProfile/${props.match.params?.child_id}`, request)
axios.put(`/api/admin/children/updateProfile/${params?.child_id}`, request)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/admin/child/detail/${props.match.params?.child_id}`,
state: response.data.success_messages});
navigator(`/admin/child/detail/${params?.child_id}`,
{state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -203,4 +203,4 @@ const ChildEdit = (props) => {
}
export default ChildEdit;
export default AdminChildEdit;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import IconButton from '@mui/material/IconButton';
import SearchIcon from '@mui/icons-material/Search';
@ -10,7 +10,9 @@ import PageLoader from '../../component/page_loader';
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Child = (props) => {
const AdminChilds = () => {
const location = useLocation();
const [keyword, setKeyword] = useState('')
const [loaded, setLoaded] = useState(false);
@ -19,7 +21,7 @@ const Child = (props) => {
const [_422errors, set422errors] = useState({keyword:''});
const [_400error, set400Error] = useState('');
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const isMountedRef = useRef(true);
@ -154,4 +156,4 @@ const Child = (props) => {
)
}
export default Child;
export default AdminChilds;

ファイルの表示

@ -1,13 +1,14 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
const ChildPasswordEdit = (props) => {
const AdminChildPasswordEdit = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const [password, setPassword] = useState('');
const [password_confirmation, setConfirmPassword] = useState('');
@ -35,14 +36,13 @@ const ChildPasswordEdit = (props) => {
password_confirmation: password_confirmation
}
await axios.put(`/api/admin/children/updatePassword/${props.match.params?.child_id}`, request)
await axios.put(`/api/admin/children/updatePassword/${params?.child_id}`, request)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/admin/child/detail/${props.match.params?.child_id}`,
state: response.data.success_messages});
navigator(`/admin/child/detail/${params?.child_id}`,
{state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -114,4 +114,4 @@ const ChildPasswordEdit = (props) => {
}
export default ChildPasswordEdit;
export default AdminChildPasswordEdit;

ファイルの表示

@ -1,61 +0,0 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import Meeting from './meeting';
import MeetingDetail from './meeting/detail';
import MeetingEdit from './meeting/edit';
import Child from './child';
import ChildDetail from './child/detail';
import ChildEdit from './child/edit';
import ChildPasswordEdit from './child/password_edit';
import Parent from './parent';
import ParentDetail from './parent/detail';
import ParentEdit from './parent/edit';
import ParentPasswordEdit from './parent/password_edit';
import ParentRegister from './parent/register';
import Side from './side';
import PageChangeHandler from '../component/page_change_handler';
import ScrollToTop from '../component/scroll_top';
export default class AdminApp extends Component {
render() {
return (
<main className="l-container meeting-consent">
<BrowserRouter>
<ScrollToTop />
<PageChangeHandler />
<Switch>
<Route exact path='/admin/meeting' component={Meeting} />
<Route exact path='/admin/meeting/detail/:meeting_id' component={MeetingDetail} />
<Route exact path='/admin/meeting/edit/:meeting_id' component={MeetingEdit} />
<Route exact path='/admin/child' component={Child} />
<Route exact path='/admin/child/detail/:child_id' component={ChildDetail} />
<Route exact path='/admin/child/edit/:child_id' component={ChildEdit} />
<Route exact path='/admin/child/edit/password/:child_id' component={ChildPasswordEdit} />
<Route exact path='/admin/parent' component={Parent} />
<Route exact path='/admin/parent/detail/:father_id' component={ParentDetail} />
<Route exact path='/admin/parent/edit/:father_id' component={ParentEdit} />
<Route exact path='/admin/parent/edit/password/:father_id' component={ParentPasswordEdit} />
<Route exact path='/admin/parent/register' component={ParentRegister} />
</Switch>
<Side />
</BrowserRouter>
</main>
);
}
}
if(document.getElementById('admin-app')){
ReactDOM.render(
<AdminApp />,
document.getElementById('admin-app')
)
}

ファイルの表示

@ -1,11 +1,13 @@
import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import { LoadingButton } from '@material-ui/lab';
import { useCookies } from 'react-cookie';
import Alert from '../../component/alert';
const AdminLogin = () => {
const [cookies, setCookie] = useCookies(['user']);
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
@ -36,6 +38,7 @@ const AdminLogin = () => {
case 200: {
localStorage.setItem('kiki_login_flag', true);
localStorage.setItem('kiki_acc_type', 'admin');
setCookie('logged', 'success');
window.location.href = "/admin/meeting";
break;
}
@ -113,10 +116,4 @@ const AdminLogin = () => {
}
// ----------------------------------------------------------------------
if(document.getElementById('admin-login')){
ReactDOM.render(
<AdminLogin />,
document.getElementById('admin-login')
)
}
export default AdminLogin;

ファイルの表示

@ -1,5 +1,5 @@
import { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { useNavigate, Link, useLocation, useParams } from 'react-router-dom';
import moment from 'moment';
import Alert from '../../component/alert';
@ -9,16 +9,19 @@ import ModalConfirm from '../../component/modal_confirm';
import Thumbnail from '../../component/thumbnail';
import PageLoader from '../../component/page_loader';
const MeetingDetail = (props) => {
const AdminMeetingDetail = () => {
const navigator = useNavigate();
const location = useLocation();
const params = useParams();
const history = useHistory();
const [loaded, setLoaded] = useState(false);
const [submit, setSubmit] = useState(false);
const [meeting, setMeeting] = useState(null);
const [thumbnail, setThumbnail] = useState('');
const [_400error, set400Error] = useState('');
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [show_confirm_modal, setShowConfirmModal] = useState(false);
const [show_pdf_modal, setShowPDFModal] = useState(false);
@ -29,7 +32,7 @@ const MeetingDetail = (props) => {
useEffect( async () => {
isMountedRef.current = false;
setLoaded(false);
await axios.get(`/api/admin/meetings/detail/${props.match.params?.meeting_id}`)
await axios.get(`/api/admin/meetings/detail/${params?.meeting_id}`)
.then((response) => {
setLoaded(true);
if(response.data.status_code==200){
@ -54,13 +57,13 @@ const MeetingDetail = (props) => {
async function handleAcceptDelete() {
setSubmit(true);
await axios.delete(`/api/admin/meetings/delete/${props.match.params?.meeting_id}`)
await axios.delete(`/api/admin/meetings/delete/${params?.meeting_id}`)
.then(response => {
setShowConfirmModal(false);
setSubmit(false);
switch(response.data.status_code){
case 200:{
history.push({pathname: '/admin/meeting', state: '削除に成功しました!'});
navigator('/admin/meeting', {state: '削除に成功しました!'});
break;
}
case 400: set400Error("削除に失敗しました。"); break;
@ -127,7 +130,7 @@ const MeetingDetail = (props) => {
</time>
<ul className="p-article-btn-list">
<li className="p-article__pdf__btn">
<Link to={`/admin/meeting/edit/${props.match.params?.meeting_id}`}
<Link to={`/admin/meeting/edit/${params?.meeting_id}`}
className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">
編集
</Link>
@ -219,4 +222,4 @@ const MeetingDetail = (props) => {
)
}
export default MeetingDetail;
export default AdminMeetingDetail;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import IconButton from '@mui/material/IconButton';
import RemoveIcon from '@mui/icons-material/Remove';
@ -9,9 +9,13 @@ import PageLoader from '../../component/page_loader';
import UploadingProgress from '../../component/modal_uploading';
const MeetingEdit = (props) => {
const meeting_id = props.match.params.meeting_id;
const history = useHistory();
const AdminMeetingEdit = () => {
const navigator = useNavigate();
const params = useParams();
const meeting_id = params?.meeting_id;
const [meeting, setMeeting] = useState(null);
const [title, setTitle] = useState('');
const [memo, setMemo] = useState('');
@ -121,9 +125,8 @@ const MeetingEdit = (props) => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/admin/meeting/detail/${meeting_id}`,
state: "更新成功しました!"});
navigator(`/admin/meeting/detail/${meeting_id}`,
{state: "更新成功しました!"});
break;
}
case 400: set400Error("更新失敗しました。"); break;
@ -174,15 +177,16 @@ const MeetingEdit = (props) => {
const handleDeleteImage = async (index, image_id) => {
let list = [...meeting_image];
list.splice(index, 1);
setMeetingImages(list);
await axios.delete(`/api/admin/meeting/images/delete/${meeting_id}`, {params:{image_id: image_id}})
.then(response=>{
switch(response.data.status_code){
case 400: set400Error("画像の削除に失敗しました。");
}
})
let list = [...meeting_image];
list.splice(index, 1);
setMeetingImages(list);
}
@ -391,4 +395,4 @@ const MeetingEdit = (props) => {
)
}
export default MeetingEdit;
export default AdminMeetingEdit;

ファイルの表示

@ -1,6 +1,6 @@
import React, { useRef, useEffect, useState } from 'react';
import moment from 'moment';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import IconButton from '@mui/material/IconButton';
import SearchIcon from '@mui/icons-material/Search';
import InfiniteScroll from "react-infinite-scroll-component";
@ -10,7 +10,9 @@ import PageLoader from '../../component/page_loader';
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Meeting = (props) => {
const AdminMeetings = () => {
const location = useLocation();
const [keyword, setKeyword] = useState('')
const [loaded, setLoaded] = useState(false);
@ -19,7 +21,7 @@ const Meeting = (props) => {
const [_400error, set400Error] = useState('');
const [_422errors, set422errors] = useState({keyword:''});
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const isMountedRef = useRef(true);
@ -210,4 +212,4 @@ const Meeting = (props) => {
)
}
export default Meeting;
export default AdminMeetings;

ファイルの表示

@ -1,13 +1,10 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
const ParentRegister = () => {
const history = useHistory();
const AdminParentAdd = () => {
const [email, setEmail] = useState('');
const [limit, setLimit] = useState('');
@ -91,4 +88,4 @@ const ParentRegister = () => {
}
export default ParentRegister;
export default AdminParentAdd;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { useNavigate, Link, useLocation, useParams } from 'react-router-dom';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
@ -12,31 +12,33 @@ import ModalConfirm from '../../component/modal_confirm';
const Transition = React.forwardRef(function Transition(props, ref) {
return <Slide direction="up" ref={ref} {...props} />;
});
const ParentDetail = (props) => {
const history = useHistory();
const AdminParentDetail = () => {
const [image, setImage] = useState('');
const navigator = useNavigate();
const location = useLocation();
const params = useParams();
const [image, setImage] = useState('');
const [loaded, setLoaded] = useState(false);
const [submit, setSubmit] = useState(false);
const [submit_image, setSubmitImage] = useState(false);
const [parent, setParent] = useState(null);
const [_400error, set400Error] = useState('');
const [_422errors, set422Errors] = useState({image: ''});
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [show_confirm_modal, setShowConfirmModal] = useState(false);
const isMountedRef = useRef(true);
useEffect(() => {
isMountedRef.current = false;
setLoaded(false);
axios.get(`/api/admin/fathers/detail/${props.match.params?.father_id}`)
axios.get(`/api/admin/fathers/detail/${params?.father_id}`)
.then(response => {
setLoaded(true);
if(response.data.status_code==200){
@ -58,7 +60,7 @@ const ParentDetail = (props) => {
reader.onloadend = async () => {
set422Errors({image: ''});
setSubmitImage(true);
await axios.put(`/api/admin/fathers/updateImage/${props.match.params?.father_id}`, {image: reader.result})
await axios.put(`/api/admin/fathers/updateImage/${params?.father_id}`, {image: reader.result})
.then(response => {
setSubmitImage(false);
switch(response.data.status_code){
@ -69,29 +71,27 @@ const ParentDetail = (props) => {
}
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
}
}
});
};
};
async function handleAcceptDelete() {
setSubmit(true);
await axios.delete(`/api/admin/fathers/delete/${props.match.params?.father_id}`)
await axios.delete(`/api/admin/fathers/delete/${params?.father_id}`)
.then(response => {
setShowConfirmModal(false);
setSubmit(false);
if(response.data.status_code == 200){
history.push({
pathname: "/admin/parent",
state: '削除に成功しました!'});
navigator('/admin/parent', { state: '削除に成功しました!' });
} else {
set400Error("削除に失敗しました。");
}
});
};
return (
<div className="l-content">
@ -109,7 +109,7 @@ const ParentDetail = (props) => {
(!loaded || submit_image) &&
<PageLoader />
}
{
{
loaded && parent &&
<div className="profile-content">
<div>
@ -119,14 +119,14 @@ const ParentDetail = (props) => {
<IconButton color="primary" aria-label="upload picture" component="span" className="bg-yellow shadow-sm w-50-px h-50-px">
<PhotoCameraOutlinedIcon style={{width:'25px', height:'25px', color:'black'}}/>
</IconButton>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
</div>
{
_422errors.image &&
<span className="l-alert__text--error ft-16 ft-md-14">
{_422errors.image}
</span>
</span>
}
</div>
<p className="profile-name">{parent.company}</p>
@ -157,23 +157,23 @@ const ParentDetail = (props) => {
<p className="txt">{parent.profile ? parent.profile: '未入力'}</p>
</div>
</div>
<div className="p-profile-btn">
<Link className="btn-default btn-yellow btn-profile btn-r8 btn-h52"
to = {`/admin/parent/edit/${props.match.params?.father_id}`}
to = {`/admin/parent/edit/${params?.father_id}`}
>
<span className="ft-18 ft-xs-16">プロフィールを変更する</span>
</Link>
</div>
<div className="p-profile-btn">
<Link className="btn-default btn-yellow btn-password btn-r8 btn-h52"
to = {`/admin/parent/edit/password/${props.match.params?.father_id}`}
to = {`/admin/parent/edit/password/${params?.father_id}`}
>
<span className="ft-18 ft-xs-16">パスワードを変更する</span>
</Link>
</div>
<div className="p-profile-txtLink">
<a className="btn-default btn-password btn-r8 btn-h52"
onClick={()=>setShowConfirmModal(true)}
@ -184,21 +184,21 @@ const ParentDetail = (props) => {
</div>
}
</div>
</section>
</section>
</div>
</div>
<ModalConfirm
show={show_confirm_modal}
message={"本当に削除しても\nよろしいでしょうか?"}
handleClose={()=>setShowConfirmModal(false)}
handleAccept={handleAcceptDelete}
loading={submit}
<ModalConfirm
show={show_confirm_modal}
message={"本当に削除しても\nよろしいでしょうか?"}
handleClose={()=>setShowConfirmModal(false)}
handleAccept={handleAcceptDelete}
loading={submit}
/>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}> {_400error} </Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}> {_success} </Alert> }
</div>
</div>
)
}
export default ParentDetail;
export default AdminParentDetail;

ファイルの表示

@ -1,12 +1,13 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
const ParentEdit = (props) => {
const AdminParentEdit = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const [company, setCompany] = useState('');
const [email, setEmail] = useState('');
@ -35,7 +36,7 @@ const ParentEdit = (props) => {
isMountedRef.current = false;
setLoaded(false);
await axios.get(`/api/admin/fathers/detail/${props.match.params?.father_id}`)
await axios.get(`/api/admin/fathers/detail/${params?.father_id}`)
.then(response => {
setLoaded(true);
if(response.data.status_code==200){
@ -75,14 +76,13 @@ const ParentEdit = (props) => {
profile: profile,
};
await axios.put(`/api/admin/fathers/updateProfile/${props.match.params?.father_id}`, request)
await axios.put(`/api/admin/fathers/updateProfile/${params?.father_id}`, request)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/admin/parent/detail/${props.match.params?.father_id}`,
state: response.data.success_messages});
navigator(`/admin/parent/detail/${params?.father_id}`,
{ state: response.data.success_messages });
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -187,4 +187,4 @@ const ParentEdit = (props) => {
}
export default ParentEdit;
export default AdminParentEdit;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import IconButton from '@mui/material/IconButton';
import SearchIcon from '@mui/icons-material/Search';
import InfiniteScroll from "react-infinite-scroll-component";
@ -10,7 +10,9 @@ const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Parent = (props) => {
const AdminParents = () => {
const location = useLocation();
const [keyword, setKeyword] = useState('')
const [loaded, setLoaded] = useState(false);
@ -18,7 +20,7 @@ const Parent = (props) => {
const [fetch_father_list, setFetchFatherList ] = useState([]);
const [_422errors, set422errors] = useState({keyword:''});
const [_400error, set400Error] = useState('');
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const isMountedRef = useRef(true);
@ -161,4 +163,4 @@ const Parent = (props) => {
)
}
export default Parent;
export default AdminParents;

ファイルの表示

@ -1,13 +1,14 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
const ParentPasswordEdit = (props) => {
const AdminParentPasswordEdit = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const [password, setPassword] = useState('');
const [password_confirmation, setConfirmPassword] = useState('');
@ -34,14 +35,13 @@ const ParentPasswordEdit = (props) => {
password_confirmation: password_confirmation
}
await axios.put(`/api/admin/fathers/updatePassword/${props.match.params?.father_id}`, request)
await axios.put(`/api/admin/fathers/updatePassword/${params?.father_id}`, request)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/admin/parent/detail/${props.match.params?.father_id}`,
state: response.data.success_messages});
navigator(`/admin/parent/detail/${params?.father_id}`,
{state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -112,4 +112,4 @@ const ParentPasswordEdit = (props) => {
}
export default ParentPasswordEdit;
export default AdminParentPasswordEdit;

ファイルの表示

@ -1,14 +1,17 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom'
import { Link } from 'react-router-dom';
import { useCookies } from 'react-cookie';
export default function Side() {
export default function AdminSide() {
const [selected, setSelected] = useState('');
const [cookies, setCookie] = useCookies(['user']);
const handleLogout = async () => {
await axios.get('/admin/logout')
.then(() => {
location.href = '/admin/login';
})
.then(() => {
setCookie('logged', null);
window.location.href = '/admin/login';
})
}
return (

ファイルの表示

@ -1,12 +1,3 @@
require('./bootstrap');
require('./pages/pages');
require('./admin');
require('./admin/login');
require('./parent');
require('./parent/auth');
require('./child');
require('./child/auth');
require('./index')

ファイルの表示

@ -1,12 +1,14 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../../component/alert';
const ChildForgotPasswordReset = (props) => {
const ChildForgotPasswordReset = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const [submit, setSubmit] = useState(false);
const [password, setPassword] = useState('');
@ -23,7 +25,7 @@ const ChildForgotPasswordReset = (props) => {
let req = {
password: password,
password_confirmation: password_confirmation,
token: props.match.params?.token
token: params?.token
}
await axios.put('/api/children/updatePassword', req)
@ -31,7 +33,7 @@ const ChildForgotPasswordReset = (props) => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({pathname: '/c-account/forgot-password/complete', state: response.data.success_messages});
navigator('/c-account/forgot-password/complete', {state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;

ファイルの表示

@ -1,54 +0,0 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import ChildForgotPassword from './forgot_password';
import ChildForgotPasswordReset from './forgot_password/reset';
import ChildLogin from './login';
import ChildSignUpTemporary from './register/temporary';
import ChildSignUp from './register';
import PasswordResetComplete from '../../component/password_reset_complete';
import SignUpComplete from '../../component/register/complete';
import SignUpError from '../../component/register/error';
import WithdrawalComplete from '../../component/withdrawal_complete';
import ScrollToTop from '../../component/scroll_top';
export default class ChildAuth extends Component {
render() {
return (
<main className="l-single-main">
<div className="l-centeringbox">
<div className="l-centeringbox-wrap">
<BrowserRouter>
<ScrollToTop />
<Switch>
<Route exact path='/c-account/register-temporary' component={ChildSignUpTemporary} />
<Route exact path='/c-account/register/:token' component={ChildSignUp} />
<Route exact path='/c-account/register/complete/:token' component={SignUpComplete} />
<Route exact path='/c-account/register/error/:token' component={SignUpError} />
<Route exact path="/c-account/forgot-password" component = {ChildForgotPassword} />
<Route exact path="/c-account/forgot-password/reset/:token" component = {ChildForgotPasswordReset} />
<Route exact path="/c-account/forgot-password/complete" component = {PasswordResetComplete} />
<Route exact path="/c-account/login" component = {ChildLogin} />
<Route exact path="/c-account/withdrawal/complete" component = {WithdrawalComplete} />
</Switch>
</BrowserRouter>
</div>
</div>
</main>
);
}
}
// ----------------------------------------------------------------------
if(document.getElementById('c-auth')){
ReactDOM.render(
<ChildAuth />,
document.getElementById('c-auth')
)
}

ファイルの表示

@ -1,10 +1,14 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import { useCookies } from 'react-cookie';
import Alert from '../../../component/alert';
const ChildLogin = (props) => {
const ChildLogin = () => {
const [cookies, setCookie] = useCookies(['user']);
const location = useLocation();
const [submit, setSubmit] = useState(false);
@ -12,7 +16,7 @@ const ChildLogin = (props) => {
const [password, setPassword] = useState('');
const [_422errors, set422Errors] = useState({tel: '', password: ''});
const [_400error, set400Error] = useState(props.history.location.state);
const [_400error, set400Error] = useState(location.state);
const handleSubmit = async (e) => {
@ -32,6 +36,7 @@ const ChildLogin = (props) => {
localStorage.setItem("kiki_login_flag", true);
localStorage.setItem('kiki_acc_type', 'c-account');
localStorage.setItem('kiki_acc_id', response.data.params.id);
setCookie('logged', 'success');
window.location.href = '/c-account/meeting';
break;
}

ファイルの表示

@ -1,13 +1,15 @@
import React, { useEffect, useState } from 'react';
import { useHistory } from 'react-router';
import { useNavigate, Link, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
const ChildSignUp = (props) => {
const ChildSignUp = () => {
const navigator = useNavigate();
const params = useParams();
const history = useHistory();
const [submit, setSubmit] = useState(false);
const [loaded, setLoaded] = useState(false);
@ -35,11 +37,11 @@ const ChildSignUp = (props) => {
useEffect( async ()=>{
await axios.get('/api/children/checkRegisterMain', {params:{token: props.match.params.token}})
await axios.get('/api/children/checkRegisterMain', {params:{token: params?.token}})
.then(response=>{
switch(response.data.status_code){
case 200: setLoaded(true); setIdentity(response.data.params.tel); break;
case 400: history.push({pathname: '/c-account/login', state: ''}); break;
case 400: navigator('/c-account/login', {state: ''}); break;
};
})
},[])
@ -69,15 +71,15 @@ const ChildSignUp = (props) => {
formdata.append('company', company);
formdata.append('image', image);
formdata.append('terms', check_terms);
formdata.append('token', props.match.params.token);
formdata.append('token', params?.token);
await axios.post('/api/children/registerMain', formdata)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: history.push({pathname: '/c-account/register/complete/'+props.match.params.token, state: response.data.success_messages}); break;
case 400: history.push({pathname: '/c-account/register/error/'+props.match.params.token, state: response.data.error_messages}); break;
case 200: navigator('/c-account/register/complete/'+ params?.token, {state: response.data.success_messages}); break;
case 400: navigator('/c-account/register/error/' + params?.token, {state: response.data.error_messages}); break;
case 422: {
window.scrollTo(0, 0);
set422Errors(response.data.error_messages);
@ -213,7 +215,7 @@ const ChildSignUp = (props) => {
checked={check_terms}
/>
<span className='lbl padding-16'>
<a href="/terms" target='_blank' className='term-link' rel="noopener noreferrer">規約</a>
<Link to="/terms" className='term-link' rel="noopener noreferrer">規約</Link>
に同意する
</span>
</label>

ファイルの表示

@ -1,55 +0,0 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Side from './side';
import Meeting from './meeting';
import MeetingDetail from './meeting/detail';
import Parent from './parent';
import ParentDetail from './parent/detail';
import Profile from './profile';
import ProfileEdit from './profile/edit';
import ProfilePasswordEdit from './profile/password_edit';
import ProfileWithdrawal from './profile/withdrawal';
import Search from './search';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import PageChangeHandler from '../component/page_change_handler';
import ScrollToTop from '../component/scroll_top';
export default class ChildApp extends Component {
render() {
return (
<main className="l-container meeting-consent">
<BrowserRouter>
<PageChangeHandler />
<ScrollToTop />
<Switch>
<Route exact path="/c-account/meeting" component = {Meeting} />
<Route exact path="/c-account/meeting/detail/:meeting_id" component = {MeetingDetail} />
<Route exact path="/c-account/search" component = {Search} />
<Route exact path="/c-account/parent" component = {Parent} />
<Route exact path="/c-account/parent/detail/:father_id" component = {ParentDetail} />
<Route exact path="/c-account/profile" component = {Profile} />
<Route exact path="/c-account/profile/edit/:child_id" component = {ProfileEdit} />
<Route exact path="/c-account/profile/password-edit/:child_id" component = {ProfilePasswordEdit} />
<Route exact path="/c-account/profile/withdrawal" component = {ProfileWithdrawal} />
</Switch>
<Side />
</BrowserRouter>
</main>
);
}
}
if(document.getElementById('c-app')){
ReactDOM.render(
<ChildApp />,
document.getElementById('c-app')
)
}

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link, useHistory } from 'react-router-dom';
import { Link, useNavigate, useParams} from 'react-router-dom';
import Notification from '../../component/notification';
import moment from 'moment';
@ -10,9 +10,11 @@ import ModalConfirm from '../../component/modal_confirm';
import Thumbnail from '../../component/thumbnail';
import PageLoader from '../../component/page_loader';
const MeetingDetail = (props) => {
const ChildMeetingDetail = () => {
const navigator = useNavigate();
const params = useParams(); //meeting/detail/:meeting_id
const history = useHistory();
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -36,7 +38,7 @@ const MeetingDetail = (props) => {
isMountedRef.current = false;
setLoaded(false);
await axios.get(`/api/children/meetings/detail/${props.match.params?.meeting_id}`, {params:{child_id: child_id}})
await axios.get(`/api/children/meetings/detail/${params.meeting_id}`, {params:{child_id: child_id}})
.then(response => {
setLoaded(true);
setNotice(response.data.notice);
@ -67,7 +69,7 @@ const MeetingDetail = (props) => {
setSubmit(true);
const formdata = new FormData();
formdata.append('child_id', child_id);
formdata.append('meeting_id', props.match.params.meeting_id);
formdata.append('meeting_id', params.meeting_id);
await axios.post('/api/children/meeting/approvals/registerApproval', formdata)
.then(response => {
@ -202,9 +204,7 @@ const MeetingDetail = (props) => {
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/c-account/meeting"
});
navigator('/c-account/meeting')
}}>
{_404error}
</Alert>
@ -216,4 +216,4 @@ const MeetingDetail = (props) => {
export default MeetingDetail;
export default ChildMeetingDetail;

ファイルの表示

@ -10,7 +10,7 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Meeting = () => {
const ChildMeetings = () => {
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -248,4 +248,4 @@ const Meeting = () => {
export default Meeting;
export default ChildMeetings;

ファイルの表示

@ -1,13 +1,15 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
const ParentDetail = (props) => {
const ChildParentDetail = () => {
const navigator = useNavigate();
const params = useParams();
const history = useHistory();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [loaded, setLoaded] = useState(false);
const [parent, setParent] = useState(null);
@ -21,7 +23,7 @@ const ParentDetail = (props) => {
useEffect( async () => {
isMountedRef.current = false;
setLoaded(false);
await axios.get('/api/children/fathers/detail/'+props.match.params.father_id)
await axios.get('/api/children/fathers/detail/'+ params?.father_id)
.then(response => {
setLoaded(true);
setNotice(response.data.notice);
@ -99,9 +101,7 @@ const ParentDetail = (props) => {
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _404error &&
<Alert type="fail" hide={()=>{
history.push({
pathname: "/c-account/parent"
});
navigator('/c-account/parent');
}}>
{_404error}
</Alert>
@ -115,4 +115,4 @@ const ParentDetail = (props) => {
export default ParentDetail;
export default ChildParentDetail;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { Link } from 'react-router-dom';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
@ -9,9 +9,8 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Parent = () => {
const ChildParents = () => {
const history = useHistory();
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -122,4 +121,4 @@ const Parent = () => {
export default Parent;
export default ChildParents;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
@ -7,9 +7,10 @@ import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
const ProfileEdit = () => {
const ChildProfileEdit = () => {
const navigator = useNavigate();
const history = useHistory();
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -104,9 +105,7 @@ const ProfileEdit = () => {
setNotice(response.data.notice);
switch(response.data.status_code){
case 200: {
history.push({
pathname: "/c-account/profile",
state: response.data.success_messages});
navigator('/c-account/profile', { state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -220,9 +219,7 @@ const ProfileEdit = () => {
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _404error &&
<Alert type="fail" hide={()=>{
history.push({
pathname: "/c-account/profile"
});
navigator('/c-account/profile');
}}>
{_404error}
</Alert>
@ -235,4 +232,4 @@ const ProfileEdit = () => {
}
export default ProfileEdit;
export default ChildProfileEdit;

ファイルの表示

@ -1,31 +1,33 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
import { useCookies } from 'react-cookie';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
import Notification from '../../component/notification';
import copy from 'clipboard-copy';
const Profile = (props) => {
const ChildProfileDetail = () => {
const location = useLocation();
const [cookies, setCookie] = useCookies(['user']);
const history = useHistory();
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [image, setImage] = useState('');
const [image, setImage] = useState('');
const [profile, setProfile] = useState(null)
const [loaded, setLoaded] = useState(false);
const [_400error, set400Error] = useState('');
const [_404error, set404Error] = useState('');
const [_422errors, set422Errors] = useState({ image: '' });
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [submit_image, setSubmitImage] = useState(false);
const isMountedRef = useRef(true);
useEffect( async () => {
isMountedRef.current = false;
setLoaded(false);
@ -58,9 +60,10 @@ const Profile = (props) => {
const handleLogout = async () => {
await axios.get('/c-account/logout')
.then(() => {
location.href = '/c-account/login';
})
.then(() => {
setCookie('logged', null);
window.location.href = '/c-account/login';
})
}
const handleImageChange = (e) => {
@ -84,18 +87,12 @@ const Profile = (props) => {
}
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
}
}
});
};
};
const handleID = () => {
const lineText = `${profile.last_name}%20${profile.first_name}さんがIDを共有しました。%0AIDはこちら%0A%0A${profile.identity}%0A%0AIDをコピーしてメンバー追加してください。%0A%0AKIKI運営事務局`;
copy(lineText);
window.open('http://line.me/R/msg/text/?'+lineText);
}
return (
<div className="l-content">
<div className="l-content-w560">
@ -123,13 +120,13 @@ const Profile = (props) => {
<PhotoCameraOutlinedIcon style={{width:'25px', height:'25px', color:'black'}}/>
</IconButton>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
<img src={image} className="avatar-img" alt="avatar-img"/>
</div>
{
_422errors.image &&
<span className="l-alert__text--error ft-16 ft-md-14">
{_422errors.image}
</span>
</span>
}
</div>
<p className="profile-name">{`${profile.last_name} ${profile.first_name}`}</p>
@ -139,7 +136,11 @@ const Profile = (props) => {
<img src="/assets/img/icon/ID.svg" alt="ID"/>
</p>
<p className="txt">{profile.identity}</p>
<a onClick={handleID}>IDを教える</a>
<a target='_blank'
href={'http://line.me/R/msg/text/?'+
`${profile.last_name}%20${profile.first_name}さんがIDを共有しました。%0AIDはこちら%0A%0A${profile.identity}%0A%0AIDをコピーしてメンバー追加してください。%0A%0AKIKI運営事務局`}>
IDを教える
</a>
</div>
<div className="profile-info__item">
<a href={`mailto:${profile.email}`}>
@ -164,21 +165,37 @@ const Profile = (props) => {
<p className="txt">{profile.company ? profile.company: '未入力'}</p>
</div>
</div>
<div className="p-profile-btn">
<Link to={`/c-account/profile/edit/${child_id}`}
<Link to={`/c-account/profile/edit/${child_id}`}
className="btn-default btn-yellow btn-profile btn-r8 btn-h52">
<span className="ft-xs-16">プロフィールを変更する</span>
</Link>
</div>
<div className="p-profile-btn">
<Link to={`/c-account/profile/password-edit/${child_id}`}
className="btn-default btn-yellow btn-password btn-r8 btn-h52">
<span className="ft-xs-16">パスワードを変更する</span>
</Link>
</div>
<div className="p-profile-txtLink">
<Link to="/terms"
className="btn-default btn-password btn-r8 btn-h30"
>
<span className="ft-xs-16">利用規約</span>
</Link>
</div>
<div className="p-profile-txtLink">
<Link to="/privacy-policy"
className="btn-default btn-password btn-r8 btn-h30"
>
<span className="ft-xs-16">プライバシーポリシー</span>
</Link>
</div>
<div className="p-profile-txtLink">
<a className="btn-default btn-password btn-r8 btn-h30"
onClick={handleLogout}
@ -198,21 +215,19 @@ const Profile = (props) => {
}
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _404error &&
{ _404error &&
<Alert type="fail" hide={()=>{
history.push({
pathname: "/c-account/profile"
});
navigator('/c-account/profile')
}}>
{_404error}
</Alert>
}
</section>
</section>
</div>
</div>
</div>
</div>
)
}
export default Profile;
export default ChildProfileDetail;

ファイルの表示

@ -1,14 +1,15 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
const ProfilePasswordEdit = () => {
const ChildProfilePasswordEdit = () => {
const navigator = useNavigate();
const history = useHistory();
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -42,9 +43,7 @@ const ProfilePasswordEdit = () => {
setNotice(response.data.notice);
switch(response.data.status_code){
case 200: {
history.push({
pathname: "/c-account/profile",
state: response.data.success_messages});
navigator('/c-account/profile', { state: response.data.success_messages });
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -117,4 +116,4 @@ const ProfilePasswordEdit = () => {
}
export default ProfilePasswordEdit;
export default ChildProfilePasswordEdit;

ファイルの表示

@ -4,7 +4,7 @@ import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
const ProfileWithdrawal = () => {
const ChildProfileWithdrawal = () => {
const child_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -65,4 +65,4 @@ const ProfileWithdrawal = () => {
}
export default ProfileWithdrawal;
export default ChildProfileWithdrawal;

ファイルの表示

@ -12,7 +12,7 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Search = () => {
const ChildSearch = () => {
const [keyword, setKeyword] = useState('');
const [tab_status, setTabStatus] = useState(false);
const [meeting_list_non_approval, setMettingListNonApproval] = useState([]);
@ -246,4 +246,4 @@ const Search = () => {
)
}
export default Search;
export default ChildSearch;

ファイルの表示

@ -1,17 +1,19 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom'
import { Link } from 'react-router-dom';
import { useCookies } from 'react-cookie';
export default function Side() {
export default function ChildSide() {
const [selected, setSelected] = useState('');
const [cookies, setCookie] = useCookies(['user']);
const child_img = document.getElementById('child_image').value;
const handleLogout = async () => {
await axios.get('/c-account/logout')
.then(() => {
location.href = '/c-account/login';
})
.then(() => {
setCookie('logged', null);
window.location.href = '/c-account/login';
})
}
const handleSelected = (id) => {

ファイルの表示

@ -14,7 +14,7 @@ const Transition = React.forwardRef(function Transition(props, ref) {
});
export default function ModalSettingNotify({show, handleClose, meetingId}){
export default function ModalSettingNotify({show, handleClose, meetingId, handleLoadedChildren}){
const [unapproval, setUnapproval ] = useState([]);
const [approval, setApproval ] = useState([]);
@ -25,41 +25,56 @@ export default function ModalSettingNotify({show, handleClose, meetingId}){
const [loaded2, setLoaded2] = useState(false);
const [loaded, setLoaded] = useState(false);
const isMountedRef = useRef(true);
const isMountedRef = useRef(false);
useEffect( async () => {
isMountedRef.current = false;
isMountedRef.current = true;
let mounted = true;
const source = axios.CancelToken.source()
const controller = new AbortController();
const signal = controller.signal;
setLoaded1(false);
await axios.get('/api/fathers/meeting/approvals/listChildrenOfApprovel', {params: { meeting_id: meetingId }})
await axios.get('/api/fathers/meeting/approvals/listChildrenOfApprovel', {params: { meeting_id: meetingId }}, {cancelToken: source.token}, { signal: signal })
.then((response) => {
setLoaded1(true);
if(response.data.status_code==200){
setApproval(response.data.params);
}
});
setLoaded2(false);
await axios.get('/api/fathers/meeting/approvals/listChildrenOfUnapprovel', {params: { meeting_id: meetingId }})
.then((response) => {
setLoaded2(true);
if(response.data.status_code==200){
setUnapproval(response.data.params);
if(mounted){
setLoaded1(true);
if(response.data.status_code==200){
setApproval(response.data.params);
}
}
});
setLoaded2(false);
await axios.get('/api/fathers/meeting/approvals/listChildrenOfUnapprovel', {params: { meeting_id: meetingId }}, {cancelToken: source.token}, { signal: signal })
.then((response) => {
if(mounted){
setLoaded2(true);
if(response.data.status_code==200){
setUnapproval(response.data.params);
}
}
});
return () => {
mounted = false;
source.cancel()
controller.abort();
}
}, []);
useEffect(()=>{
setLoaded(loaded1 && loaded2);
handleLoadedChildren(loaded1 && loaded2);
},[loaded1, loaded2]);
const settingNotify = async (email) => {
const formdata = new FormData();
formdata.append('email', JSON.stringify(new Array(email)));
formdata.append('meeting_id', meetingId);
await axios.post('/api/fathers/meetingNotification', formdata)
await axios.post('/api/fathers/meetingEditNotification', formdata)
.then(response=>{
switch(response.data.status_code){
case 200: setSuccess('通知に成功しました!'); break;
@ -67,7 +82,7 @@ export default function ModalSettingNotify({show, handleClose, meetingId}){
}
})
}
return (
<Dialog
@ -86,10 +101,10 @@ export default function ModalSettingNotify({show, handleClose, meetingId}){
</DialogTitle>
<DialogContent className="position-relative">
{
!loaded &&
<CircularProgress
!loaded &&
<CircularProgress
className="modal-css-loader"
sx={{
sx={{
animationDuration: '600ms',
}}
thickness={2}
@ -99,7 +114,7 @@ export default function ModalSettingNotify({show, handleClose, meetingId}){
loaded &&
<>
<div className={ `modal-content border-0 ${!isApproval ? "is-active" : ""}` } id="item01">
{
{
unapproval.length > 0 ?
unapproval.map((item, ki) =>
<div className="modal-content-item" key={ki}>
@ -113,18 +128,18 @@ export default function ModalSettingNotify({show, handleClose, meetingId}){
</div>
<div className="p-notification-btn">
<a onClick={e => settingNotify(item.child.email)} className="btn-default btn-yellow btn-notification btn-r3 btn-h30 btn-w100p btn-fz14">
<span>通知</span>
<span>通知</span>
</a>
</div>
</div>
)
: <p className="text-center py-2 ft-xs-15">データはありません</p>
}
</div>
</div>
<div className={ `modal-content border-0 ${isApproval ? "is-active" : ""}` } id="item02">
{
{
approval.length > 0 ?
approval?.map((item, kj) =>
approval?.map((item, kj) =>
<div className="modal-content-item" key={kj}>
<div className="user-wrap">
<Link to={`/p-account/child/detail/${item.child.id}`} >

ファイルの表示

@ -1,9 +1,9 @@
import React, { useEffect } from 'react';
import { useHistory, useLocation } from 'react-router-dom';
import { useNavigate, useLocation } from 'react-router-dom';
const Notification = ({ notice }) => {
const history = useHistory();
const navigator = useNavigate();
const { pathname } = useLocation();
const handleClick = () => {
@ -11,7 +11,7 @@ const Notification = ({ notice }) => {
for(let i=0; i<navbar_list.length; i++)
navbar_list[i].classList.remove('nav-active');
document.getElementsByClassName("-meeting")[0].classList.add('nav-active');
history.push({ pathname: `/${pathname.split('/')[1]}/meeting/`, state: ''});
navigator(`/${pathname.split('/')[1]}/meeting`, {state: ''});
}
useEffect(()=>{

ファイルの表示

@ -1,9 +1,12 @@
import axios from "axios";
import { useEffect } from "react";
import { useLocation } from "react-router-dom";
import { useLocation, useNavigate } from "react-router-dom";
import { useCookies } from 'react-cookie';
export default function PageChangeHandler() {
const { pathname } = useLocation();
const navigator = useNavigate();
const [cookies, setCookie] = useCookies(['user']);
useEffect(() => {
loginAccountCheck();
@ -11,9 +14,12 @@ export default function PageChangeHandler() {
const loginAccountCheck = () => {
let acc = pathname.split('/')[1];
if(localStorage.getItem('kiki_acc_type') && (acc != localStorage.getItem('kiki_acc_type'))) {
let acc_type = localStorage.getItem('kiki_acc_type');
if((acc_type && (acc != acc_type)) || cookies.logged != 'success') {
axios.get(`/${acc}/logout`)
location.href= `/${acc}/login`;
.then(()=>{
navigator(`/${acc}/login`);
})
}
}

ファイルの表示

@ -1,10 +1,10 @@
import React, { useEffect, useState } from 'react';
import { Button } from '@material-ui/core';
import { useHistory, useLocation } from 'react-router';
import { useNavigate, useLocation } from 'react-router-dom';
const PasswordResetComplete = () => {
const history = useHistory();
const navigator = useNavigate();
const { pathname } = useLocation();
const gotoLogin = () => {
@ -12,7 +12,7 @@ const PasswordResetComplete = () => {
if(pathname.includes('c-account')) url = '/c-account/login';
else if(pathname.includes('p-account')) url = '/p-account/login';
history.push({pathname: url, state: ''});
navigator(url, { state: '' });
}
return (

ファイルの表示

@ -18,7 +18,16 @@ const PreviewPDF = ({pdf_url}) => {
return (
<div className="p-file-for" style={{ height: height, marginTop:'15px', display:'flex', alignItems:'center', justifyContent:'center' }}>
<div className="p-file-for"
style={{
height: height,
marginTop:'15px',
display:'flex',
alignItems:'center',
justifyContent:'center',
position:'relative',
overflow: 'hidden'
}}>
{
pdf_url &&
<Document file={pdf_url} loading={<></>}>

ファイルの表示

@ -1,20 +1,21 @@
import React, { useState } from 'react';
import { Button } from '@material-ui/core';
import { useHistory, useLocation } from 'react-router';
import { useNavigate, useLocation } from 'react-router-dom';
import Alert from '../alert';
const SignUpComplete = (props) => {
const SignUpComplete = () => {
const history = useHistory();
const { pathname } = useLocation();
const [_success, setSuccess] = useState(props.history.location.state);
const navigator = useNavigate();
const { pathname, state } = useLocation();
const [_success, setSuccess] = useState(state);
const gotoLogin = () => {
var url;
if(pathname.includes('c-account')) url = '/c-account/login';
else if(pathname.includes('p-account')) url = '/p-account/login';
history.push({pathname: url, state: ''});
navigator(url, {state: ''});
}
return (

ファイルの表示

@ -1,8 +1,10 @@
import React, { useState } from 'react';
import { useLocation } from 'react-router-dom';
import Alert from '../alert';
const SignUpError = (props) => {
const [_400error, set400Error] = useState(props.history.location.state);
const SignUpError = () => {
const [_400error, set400Error] = useState(useLocation().state);
return (
<div className="l-single-container">
<div className="l-single-inner">

25
backend/resources/js/index.js vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,25 @@
import ReactDOM from 'react-dom';
import { BrowserRouter, useRoutes } from 'react-router-dom';
import { CookiesProvider } from "react-cookie";
import routes from './routes';
import ScrollToTop from './component/scroll_top';
const KIKIAPP = () => {
const routing = useRoutes(routes);
return routing;
};
if(document.getElementById('root')){
ReactDOM.render((
<CookiesProvider>
<BrowserRouter>
<ScrollToTop />
<KIKIAPP />
</BrowserRouter>
</CookiesProvider>
), document.getElementById('root'));
}

15
backend/resources/js/layout/DashboardLayout.js vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,15 @@
import { Outlet } from 'react-router-dom';
import PageChangeHandler from '../component/page_change_handler';
const DashboardLayout = ({side}) => {
return (
<main className="l-container meeting-consent">
<PageChangeHandler />
<Outlet />
{side}
</main>
);
};
export default DashboardLayout;

16
backend/resources/js/layout/MainLayout.js vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,16 @@
import { Outlet } from 'react-router-dom';
const MainLayout = () => {
return (
<main className="l-single-main">
<div className="l-centeringbox">
<div className="l-centeringbox-wrap">
<Outlet />
</div>
</div>
</main>
);
};
export default MainLayout;

ファイルの表示

@ -15,7 +15,8 @@ const ContactComplete = () => {
}
return (
<div>
<div className="l-single-container">
<div className="l-single-inner">
<p className="text-center font-weight-bold ft-25">お問い合わせ完了</p>
<span className="mt-80-px ft-16 ft-md-16 l-alert__text--success">
お問い合わせが完了しました<br/>
@ -23,8 +24,8 @@ const ContactComplete = () => {
万が一届かない場合は以下のメールアドレスに 直接ご連絡くださいませ
</span>
<div className="p-4 my-5 border text-center font-weight-bold">
<p className="m-0 scale-1 pointer ft-xs-18" onClick={saveStorage}>{contactEmail}</p>
<div className="clip-copy" onClick={saveStorage}>
<a>{contactEmail}</a>
</div>
<div className="d-flex justify-content-between">
@ -41,6 +42,7 @@ const ContactComplete = () => {
</div>
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
</div>
</div>
)
}

ファイルの表示

@ -1,12 +1,12 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
const Contact = () => {
const history = useHistory();
const navigator = useNavigate();
const [email, setEmail] = useState('');
const [message, setMessage] = useState('');
@ -27,7 +27,7 @@ const Contact = () => {
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: history.push({pathname: '/contact-us/complete', state: {}}); break;
case 200: navigator('/contact-us/complete', { state: '' }); break;
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
};
@ -37,33 +37,37 @@ const Contact = () => {
return (
<form onSubmit={handleSubmit} className="edit-form">
<p className="text-center font-weight-bold ft-25">お問い合わせ</p>
<div className="edit-set">
<label htmlFor="email" className="control-label ft-md-12">メールアドレス</label>
<input type="email" name="email" id="email" className={`input-default input-h60 ${ _422errors.email && "is-invalid c-input__target" } `} value={email} onChange={e=>setEmail(e.target.value)} autoFocus/>
{
_422errors.email &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.email}</span>
}
</div>
<div className="l-single-container">
<div className="l-single-inner">
<form onSubmit={handleSubmit} className="edit-form">
<p className="text-center font-weight-bold ft-25">お問い合わせ</p>
<div className="edit-set">
<label htmlFor="email" className="control-label ft-md-12">メールアドレス</label>
<input type="email" name="email" id="email" className={`input-default input-h60 ${ _422errors.email && "is-invalid c-input__target" } `} value={email} onChange={e=>setEmail(e.target.value)} autoFocus/>
{
_422errors.email &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.email}</span>
}
</div>
<div className="edit-set">
<label htmlFor="message" className="control-label ft-md-12"> お問合せ内容 </label>
<textarea name="message" id="message" rows="7" className={`input-default h-auto ${ _422errors.message && "is-invalid c-input__target" } `} value={message} onChange={e=>setMessage(e.target.value)}/>
{
_422errors.message &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.message}</span>
}
</div>
<LoadingButton
type="submit" fullWidth
loading={submit}
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>送信</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
</form>
<div className="edit-set">
<label htmlFor="message" className="control-label ft-md-12"> お問合せ内容 </label>
<textarea name="message" id="message" rows="7" className={`input-default h-auto ${ _422errors.message && "is-invalid c-input__target" } `} value={message} onChange={e=>setMessage(e.target.value)}/>
{
_422errors.message &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.message}</span>
}
</div>
<LoadingButton
type="submit" fullWidth
loading={submit}
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>送信</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
</form>
</div>
</div>
)
}

ファイルの表示

@ -1,12 +1,13 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../component/alert';
const UnknownError = () => {
const history = useHistory();
const navigator = useNavigate();
const [email, setEmail] = useState('');
const [message, setMessage] = useState('');
const [submit, setSubmit] = useState(false);
@ -26,7 +27,7 @@ const UnknownError = () => {
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: history.push({pathname: '/contact-us/complete', state: {}}); break;
case 200: navigator('/contact-us/complete', {state: ''}); break;
case 422: set422Errors(response.data.error_messages); break;
case 400: set400Error(response.data.error_messages); break;
};
@ -37,39 +38,43 @@ const UnknownError = () => {
return (
<form onSubmit={handleSubmit} className="edit-form">
<p className="text-center font-weight-bold ft-25">不明なエラー</p>
<div className="l-single-container">
<div className="l-single-inner">
<form onSubmit={handleSubmit} className="edit-form">
<p className="text-center font-weight-bold ft-25">不明なエラー</p>
<span className="mb-4 mt-70-px l-alert__text--error ft-18 ft-md-16 ">
不明なエラーが発生しました<br/>
お手数ですが以下から詳細をお問い合わせくださ いませ
</span>
<div className="edit-set">
<label htmlFor="email" className="control-label">メールアドレス</label>
<input type="email" name="email" id="email" className={`input-default input-h60 ${ _422errors.email && "is-invalid c-input__target" } `} value={email} onChange={e=>setEmail(e.target.value)} autoFocus/>
{
_422errors.email &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.email}</span>
}
</div>
<span className="mb-4 mt-70-px l-alert__text--error ft-18 ft-md-16 ">
不明なエラーが発生しました<br/>
お手数ですが以下から詳細をお問い合わせくださ いませ
</span>
<div className="edit-set">
<label htmlFor="email" className="control-label">メールアドレス</label>
<input type="email" name="email" id="email" className={`input-default input-h60 ${ _422errors.email && "is-invalid c-input__target" } `} value={email} onChange={e=>setEmail(e.target.value)} autoFocus/>
{
_422errors.email &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.email}</span>
}
</div>
<div className="edit-set">
<label htmlFor="message" className="control-label"> お問合せ内容 </label>
<textarea name="message" id="message" rows="7" className={`input-default h-auto ${ _422errors.message && "is-invalid c-input__target" } `} value={message} onChange={e=>setMessage(e.target.value)}/>
{
_422errors.message &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.message}</span>
}
</div>
<div className="edit-set">
<label htmlFor="message" className="control-label"> お問合せ内容 </label>
<textarea name="message" id="message" rows="7" className={`input-default h-auto ${ _422errors.message && "is-invalid c-input__target" } `} value={message} onChange={e=>setMessage(e.target.value)}/>
{
_422errors.message &&
<span className="l-alert__text--error ft-16 ft-md-14">{_422errors.message}</span>
}
</div>
<LoadingButton
type="submit" fullWidth
loading={submit}
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>送信</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
</form>
<LoadingButton
type="submit" fullWidth
loading={submit}
className="btn-edit btn-default btn-h75 bg-yellow rounded-20">
<span className={`ft-18 ft-xs-16 font-weight-bold ${!submit && 'text-black'}`}>送信</span>
</LoadingButton>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
</form>
</div>
</div>
)
}

ファイルの表示

@ -1,31 +0,0 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Contact from './contact/index';
import ContactComplete from './contact/complete';
import UnknownError from './contact/unknown';
import PageChangeHandler from '../component/page_change_handler';
import { BrowserRouter, Route, Switch } from 'react-router-dom'
export default class Pages extends Component {
render() {
return (
<BrowserRouter>
<PageChangeHandler/>
<Switch>
<Route exact path='/contact-us' component={Contact} />
<Route exact path='/contact-us/complete' component={ContactComplete} />
<Route exact path='/unknown-error' component={UnknownError} />
</Switch>
</BrowserRouter>
);
}
}
if(document.getElementById('contact')){
ReactDOM.render(
<Pages />,
document.getElementById('contact')
)
}

99
backend/resources/js/pages/privacy-policy.jsx ノーマルファイル
ファイルの表示

@ -0,0 +1,99 @@
import React from 'react';
const PrivacyPolicy = () => {
return (
<div className="l-single-container term-wrap">
<p className="text-center font-weight-bold ft-22 mt-5">プライバシーポリシー</p>
<p className="text-center text-gray font-weight-bold mb-5">Privacy Policy</p>
株式会社ZOTMAN以下当社といいます本ウェブサイト上で提供するサービス以下,本サービスといいますにおけるプライバシー情報の取扱いについて以下のとおりプライバシーポリシー以下本ポリシーといいますを定めます
<p className="ttl">第1条プライバシー情報</p>
<ul>
<li>プライバシー情報のうち個人情報とは個人情報保護法にいう個人情報を指すものとし生存する個人に関する情報であって当該情報に含まれる氏名生年月日住所電話番号連絡先その他の記述等により特定の個人を識別できる情報を指します</li>
<li>プライバシー情報のうち履歴情報および特性情報とは上記に定める個人情報以外のものをいいご利用いただいたサービスやご購入いただいた商品ご覧になったページや広告の履歴会員が検索された検索キーワードご利用日時ご利用の方法ご利用環境郵便番号や性別職業年齢会員のIPアドレスクッキー情報位置情報端末の個体識別情報などを指します</li>
</ul>
<p className="ttl">第2条プライバシー情報の収集方法</p>
<ul>
<li>当社は会員が利用登録をする際に氏名生年月日住所電話番号メールアドレス銀行口座番号クレジットカード番号運転免許証番号などの個人情報をお尋ねすることがありますまた会員と提携先などとの間でなされた会員の個人情報を含む取引記録や決済に関する情報を当社の提携先情報提供元広告主広告配信先などを含みます以下提携先といいますなどから収集することがあります</li>
<li>当社は会員について利用したサービスやソフトウエア購入した商品閲覧したページや広告の履歴検索した検索キーワード利用日時利用方法利用環境携帯端末を通じてご利用の場合の当該端末の通信状態利用に際しての各種設定情報なども含みますIPアドレスクッキー情報位置情報端末の個体識別情報などの履歴情報および特性情報を会員が当社や提携先のサービスを利用しまたはページを閲覧する際に収集します</li>
</ul>
<p className="ttl">第3条個人情報を収集利用する目的</p>
<p>当社が個人情報を収集利用する目的は以下のとおりです</p>
<ul>
<li>会員に自分の登録情報の閲覧や修正利用状況の閲覧を行っていただくために氏名住所連絡先支払方法などの登録情報利用されたサービスや購入された商品およびそれらの代金などに関する情報を表示する目的</li>
<li>会員にお知らせや連絡をするためにメールアドレスを利用する場合や会員に商品を送付したり必要に応じて連絡したりするため氏名や住所などの連絡先情報を利用する目的</li>
<li>会員の本人確認を行うために氏名生年月日住所電話番号銀行口座番号クレジットカード番号運転免許証番号配達証明付き郵便の到達結果などの情報を利用する目的</li>
<li>会員に代金を請求するために購入された商品名や数量利用されたサービスの種類や期間回数請求金額氏名住所銀行口座番号やクレジットカード番号などの支払に関する情報などを利用する目的</li>
<li>会員が簡便にデータを入力できるようにするために当社に登録されている情報を入力画面に表示させたり会員のご指示に基づいて他のサービスなど提携先が提供するものも含みますに転送したりする目的</li>
<li>代金の支払を遅滞したり第三者に損害を発生させたりするなど本サービスの利用規約に違反した会員や不正不当な目的でサービスを利用しようとする会員の利用をお断りするために利用態様氏名や住所など個人を特定するための情報を利用する目的</li>
<li>会員からのお問い合わせに対応するためにお問い合わせ内容や代金の請求に関する情報など当社が会員に対してサービスを提供するにあたって必要となる情報や会員のサービス利用状況連絡先情報などを利用する目的</li>
<li>上記の利用目的に付随する目的</li>
</ul>
<p className="ttl">第4条個人情報の第三者提供</p>
<ul>
<li>当社は次に掲げる場合を除いてあらかじめ会員の同意を得ることなく第三者に個人情報を提供することはありませんただし個人情報保護法その他の法令で認められる場合を除きます
<ul>
<li>法令に基づく場合</li>
<li>人の生命身体または財産の保護のために必要がある場合であって本人の同意を得ることが困難であるとき</li>
<li>公衆衛生の向上または児童の健全な育成の推進のために特に必要がある場合であって本人の同意を得ることが困難であるとき</li>
<li>国の機関もしくは地方公共団体またはその委託を受けた者が法令の定める事務を遂行することに対して協力する必要がある場合であって本人の同意を得ることにより当該事務の遂行に支障を及ぼすおそれがあるとき</li>
<li>予め次の事項を告知あるいは公表をしている場合
<ul>
<li>利用目的に第三者への提供を含むこと</li>
<li>第三者に提供されるデータの項目</li>
<li>第三者への提供の手段または方法</li>
<li>本人の求めに応じて個人情報の第三者への提供を停止すること</li>
</ul>
</li>
</ul>
</li>
<li>前項の定めにかかわらず次に掲げる場合は第三者には該当しないものとします
<ul>
<li>当社が利用目的の達成に必要な範囲内において個人情報の取扱いの全部または一部を委託する場合</li>
<li>合併その他の事由による事業の承継に伴って個人情報が提供される場合</li>
<li>個人情報を特定の者との間で共同して利用する場合であってその旨並びに共同して利用される個人情報の項目共同して利用する者の範囲利用する者の利用目的および当該個人情報の管理について責任を有する者の氏名または名称についてあらかじめ本人に通知しまたは本人が容易に知り得る状態に置いているとき</li>
</ul>
</li>
</ul>
<p className="ttl">第5条個人情報の開示</p>
<ul>
<li>当社は本人から個人情報の開示を求められたときは本人に対し遅滞なくこれを開示しますただし開示することにより次のいずれかに該当する場合はその全部または一部を開示しないこともあり開示しない決定をした場合にはその旨を遅滞なく通知しますなお個人情報の開示に際しては件あたり100,000円の手数料を申し受けます
<ul>
<li>本人または第三者の生命身体財産その他の権利利益を害するおそれがある場合</li>
<li>当社の業務の適正な実施に著しい支障を及ぼすおそれがある場合</li>
<li>その他法令に違反することとなる場合</li>
</ul>
</li>
<li>前項の定めにかかわらず履歴情報および特性情報などの個人情報以外の情報については原則として開示いたしません</li>
</ul>
<p className="ttl">第6条個人情報の訂正および削除</p>
<ul>
<li>会員は当社の保有する自己の個人情報が誤った情報である場合には当社が定める手続きにより当社に対して個人情報の訂正または削除を請求することができます</li>
<li>当社は会員から前項の請求を受けてその請求に応じる必要があると判断した場合には遅滞なく当該個人情報の訂正または削除を行いこれを会員に通知します</li>
</ul>
<p className="ttl">第7条個人情報の利用停止等</p>
<p>囲を超えて取り扱われているという理由または不正の手段により取得されたものであるという理由によりその利用の停止または消去以下利用停止等といいますを求められた場合には遅滞なく必要な調査を行いその結果に基づき個人情報の利用停止等を行いその旨本人に通知しますただし個人情報の利用停止等に多額の費用を有する場合その他利用停止等を行うことが困難な場合であって本人の権利利益を保護するために必要なこれに代わるべき措置をとれる場合はこの代替策を講じます</p>
<p className="ttl">第8条プライバシーポリシーの変更</p>
<ul>
<li>本ポリシーの内容は会員に通知することなく変更することができるものとします</li>
<li>当社が別途定める場合を除いて変更後のプライバシーポリシーは本ウェブサイトに掲載したときから効力を生じるものとします</li>
</ul>
<p className="ttl">第9条お問い合わせ窓口</p>
<p>本ポリシーに関するお問い合わせは下記の窓口までお願いいたします<br/><br/>Eメールアドレス<b><a href='mailto:56@zotman.jp'>56@zotman.jp</a></b></p>
</div>
)
}
export default PrivacyPolicy;

137
backend/resources/js/pages/terms.jsx ノーマルファイル
ファイルの表示

@ -0,0 +1,137 @@
import React from 'react';
const Terms = () => {
return (
<div className="l-single-container term-wrap">
<p className="text-center font-weight-bold ft-22 mt-5">利用規約</p>
<p className="text-center text-gray font-weight-bold mb-5">Terms of service</p>
この利用規約以下本規約といいます株式会社ZOTMAN以下当社といいますがこのサイト上で提供するサービス以下本サービスといいますの利用条件を定めるものです登録会員の皆さま以下会員といいますには本規約に従って本サービスをご利用いただきます
<p className="ttl">第1条適用</p>
<p>本規約は加盟店及び会員と当社との間の本サービスの利用に関わる一切の関係に適用されるものとします</p>
<p className="ttl">第2条利用登録</p>
<ul>
<li>登録希望者が当社の定める方法によって利用登録を申請し当社がこれを承認することによって利用登録が完了するものとします</li>
<li>当社は利用登録の申請者に以下の事由があると判断した場合利用登録の申請を承認しないことがありその理由については一切の開示義務を負わないものとします
<ul>
<li>利用登録の申請に際して虚偽の事項を届け出た場合</li>
<li>本規約に違反したことがある者からの申請である場合</li>
<li>未成年者成年被後見人被保佐人または被補助人のいずれかであり法定代理人後見人保佐人または補助人の同意等を得ていなかった場合</li>
<li>反社会的勢力等暴力団暴力団員右翼団体反社会的勢力その他これに準ずる者を意味しますであるまたは資金提供その他を通じて反社会的勢力等の維持運営もしくは経営に協力もしくは関与する等反社会的勢力との何らかの交流もしくは関与を行っていると当社が判断した場合</li>
<li>その他当社が利用登録を相当でないと判断した場合</li>
</ul>
</li>
</ul>
<p className="ttl">第3条会員IDおよびパスワードの管理</p>
<ul>
<li>加盟店及び会員は自己の責任において本サービスの会員IDおよびパスワードを管理するものとします</li>
<li>加盟店及び会員はいかなる場合にも会員IDおよびパスワードを第三者に譲渡または貸与することはできません当社は加盟店及び会員IDとパスワードの組み合わせが登録情報と一致してログインされた場合にはその会員IDを登録している会員自身による利用とみなします</li>
</ul>
<p className="ttl">第4条利用料金および支払返金方法</p>
<ul>
<li>加盟店及び会員は本サービス利用の対価として当社が別途定め本サービスに表示する利用料金を当社が指定する方法により支払うものとします</li>
<li>加盟店が利用料金の支払を遅滞した場合には加盟店は年146の割合による遅延損害金を支払うものとします</li>
<li>運営者からの返金はいかなる理由であろうと不可とする</li>
<li>退会や広告掲載の終了をユーザーから申請がない限り自動更新され以降課金は継続されます</li>
<li>広告掲載期間未満で広告契約の終了を申し出た場合は残りの掲載期間月の掲載料金を一括で課金することにより掲載を終了できます</li>
</ul>
<p className="ttl">第5条禁止事項</p>
<p>加盟店及び会員は本サービスの利用にあたり以下の行為をしてはなりません</p>
<ul>
<li>法令または公序良俗に違反する行為</li>
<li>犯罪行為に関連する行為</li>
<li>当社のサーバーまたはネットワークの機能を破壊したり妨害したりする行為</li>
<li>当社のサービスの運営を妨害するおそれのある行為</li>
<li>他の会員に関する個人情報等を収集または蓄積する行為</li>
<li>他の会員に成りすます行為</li>
<li>当社のサービスに関連して反社会的勢力に対して直接または間接に利益を供与する行為</li>
<li>当社本サービスの他の利用者または第三者の知的財産権肖像権プライバシー名誉その他の権利または利益を侵害する行為</li>
<li>過度に暴力的な表現露骨な性的表現人種国籍信条性別社会的身分門地等による差別につながる表現自殺自傷行為薬物乱用を誘引または助長する表現その他反社会的な内容を含み他人に不快感を与える表現を投稿または送信する行為</li>
<li>営業宣伝広告勧誘その他営利を目的とする行為当社の認めたものを除きます性行為やわいせつな行為を目的とする行為面識のない異性との出会いや交際を目的とする行為他のお客様に対する嫌がらせや誹謗中傷を目的とする行為その他本サービスが予定している利用目的と異なる目的で本サービスを利用する行為</li>
<li>宗教活動または宗教団体への勧誘行為</li>
<li>その他当社が不適切と判断する行為</li>
</ul>
<p className="ttl">第6条本サービスの提供の停止等</p>
<ul>
<li>法令または公当社は以下のいずれかの事由があると判断した場合加盟店及び会員に事前に通知することなく本サービスの全部または一部の提供を停止または中断することができるものとします序良俗に違反する行為
<ul>
<li>本サービスにかかるコンピュータシステムの保守点検または更新を行う場合</li>
<li>地震落雷火災停電または天災などの不可抗力により本サービスの提供が困難となった場合</li>
<li>コンピュータまたは通信回線等が事故により停止した場合</li>
<li>その他当社が本サービスの提供が困難と判断した場合</li>
</ul>
</li>
<li>当社は本サービスの提供の停止または中断により会員または第三者が被ったいかなる不利益または損害について理由を問わず一切の責任を負わないものとします</li>
</ul>
<p className="ttl">第7条著作権</p>
<ul>
<li>加盟店及び会員は自ら著作権等の必要な知的財産権を有するかまたは必要な権利者の許諾を得た文章画像や映像等の情報のみ本サービスを利用し投稿または編集することができるものとします</li>
<li>加盟店と会員が本サービスを利用して投稿または編集した文章画像映像等の著作権については当該会員その他既存の権利者に留保されるものとしますただし当社は本サービスを利用して投稿または編集された文章画像映像等を利用できるものとし加盟店及び会員はこの利用に関して著作者人格権を行使しないものとします</li>
<li>前項本文の定めるものを除き本サービスおよび本サービスに関連する一切の情報についての著作権およびその他知的財産権はすべて当社または当社にその利用を許諾した権利者に帰属し加盟店及び会員は無断で複製譲渡貸与翻訳改変転載公衆送信送信可能化を含みます伝送配布出版営業使用等をしてはならないものとします</li>
</ul>
<p className="ttl">第8条利用制限および登録抹消</p>
<ul>
<li>当社は以下の場合には事前の通知なく投稿データを削除し加盟店及び会員に対して本サービスの全部もしくは一部の利用を制限しまたは加盟店及び会員の登録を抹消することができるものとします
<ul>
<li>本規約のいずれかの条項に違反した場合</li>
<li>登録事項に虚偽の事実があることが判明した場合</li>
<li>破産民事再生会社更生または特別清算の手続開始決定等の申立がなされたとき</li>
<li>1年間以上本サービスの利用がない場合</li>
<li>当社からの問い合わせその他の回答を求める連絡に対して30日間以上応答がない場合</li>
<li>第2条第2項各号に該当する場合</li>
<li>その他当社が本サービスの利用を適当でないと判断した場合</li>
</ul>
</li>
<li>項各号のいずれかに該当した場合加盟店及び会員は当然に当社に対する一切の債務について期限の利益を失いその時点において負担する一切の債務を直ちに一括して弁済しなければなりません</li>
<li>当社は本条に基づき当社が行った行為により加盟店及び会員に生じた損害について一切の責任を負いません</li>
</ul>
<p className="ttl">第9条保証の否認および免責事項</p>
<ul>
<li>当社は本サービスに事実上または法律上の瑕疵安全性信頼性正確性完全性有効性特定の目的への適合性セキュリティなどに関する欠陥エラーやバグ権利侵害などを含みますがないことを明示的にも黙示的にも保証しておりません</li>
<li>当社は本サービスに起因して加盟店及び会員に生じたあらゆる損害について一切の責任を負いませんただし本サービスに関する当社と加盟店及び会員との間の契約本規約を含みますが消費者契約法に定める消費者契約となる場合この免責規定は適用されません</li>
<li>前項ただし書に定める場合であっても当社は当社の過失による債務不履行または不法行為により加盟店及び会員に生じた損害のうち特別な事情から生じた損害当社または加盟店及び会員が損害発生につき予見しまたは予見し得た場合を含みますについて一切の責任を負いませんまた当社の過失による債務不履行または不法行為により加盟店及び会員に生じた損害の賠償は加盟店と会員から当該損害が発生した月に受領した利用料の10額を上限とします</li>
<li>当社は本サービスに関して加盟店と会員と他の加盟店及び会員または第三者との間において生じた取引連絡または紛争等について一切責任を負いません</li>
</ul>
<p className="ttl">第10条サービス内容の変更等</p>
<p>当社は会員に通知することなく本サービスの内容を変更しまたは本サービスの提供を中止することができるものとしこれによって加盟店及び会員に生じた損害について一切の責任を負いません</p>
<p className="ttl">第11条利用規約の変更</p>
<p>当社は必要と判断した場合には加盟店及び会員に通知することなくいつでも本規約を変更することができるものとします</p>
<p className="ttl">第12条通知または連絡</p>
<p>加盟店及び会員と当社との間の通知または連絡は当社の定める方法によって行うものとします</p>
<p className="ttl">第13条権利義務の譲渡の禁止</p>
<p>加盟店及び会員は当社の書面による事前の承諾なく利用契約上の地位または本規約に基づく権利もしくは義務を第三者に譲渡しまたは担保に供することはできません</p>
<p className="ttl">第14条準拠法裁判管轄</p>
<ul>
<li>本規約の解釈にあたっては日本法を準拠法とします</li>
<li>本サービスに関して紛争が生じた場合には当社の本店所在地を管轄する裁判所を専属的合意管轄とします</li>
</ul>
<p className="ttl">第15条動作環境</p>
<p>InternetExplorer111/Microsoft:Edge最新版/Google:Chrome最新版/Mozilla:Firefox最新版/Safari:最新版<br/>各メーカーによるバージョンアップ後に弊社のシステムがエラー等起きる場合がございますそれらに対しての補償は一切致しかねます</p>
<p className="mt-5 text-right">以上</p>
</div>
)
}
export default Terms;

ファイルの表示

@ -1,12 +1,14 @@
import React, { useState } from 'react';
import { useHistory } from 'react-router';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Alert from '../../../component/alert';
const ParentForgotPasswordReset = (props) => {
const ParentForgotPasswordReset = () => {
const navigator = useNavigate();
const params = useParams();
const history = useHistory();
const [submit, setSubmit] = useState(false);
const [password, setPassword] = useState('');
@ -23,7 +25,7 @@ const ParentForgotPasswordReset = (props) => {
let req = {
password: password,
password_confirmation: password_confirmation,
token: props.match.params?.token
token: params?.token
}
await axios.put('/api/fathers/updatePassword', req)
@ -31,7 +33,7 @@ const ParentForgotPasswordReset = (props) => {
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({pathname: '/p-account/forgot-password/complete', state: response.data.success_messages});
navigator('/p-account/forgot-password/complete', {state: response.data.success_messages});
break;
}
case 400: set400Error(response.data.error_messages); break;

ファイルの表示

@ -1,52 +0,0 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import ParentForgotPassword from './forgot_password';
import ParentForgotPasswordReset from './forgot_password/reset';
import ParentLogin from './login';
import ParentSignUp from './register';
import PasswordResetComplete from '../../component/password_reset_complete';
import SignUpComplete from '../../component/register/complete';
import SignUpError from '../../component/register/error';
import WithdrawalComplete from '../../component/withdrawal_complete';
import ScrollToTop from '../../component/scroll_top';
export default class ParentAuth extends Component {
render() {
return (
<main className="l-single-main">
<div className="l-centeringbox">
<div className="l-centeringbox-wrap">
<BrowserRouter>
<ScrollToTop/>
<Switch>
<Route exact path='/p-account/register/:token' component={ParentSignUp} />
<Route exact path='/p-account/register/complete/:token' component={SignUpComplete} />
<Route exact path='/p-account/register/error/:token' component={SignUpError} />
<Route exact path="/p-account/forgot-password" component = {ParentForgotPassword} />
<Route exact path="/p-account/forgot-password/reset/:token" component = {ParentForgotPasswordReset} />
<Route exact path="/p-account/forgot-password/complete" component = {PasswordResetComplete} />
<Route exact path="/p-account/login" component = {ParentLogin} />
<Route exact path="/p-account/withdrawal/complete" component = {WithdrawalComplete} />
</Switch>
</BrowserRouter>
</div>
</div>
</main>
);
}
}
// ----------------------------------------------------------------------
if(document.getElementById('p-auth')){
ReactDOM.render(
<ParentAuth />,
document.getElementById('p-auth')
)
}

ファイルの表示

@ -1,10 +1,15 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import { useCookies } from 'react-cookie';
import Alert from '../../../component/alert';
const ParentLogin = (props) => {
const ParentLogin = () => {
const [cookies, setCookie] = useCookies(['user']);
const location = useLocation();
const [submit, setSubmit] = useState(false);
@ -12,7 +17,7 @@ const ParentLogin = (props) => {
const [password, setPassword] = useState('');
const [_422errors, set422Errors] = useState({email: '', password: ''});
const [_400error, set400Error] = useState(props.history.location.state);
const [_400error, set400Error] = useState(location.state);
const handleSubmit = async (e) => {
@ -32,6 +37,7 @@ const ParentLogin = (props) => {
localStorage.setItem('kiki_login_flag', true);
localStorage.setItem('kiki_acc_type', 'p-account');
localStorage.setItem('kiki_acc_id', response.data.params.id);
setCookie('logged', 'success');
window.location.href = '/p-account/meeting';
break;
}

ファイルの表示

@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
import { useHistory } from 'react-router';
import { useNavigate, Link, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
@ -7,9 +7,11 @@ import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
import Alert from '../../../component/alert';
const ParentSignUp = (props) => {
const ParentSignUp = () => {
const navigator = useNavigate();
const params = useParams();
const history = useHistory();
const [submit, setSubmit] = useState(false);
const [loaded, setLoaded] = useState(false);
@ -34,11 +36,11 @@ const ParentSignUp = (props) => {
useEffect( async ()=>{
await axios.get('/api/fathers/checkRegisterMain', {params:{token: props.match.params.token}})
await axios.get('/api/fathers/checkRegisterMain', {params:{token: params?.token}})
.then(response=>{
switch(response.data.status_code){
case 200: setLoaded(true); break;
case 400: history.push({pathname: '/p-account/login', state: ''}); break;
case 400: navigator('/p-account/login', { state: '' }); break;
};
})
},[])
@ -64,15 +66,15 @@ const ParentSignUp = (props) => {
formdata.append('tel', tel);
formdata.append('profile', profile);
formdata.append('terms', check_terms);
formdata.append('token', props.match.params.token);
formdata.append('token', params?.token);
await axios.post('/api/fathers/registerMain', formdata)
.then(response => {
setSubmit(false);
switch(response.data.status_code){
case 200: history.push({pathname: '/p-account/register/complete/'+props.match.params.token, state: response.data.success_messages}); break;
case 200: navigator('/p-account/register/complete/'+ params?.token, {state: response.data.success_messages}); break;
case 400: set400Error(response.data.error_messages); break;
case 401: history.push({pathname: '/p-account/register/error/'+props.match.params.token, state: response.data.error_messages}); break;
case 401: navigator('/p-account/register/error/'+ params?.token, {state: response.data.error_messages}); break;
case 422: {
window.scrollTo(0, 0);
set422Errors(response.data.error_messages);
@ -186,7 +188,7 @@ const ParentSignUp = (props) => {
checked={check_terms}
/>
<span className='lbl padding-16'>
<a href="/terms" target='_blank' className='term-link' rel="noopener noreferrer">規約</a>
<Link to="/terms" className='term-link' rel="noopener noreferrer">規約</Link>
に同意する
</span>
</label>

ファイルの表示

@ -5,7 +5,7 @@ import Notification from '../../component/notification';
import copy from 'clipboard-copy';
const ChildAdd = () => {
const ParentChildAdd = () => {
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const father_id = localStorage.getItem('kiki_acc_id');
@ -49,13 +49,12 @@ const ChildAdd = () => {
const inviteUrl = document.getElementById('inviteurl_html').value;
const siteUrl = document.getElementById('siteurl').value;
const lineText = `「KIKI」の招待が届いています。%0Aまずは以下より仮登録を行ってください。%0A%0A※スマホ本体を最新の状態にアップデートしてからURLをクリックしてください。%0A%0A${inviteUrl}%0A%0A▼公式サイトはこちら%0A${siteUrl}`;
copy(lineText);
setSuccess('招待用URLをLINEで追信しました。');
window.open('http://line.me/R/msg/text/?'+lineText);
window.location.href = 'http://line.me/R/msg/text/?'+lineText;
}
const contactMailText = 'mailto:56@zotman.jp?subject=&amp;body='+
'▼%20件名%0AKIKIメンバー追加の件%0A▼%20本文%0Aこの度はKIKIシステムをご利用いただきありがとうございます。%0A会社名などを記載の上送信してください。担当者より直接メール又は電話にてご連絡いたします。%0A%0A会社名%0A担当者名%0A電話番号%0Aメールアドレス%0A%0A※3営業日までに折り返しがない場合はお手数ですが再度メールにてお問い合わせください。%0A%0AKIKI運営事務局%0A56%40zotman.jp'
const contactMailText = 'mailto:56@zotman.jp?subject=KIKIメンバー追加について&body='+
'名前%3A%0A電話番号%3A%0AログインID%3A%0Aログインパスワード%3A%0A追加したいメンバー数%3A%0A「その他お問合せ内容」'
return (
<div className="l-content">
@ -118,4 +117,4 @@ const ChildAdd = () => {
)
}
export default ChildAdd;
export default ParentChildAdd;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link, useHistory } from 'react-router-dom';
import { Link, useLocation, useNavigate, useParams } from 'react-router-dom';
import moment from 'moment';
import Notification from '../../component/notification';
@ -7,9 +7,12 @@ import ModalConfirm from '../../component/modal_confirm';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
const ChildDetail = (props) => {
const ParentChildDetail = () => {
const navigator = useNavigate();
const location = useLocation();
const params = useParams();
const history = useHistory();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [loaded, setLoaded] = useState(false);
const [show_delete, setShowDelete] = useState(false);
@ -17,10 +20,10 @@ const ChildDetail = (props) => {
const [child, setChild] = useState(null);
const [_400error, set400Error] = useState('');
const [_404error, set404Error] = useState('');
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const father_id = localStorage.getItem('kiki_acc_id');
const child_id = props.match.params.child_id;
const child_id = params?.child_id;
const isMountedRef = useRef(true);
useEffect( async () => {
@ -64,8 +67,7 @@ const ChildDetail = (props) => {
setNotice(response.data.notice);
switch(response.data.status_code){
case 200: {
history.push({ pathname: "/p-account/child",
state: "子の削除に成功しました。" });
navigator('/p-account/child', { state: "子の削除に成功しました。" });
break;
}
case 400: set400Error('子の削除に失敗しました。'); break;
@ -97,22 +99,6 @@ const ChildDetail = (props) => {
</div>
<p className="profile-name ft-xs-16">{`${child.last_name} ${child.first_name}`}</p>
<div className="profile-info ft-xs-17">
{/* <div className="profile-info__item">
<a href={`mailto:${child.email}`}>
<p className="profile-info__icon">
<img src="/assets/img/icon/mail.svg" alt="メール"/>
</p>
<p className="txt">{child.email}</p>
</a>
</div> */}
{/* <div className="profile-info__item">
<a href={`tel:${child.tel}`}>
<p className="profile-info__icon">
<img src="/assets/img/icon/phone.svg" alt="電話" />
</p>
<p className="txt">{child.tel}</p>
</a>
</div> */}
<div className="profile-info__item">
<p className="profile-info__icon">
<img src="/assets/img/icon/building.svg" alt="会社名"/>
@ -156,9 +142,7 @@ const ChildDetail = (props) => {
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/child"
});
navigator('/p-account/child', {state: ''});
}}>
{_404error}
</Alert>
@ -170,4 +154,4 @@ const ChildDetail = (props) => {
export default ChildDetail;
export default ParentChildDetail;

ファイルの表示

@ -8,11 +8,13 @@ import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
import { useHistory } from 'react-router';
import { useNavigate, useParams } from 'react-router-dom';
const ChildEdit = (props) => {
const ParentChildEdit = () => {
const navigator = useNavigate();
const params = useParams();
const history = useHistory();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [_success, setSuccess] = useState('');
const [_400error, set400Error] = useState('');
@ -24,7 +26,7 @@ const ChildEdit = (props) => {
const [loaded, setLoaded] = useState(false);
const father_id = localStorage.getItem('kiki_acc_id');
const child_id = props.match.params.child_id;
const child_id = params?.child_id;
const isMountedRef = useRef(true);
@ -65,10 +67,7 @@ const ChildEdit = (props) => {
setNotice(response.data.notice);
switch(response.data.status_code){
case 200:{
history.push({
pathname: '/p-account/child/detail/'+child_id,
state: response.data.success_messages
});
navigator('/p-account/child/detail/'+child_id, { state: response.data.success_messages });
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -136,9 +135,7 @@ const ChildEdit = (props) => {
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/child"
});
navigator('/p-account/child', {state: ''})
}}>
{_404error}
</Alert>
@ -147,4 +144,4 @@ const ChildEdit = (props) => {
)
}
export default ChildEdit;
export default ParentChildEdit;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { useLocation, Link } from 'react-router-dom';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
@ -9,16 +9,17 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Child = (props) => {
const ParentChilds = () => {
const location = useLocation();
const history = useHistory();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const father_id = localStorage.getItem('kiki_acc_id');
const [children_list, setChildrenList] = useState([]);
const [fetch_children_list, setFetchChildrenList] = useState([]);
const [loaded, setLoaded] = useState(false);
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [_400error, set400Error] = useState('');
const isMountedRef = useRef(true);
@ -131,4 +132,4 @@ const Child = (props) => {
export default Child;
export default ParentChilds;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import moment from 'moment';
import Notification from '../../component/notification';
@ -12,7 +12,9 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Favorite = (props) => {
const ParentFavorite = () => {
const location = useLocation();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const father_id = localStorage.getItem('kiki_acc_id');
@ -25,7 +27,7 @@ const Favorite = (props) => {
const [meeting_list_favorite, setMeetingListOfFavorite] = useState([]);
const [fetch_meeting_list_non_favorite, setFetchMeetingListOfNonFavorite] = useState([]);
const [fetch_meeting_list_favorite, setFetchMeetingListOfFavorite] = useState([]);
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [_400error, set400Error] = useState('');
const isMountedRef = useRef(true);
@ -120,8 +122,7 @@ const Favorite = (props) => {
const formdata = new FormData();
formdata.append('meeting_id', meetingId);
formdata.append('is_favorite', currentFavorite == 1 ? 0 : 1);
await axios.post('/api/fathers/meetings/registerFavorite', formdata)
.then(response=>{setNotice(response.data.notice)})
axios.post('/api/fathers/meetings/registerFavorite', formdata)
if(stateName == "nonFavoriteOfFather") {
const newList = meeting_list_non_favorite.map((item) => {
@ -211,7 +212,7 @@ const Favorite = (props) => {
{
fetch_meeting_list_favorite.length > 0 ?
fetch_meeting_list_favorite?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -274,7 +275,7 @@ const Favorite = (props) => {
{
fetch_meeting_list_non_favorite.length > 0 ?
fetch_meeting_list_non_favorite?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -331,4 +332,4 @@ const Favorite = (props) => {
export default Favorite;
export default ParentFavorite;

ファイルの表示

@ -1,67 +0,0 @@
import React from 'react';
import ReactDOM from 'react-dom';
import Side from './side';
import Meeting from './meeting';
import MeetingDetail from './meeting/detail';
import MeetingAdd from './meeting/add';
import MeetingEdit from './meeting/edit';
import Favorite from './favorite';
import Search from './search';
import Child from './child';
import ChildAdd from './child/add';
import ChildEdit from './child/edit';
import ChildDetail from './child/detail';
import Profile from './profile';
import ProfileEdit from './profile/edit';
import ProfilePasswordEdit from './profile/password_edit';
import ProfileWithdrawal from './profile/withdrawal';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import PageChangeHandler from '../component/page_change_handler';
import ScrollToTop from '../component/scroll_top';
export const App = () => {
return (
<main className="l-container">
<BrowserRouter>
<ScrollToTop />
<PageChangeHandler/>
<Switch>
<Route exact path='/p-account' component={Meeting} />
<Route exact path='/p-account/meeting' component={Meeting} />
<Route exact path='/p-account/meeting/detail/:meeting_id' component={MeetingDetail} />
<Route exact path='/p-account/meeting/new' component={MeetingAdd} />
<Route exact path='/p-account/meeting/edit/:meeting_id' component={MeetingEdit} />
<Route exact path='/p-account/favorite' component={Favorite} />
<Route exact path='/p-account/search' component={Search} />
<Route exact path='/p-account/child' component={Child} />
<Route exact path='/p-account/child/add' component={ChildAdd} />
<Route exact path='/p-account/child/edit/hire-date/:child_id' component={ChildEdit} />
<Route exact path='/p-account/child/detail/:child_id' component={ChildDetail} />
<Route exact path='/p-account/profile' component={Profile} />
<Route exact path='/p-account/profile/edit/:father_id' component={ProfileEdit} />
<Route exact path='/p-account/profile/edit/password/:father_id' component={ProfilePasswordEdit} />
<Route exact path='/p-account/profile/withdrawal' component={ProfileWithdrawal} />
</Switch>
<Side />
</BrowserRouter>
</main>
);
}
if(document.getElementById('p-app')){
ReactDOM.render(
<App/>,
document.getElementById('p-app')
)
}

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useLocation } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import IconButton from '@mui/material/IconButton';
import RemoveIcon from '@mui/icons-material/Remove';
@ -10,9 +10,11 @@ import PageLoader from '../../component/page_loader';
import UploadingProgress from '../../component/modal_uploading';
const MeetingAdd = (props) => {
const ParentMeetingAdd = () => {
const navigator = useNavigate();
const location = useLocation();
const history = useHistory();
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -32,7 +34,7 @@ const MeetingAdd = (props) => {
const [submit, setSubmit] = useState(false);
const [check_radio, setCheckRadio] = useState('');
const state = props.history.location.state;
const state = location.state;
const isMountedRef = useRef(true);
useEffect( async () => {
@ -137,9 +139,7 @@ const MeetingAdd = (props) => {
switch(response.data.status_code){
case 200: {
const meeting_id = response.data.params.meeting_id;
history.push({
pathname: `/p-account/meeting/detail/${meeting_id}`,
state: "登録成功しました"});
navigator(`/p-account/meeting/detail/${meeting_id}`, { state: "登録成功しました" });
break;
}
case 400: set400Error("登録失敗しました。"); break;
@ -389,4 +389,4 @@ const MeetingAdd = (props) => {
)
}
export default MeetingAdd;
export default ParentMeetingAdd;

ファイルの表示

@ -1,6 +1,7 @@
import React, { useRef, useEffect, useState } from 'react';
import moment from 'moment';
import { useHistory, Link } from 'react-router-dom';
import { useNavigate, Link, useLocation, useParams } from 'react-router-dom';
import copy from 'clipboard-copy';
import ModalEditMemo from '../../component/modal_edit_memo';
import ModalConfirm from '../../component/modal_confirm';
@ -11,16 +12,20 @@ import Alert from '../../component/alert';
import Thumbnail from '../../component/thumbnail';
import PageLoader from '../../component/page_loader';
const MeetingDetail = (props) => {
const ParentMeetingDetail = () => {
const navigator = useNavigate();
const location = useLocation();
const params = useParams();
const history = useHistory();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const father_id = localStorage.getItem('kiki_acc_id');
const [loaded, setLoaded] = useState(false);
const [loaded_children, setLoadedChildren] = useState(false);
const [submit_delete, setSubmitDelete] = useState(false);
const [submit_notify, setSubmitNotify] = useState(false);
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [_400error, set400Error] = useState('');
const [_404error, set404Error] = useState('');
@ -32,38 +37,49 @@ const MeetingDetail = (props) => {
const [meeting, setMeeting] = useState(null);
const [thumbnail, setThumbnail] = useState(null);
const isMountedRef = useRef(true);
const isMountedRef = useRef(false);
useEffect( async () => {
isMountedRef.current = false;
let mounted = true;
const source = axios.CancelToken.source()
isMountedRef.current = true;
setLoaded(false);
await axios.get(`/api/fathers/meetings/detail/${props.match.params?.meeting_id}`, {params: { father_id: father_id}})
await axios.get(`/api/fathers/meetings/detail/${params?.meeting_id}`, {params: { father_id: father_id}}, {cancelToken: source.token})
.then((response) => {
setLoaded(true);
setNotice(response.data.notice);
if(response.data.status_code==200){
var list = response.data.params;
var total=0, num=0;
for(var i in list.approval)
{
if(list.approval[i].approval_at) num ++;
total ++;
if(mounted){
setLoaded(true);
setNotice(response.data.notice);
if(response.data.status_code==200){
var list = response.data.params;
var total=0, num=0;
for(var i in list.approval)
{
if(list.approval[i].approval_at) num ++;
total ++;
}
setMeeting({...list, denominator:total, numerator:num});
setThumbnail(response.data.params.meeting_image[0]?.image);
}
setMeeting({...list, denominator:total, numerator:num});
setThumbnail(response.data.params.meeting_image[0]?.image);
else {
set400Error("失敗しました。");
}
}
else {
set400Error("失敗しました。");
}
})
.catch(err=>{
setLoaded(true);
setNotice(err.response.data.notice);
if(err.response.status==404){
set404Error(err.response.data.message);
if(mounted){
setLoaded(true);
setNotice(err.response.data.notice);
if(err.response.status==404){
set404Error(err.response.data.message);
}
}
})
return function cleanup() {
mounted = false
isMountedRef.current = false;
source.cancel()
}
}, []);
//-------------------------------------------------------------
@ -77,15 +93,14 @@ const MeetingDetail = (props) => {
const handleAcceptDelete = async () => {
setSubmitDelete(true);
await axios.delete(`/api/fathers/meetings/delete/${props.match.params?.meeting_id}`)
await axios.delete(`/api/fathers/meetings/delete/${params?.meeting_id}`)
.then(response => {
setNotice(response.data.notice);
setSubmitDelete(false);
setShowDeleteModal(false);
switch(response.data.status_code){
case 200: {
history.push({ pathname: "/p-account/meeting",
state: "ミーティングの削除に成功しました!" });
navigator('/p-account/meeting', {state: "ミーティングの削除に成功しました!" });
break;
}
case 400: set400Error('ミーティングの削除に失敗しました。'); break;
@ -98,8 +113,8 @@ const MeetingDetail = (props) => {
const formdata = new FormData();
formdata.append('meeting_id', meetingId);
formdata.append('is_favorite', currentFavorite == 1 ? 0 : 1);
await axios.post('/api/fathers/meetings/registerFavorite', formdata)
.then(response => {setNotice(response.data.notice)})
axios.post('/api/fathers/meetings/registerFavorite', formdata)
const updatedItem = {
...meeting,
is_favorite: currentFavorite == 1 ? 0 : 1,
@ -109,7 +124,7 @@ const MeetingDetail = (props) => {
const handleNotifyAllChild = async () => {
setSubmitNotify(true);
await axios.get('/api/fathers/meeting/approvals/listChildrenOfUnapprovel', {params:{meeting_id: props.match.params?.meeting_id}})
await axios.get('/api/fathers/meeting/approvals/listChildrenOfUnapprovel', {params:{meeting_id: params?.meeting_id}})
.then(response => {
setNotice(response.data.notice);
if(response.data.status_code == 200){
@ -120,7 +135,7 @@ const MeetingDetail = (props) => {
}
const formdata = new FormData();
formdata.append('email', JSON.stringify(email_list));
formdata.append('meeting_id', props.match.params.meeting_id);
formdata.append('meeting_id', params?.meeting_id);
axios.post('/api/fathers/meetingEditNotification', formdata)
.then(response=>{
setSubmitNotify(false);
@ -153,6 +168,15 @@ const MeetingDetail = (props) => {
window.open(`/pdf/${file_name}`, '_blank');
}
const handleLoadedChildren = (flag) => {
setLoadedChildren(flag);
}
const saveStorage = () => {
copy(`${meeting.father.company}さんより 業務連絡のお知らせ\n新規業務連絡のご確認はこちら\n\nhttps://kikikan.xyz/c-account/meeting/detail/${params?.meeting_id}`);
setSuccess('コピーしました。');
}
return (
<div className="l-content">
@ -164,10 +188,10 @@ const MeetingDetail = (props) => {
<Notification notice={notice}/>
</div>
{
!loaded && <PageLoader />
!(loaded && loaded_children) && <PageLoader />
}
{
loaded && meeting &&
(loaded && loaded_children) && meeting &&
<div className="l-content-wrap">
<div className="p-article">
<div className="p-article-wrap">
@ -202,24 +226,28 @@ const MeetingDetail = (props) => {
<time dateTime="2021-07-30" className="meeting-time">
<span className="meeting-date">{ moment(meeting?.updated_at).format('YYYY/MM/DD') }</span>
</time>
<div className="clip-copy" onClick={saveStorage}>
<a>この案件のURLをコピーする</a>
<img src="/assets/img/icon/icon-copy.png" alt="kiki"/>
</div>
<ul className="p-article-btn-list">
<li className="p-article-btn__item">
<Link to={`/p-account/meeting/edit/${props.match.params?.meeting_id}`}
<Link to={`/p-account/meeting/edit/${params?.meeting_id}`}
className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">編集</Link>
</li>
<li className="p-article-btn__item">
<a onClick={()=>setShowDeleteModal(true)} className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">削除</a>
<a onClick={()=>setShowDeleteModal(true)}
className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">削除</a>
</li>
<li className="p-article-btn__item">
<a onClick={()=>
history.push({
pathname: "/p-account/meeting/new",
state: meeting
})}
<a onClick={()=>{
navigator('/p-account/meeting/new', {state: meeting})
}}
className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">複製</a>
</li>
<li className="p-article-btn__item">
<a onClick={()=>setShowNotifySelectModal(true)} className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">再通知</a>
<a onClick={()=>setShowNotifySelectModal(true)}
className="btn-default btn-yellow btn-pdf btn-r8 btn-h48">再通知</a>
</li>
</ul>
@ -270,11 +298,6 @@ const MeetingDetail = (props) => {
</article>
</div>
</div>
<ModalSettingNotify
show={show_notify_all_modal}
meetingId={meeting.id}
handleClose={()=>setShowNotifyAllModal(false)}
/>
<ModalEditMemo
show={show_memo_modal}
title={"メモ"}
@ -303,15 +326,22 @@ const MeetingDetail = (props) => {
/>
</div>
}
{
loaded && meeting &&
<ModalSettingNotify
show={show_notify_all_modal}
meetingId={meeting.id}
handleClose={()=>setShowNotifyAllModal(false)}
handleLoadedChildren = {handleLoadedChildren}
/>
}
</div>
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('')}>{_success}</Alert> }
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/meeting"
});
navigator('/p-account/meeting', {state: ''});
}}>
{_404error}
</Alert>
@ -320,4 +350,4 @@ const MeetingDetail = (props) => {
)
}
export default MeetingDetail;
export default ParentMeetingDetail;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate, useParams } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import IconButton from '@mui/material/IconButton';
import RemoveIcon from '@mui/icons-material/Remove';
@ -13,11 +13,13 @@ import UploadingProgress from '../../component/modal_uploading';
const MeetingEdit = (props) => {
const ParentMeetingEdit = () => {
const history = useHistory();
const navigator = useNavigate();
const params = useParams();
const father_id = localStorage.getItem('kiki_acc_id');
const meeting_id = props.match.params.meeting_id;
const meeting_id = params?.meeting_id;
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [title, setTitle] = useState('');
@ -149,10 +151,7 @@ useEffect(()=>{
setSubmit(false);
switch(response.data.status_code){
case 200: {
history.push({
pathname: `/p-account/meeting/detail/${meeting_id}`,
state: "編集が完了しました!"
});
navigator(`/p-account/meeting/detail/${meeting_id}`, { state: '編集が完了しました!' });
break;
}
case 400: set400Error("編集が失敗しました。"); break;
@ -202,7 +201,10 @@ useEffect(()=>{
const handleDeleteImage = async (index, image_id) => {
let list = [...meeting_image];
list.splice(index, 1);
setMeetingImages(list);
await axios.delete(`/api/fathers/meeting/images/delete/${meeting_id}`, {params:{image_id: image_id}})
.then(response=>{
setNotice(response.data.notice);
@ -210,9 +212,6 @@ useEffect(()=>{
case 400: set400Error("画像の削除に失敗しました。");
}
})
let list = [...meeting_image];
list.splice(index, 1);
setMeetingImages(list);
}
const handlePDFChange = (e) => {
@ -419,9 +418,7 @@ useEffect(()=>{
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/meeting"
});
navigator('/p-account/meeting', { state:'' });
}}>
{_404error}
</Alert>
@ -434,4 +431,4 @@ useEffect(()=>{
)
}
export default MeetingEdit;
export default ParentMeetingEdit;

ファイルの表示

@ -1,5 +1,5 @@
import React, { useRef, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
import moment from 'moment';
import Notification from '../../component/notification';
@ -11,7 +11,9 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Meeting = (props) => {
const ParentMeetings = () => {
const location = useLocation();
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const father_id = localStorage.getItem('kiki_acc_id');
@ -24,7 +26,7 @@ const Meeting = (props) => {
const [meeting_list_complete, setMeetingListOfComplete] = useState([]);
const [fetch_meeting_list_incomplete, setFetchMeetingListOfIncomplete] = useState([]);
const [fetch_meeting_list_complete, setFetchMeetingListOfComplete] = useState([]);
const [_success, setSuccess] = useState(props.history.location?.state);
const [_success, setSuccess] = useState(location.state);
const [_400error, set400Error] = useState('');
const isMountedRef = useRef(true);
@ -127,8 +129,7 @@ const Meeting = (props) => {
const formdata = new FormData();
formdata.append('meeting_id', meetingId);
formdata.append('is_favorite', currentFavorite == 1 ? 0 : 1);
await axios.post('/api/fathers/meetings/registerFavorite', formdata)
.then(response=>{ setNotice(response.data.notice)});
axios.post('/api/fathers/meetings/registerFavorite', formdata)
if(stateName == "inCompleteOfFather") {
const newList1 = meeting_list_incomplete.map((item) => {
@ -218,7 +219,7 @@ const Meeting = (props) => {
{
fetch_meeting_list_incomplete.length > 0 ?
fetch_meeting_list_incomplete?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -282,7 +283,7 @@ const Meeting = (props) => {
{
fetch_meeting_list_complete.length > 0 ?
fetch_meeting_list_complete?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -338,4 +339,4 @@ const Meeting = (props) => {
export default Meeting;
export default ParentMeetings;

ファイルの表示

@ -3,11 +3,12 @@ import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
import { useHistory } from 'react-router';
import { useNavigate } from 'react-router-dom';
const ProfileEdit = () => {
const ParentProfileEdit = () => {
const navigator = useNavigate();
const history = useHistory();
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -74,10 +75,7 @@ const ProfileEdit = () => {
setSubmit(false);
switch(response.data.status_code){
case 200:{
history.push({
pathname: '/p-account/profile',
state: response.data.success_messages
});
navigator('/p-account/profile', { state: response.data.success_messages });
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -174,9 +172,7 @@ const ProfileEdit = () => {
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/profile"
});
navigator('/p-account/profile', { state: ''});
}}>
{_404error}
</Alert>
@ -188,4 +184,4 @@ const ProfileEdit = () => {
)
}
export default ProfileEdit;
export default ParentProfileEdit;

ファイルの表示

@ -1,28 +1,33 @@
import React, { useRef, useEffect, useState } from 'react';
import { useHistory, Link } from 'react-router-dom';
import { useNavigate, Link, useLocation } from 'react-router-dom';
import IconButton from "@material-ui/core/IconButton";
import PhotoCameraOutlinedIcon from '@mui/icons-material/PhotoCameraOutlined';
import { useCookies } from 'react-cookie';
import Alert from '../../component/alert';
import PageLoader from '../../component/page_loader';
import Notification from '../../component/notification';
const Profile = (props) => {
const history = useHistory();
const ParentProfileDetail = () => {
const navigator = useNavigate();
const location = useLocation();
const [cookies, setCookie] = useCookies(['user']);
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
const [image, setImage] = useState('');
const [image, setImage] = useState('');
const [profile, setProfile] = useState({company:'', email:'', tel:'', profile:''});
const [loaded, setLoaded] = useState(false);
const [_400error, set400Error] = useState('');
const [_404error, set404Error] = useState('');
const [_422errors, set422Errors] = useState({ image: '' });
const [_success, setSuccess] = useState(props.history.location.state);
const [_success, setSuccess] = useState(location.state);
const [submit_image, setSubmitImage] = useState(false);
const isMountedRef = useRef(true);
useEffect( async () => {
isMountedRef.current = false;
setLoaded(false);
@ -36,7 +41,7 @@ const Profile = (props) => {
}
else {
set400Error("失敗しました。");
}
}
})
.catch(err=>{
setLoaded(true);
@ -56,9 +61,10 @@ const Profile = (props) => {
const handleLogout = async () => {
await axios.get('/p-account/logout')
.then(() => {
location.href = '/p-account/login';
})
.then(() => {
setCookie('logged', null);
window.location.href = '/p-account/login';
})
}
const handleImageChange = (e) => {
@ -82,12 +88,12 @@ const Profile = (props) => {
}
case 400: set400Error(response.data.error_messages); break;
case 422: window.scrollTo(0, 0); set422Errors(response.data.error_messages); break;
}
}
});
};
};
return (
<div className="l-content">
<div className="l-content-w560">
@ -115,13 +121,13 @@ const Profile = (props) => {
<PhotoCameraOutlinedIcon style={{width:'25px', height:'25px', color:'black'}}/>
</IconButton>
</label>
<img src={image} className="avatar-img" alt="avatar-img"/>
<img src={image} className="avatar-img" alt="avatar-img"/>
</div>
{
_422errors.image &&
<span className="l-alert__text--error ft-16 ft-md-14">
{_422errors.image}
</span>
</span>
}
</div>
<p className="profile-name">{ profile.company }</p>
@ -146,21 +152,37 @@ const Profile = (props) => {
<p className="txt">{profile.profile ? profile.profile: '未入力'}</p>
</div>
</div>
<div className="p-profile-btn">
<Link to={`/p-account/profile/edit/${father_id}`}
<Link to={`/p-account/profile/edit/${father_id}`}
className="btn-default btn-yellow btn-profile btn-r8 btn-h52">
<span className="ft-xs-16">プロフィールを変更する</span>
</Link>
</div>
<div className="p-profile-btn">
<Link to={`/p-account/profile/edit/password/${father_id}`}
className="btn-default btn-yellow btn-password btn-r8 btn-h52">
<span className="ft-xs-16">パスワードを変更する</span>
</Link>
</div>
<div className="p-profile-txtLink">
<Link to="/terms"
className="btn-default btn-password btn-r8 btn-h30"
>
<span className="ft-xs-16">利用規約</span>
</Link>
</div>
<div className="p-profile-txtLink">
<Link to="/privacy-policy"
className="btn-default btn-password btn-r8 btn-h30"
>
<span className="ft-xs-16">プライバシーポリシー</span>
</Link>
</div>
<div className="p-profile-txtLink">
<a className="btn-default btn-password btn-r8 btn-h30"
onClick={handleLogout}
@ -178,24 +200,22 @@ const Profile = (props) => {
</div>
</div>
}
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _400error && <Alert type="fail" hide={()=>set400Error('')}>{_400error}</Alert> }
{ _success && <Alert type="success" hide={()=>setSuccess('') }>{_success}</Alert> }
{ _404error &&
{ _404error &&
<Alert type="fail" hide={()=>{
set404Error('');
history.push({
pathname: "/p-account/profile"
});
navigator('/p-account/profile', {state: ''});
}}>
{_404error}
</Alert>
}
</section>
</section>
</div>
</div>
</div>
</div>
)
}
export default Profile;
export default ParentProfileDetail;

ファイルの表示

@ -1,12 +1,14 @@
import { useState } from 'react';
import { useHistory } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
const ProfilePasswordEdit = () => {
const history = useHistory();
const ParentProfilePasswordEdit = () => {
const navigator = useNavigate();
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -39,10 +41,7 @@ const ProfilePasswordEdit = () => {
setNotice(response.data.notice);
switch(response.data.status_code){
case 200:{
history.push({
pathname: '/p-account/profile',
state: response.data.success_messages
});
navigator('/p-account/profile', { state: response.data.success_messages });
break;
}
case 400: set400Error(response.data.error_messages); break;
@ -116,4 +115,4 @@ const ProfilePasswordEdit = () => {
}
export default ProfilePasswordEdit;
export default ParentProfilePasswordEdit;

ファイルの表示

@ -3,7 +3,7 @@ import { LoadingButton } from '@material-ui/lab';
import Notification from '../../component/notification';
import Alert from '../../component/alert';
const ProfileWithdrawal = () => {
const ParentProfileWithdrawal = () => {
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -63,4 +63,4 @@ const ProfileWithdrawal = () => {
}
export default ProfileWithdrawal;
export default ParentProfileWithdrawal;

ファイルの表示

@ -12,7 +12,7 @@ import InfiniteScroll from "react-infinite-scroll-component";
const INFINITE = 10;
const SCROLL_DELAY_TIME = 1500;
const Search = (props) => {
const ParentSearch = () => {
const father_id = localStorage.getItem('kiki_acc_id');
const [notice, setNotice] = useState(localStorage.getItem('notice'));
@ -124,9 +124,7 @@ const Search = (props) => {
const formdata = new FormData();
formdata.append('meeting_id', meetingId);
formdata.append('is_favorite', currentFavorite == 1 ? 0 : 1);
await axios.post('/api/fathers/meetings/registerFavorite', formdata)
.then(response=>{setNotice(response.data.notice)})
axios.post('/api/fathers/meetings/registerFavorite', formdata)
if(stateName == "inCompleteOfFather") {
const newList = meeting_list_incomplete.map((item) => {
@ -215,7 +213,7 @@ const Search = (props) => {
{
fetch_meeting_list_incomplete.length > 0 ?
fetch_meeting_list_incomplete?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -282,7 +280,7 @@ const Search = (props) => {
{
fetch_meeting_list_complete.length > 0 ?
fetch_meeting_list_complete?.map((item, id) =>
<div className="meeting-item" key={id}>
<div className="meeting-item parent" key={id}>
<Link to={`/p-account/meeting/detail/${item.id}`} className="meeting-link">
<h3 className="meeting-ttl">{ item.title }</h3>
<p className="meeting-txt">{ item.text }</p>
@ -341,4 +339,4 @@ const Search = (props) => {
export default Search;
export default ParentSearch;

ファイルの表示

@ -1,16 +1,19 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom'
import { Link } from 'react-router-dom';
import { useCookies } from 'react-cookie';
export default function Side() {
export default function ParentSide() {
const [selected, setSelected] = useState('');
const [cookies, setCookie] = useCookies(['user']);
const father_image = document.getElementById('father_image').value;
const handleLogout = async () => {
await axios.get('/p-account/logout')
.then(() => {
location.href = '/p-account/login';
})
.then(() => {
setCookie('logged', null);
window.location.href = '/p-account/login';
})
}
const handleSelected = (id) => {

224
backend/resources/js/routes.js vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,224 @@
import {Route} from 'react-router-dom';
import DashboardLayout from './layout/DashboardLayout';
import MainLayout from './layout/MainLayout';
/*====================================
Admin
===================================*/
import AdminMeetings from './admin/meeting';
import AdminMeetingDetail from './admin/meeting/detail';
import AdminMeetingEdit from './admin/meeting/edit';
import AdminChilds from './admin/child';
import AdminChildDetail from './admin/child/detail';
import AdminChildEdit from './admin/child/edit';
import AdminChildPasswordEdit from './admin/child/password_edit';
import AdminParents from './admin/parent';
import AdminParentDetail from './admin/parent/detail';
import AdminParentEdit from './admin/parent/edit';
import AdminParentPasswordEdit from './admin/parent/password_edit';
import AdminParentAdd from './admin/parent/add';
import AdminSide from './admin/side';
import AdminLogin from './admin/login';
/*====================================
p-account
===================================*/
import ParentMeetings from './parent/meeting';
import ParentMeetingDetail from './parent/meeting/detail';
import ParentMeetingAdd from './parent/meeting/add';
import ParentMeetingEdit from './parent/meeting/edit';
import ParentFavorite from './parent/favorite';
import ParentSearch from './parent/search';
import ParentChilds from './parent/child';
import ParentChildAdd from './parent/child/add';
import ParentChildEdit from './parent/child/edit';
import ParentChildDetail from './parent/child/detail';
import ParentProfileDetail from './parent/profile';
import ParentProfileEdit from './parent/profile/edit';
import ParentProfilePasswordEdit from './parent/profile/password_edit';
import ParentProfileWithdrawal from './parent/profile/withdrawal';
import ParentSide from './parent/side';
/*------------------------------------*/
import ParentForgotPassword from './parent/auth/forgot_password';
import ParentForgotPasswordReset from './parent/auth/forgot_password/reset';
import ParentLogin from './parent/auth/login';
import ParentSignUp from './parent/auth/register';
import PasswordResetComplete from './component/password_reset_complete';
import SignUpComplete from './component/register/complete';
import SignUpError from './component/register/error';
import WithdrawalComplete from './component/withdrawal_complete';
/*====================================
c-account
===================================*/
import ChildSide from './child/side';
import ChildMeetings from './child/meeting';
import ChildMeetingDetail from './child/meeting/detail';
import ChildParents from './child/parent';
import ChildParentDetail from './child/parent/detail';
import ChildProfileDetail from './child/profile';
import ChildProfileEdit from './child/profile/edit';
import ChildProfilePasswordEdit from './child/profile/password_edit';
import ChildProfileWithdrawal from './child/profile/withdrawal';
import ChildSearch from './child/search';
/*--------------------------------*/
import ChildForgotPassword from './child/auth/forgot_password';
import ChildForgotPasswordReset from './child/auth/forgot_password/reset';
import ChildLogin from './child/auth/login';
import ChildSignUpTemporary from './child/auth/register/temporary';
import ChildSignUp from './child/auth/register';
/*====================================
pages
===================================*/
import Contact from './pages/contact/index';
import ContactComplete from './pages/contact/complete';
import UnknownError from './pages/contact/unknown';
import Terms from './pages/terms';
import PrivacyPolicy from './pages/privacy-policy';
const routes = [
{
path: 'admin',
element: <DashboardLayout side={<AdminSide/>}/>,
children: [
{ path: 'meeting', element: <AdminMeetings /> },
{ path: 'meeting/detail/:meeting_id', element: <AdminMeetingDetail /> },
{ path: 'meeting/edit/:meeting_id', element: <AdminMeetingEdit /> },
{ path: 'child', element: <AdminChilds /> },
{ path: 'child/detail/:child_id', element: <AdminChildDetail /> },
{ path: 'child/edit/:child_id', element: <AdminChildEdit /> },
{ path: 'child/edit/password/:child_id', element: <AdminChildPasswordEdit /> },
{ path: 'parent', element: <AdminParents /> },
{ path: 'parent/detail/:father_id', element: <AdminParentDetail /> },
{ path: 'parent/edit/:father_id', element: <AdminParentEdit /> },
{ path: 'parent/edit/password/:father_id', element: <AdminParentPasswordEdit /> },
{ path: 'parent/register', element: <AdminParentAdd /> },
]
},
{
path: 'p-account',
element: <DashboardLayout side={<ParentSide/>}/>,
children: [
{ path: 'meeting', element: <ParentMeetings /> },
{ path: 'meeting/detail/:meeting_id', element: <ParentMeetingDetail /> },
{ path: 'meeting/new', element: <ParentMeetingAdd /> },
{ path: 'meeting/edit/:meeting_id', element: <ParentMeetingEdit /> },
{ path: 'favorite', element: <ParentFavorite /> },
{ path: 'search', element: <ParentSearch /> },
{ path: 'child', element: <ParentChilds /> },
{ path: 'child/add', element: <ParentChildAdd /> },
{ path: 'child/edit/hire-date/:child_id', element: <ParentChildEdit /> },
{ path: 'child/detail/:child_id', element: <ParentChildDetail /> },
{ path: 'profile', element: <ParentProfileDetail /> },
{ path: 'profile/edit/:father_id', element: <ParentProfileEdit /> },
{ path: 'profile/edit/password/:father_id', element: <ParentProfilePasswordEdit /> },
{ path: 'profile/withdrawal', element: <ParentProfileWithdrawal /> },
]
},
{
path: 'c-account',
element: <DashboardLayout side={<ChildSide/>}/>,
children: [
{ path: 'meeting', element: <ChildMeetings /> },
{ path: 'meeting/detail/:meeting_id', element: <ChildMeetingDetail/> },
{ path: 'search', element: <ChildSearch /> },
{ path: 'parent', element: <ChildParents /> },
{ path: 'parent/detail/:father_id', element: <ChildParentDetail /> },
{ path: 'profile', element: <ChildProfileDetail /> },
{ path: 'profile/edit/:child_id', element: <ChildProfileEdit /> },
{ path: 'profile/password-edit/:child_id', element: <ChildProfilePasswordEdit /> },
{ path: 'profile/withdrawal', element: <ChildProfileWithdrawal /> },
]
},
{
path: 'admin',
element: <MainLayout />,
children: [
{ path: 'login', element: <AdminLogin /> },
]
},
{
path: 'p-account',
element: <MainLayout />,
children: [
{ path: 'register/:token', element: <ParentSignUp /> },
{ path: 'register/complete/:token', element: <SignUpComplete /> },
{ path: 'register/error/:token', element: <SignUpError /> },
{ path: 'forgot-password', element: <ParentForgotPassword /> },
{ path: 'forgot-password/reset/:token', element: <ParentForgotPasswordReset /> },
{ path: 'forgot-password/complete', element: <PasswordResetComplete /> },
{ path: 'login', element: <ParentLogin /> },
{ path: 'withdrawal/complete', element: <WithdrawalComplete /> },
]
},
{
path: 'c-account',
element: <MainLayout />,
children: [
{ path: 'register-temporary', element: <ChildSignUpTemporary /> },
{ path: 'register/:token', element: <ChildSignUp /> },
{ path: 'register/complete/:token', element: <SignUpComplete /> },
{ path: 'register/error/:token', element: <SignUpError /> },
{ path: 'forgot-password', element: <ChildForgotPassword /> },
{ path: 'forgot-password/reset/:token', element: <ChildForgotPasswordReset /> },
{ path: 'forgot-password/complete', element: <PasswordResetComplete /> },
{ path: 'login', element: <ChildLogin /> },
{ path: 'withdrawal/complete', element: <WithdrawalComplete /> },
]
},
{
path: '/',
element: <MainLayout />,
children: [
{ path: 'contact-us', element: <Contact /> },
{ path: 'contact-us/complete', element: <ContactComplete /> },
{ path: 'unknown-error', element: <UnknownError /> },
{ path: 'terms', element: <Terms /> },
{ path: 'privacy-policy', element: <PrivacyPolicy /> },
]
},
];
export default routes;

ファイルの表示

@ -243,6 +243,31 @@ a{
// background-color: rgb(0,0,0, 0.3);
}
.clip-copy{
margin-top: 30px;
margin-bottom: 10px;
border: 1px solid rgba(36, 77, 138, 0.1);
border-radius: 6px;
padding: 12px;
text-align: center;
color: #777777;
font-size: 15px;
font-weight: bold;
background-color: #F5F7F8;
position: relative;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover{
background-color: #f0ffff;
}
img{
position: absolute;
width: 18px;
right: 10px;
}
}
/////////////////////////////////////////////////////////////////////////
@ -341,9 +366,6 @@ a{
.react-pdf__Page__svg{
margin: auto;
width: 100% !important;
height: 100% !important;
svg{
width: 100%;
height: 100%;
@ -351,6 +373,11 @@ a{
}
}
.react-pdf__Document{
height: 100% !important;
}
input::placeholder{

ファイルの表示

@ -348,10 +348,14 @@ categories: [project]
.meeting{
&-item{
padding: 17px 0 22px;
@include pc{
padding: 19px 0 21px;
&.parent{
padding-right: 45px;
}
@include pc{
padding: 19px 0 21px;
}
}
&-link{
padding: 9px 0 14px;
@include pc{

ファイルの表示

@ -12,6 +12,5 @@
@endphp
@section('content')
<div id="admin-app"></div>
<input type="hidden" id="admin_router" value="{{$router}}" />
<input type="hidden" id="admin_router" value="{{$router}}" />
@endsection

ファイルの表示

@ -2,6 +2,3 @@
@section('title', 'KIKI管理者')
@section('content')
<div id="admin-login"></div>
@endsection

ファイルの表示

@ -3,10 +3,9 @@
@section('title', 'KIKI子')
@section('content')
<div id="c-auth"></div>
@if (Request::is('c-account/register-temporary'))
<input type="hidden" value={{ $father_id }} id="father_token">
@endif
@if (Request::is('c-account/register-temporary'))
<input type="hidden" value={{ $father_id }} id="father_token">
@endif
@endsection

ファイルの表示

@ -12,7 +12,6 @@
@endphp
@section('content')
<div id="c-app"></div>
<input type="hidden" id="c_router" value="{{$router}}" />
<input type="hidden" id="child_image" value="{{ request()->session()->get('children')['image'] }}" />
<input type="hidden" id="c_router" value="{{$router}}" />
<input type="hidden" id="child_image" value="{{ request()->session()->get('children')['image'] }}" />
@endsection

ファイルの表示

@ -40,6 +40,7 @@
</head>
<body>
<div id="root"></div>
@yield('content')
</body>
@ -53,5 +54,5 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/3.2.2/es6-promise.js"></script>
<script src="{{ asset('js/app.js') }}"></script>
<!-- V1, 2021/12/31 -->
<!-- V1, 2022/1/6 -->
</html>

ファイルの表示

@ -4,4 +4,5 @@
{{ url($url) }}
ログイン後ホームにブックマーク登録お願いします。
KIKI運営事務局

ファイルの表示

@ -1,6 +1,6 @@
{{ $father }}さんより 新規案件のお知らせ
{{ $father }}さんより 業務連絡のお知らせ
新規案件内容のご確認はこちら
新規業務連絡のご確認はこちら
{{ url($url) }}

ファイルの表示

@ -4,4 +4,5 @@
{{ url($url) }}
ログイン後ホームにブックマーク登録お願いします。
KIKI運営事務局

ファイルの表示

@ -1,7 +1,3 @@
@extends('common.layout')
@section('title', 'KIKI親')
@section('content')
<div id="p-auth"></div>
@endsection

ファイルの表示

@ -1,5 +1,7 @@
@extends('common.layout')
@section('title', 'KIKI | 親')
@php
$routers = ['child', 'favorite', 'search', 'profile', 'meeting'];
foreach ($routers as $router) {
@ -10,12 +12,12 @@
$sitelink = config('app.site_url');
$invitelink = url('/c-account/register-temporary?father_id='.request()->session()->get('fathers')['id']);
@endphp
@section('content')
<div id="p-app"></div>
<input type="hidden" id="p_router" value="{{$router}}" />
<input type="hidden" id="father_image" value="{{ request()->session()->get('fathers')['image'] }}" />
<input type="hidden" id="dd" value="{{ date('y/m/d') }}">
<input type="hidden" id="siteurl" value="{{ $sitelink }}">
<input type="hidden" id="inviteurl" value="{{ $invitelink }}">
<input type="hidden" id="inviteurl_html" value="{{ urlencode($invitelink) }}">
<input type="hidden" id="p_router" value="{{$router}}" />
<input type="hidden" id="father_image" value="{{ request()->session()->get('fathers')['image'] }}" />
<input type="hidden" id="dd" value="{{ date('y/m/d') }}">
<input type="hidden" id="siteurl" value="{{ $sitelink }}">
<input type="hidden" id="inviteurl" value="{{ $invitelink }}">
<input type="hidden" id="inviteurl_html" value="{{ urlencode($invitelink) }}">
@endsection

ファイルの表示

@ -1,19 +0,0 @@
@extends('common.layout')
@section('title', 'KIKI')
@section('content')
<main class="l-single-main l-sign-up">
<div class="l-centeringbox">
<div class="l-centeringbox-wrap">
<div class="l-single-container login-panel">
<div class="l-single-inner">
<div id="contact"></div>
</div>
</div>
</div>
</div>
</main>
@endsection

ファイルの表示

@ -0,0 +1,3 @@
@extends('common.layout')
@section('title', 'KIKI')

ファイルの表示

@ -1,100 +0,0 @@
@extends('common.layout')
@section('title', 'KIKI')
@section('content')
<main class="l-single-main l-sign-up">
<div class="l-centeringbox">
<div class="l-centeringbox-wrap">
<div class="l-single-container term-wrap">
<p class="text-center font-weight-bold ft-22 mt-5">プライバシーポリシー</p>
<p class="text-center text-gray font-weight-bold mb-5">Privacy Policy</p>
株式会社ZOTMAN(以下「当社」といいます。)は本ウェブサイト上で提供するサービス(以下,「本サービス」といいます。)におけるプライバシー情報の取扱いについて,以下のとおりプライバシーポリシー(以下,「本ポリシー」といいます。)を定めます。
<p class="ttl">第1条(プライバシー情報)</p>
<ul>
<li>プライバシー情報のうち「個人情報」とは,個人情報保護法にいう「個人情報」を指すものとし,生存する個人に関する情報であって,当該情報に含まれる氏名,生年月日,住所,電話番号,連絡先その他の記述等により特定の個人を識別できる情報を指します。</li>
<li>プライバシー情報のうち「履歴情報および特性情報」とは上記に定める「個人情報」以外のものをいいご利用いただいたサービスやご購入いただいた商品ご覧になったページや広告の履歴会員が検索された検索キーワードご利用日時ご利用の方法ご利用環境郵便番号や性別職業年齢会員のIPアドレスクッキー情報位置情報端末の個体識別情報などを指します。</li>
</ul>
<p class="ttl">第2条(プライバシー情報の収集方法)</p>
<ul>
<li>当社は,会員が利用登録をする際に氏名,生年月日,住所,電話番号,メールアドレス,銀行口座番号,クレジットカード番号,運転免許証番号などの個人情報をお尋ねすることがあります。また,会員と提携先などとの間でなされた会員の個人情報を含む取引記録や,決済に関する情報を当社の提携先(情報提供元,広告主,広告配信先などを含みます。以下,「提携先」といいます。)などから収集することがあります。</li>
<li>当社は会員について利用したサービスやソフトウエア購入した商品閲覧したページや広告の履歴検索した検索キーワード利用日時利用方法利用環境(携帯端末を通じてご利用の場合の当該端末の通信状態利用に際しての各種設定情報なども含みます)IPアドレスクッキー情報位置情報端末の個体識別情報などの履歴情報および特性情報を会員が当社や提携先のサービスを利用しまたはページを閲覧する際に収集します。</li>
</ul>
<p class="ttl">第3条(個人情報を収集・利用する目的)</p>
<p>当社が個人情報を収集・利用する目的は,以下のとおりです。</p>
<ul>
<li>会員に自分の登録情報の閲覧や修正,利用状況の閲覧を行っていただくために,氏名,住所,連絡先,支払方法などの登録情報,利用されたサービスや購入された商品,およびそれらの代金などに関する情報を表示する目的</li>
<li>会員にお知らせや連絡をするためにメールアドレスを利用する場合や会員に商品を送付したり必要に応じて連絡したりするため,氏名や住所などの連絡先情報を利用する目的</li>
<li>会員の本人確認を行うために,氏名,生年月日,住所,電話番号,銀行口座番号,クレジットカード番号,運転免許証番号,配達証明付き郵便の到達結果などの情報を利用する目的</li>
<li>会員に代金を請求するために,購入された商品名や数量,利用されたサービスの種類や期間,回数,請求金額,氏名,住所,銀行口座番号やクレジットカード番号などの支払に関する情報などを利用する目的</li>
<li>会員が簡便にデータを入力できるようにするために,当社に登録されている情報を入力画面に表示させたり,会員のご指示に基づいて他のサービスなど(提携先が提供するものも含みます)に転送したりする目的</li>
<li>代金の支払を遅滞したり第三者に損害を発生させたりするなど,本サービスの利用規約に違反した会員や,不正・不当な目的でサービスを利用しようとする会員の利用をお断りするために,利用態様,氏名や住所など個人を特定するための情報を利用する目的</li>
<li>会員からのお問い合わせに対応するために,お問い合わせ内容や代金の請求に関する情報など当社が会員に対してサービスを提供するにあたって必要となる情報や,会員のサービス利用状況,連絡先情報などを利用する目的</li>
<li>上記の利用目的に付随する目的</li>
</ul>
<p class="ttl">第4条(個人情報の第三者提供)</p>
<ul>
<li>当社は,次に掲げる場合を除いて,あらかじめ会員の同意を得ることなく,第三者に個人情報を提供することはありません。ただし,個人情報保護法その他の法令で認められる場合を除きます。
<ul>
<li>法令に基づく場合</li>
<li>人の生命,身体または財産の保護のために必要がある場合であって,本人の同意を得ることが困難であるとき</li>
<li>公衆衛生の向上または児童の健全な育成の推進のために特に必要がある場合であって,本人の同意を得ることが困難であるとき</li>
<li>国の機関もしくは地方公共団体またはその委託を受けた者が法令の定める事務を遂行することに対して協力する必要がある場合であって,本人の同意を得ることにより当該事務の遂行に支障を及ぼすおそれがあるとき</li>
<li>予め次の事項を告知あるいは公表をしている場合
<ul>
<li>利用目的に第三者への提供を含むこと</li>
<li>第三者に提供されるデータの項目</li>
<li>第三者への提供の手段または方法</li>
<li>本人の求めに応じて個人情報の第三者への提供を停止すること</li>
</ul>
</li>
</ul>
</li>
<li>前項の定めにかかわらず,次に掲げる場合は第三者には該当しないものとします。
<ul>
<li>当社が利用目的の達成に必要な範囲内において個人情報の取扱いの全部または一部を委託する場合</li>
<li>合併その他の事由による事業の承継に伴って個人情報が提供される場合</li>
<li>個人情報を特定の者との間で共同して利用する場合であって,その旨並びに共同して利用される個人情報の項目,共同して利用する者の範囲,利用する者の利用目的および当該個人情報の管理について責任を有する者の氏名または名称について,あらかじめ本人に通知し,または本人が容易に知り得る状態に置いているとき</li>
</ul>
</li>
</ul>
<p class="ttl">第5条(個人情報の開示)</p>
<ul>
<li>当社は本人から個人情報の開示を求められたときは本人に対し遅滞なくこれを開示します。ただし開示することにより次のいずれかに該当する場合はその全部または一部を開示しないこともあり開示しない決定をした場合にはその旨を遅滞なく通知します。なお個人情報の開示に際しては件あたり100,000円の手数料を申し受けます。
<ul>
<li>本人または第三者の生命,身体,財産その他の権利利益を害するおそれがある場合</li>
<li>当社の業務の適正な実施に著しい支障を及ぼすおそれがある場合</li>
<li>その他法令に違反することとなる場合</li>
</ul>
</li>
<li>前項の定めにかかわらず,履歴情報および特性情報などの個人情報以外の情報については,原則として開示いたしません。</li>
</ul>
<p class="ttl">第6条(個人情報の訂正および削除)</p>
<ul>
<li>会員は,当社の保有する自己の個人情報が誤った情報である場合には,当社が定める手続きにより,当社に対して個人情報の訂正または削除を請求することができます。</li>
<li>当社は,会員から前項の請求を受けてその請求に応じる必要があると判断した場合には,遅滞なく,当該個人情報の訂正または削除を行い,これを会員に通知します。</li>
</ul>
<p class="ttl">第7条(個人情報の利用停止等)</p>
<p>囲を超えて取り扱われているという理由,または不正の手段により取得されたものであるという理由により,その利用の停止または消去(以下,「利用停止等」といいます。)を求められた場合には,遅滞なく必要な調査を行い,その結果に基づき,個人情報の利用停止等を行い,その旨本人に通知します。ただし,個人情報の利用停止等に多額の費用を有する場合その他利用停止等を行うことが困難な場合であって,本人の権利利益を保護するために必要なこれに代わるべき措置をとれる場合は,この代替策を講じます。</p>
<p class="ttl">第8条(プライバシーポリシーの変更)</p>
<ul>
<li>本ポリシーの内容は,会員に通知することなく,変更することができるものとします。</li>
<li>当社が別途定める場合を除いて,変更後のプライバシーポリシーは,本ウェブサイトに掲載したときから効力を生じるものとします。</li>
</ul>
<p class="ttl">第9条(お問い合わせ窓口)</p>
<p>本ポリシーに関するお問い合わせは,下記の窓口までお願いいたします。<br><br>Eメールアドレス<b><a href='mailto:56@zotman.jp'>56@zotman.jp</a></b></p>
</div>
</div>
</div>
</main>
@endsection

ファイルの表示

@ -1,141 +0,0 @@
@extends('common.layout')
@section('title', 'KIKI')
@section('content')
<main class="l-single-main l-sign-up">
<div class="l-centeringbox">
<div class="l-centeringbox-wrap">
<div class="l-single-container term-wrap">
<p class="text-center font-weight-bold ft-22 mt-5">利用規約</p>
<p class="text-center text-gray font-weight-bold mb-5">Terms of service</p>
この利用規約(以下「本規約」といいます。)は株式会社ZOTMAN(以下「当社」といいます。)がこのサイト上で提供するサービス(以下「本サービス」といいます。)の利用条件を定めるものです。登録会員の皆さま(以下「会員」といいます。)には本規約に従って本サービスをご利用いただきます。
<p class="ttl">第1条(適用)</p>
<p>本規約は,加盟店及び会員と当社との間の本サービスの利用に関わる一切の関係に適用されるものとします。</p>
<p class="ttl">第2条(利用登録)</p>
<ul>
<li>登録希望者が当社の定める方法によって利用登録を申請し,当社がこれを承認することによって,利用登録が完了するものとします。</li>
<li>当社は,利用登録の申請者に以下の事由があると判断した場合,利用登録の申請を承認しないことがあり,その理由については一切の開示義務を負わないものとします。
<ul>
<li>利用登録の申請に際して虚偽の事項を届け出た場合</li>
<li>本規約に違反したことがある者からの申請である場合</li>
<li>未成年者,成年被後見人,被保佐人または被補助人のいずれかであり,法定代理人,後見人,保佐人または補助人の同意等を得ていなかった場合</li>
<li>反社会的勢力等(暴力団,暴力団員,右翼団体,反社会的勢力,その他これに準ずる者を意味します。)である,または資金提供その他を通じて反社会的勢力等の維持,運営もしくは経営に協力もしくは関与する等反社会的勢力との何らかの交流もしくは関与を行っていると当社が判断した場合</li>
<li>その他,当社が利用登録を相当でないと判断した場合</li>
</ul>
</li>
</ul>
<p class="ttl">第3条(会員IDおよびパスワードの管理)</p>
<ul>
<li>加盟店及び会員は自己の責任において本サービスの会員IDおよびパスワードを管理するものとします。</li>
<li>加盟店及び会員はいかなる場合にも会員IDおよびパスワードを第三者に譲渡または貸与することはできません。当社は加盟店及び会員IDとパスワードの組み合わせが登録情報と一致してログインされた場合にはその会員IDを登録している会員自身による利用とみなします。</li>
</ul>
<p class="ttl">第4条(利用料金および支払、返金方法)</p>
<ul>
<li>加盟店及び会員は,本サービス利用の対価として,当社が別途定め,本サービスに表示する利用料金を,当社が指定する方法により支払うものとします。</li>
<li>加盟店が利用料金の支払を遅滞した場合には加盟店は年146の割合による遅延損害金を支払うものとします。</li>
<li>運営者からの返金はいかなる理由であろうと不可とする。</li>
<li>退会や広告掲載の終了をユーザーから申請がない限り自動更新され以降課金は継続されます。</li>
<li>広告掲載期間未満で広告契約の終了を申し出た場合は残りの掲載期間月の掲載料金を一括で課金することにより掲載を終了できます。</li>
</ul>
<p class="ttl">第5条(禁止事項)</p>
<p>加盟店及び会員は,本サービスの利用にあたり,以下の行為をしてはなりません。</p>
<ul>
<li>法令または公序良俗に違反する行為</li>
<li>犯罪行為に関連する行為</li>
<li>当社のサーバーまたはネットワークの機能を破壊したり,妨害したりする行為</li>
<li>当社のサービスの運営を妨害するおそれのある行為</li>
<li>他の会員に関する個人情報等を収集または蓄積する行為</li>
<li>他の会員に成りすます行為</li>
<li>当社のサービスに関連して,反社会的勢力に対して直接または間接に利益を供与する行為</li>
<li>当社,本サービスの他の利用者または第三者の知的財産権,肖像権,プライバシー,名誉その他の権利または利益を侵害する行為</li>
<li>過度に暴力的な表現,露骨な性的表現,人種,国籍,信条,性別,社会的身分,門地等による差別につながる表現,自殺,自傷行為,薬物乱用を誘引または助長する表現,その他反社会的な内容を含み他人に不快感を与える表現を,投稿または送信する行為</li>
<li>営業,宣伝,広告,勧誘,その他営利を目的とする行為(当社の認めたものを除きます。),性行為やわいせつな行為を目的とする行為,面識のない異性との出会いや交際を目的とする行為,他のお客様に対する嫌がらせや誹謗中傷を目的とする行為,その他本サービスが予定している利用目的と異なる目的で本サービスを利用する行為</li>
<li>宗教活動または宗教団体への勧誘行為</li>
<li>その他,当社が不適切と判断する行為</li>
</ul>
<p class="ttl">第6条(本サービスの提供の停止等)</p>
<ul>
<li>法令または公当社は,以下のいずれかの事由があると判断した場合,加盟店及び会員に事前に通知することなく本サービスの全部または一部の提供を停止または中断することができるものとします。序良俗に違反する行為
<ul>
<li>本サービスにかかるコンピュータシステムの保守点検または更新を行う場合</li>
<li>地震,落雷,火災,停電または天災などの不可抗力により,本サービスの提供が困難となった場合</li>
<li>コンピュータまたは通信回線等が事故により停止した場合</li>
<li>その他,当社が本サービスの提供が困難と判断した場合</li>
</ul>
</li>
<li>当社は,本サービスの提供の停止または中断により,会員または第三者が被ったいかなる不利益または損害について,理由を問わず一切の責任を負わないものとします。</li>
</ul>
<p class="ttl">第7条(著作権)</p>
<ul>
<li>加盟店及び会員は,自ら著作権等の必要な知的財産権を有するか,または必要な権利者の許諾を得た文章,画像や映像等の情報のみ,本サービスを利用し,投稿または編集することができるものとします。</li>
<li>加盟店と会員が本サービスを利用して投稿または編集した文章,画像,映像等の著作権については,当該会員その他既存の権利者に留保されるものとします。ただし,当社は,本サービスを利用して投稿または編集された文章,画像,映像等を利用できるものとし,加盟店及び会員は,この利用に関して,著作者人格権を行使しないものとします。</li>
<li>前項本文の定めるものを除き,本サービスおよび本サービスに関連する一切の情報についての著作権およびその他知的財産権はすべて当社または当社にその利用を許諾した権利者に帰属し,加盟店及び会員は無断で複製,譲渡,貸与,翻訳,改変,転載,公衆送信(送信可能化を含みます。),伝送,配布,出版,営業使用等をしてはならないものとします。</li>
</ul>
<p class="ttl">第8条(利用制限および登録抹消)</p>
<ul>
<li>当社は,以下の場合には,事前の通知なく,投稿データを削除し,加盟店及び会員に対して本サービスの全部もしくは一部の利用を制限しまたは加盟店及び会員の登録を抹消することができるものとします。
<ul>
<li>本規約のいずれかの条項に違反した場合</li>
<li>登録事項に虚偽の事実があることが判明した場合</li>
<li>破産,民事再生,会社更生または特別清算の手続開始決定等の申立がなされたとき</li>
<li>1年間以上本サービスの利用がない場合</li>
<li>当社からの問い合わせその他の回答を求める連絡に対して30日間以上応答がない場合</li>
<li>第2条第2項各号に該当する場合</li>
<li>その他,当社が本サービスの利用を適当でないと判断した場合</li>
</ul>
</li>
<li>項各号のいずれかに該当した場合,加盟店及び会員は,当然に当社に対する一切の債務について期限の利益を失い,その時点において負担する一切の債務を直ちに一括して弁済しなければなりません。</li>
<li>当社は,本条に基づき当社が行った行為により加盟店及び会員に生じた損害について,一切の責任を負いません。</li>
</ul>
<p class="ttl">第9条(保証の否認および免責事項)</p>
<ul>
<li>当社は,本サービスに事実上または法律上の瑕疵(安全性,信頼性,正確性,完全性,有効性,特定の目的への適合性,セキュリティなどに関する欠陥,エラーやバグ,権利侵害などを含みます。)がないことを明示的にも黙示的にも保証しておりません。</li>
<li>当社は,本サービスに起因して加盟店及び会員に生じたあらゆる損害について一切の責任を負いません。ただし,本サービスに関する当社と加盟店及び会員との間の契約(本規約を含みます。)が消費者契約法に定める消費者契約となる場合,この免責規定は適用されません。</li>
<li>前項ただし書に定める場合であっても,当社は,当社の過失による債務不履行または不法行為により加盟店及び会員に生じた損害のうち特別な事情から生じた損害(当社または加盟店及び会員が損害発生につき予見し,または予見し得た場合を含みます。)について一切の責任を負いません。また,当社の過失による債務不履行または不法行為により加盟店及び会員に生じた損害の賠償は,加盟店と会員から当該損害が発生した月に受領した利用料の10%額を上限とします。</li>
<li>当社は,本サービスに関して,加盟店と会員と他の加盟店及び会員または第三者との間において生じた取引,連絡または紛争等について一切責任を負いません。</li>
</ul>
<p class="ttl">第10条(サービス内容の変更等)</p>
<p>当社は,会員に通知することなく,本サービスの内容を変更しまたは本サービスの提供を中止することができるものとし,これによって加盟店及び会員に生じた損害について一切の責任を負いません。</p>
<p class="ttl">第11条(利用規約の変更)</p>
<p>当社は,必要と判断した場合には,加盟店及び会員に通知することなくいつでも本規約を変更することができるものとします。</p>
<p class="ttl">第12条(通知または連絡)</p>
<p>加盟店及び会員と当社との間の通知または連絡は,当社の定める方法によって行うものとします。</p>
<p class="ttl">第13条(権利義務の譲渡の禁止)</p>
<p>加盟店及び会員は,当社の書面による事前の承諾なく,利用契約上の地位または本規約に基づく権利もしくは義務を第三者に譲渡し,または担保に供することはできません。</p>
<p class="ttl">第14条(準拠法・裁判管轄)</p>
<ul>
<li>本規約の解釈にあたっては,日本法を準拠法とします。</li>
<li>本サービスに関して紛争が生じた場合には,当社の本店所在地を管轄する裁判所を専属的合意管轄とします。</li>
</ul>
<p class="mt-5 text-right">以上</p>
</div>
</div>
</div>
</main>
@endsection

ファイルの表示

@ -63,12 +63,12 @@ Route::group(['prefix' => 'p-account'], function () {
});
Route::group(['prefix' => 'contact-us'], function () {
Route::get('/', function () { return view('pages.contact'); });
Route::get('/complete', function () { return view('pages.contact'); });
Route::get('/', function () { return view('pages.index'); });
Route::get('/complete', function () { return view('pages.index'); });
});
Route::get('/unknown-error ', function () { return view('pages.contact'); });
Route::get('/terms', function () { return view('pages.terms'); });
Route::get('/privacy-policy', function () { return view('pages.privacy'); });
Route::get('/unknown-error ', function () { return view('pages.index'); });
Route::get('/terms', function () { return view('pages.index'); });
Route::get('/privacy-policy', function () { return view('pages.index'); });
// ---------------------------------------- Child Account ------------------------------------------- //
Route::group(['prefix' => 'c-account'], function () {

ファイルの表示

@ -1,4 +1,4 @@
FROM php:8.0.3-fpm-buster
FROM --platform=linux/amd64 php:8.0.3-fpm-buster
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
ENV COMPOSER_ALLOW_SUPERUSER=1 \
@ -12,23 +12,23 @@ RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
# yarnをインストール
RUN apt-get update && \
apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev && \
apt-get clean && \
curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb && \
curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb && \
curl --output libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb && \
curl --output libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb && \
curl --output libjpeg-dev_1.5.2-2+deb10u1_all.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg-dev_1.5.2-2+deb10u1_all.deb && \
dpkg -i libpng16-16_1.6.36-6_amd64.deb && \
dpkg -i libpng-dev_1.6.36-6_amd64.deb && \
dpkg -i libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb && \
dpkg -i libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb && \
dpkg -i libjpeg-dev_1.5.2-2+deb10u1_all.deb && \
rm -rf *.deb && \
rm -rf /var/lib/apt/lists/* && \
docker-php-ext-configure gd --with-jpeg && \
docker-php-ext-install -j$(nproc) intl pdo_mysql zip bcmath gd exif
RUN apt-get update
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev
RUN apt-get clean
RUN curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb
RUN curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb
RUN curl --output libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb
RUN curl --output libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb
RUN curl --output libjpeg-dev_1.5.2-2+deb10u1_all.deb http://ftp.jp.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg-dev_1.5.2-2+deb10u1_all.deb
RUN dpkg -i libpng16-16_1.6.36-6_amd64.deb
RUN dpkg -i libpng-dev_1.6.36-6_amd64.deb
RUN dpkg -i libjpeg62-turbo_1.5.2-2+deb10u1_amd64.deb
RUN dpkg -i libjpeg62-turbo-dev_1.5.2-2+deb10u1_amd64.deb
RUN dpkg -i libjpeg-dev_1.5.2-2+deb10u1_all.deb
RUN rm -rf *.deb
RUN rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-jpeg
RUN docker-php-ext-install -j$(nproc) intl pdo_mysql zip bcmath gd exif
COPY ./php.ini /usr/local/etc/php/php.ini