mirror of
https://github.com/daniviga/django-ram.git
synced 2026-02-03 17:40:39 +01:00
Fix search form validation
This commit is contained in:
2
ram/portal/static/js/main.min.js
vendored
2
ram/portal/static/js/main.min.js
vendored
@@ -3,4 +3,4 @@
|
|||||||
* Copyright 2011-2023 The Bootstrap Authors
|
* Copyright 2011-2023 The Bootstrap Authors
|
||||||
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
* Licensed under the Creative Commons Attribution 3.0 Unported License.
|
||||||
*/
|
*/
|
||||||
(()=>{"use strict";const e=()=>localStorage.getItem("theme"),t=()=>{const t=e();return t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")},a=e=>{"auto"===e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.setAttribute("data-bs-theme","dark"):document.documentElement.setAttribute("data-bs-theme",e)};a(t());const r=(e,t=!1)=>{const a=document.querySelector("#bd-theme");if(!a)return;const r=document.querySelector(".theme-icon-active i"),o=document.querySelector(`[data-bs-theme-value="${e}"]`),s=o.querySelector(".theme-icon i").getAttribute("class");document.querySelectorAll("[data-bs-theme-value]").forEach(e=>{e.classList.remove("active"),e.setAttribute("aria-pressed","false")}),o.classList.add("active"),o.setAttribute("aria-pressed","true"),r.setAttribute("class",s),t&&a.focus()};window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const r=e();"light"!==r&&"dark"!==r&&a(t())}),window.addEventListener("DOMContentLoaded",()=>{r(t()),document.querySelectorAll("[data-bs-theme-value]").forEach(e=>{e.addEventListener("click",()=>{const t=e.getAttribute("data-bs-theme-value");(e=>{localStorage.setItem("theme",e)})(t),a(t),r(t,!0)})})})})(),document.addEventListener("DOMContentLoaded",function(){const e=document.getElementById("tabSelector"),t=window.location.hash.substring(1);if(t){const a=`#nav-${t}`,r=document.querySelector(`[data-bs-target="${a}"]`);r&&(bootstrap.Tab.getOrCreateInstance(r).show(),e.value=a)}document.querySelectorAll('button[data-bs-toggle="tab"]').forEach(e=>{e.addEventListener("shown.bs.tab",e=>{const t=e.target.getAttribute("data-bs-target").replace("nav-","");history.replaceState(null,null,t)})}),e&&(e.addEventListener("change",function(){const e=this.value,t=document.querySelector(`[data-bs-target="${e}"]`);if(t){bootstrap.Tab.getOrCreateInstance(t).show()}}),document.querySelectorAll('[data-bs-toggle="tab"]').forEach(t=>{t.addEventListener("shown.bs.tab",t=>{const a=t.target.getAttribute("data-bs-target");e.value=a})}))});
|
(()=>{"use strict";const e=()=>localStorage.getItem("theme"),t=()=>{const t=e();return t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")},a=e=>{"auto"===e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.setAttribute("data-bs-theme","dark"):document.documentElement.setAttribute("data-bs-theme",e)};a(t());const r=(e,t=!1)=>{const a=document.querySelector("#bd-theme");if(!a)return;const r=document.querySelector(".theme-icon-active i"),o=document.querySelector(`[data-bs-theme-value="${e}"]`),s=o.querySelector(".theme-icon i").getAttribute("class");document.querySelectorAll("[data-bs-theme-value]").forEach(e=>{e.classList.remove("active"),e.setAttribute("aria-pressed","false")}),o.classList.add("active"),o.setAttribute("aria-pressed","true"),r.setAttribute("class",s),t&&a.focus()};window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const r=e();"light"!==r&&"dark"!==r&&a(t())}),window.addEventListener("DOMContentLoaded",()=>{r(t()),document.querySelectorAll("[data-bs-theme-value]").forEach(e=>{e.addEventListener("click",()=>{const t=e.getAttribute("data-bs-theme-value");(e=>{localStorage.setItem("theme",e)})(t),a(t),r(t,!0)})})})})(),document.addEventListener("DOMContentLoaded",function(){"use strict";const e=document.getElementById("tabSelector"),t=window.location.hash.substring(1);if(t){const a=`#nav-${t}`,r=document.querySelector(`[data-bs-target="${a}"]`);r&&(bootstrap.Tab.getOrCreateInstance(r).show(),e.value=a)}document.querySelectorAll('button[data-bs-toggle="tab"]').forEach(e=>{e.addEventListener("shown.bs.tab",e=>{const t=e.target.getAttribute("data-bs-target").replace("nav-","");history.replaceState(null,null,t)})}),e&&(e.addEventListener("change",function(){const e=this.value,t=document.querySelector(`[data-bs-target="${e}"]`);if(t){bootstrap.Tab.getOrCreateInstance(t).show()}}),document.querySelectorAll('[data-bs-toggle="tab"]').forEach(t=>{t.addEventListener("shown.bs.tab",t=>{const a=t.target.getAttribute("data-bs-target");e.value=a})}))}),document.addEventListener("DOMContentLoaded",function(){"use strict";const e=document.querySelectorAll(".needs-validation");Array.from(e).forEach(e=>{e.addEventListener("submit",t=>{e.checkValidity()||(t.preventDefault(),t.stopPropagation()),e.classList.add("was-validated")},!1)})});
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
// use Bootstrap 5's Tab component to manage tab navigation and synchronize with URL hash
|
// use Bootstrap 5's Tab component to manage tab navigation and synchronize with URL hash
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
const selectElement = document.getElementById('tabSelector');
|
const selectElement = document.getElementById('tabSelector');
|
||||||
// code to handle tab selection and URL hash synchronization
|
// code to handle tab selection and URL hash synchronization
|
||||||
const hash = window.location.hash.substring(1) // remove the '#' prefix
|
const hash = window.location.hash.substring(1) // remove the '#' prefix
|
||||||
@@ -8,7 +10,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
const trigger = document.querySelector(`[data-bs-target="${target}"]`);
|
const trigger = document.querySelector(`[data-bs-target="${target}"]`);
|
||||||
if (trigger) {
|
if (trigger) {
|
||||||
bootstrap.Tab.getOrCreateInstance(trigger).show();
|
bootstrap.Tab.getOrCreateInstance(trigger).show();
|
||||||
selectElement.value = target // keep the dropdown in sync
|
selectElement.value = target; // keep the dropdown in sync
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,7 +37,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
document.querySelectorAll('[data-bs-toggle="tab"]').forEach(btn => {
|
document.querySelectorAll('[data-bs-toggle="tab"]').forEach(btn => {
|
||||||
btn.addEventListener('shown.bs.tab', event => {
|
btn.addEventListener('shown.bs.tab', event => {
|
||||||
const target = event.target.getAttribute('data-bs-target');
|
const target = event.target.getAttribute('data-bs-target');
|
||||||
selectElement.value = target
|
selectElement.value = target;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
15
ram/portal/static/js/src/validators.js
Normal file
15
ram/portal/static/js/src/validators.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const forms = document.querySelectorAll('.needs-validation')
|
||||||
|
Array.from(forms).forEach(form => {
|
||||||
|
form.addEventListener('submit', event => {
|
||||||
|
if (!form.checkValidity()) {
|
||||||
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
}
|
||||||
|
|
||||||
|
form.classList.add('was-validated')
|
||||||
|
}, false)
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -10,21 +10,3 @@
|
|||||||
<button class="btn btn-outline-primary" type="submit">Search</button>
|
<button class="btn btn-outline-primary" type="submit">Search</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
'use strict'
|
|
||||||
// Fetch all the forms we want to apply custom Bootstrap validation styles to
|
|
||||||
var forms = document.querySelectorAll('.needs-validation')
|
|
||||||
// Loop over them and prevent submission
|
|
||||||
Array.prototype.slice.call(forms)
|
|
||||||
.forEach(function (form) {
|
|
||||||
form.addEventListener('submit', function (event) {
|
|
||||||
if (!form.checkValidity()) {
|
|
||||||
form.classList.add('was-validated')
|
|
||||||
event.preventDefault()
|
|
||||||
event.stopPropagation()
|
|
||||||
}
|
|
||||||
}, false)
|
|
||||||
})
|
|
||||||
})()
|
|
||||||
</script>
|
|
||||||
|
|||||||
@@ -277,6 +277,9 @@ class SearchObjects(View):
|
|||||||
return _filter, search
|
return _filter, search
|
||||||
|
|
||||||
def get(self, request, search, page=1):
|
def get(self, request, search, page=1):
|
||||||
|
if not search:
|
||||||
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
encoded_search = search
|
encoded_search = search
|
||||||
search = base64.b64decode(search.encode()).decode()
|
search = base64.b64decode(search.encode()).decode()
|
||||||
|
|||||||
Reference in New Issue
Block a user