From 7ea9d0d8d94fe2b8844171d6678486995658ae13 Mon Sep 17 00:00:00 2001 From: Inbal Vasserman <> Date: Tue, 4 Aug 2026 10:44:04 +0300 Subject: [PATCH 1/5] feat(SUP-52187): UI conf restoration from admin console --- .../controllers/WidgetController.php | 17 +++- admin_console/views/scripts/widget/list.phtml | 62 ++++++++++--- .../service.adminconsole.uiconfadmin.ini | 17 +++- .../lib/api/KalturaUiConfAdmin.php | 14 ++- .../services/UiConfAdminService.php | 90 ++++++++++++++++--- release-notes.md | 7 ++ 6 files changed, 173 insertions(+), 34 deletions(-) diff --git a/admin_console/controllers/WidgetController.php b/admin_console/controllers/WidgetController.php index f094fe88148..80e85f8263f 100644 --- a/admin_console/controllers/WidgetController.php +++ b/admin_console/controllers/WidgetController.php @@ -187,11 +187,24 @@ public function duplicateAction() $id = $request->getParam('id'); $client = Infra_ClientHelper::getClient(); $adminConsolePlugin = Kaltura_Client_AdminConsole_Plugin::get($client); - + $uiConf = $adminConsolePlugin->uiConfAdmin->get($id); $uiConf->id = null; $uiConf = $adminConsolePlugin->uiConfAdmin->add($uiConf); - + + echo $this->_helper->json('ok', false); + } + + public function restoreAction() + { + $this->_helper->viewRenderer->setNoRender(); + $request = $this->getRequest(); + $id = $request->getParam('id'); + $client = Infra_ClientHelper::getClient(); + $adminConsolePlugin = Kaltura_Client_AdminConsole_Plugin::get($client); + + $adminConsolePlugin->uiConfAdmin->restore($id); + echo $this->_helper->json('ok', false); } diff --git a/admin_console/views/scripts/widget/list.phtml b/admin_console/views/scripts/widget/list.phtml index 1e720031699..4075d84e514 100644 --- a/admin_console/views/scripts/widget/list.phtml +++ b/admin_console/views/scripts/widget/list.phtml @@ -50,15 +50,21 @@ @@ -75,12 +81,20 @@ jQuery('#filter_type').change(function() if(this.value == "by-uiconf-type") { $("#filter_text").css("display","none"); - $("#filter_obj_type_input").css("display","inline"); - } + $("#filter_obj_type_input").css("display","inline"); + $("#filter_status_input").css("display","none"); + } + else if(this.value == "by-status") + { + $("#filter_text").css("display","none"); + $("#filter_obj_type_input").css("display","none"); + $("#filter_status_input").css("display","inline"); + } else - { + { $("#filter_text").css("display","inline"); - $("#filter_obj_type_input").css("display","none"); + $("#filter_obj_type_input").css("display","none"); + $("#filter_status_input").css("display","none"); } }); @@ -191,6 +205,28 @@ function deleteWidget(id) { } } +function restoreWidget(id) { + var ok = confirm('translate('are you sure restore uiconf?'); ?>'); + + if (ok) { + var url = 'url(array('controller' => 'widget', 'action' => 'restore', 'id' => '')); ?>' + id; + + jQuery.ajax({ + url: url, + dataType: 'json', + success: function(result) { + if (result != 'ok') + return this.error(); + alert('translate('uiconf was restored');?>'); + jQuery('#frmPaginator1').submit(); + }, + error: function() { + alert('translate('uiconf was not restored');?>'); + } + }); + } +} + function duplicateWidget(id) { var url = 'url(array('controller' => 'widget', 'action' => 'duplicate', 'id' => '')); ?>' + id; diff --git a/deployment/permissions/service.adminconsole.uiconfadmin.ini b/deployment/permissions/service.adminconsole.uiconfadmin.ini index fa2935e8b36..1c7efeadfe5 100644 --- a/deployment/permissions/service.adminconsole.uiconfadmin.ini +++ b/deployment/permissions/service.adminconsole.uiconfadmin.ini @@ -38,9 +38,18 @@ permissionItem4.permissions = SYSTEM_ADMIN_WIDGET permissionItem5.service = adminconsole_uiconfadmin permissionItem5.action = delete permissionItem5.partnerId = -2 -permissionItem5.param3 = -permissionItem5.param4 = -permissionItem5.param5 = -permissionItem5.tags = +permissionItem5.param3 = +permissionItem5.param4 = +permissionItem5.param5 = +permissionItem5.tags = permissionItem5.permissions = SYSTEM_ADMIN_WIDGET +permissionItem6.service = adminconsole_uiconfadmin +permissionItem6.action = restore +permissionItem6.partnerId = -2 +permissionItem6.param3 = +permissionItem6.param4 = +permissionItem6.param5 = +permissionItem6.tags = +permissionItem6.permissions = SYSTEM_ADMIN_WIDGET + diff --git a/plugins/admin_console/lib/api/KalturaUiConfAdmin.php b/plugins/admin_console/lib/api/KalturaUiConfAdmin.php index afda80522ce..deaf465b6e5 100644 --- a/plugins/admin_console/lib/api/KalturaUiConfAdmin.php +++ b/plugins/admin_console/lib/api/KalturaUiConfAdmin.php @@ -9,7 +9,13 @@ class KalturaUiConfAdmin extends KalturaUiConf * @var bool */ public $isPublic; - + + /** + * @var int + * @readonly + */ + public $status; + public function doFromObject($source_object, KalturaDetachedResponseProfile $responseProfile = null) { if ($source_object instanceof uiConf) @@ -18,8 +24,10 @@ public function doFromObject($source_object, KalturaDetachedResponseProfile $res $this->isPublic = true; else $this->isPublic = false; + + $this->status = $source_object->getStatus(); } - + return parent::doFromObject($source_object, $responseProfile); } @@ -34,4 +42,4 @@ public function toObject($object_to_fill = null, $props_to_skip = array()) } return parent::toObject($object_to_fill, $props_to_skip); } -} \ No newline at end of file +} diff --git a/plugins/admin_console/services/UiConfAdminService.php b/plugins/admin_console/services/UiConfAdminService.php index 9d76c2a15fd..43c434a728e 100644 --- a/plugins/admin_console/services/UiConfAdminService.php +++ b/plugins/admin_console/services/UiConfAdminService.php @@ -116,37 +116,103 @@ function deleteAction($id) } /** - * Retrieve a list of available UIConfs with no partner limitation - * + * Restore a deleted UIConf and its file syncs + * + * @action restore + * @param int $id + * @return KalturaUiConfAdmin + * + * @throws APIErrors::INVALID_UI_CONF_ID + */ + function restoreAction($id) + { + uiConfPeer::setUseCriteriaFilter(false); + $dbUiConf = uiConfPeer::retrieveByPK($id); + uiConfPeer::setUseCriteriaFilter(true); + + if (!$dbUiConf) + throw new KalturaAPIException(APIErrors::INVALID_UI_CONF_ID, $id); + + $fileSyncSubTypes = array( + uiConf::FILE_SYNC_UICONF_SUB_TYPE_DATA, + uiConf::FILE_SYNC_UICONF_SUB_TYPE_CONFIG, + uiConf::FILE_SYNC_UICONF_SUB_TYPE_FEATURES, + ); + + $fileSyncs = array(); + FileSyncPeer::setUseCriteriaFilter(false); + foreach ($fileSyncSubTypes as $subType) + { + $fileSync = kFileSyncUtils::getLocalFileSyncForKey($dbUiConf->getSyncKey($subType), false); + if ($fileSync) + $fileSyncs[] = $fileSync; + } + FileSyncPeer::setUseCriteriaFilter(true); + + foreach ($fileSyncs as $fileSync) + { + if (method_exists($fileSync, 'setDeletedId')) + $fileSync->setDeletedId(0); + $fileSync->setStatus(FileSync::FILE_SYNC_STATUS_READY); + $fileSync->save(); + } + + $dbUiConf->setStatus(uiConf::UI_CONF_STATUS_READY); + $dbUiConf->save(); + + $uiConf = new KalturaUiConfAdmin(); + $uiConf->fromObject($dbUiConf, $this->getResponseProfile()); + + return $uiConf; + } + + /** + * Retrieve a list of available UIConfs with no partner limitation. + * If the request comes from an admin console client, deleted UIConfs are included as well. + * * @action list * @param KalturaUiConfFilter $filter * @param KalturaFilterPager $pager * @return KalturaUiConfAdminListResponse - */ - function listAction( KalturaUiConfFilter $filter = null , KalturaFilterPager $pager = null) + */ + function listAction(KalturaUiConfFilter $filter = null, KalturaFilterPager $pager = null) + { + $clientTag = kCurrentContext::$client_lang ? strtolower(kCurrentContext::$client_lang) : ''; + $includeDeleted = strpos($clientTag, 'admin') !== false; + return $this->doList($filter, $pager, $includeDeleted); + } + + private function doList(KalturaUiConfFilter $filter = null, KalturaFilterPager $pager = null, $includeDeleted = false) { myDbHelper::$use_alternative_con = myDbHelper::DB_HELPER_CONN_PROPEL2; - + if (!$filter) $filter = new KalturaUiConfFilter(); - + $uiConfFilter = new uiConfFilter(); $filter->toObject($uiConfFilter); - + $c = new Criteria(); $uiConfFilter->attachToCriteria($c); + + if ($includeDeleted) + uiConfPeer::setUseCriteriaFilter(false); + $count = uiConfPeer::doCount($c); - if (! $pager) - $pager = new KalturaFilterPager (); + if (!$pager) + $pager = new KalturaFilterPager(); $pager->attachToCriteria($c); $list = uiConfPeer::doSelect($c); - + + if ($includeDeleted) + uiConfPeer::setUseCriteriaFilter(true); + $newList = KalturaUiConfAdminArray::fromDbArray($list, $this->getResponseProfile()); - + $response = new KalturaUiConfAdminListResponse(); $response->objects = $newList; $response->totalCount = $count; - + return $response; } } diff --git a/release-notes.md b/release-notes.md index a87e022dd0e..fabac6aa6a8 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,3 +1,10 @@ +# West-23.5.0 +## Add permissions for uiConfAdmin restore +- Issue Type: Task +- Issue ID: SUP-52187 +### Deployment Scripts ### + php deployment/updates/scripts/add_permissions/2026_08_03_adminconsole_uiconfadmin_restore_permission.php + # West-23.4.0 ## Disallowed from-email domain enforcement with fallback ## - Issue Type: Task From bd8f7b082faa6f9ad308bf00e36302464c98aa96 Mon Sep 17 00:00:00 2001 From: Inbal Vasserman <> Date: Tue, 4 Aug 2026 11:06:11 +0300 Subject: [PATCH 2/5] remove unused code --- admin_console/views/scripts/widget/list.phtml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/admin_console/views/scripts/widget/list.phtml b/admin_console/views/scripts/widget/list.phtml index 4075d84e514..02ffc360d24 100644 --- a/admin_console/views/scripts/widget/list.phtml +++ b/admin_console/views/scripts/widget/list.phtml @@ -82,19 +82,11 @@ jQuery('#filter_type').change(function() { $("#filter_text").css("display","none"); $("#filter_obj_type_input").css("display","inline"); - $("#filter_status_input").css("display","none"); - } - else if(this.value == "by-status") - { - $("#filter_text").css("display","none"); - $("#filter_obj_type_input").css("display","none"); - $("#filter_status_input").css("display","inline"); } else { $("#filter_text").css("display","inline"); $("#filter_obj_type_input").css("display","none"); - $("#filter_status_input").css("display","none"); } }); From 641f0d89054a891f854c8a491ce3e21e1d9a1a9f Mon Sep 17 00:00:00 2001 From: Inbal Vasserman <> Date: Thu, 6 Aug 2026 14:41:56 +0300 Subject: [PATCH 3/5] add permission checks --- admin_console/views/scripts/widget/list.phtml | 4 ++-- .../lib/errors/KalturaAdminConsoleErrors.php | 2 ++ .../admin_console/services/UiConfAdminService.php | 14 +++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/admin_console/views/scripts/widget/list.phtml b/admin_console/views/scripts/widget/list.phtml index 02ffc360d24..7d983ae0a67 100644 --- a/admin_console/views/scripts/widget/list.phtml +++ b/admin_console/views/scripts/widget/list.phtml @@ -50,8 +50,8 @@ - status == 3 /* uiConf::UI_CONF_STATUS_DELETED */): ?> + status == Kaltura_Client_Enum_UiConfStatus::DELETED): ?> diff --git a/plugins/admin_console/services/UiConfAdminService.php b/plugins/admin_console/services/UiConfAdminService.php index ef5b1e2a1a9..2899a299c50 100644 --- a/plugins/admin_console/services/UiConfAdminService.php +++ b/plugins/admin_console/services/UiConfAdminService.php @@ -155,6 +155,9 @@ function restoreAction($id) } FileSyncPeer::setUseCriteriaFilter(true); + if (empty($fileSyncs)) + throw new KalturaAPIException(KalturaAdminConsoleErrors::UI_CONF_FILE_SYNC_MISSING, $id, ''); + foreach ($fileSyncs as $fileSync) { if (!file_exists($fileSync->getFullPath())) From f6e9fa7e06f64e36d9931f002269c6d2349c0e03 Mon Sep 17 00:00:00 2001 From: Inbal Vasserman <> Date: Sun, 9 Aug 2026 12:44:11 +0300 Subject: [PATCH 5/5] fix UiConfStatus constant placement Move UI_CONF_STATUS_DELETED constant to WidgetController (hand-maintained, tracked file) and remove UiConfStatus.php from the auto-generated client library directory Co-Authored-By: Claude Sonnet 4.6 --- .../controllers/WidgetController.php | 1 + .../lib/Kaltura/Client/Enum/UiConfStatus.php | 39 ------------------- admin_console/views/scripts/widget/list.phtml | 2 +- 3 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 admin_console/lib/Kaltura/Client/Enum/UiConfStatus.php diff --git a/admin_console/controllers/WidgetController.php b/admin_console/controllers/WidgetController.php index 80e85f8263f..261f642cb61 100644 --- a/admin_console/controllers/WidgetController.php +++ b/admin_console/controllers/WidgetController.php @@ -6,6 +6,7 @@ class WidgetController extends Zend_Controller_Action { const HTML5_URL = 'html5_url'; + const UI_CONF_STATUS_DELETED = 3; public function listAction() { $request = $this->getRequest(); diff --git a/admin_console/lib/Kaltura/Client/Enum/UiConfStatus.php b/admin_console/lib/Kaltura/Client/Enum/UiConfStatus.php deleted file mode 100644 index 93b724a2823..00000000000 --- a/admin_console/lib/Kaltura/Client/Enum/UiConfStatus.php +++ /dev/null @@ -1,39 +0,0 @@ -. -// -// @ignore -// =================================================================================================== - -/** - * @package Admin - * @subpackage Client - */ -class Kaltura_Client_Enum_UiConfStatus extends Kaltura_Client_EnumBase -{ - const PENDING = 1; - const READY = 2; - const DELETED = 3; -} diff --git a/admin_console/views/scripts/widget/list.phtml b/admin_console/views/scripts/widget/list.phtml index d7848286624..bd2a7677df5 100644 --- a/admin_console/views/scripts/widget/list.phtml +++ b/admin_console/views/scripts/widget/list.phtml @@ -50,7 +50,7 @@