オペレータキュー画面の修正
All checks were successful
Deploy main / deploy (push) Successful in 22s

- ルーティングコメントを修正
This commit is contained in:
kin.rinzen 2025-10-08 14:50:40 +09:00
parent fd6686d5c9
commit 9a6abe680f
9 changed files with 182 additions and 192 deletions

View File

@ -22,7 +22,8 @@ class OperatorQueController extends Controller
public function list(Request $request)
{
$sort = $request->input('sort', 'que_id');
$sort_type = $request->input('sort_type', 'desc');
$sort_type = $request->input('sort_type', 'asc');
$que_status = $request->input('que_status');
// 許可されたカラム名のリストDB定義に合わせて
$allowedSorts = ['que_id', 'ope_id', 'que_status', 'created_at', 'updated_at'];
@ -38,34 +39,46 @@ class OperatorQueController extends Controller
$query = OperatorQue::query();
// フィルタリング(絞り込み)
if ($request->filled('que_status')) {
$query->where('que_status', $request->input('que_status'));
if (!empty($que_status)) {
$query->where('que_status', $que_status);
}
$list = $query->orderBy($sort, $sort_type)
->paginate(\App\Utils::item_per_page ?? 20);
return view('admin.operator_ques.list', compact('list', 'sort', 'sort_type'));
// view に $que_status を渡す
return view('admin.operator_ques.list', compact('list', 'sort', 'sort_type', 'que_status'));
}
/**
* 新規登録(画面/処理)
*/
public function add(Request $request)
{
if ($request->isMethod('get')) {
// 新規時は空の値でフォーム描画
return view('admin.operator_ques.add', $this->formPayload());
// 新規時は空のレコードを用意してフォーム描画
return view('admin.operator_ques.add', array_merge(
$this->formPayload(),
[
'isEdit' => false,
'record' => new OperatorQue(), // ← ★ _form.blade.php で使う用
'que_id' => null,
]
));
}
// POST時バリデーション
$data = $this->validateRequest($request);
// 登録処理
OperatorQue::create($data);
return redirect()->route('operator_ques')->with('success', 'オペレーターキューを登録しました。');
}
/**
* 編集(画面/処理)
*/
@ -76,7 +89,10 @@ class OperatorQueController extends Controller
if ($request->isMethod('get')) {
return view('admin.operator_ques.edit', array_merge(
$this->formPayload($que),
['que_id' => $que->que_id]
[
'que_id' => $que->que_id,
'record' => $que,
]
));
}
@ -84,7 +100,7 @@ class OperatorQueController extends Controller
$que->fill($data)->save();
return redirect()->route('operator_ques')->with('success', 'オペレータキューを更新しました。');
return redirect()->route('operator_ques')->with('success', 'オペレータキューを更新しました。');
}
/**
@ -233,9 +249,9 @@ class OperatorQueController extends Controller
private function validateRequest(Request $request, $queId = null): array
{
$rules = [
'user_id' => 'required|integer',
'user_id' => 'nullable|integer',
'contract_id' => 'nullable|integer',
'park_id' => 'required|integer',
'park_id' => 'nullable|integer',
'que_class' => 'required|integer',
'que_comment' => 'nullable|string|max:2000',
'que_status' => 'required|integer',

View File

@ -6,89 +6,128 @@
@elseif(Session::has('error'))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> {{__('誤差')}}:</h4>
<h4><i class="icon fa fa-ban"></i> {{ __('入力内容に不備があります:') }}:</h4>
{!! Session::get('error') !!}
</div>
@elseif(isset($errorMsg))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> {{__('誤差')}}:</h4>
<h4><i class="icon fa fa-ban"></i> {{ __('入力内容に不備があります:') }}:</h4>
{!! $errorMsg !!}
</div>
@endif
<div class="card-body">
<div class="row">
@if($isEdit || $isInfo)
<!-- キューID -->
<div class="form-group col-3">
<label>{{__('validation.attributes.que_id')}}</label>
@if ($errors->any())
<div class="alert alert-danger">
<h4>入力内容に不備があります:</h4>
<ol>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ol>
</div>
<div class="form-group col-9">
<div class="input-group">
<input type="text" value="{{$que_id}}" placeholder="{{__('validation.attributes.que_id')}}"
class="form-control form-control-lg" readonly/>
</div>
</div>
<!-- /.form group - キューID -->
@endif
<!-- 利用者名 -->
<div class="row">
{{-- キューID編集時のみ表示 --}}
@if($isEdit)
<div class="form-group col-3">
<label @if(!$isInfo) class="required" @endif>{{__('validation.attributes.user_name')}}</label>
<label>{{ __('validation.attributes.que_id') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" id="select_user" name="user_name" @if($isInfo) disabled @endif>
<option value="">{{__('validation.attributes.user_name')}}</option>
<div class="input-group">
<input type="text"
value="{{ $que_id }}"
placeholder="{{ __('validation.attributes.que_id') }}"
class="form-control form-control-lg"
readonly />
</div>
</div>
@endif
{{-- 利用者名 --}}
<div class="form-group col-3">
<label>{{ __('validation.attributes.user_name') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" id="select_user" name="user_id">
<option value="">{{ __('validation.attributes.user_name') }}</option>
@foreach($users as $item)
<option value="{{$item->user_seq}}" mobile="{{$item->user_mobile}}" homePhone="{{$item->user_homephone}}" @if($item->user_seq == $user_id) selected @endif>{{$item->user_name}}</option>
<option value="{{ $item->user_seq }}"
mobile="{{ $item->user_mobile }}"
homePhone="{{ $item->user_homephone }}"
@if($item->user_seq == $user_id) selected @endif>
{{ $item->user_name }}
</option>
@endforeach
</select>
</div>
<!-- 携帯電話番号 -->
{{-- 携帯電話番号 --}}
<div class="form-group col-3">
<label>{{__('validation.attributes.user_mobile')}}</label>
<label>{{ __('validation.attributes.user_mobile') }}</label>
</div>
<div class="form-group col-9">
<div class="input-group">
<input type="text" value="" id="mobile" placeholder="{{__('validation.attributes.user_mobile')}}"
class="form-control form-control-lg" readonly/>
<input type="text"
id="mobile"
value=""
placeholder="{{ __('validation.attributes.user_mobile') }}"
class="form-control form-control-lg"
readonly />
</div>
</div>
<!-- 自宅電話番号 -->
{{-- 自宅電話番号 --}}
<div class="form-group col-3">
<label>{{__('validation.attributes.user_homephone')}}</label>
<label>{{ __('validation.attributes.user_homephone') }}</label>
</div>
<div class="form-group col-9">
<div class="input-group">
<input type="text" value="" id="homephone" placeholder="{{__('validation.attributes.user_homephone')}}"
class="form-control form-control-lg" readonly/>
<input type="text"
id="homephone"
value=""
placeholder="{{ __('validation.attributes.user_homephone') }}"
class="form-control form-control-lg"
readonly />
</div>
</div>
<!-- 駐輪場 -->
{{-- 定期契約ID --}}
<div class="form-group col-3">
<label @if(!$isInfo) class="required" @endif>{{__('validation.attributes.park_name')}}</label>
<label>{{ __('validation.attributes.contract_id') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" name="park_name" @if($isInfo) disabled @endif>
<option value="">{{__('validation.attributes.park_name')}}</option>
<div class="input-group">
<input type="text"
name="contract_id"
value="{{ old('contract_id', $contract_id ?? '') }}"
class="form-control form-control-lg"
placeholder="{{ __('validation.attributes.contract_id') }}"
readonly>
</div>
</div>
{{-- 駐輪場 --}}
<div class="form-group col-3">
<label>{{ __('validation.attributes.park_name') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" name="park_id">
<option value="">{{ __('validation.attributes.park_name') }}</option>
@foreach($parks as $key => $item)
<option value="{{$key}}" @if($key == $park_id) selected @endif>{{$item}}</option>
<option value="{{ $key }}" @if($key == $park_id) selected @endif>{{ $item }}</option>
@endforeach
</select>
</div>
<!-- キュー種別 -->
{{-- キュー種別 --}}
<div class="form-group col-3">
<label @if(!$isInfo) class="required" @endif>
{{ __('validation.attributes.que_class') }}
</label>
<label class="required">{{ __('validation.attributes.que_class') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" name="que_class" @if($isInfo) disabled @endif>
<select class="form-control form-control-lg" name="que_class">
<option value="">{{ __('validation.attributes.que_class') }}</option>
@foreach(\App\Models\OperatorQue::QueClass as $key => $item)
<option value="{{ $key }}" @if($key == $que_class) selected @endif>
@ -98,28 +137,25 @@
</select>
</div>
<!-- キューコメント -->
{{-- キューコメント --}}
<div class="form-group col-3">
<label>{{__('validation.attributes.que_comment')}}</label>
<label>{{ __('validation.attributes.que_comment') }}</label>
</div>
<div class="form-group col-9">
<div class="input-group">
<textarea class="form-control form-control-lg" @if($isInfo) readonly @endif rows="5"
placeholder="{{__('validation.attributes.que_comment')}}"
name="que_comment">{{$que_comment}}</textarea>
<textarea class="form-control form-control-lg"
rows="5"
name="que_comment"
placeholder="{{ __('validation.attributes.que_comment') }}">{{ $que_comment }}</textarea>
</div>
</div>
<!-- /.form group - キューコメント -->
<!-- キューステータス -->
{{-- キューステータス --}}
<div class="form-group col-3">
<label @if(!$isInfo) class="required" @endif>
{{ __('validation.attributes.que_status') }}
</label>
<label class="required">{{ __('validation.attributes.que_status') }}</label>
</div>
<div class="form-group col-9">
<select class="form-control form-control-lg" name="que_status" @if($isInfo) disabled @endif>
<select class="form-control form-control-lg" name="que_status">
<option value="">{{ __('validation.attributes.que_status') }}</option>
@foreach(\App\Models\OperatorQue::QueStatus as $key => $item)
<option value="{{ $key }}" @if($key == $que_status) selected @endif>
@ -129,28 +165,43 @@
</select>
</div>
<!-- キューステータスコメント -->
{{-- キューステータスコメント --}}
<div class="form-group col-3">
<label>{{__('validation.attributes.que_status_comment')}}</label>
<label>{{ __('validation.attributes.que_status_comment') }}</label>
</div>
<div class="form-group col-9">
<div class="input-group">
<textarea class="form-control form-control-lg" @if($isInfo) readonly @endif rows="5"
placeholder="{{__('validation.attributes.que_status_comment')}}"
name="que_status_comment">{{$que_status_comment}}</textarea>
</div>
<textarea class="form-control form-control-lg"
rows="5"
name="que_status_comment"
placeholder="{{ __('validation.attributes.que_status_comment') }}">{{ $que_status_comment }}</textarea>
</div>
</div>
{{-- 下部ボタン --}}
</div>
{{-- 下部ボタン --}}
<div class="row mt-4">
<div class="form-group col-md-10 d-flex align-items-center gap-2 justify-content-start">
{{-- 登録ボタン --}}
@if($isEdit)
<button type="submit" class="btn btn-lg btn-success register">{{ __('保存') }}</button>
<button type="submit" class="btn btn-lg btn-secondary register">{{ __('戻る') }}</button>
<button type="button" id="register_edit" class="btn btn-lg btn-success mr-2">
{{ __('登録') }}
</button>
@else
<button type="submit" class="btn btn-lg btn-success register">{{ __('登録') }}</button>
<button type="submit" class="btn btn-lg btn-danger register">{{ __('削除') }}</button>
<button type="button" id="register" class="btn btn-lg btn-success mr-2 register">
{{ __('登録') }}
</button>
@endif
</div>
{{-- 削除ボタン(編集時のみ表示) --}}
@if($isEdit)
<button type="button" id="delete_edit" class="btn btn-lg btn-danger">
{{ __('削除') }}
</button>
@endif
</div>
</div>
</div>

View File

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] オペレータキュー')
@section('title', '新規')
@section('content')
<!-- Content Header (Page header) -->
@ -8,13 +8,13 @@
<div class="container-fluid">
<div class="row mb-2">
<div class="col-lg-6">
<h1 class="m-0 text-dark">新規登録</h1>
<h1 class="m-0 text-dark">新規</h1>
</div><!-- /.col -->
<div class="col-lg-6">
<ol class="breadcrumb float-sm-right text-sm">
<li class="breadcrumb-item"><a href="{{ route('home') }}">ホーム</a></li>
<li class="breadcrumb-item"><a href="{{ route('operator_ques') }}">オペレータキュー</a></li>
<li class="breadcrumb-item active">新規登録</li>
<li class="breadcrumb-item active">新規</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
@ -30,12 +30,15 @@
<div class="row">
<div class="col-lg-12">
<div class="card">
<form method="post" action="{{ route('operator_ques_add')}}" enctype="multipart/form-data">
<!-- TOKEN FORM -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" >
<!-- / .TOKEN FORM -->
@include('admin.operator_ques._form',['isEdit'=>0,'isInfo'=>0])
{{-- 新規登録フォーム --}}
<form id="form_register"
action="{{ route('operator_ques_add') }}"
method="POST"
enctype="multipart/form-data">
@csrf
@include('admin.operator_ques._form', ['isEdit' => false])
</form>
</div>
</div>
</div>

View File

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] オペレータキュー')
@section('title', '編集')
@section('content')
<!-- Content Header (Page header) -->
@ -30,12 +30,24 @@
<div class="row">
<div class="col-lg-12">
<div class="card">
<form method="post" action="{{ route('operator_ques_edit',['id'=>$que_id])}}" enctype="multipart/form-data">
<!-- TOKEN FORM -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" >
<!-- / .TOKEN FORM -->
@include('admin.operator_ques._form',['isEdit'=>1,'isInfo'=>0])
{{-- Edit Form --}}
<form id="form_edit"
action="{{ route('operator_ques_edit', ['id' => $record->que_id]) }}"
method="POST">
@csrf
@include('admin.operator_ques._form', ['isEdit' => true])
</form>
{{-- Delete Form --}}
<form id="form_delete"
action="{{ route('operator_ques_delete') }}"
method="POST"
style="display:none;">
@csrf
<input type="hidden" name="id" value="{{ $record->que_id }}">
</form>
</div>
</div>
</div>

View File

@ -1,53 +0,0 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] オペレータキュー')
@section('content')
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-lg-6">
<h1 class="m-0 text-dark">[東京都|〇〇駐輪場] オペレータキュー</h1>
</div><!-- /.col -->
<div class="col-lg-6">
<ol class="breadcrumb float-sm-right text-sm">
<li class="breadcrumb-item"><a href="./index2.html">XX様info(ホーム)</a></li>
<li class="breadcrumb-item"><a href="./index3.html">[東京都|〇〇駐輪場]</a></li>
<li class="breadcrumb-item">オペレータキュー</li>
<li class="breadcrumb-item active">利用者マスタ</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<!-- SELECT2 EXAMPLE -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<form method="post" action="{{ route('operator_ques_info',['id'=>$que_id])}}" enctype="multipart/form-data">
<!-- TOKEN FORM -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" >
<!-- / .TOKEN FORM -->
@include('admin.operator_ques._form',['isEdit'=>0,'isInfo'=>1])
</form>
</div>
</div>
</div>
<div class="container-fluid mb20">
<button type="submit" class="btn btn-sm btn-default mr10">{{__('削除')}}</button>
<button type="submit" class="btn btn-sm btn-default mr10">{{__('インポート')}}</button>
<button type="submit" class="btn btn-sm btn-default mr10">{{__('CSV出力')}}</button>
</div>
</div>
</section>
<!-- /.content -->
@endsection

View File

@ -1,5 +1,5 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] オペレータキュー')
@section('title', 'オペレータキュー')
@section('content')
<div class="content-header">
@ -41,11 +41,11 @@
@endforeach
</select>
</div>
</div>
<div class="form-group col-12 text-left">
<button type="submit" name="action" value="filter" class="btn btn-default">絞り込み</button>
<button type="submit" name="action" value="reset" class="btn btn-default">解除</button>
<a href="{{ route('operator_ques') }}" class="btn btn-default">解除</a>
</div>
</div>
</form>
</div>
@ -56,9 +56,9 @@
<div class="container-fluid">
<!-- ツールバー -->
<div class="container-fluid mb20">
<button type="button" class="btn btn-sm btn-default mr10" onclick="location.href='{{ route('operator_ques_add') }}'">新規</button>
<button type="button" class="btn btn-sm btn-default mr10" id="delete">削除</button>
<button type="button" class="btn btn-sm btn-default mr10" onclick="location.href='{{ route('operator_ques_import') }}'">インポート</button>
<button type="submit" class="btn btn-sm btn-default mr10" form="form_export">{{ __('CSV出力') }}</button>
<div class="d-flex justify-content-end">
{{ $list->appends(['sort' => $sort ?? '', 'sort_type' => $sort_type ?? ''])->links('pagination') }}
</div>
@ -75,13 +75,13 @@
@elseif(Session::has('error'))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> {{ __('誤差') }}:</h4>
<h4><i class="icon fa fa-ban"></i> {{ __('入力内容に不備があります') }}:</h4>
{!! Session::get('error') !!}
</div>
@elseif(isset($errorMsg))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> {{ __('誤差') }}:</h4>
<h4><i class="icon fa fa-ban"></i> {{ __('入力内容に不備があります') }}:</h4>
{!! $errorMsg !!}
</div>
@endif
@ -94,9 +94,9 @@
<form action="{{ route('operator_ques_delete') }}" method="POST" id="form_delete">
@csrf
<table class="table table-bordered dataTable text-nowrap">
<thead>
<thead class="thead-light">
<tr>
<th style="width:140px;" class="text-left">
<th style="width:120px;" class="text-left">
<input type="checkbox" onclick="$('input[name*=\'pk\']').prop('checked', this.checked);">
</th>
<th class="sorting {{ ($sort=='que_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="que_id"><span>キューID</span></th>
@ -141,43 +141,4 @@
</div>
</section>
<form action="{{ route('operator_ques_export') }}" method="GET" id="form_export"></form>
@push('scripts')
<script>
// 全選択・全解除
document.getElementById('checkbox_all')?.addEventListener('change', function(e){
document.querySelectorAll('.checkbox').forEach(cb => cb.checked = e.target.checked);
});
// 削除確認
document.getElementById('delete')?.addEventListener('click', function(){
const anyChecked = Array.from(document.querySelectorAll('.checkbox')).some(cb => cb.checked);
if (!anyChecked) {
alert('削除対象が選択されていません。');
return;
}
if (confirm('削除してよろしいですか?')) {
document.getElementById('form_delete').submit();
}
});
// ソート
document.querySelectorAll('th.sorting').forEach(th => {
th.addEventListener('click', function(){
const form = document.getElementById('list-form');
const current = "{{ $sort ?? '' }}";
const currentType = "{{ $sort_type ?? '' }}";
const nextCol = this.getAttribute('sort');
let nextType = 'asc';
if (current === nextCol) {
nextType = (currentType === 'asc') ? 'desc' : 'asc';
}
form.querySelector('[name=sort]').value = nextCol;
form.querySelector('[name=sort_type]').value = nextType;
form.submit();
});
});
</script>
@endpush
@endsection

View File

@ -605,7 +605,7 @@
<ul class="nav nav-treeview" style="display: @if(in_array($current, $systemRoutes)) block @else none @endif;">
<li class="nav-item">
<a href="{{ route('opes') }}" class="nav-link @if($current === 'opes') active @endif">
<span style="margin-left:20px;">{{ __("オペレータマスタ") }}</span>
<span style="margin-left:20px;">{{ __("オペレータマスタ") }}</span>
</a>
</li>
<li class="nav-item">
@ -616,7 +616,7 @@
<li class="nav-item">
<a href="{{ route('operator_ques') }}" class="nav-link @if($current === 'operator_ques') active @endif">
<i class="nav-icon"></i>
<span style="margin-left:20px;">{{ __("オペレータキュー") }}</span>
<span style="margin-left:20px;">{{ __("オペレータキュー") }}</span>
</a>
</li>
<li class="nav-item">

View File

@ -438,7 +438,7 @@ Route::middleware('auth')->group(function () {
Route::match(['get', 'post'], '/devices/delete', [DeviceController::class, 'delete'])->name('devices_delete');
Route::post('/devices/import', [DeviceController::class, 'import'])->name('devices_import');
// [東京都|〇〇駐輪場] オペレータキュー
// [東京都|〇〇駐輪場] オペレータキュー
Route::match(['get', 'post'], '/operator_ques', [OperatorQueController::class, 'list'])->name('operator_ques');
Route::match(['get', 'post'], '/operator_ques/add', [OperatorQueController::class, 'add'])->name('operator_ques_add');
Route::match(['get', 'post'], '/operator_ques/edit/{id}', [OperatorQueController::class, 'edit'])