value_form.blade.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. {{--
  2. Вьюха: Форма создания и редактирования значения справочника
  3. Создана: 2026-05-06
  4. Контроллер: Admin\ManualController::valueCreate() / valueEdit() / valueStore() / valueUpdate()
  5. Переменные: $section (DictSection), $value (DictValue|undefined), $parent (DictValue|null)
  6. Логика поля "Родитель" (только для иерархических разделов):
  7. - Если $parent задан (передан parent_id в URL): показывает readonly текст родителя + hidden input
  8. - Если создание: select с выбором родителя (или без — для верхнего уровня)
  9. - Если редактирование: select с текущим родителем, себя исключает из списка
  10. --}}
  11. @extends('admin.layout')
  12. @section('title', isset($value) ? 'Редактировать значение' : 'Добавить значение')
  13. @section('content_header')
  14. <div class="d-flex justify-content-between align-items-center">
  15. <h1 class="m-0">
  16. {{ isset($value) ? 'Редактировать значение' : 'Добавить значение' }}
  17. <small class="text-muted">— {{ $section->label }}</small>
  18. </h1>
  19. <a href="{{ route('admin.manuals.values', $section) }}" class="btn btn-default btn-sm">
  20. <i class="fas fa-arrow-left"></i> Назад
  21. </a>
  22. </div>
  23. @stop
  24. @section('breadcrumb')
  25. <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
  26. <li class="breadcrumb-item"><a href="{{ route('admin.manuals.index') }}">Справочники</a></li>
  27. <li class="breadcrumb-item"><a href="{{ route('admin.manuals.values', $section) }}">{{ $section->label }}</a></li>
  28. <li class="breadcrumb-item active">{{ isset($value) ? 'Редактировать' : 'Добавить' }}</li>
  29. @stop
  30. @section('content')
  31. <div class="row justify-content-center">
  32. <div class="col-md-6">
  33. <div class="card card-primary card-outline">
  34. <div class="card-body">
  35. @if($errors->any())
  36. <div class="alert alert-danger">
  37. <ul class="mb-0">
  38. @foreach($errors->all() as $e) <li>{{ $e }}</li> @endforeach
  39. </ul>
  40. </div>
  41. @endif
  42. <form action="{{ isset($value)
  43. ? route('admin.manuals.value.update', [$section, $value])
  44. : route('admin.manuals.value.store', $section) }}"
  45. method="POST" enctype="multipart/form-data">
  46. @csrf
  47. @if(isset($value)) @method('PUT') @endif
  48. @if($section->is_hierarchical && isset($parent))
  49. <div class="form-group">
  50. <label>Родитель</label>
  51. <input type="hidden" name="parent_id" value="{{ $parent->id }}">
  52. <input type="text" class="form-control" value="{{ $parent->value }}" readonly>
  53. </div>
  54. @elseif($section->is_hierarchical && !isset($value))
  55. <div class="form-group">
  56. <label>Родитель (оставьте пустым для верхнего уровня)</label>
  57. <select name="parent_id" class="form-control">
  58. <option value="">— верхний уровень —</option>
  59. @foreach($section->values as $parentOpt)
  60. <option value="{{ $parentOpt->id }}"
  61. @selected(old('parent_id') == $parentOpt->id)>
  62. {{ $parentOpt->value }}
  63. </option>
  64. @endforeach
  65. </select>
  66. </div>
  67. @elseif($section->is_hierarchical && isset($value))
  68. <div class="form-group">
  69. <label>Родитель</label>
  70. <select name="parent_id" class="form-control">
  71. <option value="">— верхний уровень —</option>
  72. @foreach($section->values as $parentOpt)
  73. @if($parentOpt->id !== $value->id)
  74. <option value="{{ $parentOpt->id }}"
  75. @selected(old('parent_id', $value->parent_id) == $parentOpt->id)>
  76. {{ $parentOpt->value }}
  77. </option>
  78. @endif
  79. @endforeach
  80. </select>
  81. </div>
  82. @endif
  83. <div class="form-group">
  84. <label>Значение <span class="text-danger">*</span></label>
  85. <input type="text" name="value"
  86. class="form-control @error('value') is-invalid @enderror"
  87. value="{{ old('value', $value->value ?? '') }}"
  88. autofocus>
  89. @error('value')<div class="invalid-feedback">{{ $message }}</div>@enderror
  90. </div>
  91. {{-- Флаг только для раздела "Страны" --}}
  92. @if($section->code === 'countries')
  93. <div class="form-group">
  94. <label>Флаг (emoji)</label>
  95. <input type="text" name="flag" maxlength="10"
  96. class="form-control form-control-sm" style="max-width:80px;font-size:22px"
  97. value="{{ old('flag', $value->flag ?? '') }}"
  98. placeholder="🇩🇪">
  99. <small class="text-muted">Emoji флага страны</small>
  100. </div>
  101. @endif
  102. <div class="form-group">
  103. <label>Порядок сортировки</label>
  104. <input type="number" name="sort_order"
  105. class="form-control @error('sort_order') is-invalid @enderror"
  106. value="{{ old('sort_order', $value->sort_order ?? 0) }}">
  107. @error('sort_order')<div class="invalid-feedback">{{ $message }}</div>@enderror
  108. </div>
  109. {{-- Логотип только для раздела "Марки" (code=makes), только корневые значения --}}
  110. @if($section->code === 'makes' && !($parent ?? null))
  111. <div class="form-group">
  112. <label>Логотип марки</label>
  113. @if(isset($value) && $value->logo)
  114. <div class="mb-2" id="logo-current">
  115. <img src="{{ asset('storage/' . $value->logo) }}"
  116. class="img-thumbnail d-block"
  117. style="max-height:80px;max-width:140px;object-fit:contain;background:#f8f9fa">
  118. <small class="text-muted">{{ basename($value->logo) }}</small>
  119. <div class="form-check mt-1">
  120. <input class="form-check-input" type="checkbox"
  121. name="remove_logo" value="1" id="remove_logo">
  122. <label class="form-check-label text-danger small" for="remove_logo">
  123. Удалить логотип
  124. </label>
  125. </div>
  126. </div>
  127. @endif
  128. <div class="custom-file" style="max-width:300px">
  129. <input type="file" name="logo" class="custom-file-input"
  130. accept="image/*" id="logo-file">
  131. <label class="custom-file-label" for="logo-file">
  132. {{ (isset($value) && $value->logo) ? 'Заменить логотип' : 'Выбрать файл (PNG/SVG)' }}
  133. </label>
  134. </div>
  135. <small class="text-muted d-block mt-1">PNG или SVG, не более 2 МБ</small>
  136. </div>
  137. @endif
  138. <div class="d-flex">
  139. <button type="submit" class="btn btn-primary">
  140. <i class="fas fa-save"></i> {{ isset($value) ? 'Сохранить' : 'Добавить' }}
  141. </button>
  142. <a href="{{ route('admin.manuals.values', $section) }}" class="btn btn-default ml-2">Отмена</a>
  143. </div>
  144. </form>
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. @stop