Merge remote-tracking branch 'origin/support/3.2' into develop

This commit is contained in:
Benjamin Dalsass
2024-03-12 09:48:37 +01:00
5 changed files with 48 additions and 221 deletions

View File

@@ -59,9 +59,6 @@ class NotificationsCenterController extends Controller
$oNotificationsPanel = new Panel(Dict::S('UI:NotificationsCenter:Panel:Title'), array(), 'grey', 'ibo-notifications-center');
$oNotificationsPanel->AddCSSClass('ibo-datatable-panel');
$oSubtitleBlock = new UIContentBlock(null, ['ibo-notifications-center--sub-title']);
$sDisplayAdvancedPageUrl = Router::GetInstance()->GenerateUrl(self::ROUTE_NAMESPACE.'.display_advanced_page', [], true);
$oSubtitleBlock->AddSubBlock(new Html(Dict::Format('UI:NotificationsCenter:Panel:SubTitle', $sDisplayAdvancedPageUrl)));
$oNotificationsPanel->SetSubTitleBlock($oSubtitleBlock);
$oNotificationsCenterTableColumns = [
'trigger' => array('label' => MetaModel::GetName('Trigger')),
'trigger_class' => array('label' => MetaModel::GetAttributeDef('Trigger', 'finalclass')->GetLabel()),
@@ -267,205 +264,6 @@ JS
return $oPage;
}
public function OperationDisplayAdvancedPage(){
$oPage = new iTopWebPage(Dict::S('UI:NotificationsCenter:Page:Title'));
// Create a panel that will contain the table
$oNotificationsPanel = new Panel(Dict::S('UI:NotificationsCenter:Panel:Title'), array(), 'grey', 'ibo-notifications-center');
$oSubtitleBlock = new UIContentBlock(null, ['ibo-notifications-center--sub-title']);
$sDisplayAdvancedPageUrl = Router::GetInstance()->GenerateUrl(self::ROUTE_NAMESPACE.'.display_page', [], true);
$oSubtitleBlock->AddSubBlock(new Html(Dict::Format('UI:NotificationsCenter:Panel:Advanced:SubTitle', $sDisplayAdvancedPageUrl)));
$oNotificationsPanel->SetSubTitleBlock($oSubtitleBlock);
$oPage->AddUiBlock($oNotificationsPanel);
// Get all subscribed/unsubscribed actions notifications for the current user
$oLnkNotificationsSet = NotificationsRepository::GetInstance()->SearchSubscriptionsByContact(\UserRights::GetContactId());
$oActionsNotificationsByTrigger = [];
$aSubscribedActionsNotificationsByTrigger = [];
while ($oLnkActionsNotifications = $oLnkNotificationsSet->Fetch()) {
$oSubscribedActionNotification = MetaModel::GetObject(ActionNotification::class, $oLnkActionsNotifications->Get('action_id'));
$oTrigger = MetaModel::GetObject('Trigger', $oLnkActionsNotifications->Get('trigger_id'));
$iTriggerId = $oTrigger->GetKey();
// Create a new array for the trigger if it doesn't exist
if (!isset($oActionsNotificationsByTrigger[$iTriggerId])) {
$oActionsNotificationsByTrigger[$iTriggerId] = [];
$aSubscribedActionsNotificationsByTrigger[$iTriggerId] = [];
}
// Add the action notification to the list of actions notifications for the trigger
$oActionsNotificationsByTrigger[$iTriggerId][] = $oSubscribedActionNotification;
// Add the subscribed status to the list of subscribed actions notifications for the trigger
$aSubscribedActionsNotificationsByTrigger[$iTriggerId][$oSubscribedActionNotification->GetKey()] = $oLnkActionsNotifications->Get('subscribed') || $oTrigger->Get('subscription_policy') === SubscriptionPolicy::ForceAllChannels->value;
}
$oPage->AddTabContainer('NotificationsCenter', '', $oNotificationsPanel);
$oPage->SetCurrentTabContainer('NotificationsCenter');
// Create a new tab for each trigger
foreach ($oActionsNotificationsByTrigger as $iTriggerId => $aActionsNotifications) {
$oTrigger = MetaModel::GetObject('Trigger', $iTriggerId, false);
if ($oTrigger === null) {
continue;
}
foreach ($aActionsNotifications as $oActionNotification) {
$oPage->SetCurrentTab(MetaModel::GetName(get_class($oActionNotification)));
$oCheckBox = InputUIBlockFactory::MakeForInputWithLabel(
Dict::Format('UI:NotificationsCenter:Advanced:Input:Label', $oTrigger->Get('description'), $oActionNotification->Get('name')),
$oTrigger->GetKey().'|'.$oActionNotification->GetKey(),
"",
$oTrigger->GetKey().'|'.$oActionNotification->GetKey(),
"checkbox"
);
$oCheckBox->GetInput()->SetIsChecked($aSubscribedActionsNotificationsByTrigger[$iTriggerId][$oActionNotification->GetKey()] === true);
$oCheckBox->SetBeforeInput(false);
$oCheckBox->GetInput()->AddCSSClass('ibo-input--label-right');
$oCheckBox->GetInput()->AddCSSClass('ibo-input-checkbox');
$oContainer = new UIContentBlock(null, ['ibo-notifications-center-advanced--input--container']);
$oContainer->AddSubBlock($oCheckBox);
$oPage->AddUiBlock($oContainer);
}
}
$sSubscribeUrl = Router::GetInstance()->GenerateUrl(self::ROUTE_NAMESPACE.'.subscribe', [], true);
$sUnsubscribeUrl = Router::GetInstance()->GenerateUrl(self::ROUTE_NAMESPACE.'.unsubscribe', [], true);
$sCSRFToken = utils::GetNewTransactionId();
$oPage->add_ready_script(
<<<JS
$('.ibo-notifications-center-advanced--input--container .ibo-input-checkbox').on('change', function(){
let sUrl = '{$sUnsubscribeUrl}';
if ($(this).prop("checked")) {
sUrl = '{$sSubscribeUrl}'
}
$.ajax({
url: sUrl,
type: 'POST',
data: {
channel: $(this).attr('name'),
token: '{$sCSRFToken}',
},
dataType: 'json',
success: function (data) {
if (data.status === 'success') {
// Display success message
CombodoToast.OpenSuccessToast(data.message);
}
else {
CombodoToast.OpenErrorToast(data.message);
}
},
error: function (jqXHR, textStatus, errorThrown) {
CombodoToast.OpenErrorToast(data.message);
}
});
});
JS
);
return $oPage;
}
/**
* @return \JsonPage
*/
function OperationUnsubscribe()
{
// Get the CSRF token from the request and check if it's valid
if (!$this->CheckPostedCSRF()) {
throw new \Exception('Invalid token');
}
$sChannel = utils::ReadParam('channel', '', true, 'raw_data');
$aChannel = explode('|', $sChannel);
$oPage = new \JsonPage();
$aReturnData = [];
try {
if (count($aChannel) !== 2) {
throw new \Exception('Invalid channel');
}
$iTriggerKey = $aChannel[0];
$iActionNotificationKey = $aChannel[1];
$oTrigger = MetaModel::GetObject('Trigger', $iTriggerKey, false);
if ($oTrigger === null) {
throw new \Exception('Invalid trigger');
}
$oActionNotification = MetaModel::GetObject('ActionNotification', $iActionNotificationKey, false);
if ($oActionNotification === null) {
throw new \Exception('Invalid action notification');
}
$oSubscribedActionsNotificationsSet = NotificationsRepository::GetInstance()->SearchSubscribedSubscriptionsByTriggerContactAndAction($iTriggerKey, $iActionNotificationKey);
if ($oSubscribedActionsNotificationsSet->Count() === 0) {
throw new \Exception('You are not subscribed to this channel');
}
while ($oSubscribedActionsNotifications = $oSubscribedActionsNotificationsSet->Fetch()) {
$oSubscribedActionsNotifications->Set('subscribed', false);
$oSubscribedActionsNotifications->DBUpdate();
}
$aReturnData = [
'status' => 'success',
'message' => Dict::S('UI:NotificationsCenter:Unsubscribe:Success'),
];
}
catch (Exception $e) {
$aReturnData = [
'status' => 'error',
'message' => $e->getMessage(),
];
}
$oPage->SetData($aReturnData);
$oPage->SetOutputDataOnly(true);
return $oPage;
}
function OperationSubscribe()
{
// Get the CSRF token from the request and check if it's valid
if (!$this->CheckPostedCSRF()) {
throw new \Exception('Invalid token');
}
$sChannel = utils::ReadParam('channel', '', true, 'raw_data');
$aChannel = explode('|', $sChannel);
$oPage = new \JsonPage();
$aReturnData = [];
try {
if (count($aChannel) !== 2) {
throw new \Exception('Invalid channel');
}
$iTriggerKey = $aChannel[0];
$iActionNotificationKey = $aChannel[1];
$oTrigger = MetaModel::GetObject('Trigger', $iTriggerKey, false);
if ($oTrigger === null) {
throw new \Exception('Invalid trigger');
}
$oActionNotification = MetaModel::GetObject('ActionNotification', $iActionNotificationKey, false);
if ($oActionNotification === null) {
throw new \Exception('Invalid action notification');
}
$oSubscribedActionsNotificationsSet = NotificationsRepository::GetInstance()->SearchUnsubscribedSubscriptionsByTriggerContactAndAction($iTriggerKey, $iActionNotificationKey);
if ($oSubscribedActionsNotificationsSet->Count() === 0) {
throw new \Exception('You are not allow to subscribe to this channel');
}
while ($oSubscribedActionsNotifications = $oSubscribedActionsNotificationsSet->Fetch()) {
$oSubscribedActionsNotifications->Set('subscribed', true);
$oSubscribedActionsNotifications->DBUpdate();
}
$aReturnData = [
'status' => 'success',
'message' => Dict::S('UI:NotificationsCenter:Subscribe:Success'),
];
}
catch (Exception $e) {
$aReturnData = [
'status' => 'error',
'message' => $e->getMessage(),
];
}
$oPage->SetData($aReturnData);
$oPage->SetOutputDataOnly(true);
return $oPage;
}
/**
* @return \JsonPage