Files
ave-cms/adminx/modules/Documents/view/edit.twig
T
2026-07-27 12:58:44 +03:00

540 lines
56 KiB
Twig
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends '@adminx/main.twig' %}
{% block title %}{{ catalog_mode ? 'Товар #' ~ document.Id : (is_new ? 'Новый документ' : 'Документ #' ~ document.Id) }}{% endblock %}
{% block content %}
<nav class="breadcrumbs" aria-label="Хлебные крошки">
<a href="{{ ADMINX_BASE }}/">Главная</a><i class="ti ti-chevron-right"></i>
{% if catalog_mode %}<a href="{{ ADMINX_BASE }}/catalog">Каталог</a><i class="ti ti-chevron-right"></i><a href="{{ return_url }}">Товары</a>{% else %}<a href="{{ ADMINX_BASE }}/documents">Документы</a>{% endif %}<i class="ti ti-chevron-right"></i>
<span>{{ is_new ? 'новый' : '#' ~ document.Id }}</span>
</nav>
<div class="page-header documents-edit-header">
<div class="between">
<div>
<h1 data-document-edit-heading>{{ is_new ? 'Новый документ' : document.document_title }}</h1>
<p class="text-secondary" style="margin-top:5px" data-document-edit-meta>{{ is_new ? 'Создание базовой карточки документа.' : 'ID ' ~ document.Id ~ ', ' ~ document.state_label ~ ', изменён: ' ~ document.changed_label }}</p>
</div>
<div class="cluster">
<div class="segmented documents-editor-modes" role="group" aria-label="Режим редактора">
<button class="segmented-item" type="button" data-document-editor-mode="quick" data-tooltip="Только основное и поля"><i class="ti ti-bolt"></i><span>Быстро</span></button>
<button class="segmented-item" type="button" data-document-editor-mode="normal" data-tooltip="Основное, поля и публикация"><i class="ti ti-layout-columns"></i><span>Обычно</span></button>
<button class="segmented-item" type="button" data-document-editor-mode="advanced" data-tooltip="Все настройки документа"><i class="ti ti-adjustments-horizontal"></i><span>Расширенно</span></button>
</div>
<a class="btn btn-ghost" href="{{ return_url|default(ADMINX_BASE ~ '/documents') }}"><i class="ti ti-arrow-left"></i>К списку</a>
</div>
</div>
</div>
{% if catalog_mode and not is_new %}<section class="card documents-card catalog-product-variant-bridge"><div class="documents-section-head"><h2>Варианты товара</h2>{% if variant_group %}<span class="badge badge-blue">Группа #{{ variant_group.id }}</span>{% endif %}</div><div class="documents-card-body between">{% if variant_group %}<div><b>{{ variant_group.title }}</b><p class="text-secondary">{{ variant_group.is_primary ? 'Основной вариант группы' : 'Вариант группы' }}</p></div><a class="btn btn-secondary" href="{{ ADMINX_BASE }}/catalog/variant-groups/{{ variant_group.id }}"><i class="ti ti-box-multiple"></i>Управление вариантами</a>{% else %}<div><b>Товар пока не объединён с вариантами</b><p class="text-secondary">Создайте группу на основе текущего товара.</p></div><form method="post" action="{{ ADMINX_BASE }}/catalog/products/{{ document.Id }}/variant-group" data-variant-action><input type="hidden" name="_csrf" value="{{ csrf_token }}"><input type="hidden" name="title" value="{{ document.document_title|e('html_attr') }}"><button class="btn btn-secondary" type="submit"><i class="ti ti-plus"></i>Создать группу вариантов</button></form>{% endif %}</div></section>{% endif %}
{% if catalog_mode and not is_new and native_attributes.attributes_count %}
<section class="card documents-card product-native-attributes"><form method="post" action="{{ ADMINX_BASE }}/catalog/products/{{ document.Id }}/attributes" data-attribute-ajax><input type="hidden" name="_csrf" value="{{ csrf_token }}">
<div class="documents-section-head"><div class="documents-head-left"><span class="icon-tile documents-head-icon" style="--tile-bg:var(--violet-100);--tile-fg:var(--violet-600)"><i class="ti ti-list-details"></i></span><div><h2>Нативные характеристики</h2><p class="text-secondary">Новый контур проверки. Публичная карточка пока использует старые поля.</p></div></div><span class="badge badge-violet">{{ native_attributes.attributes_count }}</span></div>
<div class="documents-card-body native-attribute-groups">{% for group in native_attributes.groups %}<section class="native-attribute-group"><div class="native-attribute-group-head"><div><b>{{ group.name }}</b><small>{{ group.set_name }}</small></div><span>{{ group.items|length }}</span></div><div class="native-attribute-grid">{% for item in group.items %}<label class="field native-attribute-field"><span class="field-label">{{ item.label_override ?: item.name }}{% if item.required %}<span class="ax-required">*</span>{% endif %}{% if item.unit %}<small>{{ item.unit }}</small>{% endif %}</span>
{% if item.value_type == 'boolean' %}<select class="select" name="attribute[{{ item.id }}]"><option value="">Не задано</option><option value="1" {{ item.value is same as(true) or item.value == '1' ? 'selected' : '' }}>Да</option><option value="0" {{ item.value is same as(false) and item.value_json != '' or item.value == '0' ? 'selected' : '' }}>Нет</option></select>
{% elseif item.value_type == 'choice' and item.option_items %}<span class="native-attribute-choice" data-native-attribute-choice><select class="select" name="attribute[{{ item.id }}]"><option value="" data-swatch="">Не задано</option>{% for option in item.option_items %}<option value="{{ option.value_key|e('html_attr') }}" data-swatch="{{ option.swatch|e('html_attr') }}" {{ item.value == option.value_key ? 'selected' : '' }}>{{ option.label }}{% if option.legacy %} · прежнее значение{% endif %}</option>{% endfor %}</select><span class="native-attribute-choice-swatch" data-native-attribute-choice-swatch hidden></span></span>
{% elseif item.value_type == 'number' %}<input class="input" type="number" step="any" name="attribute[{{ item.id }}]" value="{{ item.value }}">
{% elseif item.value_type == 'date' %}<input class="input" type="date" name="attribute[{{ item.id }}]" value="{{ item.value }}">
{% elseif item.value_type == 'multi_choice' and item.option_items %}<select class="select native-attribute-multi" name="attribute[{{ item.id }}][]" multiple size="{{ item.option_items|length > 6 ? 6 : item.option_items|length }}">{% for option in item.option_items %}<option value="{{ option.value_key|e('html_attr') }}" {{ item.value is iterable and option.value_key in item.value ? 'selected' : '' }}>{{ option.label }}{% if option.swatch %} · {{ option.swatch }}{% endif %}{% if option.legacy %} · прежнее значение{% endif %}</option>{% endfor %}</select>
{% elseif item.value_type == 'multi_choice' %}<textarea class="textarea" rows="3" name="attribute[{{ item.id }}]">{{ item.value is iterable ? item.value|join('\n') : item.value }}</textarea>
{% else %}<input class="input" type="text" name="attribute[{{ item.id }}]" value="{{ item.value is iterable ? item.value|join(', ') : item.value }}">{% endif %}
<span class="native-attribute-meta"><span class="mono">{{ item.code }}</span>{% if item.value_state %}<span class="badge {{ item.value_state == 'verified' ? 'badge-green' : 'badge-amber' }}">{{ item.value_state == 'verified' ? 'проверено' : 'черновик' }}</span>{% endif %}</span></label>{% endfor %}</div></section>{% endfor %}<div class="native-attribute-footer"><a class="btn btn-ghost" href="{{ ADMINX_BASE }}/catalog/attributes?view=sections"><i class="ti ti-settings"></i>Настроить наборы</a><button class="btn btn-primary" type="submit"><i class="ti ti-device-floppy"></i>Сохранить характеристики</button></div></div>
</form></section>
{% endif %}
{% if catalog_mode and not is_new %}
<section class="card documents-card product-shipping-card" data-product-shipping>
<form data-product-shipping-form action="{{ ADMINX_BASE }}/catalog/products/{{ document.Id }}/shipping" method="post">
<input type="hidden" name="_csrf" value="{{ csrf_token }}">
<input type="hidden" name="packages" value="">
<div class="documents-section-head product-shipping-head">
<div class="documents-head-left"><span class="icon-tile documents-head-icon" style="--tile-bg:var(--cyan-100);--tile-fg:var(--cyan-600)"><i class="ti ti-package-export"></i></span><div><h2>Доставка и упаковка</h2><p class="text-secondary">Физические грузовые места для расчёта перевозчиками.</p></div></div>
<label class="switch"><input type="checkbox" name="shipping_enabled" value="1"{{ shipping_profile.shipping_enabled ? ' checked' : '' }}><span></span><b>Рассчитывать доставку</b></label>
</div>
<div class="documents-card-body product-shipping-body">
{% if shipping_profile.legacy %}<div class="product-shipping-legacy"><i class="ti ti-info-circle"></i><span>Найдены старые данные: {% for alias,value in shipping_profile.legacy %}<b>{{ alias }}</b> {{ value }}{% if not loop.last %}, {% endif %}{% endfor %}. Добавьте грузовое место, чтобы перейти на точный расчёт.</span></div>{% endif %}
<div class="product-package-template-picker"><select class="select" data-package-template-select><option value="">Добавить готовую упаковку</option>{% for template in package_templates %}<option value="{{ template.id }}" data-package="{{ template|json_encode|e('html_attr') }}">{{ template.title }} · {{ template.dimensions }} · {{ template.weight_label }}</option>{% endfor %}</select><button class="btn btn-secondary" type="button" data-package-template-apply disabled><i class="ti ti-plus"></i>Добавить</button><a class="btn btn-ghost btn-icon" href="{{ ADMINX_BASE }}/catalog/products/shipping" data-tooltip="Управление шаблонами" aria-label="Управление шаблонами упаковки"><i class="ti ti-settings"></i></a></div>
<div class="product-package-head" aria-hidden="true"><span>Грузовое место</span><span>Кол-во</span><span>Вес, кг</span><span>Длина, см</span><span>Ширина, см</span><span>Высота, см</span><span></span></div>
<div class="product-package-list" data-package-list>
{% for package in shipping_profile.packages %}
<div class="product-package-row" data-package-row>
<input class="input" name="title" value="{{ package.title|e('html_attr') }}" aria-label="Название грузового места">
<input class="input" type="number" name="quantity" min="1" max="999" step="1" value="{{ package.quantity }}" aria-label="Количество">
<input class="input" type="number" name="weight_kg" min="0" step="0.001" value="{{ package.weight_kg }}" aria-label="Вес в килограммах">
<input class="input" type="number" name="length_cm" min="0" step="0.1" value="{{ package.length_cm }}" aria-label="Длина в сантиметрах">
<input class="input" type="number" name="width_cm" min="0" step="0.1" value="{{ package.width_cm }}" aria-label="Ширина в сантиметрах">
<input class="input" type="number" name="height_cm" min="0" step="0.1" value="{{ package.height_cm }}" aria-label="Высота в сантиметрах">
<button class="btn btn-ghost btn-icon btn-sm ax-act ax-act-danger" type="button" data-package-remove data-tooltip="Удалить грузовое место" aria-label="Удалить грузовое место"><i class="ti ti-trash"></i></button>
</div>
{% endfor %}
</div>
<div class="product-shipping-empty" data-package-empty{{ shipping_profile.packages ? ' hidden' : '' }}><i class="ti ti-package-off"></i><span>Грузовые места ещё не добавлены</span></div>
<div class="product-shipping-footer"><div class="product-shipping-summary"><span><b data-package-places>{{ shipping_profile.summary.places }}</b> мест</span><span><b data-package-weight>{{ shipping_profile.summary.weight_kg|number_format(3, '.', ' ') }}</b> кг</span><span><b data-package-volume>{{ shipping_profile.summary.volume_m3|number_format(4, '.', ' ') }}</b> м³</span><span class="badge {{ shipping_profile.complete ? 'badge-green' : 'badge-amber' }}" data-package-state>{{ shipping_profile.complete ? 'данные заполнены' : 'нужны габариты' }}</span></div><div class="cluster">{% if variant_group %}<button class="btn btn-secondary" type="button" data-shipping-copy-variants data-url="{{ ADMINX_BASE }}/catalog/products/{{ document.Id }}/shipping/copy-to-variants" data-csrf="{{ csrf_token }}" data-tooltip="Заменить упаковку у всех вариантов"><i class="ti ti-copy"></i>Вариантам</button>{% endif %}<button class="btn btn-secondary" type="button" data-package-add><i class="ti ti-plus"></i>Добавить место</button><button class="btn btn-primary" type="submit"><i class="ti ti-device-floppy"></i>Сохранить упаковку</button></div></div>
</div>
</form>
<template data-package-template><div class="product-package-row" data-package-row><input class="input" name="title" value="" placeholder="Коробка 1" aria-label="Название грузового места"><input class="input" type="number" name="quantity" min="1" max="999" step="1" value="1" aria-label="Количество"><input class="input" type="number" name="weight_kg" min="0" step="0.001" value="" placeholder="0" aria-label="Вес в килограммах"><input class="input" type="number" name="length_cm" min="0" step="0.1" value="" placeholder="0" aria-label="Длина в сантиметрах"><input class="input" type="number" name="width_cm" min="0" step="0.1" value="" placeholder="0" aria-label="Ширина в сантиметрах"><input class="input" type="number" name="height_cm" min="0" step="0.1" value="" placeholder="0" aria-label="Высота в сантиметрах"><button class="btn btn-ghost btn-icon btn-sm ax-act ax-act-danger" type="button" data-package-remove data-tooltip="Удалить грузовое место" aria-label="Удалить грузовое место"><i class="ti ti-trash"></i></button></div></template>
</section>
{% endif %}
<form id="documentForm" class="documents-edit-form" data-base="{{ ADMINX_BASE }}" data-id="{{ document.Id }}" data-rubric-id="{{ document.rubric_id }}" data-actor-id="{{ actor_id|default(0) }}" data-submit-url="{{ submit_url|default('') }}" data-return-url="{{ return_url|default('') }}" data-stay-url-template="{{ stay_url_template|default('') }}" data-quick-edit="{{ quick_edit ? '1' : '0' }}" data-editor-mode="normal">
<input type="hidden" name="_csrf" value="{{ csrf_token }}">
<input type="hidden" name="id" value="{{ document.Id }}">
<input type="hidden" name="document_version" value="{{ document.document_version|default(1) }}">
<input type="hidden" name="media_draft_token" value="{{ media_draft_token|default('')|e('html_attr') }}">
<section class="documents-draft-recovery" data-document-draft-recovery hidden>
<span class="icon-tile" style="--tile-bg:var(--amber-100);--tile-fg:var(--amber-700)"><i class="ti ti-device-floppy"></i></span>
<div class="documents-draft-recovery-copy"><b>Найден локальный черновик</b><span data-document-draft-recovery-text>Можно вернуть изменения, которые не были отправлены на сервер.</span></div>
<div class="cluster"><button class="btn btn-ghost btn-sm" type="button" data-document-draft-discard>Удалить</button><button class="btn btn-secondary btn-sm" type="button" data-document-draft-restore><i class="ti ti-history"></i>Восстановить</button></div>
</section>
<section class="documents-error-summary" data-document-error-summary hidden aria-live="assertive">
<span class="icon-tile" style="--tile-bg:var(--red-100);--tile-fg:var(--red-700)"><i class="ti ti-alert-triangle"></i></span>
<div class="documents-error-summary-copy"><b data-document-error-title>Проверьте поля документа</b><div data-document-error-list></div></div>
</section>
{% if creation_preset %}
<section class="documents-preset-notice">
<span class="icon-tile" style="--tile-bg:var(--cyan-100);--tile-fg:var(--cyan-700)"><i class="ti ti-copy-check"></i></span>
<div><b>Применён пресет «{{ creation_preset.title }}»</b><span>{{ creation_preset.description ?: 'Форма заполнена сохранёнными значениями. Проверьте их перед сохранением.' }}</span></div>
<a class="btn btn-ghost btn-sm" href="{{ ADMINX_BASE }}/documents/create?rubric_id={{ document.rubric_id }}">Сбросить</a>
</section>
{% endif %}
<div class="documents-edit-top" data-editor-level="advanced">
<section class="card documents-card documents-edit-card" style="--sec:var(--amber-600);--sec-soft:var(--amber-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-tools"></i></span>
<h2>Инструменты</h2>
</div>
</div>
<div class="documents-card-body documents-tools">
<button class="documents-tool" type="button" data-document-remarks{{ is_new ? ' disabled' : '' }}>
<span class="icon-tile" style="--tile-bg:var(--amber-100);--tile-fg:var(--amber-600)"><i class="ti ti-message-2"></i></span>
<span class="documents-tool-body"><b>Заметки</b><small>Комментарии к документу</small></span>
<span class="badge badge-amber" data-document-remarks-badge>{{ document.remarks_count|default(0) }}</span>
<i class="ti ti-chevron-right documents-tool-arrow"></i>
</button>
<button class="documents-tool" type="button" data-document-aliases{{ is_new ? ' disabled' : '' }}>
<span class="icon-tile" style="--tile-bg:var(--cyan-100);--tile-fg:var(--cyan-600)"><i class="ti ti-route"></i></span>
<span class="documents-tool-body"><b>Редиректы</b><small>История адресов URL</small></span>
<span class="badge badge-cyan" data-document-aliases-count>{{ document.aliases_count|default(0) }}</span>
<i class="ti ti-chevron-right documents-tool-arrow"></i>
</button>
<button class="documents-tool" type="button" data-document-revisions{{ is_new ? ' disabled' : '' }}>
<span class="icon-tile" style="--tile-bg:var(--blue-100);--tile-fg:var(--blue-600)"><i class="ti ti-history"></i></span>
<span class="documents-tool-body"><b>Ревизии</b><small>Снимки значений полей</small></span>
<span class="badge badge-blue" data-document-revisions-badge>{{ document.revisions_count|default(0) }}</span>
<i class="ti ti-chevron-right documents-tool-arrow"></i>
</button>
<button class="documents-tool" type="button" data-document-snapshot{{ is_new ? ' disabled' : '' }}>
<span class="icon-tile" style="--tile-bg:var(--green-100);--tile-fg:var(--green-600)"><i class="ti ti-database-export"></i></span>
<span class="documents-tool-body"><b>JSON-снимок</b><small>Публичная модель документа</small></span>
<i class="ti ti-chevron-right documents-tool-arrow"></i>
</button>
<button class="documents-tool" type="button" data-open-drawer="documentPresetDrawer"{{ is_new ? ' disabled' : '' }}>
<span class="icon-tile" style="--tile-bg:var(--cyan-100);--tile-fg:var(--cyan-600)"><i class="ti ti-template"></i></span>
<span class="documents-tool-body"><b>Пресет создания</b><small>Сохранить заполнение как заготовку</small></span>
<i class="ti ti-chevron-right documents-tool-arrow"></i>
</button>
{% if is_new %}<p class="text-secondary text-sm documents-side-note" data-document-new-note>Инструменты доступны после первого сохранения.</p>{% endif %}
</div>
</section>
<section class="card documents-card documents-edit-card" style="--sec:var(--gray-500);--sec-soft:var(--gray-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-info-circle"></i></span>
<h2>Сводка</h2>
</div>
</div>
<div class="documents-card-body">
<dl class="documents-facts">
<div><dt>ID</dt><dd class="mono" data-document-fact-id>{{ document.Id ?: 'новый' }}</dd></div>
<div><dt>Рубрика</dt><dd>{{ document.rubric_title ?: 'будет выбрана при сохранении' }}</dd></div>
<div><dt>Изменён</dt><dd>{{ document.changed_label }}</dd></div>
<div><dt>Опубликован</dt><dd>{{ document.published_label }}</dd></div>
</dl>
</div>
</section>
<section class="card documents-card documents-edit-card" style="--sec:var(--cyan-600);--sec-soft:var(--cyan-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-plug-connected"></i></span>
<h2>Интеграция</h2>
</div>
</div>
<div class="documents-card-body"><div class="form-grid"><label class="field col-12"><span class="field-label">Артикул / свойство</span><input class="input" type="text" name="document_property" value="{{ document.document_property|e('html_attr') }}"></label><label class="field col-12"><span class="field-label">GUID</span><input class="input mono" type="text" name="guid" maxlength="100" value="{{ document.guid|e('html_attr') }}"></label></div></div>
</section>
</div>
<div class="documents-edit-layout">
<div class="stack documents-edit-main">
<section class="card documents-card documents-edit-card documents-section-main" style="--sec:var(--blue-600);--sec-soft:var(--blue-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-file-text"></i></span>
<h2>Основное</h2>
</div>
<span class="badge badge-{{ document.state_badge }}">{{ document.state_label }}</span>
</div>
<div class="documents-card-body">
<div class="form-grid">
<label class="field col-12">
<span class="field-label between-label">Название<span class="field-count" data-seo-count="title" data-seo-max="60">0/60</span></span>
<input class="input" type="text" name="document_title" value="{{ document.document_title|e('html_attr') }}" data-slug-source required>
<span class="field-error" data-error="document_title"></span>
</label>
<label class="field col-6">
<span class="field-label">Рубрика</span>
{% if is_new %}
<select class="select" name="rubric_id" required data-document-rubric-select>{% for rubric in rubrics %}<option value="{{ rubric.Id }}" data-alias-template="{{ rubric.rubric_alias|e('html_attr') }}"{{ document.rubric_id == rubric.Id ? ' selected' : '' }}>{{ rubric.rubric_title }}</option>{% endfor %}</select>
{% else %}
<input type="hidden" name="rubric_id" value="{{ document.rubric_id }}">
<select class="select" disabled>{% for rubric in rubrics %}<option value="{{ rubric.Id }}"{{ document.rubric_id == rubric.Id ? ' selected' : '' }}>{{ rubric.rubric_title }}</option>{% endfor %}</select>
<span class="field-hint">Смена рубрики существующего документа будет отдельной операцией с миграцией значений полей.</span>
{% endif %}
<span class="field-error" data-error="rubric_id"></span>
</label>
<label class="field col-6">
<span class="field-label">Короткий alias</span>
<div class="input-group documents-alias-group">
<span class="input-addon mono">/</span>
<input class="input mono" type="text" name="document_short_alias" value="{{ document.document_short_alias|e('html_attr') }}" maxlength="10" autocomplete="off"{{ is_homepage ? ' disabled' : '' }}>
<button class="input-addon documents-alias-gen" type="button" data-short-generate="{{ ADMINX_BASE }}/documents/short-alias" data-document-id="{{ document.Id }}" data-tooltip="Сгенерировать короткий алиас" aria-label="Сгенерировать короткий алиас"{{ is_homepage ? ' disabled' : '' }}><i class="ti ti-refresh"></i></button>
</div>
<span class="field-hint" data-document-short-alias-state>До 10 символов, необязательно.</span>
<span class="field-error" data-error="document_short_alias"></span>
</label>
<div class="field col-12">
<span class="field-label">Alias (URL)</span>
<div class="input-group documents-alias-group">
<span class="input-addon mono">/</span>
<input class="input mono" type="text" name="document_alias" value="{{ document.document_alias|e('html_attr') }}" autocomplete="off" data-slug-target{{ is_homepage ? ' disabled' : '' }}>
<button class="input-addon documents-alias-gen" type="button" data-slug-generate="{{ ADMINX_BASE }}/documents/slug" data-document-id="{{ document.Id }}" data-tooltip="Сгенерировать из названия" aria-label="Сгенерировать alias"{{ is_homepage ? ' disabled' : '' }}><i class="ti ti-refresh"></i></button>
</div>
<span class="field-hint" data-document-alias-state>{{ is_homepage ? 'Адрес главной страницы закреплён за / и не изменяется.' : '' }}</span>
{% if is_new %}<span class="field-hint" data-document-alias-template-hint></span>{% endif %}
<span class="field-error" data-error="document_alias"></span>
</div>
<label class="field col-6"><span class="field-label">История URL</span><select class="select" name="document_alias_history"{{ is_homepage ? ' disabled' : '' }}><option value="0"{{ document.document_alias_history == 0 ? ' selected' : '' }}>Как в рубрике</option><option value="1"{{ document.document_alias_history == 1 ? ' selected' : '' }}>Сохранять старые URL</option><option value="2"{{ document.document_alias_history == 2 ? ' selected' : '' }}>Не сохранять</option></select></label>
<label class="field col-6"><span class="field-label">Код редиректа</span><select class="select" name="document_alias_header"{{ is_homepage ? ' disabled' : '' }}>{% for code in [301,302,307,308] %}<option value="{{ code }}"{{ document.document_alias_header == code ? ' selected' : '' }}>{{ code }}</option>{% endfor %}</select></label>
<label class="field col-12"><span class="field-label">Хлебная крошка</span><input class="input" type="text" name="document_breadcrumb_title" value="{{ document.document_breadcrumb_title|e('html_attr') }}"><span class="field-hint">Если пусто, используется название документа.</span></label>
<label class="field col-12">
<span class="field-label">Краткое описание</span>
<textarea class="textarea" name="document_excerpt" rows="3" maxlength="1000">{{ document.document_excerpt }}</textarea>
<span class="field-hint">Самостоятельный анонс для списков, RSS и интеграций. Если Meta description пуст, используется как его резерв.</span>
</label>
</div>
</div>
</section>
<section class="card documents-card documents-edit-card documents-section-seo" data-editor-level="advanced" style="--sec:var(--green-600);--sec-soft:var(--green-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-search"></i></span>
<h2>SEO и поиск</h2>
</div>
</div>
<div class="documents-card-body">
<div class="form-grid">
<div class="field col-12 documents-term-field" data-document-term-input data-term-kind="keywords" data-term-rubric-id="{{ document.rubric_id }}" data-term-url="{{ ADMINX_BASE }}/documents/terms">
<span class="field-label">Meta keywords</span>
<div class="documents-term-combobox combobox">
<div class="tag-input documents-term-input" data-document-term-box>
<input type="hidden" name="document_meta_keywords" value="{{ document.document_meta_keywords|e('html_attr') }}" data-document-term-value>
<input type="text" placeholder="Найти или добавить ключевое слово" autocomplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="documentKeywordSuggestions" data-document-term-query>
</div>
<div class="combo-list documents-term-options" id="documentKeywordSuggestions" role="listbox" hidden data-document-term-options></div>
</div>
</div>
<label class="field col-12">
<span class="field-label between-label">Meta description<span class="field-count" data-seo-count="description" data-seo-max="160">0/160</span></span>
<textarea class="textarea" name="document_meta_description" rows="4">{{ document.document_meta_description }}</textarea>
</label>
<label class="field col-6"><span class="field-label">Meta robots</span><select class="select" name="document_meta_robots"><option value="index,follow"{{ document.document_meta_robots == 'index,follow' ? ' selected' : '' }}>index, follow</option><option value="index,nofollow"{{ document.document_meta_robots == 'index,nofollow' ? ' selected' : '' }}>index, nofollow</option><option value="noindex,nofollow"{{ document.document_meta_robots == 'noindex,nofollow' ? ' selected' : '' }}>noindex, nofollow</option></select></label>
<div class="field col-6 documents-term-field" data-document-term-input data-term-kind="tags" data-term-rubric-id="{{ document.rubric_id }}" data-term-url="{{ ADMINX_BASE }}/documents/terms">
<span class="field-label">Теги</span>
<div class="documents-term-combobox combobox">
<div class="tag-input documents-term-input" data-document-term-box>
<input type="hidden" name="document_tags" value="{{ document.document_tags|e('html_attr') }}" data-document-term-value>
<input type="text" placeholder="Найти или добавить тег" autocomplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="documentTagSuggestions" data-document-term-query>
</div>
<div class="combo-list documents-term-options" id="documentTagSuggestions" role="listbox" hidden data-document-term-options></div>
</div>
</div>
<label class="field col-6"><span class="field-label">Sitemap: частота</span><select class="select" name="document_sitemap_freq">
<option value="0"{{ document.document_sitemap_freq == 0 ? ' selected' : '' }}>always</option>
<option value="1"{{ document.document_sitemap_freq == 1 ? ' selected' : '' }}>hourly</option>
<option value="2"{{ document.document_sitemap_freq == 2 ? ' selected' : '' }}>daily</option>
<option value="3"{{ document.document_sitemap_freq == 3 ? ' selected' : '' }}>weekly</option>
<option value="4"{{ document.document_sitemap_freq == 4 ? ' selected' : '' }}>monthly</option>
<option value="5"{{ document.document_sitemap_freq == 5 ? ' selected' : '' }}>yearly</option>
<option value="6"{{ document.document_sitemap_freq == 6 ? ' selected' : '' }}>never</option>
</select></label>
<label class="field col-6"><span class="field-label">Sitemap: приоритет</span><select class="select" name="document_sitemap_pr">
{% for pr in ['0','0.1','0.2','0.3','0.4','0.5','0.6','0.7','0.8','0.9','1'] %}
<option value="{{ pr }}"{{ document.document_sitemap_pr == pr ? ' selected' : '' }}>{{ pr }}</option>
{% endfor %}
</select></label>
<div class="field col-12">
<span class="field-label">Сниппет в выдаче</span>
<div class="documents-seo-snippet">
<div class="documents-seo-url" data-seo-snippet-url>/{{ document.document_alias }}</div>
<div class="documents-seo-title" data-seo-snippet-title>{{ document.document_title ?: 'Заголовок документа' }}</div>
<div class="documents-seo-desc" data-seo-snippet-desc>{{ document.document_meta_description ?: 'Описание появится после заполнения meta description.' }}</div>
</div>
</div>
</div>
</div>
</section>
</div>
<aside class="stack documents-edit-side">
<section class="card documents-card documents-edit-card documents-section-publish" data-editor-level="normal" style="--sec:var(--green-600);--sec-soft:var(--green-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-rocket"></i></span>
<h2>Публикация</h2>
</div>
</div>
<div class="documents-card-body">
<div class="form-grid">
<label class="field col-6"><span class="field-label">Статус</span><select class="select" name="document_status"><option value="1"{{ document.document_status == 1 ? ' selected' : '' }}>Опубликован</option><option value="0"{{ document.document_status == 0 ? ' selected' : '' }}>Черновик</option></select></label>
<label class="field col-6"><span class="field-label">Поиск</span><select class="select" name="document_in_search"><option value="1"{{ document.document_in_search == 1 ? ' selected' : '' }}>В поиске</option><option value="0"{{ document.document_in_search == 0 ? ' selected' : '' }}>Скрыт</option></select></label>
<label class="field col-12"><span class="field-label">Автор</span><select class="select" name="document_author_id">{% for author in authors %}<option value="{{ author.id }}"{{ document.document_author_id == author.id ? ' selected' : '' }}>{{ author.name }}{% if not author.active %} · отключён{% endif %}</option>{% endfor %}</select></label>
<div class="field col-12">
<span class="field-label">Родительский документ</span>
<div class="documents-picker-input">
<input class="input" type="number" name="document_parent" value="{{ document.document_parent }}" placeholder="ID документа" min="0" data-document-parent-id>
<button class="btn btn-secondary btn-icon btn-sm" type="button" data-document-parent-pick data-tooltip="Выбрать документ" aria-label="Выбрать документ"><i class="ti ti-file-search"></i></button>
</div>
{% if document.parent_info %}<span class="field-hint">#{{ document.parent_info.id }} · {{ document.parent_info.title }}</span>{% else %}<span class="field-hint">Пусто — верхний уровень.</span>{% endif %}
</div>
<label class="field col-12"><span class="field-label">Шаблон документа</span><select class="select" name="rubric_tmpl_id"><option value="0">Шаблон рубрики по умолчанию</option>{% for tpl in templates %}<option value="{{ tpl.id }}"{{ document.rubric_tmpl_id == tpl.id ? ' selected' : '' }}>{{ tpl.title }}</option>{% endfor %}</select></label>
<label class="field col-12"><span class="field-label">Пункт навигации</span><select class="select" name="document_linked_navi_id"><option value="0">Не связан</option>{% for nav in navigation_items %}<option value="{{ nav.id }}"{{ document.document_linked_navi_id == nav.id ? ' selected' : '' }}>{{ nav.title }} (#{{ nav.id }})</option>{% endfor %}</select></label>
<label class="field col-12"><span class="field-label">Позиция</span><input class="input" type="number" name="document_position" value="{{ document.document_position }}"></label>
</div>
</div>
</section>
<section class="card documents-card documents-edit-card documents-section-dates" data-editor-level="advanced" style="--sec:var(--teal-600);--sec-soft:var(--teal-100)">
<div class="documents-section-head">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-calendar-event"></i></span>
<h2>Даты</h2>
</div>
</div>
<div class="documents-card-body">
<div class="form-grid">
<label class="field col-12"><span class="field-label">Дата публикации</span><input class="input" type="datetime-local" name="document_published" value="{{ document.published_input }}"></label>
<label class="field col-12"><span class="field-label">Дата окончания</span><input class="input" type="datetime-local" name="document_expire" value="{{ document.expire_input }}"></label>
</div>
</div>
</section>
</aside>
</div>
<section class="documents-fields-section documents-section-fields" style="--sec:var(--violet-600);--sec-soft:var(--violet-100)">
<div class="documents-fields-heading">
<div class="documents-head-left">
<span class="icon-tile documents-head-icon" style="--tile-bg:var(--sec-soft);--tile-fg:var(--sec)"><i class="ti ti-forms"></i></span>
<h2>Поля документа</h2>
</div>
<span class="badge badge-blue">{{ document.fields_count|default(0) }}</span>
</div>
{% if field_groups %}
<div class="tabs documents-field-tabs ax-attr-tabs" role="tablist" aria-label="Группы полей документа">
{% for group in field_groups %}
<button class="tab{{ loop.first ? ' is-active' : '' }}" type="button" role="tab" aria-selected="{{ loop.first ? 'true' : 'false' }}" data-document-field-tab="{{ loop.index0 }}"{% if group.description %} data-tooltip="{{ group.description|e('html_attr') }}"{% endif %}>
<i class="ti ti-folder"></i>{{ group.title }}<span class="tab-count">{{ group.items|length }}</span>{% if group.description %}<i class="ti ti-info-circle tab-hint" aria-hidden="true"></i>{% endif %}
</button>
{% endfor %}
</div>
{% endif %}
<div class="documents-fields-groups">
{% for group in field_groups %}
<section class="documents-field-group ax-attr-pane" role="tabpanel" data-document-field-panel="{{ loop.index0 }}"{% if group.condition %} data-group-condition="{{ group.condition|json_encode|e('html_attr') }}"{% endif %}{{ not loop.first ? ' hidden' : '' }}>
{% if group.items %}
<div class="documents-fields ax-document-fields">
{% for field in group.items %}
<div class="ax-document-field {{ field.width_class }}{{ field.required ? ' is-required' : '' }}{{ field.catalog_hidden ? ' is-catalog-hidden' : '' }}" data-rubric-field-id="{{ field.Id }}" data-field-alias="{{ field.rubric_field_alias|e('html_attr') }}" data-field-type="{{ field.rubric_field_type }}" data-editor-kind="{{ field.editor_kind }}" data-base-required="{{ field.required ? '1' : '0' }}"{% if field.condition %} data-field-condition="{{ field.condition|json_encode|e('html_attr') }}"{% endif %}>
<div class="ax-attr-label">
<label class="ax-label">{{ field.rubric_field_title ?: field.rubric_field_alias }}{% if field.required %}<span class="ax-required" title="Обязательное поле" aria-hidden="true">*</span>{% endif %}</label>
<span class="ax-attr-id">#{{ field.Id }}</span>
<span class="ax-attr-type">{{ field.rubric_field_type }}</span>
{% if not field.has_plugin %}<span class="ax-attr-noplugin" data-tooltip="Для этого типа используется универсальный редактор">нет плагина</span>{% endif %}
</div>
{% if field.prefix or field.suffix %}
<div class="ax-document-field-body documents-field-control input-group ax-field-affix">{% if field.prefix %}<span class="input-addon">{{ field.prefix }}</span>{% endif %}{{ field.html|raw }}{% if field.suffix %}<span class="input-addon">{{ field.suffix }}</span>{% endif %}</div>
{% else %}
<div class="ax-document-field-body documents-field-control">{{ field.html|raw }}</div>
{% endif %}
{% if field.rubric_field_description %}<p class="documents-field-description">{{ field.rubric_field_description }}</p>{% endif %}
</div>
{% endfor %}
</div>
{% else %}
<div class="documents-placeholder">
<span class="icon-tile" style="--tile-bg:var(--gray-100);--tile-fg:var(--gray-600)"><i class="ti ti-input-search"></i></span>
<div><b>В этой группе нет полей</b><p class="text-secondary">Добавьте поля в разделе «Рубрики и поля».</p></div>
</div>
{% endif %}
</section>
{% else %}
<div class="documents-placeholder">
<span class="icon-tile" style="--tile-bg:var(--gray-100);--tile-fg:var(--gray-600)"><i class="ti ti-input-search"></i></span>
<div><b>У выбранной рубрики нет полей</b><p class="text-secondary">После выбора рубрики и сохранения здесь появятся её поля.</p></div>
</div>
{% endfor %}
</div>
</section>
<div class="sticky-actions documents-sticky-actions">
<div class="documents-save-state" data-document-save-state data-state="saved" role="status" aria-live="polite">
<span class="documents-save-state-icon"><i class="ti ti-circle-check" data-document-save-state-icon></i></span>
<span data-document-save-state-text>Изменения сохранены</span>
</div>
<div class="cluster">
<button class="btn btn-secondary documents-json-button" type="button" data-document-payload-preview data-tooltip="Данные JSON"><i class="ti ti-braces"></i><span>Данные JSON</span></button>
<button class="btn btn-secondary" type="button" data-document-submit-stay data-code-save-stay><i class="ti ti-device-floppy"></i><span class="documents-label-desktop">Сохранить и остаться</span><span class="documents-label-mobile">Остаться</span></button>
<button class="btn btn-primary" type="submit"><i class="ti ti-check"></i>Сохранить</button>
</div>
</div>
</form>
{% if can_manage %}
<aside class="drawer drawer-right drawer-lg documents-preset-panel" id="documentPresetDrawer" role="dialog" aria-modal="true" aria-labelledby="documentPresetDrawerTitle" hidden>
<form data-document-preset-form action="{{ ADMINX_BASE }}/documents/{{ document.Id }}/presets" method="post">
<input type="hidden" name="_csrf" value="{{ csrf_token }}">
<div class="drawer-header">
<div class="documents-drawer-title"><h3 id="documentPresetDrawerTitle">Новый пресет создания</h3><p class="text-secondary text-sm">Заготовка будет доступна только для рубрики «{{ document.rubric_title }}».</p></div>
<button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button>
</div>
<div class="drawer-body documents-preset-body">
<div class="alert alert-info"><i class="ti ti-info-circle alert-ic"></i><div><b class="alert-title">URL и служебные данные не копируются</b><span>Название документа, alias, даты, автор, GUID и связи с навигацией всегда останутся пустыми или стандартными.</span></div></div>
<div class="form-grid">
<label class="field col-12"><span class="field-label">Название пресета</span><input class="input" type="text" name="title" maxlength="191" placeholder="Например: Новость с источником" required><span class="field-error" data-error="title"></span></label>
<label class="field col-12"><span class="field-label">Описание</span><textarea class="textarea" name="description" rows="3" maxlength="1000" placeholder="Когда использовать эту заготовку"></textarea></label>
</div>
<div class="documents-preset-options">
<label class="switch"><input type="checkbox" name="include_excerpt" value="1" checked><span></span><b>Краткое описание</b></label>
<label class="switch"><input type="checkbox" name="include_seo" value="1"><span></span><b>SEO и теги</b></label>
<label class="switch"><input type="checkbox" name="include_fields" value="1" checked><span></span><b>Значения полей</b></label>
<label class="switch"><input type="checkbox" name="include_assets" value="1"><span></span><b>Медиа, связи и каталог</b></label>
<label class="switch"><input type="checkbox" name="include_search" value="1"><span></span><b>Настройка поиска</b></label>
<label class="switch"><input type="checkbox" name="create_published" value="1"><span></span><b>Создавать опубликованным</b></label>
</div>
<p class="documents-preset-warning"><i class="ti ti-alert-triangle"></i>Медиа и связи по умолчанию исключены, чтобы новые документы случайно не использовали файлы и отношения исходного материала.</p>
</div>
<div class="drawer-footer"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button><button class="btn btn-primary" type="submit"><i class="ti ti-device-floppy"></i>Сохранить пресет</button></div>
</form>
</aside>
<aside class="drawer drawer-right drawer-lg documents-payload-panel" id="documentSnapshotDrawer" role="dialog" aria-modal="true" aria-labelledby="documentSnapshotDrawerTitle" hidden>
<div class="drawer-header">
<div class="documents-drawer-title"><h3 id="documentSnapshotDrawerTitle">JSON-снимок документа</h3><p class="text-secondary text-sm">Read-through модель публичной части.</p></div>
<button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button>
</div>
<div class="drawer-body documents-payload-body">
<div class="alert alert-info"><i class="ti ti-info-circle alert-ic"></i><div><b class="alert-title">База данных остаётся источником истины</b><span>Повреждённый или устаревший снимок публичная часть пересоберёт автоматически.</span></div></div>
<dl class="documents-facts documents-snapshot-facts" data-document-snapshot-status><div><dt>Состояние</dt><dd>Загрузка...</dd></div></dl>
</div>
<div class="drawer-footer"><div class="df-left"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button></div><button class="btn btn-primary" type="button" data-document-snapshot-rebuild><i class="ti ti-refresh"></i>Пересобрать</button></div>
</aside>
<aside class="drawer drawer-right documents-payload-panel" id="documentPayloadDrawer" role="dialog" aria-modal="true" aria-labelledby="documentPayloadDrawerTitle" hidden>
<div class="drawer-header">
<div class="documents-drawer-title"><h3 id="documentPayloadDrawerTitle">Данные для сохранения</h3><p class="text-secondary text-sm" data-document-payload-summary>Живой JSON текущей формы.</p></div>
<button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button>
</div>
<div class="drawer-body documents-payload-body">
<div class="alert alert-info"><i class="ti ti-info-circle alert-ic"></i><div><b class="alert-title">Без записи в БД</b><span>Код рубрики до/после сохранения не запускается, чтобы preview не имел побочных эффектов.</span></div></div>
<div class="documents-payload-validation" data-document-payload-validation hidden></div>
<pre class="documents-payload-code" data-document-payload-code aria-live="polite">Нажмите «Данные JSON», чтобы сформировать preview.</pre>
</div>
<div class="drawer-footer"><div class="df-left"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button></div><button class="btn btn-secondary" type="button" data-document-payload-copy><i class="ti ti-copy"></i>Скопировать JSON</button></div>
</aside>
<aside class="drawer drawer-right drawer-lg documents-revisions-panel" id="documentRevisionsDrawer" role="dialog" aria-modal="true" aria-labelledby="documentRevisionsDrawerTitle" hidden>
<div class="drawer-header">
<div class="documents-drawer-title">
<h3 id="documentRevisionsDrawerTitle">Ревизии документа</h3>
<p class="text-secondary text-sm" id="documentRevisionsDrawerSubtitle">История основных настроек и значений полей.</p>
</div>
<button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button>
</div>
<div class="drawer-body documents-revisions-drawer">
<div class="documents-revisions-layout">
<section class="documents-revisions-list" aria-label="Список ревизий">
<div class="documents-revisions-head">
<div>
<h4>Снимки</h4>
<p class="text-secondary" data-document-revisions-count>Загрузка...</p>
</div>
</div>
<div class="documents-revisions-list-rows" data-document-revisions-list>
<div class="empty-state">Загрузка...</div>
</div>
</section>
<section class="documents-revision-preview" aria-label="Просмотр ревизии">
<div class="documents-revisions-head">
<div>
<h4 data-document-revision-title>Выберите ревизию</h4>
<p class="text-secondary" data-document-revision-meta>Содержимое снимка появится после выбора ревизии.</p>
</div>
</div>
<div class="documents-revision-fields" data-document-revision-fields></div>
</section>
</div>
</div>
<div class="drawer-footer">
<div class="df-left"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button><button class="btn btn-danger-soft" type="button" data-document-revisions-clear disabled><i class="ti ti-trash"></i>Удалить все</button></div>
<div class="cluster"><a class="btn btn-secondary" href="#" target="_blank" rel="noopener" data-document-revision-preview hidden><i class="ti ti-external-link"></i>На сайте</a><button class="btn btn-secondary" type="button" data-document-revision-delete disabled><i class="ti ti-trash"></i>Удалить</button><button class="btn btn-primary" type="button" data-document-revision-restore disabled><i class="ti ti-restore"></i><span data-document-revision-restore-label>Восстановить</span></button></div>
</div>
</aside>
<aside class="drawer drawer-right drawer-lg documents-remarks-panel" id="documentRemarksDrawer" role="dialog" aria-modal="true" aria-labelledby="documentRemarksDrawerTitle" hidden>
<div class="drawer-header"><div class="documents-drawer-title"><h3 id="documentRemarksDrawerTitle">Заметки документа</h3><p class="text-secondary text-sm" data-document-remarks-subtitle></p></div><button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button></div>
<div class="drawer-body documents-remarks-drawer">
<form class="card documents-remark-form documents-drawer-form" data-document-remark-form>
<div class="documents-section-head"><div class="documents-head-left"><span class="icon-tile documents-head-icon" style="--tile-bg:var(--amber-100);--tile-fg:var(--amber-600)"><i class="ti ti-message-2"></i></span><h4>Новая заметка</h4></div></div>
<div class="documents-card-body form-grid"><label class="field col-12"><span class="field-label">Заголовок</span><input class="input" type="text" name="title" maxlength="255"></label><label class="field col-12"><span class="field-label">Текст</span><textarea class="textarea" name="text" rows="5" maxlength="500" required></textarea></label></div>
<div class="documents-alias-form-actions"><button class="btn btn-primary" type="submit"><i class="ti ti-send"></i>Добавить заметку</button></div>
</form>
<div class="documents-remark-list" data-document-remark-list><div class="empty-state">Загрузка...</div></div>
</div>
<div class="drawer-footer"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button></div>
</aside>
<aside class="drawer drawer-right drawer-lg documents-aliases-panel" id="documentAliasesDrawer" role="dialog" aria-modal="true" aria-labelledby="documentAliasesDrawerTitle" hidden>
<div class="drawer-header">
<div class="documents-drawer-title">
<h3 id="documentAliasesDrawerTitle">История URL</h3>
<p class="text-secondary text-sm" data-document-aliases-subtitle>Старые адреса документа.</p>
</div>
<button class="btn btn-ghost btn-icon" type="button" data-close-drawer aria-label="Закрыть"><i class="ti ti-x"></i></button>
</div>
<div class="drawer-body documents-aliases-drawer">
<div class="documents-alias-target"><span class="icon-tile" style="--tile-bg:var(--green-100);--tile-fg:var(--green-600)"><i class="ti ti-arrow-forward-up"></i></span><div><small>Текущий адрес назначения</small><a class="mono" href="#" target="_blank" rel="noopener" data-document-alias-target>/</a></div></div>
<form class="card documents-alias-form documents-drawer-form" data-document-alias-form>
<input type="hidden" name="id" value="0" data-document-alias-id>
<div class="documents-section-head"><div class="documents-head-left"><span class="icon-tile documents-head-icon" style="--tile-bg:var(--cyan-100);--tile-fg:var(--cyan-600)"><i class="ti ti-route"></i></span><h4 data-document-alias-form-title>Новый редирект</h4></div></div>
<div class="documents-card-body form-grid">
<label class="field col-8"><span class="field-label">Старый URL</span><div class="input-group documents-alias-group"><span class="input-addon mono">/</span><input class="input mono" type="text" name="alias" required></div></label>
<label class="field col-4"><span class="field-label">Код</span><select class="select" name="header">{% for code in [301,302,307,308] %}<option value="{{ code }}">{{ code }}</option>{% endfor %}</select></label>
</div>
<div class="documents-alias-form-actions"><button class="btn btn-ghost" type="button" data-document-alias-reset>Очистить</button><button class="btn btn-primary" type="submit"><i class="ti ti-device-floppy"></i>Сохранить</button></div>
</form>
<div class="documents-alias-list" data-document-alias-list><div class="empty-state">Загрузка...</div></div>
</div>
<div class="drawer-footer"><button class="btn btn-ghost" type="button" data-close-drawer>Закрыть</button></div>
</aside>
{% endif %}
{% endblock %}