mattermost/e2e-tests/cypress/tests/utils/admin_console.js
Caleb Roseland db55f9fa43
MM-66653: migrate i18n extraction from mmjstool to @formatjs/cli (#34498)
* feat(webapp): migrate i18n extraction from mmjstool to @formatjs/cli

Replace custom mmjstool with industry-standard @formatjs/cli for i18n
message extraction. Adds support for localizeMessage as a recognized
extraction function and enables comprehensive ESLint rules for i18n.

Changes by area:

Dependencies (package.json):
- Add @formatjs/cli v6.7.4
- Remove @mattermost/mmjstool dependency
- Replace i18n-extract script with formatjs command
- Remove mmjstool-specific scripts (clean-empty, check-empty-src)
- Add i18n-extract:check for diff validation

Code (utils.tsx):
- Refactor localizeMessage to accept MessageDescriptor format
- Support {id, defaultMessage, description} parameters
- Maintain Redux store access (non-React context compatible)
- Add comprehensive JSDoc documentation

Linting (.eslintrc.json):
- Configure formatjs settings with additionalFunctionNames
- Enable 9 formatjs ESLint rules including enforce-id (error)
- Ensure all messages require explicit manual IDs

CI/CD (webapp-ci.yml):
- Simplify i18n check to formatjs extraction + diff
- Remove mmjstool and mobile-dir references

Context: Second attempt at PR #25830. Uses manual IDs only with
[id] placeholder pattern to enforce explicit ID requirements.
ESLint will catch missing IDs during development.

* chore(webapp): add temporary i18n reconciliation tooling

Add helper script to analyze conflicts between en.json and
defaultMessage values in code. This tooling will be reverted
after initial migration cleanup is complete.

Tooling added:
- scripts/i18n-reconcile-conflicts.js: Analyzes conflicts
  - Detects spelling corrections
  - Identifies placeholder mismatches
  - Flags significant content changes
  - Provides recommendations on which version to keep

- npm script: i18n-reconcile

Usage:
  npm run i18n-reconcile

This will be reverted after reconciling the ~50 duplicate message
warnings and determining correct versions for conflicting messages.

* chore(webapp): upgrade eslint-plugin-formatjs and centralize formatjs deps

Move @formatjs/cli to root webapp package.json alongside other formatjs
dependencies for better monorepo organization. Upgrade eslint-plugin-formatjs
from 4.12.2 to 5.4.2 for latest features and bug fixes.

Changes:
- Upgrade eslint-plugin-formatjs: 4.12.2 → 5.4.2
- Move @formatjs/cli to webapp/package.json (from channels)
- Centralize formatjs tooling at monorepo root level

This provides:
- Better dependency management in monorepo
- Latest formatjs ESLint rules and features
- Consistent tooling across workspaces

* feat(webapp): make localizeMessage fully compatible with formatMessage API

Extend localizeMessage to accept a values parameter for placeholder
interpolation, making it fully compatible with react-intl's formatMessage API.
Remove the now-redundant localizeAndFormatMessage function.

Changes to localizeMessage:
- Add values parameter for {placeholder} interpolation
- Use getIntl() for proper ICU message formatting
- Support full formatMessage feature parity outside React contexts
- Update JSDoc with interpolation examples
- Mark as deprecated (prefer useIntl in React components)

Code cleanup:
- Remove localizeAndFormatMessage function (redundant)
- Migrate all localizeAndFormatMessage usages to localizeMessage
- Remove unused imports: getCurrentLocale, getTranslations
- Add getIntl import

Files migrated:
- notification_actions.tsx: notification.crt message
- app_command_parser_dependencies.ts: intlShim formatMessage

This consolidates i18n logic and provides a single, feature-complete
localization function for non-React contexts.

Example usage:
  // Before (old function)
  localizeAndFormatMessage(
    {id: 'welcome', defaultMessage: 'Hello {name}'},
    {name: 'John'}
  )

  // After (consolidated)
  localizeMessage(
    {id: 'welcome', defaultMessage: 'Hello {name}'},
    {name: 'John'}
  )

* refactor(i18n): remove intlShim abstraction, use IntlShape directly

Remove intlShim wrapper and use react-intl's IntlShape type throughout.

Key Changes:
- Remove intlShim constant from app_command_parser_dependencies.ts
- Update errorMessage() signature to accept IntlShape parameter
- Use IntlShape for intl properties in AppCommandParser and ParsedCommand
- Call getIntl() at function start in actions (command.ts, marketplace.ts)
- Pass IntlShape to AppCommandParser and doAppSubmit consistently

Files Modified:
- app_command_parser_dependencies.ts: Remove intlShim, update errorMessage
- app_command_parser.ts: Use IntlShape type
- command.ts, marketplace.ts: Call getIntl() early, pass to parser
- app_provider.tsx, command_provider.tsx: Use getIntl() in constructor
- apps.ts: Update doAppSubmit signature

Benefits: Better type safety, standard react-intl patterns, eliminates
unnecessary abstraction.

Context: Part of migration to @formatjs/cli tooling.

* refactor(webapp): remove deprecated t() function and refactor login validation

Remove the deprecated t() function that was used as a marker for the old
mmjstool extraction. With @formatjs/cli, this is no longer needed as
extraction happens directly from formatMessage calls.

Changes:
- Remove t() function definition from utils/i18n.tsx
- Remove t() import and marker calls from login.tsx
- Refactor login validation logic from multiple if statements to a clean
  switch(true) pattern that evaluates boolean combinations directly
- Add helpful comments documenting the structure of login method combinations
- Add default case as safety fallback

The switch(true) pattern eliminates the need to build a key string and makes
the login method combination logic clearer and more maintainable.

Prompt: Remove deprecated t() translation marker function used by old mmjstool.
Refactor login validation from if blocks to switch(true) with boolean cases.

* refactor(i18n): share IntlProvider's intl instance with getIntl()

Make getIntl() return the same IntlShape instance that IntlProvider creates,
ensuring consistency between React components (using useIntl()) and non-React
contexts (using getIntl()).

Changes:
- Add intlInstance storage in utils/i18n.tsx
- Export setIntl() function to store the intl instance
- Modify getIntl() to return stored instance if available, with fallback to
  createIntl() for tests and early initialization
- Add IntlCapture component in IntlProvider that uses useIntl() hook to
  capture and store the intl instance via setIntl()

Benefits:
- Single source of truth: Both React and non-React code use the same IntlShape
- Consistent translations: No duplicate translation loading or potential desync
- Leverages IntlProvider's translation loading lifecycle automatically
- Maintains fallback for edge cases where IntlProvider hasn't mounted yet

Prompt: Refactor getIntl() to reuse IntlProvider's intl instance instead of
creating a separate instance, ensuring both React and non-React contexts use
the same translations and intl configuration.

* 1

* exclude test files

* reset en.json

* refactor(i18n): inline message ID constants for formatjs extraction

Replace dynamic ID references with literal strings to enable proper formatjs
extraction. Formatjs can only extract from static message IDs, not from
variables or computed IDs.

Changes:
- configuration_bar.tsx: Inline AnnouncementBarMessages constants to literal
  string IDs ('announcement_bar.error.past_grace', 'announcement_bar.error.preview_mode')
- system_analytics.test.tsx: Replace variable IDs (totalPlaybooksID,
  totalPlaybookRunsID) with literal strings ('total_playbooks', 'total_playbook_runs')
- password.tsx: Use full message descriptor from passwordErrors object instead
  of dynamic ID with hardcoded defaultMessage. The errorId is still built
  dynamically using template strings, but the actual message is looked up from
  the passwordErrors defineMessages block where formatjs can extract it.

This eliminates all "[id]" placeholder entries from extraction output and
ensures all messages have proper extractable definitions.

Prompt: Fix dynamic message ID references that formatjs extraction can't parse.
Inline constants and use message descriptor lookups to enable clean extraction
without [id] placeholders.

* fix(i18n): add missing defaultMessage to drafts.tooltipText

The drafts.tooltipText FormattedMessage had an empty defaultMessage, causing
formatjs extraction to output an empty string for this message.

Added the proper defaultMessage with plural formatting for draft and scheduled
post counts.

Prompt: Fix empty defaultMessage in drafts tooltip causing extraction issues.

* feat(i18n): add --preserve-whitespace flag to formatjs extraction

Add the --preserve-whitespace flag to ensure formatjs extraction maintains
exact whitespace from defaultMessage values. This is important for messages
with intentional formatting like tabs, multiple spaces, or line breaks.

Prompt: Add --preserve-whitespace to i18n extraction to maintain exact formatting.

* feat(i18n): add custom formatjs formatter matching mmjstool ordering

Create custom formatter that replicates mmjstool's sorting behavior:
- Case-insensitive alphabetical sorting
- Underscore (_) sorts before dot (.) to match existing en.json ordering
- Simple key-value format (extracts defaultMessage)

The underscore-before-dot collation matches mmjstool's actual behavior and
reduces diff size by 50% compared to standard alphabetical sorting.

Changes:
- scripts/formatter.js: Custom compareMessages, format, and compile functions
- package.json: Use --format scripts/formatter.js instead of --format simple

Prompt: Create custom formatjs formatter matching mmjstool's exact sorting
behavior including underscore-before-dot collation to minimize migration diff.

* feat(i18n): enhance reconciliation script with git history metadata

Add git log lookups to show when each message was last modified in both
en.json and code files. This enables data-driven decisions about which
version to keep when resolving conflicts.

Enhancements:
- getEnJsonLastModified(): Find when an en.json entry last changed
- findCodeFile(): Locate source file for a message ID (handles id= and id:)
- getCodeLastModified(): Get last modification date for source files
- Caching for performance (minimizes git operations)

Output includes:
  📅 en.json:  [date] | [hash] | [commit message]
  📅 code:     [date] | [hash] | [commit message]
  📂 file:     [source file path]

Analysis shows en.json entries from 2023 while code actively updated
2024-2025, indicating code is more authoritative.

Prompt: Add git history to reconciliation report showing modification dates
for data-driven conflict resolution decisions.

* feat(i18n): add optional duplicate message ID check script

Add i18n-extract:check-duplicates script that fails if the same message ID
has different defaultMessages in multiple locations. This is kept as an
optional standalone script rather than auto-chained with i18n-extract to
allow the migration to proceed while duplicates are addressed separately.

Usage:
  npm run i18n-extract:check-duplicates

The script runs formatjs extract to /dev/null and checks stderr for
"Duplicate message id" warnings, failing if any are found.

Prompt: Add optional duplicate ID check as standalone npm script for gradual
migration without blocking on existing duplicate message IDs.

* about.enterpriseEditionLearn

* admin.accesscontrol.title

* eslint-plugin-formatjs version to eslint 8 compat

* admin.channel_settings.channel_detail.access_control_policy_title

* admin.connectionSecurityTls
- now: admin.connectionSecurityTls.title

* admin.customProfileAttribDesc
now:
- admin.customProfileAttribDesc.ldap
- admin.customProfileAttribDesc.saml

* admin.gitlab.clientSecretExample

* package-lock

* admin.google.EnableMarkdownDesc
- fix err `]` in admin.google.EnableMarkdownDesc.openid
- now:
  - admin.google.EnableMarkdownDesc.oauth
  - admin.google.EnableMarkdownDesc.openid

* admin.image.amazonS3BucketExample
- now:
  - admin.image.amazonS3BucketExample
  - admin.image.amazonS3BucketExampleExport

* admin.license.trialCard.contactSales

* admin.log.AdvancedLoggingJSONDescription
- now:
  - admin.log.AdvancedLoggingJSONDescription
  - admin.log.AdvancedAuditLoggingJSONDescription

* admin.rate.noteDescription
- now
  - admin.rate.noteDescription
  - admin.info_banner.restart_required.desc (3)

* admin.system_properties.user_properties.title
- now:
  - admin.system_properties.user_properties.title
  - admin.accesscontrol.user_properties.link.label

* admin.system_users.filters.team.allTeams, admin.system_users.filters.team.noTeams

* admin.user_item.email_title

* announcement_bar.error.preview_mode

* channel_settings.error_purpose_length

* deactivate_member_modal.desc
- now:
  - deactivate_member_modal.desc
  - deactivate_member_modal.desc_with_confirmation

* deleteChannelModal.canViewArchivedChannelsWarning

* edit_channel_header_modal.error

* filtered_channels_list.search
- now:
  - filtered_channels_list.search
  - filtered_channels_list.search.label

* flag_post.flag

* generic_icons.collapse

* installed_outgoing_oauth_connections.header

* intro_messages.group_message

* intro_messages.notificationPreferences
- now:
  - intro_messages.notificationPreferences
  - intro_messages.notificationPreferences.label

* katex.error

* multiselect.placeholder
- now:
  - multiselect.placeholder
  - multiselect.placeholder.addMembers

* post_info.pin, post_info.unpin, rhs_root.mobile.flag

take en.json

* texteditor.rewrite.rewriting

* user_groups_modal.addPeople

split to user_groups_modal.addPeople.field_title

* user.settings.general.validImage

take en.json

* userSettings.adminMode.modal_header

take en.json

* webapp.mattermost.feature.start_call

split to user_profile.call.start

* admin.general.localization.enableExperimentalLocalesDescription

take en.json

* login.contact_admin.title, login.contact_admin.detail

take en.json

* fix: correct spelling of "complementary" in accessibility sections

* Revert "about.enterpriseEditionLearn"

This reverts commit 23ababe1ce.

* about.enterpriseEditionLearn, about.planNameLearn

* fix: improve clarity and consistency in activity log and command descriptions

* fix: update emoji upload limits and improve help text for emoji creation

* fix easy round 1

* fix: improve messaging for free trial notifications and sales contact

take en.json

* admin.billing.subscription.planDetails.features.limitedFileStorage

take en.json

* admin.billing.subscription.updatePaymentInfo

take en.json

* fix easy round 2

* admin.complianceExport.exportFormat.globalrelay

take en.json

* fix round 3

* fix round 4

* fix round 5

* fix round 6

* fix closing tag, newlines, and popout title

* fix linting, +

* update snapshots

* test(webapp): update tests to match formatjs migration message changes

Update test assertions to reflect message text changes from the
mmjstool → @formatjs/cli migration. All changes align with the
corresponding i18n message updates in the codebase.

Changes:
- limits.test.tsx: Update capitalization (Message History → Message history,
  File Storage → File storage)
- emoji_picker.test.tsx: Update label (Recent → Recently Used)
- command.test.js: Add period to error message
- channel_activity_warning_modal.test.tsx: Update warning text assertion
- channel_settings_archive_tab.test.tsx: Update archive warning text
- feature_discovery.test.tsx: Update agreement name (Software and Services
  License Agreement → Software Evaluation Agreement)
- flag_post_modal.test.tsx: Update placeholder text (Select a reason for
  flagging → Select a reason)
- channel_intro_message.test.tsx: Remove trailing space from assertion
- elasticsearch_settings.tsx: Fix searchableStrings placeholder names
  (documentationLink → link) to match updated message format

All 983 test suites passing (12 tests fixed, 9088 tests total).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(i18n): improve cross-platform compatibility and cleanup temporary tooling

Simplify i18n check scripts to reuse npm run i18n-extract, improving
cross-platform compatibility and reducing duplication.

Changes:
- Refactor i18n-extract:check to reuse base extraction command
  - Uses project-local temp file instead of /tmp (Windows compatible)
  - Simplified from duplicated formatjs command to npm run reuse
  - Add --throws flag to fail fast on extraction errors
  - Add helpful error message: "To update: npm run i18n-extract"

- Add i18n-extract:check to main check script
  - Now runs alongside ESLint and Stylelint checks
  - Ensures en.json stays in sync with code changes

- Remove i18n-extract:check-duplicates script
  - Redundant - duplicates are caught by i18n-extract automatically
  - Avoided grep dependency (not cross-platform)

- Remove temporary reconciliation tooling
  - Deleted scripts/i18n-reconcile-conflicts.js (served its purpose)
  - Removed i18n-reconcile npm script

- Add .i18n-check.tmp.json to .gitignore

i18n-extract:check now works on Windows, macOS, and Linux.
Requires only diff command (available via Git on Windows).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* ci(webapp): simplify i18n check using npm script

Replace custom i18n check in CI with npm run i18n-extract:check for
consistency with local development workflow.

Changes:
- Update check-i18n job to use npm run i18n-extract:check
- Remove manual cp/extract/diff steps (3 lines → 1 line)
- Consistent behavior between CI and local development
- Cross-platform compatible (no /tmp dependency)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(i18n): add i18n extraction targets to Makefile and workspace scripts

Add Make targets and npm workspace scripts for i18n message extraction
to provide consistent tooling access across the project.

Changes:
- Add make i18n-extract target to webapp/Makefile
  - Extracts i18n messages from code to en.json

- Add make i18n-extract-check target to webapp/Makefile
  - Checks if en.json is in sync with code

- Add i18n-extract workspace script to webapp/package.json
  - Runs extraction across all workspaces

- Add i18n-extract:check workspace script to webapp/package.json
  - Runs sync check across all workspaces

Usage:
  make i18n-extract         # Extract messages
  make i18n-extract-check   # Check if en.json needs update
  npm run i18n-extract      # From webapp root
  npm run i18n-extract:check

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(i18n): add cross-platform cleanup utility for temp files

Add Node.js cleanup script to handle temporary file removal in a
cross-platform manner, replacing platform-specific rm commands.

Changes:
- Add webapp/scripts/cleanup.js
  - Cross-platform file deletion utility
  - Silently handles missing files
  - Works on Windows/Mac/Linux

- Update i18n-extract:check to use cleanup script
  - Removes .i18n-check.tmp.json after diff
  - Cleans up on both success and failure paths

Usage:
  node scripts/cleanup.js <file1> [file2] [...]

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(i18n): remove 'defineMessage' from additionalFunctionNames in ESLint config

* chore(i18n): update i18n-extract check script and remove unused cleanup utility

context: WSL is already required on windows

* chore(i18n): remove ESLint rule disabling for formatjs placeholders in admin definition

* chore(i18n): admin_definition
- re-add defineMessage to eslint additionalfunctionnames
- mark additional individual placeholder lines in admin_definition

* fix(i18n): correct typo in enterprise edition link message

* chore(i18n): fix escape sequences

* revert emoji.ts changes

* fix snapshots

* fix admin.google.EnableMarkdownDesc
- keep en.json but fix linkAPI and <strong>Create</strong>

* restore newlines, and final corrections check

* update snapshots

* fix: i18n

* chore(e2e): admin.complianceExport.exportJobStartTime.title

* chore(e2e): emoji_picker.travel-places

* chore(e2e): user.settings.general.incorrectPassword

* chore(e2e): signup_user_completed.create

* chore(e2e): fix Invite People

* chore(fix): admin console email heading

* chore(e2e): fix edit_channel_header_modal.placeholder

* chore(e2e): fix Create account

* chore(e2e): fix Create account

* chore(e2e): correct success message text in password update alert

* fix: admin guide label

* chore(e2e): update role name in invite people combobox

* chore(e2e): more "Create account"

* chore(e2e): fix authentication_spec

* lint

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2026-01-12 17:22:04 -06:00

362 lines
11 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
export const adminConsoleNavigation = [
{
type: ['team', 'e20'],
header: 'Edition and License',
sidebar: 'Edition and License',
url: 'admin_console/about/license',
},
{
type: ['cloud_enterprise'],
header: 'Subscription',
sidebar: 'Subscription',
url: 'admin_console/billing/subscription',
},
{
type: ['cloud_enterprise'],
header: 'Billing History',
sidebar: 'Billing History',
url: 'admin_console/billing/billing_history',
},
{
type: ['cloud_enterprise'],
header: 'Company Information',
sidebar: 'Company Information',
url: 'admin_console/billing/company_info',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'System Statistics',
sidebar: 'Site Statistics',
url: '/admin_console/reporting/system_analytics',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Team Statistics',
sidebar: 'Team Statistics',
url: '/admin_console/reporting/team_statistics',
headerContains: true,
},
{
type: ['team', 'e20'],
header: 'Server Logs',
sidebar: 'Server Logs',
url: '/admin_console/reporting/server_logs',
headerContains: true,
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Mattermost Users',
headerSelector: '.admin-console__header #systemUsersTable-headerId',
sidebar: 'Users',
url: 'admin_console/user_management/users',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Groups',
sidebar: 'Groups',
url: 'admin_console/user_management/groups',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Mattermost Teams',
sidebar: 'Teams',
url: 'admin_console/user_management/teams',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Mattermost Channels',
team_header: 'Channels',
sidebar: 'Channels',
url: 'admin_console/user_management/channels',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Permission Schemes',
sidebar: 'Permissions',
url: 'admin_console/user_management/permissions',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Delegated Granular Administration',
sidebar: 'Delegated Granular Administration',
url: 'admin_console/user_management/system_roles',
},
{
type: ['team', 'e20'],
header: 'Web Server',
sidebar: 'Web Server',
url: 'admin_console/environment/web_server',
},
{
type: ['team', 'e20'],
header: 'Database',
sidebar: 'Database',
url: 'admin_console/environment/database',
},
{
type: ['e20'],
section: 'Environment',
header: 'Elasticsearch',
sidebar: 'Elasticsearch',
url: 'admin_console/environment/elasticsearch',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'File Storage',
sidebar: 'File Storage',
url: 'admin_console/environment/file_storage',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Image Proxy',
sidebar: 'Image Proxy',
url: 'admin_console/environment/image_proxy',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'SMTP',
sidebar: 'SMTP',
url: 'admin_console/environment/smtp',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Push Notification Server',
sidebar: 'Push Notification Server',
url: 'admin_console/environment/push_notification_server',
},
{
type: ['e20'],
section: 'Environment',
header: 'High Availability',
sidebar: 'High Availability',
url: 'admin_console/environment/high_availability',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Rate Limiting',
sidebar: 'Rate Limiting',
url: 'admin_console/environment/rate_limiting',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Logging',
sidebar: 'Logging',
url: 'admin_console/environment/logging',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Session Lengths',
sidebar: 'Session Lengths',
url: 'admin_console/environment/session_lengths',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Performance Monitoring',
sidebar: 'Performance Monitoring',
url: 'admin_console/environment/performance_monitoring',
},
{
type: ['team', 'e20'],
section: 'Environment',
header: 'Developer Settings',
sidebar: 'Developer',
url: 'admin_console/environment/developer',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Customization',
sidebar: 'Customization',
url: 'admin_console/site_config/customization',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Localization',
sidebar: 'Localization',
url: 'admin_console/site_config/localization',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Users and Teams',
sidebar: 'Users and Teams',
url: 'admin_console/site_config/users_and_teams',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Notifications',
sidebar: 'Notifications',
url: 'admin_console/environment/notifications',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Announcement Banner',
sidebar: 'Announcement Banner',
url: 'admin_console/site_config/announcement_banner',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Emoji',
sidebar: 'Emoji',
url: 'admin_console/site_config/emoji',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Posts',
sidebar: 'Posts',
url: 'admin_console/site_config/posts',
},
{
type: ['team', 'e20'],
header: 'File Sharing and Downloads',
sidebar: 'File Sharing and Downloads',
url: 'admin_console/site_config/file_sharing_downloads',
},
{
type: ['team', 'e20'],
header: 'Public Links',
sidebar: 'Public Links',
url: 'admin_console/site_config/public_links',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Notices',
sidebar: 'Notices',
url: 'admin_console/site_config/notices',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Signup',
sidebar: 'Signup',
url: 'admin_console/authentication/signup',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Email',
sidebar: 'Email',
url: 'admin_console/authentication/email',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Password',
sidebar: 'Password',
url: 'admin_console/authentication/password',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Multi-factor Authentication',
sidebar: 'MFA',
url: 'admin_console/authentication/mfa',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'AD/LDAP Wizard',
sidebar: 'AD/LDAP',
url: 'admin_console/authentication/ldap',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'SAML 2.0',
sidebar: 'SAML 2.0',
url: 'admin_console/authentication/saml',
},
{
type: ['team'],
header: 'GitLab',
sidebar: 'GitLab',
url: 'admin_console/authentication/gitlab',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'OpenID Connect',
sidebar: 'OpenID Connect',
url: 'admin_console/authentication/openid',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Guest Access',
sidebar: 'Guest Access',
url: 'admin_console/authentication/guest_access',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Plugin Management',
sidebar: 'Plugin Management',
url: 'admin_console/plugins/plugin_management',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Integration Management',
sidebar: 'Integration Management',
url: 'admin_console/integrations/integration_management',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Bot Accounts',
sidebar: 'Bot Accounts',
url: 'admin_console/integrations/bot_accounts',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'GIF',
sidebar: 'GIF',
url: 'admin_console/integrations/gif',
},
{
type: ['team', 'e20'],
header: 'CORS',
sidebar: 'CORS',
url: 'admin_console/integrations/cors',
},
{
type: ['e20', 'cloud_enterprise'],
header: 'Data Retention Policies',
sidebar: 'Data Retention Policies',
url: 'admin_console/compliance/data_retention_settings',
},
{
type: ['team'],
header: 'Data Retention Policy',
sidebar: 'Data Retention Policy',
url: 'admin_console/compliance/data_retention',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Compliance Export',
sidebar: 'Compliance Export',
url: 'admin_console/compliance/export',
},
{
type: ['e20', 'cloud_enterprise'],
header: 'Compliance Monitoring',
sidebar: 'Compliance Monitoring',
url: 'admin_console/compliance/monitoring',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Custom Terms of Service',
sidebar: 'Custom Terms of Service',
url: 'admin_console/compliance/custom_terms_of_service',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Experimental Features',
sidebar: 'Features',
url: 'admin_console/experimental/features',
},
{
type: ['team', 'e20', 'cloud_enterprise'],
header: 'Feature Flags',
sidebar: 'Feature Flags',
url: 'admin_console/experimental/feature_flags',
},
];