Skip to content

Commit 48d6b8e

Browse files
committed
Show confirmation modal on contact unlink
1 parent 95c9ff3 commit 48d6b8e

4 files changed

Lines changed: 79 additions & 31 deletions

File tree

components/ILIAS/Contact/classes/class.ilContactGUI.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@
2121
use ILIAS\Refinery\Factory as Refinery;
2222

2323
/**
24-
* @author Jens Conze
25-
* @ingroup ServicesMail
26-
* @ilCtrl_Calls ilContactGUI: ilMailSearchCoursesGUI, ilMailSearchGroupsGUI, ilMailingListsGUI
27-
* @ilCtrl_Calls ilContactGUI: ilUsersGalleryGUI, ilPublicUserProfileGUI
28-
*/
24+
* @ilCtrl_Calls ilContactGUI: ilMailSearchCoursesGUI, ilMailSearchGroupsGUI, ilMailingListsGUI
25+
* @ilCtrl_Calls ilContactGUI: ilUsersGalleryGUI, ilPublicUserProfileGUI
26+
*/
2927
class ilContactGUI
3028
{
3129
final public const CONTACTS_VIEW_GALLERY = 'buddy_view_gallery';
@@ -370,9 +368,28 @@ protected function showContacts(): void
370368
}
371369
}
372370

371+
$confirmation_modal = $this->ui_factory->modal()->interruptive(
372+
$this->lng->txt('confirmation'),
373+
$this->lng->txt('buddy_confirm_unlink'),
374+
''
375+
)
376+
->withActionButtonLabel($this->lng->txt('confirm'))
377+
->withAdditionalOnLoadCode(static function (string $id): string {
378+
return "document.querySelector('#$id').classList.add('unlink_confirmation');";
379+
});
380+
381+
$this->tpl->addOnLoadCode(
382+
'window.unlinkConfirmationSignals = '
383+
. json_encode([
384+
"show" => $confirmation_modal->getShowSignal()->getId(),
385+
"close" => $confirmation_modal->getCloseSignal()->getId()
386+
], JSON_THROW_ON_ERROR)
387+
);
388+
373389
$table = new ilBuddySystemRelationsTableGUI($this, 'showContacts');
374390
$table->populate();
375391
$content[] = $this->ui_factory->legacy($table->getHTML());
392+
$content[] = $confirmation_modal;
376393

377394
$this->tpl->setContent($this->ui_renderer->render($content));
378395
$this->tpl->printToStdout();

components/ILIAS/Contact/resources/buddy_system.js

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525

2626
const BuddySystemButton = {
2727
config: {},
28+
unlinkConfirmationSignals: {
29+
show: '',
30+
close: '',
31+
},
32+
setupConfirmationModal: false,
2833

2934
setConfig(config) {
3035
this.config = config;
@@ -33,41 +38,65 @@
3338
init() {
3439
const toggleSelector = '[data-toggle="dropdown"]';
3540
const triggerSelector = 'a[data-target-state], button[data-target-state]';
41+
this.unlinkConfirmationSignals = window.unlinkConfirmationSignals;
42+
const unlinkConfirmationModal = document.querySelector('dialog.unlink_confirmation');
3643

3744
const onWidgetClick = (e) => {
3845
e.preventDefault();
3946
e.stopPropagation();
4047

4148
const triggerButton = e.target.closest(triggerSelector);
4249
const container = triggerButton.closest(`.${this.config.bnt_class}`);
43-
if (triggerButton.dataset.submitted === 'true') return Promise.resolve();
44-
45-
const values = new FormData();
46-
values.append('usr_id', container.dataset.buddyId);
47-
values.append('action', triggerButton.dataset.action);
48-
values.append(`cmd[${BuddySystem.config.transition_state_cmd}]`, 1);
49-
50-
return disableButtons(container)
51-
.then(() => fetch(BuddySystem.config.http_post_url, {
52-
method: 'POST',
53-
headers: { Accept: 'application/json' },
54-
body: values,
55-
}))
56-
.then((response) => {
57-
if (!response.ok) throw new Error('Request failed');
58-
return response.json();
59-
})
60-
.then((data) => processResponse(container, data))
61-
.then(() => {
62-
container.querySelector(toggleSelector).focus();
63-
})
64-
.catch((error) => {
65-
console.error(error);
66-
enableButtons(container);
67-
container.querySelector(toggleSelector).focus();
68-
});
50+
51+
const widgetClickAction = () => {
52+
if (triggerButton.dataset.submitted === 'true') return Promise.resolve();
53+
54+
const values = new FormData();
55+
values.append('usr_id', container.dataset.buddyId);
56+
values.append('action', triggerButton.dataset.action);
57+
values.append(`cmd[${BuddySystem.config.transition_state_cmd}]`, 1);
58+
59+
return disableButtons(container)
60+
.then(() => fetch(BuddySystem.config.http_post_url, {
61+
method: 'POST',
62+
headers: { Accept: 'application/json' },
63+
body: values,
64+
}))
65+
.then((response) => {
66+
if (!response.ok) throw new Error('Request failed');
67+
return response.json();
68+
})
69+
.then((data) => processResponse(container, data))
70+
.then(() => {
71+
container.querySelector(toggleSelector).focus();
72+
})
73+
.catch((error) => {
74+
console.error(error);
75+
enableButtons(container);
76+
container.querySelector(toggleSelector).focus();
77+
});
78+
};
79+
80+
if (triggerButton.dataset.action === 'unlink') {
81+
return showUnlinkConfirmationModal().then(widgetClickAction);
82+
}
83+
return widgetClickAction();
6984
};
7085

86+
const showUnlinkConfirmationModal = () => new Promise((resolve) => {
87+
$(document).trigger(this.unlinkConfirmationSignals.show, {});
88+
89+
if (!this.setupConfirmationModal) {
90+
this.setupConfirmationModal = true;
91+
92+
unlinkConfirmationModal.querySelector('input[type="submit"]').addEventListener('click', (event) => {
93+
event.preventDefault();
94+
$(document).trigger(this.unlinkConfirmationSignals.close, {});
95+
resolve();
96+
});
97+
}
98+
});
99+
71100
const disableButtons = (container) => new Promise((resolve) => {
72101
document.querySelectorAll(`.${this.config.bnt_class}`).forEach((btnContainer) => {
73102
if (btnContainer.dataset.buddyId === container.dataset.buddyId) {

lang/ilias_de.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2769,6 +2769,7 @@ buddysystem#:#buddy_bs_state_requested_p#:#Angefragt
27692769
buddysystem#:#buddy_bs_state_unlinked#:#Nicht vernetzt
27702770
buddysystem#:#buddy_bs_state_unlinked_a#:#Nicht vernetzt
27712771
buddysystem#:#buddy_bs_state_unlinked_p#:#Nicht vernetzt
2772+
buddysystem#:#buddy_confirm_unlink#:#Wollen Sie wirklich den Kontakt entfernen?
27722773
buddysystem#:#buddy_enable#:#Aktiviere „Benutzerkontakte“
27732774
buddysystem#:#buddy_enable_info#:#Falls aktiviert, können Benutzer im System über Kontaktanfragen miteinander in Verbindung treten. Eine zusätzliche persönliche Einstellung ermöglicht jedem Benutzer, Kontaktaufnahmen zuzulassen oder zu verhindern.
27742775
buddysystem#:#buddy_handle_contact_request#:#Kontaktanfrage

lang/ilias_en.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2770,6 +2770,7 @@ buddysystem#:#buddy_bs_state_requested_p#:#Requested
27702770
buddysystem#:#buddy_bs_state_unlinked#:#Unlinked
27712771
buddysystem#:#buddy_bs_state_unlinked_a#:#Unlinked
27722772
buddysystem#:#buddy_bs_state_unlinked_p#:#Unlinked
2773+
buddysystem#:#buddy_confirm_unlink#:#Do you really want to remove the contact?
27732774
buddysystem#:#buddy_enable#:#Activate ‘Contacts’
27742775
buddysystem#:#buddy_enable_info#:#If enabled, users are allowed to contact each other by initiating contact requests. Additionally, there is a personal user setting to allow or prevent being contacted.
27752776
buddysystem#:#buddy_handle_contact_request#:#Contact Request

0 commit comments

Comments
 (0)