Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion app/Plugins/User/Searchs/SearchsPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -420,14 +420,19 @@ public function saveBuckets($request, $page_id, $frame_id, $id = null)
$message = '設定を変更しました。';
}

$target_frame_ids = $request->target_frame_ids;
if (intval($request->frame_select) == SearchsFrameSelect::all_frames && !$request->has('target_frame_ids')) {
$target_frame_ids = empty($searchs->target_frame_ids) ? [] : explode(',', $searchs->target_frame_ids);
}

// 設定データ
$searchs->search_name = $request->search_name;
$searchs->count = $request->count;
$searchs->view_posted_name = intval($request->view_posted_name);
$searchs->view_posted_at = intval($request->view_posted_at);
$searchs->target_plugins = implode(',', $request->target_plugin);
$searchs->frame_select = intval($request->frame_select);
$searchs->target_frame_ids = empty($request->target_frame_ids) ? "": implode(',', $request->target_frame_ids);
$searchs->target_frame_ids = empty($target_frame_ids) ? "": implode(',', $target_frame_ids);
$searchs->recieve_keyword = intval($request->recieve_keyword);
$searchs->page_select = intval($request->page_select);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
@if (isset($searchs))
@if (!$searchs->id && !$create_flag)
@else
<form action="{{url('/')}}/plugin/searchs/saveBuckets/{{$page->id}}/{{$frame_id}}#frame-{{$frame->id}}" method="POST" class="">
<form action="{{url('/')}}/plugin/searchs/saveBuckets/{{$page->id}}/{{$frame_id}}#frame-{{$frame->id}}" method="POST" class="" id="searchs_edit_form_{{$frame->id}}">
{{ csrf_field() }}

{{-- create_flag がtrue の場合、新規作成するためにsearchs_id を空にする --}}
Expand Down Expand Up @@ -167,15 +167,42 @@
</div>
</div>

@php
$selected_frame_select = old('frame_select', $searchs->frame_select);
@endphp

<div class="form-group row mb-0">
<label class="{{$frame->getSettingLabelClass()}}">フレームの選択</label>
<div class="{{$frame->getSettingInputClass(true)}}">
@foreach (SearchsFrameSelect::enum as $key => $item)
<div class="custom-control custom-radio custom-control-inline">
@if(old('frame_select', $searchs->frame_select) == $key)
<input type="radio" value="{{$key}}" id="frame_select_{{$key}}" name="frame_select" class="custom-control-input" checked="checked">
@if($selected_frame_select == $key)
<input
type="radio"
value="{{$key}}"
id="frame_select_{{$key}}"
name="frame_select"
class="custom-control-input"
checked="checked"
@if($key == SearchsFrameSelect::all_frames)
data-toggle="collapse" data-target="#collapse_frame_select{{$frame_id}}.show"
@else
data-toggle="collapse" data-target="#collapse_frame_select{{$frame_id}}:not(.show)" aria-expanded="true" aria-controls="collapse_frame_select{{$frame_id}}"
@endif
>
@else
<input type="radio" value="{{$key}}" id="frame_select_{{$key}}" name="frame_select" class="custom-control-input">
<input
type="radio"
value="{{$key}}"
id="frame_select_{{$key}}"
name="frame_select"
class="custom-control-input"
@if($key == SearchsFrameSelect::all_frames)
data-toggle="collapse" data-target="#collapse_frame_select{{$frame_id}}.show"
@else
data-toggle="collapse" data-target="#collapse_frame_select{{$frame_id}}:not(.show)" aria-expanded="true" aria-controls="collapse_frame_select{{$frame_id}}"
@endif
>
@endif
<label class="custom-control-label" for="frame_select_{{$key}}">{{ SearchsFrameSelect::getDescription($key) }}</label>
</div>
Expand All @@ -193,9 +220,9 @@
</div>
</div>

<div class="form-group row">
<div class="form-group row collapse" id="collapse_frame_select{{$frame_id}}">
<label class="{{$frame->getSettingLabelClass()}}">対象ページ - フレーム</label>
<div class="{{$frame->getSettingInputClass(false, true)}}">
<div class="{{$frame->getSettingInputClass(false, true)}}" id="searchs_target_frames_{{$frame->id}}">
<ul class="nav nav-pills" role="tablist">
@foreach(SearchsTargetPlugin::getPluginsCanSpecifiedFrames() as $target_plugin => $target_plugin_full)
<li class="nav-item">
Expand Down Expand Up @@ -275,4 +302,35 @@
@endif
@endif
@endif

<script>
(function() {
const allFramesValue = '{{ SearchsFrameSelect::all_frames }}';
const targetFramesArea = document.getElementById('searchs_target_frames_{{ $frame->id }}');
const collapseTargetFrames = document.getElementById('collapse_frame_select{{ $frame_id }}');
const searchsEditForm = document.getElementById('searchs_edit_form_{{ $frame->id }}');
const frameSelects = searchsEditForm ? searchsEditForm.querySelectorAll('input[name="frame_select"]') : [];

if (!searchsEditForm || !collapseTargetFrames || !targetFramesArea || frameSelects.length === 0) {
return;
}

const setTargetFramesDisabled = function() {
const checkedFrameSelect = searchsEditForm.querySelector('input[name="frame_select"]:checked');
const disabled = checkedFrameSelect && checkedFrameSelect.value === allFramesValue;

targetFramesArea.setAttribute('aria-disabled', disabled ? 'true' : 'false');
};

frameSelects.forEach(function(frameSelect) {
frameSelect.addEventListener('change', setTargetFramesDisabled);
});

setTargetFramesDisabled();

@if (isset($selected_frame_select) && $selected_frame_select == SearchsFrameSelect::selected_only)
$('#collapse_frame_select{{$frame_id}}').collapse('show')
@endif
})();
</script>
@endsection
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<?php

namespace Tests\Feature\Plugins\User\Searchs;

use App\Enums\SearchsFrameSelect;
use App\Enums\SearchsPageSelect;
use App\Models\Common\Buckets;
use App\Models\User\Searchs\Searchs;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\Feature\Plugins\User\DefaultBucketRolesFeatureTestTrait;
use Tests\TestCase;

/**
* サイト内検索設定の対象フレーム保存を検証する。
*
* 設定保存の公開ルートを通して、フレーム選択UIの表示状態に左右されず、
* 既存の対象フレーム指定が意図せず失われないことを守る。
*/
class SearchsTargetFrameSaveFeatureTest extends TestCase
{
use DefaultBucketRolesFeatureTestTrait;
use RefreshDatabase;

/**
* テスト前に初期データを投入する。
*/
protected function setUp(): void
{
parent::setUp();

$this->seed();
}

/**
* 「全て表示する」で保存しても、画面上では使わない既存の対象フレーム指定を保持すること。
*/
public function testSaveBucketsKeepsTargetFrameIdsWhenAllFramesRequestOmitsThem(): void
{
$admin = $this->createContentAdminUser();
[$page, $frame] = $this->createPluginFrame('searchs');
$searchs = $this->createSearchsBucket($frame->id, '10,20');

$response = $this->actingAs($admin)->post("/redirect/plugin/searchs/saveBuckets/{$page->id}/{$frame->id}", [
'redirect_path' => url("/plugin/searchs/editBuckets/{$page->id}/{$frame->id}#frame-{$frame->id}"),
'searchs_id' => $searchs->id,
'search_name' => 'サイト内検索を更新',
'count' => 20,
'view_posted_name' => 0,
'view_posted_at' => 0,
'target_plugin' => ['blogs' => 'blogs'],
'frame_select' => SearchsFrameSelect::all_frames,
'recieve_keyword' => 0,
'page_select' => SearchsPageSelect::all_pages,
]);

$response->assertStatus(302);
$this->assertDatabaseHas('searchs', [
'id' => $searchs->id,
'frame_select' => SearchsFrameSelect::all_frames,
'target_frame_ids' => '10,20',
]);
}

/**
* 「選択したものだけ表示する」で保存した場合は、送信された対象フレーム指定へ更新すること。
*/
public function testSaveBucketsUpdatesTargetFrameIdsWhenSelectedOnlySendsThem(): void
{
$admin = $this->createContentAdminUser();
[$page, $frame] = $this->createPluginFrame('searchs');
$searchs = $this->createSearchsBucket($frame->id, '10,20');

$response = $this->actingAs($admin)->post("/redirect/plugin/searchs/saveBuckets/{$page->id}/{$frame->id}", [
'redirect_path' => url("/plugin/searchs/editBuckets/{$page->id}/{$frame->id}#frame-{$frame->id}"),
'searchs_id' => $searchs->id,
'search_name' => 'サイト内検索を更新',
'count' => 20,
'view_posted_name' => 0,
'view_posted_at' => 0,
'target_plugin' => ['blogs' => 'blogs'],
'frame_select' => SearchsFrameSelect::selected_only,
'target_frame_ids' => [30 => 30],
'recieve_keyword' => 0,
'page_select' => SearchsPageSelect::all_pages,
]);

$response->assertStatus(302);
$this->assertDatabaseHas('searchs', [
'id' => $searchs->id,
'frame_select' => SearchsFrameSelect::selected_only,
'target_frame_ids' => '30',
]);
}

/**
* 既存バケツとサイト内検索設定を作成し、指定フレームに紐づける。
*/
private function createSearchsBucket(int $frame_id, string $target_frame_ids): Searchs
{
$bucket = Buckets::factory()->create([
'bucket_name' => 'サイト内検索',
'plugin_name' => 'searchs',
]);
$this->assertDatabaseHas('frames', [
'id' => $frame_id,
]);

app('db')->table('frames')
->where('id', $frame_id)
->update(['bucket_id' => $bucket->id]);

return Searchs::create([
'bucket_id' => $bucket->id,
'search_name' => 'サイト内検索',
'count' => 10,
'view_posted_name' => 0,
'view_posted_at' => 0,
'target_plugins' => 'blogs',
'frame_select' => SearchsFrameSelect::selected_only,
'target_frame_ids' => $target_frame_ids,
'recieve_keyword' => 0,
'page_select' => SearchsPageSelect::all_pages,
]);
}
}
Loading