' . t('About') . ''; $output .= '
' . t('The Workspace module allows workspaces to be defined and switched between. Content is then assigned to the active workspace when created. For more information, see the online documentation for the Workspace module.', [':workspace' => 'https://www.drupal.org/node/2824024']) . '
'; return $output; } } /** * Implements hook_entity_type_build(). */ function workspace_entity_type_build(array &$entity_types) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityTypeInfo::class) ->entityTypeBuild($entity_types); } /** * Implements hook_form_alter(). */ function workspace_form_alter(&$form, FormStateInterface $form_state, $form_id) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityOperations::class) ->formAlter($form, $form_state, $form_id); } /** * Implements hook_entity_load(). */ function workspace_entity_load(array &$entities, $entity_type_id) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityOperations::class) ->entityLoad($entities, $entity_type_id); } /** * Implements hook_entity_presave(). */ function workspace_entity_presave(EntityInterface $entity) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityOperations::class) ->entityPresave($entity); } /** * Implements hook_entity_insert(). */ function workspace_entity_insert(EntityInterface $entity) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityOperations::class) ->entityInsert($entity); } /** * Implements hook_entity_update(). */ function workspace_entity_update(EntityInterface $entity) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityOperations::class) ->entityUpdate($entity); } /** * Implements hook_entity_access(). * * @see \Drupal\workspace\EntityAccess */ function workspace_entity_access(EntityInterface $entity, $operation, AccountInterface $account) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityAccess::class) ->entityOperationAccess($entity, $operation, $account); } /** * Implements hook_entity_create_access(). * * @see \Drupal\workspace\EntityAccess */ function workspace_entity_create_access(AccountInterface $account, array $context, $entity_bundle) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(EntityAccess::class) ->entityCreateAccess($account, $context, $entity_bundle); } /** * Implements hook_views_query_alter(). */ function workspace_views_query_alter(ViewExecutable $view, QueryPluginBase $query) { return \Drupal::service('class_resolver') ->getInstanceFromDefinition(ViewsQueryAlter::class) ->alterQuery($view, $query); } /** * Implements hook_cron(). */ function workspace_cron() { \Drupal::service('workspace.manager')->purgeDeletedWorkspacesBatch(); } /** * Implements hook_toolbar(). */ function workspace_toolbar() { $items = []; $items['workspace'] = [ '#cache' => [ 'contexts' => [ 'user.permissions', ], ], ]; $current_user = \Drupal::currentUser(); if (!$current_user->hasPermission('administer workspaces') || !$current_user->hasPermission('view own workspace') || !$current_user->hasPermission('view any workspace')) { return $items; } /** @var \Drupal\workspace\WorkspaceInterface $active_workspace */ $active_workspace = \Drupal::service('workspace.manager')->getActiveWorkspace(); $configure_link = NULL; if ($current_user->hasPermission('administer workspaces')) { $configure_link = [ '#type' => 'link', '#title' => t('Manage workspaces'), '#url' => $active_workspace->toUrl('collection'), '#options' => ['attributes' => ['class' => ['manage-workspaces']]], ]; } $items['workspace'] = [ '#type' => 'toolbar_item', 'tab' => [ '#type' => 'link', '#title' => $active_workspace->label(), '#url' => $active_workspace->toUrl('collection'), '#attributes' => [ 'title' => t('Switch workspace'), 'class' => ['toolbar-icon', 'toolbar-icon-workspace'], ], ], 'tray' => [ '#heading' => t('Workspaces'), 'workspaces' => workspace_build_renderable_links(), 'configure' => $configure_link, ], '#wrapper_attributes' => [ 'class' => ['workspace-toolbar-tab'], ], '#attached' => [ 'library' => ['workspace/drupal.workspace.toolbar'], ], '#weight' => 500, ]; // Add a special class to the wrapper if we are in the default workspace so we // can highlight it with a different color. if ($active_workspace->isDefaultWorkspace()) { $items['workspace']['#wrapper_attributes']['class'][] = 'workspace-toolbar-tab--is-default'; } return $items; } /** * Returns an array of workspace activation form links, suitable for rendering. * * @return array * A render array containing links to the workspace activation form. */ function workspace_build_renderable_links() { $entity_type_manager = \Drupal::entityTypeManager(); /** @var \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository */ $entity_repository = \Drupal::service('entity.repository'); /** @var \Drupal\workspace\WorkspaceInterface $active_workspace */ $active_workspace = \Drupal::service('workspace.manager')->getActiveWorkspace(); $links = $cache_tags = []; foreach ($entity_type_manager->getStorage('workspace')->loadMultiple() as $workspace) { $workspace = $entity_repository->getTranslationFromContext($workspace); // Add the 'is-active' class for the currently active workspace. $options = []; if ($workspace->id() === $active_workspace->id()) { $options['attributes']['class'][] = 'is-active'; } // Get the URL of the workspace activation form and display it in a modal. $url = Url::fromRoute('entity.workspace.activate_form', ['workspace' => $workspace->id()], $options); if ($url->access()) { $links[$workspace->id()] = [ 'type' => 'link', 'title' => $workspace->label(), 'url' => $url, 'attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => Json::encode([ 'width' => 500, ]), ], ]; $cache_tags = Cache::mergeTags($cache_tags, $workspace->getCacheTags()); } } if (!empty($links)) { $links = [ '#theme' => 'links__toolbar_workspaces', '#links' => $links, '#attributes' => [ 'class' => ['toolbar-menu'], ], '#cache' => [ 'tags' => $cache_tags, ], ]; } return $links; }