diff --git a/assets/controllers/user_controller.js b/assets/controllers/user_controller.js
index 2a53cad..e7834b0 100644
--- a/assets/controllers/user_controller.js
+++ b/assets/controllers/user_controller.js
@@ -1,7 +1,15 @@
import {Controller} from '@hotwired/stimulus';
import Choices from 'choices.js';
import {TabulatorFull as Tabulator} from 'tabulator-tables';
-import {activateUserIcon, deactivateUserIcon, eyeIconLink, sendEmailIcon, TABULATOR_FR_LANG} from "../js/global.js";
+import {
+ activateUserIcon,
+ deactivateUserIcon,
+ eyeIconLink,
+ sendEmailIcon,
+ TABULATOR_FR_LANG,
+ trashIconForm
+} from "../js/global.js";
+import { Modal } from "bootstrap";
export default class extends Controller {
@@ -18,7 +26,7 @@ export default class extends Controller {
orgId: Number
}
- static targets = ["select", "statusButton"];
+ static targets = ["select", "statusButton", "modal", "userSelect"];
connect() {
this.roleSelect();
@@ -34,6 +42,9 @@ export default class extends Controller {
if (this.listOrganizationValue) {
this.tableOrganization()
}
+ if (this.hasModalTarget) {
+ this.modal = new Modal(this.modalTarget);
+ }
}
@@ -499,8 +510,9 @@ export default class extends Controller {
headerSort: false,
formatter: (cell) => {
const url = cell.getValue();
+ const orgId = this.orgIdValue;
if (url) {
- eyeIconLink(url);
+ return trashIconForm(url, orgId);
}
return '';
}
@@ -918,4 +930,92 @@ export default class extends Controller {
btn.dataset.active = "false";
}
}
+
+ async openAddAdminModal() {
+ this.modal.show();
+ await this.loadAvailableUsers();
+ }
+
+ async loadAvailableUsers() {
+ try {
+ const response = await fetch(`/organization/${this.orgIdValue}/users`);
+ const data = await response.json();
+
+ if (data.users) {
+ this.userSelectTarget.innerHTML = '' +
+ data.users.map(user => `
+
+ `).join('');
+ }
+ } catch (error) {
+ this.userSelectTarget.innerHTML = '';
+ }
+ }
+
+ async submitAddAdmin(event) {
+ event.preventDefault();
+ const formData = new FormData(event.target);
+ const userId = formData.get('userId');
+
+ try {
+ const response = await fetch(`/user/organization/admin/${userId}`, {
+ method: 'POST',
+ body: formData, // Sends userId, status="add", and organizationId
+ headers: {'X-Requested-With': 'XMLHttpRequest'}
+ });
+
+ if (response.ok) {
+ this.modal.hide();
+ // If you use Tabulator, refresh it here
+ // e.g., this.table.setData();
+ location.reload();
+ } else {
+ if (response.status === 409) {
+ alert("Cet utilisateur est déjà administrateur de l'organisation.");
+ return;
+ }
+ alert("Erreur lors de l'ajout de l'administrateur.");
+ }
+ } catch (error) {
+ alert("Une erreur est survenue.");
+ }
+ }
+
+ async removeAdmin(event) {
+ // 1. Prevent any default behavior
+ event.preventDefault();
+
+ const button = event.currentTarget;
+ const url = button.dataset.url;
+ const organizationId = button.dataset.orgId;
+
+ if (!confirm("Voulez-vous vraiment retirer les droits d'administrateur à cet utilisateur ?")) {
+ return;
+ }
+
+ // 2. Prepare the payload (matching your previous hidden fields)
+ const formData = new FormData();
+ formData.append('status', 'remove');
+ formData.append('organizationId', organizationId);
+
+ try {
+ const response = await fetch(url, {
+ method: 'POST',
+ body: formData,
+ headers: {
+ 'X-Requested-With': 'XMLHttpRequest'
+ }
+ });
+
+ if (response.ok) {
+ // 3. Success! Reload the page to see the updated list
+ location.reload();
+ } else {
+ const errorData = await response.json();
+ alert("Erreur: " + (errorData.error || "Impossible de supprimer les droits."));
+ }
+ } catch (error) {
+ alert("Une erreur réseau est survenue.");
+ }
+ }
}
\ No newline at end of file
diff --git a/assets/js/global.js b/assets/js/global.js
index 80d5c79..42d51d4 100644
--- a/assets/js/global.js
+++ b/assets/js/global.js
@@ -41,7 +41,7 @@ export function pencilIcon() {
`
}
-export function trashIcon(url) {
+export function trashIcon() {
return `