mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-18 23:08:46 +02:00
Fix rebase
This commit is contained in:
96
pages/UI.php
96
pages/UI.php
@@ -1355,99 +1355,3 @@ try {
|
|||||||
IssueLog::Debug('UI.php operation='.$sOperationToLog.', error='.$e->getMessage()."\n".$sErrorStackTrace, LogChannels::CONSOLE);
|
IssueLog::Debug('UI.php operation='.$sOperationToLog.', error='.$e->getMessage()."\n".$sErrorStackTrace, LogChannels::CONSOLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
class UI
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Operation select_for_modify_all
|
|
||||||
*
|
|
||||||
* @param iTopWebPage $oP
|
|
||||||
*
|
|
||||||
* @throws \ApplicationException
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \OQLException
|
|
||||||
*/
|
|
||||||
public static function OperationSelectForModifyAll(iTopWebPage $oP): void
|
|
||||||
{
|
|
||||||
$oP->DisableBreadCrumb();
|
|
||||||
$oP->set_title(Dict::S('UI:ModifyAllPageTitle'));
|
|
||||||
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
|
||||||
if (empty($sFilter)) {
|
|
||||||
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'filter'));
|
|
||||||
}
|
|
||||||
$oFilter = DBObjectSearch::unserialize($sFilter); //TODO : check that the filter is valid
|
|
||||||
// Add user filter
|
|
||||||
$oFilter->UpdateContextFromUser();
|
|
||||||
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_MODIFY);
|
|
||||||
$sClass = $oFilter->GetClass();
|
|
||||||
$sClassName = MetaModel::GetName($sClass);
|
|
||||||
|
|
||||||
$aDisplayParams = [
|
|
||||||
'icon' => MetaModel::GetClassIcon($sClass, false),
|
|
||||||
'title' => Dict::Format('UI:Modify_ObjectsOf_Class', $sClassName),
|
|
||||||
];
|
|
||||||
DisplayMultipleSelectionForm($oP, $oFilter, 'form_for_modify_all', $oChecker, [], $aDisplayParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Operation form_for_modify_all
|
|
||||||
*
|
|
||||||
* @param iTopWebPage $oP
|
|
||||||
* @param \ApplicationContext $oAppContext
|
|
||||||
*
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \OQLException
|
|
||||||
*/
|
|
||||||
public static function OperationFormForModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
|
|
||||||
{
|
|
||||||
$oP->DisableBreadCrumb();
|
|
||||||
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
|
||||||
$sClass = utils::ReadParam('class', '', false, utils::ENUM_SANITIZATION_FILTER_CLASS);
|
|
||||||
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
|
|
||||||
// Add user filter
|
|
||||||
$oFullSetFilter->UpdateContextFromUser();
|
|
||||||
$aSelectedObj = utils::ReadMultipleSelection($oFullSetFilter);
|
|
||||||
$sCancelUrl = "./UI.php?operation=search&filter=".urlencode($sFilter).$oAppContext->GetForLink(true);
|
|
||||||
$aContext = ['filter' => utils::EscapeHtml($sFilter)];
|
|
||||||
cmdbAbstractObject::DisplayBulkModifyForm($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $sCancelUrl, [], $aContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Operation preview_or_modify_all
|
|
||||||
*
|
|
||||||
* @param iTopWebPage $oP
|
|
||||||
* @param \ApplicationContext $oAppContext
|
|
||||||
*
|
|
||||||
* @throws \ApplicationException
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreCannotSaveObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \OQLException
|
|
||||||
*/
|
|
||||||
public static function OperationPreviewOrModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
|
|
||||||
{
|
|
||||||
$oP->DisableBreadCrumb();
|
|
||||||
$sFilter = utils::ReadParam('filter', '', false, 'raw_data');
|
|
||||||
$oFilter = DBObjectSearch::unserialize($sFilter); // TO DO : check that the filter is valid
|
|
||||||
// Add user filter
|
|
||||||
$oFilter->UpdateContextFromUser();
|
|
||||||
|
|
||||||
$sClass = utils::ReadParam('class', '', false, 'class');
|
|
||||||
$bPreview = utils::ReadParam('preview_mode', '');
|
|
||||||
$sSelectedObj = utils::ReadParam('selectObj', '', false, 'raw_data');
|
|
||||||
if (empty($sClass) || empty($sSelectedObj)) { // TO DO: check that the class name is valid !
|
|
||||||
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'selectObj'));
|
|
||||||
}
|
|
||||||
$aSelectedObj = explode(',', $sSelectedObj);
|
|
||||||
$sCancelUrl = "./UI.php?operation=search&filter=".urlencode($sFilter).$oAppContext->GetForLink(true);
|
|
||||||
$aContext = [
|
|
||||||
'filter' => utils::EscapeHtml($sFilter),
|
|
||||||
'selectObj' => $sSelectedObj,
|
|
||||||
];
|
|
||||||
cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,64 +9,63 @@ use Combodo\iTop\Application\WebPage\WebPage;
|
|||||||
|
|
||||||
class UI
|
class UI
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
/**
|
* Operation select_for_modify_all
|
||||||
* Operation select_for_modify_all
|
*
|
||||||
*
|
* @param iTopWebPage $oP
|
||||||
* @param iTopWebPage $oP
|
*
|
||||||
*
|
* @throws \ApplicationException
|
||||||
* @throws \ApplicationException
|
* @throws \ArchivedObjectException
|
||||||
* @throws \ArchivedObjectException
|
* @throws \CoreException
|
||||||
* @throws \CoreException
|
* @throws \OQLException
|
||||||
* @throws \OQLException
|
*/
|
||||||
*/
|
|
||||||
public static function OperationSelectForModifyAll(iTopWebPage $oP, $sTitleTab = 'UI:ModifyAllPageTitle', $sTitleCode = 'UI:Modify_ObjectsOf_Class', $sNextOperation = 'form_for_modify_all'): void
|
public static function OperationSelectForModifyAll(iTopWebPage $oP, $sTitleTab = 'UI:ModifyAllPageTitle', $sTitleCode = 'UI:Modify_ObjectsOf_Class', $sNextOperation = 'form_for_modify_all'): void
|
||||||
{
|
{
|
||||||
$oP->DisableBreadCrumb();
|
$oP->DisableBreadCrumb();
|
||||||
$oP->set_title(Dict::S($sTitleTab));
|
$oP->set_title(Dict::S($sTitleTab));
|
||||||
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
if (empty($sFilter)) {
|
if (empty($sFilter)) {
|
||||||
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'filter'));
|
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'filter'));
|
||||||
}
|
}
|
||||||
$oFilter = DBObjectSearch::unserialize($sFilter); //TODO : check that the filter is valid
|
$oFilter = DBObjectSearch::unserialize($sFilter); //TODO : check that the filter is valid
|
||||||
// Add user filter
|
// Add user filter
|
||||||
$oFilter->UpdateContextFromUser();
|
$oFilter->UpdateContextFromUser();
|
||||||
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_MODIFY);
|
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_MODIFY);
|
||||||
$sClass = $oFilter->GetClass();
|
$sClass = $oFilter->GetClass();
|
||||||
$sClassName = MetaModel::GetName($sClass);
|
$sClassName = MetaModel::GetName($sClass);
|
||||||
|
|
||||||
$aDisplayParams = [
|
$aDisplayParams = [
|
||||||
'icon' => MetaModel::GetClassIcon($sClass, false),
|
'icon' => MetaModel::GetClassIcon($sClass, false),
|
||||||
'title' => Dict::Format($sTitleCode, $sClassName),
|
'title' => Dict::Format($sTitleCode, $sClassName),
|
||||||
];
|
];
|
||||||
self::DisplayMultipleSelectionForm($oP, $oFilter, $sNextOperation, $oChecker, [], $aDisplayParams);
|
self::DisplayMultipleSelectionForm($oP, $oFilter, $sNextOperation, $oChecker, [], $aDisplayParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operation form_for_modify_all
|
* Operation form_for_modify_all
|
||||||
*
|
*
|
||||||
* @param iTopWebPage $oP
|
* @param iTopWebPage $oP
|
||||||
* @param \ApplicationContext $oAppContext
|
* @param \ApplicationContext $oAppContext
|
||||||
*
|
*
|
||||||
* @throws \ArchivedObjectException
|
* @throws \ArchivedObjectException
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \CoreUnexpectedValue
|
* @throws \CoreUnexpectedValue
|
||||||
* @throws \MySQLException
|
* @throws \MySQLException
|
||||||
* @throws \OQLException
|
* @throws \OQLException
|
||||||
*/
|
*/
|
||||||
public static function OperationFormForModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
|
public static function OperationFormForModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
|
||||||
{
|
{
|
||||||
$oP->DisableBreadCrumb();
|
$oP->DisableBreadCrumb();
|
||||||
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||||
$sClass = utils::ReadParam('class', '', false, utils::ENUM_SANITIZATION_FILTER_CLASS);
|
$sClass = utils::ReadParam('class', '', false, utils::ENUM_SANITIZATION_FILTER_CLASS);
|
||||||
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
|
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
|
||||||
// Add user filter
|
// Add user filter
|
||||||
$oFullSetFilter->UpdateContextFromUser();
|
$oFullSetFilter->UpdateContextFromUser();
|
||||||
$aSelectedObj = utils::ReadMultipleSelection($oFullSetFilter);
|
$aSelectedObj = utils::ReadMultipleSelection($oFullSetFilter);
|
||||||
$sCancelUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&filter=' . urlencode($sFilter) . '&' . $oAppContext->GetForLink();
|
$sCancelUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&filter=' . urlencode($sFilter) . '&' . $oAppContext->GetForLink();
|
||||||
$aContext = array('filter' => utils::EscapeHtml($sFilter));
|
$aContext = array('filter' => utils::EscapeHtml($sFilter));
|
||||||
cmdbAbstractObject::DisplayBulkModifyForm($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $sCancelUrl, array(), $aContext);
|
cmdbAbstractObject::DisplayBulkModifyForm($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $sCancelUrl, array(), $aContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Operation preview_or_modify_all
|
* Operation preview_or_modify_all
|
||||||
@@ -104,64 +103,64 @@ class UI
|
|||||||
);
|
);
|
||||||
cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext);
|
cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext);
|
||||||
}/**
|
}/**
|
||||||
* Displays a form (checkboxes) to select the objects for which to apply a given action
|
* Displays a form (checkboxes) to select the objects for which to apply a given action
|
||||||
* Only the objects for which the action is valid can be checked. By default all valid objects are checked
|
* Only the objects for which the action is valid can be checked. By default all valid objects are checked
|
||||||
*
|
*
|
||||||
* @param WebPage $oP WebPage The page for output
|
* @param WebPage $oP WebPage The page for output
|
||||||
* @param \DBSearch $oFilter DBSearch The filter that defines the list of objects
|
* @param \DBSearch $oFilter DBSearch The filter that defines the list of objects
|
||||||
* @param string $sNextOperation string The next operation (code) to be executed when the form is submitted
|
* @param string $sNextOperation string The next operation (code) to be executed when the form is submitted
|
||||||
* @param ActionChecker $oChecker ActionChecker The helper class/instance used to check for which object the action is valid
|
* @param ActionChecker $oChecker ActionChecker The helper class/instance used to check for which object the action is valid
|
||||||
* @param array $aExtraFormParams
|
* @param array $aExtraFormParams
|
||||||
* @param array $aDisplayParams
|
* @param array $aDisplayParams
|
||||||
*
|
*
|
||||||
* @throws \ApplicationException
|
* @throws \ApplicationException
|
||||||
* @throws \ArchivedObjectException
|
* @throws \ArchivedObjectException
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
*@since 3.0.0 $aDisplayParams parameter
|
*@since 3.0.0 $aDisplayParams parameter
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static function DisplayMultipleSelectionForm(WebPage $oP, DBSearch $oFilter, string $sNextOperation, ActionChecker $oChecker, array $aExtraFormParams = [], array $aDisplayParams = [])
|
public static function DisplayMultipleSelectionForm(WebPage $oP, DBSearch $oFilter, string $sNextOperation, ActionChecker $oChecker, array $aExtraFormParams = [], array $aDisplayParams = [])
|
||||||
{
|
{
|
||||||
$oAppContext = new ApplicationContext();
|
$oAppContext = new ApplicationContext();
|
||||||
$iBulkActionAllowed = $oChecker->IsAllowed();
|
$iBulkActionAllowed = $oChecker->IsAllowed();
|
||||||
$aExtraParams = array('selection_type' => 'multiple', 'selection_mode' => true, 'display_limit' => false, 'menu' => false);
|
$aExtraParams = ['selection_type' => 'multiple', 'selection_mode' => true, 'display_limit' => false, 'menu' => false];
|
||||||
if ($iBulkActionAllowed == UR_ALLOWED_DEPENDS) {
|
if ($iBulkActionAllowed == UR_ALLOWED_DEPENDS) {
|
||||||
$aExtraParams['selection_enabled'] = $oChecker->GetAllowedIDs();
|
$aExtraParams['selection_enabled'] = $oChecker->GetAllowedIDs();
|
||||||
} else {
|
} else {
|
||||||
if (UR_ALLOWED_NO) {
|
if (UR_ALLOWED_NO) {
|
||||||
throw new ApplicationException(Dict::Format('UI:ActionNotAllowed'));
|
throw new ApplicationException(Dict::Format('UI:ActionNotAllowed'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$oForm = new Form();
|
$oForm = new Form();
|
||||||
$oForm->SetAction( utils::GetAbsoluteUrlAppRoot().'pages/UI.php');
|
$oForm->SetAction( utils::GetAbsoluteUrlAppRoot().'pages/UI.php');
|
||||||
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('operation', $sNextOperation));
|
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('operation', $sNextOperation));
|
||||||
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('class', $oFilter->GetClass()));
|
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('class', $oFilter->GetClass()));
|
||||||
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('filter', utils::HtmlEntities($oFilter->Serialize())));
|
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('filter', utils::HtmlEntities($oFilter->Serialize())));
|
||||||
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('transaction_id', utils::GetNewTransactionId()));
|
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('transaction_id', utils::GetNewTransactionId()));
|
||||||
foreach ($aExtraFormParams as $sName => $sValue) {
|
foreach ($aExtraFormParams as $sName => $sValue) {
|
||||||
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden($sName, $sValue));
|
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden($sName, $sValue));
|
||||||
}
|
|
||||||
$oForm->AddSubBlock($oAppContext->GetForFormBlock());
|
|
||||||
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
|
|
||||||
//by default all the elements are selected
|
|
||||||
$aExtraParams['selectionMode'] = 'negative';
|
|
||||||
if (array_key_exists('icon', $aDisplayParams) || array_key_exists('title', $aDisplayParams)) {
|
|
||||||
$aExtraParams['surround_with_panel'] = true;
|
|
||||||
if (array_key_exists('icon', $aDisplayParams)) {
|
|
||||||
$aExtraParams['panel_icon'] = $aDisplayParams['icon'];
|
|
||||||
}
|
}
|
||||||
if (array_key_exists('title', $aDisplayParams)) {
|
$oForm->AddSubBlock($oAppContext->GetForFormBlock());
|
||||||
$aExtraParams['panel_title'] = $aDisplayParams['title'];
|
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
|
||||||
|
//by default all the elements are selected
|
||||||
|
$aExtraParams['selectionMode'] = 'negative';
|
||||||
|
if (array_key_exists('icon', $aDisplayParams) || array_key_exists('title', $aDisplayParams)) {
|
||||||
|
$aExtraParams['surround_with_panel'] = true;
|
||||||
|
if (array_key_exists('icon', $aDisplayParams)) {
|
||||||
|
$aExtraParams['panel_icon'] = $aDisplayParams['icon'];
|
||||||
|
}
|
||||||
|
if (array_key_exists('title', $aDisplayParams)) {
|
||||||
|
$aExtraParams['panel_title'] = $aDisplayParams['title'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
$oForm->AddSubBlock($oDisplayBlock->GetDisplay($oP, 1, $aExtraParams));
|
||||||
$oForm->AddSubBlock($oDisplayBlock->GetDisplay($oP, 1, $aExtraParams));
|
$oToolbarButtons = ToolbarUIBlockFactory::MakeStandard(null);
|
||||||
$oToolbarButtons = ToolbarUIBlockFactory::MakeStandard(null);
|
$oToolbarButtons->AddCSSClass('ibo-toolbar--button');
|
||||||
$oToolbarButtons->AddCSSClass('ibo-toolbar--button');
|
$oForm->AddSubBlock($oToolbarButtons);
|
||||||
$oForm->AddSubBlock($oToolbarButtons);
|
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel'), 'cancel')->SetOnClickJsCode('window.history.back()'));
|
||||||
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel'), 'cancel')->SetOnClickJsCode('window.history.back()'));
|
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Next'), 'next', Dict::S('UI:Button:Next'), true));
|
||||||
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Next'), 'next', Dict::S('UI:Button:Next'), true));
|
|
||||||
|
|
||||||
$oP->AddUiBlock($oForm);
|
$oP->AddUiBlock($oForm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,4 +114,8 @@ class AttributeObjectKey extends AttributeDBFieldVoid
|
|||||||
|
|
||||||
return (int)$proposedValue;
|
return (int)$proposedValue;
|
||||||
}
|
}
|
||||||
|
public function GetTargetClass($iType = EXTKEY_RELATIVE)
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,16 +65,8 @@ try {
|
|||||||
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'oql'));
|
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'oql'));
|
||||||
}
|
}
|
||||||
$oFilter = DBObjectSearch::FromOQL($sOQL);
|
$oFilter = DBObjectSearch::FromOQL($sOQL);
|
||||||
$oBlock1 = new DisplayBlock($oFilter, 'search', false, ['menu' => false, 'table_id' => '1']);
|
$oBlock1 = new DisplayBlock($oFilter, 'search', false, ['menu' => true, 'table_id' => '1']);
|
||||||
$oBlock1->Display($oP, 0);
|
$oBlock1->Display($oP, 0);
|
||||||
$oP->add('<p class="page-header">'.MetaModel::GetClassIcon('SynchroReplica').Dict::S('Core:SynchroReplica:ListOfReplicas').'</p>');
|
|
||||||
$iSourceId = utils::ReadParam('datasource', null);
|
|
||||||
if ($iSourceId != null) {
|
|
||||||
$oSource = MetaModel::GetObject('SynchroDataSource', $iSourceId);
|
|
||||||
$oP->p(Dict::Format('Core:SynchroReplica:BackToDataSource', $oSource->GetHyperlink()).'</a>');
|
|
||||||
}
|
|
||||||
$oBlock = new DisplayBlock($oFilter, 'list', false, ['menu' => false]);
|
|
||||||
$oBlock->Display($oP, 1);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'delete':
|
case 'delete':
|
||||||
|
|||||||
Reference in New Issue
Block a user