You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.0 KiB
76 lines
2.0 KiB
|
2 years ago
|
// Set up various Alpine things after it's initialized
|
||
|
|
export default function alpineInit() {
|
||
|
|
// Bulk edit forms
|
||
|
|
Alpine.bind('BulkEdit', () => ({
|
||
|
|
/** @param {SubmitEvent} evt */
|
||
|
|
'@submit'(evt) {
|
||
|
|
evt.preventDefault();
|
||
|
|
document.querySelectorAll('.js-unit-checkbox').forEach((el) => {
|
||
|
|
if (el.checked) {
|
||
|
|
const input = document.createElement('input');
|
||
|
|
input.type = 'hidden';
|
||
|
|
input.name = el.name;
|
||
|
|
input.value = el.value;
|
||
|
|
evt.target.appendChild(input);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
evt.target.submit();
|
||
|
|
},
|
||
|
|
}));
|
||
|
|
|
||
|
|
// Form state
|
||
|
|
Alpine.store('form', {
|
||
|
|
dirty: false,
|
||
|
|
makeDirty() {
|
||
|
|
this.dirty = true;
|
||
|
|
},
|
||
|
|
});
|
||
|
|
document
|
||
|
|
.querySelectorAll('#main-form input, #main-form select, #main-form textarea')
|
||
|
|
.forEach((el) => {
|
||
|
|
el.addEventListener('change', () => {
|
||
|
|
Alpine.store('form').makeDirty();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
// Notifications methods called by the view code
|
||
|
|
Alpine.data('notifications', () => ({
|
||
|
|
initialized: false,
|
||
|
|
open: false,
|
||
|
|
notifications: [],
|
||
|
|
toggle() {
|
||
|
|
this.open = !this.open;
|
||
|
|
if (!this.initialized) {
|
||
|
|
this.list();
|
||
|
|
}
|
||
|
|
},
|
||
|
|
async list() {
|
||
|
|
const token = document.querySelector('#token').getAttribute('token');
|
||
|
|
const res = await fetch(`/list/notifications/?ajax=1&token=${token}`);
|
||
|
|
this.initialized = true;
|
||
|
|
if (!res.ok) {
|
||
|
|
throw new Error('An error occurred while listing notifications.');
|
||
|
|
}
|
||
|
|
|
||
|
|
this.notifications = Object.values(await res.json());
|
||
|
|
},
|
||
|
|
async remove(id) {
|
||
|
|
const token = document.querySelector('#token').getAttribute('token');
|
||
|
|
await fetch(`/delete/notification/?delete=1¬ification_id=${id}&token=${token}`);
|
||
|
|
|
||
|
|
this.notifications = this.notifications.filter((notification) => notification.ID != id);
|
||
|
|
if (this.notifications.length === 0) {
|
||
|
|
this.open = false;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
async removeAll() {
|
||
|
|
const token = document.querySelector('#token').getAttribute('token');
|
||
|
|
await fetch(`/delete/notification/?delete=1&token=${token}`);
|
||
|
|
|
||
|
|
this.notifications = [];
|
||
|
|
this.open = false;
|
||
|
|
},
|
||
|
|
}));
|
||
|
|
}
|