diff --git a/drupalorg/drupalorg.module b/drupalorg/drupalorg.module index 0a1a6b2f6cfbb5ebc4e41dc838a7d58b35990db7..44b8a8c27491d81ba130b6313263d8de2f2a02e3 100644 --- a/drupalorg/drupalorg.module +++ b/drupalorg/drupalorg.module @@ -535,6 +535,14 @@ function drupalorg_menu() { 'file' => 'drupalorg.pages.inc', ]; + $items['drupalorg_toggle_branch_visibility/%/%/%'] = [ + 'page callback' => '_drupalorg_toggle_branch_visibility', + 'page arguments' => [1, 2, 3], + 'access arguments' => ['edit any project_issue content'], + 'type' => MENU_CALLBACK, + 'file' => 'drupalorg.pages.inc', + ]; + return $items; } diff --git a/drupalorg/drupalorg.pages.inc b/drupalorg/drupalorg.pages.inc index 569b38b73faf6759ed6ba5a3aea22e5e20322c25..4723dd0f4858e21951c579b121733387a5e72119 100644 --- a/drupalorg/drupalorg.pages.inc +++ b/drupalorg/drupalorg.pages.inc @@ -1342,3 +1342,32 @@ function drupalorg_org_owner_tools(stdClass $node) { return $content; } + +/** + * Callback function. + */ +function _drupalorg_toggle_branch_visibility($gitlab_project_id, $branch_name, $status) { + // Check token. + if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'drupalorg-toggle-branch-' . $gitlab_project_id . '-' . $branch_name . '-' . $status)) { + drupal_set_message(t('Invalid token.'), 'error'); + drupal_access_denied(); + } + + // Check that the status value is valid. + if (!in_array($status, ['hidden', 'active'])) { + drupal_set_message(t('Status %status is not a valid option.', ['%status' => $status]), 'error'); + drupal_goto(); + } + + // Set the visibility of the branch. + db_merge('drupalorg_issue_fork_branches') + ->key([ + 'gitlab_project_id' => $gitlab_project_id, + 'branch' => $branch_name, + ]) + ->fields(['status' => $status]) + ->execute(); + + drupal_set_message(t('Branch visibility has been toggled.')); + drupal_goto('', ['fragment' => 'main']); +} diff --git a/drupalorg/includes/DrupalorgIssueFork.php b/drupalorg/includes/DrupalorgIssueFork.php index 6dca7f620a648540c7eddf575fffba81ad976353..214695508f03e79cdc06b2e74c0dd294c3319e14 100644 --- a/drupalorg/includes/DrupalorgIssueFork.php +++ b/drupalorg/includes/DrupalorgIssueFork.php @@ -525,6 +525,23 @@ class DrupalorgIssueFork extends Entity { ], ]; } + + if (user_access('edit any project_issue content')) { + $toggle_text = ($row->status == 'hidden') ? t('show') : t('hide'); + $new_status = ($row->status == 'hidden') ? 'active' : 'hidden'; + $branch_output['operations']['toggle'] = [ + '#prefix' => '<a class="toggle-branch" title="' . t('@toggle branch for everyone', [ + '@toggle' => ucfirst($toggle_text), + ]) . '" href="' . url('drupalorg_toggle_branch_visibility/' . $this->gitlab_project_id . '/' . $row->branch . '/' . $new_status, [ + 'query' => [ + 'token' => drupal_get_token('drupalorg-toggle-branch-' . $this->gitlab_project_id . '-' . $row->branch . '-' . $new_status), + 'destination' => current_path(), + ] + ]) . '">', + '#markup' => $toggle_text, + '#suffix' => '</a> ', + ]; + } $output['branches'][$row->status][] = $branch_output; }