Implement vocab delete in Stimulus
TODO: show modal warning before deleting
This commit is contained in:
parent
dce0e1b693
commit
a622b3c256
@ -18,10 +18,10 @@ export default class extends Controller {
|
|||||||
* @todo Simpler way?
|
* @todo Simpler way?
|
||||||
*/
|
*/
|
||||||
edit(event) {
|
edit(event) {
|
||||||
const id = event.currentTarget.getAttribute('data-vocabs-id-value');
|
const id = event.currentTarget.getAttribute('data-id');
|
||||||
|
|
||||||
this.saveTargets.forEach((btn, index) => {
|
this.saveTargets.forEach((btn, index) => {
|
||||||
if (btn.getAttribute('data-vocabs-id-value') === id) {
|
if (btn.getAttribute('data-id') === id) {
|
||||||
btn.classList.toggle('is-hidden');
|
btn.classList.toggle('is-hidden');
|
||||||
this.inputTargets[index].disabled = false;
|
this.inputTargets[index].disabled = false;
|
||||||
this.cancelTargets[index].classList.toggle('is-hidden');
|
this.cancelTargets[index].classList.toggle('is-hidden');
|
||||||
@ -32,11 +32,11 @@ export default class extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async save(event) {
|
async save(event) {
|
||||||
const id = event.currentTarget.getAttribute('data-vocabs-id-value');
|
const id = event.currentTarget.getAttribute('data-id');
|
||||||
let term = '';
|
let term = '';
|
||||||
|
|
||||||
for (let input of this.inputTargets) {
|
for (let input of this.inputTargets) {
|
||||||
if (input.getAttribute('data-vocabs-id-value') === id) {
|
if (input.getAttribute('data-id') === id) {
|
||||||
term = input.value;
|
term = input.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -45,25 +45,62 @@ export default class extends Controller {
|
|||||||
data.append("_id", id);
|
data.append("_id", id);
|
||||||
data.append("_new_term", term);
|
data.append("_new_term", term);
|
||||||
|
|
||||||
const res = await fetch(this.saveUrlValue, {
|
const url = event.currentTarget.getAttribute('data-url');
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: data,
|
body: data,
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: show notification
|
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
console.log('Saved...');
|
let notif = document.getElementById('ajax-saved');
|
||||||
|
notif.classList.toggle('is-hidden');
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
delete() {
|
this.cancelTargets.find(btn => btn.getAttribute('data-id') === id)
|
||||||
|
.classList.toggle('is-hidden');
|
||||||
|
|
||||||
|
this.editTargets.find(btn => btn.getAttribute('data-id') === id)
|
||||||
|
.classList.toggle('is-hidden');
|
||||||
|
const input = this.inputTargets.find(input => input.getAttribute('data-id') === id)
|
||||||
|
input.disabled = true;
|
||||||
|
event.target.classList.toggle('is-hidden');
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @todo Show modal before deleting! Show delete error (500)!
|
||||||
|
*/
|
||||||
|
async delete(event) {
|
||||||
|
const id = event.currentTarget.getAttribute('data-id');
|
||||||
|
const url = event.currentTarget.getAttribute('data-url');
|
||||||
|
|
||||||
|
let data = new FormData;
|
||||||
|
data.append("_id", id);
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
body: data,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
let notif = document.getElementById('ajax-deleted');
|
||||||
|
notif.classList.toggle('is-hidden');
|
||||||
|
this.rowTargets.find(row => row.getAttribute('data-id') === id)
|
||||||
|
.classList.add('is-hidden');
|
||||||
|
};
|
||||||
|
|
||||||
|
if (res.status === 500) {
|
||||||
|
let notif = document.getElementById('ajax-error');
|
||||||
|
notif.classList.toggle('is-hidden');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel(event) {
|
cancel(event) {
|
||||||
const id = event.currentTarget.getAttribute('data-vocabs-id-value');
|
const id = event.currentTarget.getAttribute('data-id');
|
||||||
|
|
||||||
this.editTargets.forEach((btn, index) => {
|
this.editTargets.forEach((btn, index) => {
|
||||||
if (btn.getAttribute('data-vocabs-id-value') === id) {
|
if (btn.getAttribute('data-id') === id) {
|
||||||
btn.classList.toggle('is-hidden');
|
btn.classList.toggle('is-hidden');
|
||||||
this.inputTargets[index].disabled = true;
|
this.inputTargets[index].disabled = true;
|
||||||
this.saveTargets[index].classList.toggle('is-hidden');
|
this.saveTargets[index].classList.toggle('is-hidden');
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
{% block title %}Vocab - Functional context | ArCOA{% endblock %}
|
{% block title %}Vocab - Functional context | ArCOA{% endblock %}
|
||||||
|
|
||||||
{% block rightpanel %}
|
{% block rightpanel %}
|
||||||
<div class="container" style="max-width: 50vw">
|
<div class="container" style="max-width: 50vw" data-controller="vocabs">
|
||||||
<h1 class="is-size-1 mt-0 has-text-centered">Vocabulary</h1>
|
<h1 class="is-size-1 mt-0 has-text-centered">Vocabulary</h1>
|
||||||
<h2 class="is-size-3 mt-4 has-text-centered">Functional context</h2>
|
<h2 class="is-size-3 mt-4 has-text-centered">Functional context</h2>
|
||||||
|
|
||||||
@ -30,8 +30,24 @@
|
|||||||
|
|
||||||
<div class="notification is-success is-hidden mt-5"
|
<div class="notification is-success is-hidden mt-5"
|
||||||
data-controller="notification"
|
data-controller="notification"
|
||||||
data-notification-target=""="notif">
|
data-notification-target="notif"
|
||||||
|
id="ajax-saved">
|
||||||
<button class="delete" data-action="click->notification#close"></button>
|
<button class="delete" data-action="click->notification#close"></button>
|
||||||
|
Term saved successfully
|
||||||
|
</div>
|
||||||
|
<div class="notification is-success is-hidden mt-5"
|
||||||
|
data-controller="notification"
|
||||||
|
data-notification-target="notif"
|
||||||
|
id="ajax-deleted">
|
||||||
|
<button class="delete" data-action="click->notification#close"></button>
|
||||||
|
Term deleted successfully
|
||||||
|
</div>
|
||||||
|
<div class="notification is-danger is-light is-hidden mt-5"
|
||||||
|
data-controller="notification"
|
||||||
|
data-notification-target="notif"
|
||||||
|
id="ajax-error">
|
||||||
|
<button class="delete" data-action="click->notification#close"></button>
|
||||||
|
The term could not be deleted because it's related to existing records
|
||||||
</div>
|
</div>
|
||||||
{% for message in app.flashes('notice') %}
|
{% for message in app.flashes('notice') %}
|
||||||
<div class="notification is-success mt-5" data-controller="notification"
|
<div class="notification is-success mt-5" data-controller="notification"
|
||||||
@ -41,14 +57,14 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<h3 class="mt-6 mb-5 is-size-5"><strong>Terms in vocabulary</strong></h3>
|
<h3 class="mt-6 mb-5 is-size-5"><strong>Terms in vocabulary</strong></h3>
|
||||||
<table class="table is-fullwidth" id="terms" data-controller="vocabs">
|
<table class="table is-fullwidth" id="terms">
|
||||||
<tr><th>Term</th>{% if is_granted('ROLE_ADMIN') or is_granted('ROLE_REVISOR') %}<th>Actions</th>{% endif %}</tr>
|
<tr><th>Term</th>{% if is_granted('ROLE_ADMIN') or is_granted('ROLE_REVISOR') %}<th>Actions</th>{% endif %}</tr>
|
||||||
{% for term in terms %}
|
{% for term in terms %}
|
||||||
<tr data-vocabs-target="row"
|
<tr data-vocabs-target="row"
|
||||||
data-vocabs-id-value="{{ term.id }}">
|
data-id="{{ term.id }}">
|
||||||
<td>
|
<td>
|
||||||
<input class="input" type="text" value="{{ term.term }}" disabled
|
<input class="input" type="text" value="{{ term.term }}" disabled
|
||||||
data-vocabs-id-value="{{ term.id }}" data-vocabs-target="input" />
|
data-id="{{ term.id }}" data-vocabs-target="input" />
|
||||||
</td>
|
</td>
|
||||||
{% if is_granted('ROLE_ADMIN') or is_granted('ROLE_REVISOR') %}
|
{% if is_granted('ROLE_ADMIN') or is_granted('ROLE_REVISOR') %}
|
||||||
<td>
|
<td>
|
||||||
@ -56,15 +72,15 @@
|
|||||||
<button class="button is-primary is-hidden"
|
<button class="button is-primary is-hidden"
|
||||||
data-vocabs-target="save"
|
data-vocabs-target="save"
|
||||||
data-action="click->vocabs#save"
|
data-action="click->vocabs#save"
|
||||||
data-vocabs-saveUrl-value="{{ path('app_vocab_func_context_upd') }}"
|
data-url="{{ path('app_vocab_func_context_upd') }}"
|
||||||
data-vocabs-id-value="{{ term.id }}">
|
data-id="{{ term.id }}">
|
||||||
Save
|
Save
|
||||||
<span class="icon ml-2">
|
<span class="icon ml-2">
|
||||||
<i class="fa fa-save"></i>
|
<i class="fa fa-save"></i>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="button is-hidden"
|
<button class="button is-hidden"
|
||||||
data-vocabs-id-value="{{ term.id }}"
|
data-id="{{ term.id }}"
|
||||||
data-vocabs-target="cancel"
|
data-vocabs-target="cancel"
|
||||||
data-action="click->vocabs#cancel">
|
data-action="click->vocabs#cancel">
|
||||||
Cancel
|
Cancel
|
||||||
@ -74,7 +90,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button class="button is-link"
|
<button class="button is-link"
|
||||||
data-vocabs-target="edit"
|
data-vocabs-target="edit"
|
||||||
data-vocabs-id-value="{{ term.id }}"
|
data-id="{{ term.id }}"
|
||||||
data-action="click->vocabs#edit">
|
data-action="click->vocabs#edit">
|
||||||
Edit
|
Edit
|
||||||
<span class="icon ml-2">
|
<span class="icon ml-2">
|
||||||
@ -82,9 +98,9 @@
|
|||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="button is-danger"
|
<button class="button is-danger"
|
||||||
data-vocabs-id-value="{{ term.id }}"
|
data-id="{{ term.id }}"
|
||||||
data-action="click->vocabs#delete"
|
data-action="click->vocabs#delete"
|
||||||
data-vocabs-delUrl-value="{{ path('app_vocab_func_context_del') }}">
|
data-url="{{ path('app_vocab_func_context_del') }}">
|
||||||
Delete
|
Delete
|
||||||
<span class="icon ml-2">
|
<span class="icon ml-2">
|
||||||
<i class="fa fa-trash"></i>
|
<i class="fa fa-trash"></i>
|
||||||
@ -96,8 +112,27 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal" data-vocabs-target="modal">
|
||||||
|
<div class="modal-background"></div>
|
||||||
|
<div class="modal-card">
|
||||||
|
<header class="modal-card-head">
|
||||||
|
<span class="icon is-large has-text-warning">
|
||||||
|
<i class="fa fa-warning fa-2x"></i>
|
||||||
|
</span>
|
||||||
|
<p class="modal-card-title has-text-danger pl-2"><strong>Delete term?</strong></p>
|
||||||
|
<button class="delete" aria-label="close"></button>
|
||||||
|
</header>
|
||||||
|
<section class="modal-card-body">
|
||||||
|
<p class="is-size-5">This term will be permanently deleted. Proceed?</p>
|
||||||
|
</section>
|
||||||
|
<footer class="modal-card-foot">
|
||||||
|
<div class="buttons is-right">
|
||||||
|
<button class="button is-link" data-action="click->vocabs#delete">Confirm</button>
|
||||||
|
<button class="button is-light" id="cancel">Cancel</button>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript" defer></script>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user