/**
  * @covers ::build
  */
 public function testBuild()
 {
     $regions = array();
     $block = $this->prophesize(BlockPluginInterface::class);
     $block->access(Argument::type(AccountInterface::class))->willReturn(TRUE);
     $block->getConfiguration()->willReturn([]);
     $block->getPluginId()->willReturn('foo');
     $block->getBaseId()->willReturn('foo');
     $block->getDerivativeId()->willReturn('foo');
     $block->build()->willReturn(['#markup' => 'Foo!']);
     $regions['content']['foo'] = $block->reveal();
     $block = $this->prophesize(BlockPluginInterface::class);
     $block->access(Argument::type(AccountInterface::class))->willReturn(TRUE);
     $block->getConfiguration()->willReturn([]);
     $block->getPluginId()->willReturn('bar');
     $block->getBaseId()->willReturn('bar');
     $block->getDerivativeId()->willReturn('bar');
     $block->build()->willReturn(['#markup' => 'Bar...']);
     $regions['sidebar']['bar'] = $block->reveal();
     $block = $this->prophesize(BlockPluginInterface::class);
     $block->access(Argument::type(AccountInterface::class))->willReturn(FALSE);
     $regions['sidebar']['baz'] = $block->reveal();
     $regions['footer'] = array();
     $build = $this->builder->build($regions, array());
     // Ensure that regions get the proper prefix and suffix.
     $this->assertEquals('<div class="block-region-content">', $build['content']['#prefix']);
     $this->assertEquals('</div>', $build['content']['#suffix']);
     // Ensure that blocks which allowed access showed up...
     $this->assertEquals('Foo!', $build['content']['foo']['content']['#markup']);
     $this->assertEquals('Bar...', $build['sidebar']['bar']['content']['#markup']);
     // ...and that blocks which disallowed access did not.
     $this->assertArrayNotHasKey('baz', $build['sidebar']);
     // Ensure that empty regions don't show up in $build.
     $this->assertArrayNotHasKey('footer', $build);
 }
 /**
  * {@inheritdoc}
  */
 public function build(PanelsDisplayVariant $panels_display)
 {
     // Check to see if the current user has permissions to use the IPE.
     $has_permission = $this->account->hasPermission('access panels in-place editing');
     // Attach the Panels In-place editor library based on permissions.
     if ($has_permission) {
         // This flag tracks whether or not there are unsaved changes.
         $unsaved = FALSE;
         // If a temporary configuration for this variant exists, use it.
         $temp_store_key = $panels_display->id();
         if ($variant_config = $this->tempStore->get($temp_store_key)) {
             unset($variant_config['id']);
             $panels_display->setConfiguration($variant_config);
             // Indicate that the user is viewing un-saved changes.
             $unsaved = TRUE;
         }
         $build = parent::build($panels_display);
         $regions = $panels_display->getRegionAssignments();
         $layout = $panels_display->getLayout();
         foreach ($regions as $region => $blocks) {
             // Wrap each region with a unique class and data attribute.
             $region_name = Html::getClass("block-region-{$region}");
             $build[$region]['#prefix'] = '<div class="' . $region_name . '" data-region-name="' . $region . '">';
             $build[$region]['#suffix'] = '</div>';
             if ($blocks) {
                 foreach ($blocks as $block_id => $block) {
                     $build[$region][$block_id]['#attributes']['data-block-id'] = $block_id;
                 }
             }
         }
         // Attach the required settings and IPE.
         $build['#attached']['library'][] = 'panels_ipe/panels_ipe';
         $build['#attached']['drupalSettings']['panels_ipe'] = $this->getDrupalSettings($regions, $layout, $panels_display, $unsaved);
         // Add our custom elements to the build.
         $build['#prefix'] = '<div id="panels-ipe-content">';
         $build['#suffix'] = '</div><div id="panels-ipe-tray"></div>';
     } else {
         $build = parent::build($panels_display);
     }
     return $build;
 }
 /**
  * {@inheritdoc}
  */
 public function build(array $regions, array $contexts, LayoutInterface $layout = NULL)
 {
     // Load our PageVariant.
     /** @var \Drupal\page_manager\PageVariantInterface $page_variant */
     $page_variant = \Drupal::request()->attributes->get('page_manager_page_variant');
     // Check to see if the current user has permissions to use the IPE.
     $has_permission = $this->account->hasPermission('access panels in-place editing');
     // Attach the Panels In-place editor library based on permissions.
     if ($page_variant && $has_permission) {
         // This flag tracks whether or not there are unsaved changes.
         $unsaved = FALSE;
         // If a temporary configuration for this variant exists, use it.
         $temp_store_key = 'variant.' . $page_variant->id();
         if ($variant_config = $this->tempStore->get($temp_store_key)) {
             // Reload the PageVariant. This is required to set variant plugin
             // configuration correctly.
             $page_variant = PageVariant::load($page_variant->id());
             /** @var \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $variant_plugin */
             $variant_plugin = $page_variant->getVariantPlugin();
             $variant_plugin->setConfiguration($variant_config);
             // Override our initial values with what's in TempStore.
             $layout = $variant_plugin->getLayout();
             $regions = $variant_plugin->getRegionAssignments();
             // Indicate that the user is viewing un-saved changes.
             $unsaved = TRUE;
         }
         $build = parent::build($regions, $contexts, $layout);
         foreach ($regions as $region => $blocks) {
             // Wrap each region with a unique class and data attribute.
             $region_name = Html::getClass("block-region-{$region}");
             $build[$region]['#prefix'] = '<div class="' . $region_name . '" data-region-name="' . $region . '">';
             $build[$region]['#suffix'] = '</div>';
             if ($blocks) {
                 foreach ($blocks as $block_id => $block) {
                     $build[$region][$block_id]['#attributes']['data-block-id'] = $block_id;
                 }
             }
         }
         // Attach the required settings and IPE.
         $build['#attached']['library'][] = 'panels_ipe/panels_ipe';
         $build['#attached']['drupalSettings']['panels_ipe'] = $this->getDrupalSettings($regions, $layout, $page_variant);
         // Add our custom elements to the build.
         $build['#prefix'] = '<div id="panels-ipe-content">';
         // Indicate if the current user is viewing temp store.
         $tray_classes = $unsaved ? 'unsaved' : '';
         $build['#suffix'] = '</div><div id="panels-ipe-tray" class="' . $tray_classes . '"></div>';
     } else {
         $build = parent::build($regions, $contexts, $layout);
     }
     return $build;
 }