public function testSaveAndRetrievePortlet() { $user = UserTestHelper::createBasicUser('Billy'); $contracts = Contract::getByName('superOpp'); $portlet = new Portlet(); $portlet->column = 2; $portlet->position = 5; $portlet->layoutId = 'Test'; $portlet->collapsed = true; $portlet->viewType = 'ContractsForContactRelatedList'; $portlet->serializedViewData = serialize(array('title' => 'Testing Title')); $portlet->user = $user; $this->assertTrue($portlet->save()); $portlet = Portlet::getById($portlet->id); $params = array('controllerId' => 'test', 'relationModuleId' => 'test', 'relationModel' => $contracts[0], 'redirectUrl' => 'someRedirect'); $portlet->params = $params; $unserializedViewData = unserialize($portlet->serializedViewData); $this->assertEquals(2, $portlet->column); $this->assertEquals(5, $portlet->position); $this->assertEquals('Testing Title', $portlet->getTitle()); $this->assertEquals(false, $portlet->isEditable()); $this->assertEquals('Test', $portlet->layoutId); //$this->assertEquals(true, $portlet->collapsed); //reenable once working $this->assertEquals('ContractsForContactRelatedList', $portlet->viewType); $this->assertEquals($user->id, $portlet->user->id); $view = $portlet->getView(); }
/** * Called using Ajax. */ public function actionModalConfigSave($portletId, $uniqueLayoutId, array $portletParams = array()) { $portlet = Portlet::getById(intval($portletId)); $this->resolveAddingRelationModelIdToPortletParams($portlet); $configurableView = $portlet->getView()->getConfigurationView(); $portlet->forget(); $configurableView->setMetadataFromPost($_POST[$configurableView->getPostArrayName()]); $this->saveModalConfigPerUserAndRelationModelId($configurableView->getViewMetadata()); $this->actionModalRefresh($portletId, $uniqueLayoutId, null, $portletParams); }
public static function getByLayoutId($layoutId) { $portletCollection = array(); assert('is_string($layoutId)'); $quote = DatabaseCompatibilityUtil::getQuote(); $sql = "select id, {$quote}column{$quote}, position " . 'from portlet ' . "where layoutid = '{$layoutId}'" . 'order by id;'; foreach (R::getAll($sql) as $row) { $portlet = Portlet::getById(intval($row['id'])); $portletCollection[$row['id']] = $portlet; } return $portletCollection; }
public static function getByLayoutIdAndUserSortedById($layoutId, $userId) { $portletCollection = array(); assert('is_integer($userId) && $userId >= 1'); $quote = DatabaseCompatibilityUtil::getQuote(); $sql = "select id, {$quote}column{$quote}, position " . 'from portlet ' . "where layoutid = '{$layoutId}' and _user_id = {$userId} " . 'order by id;'; foreach (R::getAll($sql) as $row) { $portlet = Portlet::getById(intval($row['id'])); $portletCollection[$row['id']] = $portlet; } return $portletCollection; }
public function actionDetails($id, $runReport = false) { $savedReport = SavedReport::getById((int) $id); ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedReport->moduleClassName); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedReport, true); $report = SavedReportToReportAdapter::makeReportBySavedReport($savedReport); $portlet = Portlet::getById(intval($_GET['portletId'])); $portlet->params = array('controllerId' => 'default', 'relationModuleId' => $this->getModule()->getId(), 'relationModel' => $report, 'redirectUrl' => Yii::app()->request->getRequestUri(), 'dataProvider' => $this->getDataProvider($report, $report->getId(), (bool) $runReport)); $portletView = $portlet->getView(); if (!RightsUtil::canUserAccessModule($portletView::getModuleClassName(), Yii::app()->user->userModel)) { $messageView = new AccessFailureView(); $view = new AccessFailurePageView($messageView); echo $view->render(); Yii::app()->end(0, false); } $view = new AjaxPageView($portletView); echo $view->render(); }
protected function getPortletViewForDetails($id) { $id = intval($id); $modelName = $this->getModule()->getPrimaryModelName(); $model = $modelName::getById($id); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($model, true); $portlet = Portlet::getById(intval($_GET['portletId'])); if (null != ($redirectUrl = ArrayUtil::getArrayValue($_GET, 'redirectUrl'))) { $redirectUrl = $redirectUrl; } else { $redirectUrl = Yii::app()->request->getRequestUri(); } $portlet->params = array('controllerId' => 'default', 'relationModuleId' => $this->getModule()->getId(), 'relationModel' => $model, 'redirectUrl' => $redirectUrl); $portletView = $portlet->getView(); return $portletView; }
/** * In a detailview, if you click the 'select' link from a sub view, this action is called. It will bring a modal * search/list view to select a model from. * @param string $portletId * @param string $uniqueLayoutId * @param string $relationAttributeName * @param string $relationModelId * @param string $relationModuleId * @param string $pageTitle */ public function actionSelectFromRelatedList($portletId, $uniqueLayoutId, $relationAttributeName, $relationModelId, $relationModuleId, $stateMetadataAdapterClassName = null) { $portlet = Portlet::getById((int) $portletId); $modalListLinkProvider = new SelectFromRelatedListModalListLinkProvider($relationAttributeName, (int) $relationModelId, $relationModuleId, $portlet->getUniquePortletPageId(), $uniqueLayoutId, (int) $portlet->id, $this->getModule()->getId()); echo ModalSearchListControllerUtil::setAjaxModeAndRenderModalSearchList($this, $modalListLinkProvider, $stateMetadataAdapterClassName); }
/** * Used by my list portlets to process or render actions on the portlet's view. An example is changing the * month of the calendar, requires additional calendar events to be loaded. * @param integer $id */ public function actionMyListViewAction($action) { $portlet = Portlet::getById(intval($_GET['portletId'])); $portletView = $portlet->getView(); if (!RightsUtil::canUserAccessModule($portletView::getModuleClassName(), Yii::app()->user->userModel)) { Yii::app()->end(0, false); } $portletView->{$action}(); }
/** * @depends testSavePortlet */ public function testBooleanSaveValueMatchesBooleanRetrieveValue() { $user = User::getByUserName('billy'); $portlet = new Portlet(); $portlet->column = 1; $portlet->position = 1; $portlet->layoutId = 'Test'; $portlet->collapsed = true; $portlet->viewType = 'RssReader'; $portlet->user = $user; $this->assertTrue($portlet->save()); $portlet = Portlet::getById($portlet->id); $this->assertEquals(1, $portlet->collapsed); }
public function testCanDeleteAccountLatestActivitiesForPortletView() { $this->assertTrue(Portlet::getById(static::$accountLatestActivitiesPortletId)->delete()); }
public function testSuperUserAllDefaultControllerActions() { //Set the current user as the super user. $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super'); //Test all default controller actions that do not require any POST/GET variables to be passed. //This does not include portlet controller actions. $this->runControllerWithNoExceptionsAndGetContent('home/default'); $this->runControllerWithNoExceptionsAndGetContent('home/default/index'); $this->runControllerWithNoExceptionsAndGetContent('home/default/createDashboard'); //Default Controller actions requiring some sort of parameter via POST or GET //Load Model Edit Views $superDashboard = Dashboard::getByLayoutIdAndUser(Dashboard::DEFAULT_USER_LAYOUT_ID, $super); $this->setGetArray(array('id' => $superDashboard->id)); $this->runControllerWithNoExceptionsAndGetContent('home/default/editDashboard'); //Save dashboard. $superDashboard = Dashboard::getByLayoutIdAndUser(Dashboard::DEFAULT_USER_LAYOUT_ID, $super); $this->assertEquals('Dashboard', $superDashboard->name); $this->setPostArray(array('Dashboard' => array('name' => '456765421'))); $this->runControllerWithRedirectExceptionAndGetContent('home/default/editDashboard'); $superDashboard = Dashboard::getByLayoutIdAndUser(Dashboard::DEFAULT_USER_LAYOUT_ID, $super); $this->assertEquals('456765421', $superDashboard->name); //Test having a failed validation on the dashboard during save. $this->setGetArray(array('id' => $superDashboard->id)); $this->setPostArray(array('Dashboard' => array('name' => ''))); $content = $this->runControllerWithNoExceptionsAndGetContent('home/default/editDashboard'); $this->assertContains('Name cannot be blank', $content); //Load Model Detail Views $this->setGetArray(array('id' => -1)); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/default/dashboardDetails'); $this->setGetArray(array('id' => $superDashboard->id)); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/default/dashboardDetails'); //Add second dashboard for use in deletion tests. $secondDashboard = DashboardTestHelper::createDashboardByNameForOwner('Dashboard2', $super); $this->assertTrue($secondDashboard->isDefault == 0); $this->assertFalse($secondDashboard->isDefault === 0); //Just to prove it does not evaluate to this. //Attempt to delete the default dashboard and have it through an exception. $dashboards = Dashboard::getRowsByUserId($super->id); $this->assertEquals(2, count($dashboards)); $this->setGetArray(array('dashboardId' => $superDashboard->id)); $this->resetPostArray(); $this->runControllerWithNotSupportedExceptionAndGetContent('home/default/deleteDashboard'); //Delete dashboard that you can delete. $dashboards = Dashboard::getRowsByUserId($super->id); $this->assertEquals(2, count($dashboards)); $this->setGetArray(array('dashboardId' => $secondDashboard->id)); $this->resetPostArray(); $this->runControllerWithRedirectExceptionAndGetContent('home/default/deleteDashboard'); $dashboards = Dashboard::getRowsByUserId($super->id); $this->assertEquals(1, count($dashboards)); //Add a dashboard via the create dashboard action. $this->assertEquals(1, Dashboard::getCount()); $this->resetGetArray(); $this->setPostArray(array('Dashboard' => array('name' => 'myTestDashboard', 'layoutType' => '50,50'))); // Not Coding Standard $this->runControllerWithRedirectExceptionAndGetContent('home/default/createDashboard'); $dashboards = Dashboard::getAll(); $this->assertEquals(2, count($dashboards)); $this->assertEquals('myTestDashboard', $dashboards[1]->name); $this->assertEquals($super, $dashboards[1]->owner); $this->assertEquals('50,50', $dashboards[1]->layoutType); // Not Coding Standard //Portlet Controller Actions $uniqueLayoutId = 'HomeDashboard' . $superDashboard->layoutId; $this->setGetArray(array('dashboardId' => $superDashboard->id, 'uniqueLayoutId' => $uniqueLayoutId)); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/defaultPortlet/addList'); //Add AccountsMyList Portlet to dashboard $this->setGetArray(array('dashboardId' => $superDashboard->id, 'portletType' => 'AccountsMyList', 'uniqueLayoutId' => $uniqueLayoutId)); $this->resetPostArray(); $this->runControllerWithRedirectExceptionAndGetContent('home/defaultPortlet/add'); //Save a layout change. Collapse all portlets //At this point portlets for this view should be created because we have already loaded the 'details' page in a request above. $portlets = Portlet::getByLayoutIdAndUserSortedByColumnIdAndPosition($uniqueLayoutId, $super->id, array()); $this->assertEquals(4, count($portlets[1])); $this->assertEquals(4, count($portlets[2])); $portletPostData = array(); $portletCount = 0; foreach ($portlets as $column => $columnPortlets) { foreach ($columnPortlets as $position => $portlet) { $this->assertEquals('0', $portlet->collapsed); $portletPostData['HomeDashboard1_' . $portlet->id] = array('collapsed' => 'true', 'column' => 0, 'id' => 'HomeDashboard1_' . $portlet->id, 'position' => $portletCount); $portletCount++; } } //There should have been a total of 3 portlets. Checking positions as 4 will confirm this. $this->assertEquals(8, $portletCount); $this->resetGetArray(); $this->setPostArray(array('portletLayoutConfiguration' => array('portlets' => $portletPostData, 'uniqueLayoutId' => $uniqueLayoutId))); $this->runControllerWithNoExceptionsAndGetContent('home/defaultPortlet/saveLayout', true); //Now test that all the portlets are collapsed. $portlets = Portlet::getByLayoutIdAndUserSortedByColumnIdAndPosition($uniqueLayoutId, $super->id, array()); $this->assertEquals(8, count($portlets[1])); $this->assertFalse(array_key_exists(8, $portlets)); foreach ($portlets as $column => $columns) { foreach ($columns as $position => $positionPortlets) { $this->assertEquals('1', $positionPortlets->collapsed); } } //Load up modal config edit view. $this->assertTrue($portlets[1][5]->id > 0); $this->assertEquals('AccountsMyList', $portlets[1][5]->viewType); $this->setGetArray(array('portletId' => $portlets[1][5]->id, 'uniqueLayoutId' => $uniqueLayoutId)); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/defaultPortlet/modalConfigEdit'); //Now validate the form. $this->setGetArray(array('portletId' => $portlets[1][5]->id, 'uniqueLayoutId' => $uniqueLayoutId)); $this->setPostArray(array('ajax' => 'modal-edit-form', 'AccountsSearchForm' => array())); $this->runControllerWithExitExceptionAndGetContent('home/defaultPortlet/modalConfigEdit'); //save changes to the portlet title $this->setGetArray(array('portletId' => $portlets[1][5]->id, 'uniqueLayoutId' => $uniqueLayoutId)); $this->setPostArray(array('MyListForm' => array('title' => 'something new'), 'AccountsSearchForm' => array())); $this->runControllerWithNoExceptionsAndGetContent('home/defaultPortlet/modalConfigSave'); //Now confirm the title change was successful. $portlet = Portlet::getById($portlets[1][5]->id); $this->assertEquals('something new', $portlet->getView()->getTitle()); //Refresh a portlet modally. $this->setGetArray(array('portletId' => $portlets[1][5]->id, 'uniqueLayoutId' => $uniqueLayoutId, 'redirectUrl' => 'home/default')); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/defaultPortlet/modalRefresh'); //Load Home Dashboard View again to make sure everything is ok after the layout change. $this->resetGetArray(); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/default'); //task sorting issue //check whether tasks portlet render or not $this->assertTrue($portlets[1][3]->id > 0); $this->assertEquals('TasksMyList', $portlets[1][3]->viewType); //to sort task list $this->setGetArray(array('Task_sort' => 'name', 'portletId' => $portlets[1][3]->id, 'uniqueLayoutId' => $uniqueLayoutId)); $this->resetPostArray(); $this->runControllerWithNoExceptionsAndGetContent('home/default'); //to sort task list after portlet has been edited $this->resetGetArray(); $this->setGetArray(array('Task_sort' => 'dueDateTime', 'portletId' => $portlets[1][3]->id, 'uniqueLayoutId' => $uniqueLayoutId, 'ajax' => 'list-view' . $uniqueLayoutId . '_' . $portlets[1][3]->id)); $this->runControllerWithNoExceptionsAndGetContent('home/default'); }
/** * Refresh portlet contents within a dashboard or details relation view. In the case of details relation view * detect if the relationModelId is populated, in which case resolve and populate the relationModel. * Resets controller back to default. * @param string $portletId * @param string $uniqueLayoutId * @param string $redirectUrl * @param array $portletParams - optional argument which allows you to override the standard parameters. * @param bool $portletsAreRemovable */ public function actionModalRefresh($portletId, $uniqueLayoutId, $redirectUrl, array $portletParams = array(), $portletsAreRemovable = true) { $portlet = Portlet::getById(intval($portletId)); $portlet->params = array_merge(array('controllerId' => 'default', 'moduleId' => $this->getModule()->getId(), 'redirectUrl' => $redirectUrl), $portletParams); if (isset($portlet->params['relationModelId']) && $portlet->params['relationModelId'] != '') { assert('$portlet->params["relationModuleId"] != ""'); $modelClassName = Yii::app()->findModule($portlet->params["relationModuleId"])->getPrimaryModelName(); $portlet->params['relationModel'] = $modelClassName::getById((int) $portlet->params['relationModelId']); } $view = new AjaxPageView(new PortletRefreshView($portlet, $uniqueLayoutId, $this->getModule()->getId(), (bool) $portletsAreRemovable)); echo $view->render(); }