Commit 77ece55780c19fb29b9520dc4693c282910a763c

Authored by Fedor
1 parent 31e0a8793e
Exists in master

task-132687 FAQ page now editable

Showing 13 changed files with 371 additions and 340 deletions Side-by-side Diff

app/Enums/FaqTarget.php
... ... @@ -0,0 +1,9 @@
  1 +<?php
  2 +
  3 +namespace App\Enums;
  4 +
  5 +enum FaqTarget: string
  6 +{
  7 + case EMPLOYER = 'employer';
  8 + case EMPLOYEE = 'employee';
  9 +}
app/Http/Controllers/EmployerController.php
... ... @@ -707,11 +707,6 @@ class EmployerController extends Controller
707 707 }
708 708 }
709 709  
710   - // FAQ - Вопросы/ответы для работодателей и соискателей
711   - public function faq() {
712   - return view('employers.faq');
713   - }
714   -
715 710 // Рассылка сообщений
716 711 public function send_all_messages() {
717 712 $id = Auth()->user()->id;
app/Http/Controllers/FaqController.php
... ... @@ -0,0 +1,76 @@
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers;
  4 +
  5 +use App\Enums\FaqTarget;
  6 +use App\Http\Requests\FaqActionRequest;
  7 +use App\Models\Faq;
  8 +use Illuminate\Http\RedirectResponse;
  9 +
  10 +class FaqController extends Controller
  11 +{
  12 + public function get(string $userType = null) {
  13 + return Faq::query()
  14 + ->when($userType, function ($query, $userType) {
  15 + $query->where('target', $userType);
  16 + })
  17 + ->where('active', true)
  18 + ->get();
  19 + }
  20 +
  21 + public function showListForAdmin(){
  22 +
  23 + return view(
  24 + 'admin.faq.list',
  25 + [
  26 + 'questions' => $this->get(),
  27 + ]
  28 + );
  29 + }
  30 +
  31 + public function showListForUser()
  32 + {
  33 + return view(
  34 + 'employers.faq',
  35 + [
  36 + 'questionsEmployer' => $this->get(FaqTarget::EMPLOYER->value),
  37 + 'questionsEmployee' => $this->get(FaqTarget::EMPLOYEE->value)
  38 + ]
  39 + );
  40 + }
  41 +
  42 + public function create()
  43 + {
  44 + return view('admin.faq.create');
  45 + }
  46 +
  47 + public function store(FaqActionRequest $request)
  48 + {
  49 + Faq::query()->create($request->toArray());
  50 +
  51 + return response()->redirectTo(route('admin.faq.list'));
  52 + }
  53 +
  54 + public function edit(int $id)
  55 + {
  56 + return view('admin.faq.update', ['question' => Faq::find($id)]);
  57 + }
  58 +
  59 + public function update(FaqActionRequest $request, int $id)
  60 + {
  61 + Faq::query()
  62 + ->where('id', $id)
  63 + ->update($request->all(['question', 'target', 'answer']));
  64 +
  65 + return response()->redirectTo(route('admin.faq.list'));
  66 + }
  67 +
  68 + public function destroy(int $id): RedirectResponse
  69 + {
  70 + Faq::query()
  71 + ->where('id', $id)
  72 + ->delete();
  73 +
  74 + return response()->redirectTo(route('admin.faq.list'));
  75 + }
  76 +}
app/Http/Requests/FaqActionRequest.php
... ... @@ -0,0 +1,19 @@
  1 +<?php
  2 +
  3 +namespace App\Http\Requests;
  4 +
  5 +use App\Enums\FaqTarget;
  6 +use Illuminate\Foundation\Http\FormRequest;
  7 +use Illuminate\Validation\Rule;
  8 +
  9 +class FaqActionRequest extends FormRequest
  10 +{
  11 + public function rules()
  12 + {
  13 + return [
  14 + 'question' => 'required|string|max:255',
  15 + 'answer' => 'required|string',
  16 + 'target' => ['required', 'string', Rule::enum(FaqTarget::class)],
  17 + ];
  18 + }
  19 +}
... ... @@ -0,0 +1,19 @@
  1 +<?php
  2 +
  3 +namespace App\Models;
  4 +
  5 +use Illuminate\Database\Eloquent\Model;
  6 +
  7 +/**
  8 + * @property string $question
  9 + * @property string $answer
  10 + * @property string $target
  11 + * @property boolean $active
  12 + */
  13 +class Faq extends Model
  14 +{
  15 + protected $guarded = [
  16 + 'created_at',
  17 + 'updated_at'
  18 + ];
  19 +}
database/migrations/2024_09_02_072828_create_faqs_table.php
... ... @@ -0,0 +1,35 @@
  1 +<?php
  2 +
  3 +use Illuminate\Database\Migrations\Migration;
  4 +use Illuminate\Database\Schema\Blueprint;
  5 +use Illuminate\Support\Facades\Schema;
  6 +
  7 +return new class extends Migration
  8 +{
  9 + /**
  10 + * Run the migrations.
  11 + *
  12 + * @return void
  13 + */
  14 + public function up()
  15 + {
  16 + Schema::create('faqs', function (Blueprint $table) {
  17 + $table->id();
  18 + $table->string('question');
  19 + $table->text('answer');
  20 + $table->string('target')->default('employer');
  21 + $table->boolean('active')->default(true);
  22 + $table->timestamps();
  23 + });
  24 + }
  25 +
  26 + /**
  27 + * Reverse the migrations.
  28 + *
  29 + * @return void
  30 + */
  31 + public function down()
  32 + {
  33 + Schema::dropIfExists('faqs');
  34 + }
  35 +};
resources/views/admin/faq/create.blade.php
... ... @@ -0,0 +1,7 @@
  1 +@extends('layout.admin', ['title' => 'Админка - Страница статистики'])
  2 +
  3 +@section('content')
  4 + <form method="POST" action="{{ route('admin.faq.store') }}">
  5 + @include('admin.faq.form')
  6 + </form>
  7 +@endsection
resources/views/admin/faq/form.blade.php
... ... @@ -0,0 +1,100 @@
  1 +@csrf
  2 +
  3 +@isset($question)
  4 + @method('PUT')
  5 +@endisset
  6 +
  7 +<script>
  8 + function translit(word){
  9 + var answer = '';
  10 + var converter = {
  11 + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
  12 + 'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i',
  13 + 'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',
  14 + 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',
  15 + 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch',
  16 + 'ш': 'sh', 'щ': 'sch', 'ь': '', 'ы': 'y', 'ъ': '',
  17 + 'э': 'e', 'ю': 'yu', 'я': 'ya',
  18 +
  19 + 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D',
  20 + 'Е': 'E', 'Ё': 'E', 'Ж': 'Zh', 'З': 'Z', 'И': 'I',
  21 + 'Й': 'Y', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N',
  22 + 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T',
  23 + 'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch',
  24 + 'Ш': 'Sh', 'Щ': 'Sch', 'Ь': '', 'Ы': 'Y', 'Ъ': '',
  25 + 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya', ' ': '-'
  26 + };
  27 +
  28 + for (var i = 0; i < word.length; ++i ) {
  29 + if (converter[word[i]] == undefined){
  30 + answer += word[i];
  31 + } else {
  32 + answer += converter[word[i]];
  33 + }
  34 + }
  35 +
  36 + return answer;
  37 + }
  38 +
  39 + window.addEventListener("DOMContentLoaded", (event) => {
  40 + let title = document.querySelector('#name');
  41 + let text = document.querySelector('#slug');
  42 +
  43 + title.addEventListener('input', function() {
  44 + text.value = translit(this.value);
  45 + });
  46 + });
  47 +
  48 +</script>
  49 +<div class="px-4 py-3 mb-8 bg-white rounded-lg shadow-md dark:bg-gray-800">
  50 + <label class="block text-sm">
  51 + <span class="text-gray-700 dark:text-gray-400">Вопрос</span>
  52 + <input name="question" id="question"
  53 + class="block w-full mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input"
  54 + placeholder="Вопрос" value="{{ old('name') ?? $question->question ?? '' }}"
  55 + />
  56 + @error('question')
  57 + <span class="text-xs text-red-600 dark:text-red-400">
  58 + {{ $message }}
  59 + </span>
  60 + @enderror
  61 + </label><br>
  62 +
  63 + <label class="block text-sm">
  64 + <span class="text-gray-700 dark:text-gray-400">Ответ</span>
  65 + <textarea class="block w-full mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-textarea focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray ckeditor" name="answer" placeholder="Ответ" required rows="10">
  66 + {{ old('text2') ?? $question->answer ?? '' }}
  67 + </textarea>
  68 + @error('answer')
  69 + <span class="text-xs text-red-600 dark:text-red-400">
  70 + {{ $message }}
  71 + </span>
  72 + @enderror
  73 + </label><br>
  74 +
  75 + <label class="block text-sm">
  76 + <span class="text-gray-700 dark:text-gray-400">Ответ</span>
  77 + <select name="target" id="target" placeholder="Для кого"
  78 + class="block w-full mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray">
  79 + <option value="{{ \App\Enums\FaqTarget::EMPLOYER->value }}" @if (isset($question) && \App\Enums\FaqTarget::EMPLOYER->value==$question->target) selected @endif>Работодатель</option>
  80 + <option value="{{ \App\Enums\FaqTarget::EMPLOYEE->value }}" @if (isset($question) && \App\Enums\FaqTarget::EMPLOYEE->value==$question->target) selected @endif>Работник</option>
  81 + </select>
  82 + @error('target')
  83 + <span class="text-xs text-red-600 dark:text-red-400">
  84 + {{ $message }}
  85 + </span>
  86 + @enderror
  87 + </label><br>
  88 +
  89 + <div class="flex flex-col flex-wrap mb-4 space-y-4 md:flex-row md:items-end md:space-x-4">
  90 + <div>
  91 + <button type="submit" class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple">
  92 + Сохранить
  93 + </button>
  94 + <a href="{{ route('admin.faq.list') }}"
  95 + class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
  96 + style="display: -webkit-inline-box; height: 30px!important;"
  97 + >Назад</a>
  98 + </div>
  99 + </div>
  100 +</div>
resources/views/admin/faq/list.blade.php
... ... @@ -0,0 +1,46 @@
  1 +@extends('layout.admin', ['title' => 'Админка - Страница статистики'])
  2 +
  3 +@section('content')
  4 +
  5 + <a href="{{ route('admin.faq.create') }}" style="width: 200px" class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple">
  6 + Добавить вопрос/ответ
  7 + </a>
  8 + <br>
  9 + <div class="w-full overflow-hidden rounded-lg shadow-xs" id="ajax_block">
  10 +
  11 + <div class="w-full overflow-x-auto">
  12 + <table class="w-full whitespace-no-wrap">
  13 + <thead>
  14 + <tr class="text-xs font-semibold tracking-wide text-left text-gray-500 uppercase border-b dark:border-gray-700 bg-gray-50 dark:text-gray-400 dark:bg-gray-800">
  15 + <th class="px-4 py-3">ID</th>
  16 + <th class="px-4 py-3">Вопрос</th>
  17 + <th class="px-4 py-3">Дата создания</th>
  18 + <th class="px-4 py-3"></th>
  19 + <th class="px-4 py-3"></th>
  20 + </tr>
  21 + </thead>
  22 + <tbody class="bg-white divide-y dark:divide-gray-700 dark:bg-gray-800">
  23 + @foreach($questions as $question)
  24 + <tr class="text-gray-700 dark:text-gray-400">
  25 + <td class="px-4 py-3">
  26 + {{$question->id}}
  27 + </td>
  28 + <td class="px-4 py-3">
  29 + {{$question->question}}
  30 + </td>
  31 + <td class="px-4 py-3">
  32 + {{$question->created_at}}
  33 + </td>
  34 + <td class="px-4 py-3 text-sm_">
  35 + <a href="{{ route('admin.faq.edit', ['id' => $question->id]) }}">Изменить</a>
  36 + </td>
  37 + <td class="px-4 py-3 text-sm_">
  38 + <a href="{{ route('admin.faq.destroy', ['id' => $question->id]) }}">Удалить</a>
  39 + </td>
  40 + </tr>
  41 + @endforeach
  42 + </tbody>
  43 + </table>
  44 + </div>
  45 + </div>
  46 +@endsection
resources/views/admin/faq/update.blade.php
... ... @@ -0,0 +1,7 @@
  1 +@extends('layout.admin', ['title' => 'Админка - Добавление страницы'])
  2 +
  3 +@section('content')
  4 + <form method="POST" action="{{ route('admin.faq.update', ['id' => $question->id]) }}" enctype="multipart/form-data">
  5 + @include('admin.faq.form')
  6 + </form>
  7 +@endsection
resources/views/employers/faq.blade.php
1 1 @extends('layout.frontend', ['title' => 'FAQ Вопросы и ответы - РекаМоре'])
2 2  
3   -@section('scripts')
4   - <script>
5   - $(document).on('change', '#sort_ajax', function() {
6   - var this_ = $(this);
7   - var val_ = this_.val();
8   - console.log('sort items '+val_);
9   -
10   - $.ajax({
11   - type: "GET",
12   - url: "{{ route('shipping_companies') }}",
13   - data: "sort="+val_+"&block=1",
14   - success: function (data) {
15   - console.log('Выбор сортировки');
16   - console.log(data);
17   - $('#block_1').html(data);
18   - },
19   - headers: {
20   - 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
21   - },
22   - error: function (data) {
23   - data = JSON.stringify(data);
24   - console.log('Error: ' + data);
25   - }
26   - });
27   -
28   - $.ajax({
29   - type: "GET",
30   - url: "{{ route('shipping_companies') }}",
31   - data: "sort="+val_+"&block=2",
32   - success: function (data) {
33   - console.log('Выбор сортировки2');
34   - console.log(data);
35   - history.pushState({}, '', "{{ route('shipping_companies') }}?sort="+val_+"@if (isset($_GET['page']))&page={{ $_GET['page'] }}@endif");
36   - $('#block_2').html(data);
37   - },
38   - headers: {
39   - 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
40   - },
41   - error: function (data) {
42   - data = JSON.stringify(data);
43   - console.log('Error: ' + data);
44   - }
45   - });
46   - });
47   - </script>
48   -@endsection
49   -
50 3 @section('content')
51 4 <section class="cabinet">
52 5 <div class="container">
... ... @@ -76,302 +29,40 @@
76 29 </div>
77 30 <div class="cabinet__bodies showed" data-body="1">
78 31 <div class="faqs">
79   - <!--<button type="button" class="faqs__button js-toggle js-parent-toggle button button_light button_more">
80   - <span>Показать ещё</span>
81   - <span>Свернуть</span>
82   - </button>-->
  32 + @foreach($questionsEmployer as $question)
83 33 <div class="faqs__body">
84 34 <div class="faqs__item">
85   - <button type="button" class="faqs__item-button js-toggle active">
86   - <span>Инструкция 1 для работодателя</span>
87   - <i>
88   - <svg>
89   - <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use>
90   - </svg>
91   - </i>
92   - </button>
93   - <div class="faqs__item-body">
94   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
95   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
96   - </div>
97   - </div>
98   - <div class="faqs__item">
99   - <button type="button" class="faqs__item-button js-toggle">
100   - <span>Инструкция 2 для работодателя</span>
101   - <i>
102   - <svg>
103   - <use xlink:href="images/sprite.svg#arrow"></use>
104   - </svg>
105   - </i>
106   - </button>
107   - <div class="faqs__item-body">
108   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
109   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
110   - </div>
111   - </div>
112   - <div class="faqs__item">
113   - <button type="button" class="faqs__item-button js-toggle">
114   - <span>Вопрос 3</span>
115   - <i>
116   - <svg>
117   - <use xlink:href="images/sprite.svg#arrow"></use>
118   - </svg>
119   - </i>
120   - </button>
121   - <div class="faqs__item-body">
122   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
123   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
124   - </div>
125   - </div>
126   - <div class="faqs__item">
127   - <button type="button" class="faqs__item-button js-toggle">
128   - <span>Вопрос 4</span>
129   - <i>
130   - <svg>
131   - <use xlink:href="images/sprite.svg#arrow"></use>
132   - </svg>
133   - </i>
134   - </button>
135   - <div class="faqs__item-body">
136   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
137   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
138   - </div>
139   - </div>
140   - <div class="faqs__item">
141   - <button type="button" class="faqs__item-button js-toggle">
142   - <span>Вопрос 5</span>
143   - <i>
144   - <svg>
145   - <use xlink:href="images/sprite.svg#arrow"></use>
146   - </svg>
147   - </i>
148   - </button>
149   - <div class="faqs__item-body">
150   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
151   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
152   - </div>
153   - </div>
154   - <div class="faqs__item">
155 35 <button type="button" class="faqs__item-button js-toggle">
156   - <span>Вопрос 6</span>
  36 + <span>{{ $question->question }}</span>
157 37 <i>
158 38 <svg>
159   - <use xlink:href="images/sprite.svg#arrow"></use>
160   - </svg>
161   - </i>
162   - </button>
163   - <div class="faqs__item-body">
164   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
165   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
166   - </div>
167   - </div>
168   - <div class="faqs__item">
169   - <button type="button" class="faqs__item-button js-toggle">
170   - <span>Вопрос 7</span>
171   - <i>
172   - <svg>
173   - <use xlink:href="images/sprite.svg#arrow"></use>
174   - </svg>
175   - </i>
176   - </button>
177   - <div class="faqs__item-body">
178   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
179   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
180   - </div>
181   - </div>
182   - <div class="faqs__item">
183   - <button type="button" class="faqs__item-button js-toggle">
184   - <span>Вопрос 8</span>
185   - <i>
186   - <svg>
187   - <use xlink:href="images/sprite.svg#arrow"></use>
188   - </svg>
189   - </i>
190   - </button>
191   - <div class="faqs__item-body">
192   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
193   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
194   - </div>
195   - </div>
196   - <div class="faqs__item">
197   - <button type="button" class="faqs__item-button js-toggle">
198   - <span>Вопрос 9</span>
199   - <i>
200   - <svg>
201   - <use xlink:href="images/sprite.svg#arrow"></use>
202   - </svg>
203   - </i>
204   - </button>
205   - <div class="faqs__item-body">
206   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
207   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
208   - </div>
209   - </div>
210   - <div class="faqs__item">
211   - <button type="button" class="faqs__item-button js-toggle">
212   - <span>Вопрос 10</span>
213   - <i>
214   - <svg>
215   - <use xlink:href="images/sprite.svg#arrow"></use>
  39 + <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use>
216 40 </svg>
217 41 </i>
218 42 </button>
219   - <div class="faqs__item-body">
220   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
221   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
222   - </div>
  43 + <div class="faqs__item-body" style="white-space:break-spaces; word-break: break-word;">{{ $question->answer }}</div>
223 44 </div>
224 45 </div>
  46 + @endforeach
225 47 </div>
226 48 </div>
227 49 <div class="cabinet__bodies" data-body="2">
228 50 <div class="faqs">
229   - <!--<button type="button" class="faqs__button js-toggle js-parent-toggle button button_light button_more">
230   - <span>Показать ещё</span>
231   - <span>Свернуть</span>
232   - </button>-->
233   - <div class="faqs__body">
234   - <div class="faqs__item">
235   - <button type="button" class="faqs__item-button js-toggle active">
236   - <span>Инструкция для соискателя 1</span>
237   - <i>
238   - <svg>
239   - <use xlink:href="images/sprite.svg#arrow"></use>
240   - </svg>
241   - </i>
242   - </button>
243   - <div class="faqs__item-body">
244   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
245   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
246   - </div>
247   - </div>
248   - <div class="faqs__item">
249   - <button type="button" class="faqs__item-button js-toggle">
250   - <span>Вопрос 2</span>
251   - <i>
252   - <svg>
253   - <use xlink:href="images/sprite.svg#arrow"></use>
254   - </svg>
255   - </i>
256   - </button>
257   - <div class="faqs__item-body">
258   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
259   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
260   - </div>
261   - </div>
262   - <div class="faqs__item">
263   - <button type="button" class="faqs__item-button js-toggle">
264   - <span>Вопрос 2</span>
265   - <i>
266   - <svg>
267   - <use xlink:href="images/sprite.svg#arrow"></use>
268   - </svg>
269   - </i>
270   - </button>
271   - <div class="faqs__item-body">
272   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
273   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
274   - </div>
275   - </div>
276   - <div class="faqs__item">
277   - <button type="button" class="faqs__item-button js-toggle">
278   - <span>Вопрос 2</span>
279   - <i>
280   - <svg>
281   - <use xlink:href="images/sprite.svg#arrow"></use>
282   - </svg>
283   - </i>
284   - </button>
285   - <div class="faqs__item-body">
286   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
287   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
288   - </div>
289   - </div>
290   - <div class="faqs__item">
291   - <button type="button" class="faqs__item-button js-toggle">
292   - <span>Вопрос 2</span>
293   - <i>
294   - <svg>
295   - <use xlink:href="images/sprite.svg#arrow"></use>
296   - </svg>
297   - </i>
298   - </button>
299   - <div class="faqs__item-body">
300   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
301   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
302   - </div>
303   - </div>
304   - <div class="faqs__item">
305   - <button type="button" class="faqs__item-button js-toggle">
306   - <span>Вопрос 2</span>
307   - <i>
308   - <svg>
309   - <use xlink:href="images/sprite.svg#arrow"></use>
310   - </svg>
311   - </i>
312   - </button>
313   - <div class="faqs__item-body">
314   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
315   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
316   - </div>
317   - </div>
318   - <div class="faqs__item">
319   - <button type="button" class="faqs__item-button js-toggle">
320   - <span>Вопрос 2</span>
321   - <i>
322   - <svg>
323   - <use xlink:href="images/sprite.svg#arrow"></use>
324   - </svg>
325   - </i>
326   - </button>
327   - <div class="faqs__item-body">
328   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
329   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
330   - </div>
331   - </div>
332   - <div class="faqs__item">
333   - <button type="button" class="faqs__item-button js-toggle">
334   - <span>Вопрос 2</span>
335   - <i>
336   - <svg>
337   - <use xlink:href="images/sprite.svg#arrow"></use>
338   - </svg>
339   - </i>
340   - </button>
341   - <div class="faqs__item-body">
342   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
343   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
344   - </div>
345   - </div>
346   - <div class="faqs__item">
347   - <button type="button" class="faqs__item-button js-toggle">
348   - <span>Вопрос 2</span>
349   - <i>
350   - <svg>
351   - <use xlink:href="images/sprite.svg#arrow"></use>
352   - </svg>
353   - </i>
354   - </button>
355   - <div class="faqs__item-body">
356   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
357   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
358   - </div>
359   - </div>
360   - <div class="faqs__item">
361   - <button type="button" class="faqs__item-button js-toggle">
362   - <span>Вопрос 2</span>
363   - <i>
364   - <svg>
365   - <use xlink:href="images/sprite.svg#arrow"></use>
366   - </svg>
367   - </i>
368   - </button>
369   - <div class="faqs__item-body">
370   - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p>
371   - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p>
372   - </div>
373   - </div>
374   - </div>
  51 + @foreach($questionsEmployee as $question)
  52 + <div class="faqs__body">
  53 + <div class="faqs__item">
  54 + <button type="button" class="faqs__item-button js-toggle">
  55 + <span>{{ $question->question }}</span>
  56 + <i>
  57 + <svg>
  58 + <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use>
  59 + </svg>
  60 + </i>
  61 + </button>
  62 + <div class="faqs__item-body" style="white-space:break-spaces; word-break: break-word;">{{ $question->answer }}</div>
  63 + </div>
  64 + </div>
  65 + @endforeach
375 66 </div>
376 67 </div>
377 68 </div>
... ... @@ -380,8 +71,5 @@
380 71 </div>
381 72  
382 73 </section>
383   -
384   - </div>
385   - <div>
386 74 @endsection
387 75  
resources/views/layout/admin.blade.php
... ... @@ -719,6 +719,15 @@
719 719 @endif
720 720 @endif
721 721  
  722 + @if ($cont->url_page == "admin/faq")
  723 + @if ((($cont->is_admin == 1) && ($admin == 1)) ||
  724 + (($cont->is_manager == 1) && ($is_manager == 1)))
  725 + <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.faq.list') ? 'dark:text-gray-100' : null }}">
  726 + <a class="w-full" href="{{ route('admin.faq.list') }}">FAQ</a>
  727 + </li>
  728 + @endif
  729 + @endif
  730 +
722 731 @endforeach
723 732 </ul>
724 733 </template>
... ... @@ -1383,7 +1392,16 @@
1383 1392 @if ((($cont->is_admin == 1) && ($admin == 1)) ||
1384 1393 (($cont->is_manager == 1) && ($is_manager == 1)))
1385 1394 <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.employers-main') ? 'dark:text-gray-100' : null }}">
1386   - <a class="w-full" href="{{ route('admin.employers-main') }}">Работодатели на главной</a>
  1395 + <a class="w-full" href="{{ route('admin.employers-main') }}">Работодатели на главной11</a>
  1396 + </li>
  1397 + @endif
  1398 + @endif
  1399 +
  1400 + @if ($cont->url_page == "faq/list")
  1401 + @if ((($cont->is_admin == 1) && ($admin == 1)) ||
  1402 + (($cont->is_manager == 1) && ($is_manager == 1)))
  1403 + <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.faq.list') ? 'dark:text-gray-100' : null }}">
  1404 + <a class="w-full" href="{{ route('admin.faq.list') }}">FAQ</a>
1387 1405 </li>
1388 1406 @endif
1389 1407 @endif
... ... @@ -17,6 +17,7 @@ use App\Http\Controllers\Auth\ForgotPasswordController;
17 17 use App\Http\Controllers\Auth\LoginController;
18 18 use App\Http\Controllers\Auth\RegisterController;
19 19 use App\Http\Controllers\CKEditorController;
  20 +use App\Http\Controllers\FaqController;
20 21 use App\Http\Controllers\MediaController;
21 22 use App\Http\Controllers\WorkerController;
22 23 use App\Models\Ad_jobs;
... ... @@ -404,6 +405,17 @@ Route::group([
404 405 Route::get('logs', function() {
405 406 $files = Storage::files('logs/laravel.log');
406 407 })->name('logs');
  408 +
  409 + Route::prefix('faq')->as('faq.')->group(function () {
  410 + Route::middleware('admin')->group(function () {
  411 + Route::get('/', [FaqController::class, 'showListForAdmin'])->name('list');
  412 + Route::get('/create', [FaqController::class, 'create'])->name('create');
  413 + Route::post('/create', [FaqController::class, 'store'])->name('store');
  414 + Route::get('/edit/{id}', [FaqController::class, 'edit'])->name('edit');
  415 + Route::put('/edit/{id}', [FaqController::class, 'update'])->name('update');
  416 + Route::get('/destroy/{id}', [FaqController::class, 'destroy'])->name('destroy');
  417 + });
  418 + });
407 419 });
408 420  
409 421 // Инструментальные страницы
... ... @@ -639,8 +651,8 @@ Route::group([
639 651 Route::get('cabinet/send-all-messages', [EmployerController::class, 'send_all_messages'])->name('send_all_messages');
640 652 Route::post('cabinet/send-all-messages/send', [EmployerController::class, 'send_all_post'])->name('send_all_post');
641 653  
642   - // 10 страница FAQ вопросы
643   - Route::get('cabinet/faq', [EmployerController::class, 'faq'])->name('faq');
  654 + // 10 страница FAQ вопрос
  655 + Route::get('cabinet/faq', [FaqController::class, 'showListForUser'])->name('faq');
644 656  
645 657 // 11 страница - Настройка уведомлений
646 658 Route::get('cabinet/subscribe', [EmployerController::class, 'subscribe'])->name('subscribe');