mod: валидатор форм, парсера и моделей (08) избежания дублей в синонимах других записей через админку
This commit is contained in:
@@ -402,24 +402,19 @@ def validate_entity_for_admin_form(form_instance, cleaned_data,
|
|||||||
dup_list = ", ".join(dup_links)
|
dup_list = ", ".join(dup_links)
|
||||||
|
|
||||||
# Кнопка подтверждения создания несмотря на синонимы
|
# Кнопка подтверждения создания несмотря на синонимы
|
||||||
# При клике добавляет класс force-ignore-validation ко всем submit-кнопкам
|
# При клике вызывает функцию markSubmitButtonsToIgnoreValidation()
|
||||||
|
# которая добавляет класс force-ignore-validation ко всем submit-кнопкам.
|
||||||
# Вотчер видит этот класс и добавляет onclick обработчик к кнопкам
|
# Вотчер видит этот класс и добавляет onclick обработчик к кнопкам
|
||||||
# Onclick обработчик вызывает addGetParam() перед отправкой формы
|
# для добавления GET параметра ignore_validate=1 перед отправкой формы.
|
||||||
|
# Весь JS код находится в form-field-watcher.js для чистоты и переиспользования.
|
||||||
confirmation_button = '''
|
confirmation_button = '''
|
||||||
<div class="confirmation-button-container" style="display: block; margin-top: 15px;">
|
<div class="confirmation-button-container">
|
||||||
<br>
|
<button type="button" onclick="markSubmitButtonsToIgnoreValidation();">
|
||||||
<button type="button" onclick="
|
<big>Я проверил и уверен!</big><br/>
|
||||||
// Добавляем класс force-ignore-validation ко всем submit-кнопкам
|
Сохранить, несмотря на синонимы.<br/>
|
||||||
document.querySelectorAll('input[type=submit]').forEach(function(btn) {
|
<i>Точно совпадения в синонимах других записей будут удалены.</i>
|
||||||
btn.classList.add('force-ignore-validation');
|
|
||||||
});
|
|
||||||
"
|
|
||||||
style="padding: 10px 15px; background: #e74c3c; color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: bold;">
|
|
||||||
Я уверен! Создать несмотря на синонимы.
|
|
||||||
</button>
|
</button>
|
||||||
<em style="display: block; margin-top: 8px; color: #666; font-size: 12px;">
|
<em>Теперь нажмите стандартные кнопки сохранения снизу, чтобы сохранить.</em>
|
||||||
Теперь нажмите стандартные кнопки сохранения снизу, чтобы сохранить.
|
|
||||||
</em>
|
|
||||||
</div>
|
</div>
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|||||||
@@ -7,16 +7,46 @@
|
|||||||
input[type=submit].force-ignore-validation {
|
input[type=submit].force-ignore-validation {
|
||||||
background-color: #f39c12 !important; /* Оранжевый/жёлтый цвет */
|
background-color: #f39c12 !important; /* Оранжевый/жёлтый цвет */
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border: 2px solid #e67e22;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=submit].force-ignore-validation:hover {
|
input[type=submit].force-ignore-validation:hover {
|
||||||
background-color: #e67e22 !important;
|
background-color: #e67e22 !important;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
}
|
||||||
|
input[type=submit].force-ignore-validation:not(:hover) {
|
||||||
|
transition: background-color 0.6s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Скрываем красную кнопку подтверждения если она есть */
|
|
||||||
|
/* Блок красной кнопки подтверждения игнорирования валидации */
|
||||||
.confirmation-button-container {
|
.confirmation-button-container {
|
||||||
display: none;
|
display: block;
|
||||||
|
padding-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.confirmation-button-container button {
|
||||||
|
padding: 10px 15px;
|
||||||
|
background: #e74c3c;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.confirmation-button-container button:hover {
|
||||||
|
background: #c0392b;
|
||||||
|
transition: background-color 0.6s ease;
|
||||||
|
}
|
||||||
|
.confirmation-button-container button:not(:hover) {
|
||||||
|
transition: background-color 0.6s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.confirmation-button-container em {
|
||||||
|
display: block;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,17 @@ function addGetParam(button, key, value) {
|
|||||||
button.formAction = baseAction + separator + key + '=' + value;
|
button.formAction = baseAction + separator + key + '=' + value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Функция для добавления класса force-ignore-validation ко всем submit-кнопкам формы
|
||||||
|
// Используется при клике на кнопку "Я проверил и уверен!"
|
||||||
|
function markSubmitButtonsToIgnoreValidation() {
|
||||||
|
// Находим все submit-кнопки на странице и добавляем им класс
|
||||||
|
// form-field-watcher.js потом отследит добавление класса через MutationObserver
|
||||||
|
// и добавит соответствующие onclick обработчики
|
||||||
|
document.querySelectorAll('input[type=submit]').forEach(function(btn) {
|
||||||
|
btn.classList.add('force-ignore-validation');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
// Находим все submit-кнопки администратора
|
// Находим все submit-кнопки администратора
|
||||||
let submitButtons = document.querySelectorAll('input[type=submit]');
|
let submitButtons = document.querySelectorAll('input[type=submit]');
|
||||||
@@ -124,4 +135,3 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
observer.observe(btn, { attributes: true, attributeFilter: ['class'] });
|
observer.observe(btn, { attributes: true, attributeFilter: ['class'] });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user