|
|
@@ -0,0 +1,137 @@
|
|
|
+{{--
|
|
|
+ Вьюха: Ссылки для парсера — динамический список URL-адресов
|
|
|
+ Создана: 2026-06-06
|
|
|
+ Контроллер: Admin\ParserLinkController::index() / update()
|
|
|
+ Переменные: $links (коллекция ParserLink, отсортированная по sort_order)
|
|
|
+ Логика: POST сохраняет весь список целиком (truncate + insert).
|
|
|
+ JS позволяет добавлять/удалять строки без перезагрузки страницы.
|
|
|
+--}}
|
|
|
+@extends('admin.layout')
|
|
|
+
|
|
|
+@section('title', 'Ссылки для парсера')
|
|
|
+
|
|
|
+@section('content_header')
|
|
|
+ <div class="d-flex justify-content-between align-items-center">
|
|
|
+ <h1 class="m-0">Ссылки для парсера</h1>
|
|
|
+ </div>
|
|
|
+@stop
|
|
|
+
|
|
|
+@section('breadcrumb')
|
|
|
+ <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
|
|
|
+ <li class="breadcrumb-item active">Ссылки для парсера</li>
|
|
|
+@stop
|
|
|
+
|
|
|
+@section('content')
|
|
|
+ @if(session('success'))
|
|
|
+ <div class="alert alert-success alert-dismissible">
|
|
|
+ <button type="button" class="close" data-dismiss="alert">×</button>
|
|
|
+ {{ session('success') }}
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+ @if($errors->any())
|
|
|
+ <div class="alert alert-danger alert-dismissible">
|
|
|
+ <button type="button" class="close" data-dismiss="alert">×</button>
|
|
|
+ <ul class="mb-0">
|
|
|
+ @foreach($errors->all() as $e)<li>{{ $e }}</li>@endforeach
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ <div class="row justify-content-center">
|
|
|
+ <div class="col-md-8">
|
|
|
+ <div class="card card-primary card-outline">
|
|
|
+ <div class="card-header">
|
|
|
+ <h3 class="card-title">URL-адреса для обхода парсером</h3>
|
|
|
+ </div>
|
|
|
+ <div class="card-body">
|
|
|
+ <form action="{{ route('admin.parser-links.update') }}" method="POST" id="parser-links-form">
|
|
|
+ @csrf
|
|
|
+
|
|
|
+ <div id="links-container">
|
|
|
+ @forelse($links as $link)
|
|
|
+ <div class="link-row input-group mb-2">
|
|
|
+ <input type="text" name="urls[]"
|
|
|
+ class="form-control"
|
|
|
+ value="{{ $link->url }}"
|
|
|
+ placeholder="https://example.com/catalog">
|
|
|
+ <div class="input-group-append">
|
|
|
+ <button type="button" class="btn btn-danger btn-remove-link" title="Удалить">
|
|
|
+ <i class="fas fa-times"></i>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ @empty
|
|
|
+ <div class="link-row input-group mb-2">
|
|
|
+ <input type="text" name="urls[]"
|
|
|
+ class="form-control"
|
|
|
+ placeholder="https://example.com/catalog">
|
|
|
+ <div class="input-group-append">
|
|
|
+ <button type="button" class="btn btn-danger btn-remove-link" title="Удалить">
|
|
|
+ <i class="fas fa-times"></i>
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ @endforelse
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="mb-3">
|
|
|
+ <button type="button" id="btn-add-link" class="btn btn-outline-primary btn-sm">
|
|
|
+ <i class="fas fa-plus"></i> Добавить ссылку
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="d-flex">
|
|
|
+ <button type="submit" class="btn btn-primary">
|
|
|
+ <i class="fas fa-save"></i> Сохранить
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+ </form>
|
|
|
+ </div>
|
|
|
+ <div class="card-footer text-muted small">
|
|
|
+ Каждая строка — отдельный URL. Пустые строки игнорируются при сохранении.
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+@stop
|
|
|
+
|
|
|
+@push('js')
|
|
|
+<script>
|
|
|
+(function () {
|
|
|
+ var container = document.getElementById('links-container');
|
|
|
+
|
|
|
+ function makeRow(value) {
|
|
|
+ var row = document.createElement('div');
|
|
|
+ row.className = 'link-row input-group mb-2';
|
|
|
+ row.innerHTML =
|
|
|
+ '<input type="text" name="urls[]" class="form-control" value="' + (value || '') + '" placeholder="https://example.com/catalog">' +
|
|
|
+ '<div class="input-group-append">' +
|
|
|
+ '<button type="button" class="btn btn-danger btn-remove-link" title="Удалить">' +
|
|
|
+ '<i class="fas fa-times"></i>' +
|
|
|
+ '</button>' +
|
|
|
+ '</div>';
|
|
|
+ return row;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Добавить строку
|
|
|
+ document.getElementById('btn-add-link').addEventListener('click', function () {
|
|
|
+ var row = makeRow('');
|
|
|
+ container.appendChild(row);
|
|
|
+ row.querySelector('input').focus();
|
|
|
+ });
|
|
|
+
|
|
|
+ // Удалить строку (делегирование на контейнер)
|
|
|
+ container.addEventListener('click', function (e) {
|
|
|
+ var btn = e.target.closest('.btn-remove-link');
|
|
|
+ if (!btn) return;
|
|
|
+ var rows = container.querySelectorAll('.link-row');
|
|
|
+ if (rows.length === 1) {
|
|
|
+ // Если последняя строка — просто очищаем её
|
|
|
+ rows[0].querySelector('input').value = '';
|
|
|
+ } else {
|
|
|
+ btn.closest('.link-row').remove();
|
|
|
+ }
|
|
|
+ });
|
|
|
+})();
|
|
|
+</script>
|
|
|
+@endpush
|