feat: Refactor provisioning to instance requests and enhance subdomain availability check
This commit is contained in:
@@ -64,7 +64,7 @@
|
||||
{% endfor %}
|
||||
|
||||
{% if provision_requests %}
|
||||
<h2>Provisionierungsanfragen</h2>
|
||||
<h2>Instanz-Anfragen</h2>
|
||||
{% for prov in provision_requests %}
|
||||
<article class="entry">
|
||||
<h3>{{ prov.booking_number or prov.booking_number }}</h3>
|
||||
@@ -105,7 +105,7 @@
|
||||
<button type="submit">Konfiguration ausführen</button>
|
||||
</form>
|
||||
<form method="post" style="display:inline-block; margin-right:0.6rem;">
|
||||
<input type="hidden" name="action" value="delete_provision">
|
||||
<input type="hidden" name="action" value="delete_instance_request">
|
||||
<input type="hidden" name="prov_id" value="{{ prov.id }}">
|
||||
<button type="submit" class="danger">Löschen</button>
|
||||
</form>
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
</section>
|
||||
|
||||
<section class="panel">
|
||||
<h2>Provisionierungsanfragen</h2>
|
||||
<p>Hier siehst du den Status deiner angeforderten Instanzen/ Buchungen, die vom Admin geprüft werden.</p>
|
||||
<h2>Instanz-Anfragen</h2>
|
||||
<p>Hier siehst du den Status deiner angeforderten Instanzen/Buchungen, die vom Admin geprüft werden.</p>
|
||||
</section>
|
||||
|
||||
<section class="table-wrap">
|
||||
@@ -62,7 +62,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for prov in provision_requests %}
|
||||
{% for prov in instance_requests %}
|
||||
<tr>
|
||||
<td>{{ prov.booking_number or prov.booking_number }}</td>
|
||||
<td>{{ prov.package_label or prov.package }}</td>
|
||||
@@ -70,7 +70,7 @@
|
||||
<td>{{ '%.2f'|format(prov.amount_eur or 0) }} EUR</td>
|
||||
<td>
|
||||
{{ prov.provision_status or 'not_started' }}
|
||||
<form method="post" action="{{ url_for('provision_delete') }}" style="display:inline-block; margin-left:0.6rem;">
|
||||
<form method="post" action="{{ url_for('instance_request_delete') }}" style="display:inline-block; margin-left:0.6rem;">
|
||||
<input type="hidden" name="prov_id" value="{{ prov.id }}">
|
||||
<button type="submit" class="danger">Löschen</button>
|
||||
</form>
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
<div class="booking-review__field">
|
||||
<label for="school_name">Schule/Einrichtung *</label>
|
||||
<input id="school_name" name="school_name" type="text" required maxlength="160" value="{{ form_data.school_name }}">
|
||||
<div id="school_name_feedback" style="margin-top:0.4rem; font-size:0.9rem; color:#6b6b6b;"></div>
|
||||
</div>
|
||||
<div class="booking-review__field">
|
||||
<label for="contact_email">E-Mail *</label>
|
||||
@@ -242,10 +243,54 @@
|
||||
</div>
|
||||
|
||||
<div class="booking-review__actions">
|
||||
<button class="btn" type="submit">{{ confirm_label }}</button>
|
||||
<button id="booking_submit" class="btn" type="submit">{{ confirm_label }}</button>
|
||||
<a class="btn secondary" href="{{ url_for('preise') }}">Zurück zu den Preisen</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
(() => {
|
||||
const input = document.getElementById('school_name');
|
||||
const feedback = document.getElementById('school_name_feedback');
|
||||
const submit = document.getElementById('booking_submit');
|
||||
let timer = null;
|
||||
|
||||
function setFeedback(text, ok) {
|
||||
feedback.textContent = text;
|
||||
feedback.style.color = ok ? '#1b8a3e' : '#b02a37';
|
||||
submit.disabled = !ok;
|
||||
}
|
||||
|
||||
async function check(name) {
|
||||
if (!name || name.trim().length < 3) {
|
||||
feedback.textContent = '';
|
||||
submit.disabled = false;
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const params = new URLSearchParams({ school_name: name });
|
||||
const res = await fetch(`/instance_request/check_subdomain?${params.toString()}`, { credentials: 'same-origin' });
|
||||
if (!res.ok) throw new Error('Netzwerkfehler');
|
||||
const j = await res.json();
|
||||
setFeedback(j.message || (j.available ? 'verfügbar' : 'nicht verfügbar'), !!j.available);
|
||||
} catch (e) {
|
||||
setFeedback('Prüfung fehlgeschlagen (Netzwerk).', false);
|
||||
}
|
||||
}
|
||||
|
||||
if (input) {
|
||||
input.addEventListener('input', (e) => {
|
||||
clearTimeout(timer);
|
||||
const val = e.target.value;
|
||||
timer = setTimeout(() => check(val), 500);
|
||||
});
|
||||
|
||||
// initial check on load
|
||||
if (input.value && input.value.trim()) {
|
||||
check(input.value);
|
||||
}
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user